pax_global_header00006660000000000000000000000064147736536710014535gustar00rootroot0000000000000052 comment=4d1f09c8ee1b5da28a5853b39077beb8d40061be danieljprice-splash-4d1f09c/000077500000000000000000000000001477365367100160725ustar00rootroot00000000000000danieljprice-splash-4d1f09c/.github/000077500000000000000000000000001477365367100174325ustar00rootroot00000000000000danieljprice-splash-4d1f09c/.github/workflows/000077500000000000000000000000001477365367100214675ustar00rootroot00000000000000danieljprice-splash-4d1f09c/.github/workflows/build.yml000066400000000000000000000027631477365367100233210ustar00rootroot00000000000000# This is a basic workflow to help you get started with Actions name: build # Controls when the action will run. Triggers the workflow on push or pull request # events but only for the master branch on: push: branches: [ master ] pull_request: branches: [ master ] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: - name: Install gfortran and cairo on Linux run: sudo apt-get install gfortran libcairo2-dev - name: Check gfortran version run: gfortran --version # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 - name: get a copy of giza run: git clone https://github.com/danieljprice/giza - name: compile splash run: make SYSTEM=gfortran withgiza - name: clean run: make clean - name: compile libexact run: make SYSTEM=gfortran libexact - name: compile libread run: make SYSTEM=gfortran libread - name: clean run: make clean - name: compile splash in single precision run: make SYSTEM=gfortran DOUBLEPRECISION=no withgiza - name: clean run: make clean - name: compile splash with debug flags run: make SYSTEM=gfortran DEBUG=yes withgiza danieljprice-splash-4d1f09c/.github/workflows/release.yml000066400000000000000000000066331477365367100236420ustar00rootroot00000000000000name: release # a general github action to generate a release whenever a version tag is pushed # generates and uploads a tarball of the source code # in a way that plays nicely with git submodules # could be easily adapted to produce binaries for each OS # Daniel Price, Aug 2020 on: push: tags: - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 jobs: release: strategy: matrix: os: [ubuntu-latest] runs-on: ${{ matrix.os }} # Steps represent a sequence of tasks that will be executed as part of the job steps: - name: checkout code uses: actions/checkout@v3 with: submodules: recursive - name: Get version id: get_version env: vernum: ${{ github.ref }} repo: ${{ github.repository }} run: | echo "version=${vernum/refs\/tags\//}" >> $GITHUB_ENV echo "repo=$(basename ${repo})" >> $GITHUB_ENV echo "tarfile=$(basename ${repo})-${vernum/refs\/tags\//}.tar.gz" >> $GITHUB_ENV # - name: build tarball mac # if: matrix.os == 'macos-latest' # env: # tarfile: ${{ steps.get_version.outputs.tarfile }} # repo: ${{ steps.get_version.outputs.repo }} # run: | # tar cfz /tmp/$tarfile --exclude ".git*" -s "/./${repo}/" . - name: build tarball if: matrix.os == 'ubuntu-latest' env: tarfile: ${{ env.tarfile }} repo: ${{ env.repo }} run: | echo "tarfile=${{ env.tarfile }}, repo=${{ env.repo }}" tar cfz /tmp/${{ env.tarfile }} --exclude ".git*" \ --transform "s,.,${{ env.repo }}," . - name: check tarball and get SHA env: tarfile: ${{ env.tarfile }} id: shasum run: | mv /tmp/${{ env.tarfile }} . tar tfz ${{ env.tarfile }} echo "sha=$(shasum -a 256 ${{ env.tarfile }} | awk '{printf $1}')" >> $GITHUB_ENV - name: Extract Release Notes run: | ./scripts/get_release_notes.pl > release-notes.md - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ env.version }} release_name: ${{ env.version }} body_path: release-notes.md draft: false prerelease: false - name: Upload Release Asset id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ${{ env.tarfile }} asset_name: ${{ env.tarfile }} asset_content_type: application/gzip - name: Set up Homebrew id: set-up-homebrew uses: Homebrew/actions/setup-homebrew@master - name: Bump Brew env: HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.BREW_TOKEN_SPLASH }} version: ${{ env.version }} brewtap: danieljprice/all formula: ${{ env.repo }} run: | git config --global user.email "daniel.price@monash.edu" git config --global user.name "Daniel Price" brew install pipgrip brew tap $brewtap brew bump-formula-pr -f --version=${version/v/} --no-browse --no-audit \ --sha256=${{ env.sha }} \ --url="https://github.com/${{ github.repository }}/releases/download/${{ env.version }}/${{ env.tarfile }}" \ $brewtap/$formula danieljprice-splash-4d1f09c/.gitignore000066400000000000000000000004471477365367100200670ustar00rootroot00000000000000*.mod *.o *.so ?splash docs/splash.aux docs/splash.log docs/splash.toc docs/splash.out docs/splash.blg docs/splash.haux docs/*.bib docs/html/*.png docs/html/*.html docs/html/splash.css cairo-* pixman-* bin ref *otherendian.f90 Portfile* .DS_Store releasenotes* ChangeLog giza* tests __pycache__ danieljprice-splash-4d1f09c/.readthedocs.yml000066400000000000000000000012121477365367100211540ustar00rootroot00000000000000# .readthedocs.yml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools build: os: ubuntu-22.04 tools: python: "3.12" # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py # Build documentation with MkDocs #mkdocs: # configuration: mkdocs.yml # Optionally build your docs in additional formats such as PDF #formats: # - pdf # Optionally set the version of Python and requirements required to build your docs python: install: - requirements: docs/requirements.txt danieljprice-splash-4d1f09c/INSTALL000066400000000000000000000005441477365367100171260ustar00rootroot00000000000000Basic compilation, with all dependencies present: make SYSTEM=gfortran Compilation with giza in subdirectory of splash: cd splash git clone https://github.com/danieljprice/giza make SYSTEM=gfortran withgiza More detailed installation instructions can be found in the userguide: https://splash-viz.readthedocs.io/en/latest/getting-started.html#install danieljprice-splash-4d1f09c/LICENCE000066400000000000000000000354451477365367100170720ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS danieljprice-splash-4d1f09c/Makefile000066400000000000000000000010701477365367100175300ustar00rootroot00000000000000#---------------------------------------------------------------- # Parent Makefile for SPLASH # This file is just a wrapper for the sub-make in the build # directory. Refer to build/Makefile for more details. # # (c) 2007-2013 Daniel Price # #---------------------------------------------------------------- .PHONY: splash install docs tests src bin splash: @cd build; ${MAKE} ${MAKECMDGOALS} %:: @cd build; ${MAKE} ${MAKECMDGOALS} install: @cd build; ${MAKE} ${MAKECMDGOALS} docs: @cd build; ${MAKE} ${MAKECMDGOALS} clean: @cd build; ${MAKE} clean danieljprice-splash-4d1f09c/README.md000066400000000000000000000054761477365367100173650ustar00rootroot00000000000000SPLASH - an interactive visualisation tool for SPH data ======================================================= About ----- SPLASH is a free and open source visualisation tool for Smoothed Particle Hydrodynamics (SPH) simulations in one, two and three dimensions, developed mainly for astrophysics. It uses a command-line menu but data can be manipulated interactively in the plotting window. Data is read *directly* from the code dump format giving rapid access to results and the visualisation is advanced forwards and backwards through timesteps by single keystrokes. SPLASH uses the SPH smoothing kernel to render plots of density and other physical quantities, giving a smooth representation of the data. The goal is to produce beautiful plots and visualisations from SPH codes, instead of simple particle plots. SPLASH can also be used as a standalone plotting tool for any kind of tabulated or image data from ascii, csv or .fits files. Status ------ ![build](https://github.com/danieljprice/splash/workflows/build/badge.svg) [![docs](https://readthedocs.org/projects/splash-viz/badge/?version=latest)](https://splash-viz.readthedocs.io/en/latest/?badge=latest) Example ------- Accretion disc visualisation with SPLASH Links ----- - Project homepage: http://users.monash.edu.au/~dprice/splash - Code repository: https://github.com/danieljprice/splash - Documentation: https://splash-viz.readthedocs.io - Code paper: https://adsabs.harvard.edu/abs/2007PASA...24..159P Install ------- For installation instructions see the [userguide](https://splash-viz.readthedocs.io/en/latest/getting-started.html). Usage ------------ ``` splash mydata.txt ``` Command line mode (to screen): ``` splash -r density dump_0* ``` Command line mode (to file): ``` splash -r density -dev myplot.pdf dump_0* ``` See the [userguide](https://splash-viz.readthedocs.io) for more. Contributing ------------ We welcome contributions, including (but not limited to): 1. Code, via [pull request](https://github.com/danieljprice/splash/pulls). Please read developer section of user guide for guidelines. 2. Documentation, also by [pull request](https://github.com/danieljprice/splash/pulls). Docs can be edited in the docs/ directory of the main code. 3. Suggestions for features or bug reports, via the [issue tracker](https://github.com/danieljprice/splash/issues/new). Please file bugs via github rather than by email. 4. Discussion via the [mailing lists](http://users.monash.edu.au/~dprice/splash/mailinglists.html) Citation -------- Please cite [Price (2007)](https://adsabs.harvard.edu/abs/2007PASA...24..159P) when using SPLASH. License ------- See [LICENCE](LICENCE) file for usage and distribution conditions Copyright (c) 2004-2023 Daniel Price and contributors danieljprice-splash-4d1f09c/bin/000077500000000000000000000000001477365367100166425ustar00rootroot00000000000000danieljprice-splash-4d1f09c/bin/.keep000066400000000000000000000000001477365367100175550ustar00rootroot00000000000000danieljprice-splash-4d1f09c/build/000077500000000000000000000000001477365367100171715ustar00rootroot00000000000000danieljprice-splash-4d1f09c/build/.depends000066400000000000000000000164301477365367100206200ustar00rootroot00000000000000globaldata.o multiplot.mod settings_data.mod labels.mod filenames.mod particle_data.mod params.mod: globaldata.f90 asciiutils.o asciiutils.mod: asciiutils.f90 setpage.o pagesetup.mod: setpage.f90 transform.o transforms.mod: transform.f90 prompting.o prompting.mod: prompting.f90 geometry.o geometry.mod: geometry.f90 plotutils.o plotutils.mod: plotutils.f90 colourbar.o colourbar.mod: pagesetup.mod colourbar.f90 colours.o colours.mod: colours.f90 colourparts.o colourparts.mod: colourparts.f90 shapes.o shapes.mod: transforms.mod prompting.mod params.mod shapes.f90 units.o settings_units.mod: settings_data.mod labels.mod prompting.mod params.mod units.f90 write_pixmap.o write_pixmap.mod: colours.mod filenames.mod write_pixmap.f90 write_sphdata.o write_sphdata.mod: params.mod settings_units.mod labels.mod write_sphdata.f90 analysis.o analysis.mod: prompting.mod params.mod filenames.mod asciiutils.mod labels.mod analysis.f90 discplot.o disc.mod: transforms.mod discplot.f90 exact_fromfile.o exactfromfile.mod: exact_fromfile.f90 exact_mhdshock.o mhdshock.mod: exact_mhdshock.f90 exact_polytrope.o polytrope.mod: exact_polytrope.f90 exact_rhoh.o rhoh.mod: exact_rhoh.f90 exact_sedov.o sedov.mod: exact_sedov.f90 exact_shock.o shock.mod: exact_shock.f90 exact_shock_sr.o shock_sr.mod: exact_shock_sr.f90 exact_wave.o wave.mod: exact_wave.f90 exact_toystar1D.o toystar1d.mod: exact_toystar1D.f90 exact_toystar2D.o toystar2d.mod: exact_toystar2D.f90 exact_densityprofiles.o densityprofiles.mod: exact_densityprofiles.f90 exact_torus.o torus.mod: exact_torus.f90 exact_ringspread.o ringspread.mod: exact_ringspread.f90 exact.o exact.mod: transforms.mod ringspread.mod densityprofiles.mod wave.mod toystar2d.mod toystar1d.mod torus.mod shock_sr.mod shock.mod sedov.mod rhoh.mod polytrope.mod mhdshock.mod exactfromfile.mod labels.mod filenames.mod prompting.mod settings_data.mod exact.f90 limits.o limits.mod: asciiutils.mod settings_data.mod particle_data.mod geometry.mod labels.mod params.mod limits.f90 allocate.o mem_allocation.mod: particle_data.mod allocate.f90 titles.o titles.mod: filenames.mod asciiutils.mod titles.f90 system_f2003.o system_commands.mod: system_f2003.f90 system_utils.o system_utils.mod: system_commands.mod system_utils.f90 options_render.o settings_render.mod: params.mod prompting.mod colours.mod labels.mod colourbar.mod options_render.f90 options_particleplots.o settings_part.mod: multiplot.mod geometry.mod prompting.mod particle_data.mod settings_render.mod limits.mod labels.mod exact.mod settings_data.mod params.mod options_particleplots.f90 calc_quantities.o calcquantities.mod: settings_units.mod mem_allocation.mod settings_part.mod settings_data.mod particle_data.mod labels.mod calc_quantities.f90 get_data.o getdata.mod: system_utils.mod asciiutils.mod settings_units.mod calcquantities.mod geometry.mod labels.mod prompting.mod particle_data.mod settings_part.mod settings_data.mod limits.mod filenames.mod exact.mod get_data.f90 convert.o convert.mod: prompting.mod getdata.mod analysis.mod write_sphdata.mod filenames.mod settings_data.mod particle_data.mod convert.f90 options_data.o options_data.mod: settings_units.mod labels.mod limits.mod calcquantities.mod getdata.mod prompting.mod filenames.mod params.mod settings_data.mod options_data.f90 options_limits.o settings_limits.mod: transforms.mod labels.mod limits.mod prompting.mod calcquantities.mod settings_data.mod filenames.mod multiplot.mod options_limits.f90 options_page.o settings_page.mod: filenames.mod prompting.mod params.mod shapes.mod settings_limits.mod options_page.f90 options_powerspec.o settings_powerspec.mod: prompting.mod labels.mod limits.mod settings_data.mod options_powerspec.f90 options_vecplot.o settings_vecplot.mod: limits.mod labels.mod settings_data.mod prompting.mod options_vecplot.f90 options_xsecrotate.o settings_xsecrot.mod: transforms.mod multiplot.mod calcquantities.mod settings_data.mod prompting.mod limits.mod labels.mod filenames.mod options_xsecrotate.f90 pdfs.o pdfs.mod: asciiutils.mod filenames.mod plotutils.mod transforms.mod prompting.mod pdfs.f90 rotate.o rotation.mod: rotate.f90 interpolate1D.o interpolations1d.mod: interpolate1D.f90 interpolate2D.o interpolations2d.mod: interpolate2D.f90 interpolate3D.o interpolations3d.mod: interpolate3D.f90 interpolate3D_xsec.o xsections3d.mod: interpolate3D_xsec.f90 interpolate3D_projection.o projections3d.mod: interpolate3D_projection.f90 interpolate3D_opacity.o interpolate3d_opacity.mod: colours.mod projections3d.mod interpolate3D_opacity.f90 interpolate_vec.o interpolate_vec.mod: interpolate_vec.f90 interactive.o interactive_routines.mod: colours.mod settings_part.mod labels.mod calcquantities.mod filenames.mod transforms.mod settings_limits.mod settings_data.mod limits.mod settings_vecplot.mod settings_page.mod multiplot.mod shapes.mod settings_xsecrot.mod colourbar.mod interactive.f90 fieldlines.o fieldlines.mod: fieldlines.f90 legends.o legends.mod: legends.f90 particleplot.o particleplots.mod: geometry.mod interpolations2d.mod settings_part.mod settings_data.mod labels.mod params.mod particleplot.f90 powerspectrums.o powerspectrums.mod: interpolations3d.mod powerspectrums.f90 render.o render.mod: settings_vecplot.mod legends.mod plotutils.mod colourbar.mod render.f90 plotstep.o timestep_plotting.mod: asciiutils.mod rotation.mod fieldlines.mod interpolate_vec.mod geometry.mod shapes.mod legends.mod colourbar.mod write_pixmap.mod exactfromfile.mod disc.mod pagesetup.mod render.mod xsections3d.mod interpolate3d_opacity.mod interpolations3d.mod interpolations2d.mod interpolations1d.mod powerspectrums.mod particleplots.mod interactive_routines.mod transforms.mod colourparts.mod settings_units.mod settings_vecplot.mod settings_limits.mod toystar2d.mod toystar1d.mod exact.mod filenames.mod pdfs.mod projections3d.mod particle_data.mod settings_powerspec.mod settings_xsecrot.mod settings_render.mod settings_part.mod settings_page.mod settings_data.mod titles.mod prompting.mod multiplot.mod limits.mod labels.mod colours.mod params.mod plotstep.f90 timestepping.o timestepping.mod: params.mod settings_part.mod getdata.mod timestep_plotting.mod settings_page.mod settings_data.mod particle_data.mod filenames.mod timestepping.f90 defaults.o defaults.mod: shapes.mod titles.mod settings_units.mod settings_powerspec.mod settings_xsecrot.mod settings_vecplot.mod settings_render.mod settings_part.mod options_data.mod settings_limits.mod multiplot.mod exact.mod settings_page.mod settings_data.mod particle_data.mod limits.mod labels.mod filenames.mod defaults.f90 menu.o mainmenu.mod: settings_units.mod params.mod timestepping.mod getdata.mod geometry.mod defaults.mod transforms.mod prompting.mod multiplot.mod settings_xsecrot.mod settings_vecplot.mod settings_render.mod settings_page.mod settings_part.mod settings_limits.mod settings_data.mod options_data.mod limits.mod labels.mod filenames.mod menu.f90 splash.o: settings_page.mod timestepping.mod analysis.mod write_sphdata.mod convert.mod write_pixmap.mod asciiutils.mod system_utils.mod system_commands.mod settings_xsecrot.mod settings_data.mod projections3d.mod mem_allocation.mod mainmenu.mod limits.mod defaults.mod getdata.mod filenames.mod splash.f90 read_data_sphNG.o sphngread.mod: settings_units.mod geometry.mod calcquantities.mod labels.mod system_utils.mod mem_allocation.mod settings_data.mod particle_data.mod params.mod read_data_sphNG.f90 danieljprice-splash-4d1f09c/build/Makefile000066400000000000000000000730071477365367100206400ustar00rootroot00000000000000##-------------------------------------------------------------------## ## Makefile for compiling SPLASH and linking with ## ## required libraries ## ## ## ## Written by Daniel Price ## ## University of Exeter, UK, 2004-2008 ## ## Monash University, Australia, 2008- ## ## ## ## requires GNU make (on some systems this is 'gmake' instead ## ## of 'make') ## ## ## ## see the INSTALL file for detailed installation instructions ## ##-------------------------------------------------------------------## .KEEP_STATE: KNOWN_SYSTEM=no SRCDIR=../src BINDIR=../bin TESTDIR=../tests VPATH=$(SRCDIR) $(SRCDIR)/H5Part ../utils SHELL=/bin/bash # # some default settings for unix systems # FC= FFLAGS= # # change the line below if SPLASH does not find the X11 libraries # (some settings of the SYSTEM variable for specific machines overwrite this) # # X11_LIBS= -L/usr/X11R6/lib64 -lX11 X11_DIR= /usr/X11/ X11_LIBS= -L$(X11_DIR)/lib -lX11 X11_CFLAGS= -I$(X11_DIR)/include CAIRO_LIBS= -L$(X11_DIR)/lib -lcairo CAIRO_CFLAGS= -I$(X11_DIR)/include #-------------------------------------------------------------- # here we choose the backend plotting library for splash # (giza is the default backend for splash v2.x, but can # still be compiled with PGPLOT, just with disabled features) #-------------------------------------------------------------- ifneq ($(BACKEND), pgplot) #-- C A I R O -- GIZA_DIR= $(PREFIX) PLOTLIB= giza-fortran.F90 plotlib_giza.f90 PGPLOTLIBS = -L$(GIZA_DIR)/lib -lgiza $(CAIRO_LIBS) CFLAGS= -fPIC -Wall -Wextra -O3 -g CC = gcc else #-- P G P L O T -- PLOTLIB= plotlib_pgplot.f90 # # change the line below depending on where/how you have installed PGPLOT # (some settings of the SYSTEM variable for specific machines overwrite this) # PGPLOTLIBS = -L$(PGPLOT_DIR) -lpgplot -lpng endif #-------------------------------------------------------------- # # If you need the HDF5 libraries, edit the lines below # possibly adding a -L/libpath/ and a -I/includepath/ # ifndef HDF5ROOT ifdef HDF5_ROOT HDF5ROOT=$(HDF5_ROOT) endif ifdef HDF5_DIR HDF5ROOT=$(HDF5_DIR) endif endif HDF5LIBS = -L$(HDF5ROOT)/lib -lhdf5 HDF5INCLUDE = -I$(HDF5ROOT)/include H5PART_LIBS = -L$(H5PART_DIR)/lib -lH5Part H5PART_INCLUDE = -I$(H5PART_DIR)/include ifdef FITS_DIR FITSLIBS = -L$(FITS_DIR)/lib -lcfitsio else FITSLIBS = -lcfitsio endif FITSINCLUDE = -I$(FITS_DIR)/include # # this file contains system-dependent routines like getarg, iargc etc. # SYSTEMFILE= system_f2003.f90 # # this can be used to static link the pgplot libraries if all else fails # STATICLIBS= # # set the parallel flag to 'yes' to compile with openMP directives # #PARALLEL=no ifndef OPENMP OPENMP=yes endif # # compile in double precision by default (v3.0 onwards this is now default) # ifndef DOUBLEPRECISION DOUBLEPRECISION=yes endif # # the openMP flags should be set in the lines defining your system type # (ie. leave line below blank) OMPFLAGS= # # the endian flag can be used to compile the code to read BIG or LITTLE endian data # some compilers also allow this to be done at runtime (e.g. g95, ifort) by setting # an environment variable appropriately (e.g. G95_ENDIAN or F_UFMTENDIAN) # #ENDIAN= #ENDIAN='BIG' #ENDIAN='LITTLE' # # default destination for installed binaries # DESTDIR= PREFIX=/usr/local/ # # default C compiler # ifndef CC CC = gcc endif ifndef CXX CXX = g++ endif # default C++ library linking # (different between Mac/Linux) UNAME=$(shell uname) ifeq ($(UNAME), Darwin) CXXLIBS= -lc++ else CXXLIBS= -lstdc++ endif #-------------------------------------------------------------- # the following are general settings for particular compilers # # set the environment variable 'SYSTEM' to one of those # listed to use the appropriate settings # # in bash the equivalent is # export SYSTEM='gfortran' # #-------------------------------------------------------------- ifeq ($(SYSTEM), gfortran) # gfortran compiler (part of gcc 4.x.x) FC= gfortran FFLAGS= -O3 -fPIC DBLFLAGS= -fdefault-real-8 -fdefault-double-8 SYSTEMFILE= system_f2003.f90 DEBUGFLAG= -Wall -Wextra -pedantic -g -frange-check -fcheck=all -fbacktrace \ -finit-real=NaN #-ffpe-trap=invalid,zero,overflow OMPFLAGS= -fopenmp ENDIANFLAGBIG= -fconvert=big-endian ENDIANFLAGLITTLE= -fconvert=little-endian KNOWN_SYSTEM=yes endif ifeq ($(SYSTEM),sunf95) # sun f95 compiler on linux FC= sunf95 FFLAGS= -fast -ftrap=%none OMPFLAGS= -openmp DBLFLAGS= -xtypemap=real:64,double:64 DEBUGFLAG= -g -C -w4 -errtags -erroff=COMMENT_1582,COMMENT_1744 -ftrap=%all SYSTEMFILE= system_f2003.f90 ENDIANFLAGBIG= -xfilebyteorder=big16:%all ENDIANFLAGLITTLE= -xfilebyteorder=little16:%all KNOWN_SYSTEM=yes endif ifeq ($(SYSTEM),ifort) # this is for the intel fortran compiler (version 10) FC= ifort FFLAGS= -O3 -nbs OMPFLAGS= -qopenmp DBLFLAGS= -r8 DEBUGFLAG= -C -g SYSTEMFILE= system_f2003.f90 ENDIANFLAGBIG= -convert big_endian ENDIANFLAGLITTLE= -convert little_endian # or use setenv F_UFMTENDIAN=big or little at runtime KNOWN_SYSTEM=yes CC=icc CFLAGS=-Wall -O3 -fPIC endif ifeq ($(SYSTEM),ifx) # this is for the intel fortran compiler (version 10) FC= ifx FFLAGS= -O3 -nbs OMPFLAGS= -qopenmp DBLFLAGS= -r8 DEBUGFLAG= -C -g SYSTEMFILE= system_f2003.f90 ENDIANFLAGBIG= -convert big_endian ENDIANFLAGLITTLE= -convert little_endian # or use setenv F_UFMTENDIAN=big or little at runtime KNOWN_SYSTEM=yes CC=icc CFLAGS=-Wall -O3 -fPIC endif ifeq ($(SYSTEM),pgf90) # this is for the Portland Group Fortran 90 compiler (tested with version 7.2-5) FC= pgf90 FFLAGS= -fast -mcmodel=medium -Mbackslash -Ktrap=none DBLFLAGS= -r8 DEBUGFLAG= -C -g -gopt -Mbounds -Mchkfpstk -Mchkptr -Mchkstk -Mcoff \ -Mdwarf1 -Mdwarf2 -Melf -Mpgicoff -traceback OMPFLAGS= -mp SYSTEMFILE= system_f2003.f90 ENDIANFLAGBIG= -Mbyteswapio # only works on a little-endian machine ENDIANFLAGLITTLE= KNOWN_SYSTEM=yes endif ifeq ($(SYSTEM),pathf95) # this is for the Pathscale f95 compiler FC= pathf95 FFLAGS= -Ofast -mcmodel=medium DBLFLAGS= -r8 DEBUGFLAG= -C -g OMPFLAGS= -openmp SYSTEMFILE= system_f2003.f90 ENDIANFLAGBIG= -convert big_endian ENDIANFLAGLITTLE= -convert little_endian KNOWN_SYSTEM=yes endif #-------------------------------------------------------------- # # the following presets are user or machine-specific # #-------------------------------------------------------------- ifeq ($(SYSTEM),cody) FC= gfortran FFLAGS= -O3 -Wall SYSTEMFILE= system_f2003.f90 DBLFLAGS= -fdefault-real-8 -fdefault-double-8 DEBUGFLAG= -g -frange-check OMPFLAGS= -fopenmp ENDIANFLAGBIG= -fconvert=big-endian ENDIANFLAGLITTLE= -fconvert=little-endian SNFLAGS= -L$(HOME)/tree16/Objfiles/g5 -lsw CFLAGS = -g -O2 -Wall -I$(HOME)/tree16/include -fbounds-check CC = gcc KNOWN_SYSTEM=yes endif # # these are the flags used for linking # LDFLAGS= $(X11_LIBS) $(PGPLOTLIBS) # # this is an option to change the endian-ness at compile time # (provided the appropriate flags are specified for the compiler) # ifeq ($(ENDIAN), BIG) FFLAGS += ${ENDIANFLAGBIG} endif ifeq ($(ENDIAN), LITTLE) FFLAGS += ${ENDIANFLAGLITTLE} endif # compile in parallel ifeq ($(PARALLEL),yes) FFLAGS += $(OMPFLAGS) else ifeq ($(OPENMP),yes) FFLAGS += $(OMPFLAGS) endif endif # compile in double precision ifeq ($(DOUBLEPRECISION), yes) FFLAGS += ${DBLFLAGS} FPPFLAGS+=-DDP endif # add debugging flags at compile time ifeq ($(DEBUG),yes) FFLAGS += $(DEBUGFLAG) endif # # MPI... no splash doesn't use it # but sometimes you need to compile # with the mpi compiler (e.g. to link # correctly to MPI-HDF5 libraries) # This just changes the compiler name # whilst keeping the flags the same # if MPI is set to "yes" # ifeq ($(MPI),yes) FC= mpif90 -DPARALLEL_IO CC=mpicc -DPARALLEL_IO endif # # If PGPLOT was compiled with a different compiler to the one used here, # need to link to the libraries for that compiler. We attempt to do this # automatically below by looking in the PGPLOT makefile. # # If the relevant library is not found, may also need -L/dir/ for the directory # where the corresponding library is located (e.g. -L/usr/local/gfortran/lib -lgfortran) # # (information about what is done here is printed via the checkpgplot target, below) # ifeq ($(BACKEND),pgplot) ifdef PGPLOT_DIR PGPLOT_COMP=${shell if [ -e $$PGPLOT_DIR/makefile ]; then grep 'FCOMPL=' $$PGPLOT_DIR/makefile | cut -d= -f2; else echo unknown; fi} ifneq (X$(FC), X) # make sure it is not just accidentally blank ifneq ($(PGPLOT_COMP), $(FC)) # g77-compiled PGPLOT ifeq ($(PGPLOT_COMP), g77) PGPLOTLIBS+=-lg2c endif # gfortran-compiled PGPLOT ifeq ($(PGPLOT_COMP), gfortran) PGPLOTLIBS+=-lgfortran endif # g95-compiled PGPLOT ifeq ($(PGPLOT_COMP), g95) PGPLOTLIBS+=-lg95 endif endif endif endif endif ifeq ($(FC),gfortran) GFORTRAN_VERSION=${shell $(FC) -dumpversion | head -1 | awk '{print $$NF}'} GFORTRAN_VMAJOR:=${shell echo "$(GFORTRAN_VERSION)" | cut -f1 -d.} GFORTRAN_VMINOR:=${shell echo "$(GFORTRAN_VERSION)" | cut -f2 -d.} GFORTRAN_GE_4_4:=$(shell [ $(GFORTRAN_VMAJOR) -gt 4 -o \( $(GFORTRAN_VMAJOR) -eq 4 -a $(GFORTRAN_VMINOR) -ge 4 \) ] && echo true) else GFORTRAN_GE_4_4:=true endif # define the implicit rule to make a .o file from a .f90/.f95 file # (some Make versions don't know this) %.o : %.f90 $(FC) $(FFLAGS) -c $< -o $@ %.o : %.F90 $(FC) $(FPPFLAGS) $(FFLAGS) -c $< -o $@ %.o : %.f95 $(FC) $(FFLAGS) -c $< -o $@ %.o : %.c $(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@ # modules must be compiled in the correct order to check interfaces # really should include all dependencies but I am lazy READFILES= read_data_ascii.f90 read_data_sphNG.f90 read_data_ndspmhd.f90 \ read_data_gadget.f90 read_data_VINE.f90 read_data_sro.f90 \ read_data_dragon.f90 read_data_seren.f90 read_data_tipsy.f90 \ read_data_mhutch.f90 read_data_UCLA.f90 read_data_aly.f90 \ read_data_bauswein.f90 read_data_egaburov.f90 read_data_starsmasher.f90 \ read_data_gadget_jsb.f90 read_data_foulkes.f90 read_data_jjm.f90 \ read_data_jjm_multiphase.f90 read_data_mbate.f90 read_data_oilonwater.f90 \ read_data_rsph.f90 read_data_urban.f90 read_data_spyros.f90 \ read_data_vanaverbeke.f90 read_data_vtk.f90 READFILES_HDF5= hdf5_helper_utils.c read_data_gadget_hdf5_utils.c read_data_gadget_hdf5.f90 \ read_data_amuse_hdf5_utils.c read_data_amuse_hdf5.f90 \ read_data_cactus_hdf5_utils.c read_data_cactus_hdf5_futils.f90 read_data_cactus_hdf5.f90 \ read_data_flash_hdf5_utils.c read_data_flash_hdf5.f90 #read_data_falcON_hdf5_utils.cc read_data_falcON_hdf5_utils.f90 read_data_falcON_hdf5.f90 \ READFILES_FITS= write_fits.f90 read_data_fits.f90 READFILES_PBOB= read_data_pbob_utils.c read_data_pbob.f90 read_pbob.c read_particle.c READFILES_H5PART= H5PartF.c H5PartAttribF.c H5Part.f90 H5PartAttrib.f90 RUN_CHECKS= LDFLAGSLIB= # link with hdf5 libraries ifeq ($(HDF5),yes) READFILES+=$(READFILES_HDF5) CFLAGS+=$(HDF5INCLUDE) LDFLAGS+=$(HDF5LIBS) LDFLAGSLIB+=$(HDF5LIBS) FPPFLAGS+=-DHDF5 RUN_CHECKS+=checkhdf5 endif ifeq ($(FITS),yes) READFILES+= $(READFILES_FITS) LDFLAGS+=$(FITSLIBS) LDFLAGSLIB+=$(FITSLIBS) FPPFLAGS+=-DFITS RUN_CHECKS+=checkfits else READFILES+=no_fits.f90 endif ifdef PBOB_DIR READFILES+=$(READFILES_PBOB) VPATH+=$(PBOB_DIR) RUN_CHECKS+=checkpbob endif ifdef H5PART_DIR READFILES+=$(READFILES_H5PART) VPATH+=$(H5PART_LIBS) $(HDF5LIBS) RUN_CHECKS+=checkh5part endif SOURCES= $(PLOTLIB) globaldata.f90 physcon.f90 utils_vectors.f90 \ asciiutils.f90 byteswap.f90 \ labels.f90 partutils.f90 transform.f90 setpage.f90 sort.f90 \ prompting.f90 promptlist.f90 map_columns.f90 geometry.f90 kernels.f90 \ plotutils.f90 blackbody.f90 colourbar.f90 \ colours.f90 colourparts.f90 timing.f90 pagecolours.f90 \ interpolation.f90 interpolate1D.f90 interpolate2D.f90 \ rotate.f90 interpolate3D_projection.f90 interpolate3D_geom.f90 interpolate3D_xsec.f90 \ interpolate3D_proj_geom.f90 \ interpolate3D_opacity.f90 interpolate_vec.f90 interpolate3D.f90 \ units.f90 limits.f90 geomutils.f90 dataread_utils.f90 \ write_data_gadget.f90 write_data_phantom.f90 write_pfm.f90 write_pixmap.f90 \ write_griddata.f90 write_sphdata.f90 read_kepler.f90 \ $(SYSTEMFILE) system_utils.f90 \ cubicsolve.f90 discplot.f90 fparser.f90 parsetext.f90 \ exact_fromfile.f90 exact_Cshock.f90 exact_mhdshock.f90 \ exact_polytrope.f90 exact_rhoh.f90 exact_rochelobe.f90 \ exact_sedov.f90 exact_shock.f90 exact_shock_sr.f90 exact_wave.f90 \ exact_toystar1D.f90 exact_toystar2D.f90 exact_function.f90 exact_planetdisc.f90\ exact_densityprofiles.f90 exact_dustywaves.f90 exact_torus.f90 exact_bondi.f90 \ exact_ringspread.f90 exact_gresho.f90 exact.f90 shapes.f90 \ allocate.f90 titles.f90 calc_quantities.f90 contours.f90 \ legends.f90 options_render.f90 options_particleplots.f90 options_xsecrotate.f90 \ options_limits.f90 options_page.f90 imageutils.f90 \ lightcurve_utils.f90 $(READFILES) lightcurve.f90 extinction.f90 \ read_data.F90 \ adjust_data.f90 set_options_from_dataread.f90 get_data.f90 \ options_data.f90 options_powerspec.f90 \ options_vecplot.f90 pdfs.f90 \ particleplot.f90 interactive.f90 \ convert_grid.f90 \ analysis.f90 convert.f90 fieldlines.f90 \ powerspectrums.f90 render.f90 \ plotstep.f90 timestepping.f90 \ defaults.f90 initialise.f90 menu.f90 \ splash.f90 OBJECTS1= $(SOURCES:.f90=.o) $(STATICLIBS) OBJECTS2= $(OBJECTS1:.F90=.o) OBJECTS3= $(OBJECTS2:.c=.o) OBJECTS= $(OBJECTS3:.cc=.o) # # Now compile with the appropriate data read file # (move yours to the top so that you can simply type "make") # all: checksystem $(RUN_CHECKS) $(OBJECTS) read_data.o $(FC) $(FFLAGS) -o $(BINDIR)/splash $(OBJECTS) $(LDFLAGS) @echo; echo ' SPLASH v3 successfully compiled! '; @echo; echo ' "sudo make install" to copy the binary to $(DESTDIR)$(PREFIX)/bin'; @echo; echo ' If you do not have admin privileges, add the following to your .bashrc or equialent:'; @echo; echo ' export SPLASH_DIR=$$HOME/splash'; @echo ' export PATH=$$PATH:$$SPLASH_DIR/bin'; @echo; echo ' For backwards compatibility with v2.x, add the following to your .bashrc or equivalent:'; @echo; echo " alias asplash='splash ' # alias for ascii splash"; @echo " alias ssplash='splash -f phantom'"; @echo " alias gsplash='splash -f gadget' "; @echo " alias vsplash='splash -f vine' "; @echo " alias nsplash='splash -f ndspmhd' "; @echo " alias rsplash='splash -f srosph' "; @echo " alias dsplash='splash -f dragon' "; @echo " alias srsplash='splash -f seren' "; @echo " alias tsplash='splash -f tipsy' "; @echo " alias msplash='splash -f mhutch' "; echo; #---falcON HDF5 read --- falcon: falcON falcON: falcON_hdf5 falcON_hdf5: checksystem checkhdf5 $(OBJECTS) read_data_falcON_hdf5_utils.o read_data_falcON_hdf5.o $(FC) $(FFLAGS) -o $(BINDIR)/fsplash $(OBJECTS) read_data_falcON_hdf5_utils.o read_data_falcON_hdf5.o $(LDFLAGS) $(CXXLIBS) $(HDF5LIBS) -lhdf5_cpp read_data_falcON_hdf5_utils.o: read_data_falcON_hdf5_utils.cc $(CXX) $(CXXFLAGS) -std=c++11 $(HDF5INCLUDE) -c $< -o $@ #---SILO read --- silo: checksystem checksilo $(OBJECTS) read_data_silo_utils.o read_data_silo.o $(FC) $(FFLAGS) -o $(BINDIR)/silosplash $(OBJECTS) read_data_silo_utils.o read_data_silo.o $(LDFLAGS) $(HDF5LIBS) -lsiloh5 read_data_silo_utils.o: read_data_silo_utils.c $(CC) $(CFLAGS) $(HDF5INCLUDE) -c $< -o $@ # # sources for the grid2pdf command-line utility # SRCGRID2PDF= $(SYSTEMFILE) globaldata.f90 prompting.f90 transform.f90 \ asciiutils.f90 write_griddata.f90 pdfs.f90 grid2pdf.f90 OBJGRID2PDF= ${SRCGRID2PDF:.f90=.o} grid2pdf: checksystem $(OBJGRID2PDF) $(FC) $(FFLAGS) -o $(BINDIR)/$@ $(OBJGRID2PDF) # # # liball: lib libexact libread # # libsplash: library version of splash interpolation routines # SRCLIB= sort.f90 asciiutils.f90 kernels.f90 timing.f90 geometry.f90 \ interpolation.f90 interpolate1D.f90 interpolate2D.f90 interpolate3D.f90 \ interpolate3D_geom.f90 interpolate3D_projection.f90 \ interpolate3D_proj_geom.f90 interpolate3D_opacity.f90 interpolate3D_xsec.f90 \ libsplash.f90 libutils.f90 OBJLIB1=${SRCLIB:.f90=.o} OBJLIB=${OBJLIB1} libread.o .PHONY: libsplash libsplash: lib lib: $(OBJLIB) $(FC) -shared -fPIC $(FFLAGS) $(FPPFLAGS) $(DBLFLAGS) $(OBJLIB) -o libsplash.so # # libexact: exact solution library # SRCLIBEXACT= plotlib_mock.f90 libutils.f90 geometry.f90 exact_shock.f90 \ exact_shock_sr.f90 exact_sedov.f90 \ exact_polytrope.f90 exact_toystar1D.f90 exact_toystar2D.f90 exact_gresho.f90 \ exact_mhdshock.f90 exact_rhoh.f90 exact_densityprofiles.f90 exact_torus.f90 \ exact_ringspread.f90 cubicsolve.f90 exact_dustywaves.f90 exact_rochelobe.f90 \ exact_Cshock.f90 exact_planetdisc.f90 exact_bondi.f90 \ libexact.f90 OBJLIBEXACT=${SRCLIBEXACT:.f90=.o} OBJLIBEXACTALL=${OBJLIBEXACT:.F90=.o} .PHONY: libexact libexact: checksystem $(OBJLIBEXACTALL) $(FC) -shared -fPIC $(FFLAGS) $(FPPFLAGS) $(DBLFLAGS) $(OBJLIBEXACTALL) -o libexact.so # # libread: data read library # SRCLIBREAD= globaldata.f90 physcon.f90 asciiutils.f90 libutils.f90 labels.f90 allocate.f90 byteswap.f90 $(SYSTEMFILE)\ system_utils.f90 geometry.f90 prompting.f90 fparser.f90 units.f90 timing.f90\ sort.f90 geomutils.f90 partutils.f90 calc_quantities.f90 dataread_utils.f90 \ utils_vectors.f90 lightcurve_utils.f90 read_kepler.f90 $(READFILES) read_data.F90 \ adjust_data.f90 limits.f90 get_data.f90 initialise.f90 read.f90 libread.f90 OBJLIBREAD=${SRCLIBREAD:.f90=.o} OBJLIBREAD1=${OBJLIBREAD:.F90=.o} OBJLIBREADALL=${OBJLIBREAD1:.c=.o} .PHONY: libread libread: checksystem $(OBJLIBREADALL) $(FC) -shared -fPIC $(FFLAGS) $(FPPFLAGS) $(DBLFLAGS) $(OBJLIBREADALL) -o libread.so $(LDFLAGSLIB) # # splash image manipulation utilities # SOURCESIMLIB= asciiutils.f90 $(SYSTEMFILE) system_utils.f90 timing.f90 kernels.f90 \ interpolation.f90 interpolate2D.f90 interpolate3D.f90 \ imageutils.f90 write_fits.f90 denoise.f90 OBJECTSIMLIB = $(SOURCESIMLIB:.f90=.o) .PHONY: denoise splash-image: denoise splash-denoise: denoise denoise: checksystem checkfits $(OBJECTSIMLIB) $(FC) $(FFLAGS) -o $(BINDIR)/$@ $(OBJECTSIMLIB) $(FITSLIBS) @echo; echo ' Denoise utility successfully compiled! '; @echo; echo ' Use "make install" to copy the binaries to $(DESTDIR)$(PREFIX)/bin'; echo; # # splash moments # SOURCESM= asciiutils.f90 $(SYSTEMFILE) system_utils.f90 timing.f90 kernels.f90 \ interpolate1D.f90 write_fits.f90 moments.f90 sph_moments.f90 OBJECTSM = $(SOURCESM:.f90=.o) .PHONY: sphmoments sphmoments: checksystem checkfits $(OBJECTSM) $(FC) $(FFLAGS) -o $(BINDIR)/$@ $(OBJECTSM) $(FITSLIBS) @echo; echo ' sphmoments utility successfully compiled! '; @echo; echo ' Use "make install" to copy the binaries to $(DESTDIR)$(PREFIX)/bin'; echo; checksystem: ifeq ($(KNOWN_SYSTEM), yes) @echo "" @echo "Compiling splash for $(SYSTEM) system..........." @echo "" ifeq ($(ENDIAN), BIG) @echo "Flags set for conversion to BIG endian" endif ifeq ($(ENDIAN), LITTLE) @echo "Flags set for conversion to LITTLE endian" endif ifeq ($(PARALLEL), yes) @echo "Compiling the PARALLEL code" else ifeq ($(OPENMP), yes) @echo "Compiling the PARALLEL code" else @echo "Compiling the SERIAL code" endif endif ifeq ($(FC),gfortran) ifeq ($(GFORTRAN_GE_4_4),true) @echo "compiling with gfortran v$(GFORTRAN_VERSION) (OK)" else ${error gfortran v$(GFORTRAN_VERSION) is too old to compile this version of splash: please upgrade your gfortran} endif endif else @echo "" @echo " Makefile for splash by Daniel Price " @echo " -- see INSTALL file for detailed instructions" @echo "" @echo " make: ERROR: value of SYSTEM=$(SYSTEM) not recognised..." @echo " => set the environment variable SYSTEM to one listed " @echo " in build/Makefile and try again" @echo "" @${MAKE} compilers @$(MAKE) err; endif compilers: @echo "I suggest one of the following, based on detected Fortran compilers..."; echo; @if type -p ifx > /dev/null; then echo "make SYSTEM=ifx"; fi; @if type -p ifort > /dev/null; then echo "make SYSTEM=ifort"; fi; @if type -p pathf90 > /dev/null; then echo "make SYSTEM=pathf90"; fi; @if type -p pgf90 > /dev/null; then echo "make SYSTEM=pgf90"; fi; @if type -p xlf90_r > /dev/null; then echo "make SYSTEM=ukaff1a [uses xlf90_r]"; fi; @if type -p gfortran > /dev/null; then echo "make SYSTEM=gfortran"; fi; @if type -p g95 > /dev/null; then echo "make SYSTEM=g95"; fi; @echo "(end of possible selections)"; echo; checkpgplot: ifeq (X${PGPLOT_DIR}, X) @echo; echo "ERROR: PGPLOT_DIR should be set before compiling splash"; echo; ${MAKE} err; else @if [ -d $$PGPLOT_DIR ]; then echo; echo "PGPLOT_DIR=$$PGPLOT_DIR"; echo; else echo; echo "ERROR: Directory given by PGPLOT_DIR=$$PGPLOT_DIR does not exist"; echo; ${MAKE} err; fi; endif ifneq ($(PGPLOT_COMP),$(FC)) @echo; echo "*** WARNING: PGPLOT appears to have been compiled with a different Fortran"; echo " compiler (${PGPLOT_COMP}) to the one you are using to compile SPLASH (${FC}),"; echo " so may need to link to the relevant compiler libraries ***"; # g77-compiled PGPLOT @if [ "${PGPLOT_COMP}" = "g77" ]; then echo " [Adding -lg2c to the link flags for g77-compiled PGPLOT]"; fi; # gfortran-compiled PGPLOT @if [ "${PGPLOT_COMP}" = "gfortran" ]; then echo " [Adding -lgfortran to the link flags for gfortran-compiled PGPLOT]"; fi; # g95-compiled PGPLOT @if [ "${PGPLOT_COMP}" = "g95" ]; then echo " [Adding -lg95 to the link flags for g95-compiled PGPLOT]"; fi; @echo # else # @echo "PGPLOT was compiled with ${PGPLOT_COMP}"; endif checkgiza: @if [ ! -e $(GIZA_DIR)/include/giza-fortran.F90 ]; then \ if [ -d ../giza/ ]; then \ echo "*********************************************************"; \ echo "* *"; \ echo "* ERROR: Cannot find system install of giza *"; \ echo "* Type \"make withgiza\" to build local copy of giza *"; \ echo "* *"; \ echo "*********************************************************"; \ else \ echo "*********************************************************"; \ echo "* *"; \ echo "* ERROR: giza is not installed. Please install it. *"; \ echo "* *"; \ echo "* e.g: *"; \ echo "* git clone https://github.com/danieljprice/giza.git *"; \ echo "* make withgiza *"; \ echo "* *"; \ echo "*********************************************************"; \ fi; \ fi; checkh5part: checkhdf5 ifeq (X${H5PART_DIR}, X) @echo; echo "ERROR: H5PART_DIR should be set before compiling splash with h5part read/write"; echo; ${MAKE} err; else @if [ -d $$H5PART_DIR ]; then echo; echo "H5PART_DIR=$$H5PART_DIR"; echo; else echo; echo "ERROR: Directory given by H5PART_DIR=$$H5PART_DIR does not exist"; echo; ${MAKE} err; fi; endif checkhdf5: ifeq (X${HDF5ROOT}, X) @echo; echo "ERROR: HDF5ROOT should be set before compiling splash with HDF5 utilities"; echo; ${MAKE} err; else @if [ -d $$HDF5ROOT ]; then echo; echo "HDF5ROOT=$$HDF5ROOT"; echo; else echo; echo "ERROR: Directory given by HDF5ROOT=$$HDF5ROOT does not exist"; echo; ${MAKE} err; fi; endif checksilo: checkhdf5 ifeq (X${SILO_DIR}, X) @echo; echo "ERROR: SILO_DIR should be set before compiling splash with SILO reader"; echo; ${MAKE} err; else @if [ -d $$SILO_DIR ]; then echo; echo "SILO_DIR=$$SILO_DIR"; echo; else echo; echo "ERROR: Directory given by SILO_DIR=$$SILO_DIR does not exist"; echo; ${MAKE} err; fi; endif checkfits: ifeq (X${FITS_DIR}, X) @echo; echo "*** WARNING: May need FITS_DIR=/usr/local to find cfitsio library **"; echo; else @if [ -d $$FITS_DIR ]; then echo; echo "FITS_DIR=$$FITS_DIR"; echo; else echo; echo "ERROR: Directory given by FITS_DIR=$$FITS_DIR does not exist"; echo; ${MAKE} err; fi; endif checkpbob: ifeq (X${PBOB_DIR}, X) @echo; echo "ERROR: PBOB_DIR should be set before compiling splash with PBOB reader"; echo; ${MAKE} err; else @if [ -d $$PBOB_DIR ]; then echo; echo "PBOB_DIR=$$PBOB_DIR"; echo; else echo; echo "ERROR: Directory given by PBOB_DIR=$$PBOB_DIR does not exist"; echo; ${MAKE} err; fi; endif # # install option, copies any binaries compiled to /usr/local/bin/ # run `make' first, then `make install'. Could in principle # have install compile it as well, but environment variables # will not be defined if "make" is run using sudo, so better # to do the two separately # install: destdircheck installcheck @cd $(BINDIR); for x in *splash*; do if [ -e $$x ]; then echo "copying $$x -> $(DESTDIR)$(PREFIX)/bin/$$x"; cp $$x $(DESTDIR)$(PREFIX)/bin/; fi; done; @cd $(BINDIR); x=denoise; if test -e $$x; then echo "copying $$x -> $(DESTDIR)$(PREFIX)/bin/$$x"; cp $$x $(DESTDIR)$(PREFIX)/bin/; fi; @cd $(BINDIR); x=sphmoments; if test -e $$x; then echo "copying $$x -> $(DESTDIR)$(PREFIX)/bin/$$x"; cp $$x $(DESTDIR)$(PREFIX)/bin/; fi; @echo; echo 'installation complete'; installcheck: @if [ -e $(BINDIR)/splash ] || [ -e $(BINDIR)/denoise ] || [ -e $(BINDIR)/sphmoments ]; then echo; \ echo 'compiled binaries install to $(DESTDIR)$(PREFIX)/bin'; \ echo '(use "sudo make install" if Permission denied)'; \ echo; else echo;\ echo 'run "make" first, followed by "make install"'; echo;\ $(MAKE) err; fi destdircheck: installcheck @if test -d $(DESTDIR)$(PREFIX)/bin; then echo $(DESTDIR)$(PREFIX)/bin exists and is a directory; else \ echo; echo "*** ERROR in make install ***"; echo "$(DESTDIR)$(PREFIX)/bin is not a valid directory"; echo;\ $(MAKE) err; fi; installclean: destdircheck @for x in $(DESTDIR)$(PREFIX)/bin/?splash; do rm $$x; done; distclean: installclean cleanall: clean installclean err: $(error aborting); ## other stuff plotlib_pgplot.o: checkpgplot plotlib_giza.o : giza-fortran.o giza-fortran.o : giza-fortran.F90 $(FC) $(FFLAGS) -I$(GIZA_DIR)/include/ -c $(GIZA_DIR)/include/giza-fortran.F90 -o $@ .PHONY: giza gizabuild libgiza giza-fortran.F90 : checkgiza # # LOCAL build of giza # withgiza: ../giza/lib/libgiza.a $(MAKE) $(MAKECMDFLAGS) GIZA_DIR="../giza" ../giza/lib/libgiza.a: @echo "Compiling local copy of giza..." cd ../giza; ./configure --prefix="$(PWD)/../giza" CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="" CAIRO_LIBS="$(CAIRO_LIBS)" CAIRO_CFLAGS="$(CAIRO_CFLAGS)" X11_LIBS="$(X11_LIBS)" X11_CFLAGS="$(X11_CFLAGS)" cd ../giza; $(MAKE) $(MAKECMDFLAGS) install CC="$(CC)" CFLAGS="$(CFLAGS)" docs: doc doc: cd ../docs; make html latexpdf htmldocs: htmldoc htmldoc: doc cleanhtmldocs cd ../docs; \ make html cleanhtmldocs: cd ../docs; make clean tar: tar cf splash.tar Makefile $(SOURCES) read_data*.f90 targz: tar cf splash.tar Makefile $(SOURCES) read_data*.f90 gzip splash.tar ## unit tests of various modules as I write them .PHONY: tests test: test1 test2 test3 test_slicer test_prompt test-parse test1: interpolate3D_projection.o interpolate3D_xsec.o test_interpolate3D.o $(FC) $(FFLAGS) $(LDFLAGS) -o $(BINDIR)/test_interpolation3D $(TESTDIR)/test_interpolate3D.o interpolate3D_projection.o interpolate3D_xsec.o test2: transform.o $(TESTDIR)//test_transform.o $(FC) $(FFLAGS) $(LDFLAGS) -o $(BINDIR)/test_transform $(TESTDIR)/test_transform.o transform.o test3: fieldlines.o $(TESTDIR)//test_fieldlines.o $(FC) $(FFLAGS) $(LDFLAGS) -o $(BINDIR)/test_fieldlines $(TESTDIR)/test_fieldlines.o fieldlines.o test_slicer: interpolate3D_projection.o interpolate3D_xsec.o test_slicer3D.o $(FC) $(FFLAGS) $(LDFLAGS) -o $(BINDIR)/test_slicer3D $(TESTDIR)/test_slicer3D.o interpolate3D_projection.o interpolate3D_xsec.o test_prompt: prompting.o test_prompting.o $(FC) $(FFLAGS) $(LDFLAGS) -o $(BINDIR)/test_prompt prompting.o test_prompting.o test-parse: $(PLOTLIB) asciiutils.o fparser.o parsetext.o $(TESTDIR)/test-parsetext.o $(FC) $(FFLAGS) -o $(BINDIR)/test-parse giza-fortran.o plotlib_giza.o fparser.o asciiutils.o parsetext.o $(TESTDIR)/test-parsetext.o $(LDFLAGS) # #--code dependencies: MAY BE INCOMPLETE - I generate this automatically every so often # include .depends cleanread: rm -f read_data*.o splash.o $(BINDIR)/?splash $(BINDIR)/splash* libsplash.so libexact.so clean: rm -f *.o *.mod $(BINDIR)/?splash $(BINDIR)/splash* libsplash.so libexact.so $(BINDIR)/denoise cleangiza: ${MAKE} -C ../giza clean uninstall danieljprice-splash-4d1f09c/docs/000077500000000000000000000000001477365367100170225ustar00rootroot00000000000000danieljprice-splash-4d1f09c/docs/Makefile000066400000000000000000000011721477365367100204630ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) danieljprice-splash-4d1f09c/docs/_static/000077500000000000000000000000001477365367100204505ustar00rootroot00000000000000danieljprice-splash-4d1f09c/docs/_static/css/000077500000000000000000000000001477365367100212405ustar00rootroot00000000000000danieljprice-splash-4d1f09c/docs/_static/css/custom.css000066400000000000000000000000761477365367100232670ustar00rootroot00000000000000.math { text-align: center; } .eqno { float: right; } danieljprice-splash-4d1f09c/docs/advanced.rst000066400000000000000000001024321477365367100213230ustar00rootroot00000000000000 Advanced plotting examples ========================== Rendered plot of star formation data ------------------------------------ This is an example using data provided by Paul Clark. The data is from an SPH simulation of star formation in sphNG format. We read the dump file as follows: :: dprice/dustfrag> splash omuk162 after which we get output along the lines of: :: ... reading single dumpfile >>>>>>>>>>>>>>>>>>>>>>>>>> omuk162 <<<<<<<<<<<<<<<<<<<<<<<<<< double precision dump File ID: FHydroRTMHD1 npart = 11744854 ... and arrive at the main menu: :: You may choose from a delectable sample of plots ------------------------------------------------------- 1) x 7) v\dx 2) y 8) v\dy 3) z 9) v\dz 4) particle mass 10) u 5) h 11) grad h 6) density ------------------------------------------------------- 12) multiplot [ 4 ] m) set multiplot ------------------------------------------------------- d(ata) p(age) o(pts) l(imits) le(g)end h(elp) r(ender) v(ector) x(sec/rotate) s,S(ave) q(uit) ------------------------------------------------------- Please enter your selection now (y axis or option): here we want to plot a rendered plot of column density (density is in column 6), so we type ``2`` for column 2 (y) as the y axis, ``1`` for column 1 (x) as the x-axis and at the render prompt ``6``, for density, ie: :: Please enter your selection now (y axis or option):2 (x axis) (default=1): (render) (0=none) ([0:11], default=0):6 (vector plot) (0=none, 7=v) ([0:7], default=0):0 Graphics device/type (? to see list, default /xw): /xw producing the plot shown in :numref:`fig:starpart1` – somewhat black! .. figure:: figs/starpart1.png :alt: star formation tutorial part 1a :name: fig:starpart1 :width: 50.0% First stage in the star formation figure tutorial: a simple render plot of density The main thing to note is the limits on the colour bar (extending from :math:`0` to :math:`10^{7}` on a linear scale) which is the main source of all the blackness. Moving the cursor over the colour bar and pressing ``l`` for log produces :numref:`fig:starpart1b` — a vast improvement! .. figure:: figs/starpart2.png :alt: star formation tutorial part 1b :name: fig:starpart1b :width: 50.0% With a log axis after having placed cursor over colour bar and pressed ``l`` For this visualisation we will eventually want the data in physical units rather than code units. For the sphNG read these units are already specified in the read_data routine, so all we have to do is turn physical units on. Pressing ``q`` from interactive mode (that is, with the cursor in the plot window) returns us to the main menu. Physical units are turned on from the :ref:`sec:menu-d`, as follows: :: Please enter your selection now (y axis or option):d ----------------- data read options ------------------- 0) exit 1) read new data /re-read data 2) change number of timesteps used ( 1 ) 3) plot selected steps only ( OFF ) 4) buffering of data on/off ( OFF ) 5) turn calculate extra quantities on/off ( OFF ) 6) use physical units ( OFF ) 7) change physical unit settings enter option ([0:7], default=0):6 current settings for conversion to physical units are: x [cm] = x x 1.000E+17 y [cm] = y x 1.000E+17 z [cm] = z x 1.000E+17 particle mass [g] = particle mass x 1.991E+33 h [cm] = h x 1.000E+17 density [g/cm\u3\d] = density x 1.991E-18 v\dx [cm/s] = v\dx x 3.645E+04 v\dy [cm/s] = v\dy x 3.645E+04 v\dz [cm/s] = v\dz x 3.645E+04 u [erg/g] = u x 1.328E+09 grad h = grad h x 1.000E+00 time = time x 1.69E+00 Use physical units? (default=yes): returning us to the main menu with labels changed as follows: :: You may choose from a delectable sample of plots ------------------------------------------------------- 1) x [cm] 7) v\dx [cm/s] 2) y [cm] 8) v\dy [cm/s] 3) z [cm] 9) v\dz [cm/s] 4) particle mass [g] 10) u [erg/g] 5) h [cm] 11) grad h 6) log density [g/cm\u3 ------------------------------------------------------- 12) multiplot [ 4 ] m) set multiplot ------------------------------------------------------- d(ata) p(age) o(pts) l(imits) le(g)end h(elp) r(ender) v(ector) x(sec/rotate) s,S(ave) q(uit) ------------------------------------------------------- Please enter your selection now (y axis or option): at this stage we will save the current settings to file by pressing ``s`` from the main menu. :: Please enter your selection now (y axis or option):s default options saved to file splash.defaults Actually we would prefer the column labels in AU, but we will come to that later. Replotting the same plot (that is 2, 1, 6, 0, /xw from the main menu) plots the same plot we had before, but with the axes in physical units. Zooming in (using the mouse) on the region of interest and adapting the colour bar limits by moving the mouse over the colour bar and pressing ``a`` produces the plot shown in :numref:`fig:starpart2`. .. figure:: figs/starpart3.png :alt: star formation tutorial part 2a :name: fig:starpart2 :width: 50.0% Second stage in the star formation figure tutorial: having applied physical units, zooming in and pressing ``a`` on the colour bar For this kind of plot, the Bate colour scheme looks better – pressing ``m`` with the mouse in the plot window changes the colour scheme, producing the plot shown in :numref:`fig:starpart2b`. .. figure:: figs/starpart4.png :alt: star formation tutorial part 2b :name: fig:starpart2b :width: 50.0% having changed the colour scheme Pressing ``s`` in interactive mode (that is, with the mouse in the plot window) saves the current zoom and colour bar settings (but not to disk until you also press ``S`` from the main menu). Pressing ``q`` from interactive mode returns to the main menu. Next we want to turn on the plotting of sink particles (all particle types other than gas are turned off by default). This is done in the :ref:`sec:menu-o` as follows: :: Please enter your selection now (y axis or option):o ------------- particle plot options ------------------- 0) exit 1) turn on/off particles by type ( ON, OFF, OFF, OFF ) 2) change graph markers for each type ( 1, 4, 17, 1 ) 3) set colour for each particle type ( -1, -1, -1, -1 ) 4) plot line joining particles ( OFF ) 5) plot smoothing circles ( 0 ) 6) use fast particle plotting ( ON ) 7) change coordinate systems ( 1 ) 8) plot exact solution ( 0 ) 9) exact solution plot options enter option ([0:9], default=0):1 Plot gas particles? (default=yes): Plot ghost particles? (default=no): Plot sink particles? (default=no):y >> Plot sink particles on top of rendered plots? (default=no):y Plot unknown/dead particles? (default=no): Repeating our previous plot (i.e., 2, 1, 6, 0, /xw) produces the plot shown in :numref:`fig:starpart3`. .. figure:: figs/starpart5.png :alt: star formation tutorial part 3a :name: fig:starpart3 :width: 50.0% Third stage in the star formation figure tutorial: having turned sink particle plotting on .. figure:: figs/starpart6.png :alt: star formation tutorial part 3b :name: fig:starpart3b :width: 50.0% replacing the axes with a scale The axes in [cm] are kind of ugly, so we could either change this to a sensible unit or plot a scale instead. We will do the latter. The axes can be turned off in the :ref:`sec:menu-p`, as follows: :: Please enter your selection now (y axis or option):p ---------------- page setup options ------------------- ... 2) axes options ( 0) ... enter option ([0:8], default=0):2 -4 : draw box and major tick marks only; -3 : draw box and tick marks (major and minor) only; -2 : draw no box, axes or labels; -1 : draw box only; 0 : draw box and label it with coordinates; 1 : same as AXIS=0, but also draw the coordinate axes (X=0, Y=0); 2 : same as AXIS=1, but also draw grid lines at major increments of the coordinates; 10 : draw box and label X-axis logarithmically; 20 : draw box and label Y-axis logarithmically; 30 : draw box and label both axes logarithmically. enter axis option ([-4:30], default=0):-2 axis = -2 The option to plot a scale of a particular length is also to be found in the :ref:`sec:menu-g`. We will choose to plot a scale of length 0.1 pc. :: Please enter your selection now (y axis or option):g ---------------- legend and title options ------------------- To set the plot titles, create a file called 'splash.titles' in the working directory, with one title per line 0) exit 1) time legend on/off/settings ( ON 0.87 1.87 0.00 "t=") 2) titles on/off/settings ( ON 0.20 -0.92 0.00) 3) legend for multiple steps per page on/off ( OFF ) 4) plot scale on co-ordinate plots ( OFF ) 5) legend only on nth panel/first row/column ( 0 ) Enter option ([0:5], default=0):4 Plot scale on co-ordinate plots? (default=no):y Enter length of scale in the current x,y,z units (default=1.000):3.0856e15 Enter text to appear below scale (e.g. '10 AU') (default=1 unit): 0.1 pc Enter horizontal position as fraction of viewport ([0.000:1.000], default=0.5000): Enter vertical position in character heights above bottom (default=1.000): Note that because the x axis units were already in cm, we simply entered the value for 0.1pc in these units. Before plotting again, we should save what we have done so far to disk: Pressing ``S`` from the main menu saves both the current plot settings *and* the plot limits to disk: :: Please enter your selection now (y axis or option):S default options saved to file splash.defaults saving plot limits to file splash.limits Plotting our figure again (``2``-``1``-``6``-``0``-``/xw``) produces the plot shown in :numref:`fig:starpart3` Nearly there...! To add the finishing touches we want to increase the number of pixels substantially. This is done in the :ref:`sec:menu-r`, option 1, for which we can use the shortcut ``r1``: :: Please enter your selection now (y axis or option):r1 ----------------- rendering options ------------------- enter number of pixels along x axis ([1:10000], default=200):1000 then, to plot the figure to file instead of the screen, we simply choose a different device at the prompt: :: Please enter your selection now (y axis or option):2 (x axis) (default=1): (render) (0=none) ([0:11], default=6): (vector plot) (0=none, 7=v) ([0:7], default=0): Graphics device/type (? to see list, default /xw): starpartfinal.gif/gif producing our final finished :numref:`fig:starfinal`. .. figure:: figs/starpartfinal.png :alt: Finished star formation plot :name: fig:starfinal :width: 50.0% Finished star formation plot Pressing ``S`` from the main menu saves all of the settings and plot limits to disk, so invoking splash again will produce the same plot. To produce the same plot on a sequence of dumps, simply put more than one file on the command line and plot to a non-interactive device (see :ref:`sec:movies`). Use the postscript devices /ps or /cps (for colour) to make figures suitable for inclusion in a paper. Other things you may want to do with this plot include: - Turn the time legend off. See :ref:`sec:legendoff`. - Change the colour of sink particles. See :ref:`sec:partcolours`. - Change the foreground/background colour of the page. See :ref:`sec:pagecolours`. Multi-panelled figure --------------------- The following is an example plot taken from [PB07]_. Here I will plot a sequence of plots tiled on the same page, so that columns correspond to dumps taken from different runs at the same time and rows correspond to an evolutionary sequence from a given run. The plot uses sphNG data which contains sink particles, so I also want these to appear on the plots and be plotted in white. Basically I want the plots to be plotted such that as much of the plot is taken up by data and very little by axes and the like but still conveying all of the necessary information. We proceed as follows: Firstly, each different run (corresponding in this case to a series of runs with different magnetic field strength) are in different subdirectories with names like ``mbossbod_f10.0/``, ``mbossbod_f5.0/``, etc. which all contain a sequence of dump files with names like ``mbos001``, ``mbos002`` etc. To begin the plot, I start by creating a new, empty subdirectory so that the ``splash.defaults`` and ``splash.limits`` files created by pressing ``S`` from the main menu will be in this directory such that running splash from that directory always produces this plot. So: :: dprice% mkdir plot1 dprice% cd plot1 then having decided which dump files from each run to use, I create a text file listing these filenames (with the full relative pathname) in the order in which I will plot them. For example, calling this file (arbitrarily) ``filelistplot``, the contents should be something like the following: :: dprice% more filelistplot ../mbossbod_f20.0/mbos259 ../mbossbod_f20.0/mbos263 ../mbossbod_f20.0/mbos268 ../mbossbod_f20.0/mbos275 ../mbossbod_f20.0/mbos294 ../mbossbod_f10.0/mbos259 ../mbossbod_f10.0/mbos263 ../mbossbod_f10.0/mbos268 ../mbossbod_f10.0/mbos275 ../mbossbod_f10.0/mbos294 ../mbossbod_f7.5/mbos259 ../mbossbod_f7.5/mbos263 ../mbossbod_f7.5/mbos268 ... Then invoke splash with these filenames on the command line: :: splash `cat filelistplot` after which the first dump file should be read, indicated by output along the lines of: :: reading single dumpfile >>>>>>>>>>>>>>>>>>>>>>>>>> ../mbossbod_f20.0/mbos259 <<<<<<<<<<<<<<<<<<<<<<<<<< double precision dump File ID: SHydroRTMHD1 npart = 491567 ... An alternative method is to rename the ``filelistplot`` file ``splash.filenames``, from which the filenames will be read if there are none specified on the command line (this feature was implemented as a workaround for a limit to the number of command line arguments on the some compilers). The first stage is to get a plot of a single panel looking good. So, from the main menu, we will plot a simple rendering of density and adjust the plot limits until we are happy: :: You may choose from a delectable sample of plots ------------------------------------------------------- 1) x 6) density 2) y 7) B\dx 3) z 8) B\dy 4) particle mass 9) B\dz 5) h ------------------------------------------------------- 10) multiplot [ 4 ] m) set multiplot ------------------------------------------------------- d(ata) p(age) o(pts) l(imits) le(g)end h(elp) r(ender) v(ector) x(sec/rotate) s,S(ave) q(uit) ------------------------------------------------------- Please enter your selection now (y axis or option):2 (x axis) (default=1): (render) (0=none) ([0:9], default=0):6 (vector plot) (0=none, 7=B) ([0:7], default=0): Graphics device/type (? to see list, default /xw): /xw which should produce the plot shown in :numref:`fig:multipart1`. Not much can be seen at first – just a few white dots. This is mainly a result of the density axis (i.e., the colour bar) not being logged. .. figure:: figs/multipart1.png :alt: multi-panelled figure tutorial part 1 :name: fig:multipart1 :width: 50.0% First stage in the multi-panelled figure tutorial: a simple render plot of density Moving the cursor over the colour bar and pressing ``l`` results in the plot shown in :numref:`fig:multipart1b` .. figure:: figs/multipart2.png :alt: multi-panelled figure tutorial part 1b :name: fig:multipart1b :width: 50.0% and with a log axis after having placed cursor over colour bar and pressed ``l`` Before we proceed any further, we will first change the axes to be in physical units rather than code units. Pressing ``q`` in the plot window to exit interactive mode and return to the main menu, and from the :ref:`sec:menu-d`, turn the ``use physical units`` option on: :: Please enter your selection now (y axis or option):d ----------------- data read options ------------------- 0) exit 1) read new data /re-read data 2) change number of timesteps used ( 1 ) 3) plot selected steps only ( OFF ) 4) buffering of data on/off ( OFF ) 5) turn calculate extra quantities on/off ( OFF ) 6) use physical units ( OFF ) 7) change physical unit settings enter option ([0:7], default=0):6 current settings for conversion to physical units are: x [cm] = x x 1.000E+16 y [cm] = y x 1.000E+16 z [cm] = z x 1.000E+16 particle mass [g] = particle mass x 1.991E+33 h [cm] = h x 1.000E+16 density [g/cm\u3\d] = density x 1.991E-15 B\dx [G] = B\dx x 1.000E+00 B\dy [G] = B\dy x 1.000E+00 B\dz [G] = B\dz x 1.000E+00 time = time x 1.13E-01 Use physical units? (default=yes):yes The default transformations to physical units are in this case set in the data read. However it would be nicer in this case to set the x and y axis units to AU (Astronomical Units), rather than cm. From the :ref:`sec:menu-d` we proceed as follows: :: enter option ([0:7], default=0):7 enter column to change units (-2=reset all,-1=quit,0=time) ([-2:9], default=-1):1 enter x [cm] units (new=old*units) (default=0.1000E+17):668.3893 enter label amendment (default=[cm]): [AU] Apply these units to all coordinates and h? (default=yes): Enter unit for 'z' in 3D column integrated plots (default=0.1000E+17): Enter label for z integration unit (e.g. [cm]) (default=[cm]): enter column to change units (-2=reset all,-1=quit,0=time) ([-2:9], default=-1): save units to file? (default=yes): saving plot limits to file splash.units where in the above I set the multiplicative factor such that the x axis will be in AU and correspondingly changed the units label to ``[AU]`` (note the preceding space). I was also prompted to change the unit for ’z integration’ – this is the length unit added when integrating a quantity through z. Leaving this in cm means that, even though the coordinate axes are in AU, the density (in g/cm\ :math:`^{3}`) is integrated through z in cm, giving column density in g/cm\ :math:`^{2}` (as opposed to g /cm:math:`^{3}` AU). To save what we have done so far, press ``s`` from the main menu to save the current settings to the ``splash.defaults`` file: :: Please enter your selection now (y axis or option):s default options saved to file splash.defaults Having turned physical units on, we replot the same plot (i.e., answering ``2``, ``1``, ``6``, ``0``, ``/xw`` to the prompts, as previously). First of all we find simply a white screen. This is a result of the colour bar axis now being wrong. Moving the mouse over the colour bar and pressing ``a`` (to adapt) results in the plot shown in :numref:`fig:multipart3`. The plot looks basically identical to the previous plot, except that the axes are now in physical units (x and y are in AU and column density is in g/cm\ :math:`^{2}`). .. figure:: figs/multipart3.png :alt: multi-panelled figure tutorial part 2 :name: fig:multipart3 :width: 50.0% Second stage in the multi-panelled figure tutorial: having changed the axes into physical units Next, we zoom in to the central region of interest using the mouse – selecting a region and clicking to zoom in. Pressing ``o`` centres the plot on the origin and as we zoom in it we also press ``a`` over the colour bar to readjust the colour bar limits to the max/min on the zoomed-in plot. Finishing with the adjustments (and pressing ``s`` in the plot window to save the current settings) results in the plot shown in :numref:`fig:multipart3b`. .. figure:: figs/multipart4.png :alt: multi-panelled figure tutorial part 2b :name: fig:multipart3b :width: 50.0% zooming in and adjusting the colour bar Surface rendering ----------------- Here I will give an example of how to use the 3D surface rendering feature starting with a dump file kindly supplied by Giuseppe Lodato from an SPH simulation of a warped accretion disc. First we read the file: :: dprice$ splash warp001 after which we reach the main menu: :: You may choose from a delectable sample of plots ------------------------------------------------------- 1) x 6) density 2) y 7) v\dx 3) z 8) v\dy 4) particle mass 9) v\dz 5) h ------------------------------------------------------- 10) multiplot [ 4 ] m) set multiplot ------------------------------------------------------- d(ata) p(age) o(pts) l(imits) le(g)end h(elp) r(ender) v(ector) x(sec/rotate) s,S(ave) q(uit) ------------------------------------------------------- Please enter your selection now (y axis or option): Firstly we want to plot just a simple render plot of density. Thus we choose: :: Please enter your selection now (y axis or option):2 (x axis) (default=1): (render) (0=none) ([0:9], default=0):6 (vector plot) (0=none, 7=v) ([0:7], default=0): Graphics device/type (? to see list, default /xwin): /xw producing the plot shown in :numref:`fig:surfpart1` (I have used ``/png`` instead of ``/xw`` to produce the figures for the userguide). .. figure:: figs/surfpart1.png :alt: surface rendering tutorial part 1 :name: fig:surfpart1 :width: 50.0% First stage in the surface rendering tutorial: a simple render plot of density Moving the cursor over the colour bar and pressing ``l`` to log the colour bar axis produces :numref:`fig:surfpart1b`. .. figure:: figs/surfpart2.png :alt: surface rendering tutorial part 1b :name: fig:surfpart1b :width: 50.0% with a log axis after having placed cursor over colour bar and pressed ``l`` The next step is to adjust the viewing angle. Pressing ``h`` in the plot window brings up the list of keystrokes which can be used to change the angle. Here we want to add a rotation about the :math:`x-` axis, so we press ``{`` three times to change the x angle by -90 degrees and then press ``[`` once to increment the angle by a further -15 degrees. The splash output in the terminal reads, amongst other things: :: rotating particles about z by 0.00 rotating particles about y by 0.00 rotating particles about x by 255.00 Then we obtain :numref:`fig:surfpart2`. .. figure:: figs/surfpart3.png :alt: surface rendering tutorial part 2 :name: fig:surfpart2 :width: 50.0% Second stage in the surface rendering tutorial: after adjusting the rotation angle Next, we need to turn the 3D surface rendering on. This cannot be done in interactive mode so we need to exit – pressing ``s`` first to save what we have done so far, then ``q`` to quit interactive mode. Then, back at the splash main menu, we type x4 for the :ref:`sec:menu-x`, option 4 which is “3D surface rendering on/off†with prompts appearing as follows: :: Please enter your selection now (y axis or option):x4 ---------- cross section / 3D plotting options -------- Use 3D opacity rendering? (default=yes):y Now we replot the original plot with the new settings as follows: :: Please enter your selection now (y axis or option):2 (x axis) (default=1): (render) (0=none) ([0:9], default=6): (vector plot) (0=none, 7=v) ([0:7], default=0): enter z coordinate of observer (default=53.58): enter distance between observer and projection screen ([0.000:], default=5.358): using current h and pmass limits to calculate kappa (cross section/unit mass) min h = 0.1197254 min particle mass = 3.812551E-11 [ kappa = pi*h_min**2/(particle_mass*n_smoothing_lengths) ] enter approximate surface depth (number of smoothing lengths): ([0.000:], default=2.000): kappa (particle cross section per unit mass) = 1.2369025E+9 Graphics device/type (? to see list, default /xwin): Note that several new prompts appear – for the moment I have just used the default answers by pressing return. The first result is rather frightening : just a black image with a black colour bar! This is because the limits we set for column density are several orders of magnitude away from the limits on density. Moving the cursor over the colour bar and pressing ``a`` to adapt the limits produces the plot shown in :numref:`fig:surfpart2b`. .. figure:: figs/surfpart4.png :alt: surface rendering tutorial part 2b :name: fig:surfpart2b :width: 50.0% With 3D surface rendering turned on (which also turns on 3D perspective) and having adjusted the colour bar limits Note that the plot suddenly appears much smaller – this is a consequence of the 3D perspective settings. Moving the cursor into the plot window and pressing ``a`` adapts the plot limits. After also clicking on the colour bar and adjusting the colour bar limits, we arrive at the plot shown in :numref:`fig:surfpart3`. .. figure:: figs/surfpart5.png :alt: surface rendering tutorial part 3 :name: fig:surfpart3 :width: 50.0% Third stage in the surface rendering tutorial: after adjusting the xy and colour bar limits interactively Now that we are nearly there, to add the finishing touches we need to i) increase the number of pixels in the image and ii) turn the axes off, since they are no longer meaningful with 3D perspective set. The number of pixels can be increased by returning to the splash main menu (pressing ``s`` in interactive mode before doing so to save what we have done so far), then typing ``r1`` for :ref:`sec:menu-r`, option 1: :: Please enter your selection now (y axis or option):r1 ----------------- rendering options ------------------- enter number of pixels along x axis ([1:10000], default=200):1000 Next, we turn the axes off using the :ref:`sec:menu-p`: :: Please enter your selection now (y axis or option):p2 ---------------- page setup options ------------------- -4 : draw box and major tick marks only; -3 : draw box and tick marks (major and minor) only; -2 : draw no box, axes or labels; -1 : draw box only; 0 : draw box and label it with coordinates; 1 : same as AXIS=0, but also draw the coordinate axes (X=0, Y=0); 2 : same as AXIS=1, but also draw grid lines at major increments of the coordinates; 10 : draw box and label X-axis logarithmically; 20 : draw box and label Y-axis logarithmically; 30 : draw box and label both axes logarithmically. enter axis option ([-4:30], default=0):-2 axis = -2 Plotting the same plot again now results in the plot shown in :numref:`fig:surfpart3b`. .. figure:: figs/surfpart6.png :alt: surface rendering tutorial part 3b :name: fig:surfpart3b :width: 50.0% and increasing the number of pixels and having turned the axes off Finally we will also set the background colour to black, adjust the opacity and move the time legend. Notice that in :numref:`fig:surfpart3b` the surface looks blotchy. This is an indication that the surface is too shallow (that is we are only seeing particles on the very top). Thus we will adjust the opacity for a slightly deeper plot. We proceed as follows: Exiting interactive mode (pressing ``s`` then ``q`` in the plot window), we first set the foreground and background colours in the :ref:`sec:menu-p`: :: Please enter your selection now (y axis or option):p8 ---------------- page setup options ------------------- Enter background colour (by name, e.g. "black") (default=):black Enter foreground colour (by name, e.g. "white") (default=):white Do you want to plot axes and overlaid text in background colour (default is foreground) ? (default=no): Now, replotting the same plot again, but this time adjusting the opacity at the prompt: :: enter approximate surface depth (number of smoothing lengths): ([0.000:], default=2.000):200.0 Finally, moving the time legend by positioning the cursor and pressing ’G’ and zooming out slightly by pressing ``-`` once, we arrive at our finished figure (or movie frame) shown in :numref:`fig:surfpartfinal`. Pressing ``s`` in interactive mode saves the settings, then pressing ``q`` returns to the splash main menu. To :ref:`sec:menu-s` to disk, press ``S`` from the main menu to save both the ``splash.defaults`` file and the ``splash.limits`` file. .. figure:: figs/surfpartfinal.png :alt: Finished surface-rendered plot :name: fig:surfpartfinal :width: 50.0% Finished surface-rendered plot To create a sequence of images with these settings, then simply invoke splash again with multiple files: :: splash warp??? then plotting the same plot as previously to a non-interactive device will cycle through all dump files producing a sequence of plots with names like ``splash_0000.png``, ``splash_0001.png`` etc. These can be easily converted into an animation. .. _sec:evsplash: Using splash to plot energy vs time plots ------------------------------------------ splash can be used for all kinds of data. For example I often use it to plot the contents of the .ev file my SPH code dumps monitoring quantities like energy and angular momentum at every timestep. A shortcut way of setting options appropriate to reading such files (e.g. plotting lines instead of dots, plotting all files on the same page) is implemented by adding the “-ev†option to the command line: e.g. :: splash -ev file1.ev file2.ev file3.ev also, using the -ev option on the command line means that any modification to the preset options /limits are saved to files called ``evsplash.defaults`` and ``evsplash.limits`` instead of the usual ``splash.defaults`` and ``splash.limits``. This means the defaults for this type of plot are saved separately to those for “normal†plots of SPH data. For other command line options, see :ref:`sec:commandline`. .. _sec:surfdens: Plotting azimuthally-averaged disc surface density and Toomre Q parameter ------------------------------------------------------------------------- For analysis of accretion disc simulations, it is useful to make azimuthally averaged plots of the disc properties such as the surface density and, for self-gravitating discs, the Toomre Q parameter. Extra columns appear to plot both of these quantities when the simulation is 3D and the coordinate system is changed to cylindrical or spherical co-ordinates (in the :ref:`sec:menu-o` – see :ref:`sec:geom`). For the Toomre Q parameter to appear it is also necessary to have read the thermal energy from the dump file. For example, having read a dump file, change the coordinate system to cylindricals: :: Please enter your selection now (y axis or option):o7 ------------- particle plot options ------------------- 0) reset (= 1) 1) cartesian x,y,z 2) cylindrical r,phi,z 3) spherical r,phi,theta 4) toroidal r,theta,phi Enter coordinate system to plot in: ([0:4], default=1):2 then extra columns appear in the menu: :: You may choose from a delectable sample of plots ------------------------------------------------------- 1) r 13) u 2) phi 14) grad h 3) z 15) grad soft ... ... 11) v\dphi 23) Surface density 12) v\dz 24) Toomre Q parameter ------------------------------------------------------- Then (in this example), select column 23 to plot surface density, :: Please enter your selection now (y axis or option):23 setting x axis to r for surface density plot ...and the plot will appear - an example surface density plot is shown in :numref:`fig:surfdens`. .. figure:: figs/surfdens.pdf :alt: Azimuthally averaged surface density :name: fig:surfdens :width: 50.0% Plot of azimuthally averaged surface density in a 3D accretion disk simulation Azimuthally averaged quantities are calculated by binning the particles into a fixed number of annuli in radius. The mean surface density is calculated using .. math:: \Sigma(r_{ann}) = \frac{M_{ann}}{\pi [(r_{ann} + 0.5\Delta r)^{2} - (r_{ann} - 0.5\Delta r)^{2}]}, that is, the total mass in the annulus (sum of the particle masses) divided by its area, where :math:`r_{ann}` is the radius (cylindrical or spherical) of the annulus. The Toomre Q parameter, defined as .. math:: Q_{Toomre}(r) = \frac{\bar{c}_{s}(r)\kappa(r)}{\pi \Sigma(r)}, where :math:`\kappa` is the epicyclic frequency and :math:`\bar{c}_{s}` is the RMS sound speed, is calculated using the above surface density, assuming a Keplerian rotation profile and a central star mass of unity (i.e., :math:`\kappa(r) = \Omega(r)`, where :math:`\Omega(r) = r^{-3/2}`). The sound speed for each particle :math:`i` is calculated from the stored thermal energy and :math:`\gamma` (ratio of specific heats) according to .. math:: c_{s,i}^{2} = \left\{ \begin{array}{ll} \frac23 u_{i}, & \gamma = 1; \\ (\gamma-1)\gamma u_i, & \gamma \neq 1; \end{array}\right. from which the RMS sound speed is calculated as the square root of the average of :math:`c_{s}^{2}` on the particles in the annulus. danieljprice-splash-4d1f09c/docs/basic.rst000066400000000000000000000515441477365367100206460ustar00rootroot00000000000000.. _sec:basic: Basic splash usage ================== Simple two column plot ---------------------- Once you have successfully compiled splash with a read data file that will read your data format, splash is invoked with the name of the data file(s) on the command line, e.g. :: splash myrun*.dat | where splash should be replaced with `splash -f gadget`, `splash -f magma` etc. depending on the data format. | After a successful data read, the menu should appear as something like the following (the example given is for a “minidump†from Stephan Rosswog’s SPH code, MAGMA): :: dprice$ splash -magma minidump.00001 :: _ _ (_) _ _ _ _ (_)_ _ (_) ___ _ __ | | __ _ ___| |__ (_) _ (_) _ (_) _ / __| '_ \| |/ _` / __| '_ \ _ (_) (_) _ (_) \__ \ |_) | | (_| \__ \ | | | _ (_) _ (_) _ |___/ .__/|_|\__,_|___/_| |_| (_) _ (_) (_) (_)|_| (_) (_) (_)(_) (_)(_) (_)(_) ( B | y ) ( D | a | n | i | e | l ) ( P | r | i | c | e ) ...etc... :: You may choose from a delectable sample of plots ------------------------------------------------------- 1) x 7) particle mass 2) y 8) B\dx 3) z 9) B\dy 4) h 10) B\dz 5) \gr 11) div B 6) T ------------------------------------------------------- 12) multiplot [ 4 ] m) set multiplot ------------------------------------------------------- d(ata) p(age) o(pts) l(imits) le(g)end h(elp) r(ender) v(ector) x(sec/rotate) s(ave) q(uit) ------------------------------------------------------- Please enter your selection now (y axis or option): The simplest plot is of two quantities which are not both coordinates. For example, to plot density vs smoothing length, type :: Please enter your selection now (y axis or option): 5 (x axis) (default=1): 4 Graphics device/type (? to see list, default /xwin): /xw The ``default=`` refers to the default value assigned if you just press the return key. The last prompt asks for the device to which output should be directed. .. hint:: A full list of available graphics devices is given by typing ``?`` at the prompt. Some of the most useful devices are given in :ref:`tab:devices`. In the above we have selected the X-window driver which means that the output is sent to the screen (provided X-windows is running), as demonstrated in the screenshot shown in :numref:`fig:rhoh`. .. figure:: figs/rhoh.jpg :alt: Screenshot of simple two column plot to an X-window :name: fig:rhoh :width: 80.0% Screenshot of simple two column plot to an X-window .. table:: Commonly used graphics devices available in giza :name: tab:devices +-----------------+-----------------+-----------------+-----------------+ | ``/xw``, | X-Window | ``/png`` | Portable | | ``/xwin`` | (interactive) | | Network | | | | | Graphics | | | | | (bitmap) | +-----------------+-----------------+-----------------+-----------------+ | ``/eps`` | Encapsulated | ``/svg`` | Scalable Vector | | | postscript (one | | Graphics | | | file per page) | | | +-----------------+-----------------+-----------------+-----------------+ | ``/pdf`` | PDF | ``/null`` | null device (no | | | | | output) | +-----------------+-----------------+-----------------+-----------------+ | ``/ps`` | Postscript (all | | | | | pages in one | | | | | file) | | | +-----------------+-----------------+-----------------+-----------------+ .. _sec:interactive: Interactive mode ----------------- Many useful tasks can now be achieved by moving the mouse to the plot window and selecting areas or pressing keystrokes – this is :ref:`sec:interactive`. Most useful are: - press ``l`` with the mouse over the colour bar for a *log axis* - ``a`` to *adapt the plot limits* (with mouse on the colour bar, inside the plot, or positioned next to the x or y axes) - ``left click`` to *select an area* with the mouse and ``click`` to *zoom* - ``left click`` on the colour bar to *change the rendering limits* - ``space`` to *skip to the next file* (``right click`` or ``b`` to go back) - ``-`` or ``+`` to *zoom in* or *out* - ``Enter`` for :ref:`sec:hollywood` - ``o`` to *recentre the plot* on the origin - ``r`` to *refresh* the plot (e.g. after changing the window size) - ``g`` to *plot a line and find its gradient* - ``m`` or ``M`` to *change the colour map* - ``f`` to *flip the rendering* to the next quantity - ``<``, ``>``, ``{``, ``}`` and ``/``, ``\`` to *rotate particles* around *z*, *y* and *x axes*, respectively - ``G`` to *move the legend* - ``ctrl-t`` to *annotate with text* - ``backspace`` to delete annotation - ``s`` in the plot window to *save changes* between timesteps, otherwise the settings will revert when you move to the next timestep. - ``q`` in the plot window to *quit the plotting window* and return to the menu - ``q`` again from the splash main menu to *quit splash altogether*. - ``h`` in the plot window for the full list of commands On particle plots you can additionally: - select an area and press ``0``-``9`` to *colour particles* (particle colours stick between plots, so you can use this to find particles with unusual parameters) - select an area and press ``0`` to *hide selected particles* - move the mouse over a particle and press ``c`` to see the size of the *smoothing circle* for that particle These tasks can also be achieved non-interactively by a series of text-based :ref:`sec:menu` (see :ref:`sec:settings`). For example limits changing options are contained in the :ref:`sec:menu-l`, so to manually set plot limits we would type ``l`` from the main menu, then ``2`` for option 2 (set manual limits) and follow the prompts to set the limits for a particular data column. See also :ref:`sec:menu-i`. .. _sec:renderplot: Rendered plots -------------- A more complicated plot is where both the :math:`x-` and :math:`y-` axes refer to coordinates. For example :: Please enter your selection now (y axis or option):2 (x axis) (default=1): 1 (render) (0=none) ([0:11], default=0):5 (vector plot) (0=none, 8=B) ([0:8], default=0):0 Graphics device/type (? to see list, default /xwin): /xw You can produce the same graph without answering prompts using:: splash -y 2 -x 1 -r 5 -dev /xw minidump.00001 or, since the other options are default anyway, simply:: splash -r 5 minidump.00001 Notice that in this case that options appeared for rendered and vector plots. Our choice of ``5`` at the (render) prompt corresponds to column 5, which in this case is the density, producing the plot shown in the screenshot in :numref:`fig:renderplot`. .. figure:: figs/renderplot.jpg :alt: Screenshot of 3D column density plot to an X-window :name: fig:renderplot :width: 80.0% Screenshot of 3D column density plot to an X-window .. important:: Rendered plots only work if columns for density, particle mass and smoothing length are correctly identified in the data, and provided the number of coordinates is 2 or greater. Without these, rendering will just colour the points according to the selected column. See :ref:`sec:writeyourown` for internal details. .. _sec:xsec: Cross section -------------- To plot a cross section slice instead of a projection in 3D, simply use ``--xsec`` flag on the command line:: splash --xsec -r 5 minidump.00001 Or, type ``x`` at the main menu to open the :ref:`sec:menu-x` and choose option ``1) switch between cross section and projection``. Then re-plot the rendered plot again (exactly as in the previous example :ref:`sec:renderplot`), setting the slice position at the prompt: :: enter z position for cross-section slice: ([-8.328:8.327], default=0.000): which produces the plot shown in the screenshot in :numref:`fig:renderplot_xsec` .. figure:: figs/renderplot_xsec.jpg :alt: Screenshot of 3D cross section slice plot to an X-window :name: fig:renderplot_xsec :width: 80.0% Screenshot of 3D :ref:`sec:xsec` slice plot to an X-window .. _sec:vectorplots: Vector plots ------------ A prompt to plot vector arrows on top of :ref:`sec:renderplot` (or on top of particle plots) appears whenever vectors are present in the data (for details of how to specify this in your data read, see :ref:`sec:writeyourown`), taking the form: :: (vector plot) (0=none, 8=B) ([0:8], default=0):0 where the number refers to the column of the first component of the vector quantity. Vector plots in 3D show either the integral of each component along the line of sight or, for a :ref:`sec:xsec`, the vector arrows in a :ref:`sec:xsec` slice (depending on whether a projection or :ref:`sec:xsec` has been selected for 3D plots – see the rendering examples given previously). In 2D vector plots simply show the vector arrows mapped to a pixel array using the SPH kernel. Settings related to vector plots can be changed via :ref:`sec:menu-v`. The size of the arrows is set by the maximum plot limit over all of the vector components. Alternatively the arrow size can be changed interactively using ``v``, ``V`` (*decrease /increase the arrow size*) and ``w`` (*automatically adjust arrow size so longest arrow is one pixel width*). Contour plots ------------- To plot contours of a quantity instead of :ref:`sec:renderplot`, simply set the colour scheme used for rendering to 0 (contours only) via the “change colour scheme†option in the :ref:`sec:menu-r` (type “r2†from the main menu as a shortcut to option 2 in the :ref:`sec:menu-r`). Contours of an additional quantity can also be plotted on top of :ref:`sec:renderplot`. However the prompt for an additional contour plot does not appear by default – it can be turned on via the ``plot contours`` option in the :ref:`sec:menu-r` (type ``r3`` at the main menu as a shortcut). With this option set *and a non-zero response to the render prompt*, a prompt appears below the render prompt: :: (render) (0=none) ([0:11], default=0):5 (contours) (0=none) ([0:11], default=0):6 Entering the column to use in the contour plot at this prompt (e.g. column 6 in the above example would correspond to the temperature) gives a rendered plot with overlaid contours. Entering the same quantity used in the rendering at this prompt (e.g. column 5 in the above example) triggers a subsequent prompt for the contour limits which can then be set differently to those used in the render plot. In this way it is possible to make a plot where the density of one particle type is shown by the rendered plot and the density of another particle type (with different limits) is shown by contours. This can be achieved because once contour plotting is turned on, the contribution of a given particle type to either the contours or rendered plots can be turned on or off via the ``turn on/off particles by type`` option in the :ref:`sec:menu-o`. Moving forwards and backwards through data files ------------------------------------------------ See :ref:`sec:interactive`. If you have put more than one file on the command line (or alternatively the file contains more than one dump), it is then possible to move forwards and backwards through the data: - press the ``space bar`` to move to the next file (with the cursor in the plot window - this is :ref:`sec:interactive`). - press ``b`` to load and plot the previous file - type `9` and press ``space`` to move forward by 9 files - type `10` and press ``b`` to move back by 10 files Press ``h`` in :ref:`sec:interactive` for more. .. important:: If you plot to a non-interactive device, splash simply cycles through all the files on the command line automatically. Zooming in and out / changing plot limits ----------------------------------------- See :ref:`sec:interactive`. Having plotted to an interactive device (e.g. ``/xw``), tasks such as zooming in and out, selecting, colouring and hiding particles, changing the limits of both the plot and the colour bar and many other things can be achieved using either the mouse (i.e., selecting an area on which to zoom in) or by a combination of the mouse and a keystroke. .. _sec:postscript: Producing figures for LaTeX documents -------------------------------------- Producing a pdf or postscript plot suitable for inclusion in a LaTeX file is simple. At the device prompt, type :: Graphics device/type (? to see list, default /xw): myfile.eps that is, instead of ``/xw`` (for an X-window), simply type ``/eps`` or ``.eps`` to use the encapsulated postscript driver. This produces a file which by default is called ``splash.eps``, or if multiple files have been read, a sequence of files called ``splash_0000.eps``, ``splash_0001.eps``, etc. To specify both the device and filename, type the full filename (e.g. ``myfile.eps``) as the device. Files produced in this way can be directly incorporated into LaTeX using standard packages. .. danger:: Do **not** use the ``/png`` driver to produce files for LaTeX documents. Your axes will appear pixellated and blurred. Use a vector graphics device (eps or pdf) instead. These give clean, sharp and infinitely scalable text and lines. .. hint:: Using ``eps`` format is recommended for LaTeX as it will always crop to the exact boundaries of the plot. The inbuilt ``pdf`` driver may require cropping of whitespace. Encapsulated postscript can be easily converted to pdf (for pdflatex) on the command line using:: epstopdf file.eps Most pdflatex engines (including `Overleaf `_) will handle/convert eps automatically. .. _sec:movies: Producing a movie of your simulation ------------------------------------- To make a movie of your simulation, first specify all of the files you want to use on the command line: :: splash dump_* and use an interactive device to adjust options until it looks right. .. hint:: Movies look best with minimal annotation, e.g. using :ref:`sec:hollywood` or the backspace key in interactive mode to manually delete annotation If in interactive mode type ``s`` to save the current settings, then plot the same thing again but to a non-interactive device. In the latest version of splash you can generate an mp4 directly :: Graphics device/type (? to see list, default /xw): splash.mp4 In older splash versions, or for more control, first generate a sequence of png files :: Graphics device/type (? to see list, default /xw): /png This will generate a series of images named ``splash_0000.png``, ``splash_0001.png``, ``splash_0002.png`` corresponding to each new plotting page generated (or enter “``myfile.png``†at the device prompt to generate ``myfile_0000.png``, ``myfile_0001.png``, ``myfile_0002.png``\ …). .. hint:: Avoid prompts altogether using the :ref:`sec:commandline`. For example, to make a movie as per the prompts above, simply type:: splash -r 5 --movie dump_* which is a shortcut for:: splash -r 5 -dev splash.mp4 dump_* To produce a sequence of images from the command line, use :: splash -r 5 -dev /png See also :ref:`sec:batchmode`. .. _sec:animations: Producing a movie from a sequence of images -------------------------------------------- Having obtained a sequence of images there are a variety of ways to make these into an animation using both free and commercial software. The simplest is to use `ffmpeg `_:: ffmpeg -i splash_%04d.png -r 10 -vb 50M -bt 100M -pix_fmt yuv420p -vf setpts=4.*PTS movie.mp4 A simple script which executes the above command is included in the source file distribution :: ~/splash/scripts/movie.sh Alternatively, it is possible to create an animation from a list of image files:: ffmpeg -f concat -r 25 -i list.txt -vb 50M -bt 100M -vcodec mpeg4 -vf setpts=4.*PTS movie.mp4 Where list.txt contains the image files you want to use like this:: file 'path/to/file1.png' file 'path/to/file2.png' etc See :ref:`sec:moviemaking` for more. .. _sec:hollywood: Hollywood mode --------------- Press ``Enter`` or ``ctrl-m`` in the interactive plot window to start ``Hollywood mode``, which changes to plot settings better suited to movies. The following shows :ref:`fig:default`: .. figure:: figs/default-mode.png :name: fig:default :width: 80.0% A circumbinary disc simulation viewed in default mode and :ref:`fig:hollywood` .. figure:: figs/hollywood-mode.png :name: fig:hollywood :width: 100.0% The same simulation viewed in Hollywood mode .. _sec:remote: Remote visualisation -------------------- Visualisation of data in-situ on a cluster or supercomputer is simple. Just log in using ssh with X-windows forwarding, e.g.:: ssh -Y dprice@gadi.nci.org.au Then just plot to an interactive device (``/xw``) as usual and everything in :ref:`sec:interactive` should *just work*. splash has few dependencies and is simple to :ref:`install in your home space ` if necessary. That said, it is always a good idea to get admins to install a shared package for all users. Ten quick hints for producing good-looking plots ------------------------------------------------ These can improve the look of a visualisation substantially compared to the default options: #. **Log the colour bar**. To do this simply move the cursor over the colour bar and hit ``l`` (for log) in :ref:`sec:interactive`. Or non-interactively via the ``apply log or inverse transformations to columns`` option in the :ref:`sec:menu-l`. #. **Adjust the colour bar limits**. Position the mouse over the colour bar and left-click in :ref:`sec:interactive`. To revert to the widest max/min possible for the data plotted, press ``a`` with the cursor positioned over the colour bar. Limits can also be set manually in the :ref:`sec:menu-l`. #. **Change the colour scheme**. Press ``m`` or ``M`` in :ref:`sec:interactive` to cycle forwards or backwards through the available colour schemes. #. **Change the paper size**. To produce high-resolution images/movies, use the ``change paper size`` option in the :ref:`sec:menu-p` to set the paper size in pixels. #. **Try normalised or exact interpolation**. If your simulation does *not* involve free surfaces (or alternatively if the free surfaces are not visible in the figure), turning the ``normalise interpolations`` option on (in the :ref:`sec:menu-r`) may improve the smoothness of the rendering. This is turned off by default because it leads to funny-looking edges. Exact rendering performs exact sub-pixel rendering so is more accurate but slower. #. **Remove annotation/axes**. For movies, often axes are unnecessary and detract from the visual appeal. Use :ref:`sec:hollywood` or delete annotation by pressing backspace in :ref:`sec:interactive`. Alternatively each can be turned off manually – axes via the ``axes options`` option in the :ref:`sec:menu-p`; the colour bar by the ``colour bar options`` entry in the :ref:`sec:menu-r` and the legends via options in the :ref:`sec:menu-g`. #. **Change axes/page colours**. The background colour (colour of the page) and foreground colour (used for axes etc) can be changed vie the ``set foreground/background colours`` option in the :ref:`sec:menu-p`. #. **Move the legend or turn it off**. The time legend can be moved by positioning the mouse and pressing ``G`` in interactive mode. The legend can be turned off in the :ref:`sec:menu-g` or by pressing backspace in interactive mode. Similarly the vector plot legend can be turned on/off in the :ref:`sec:menu-v` and moved by positioning the cursor and pressing ``H``. #. **Use physical units on the axes**. These can be set via the :ref:`sec:menu-d`. See :ref:`sec:changingunits` for more details. #. **Save settings to disk**! Don’t waste your effort without being able to reproduce the plot you have been working on. Pressing ``s`` in interactive mode only saves the current settings for subsequent timesteps. Pressing ``s`` from the main menu saves these settings to disk. Pressing ``S`` from the main menu saves both the plot options *and* the plot limits, so that the current plot can be reproduced exactly when splash is next invoked. Adding an ``a``, as in ``SA``, ``Sa`` or ``sa`` to the save options gives a prompt for a different prefix to the filenames (e.g. ``splash.defaults`` becomes ``myplot.defaults``), which splash can be invoked to use via the ``-p`` command line option (e.g. ``splash -p myplot file1 file2...``). danieljprice-splash-4d1f09c/docs/bibstyle.bst000077500000000000000000000506501477365367100213620ustar00rootroot00000000000000% This style produces citations in the `author-year' format. % It supports two forms of citation: the \cite command produces: (Author, year) % in the text; the \cite* command only: (year) . ENTRY { address author booktitle chapter edition editor howpublished institution journal key note number organization pages publisher school series title type volume year } {} { label extra.label sort.label } INTEGERS { output.state before.all mid.sentence after.sentence after.block after.colon } FUNCTION {init.state.consts} { #0 'before.all := #1 'mid.sentence := #2 'after.sentence := #3 'after.block := #4 'after.colon := } STRINGS { s t } FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { output.state after.colon = 'write$ { add.period$ " " * write$ } if$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output.nonnull.extra} { 's := output.state mid.sentence = { " " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { output.state after.colon = 'write$ { add.period$ " " * write$ } if$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.extra} { duplicate$ empty$ 'pop$ 'output.nonnull.extra if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {output.check.extra} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull.extra if$ } FUNCTION {output.year.check} { year empty$ { "empty year in " cite$ * warning$ } { write$ ": " year * extra.label * mid.sentence 'output.state := } if$ } FUNCTION {output.bibitem} { newline$ "\bibitem[" write$ label write$ "]{" write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := } FUNCTION {fin.entry} { add.period$ write$ newline$ } FUNCTION {new.block} { output.state before.all = 'skip$ { after.block 'output.state := } if$ } FUNCTION {new.sentence} { output.state after.block = 'skip$ { output.state before.all = 'skip$ { after.sentence 'output.state := } if$ } if$ } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {boldface} { duplicate$ empty$ { pop$ "" } { "{\bf " swap$ * "}" * } if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "{\em " swap$ * "}" * } if$ } INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 's := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { nameptr #1 > { s nameptr "{f. }{vv~}{ll}{, jj}" format.name$ 't := } { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := } if$ nameptr #1 > { namesleft #1 > { ", " * t * } { numnames #2 > { "," * } 'skip$ if$ t "others" = { " et~al." * } { " and " * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {format.ed.names} { 's := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { nameptr #1 > { s nameptr "{f. }{vv~}{ll}{, jj}" format.name$ 't := } { s nameptr "{f. }{vv~}{ll}{, jj}" format.name$ 't := } if$ nameptr #1 > { namesleft #1 > { ", " * t * } { numnames #2 > { "," * } 'skip$ if$ t "others" = { " et~al." * } { " and " * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {format.authors} { author empty$ { "" } { author format.names } if$ } FUNCTION {format.key} { empty$ { key field.or.null } { "" } if$ } FUNCTION {format.editors} { editor empty$ { "" } { editor format.names editor num.names$ #1 > { " (eds.)" * } { " (ed.)" * } if$ } if$ } FUNCTION {format.editors.extra} { editor empty$ { "" } { editor format.ed.names editor num.names$ #1 > { " (eds.)" * } { " (ed.)" * } if$ } if$ } FUNCTION {format.title} { title empty$ { "" } { "`" title "'" * * } if$ } FUNCTION {n.dashify} { 't := "" { t empty$ not } { t #1 #1 substring$ "-" = { t #1 #2 substring$ "--" = not { "--" * t #2 global.max$ substring$ 't := } { { t #1 #1 substring$ "-" = } { "-" * t #2 global.max$ substring$ 't := } while$ } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } if$ } while$ } FUNCTION {first.page.number} { 't := "" { t "" = { #0 } { t #1 #1 substring$ "-" = not } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } while$ } FUNCTION {format.btitle} { title emphasize } FUNCTION {tie.or.space.connect} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ * * } FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } FUNCTION {format.bvolume} { volume empty$ { "" } { "Vol." volume tie.or.space.connect series empty$ 'skip$ { " of " * series emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { output.state mid.sentence = { "No." } { "No." } if$ number tie.or.space.connect series empty$ { "there's a number but no series in " cite$ * warning$ } { " in " * series * } if$ } if$ } { "" } if$ } FUNCTION {format.edition} { edition empty$ { "" } { output.state mid.sentence = { edition "l" change.case$ " edition" * } { edition "t" change.case$ " edition" * } if$ } if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 't := #0 'multiresult := { multiresult not t empty$ not and } { t #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { t #2 global.max$ substring$ 't := } if$ } while$ multiresult } FUNCTION {format.pages} { pages empty$ { "" } { pages multi.page.check { "pp." pages n.dashify tie.or.space.connect } { "p." pages tie.or.space.connect } if$ } if$ } FUNCTION {format.page} { pages empty$ { "" } { "p.~" pages first.page.number * } if$ } FUNCTION {format.vol.num.pages} { volume field.or.null volume empty$ 'skip$ { boldface } if$ number empty$ 'skip$ { "(" number * ")" * * volume empty$ { "there's a number but no volume in " cite$ * warning$ } 'skip$ if$ } if$ pages empty$ 'skip$ { duplicate$ empty$ { pop$ format.pages } { ", " * pages n.dashify * } if$ } if$ } FUNCTION {format.vol.num.page} { volume field.or.null volume empty$ 'skip$ { boldface } if$ number empty$ 'skip$ { "(" number * ")" * * volume empty$ { "there's a number but no volume in " cite$ * warning$ } 'skip$ if$ } if$ pages empty$ 'skip$ { duplicate$ empty$ { pop$ format.pages } { ", " * pages first.page.number * } if$ } if$ } FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ { "Chapt." } { type "l" change.case$ } if$ chapter tie.or.space.connect pages empty$ 'skip$ { ", " * format.pages * } if$ } if$ } FUNCTION {format.in.ed.booktitle} { booktitle empty$ { "" } { editor empty$ { "In: " booktitle emphasize * } { "In: " format.editors.extra * ": " * booktitle emphasize * } if$ } if$ } FUNCTION {format.in.booktitle.or.series} { booktitle empty$ { series empty$ { "" } { "In: " series emphasize * } if$ } { editor empty$ { "In: " booktitle emphasize * } { "In: " format.editors.extra * ": " * booktitle emphasize * } if$ } if$ } FUNCTION {format.thesis.type} { type empty$ 'skip$ { pop$ type "t" change.case$ } if$ } FUNCTION {format.tr.number} { type empty$ { "Technical Report" } 'type if$ number empty$ { "t" change.case$ } { number tie.or.space.connect } if$ } FUNCTION {format.article.crossref} { "In" " \cite{" * crossref * "}" * } FUNCTION {format.book.crossref} { volume empty$ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ "In " } { "Vol." volume tie.or.space.connect " of " * } if$ "\cite{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} { "In" " \cite{" * crossref * "}" * } FUNCTION {article} { output.bibitem format.authors "author" output.check author format.key output output.year.check format.title "title" output.check new.block crossref missing$ { journal emphasize "journal" output.check.extra format.vol.num.pages output.extra } { format.article.crossref output.nonnull format.pages output } if$ new.block note output fin.entry } FUNCTION {book} { output.bibitem author empty$ { format.editors "author and editor" output.check editor format.key output } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ output.year.check format.btitle "title" output.check crossref missing$ { format.bvolume output format.number.series output new.block address empty$ 'skip$ { address ": " * output after.colon 'output.state := } if$ publisher "publisher" output.check.extra } { new.block format.book.crossref output.nonnull } if$ format.edition output new.block note output fin.entry } FUNCTION {booklet} { output.bibitem format.authors output author format.key output output.year.check format.btitle "title" output.check new.block howpublished output address output new.block note output fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { format.editors "author and editor" output.check editor format.key output } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ output.year.check format.btitle "title" output.check crossref missing$ { format.bvolume output format.chapter.pages "chapter and pages" output.check format.number.series output new.block address empty$ 'skip$ { address ": " * output after.colon 'output.state := } if$ publisher "publisher" output.check.extra } { format.chapter.pages "chapter and pages" output.check new.block format.book.crossref output.nonnull } if$ format.edition output new.block note output fin.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check author format.key output output.year.check format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output new.block address empty$ 'skip$ { address ": " * output after.colon 'output.state := } if$ publisher "publisher" output.check.extra format.edition output format.chapter.pages output } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ new.block note output fin.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check author format.key output output.year.check format.title "title" output.check new.block crossref missing$ { format.in.booktitle.or.series "booktitle or series" output.check format.bvolume output new.sentence address output format.pages output } { format.incoll.inproc.crossref output.nonnull format.pages output } if$ publisher output new.block note output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem format.authors output author format.key output output.year.check format.title "title" output.check new.block organization output address output format.edition output new.block note output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check author format.key output output.year.check format.title "title" output.check new.block "Master's thesis" format.thesis.type output.nonnull school "school" output.check address output new.block note output fin.entry } FUNCTION {misc} { output.bibitem format.authors output author format.key output output.year.check format.title output new.block howpublished output new.block note output fin.entry } FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check author format.key output output.year.check format.title "title" output.check new.block "Ph.D. thesis" format.thesis.type output.nonnull school "school" output.check address output new.block note output fin.entry } FUNCTION {proceedings} { output.bibitem format.editors output editor format.key output output.year.check format.title "title" output.check format.bvolume output format.number.series output new.block address empty$ 'skip$ { address ": " * output after.colon 'output.state := } if$ organization output.extra publisher output new.block note output fin.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check author format.key output output.year.check format.title "title" output.check new.block format.tr.number output.nonnull institution "institution" output.check address output new.block note output fin.entry } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check author format.key output output.year.check format.title "title" output.check new.block note "note" output.check fin.entry } FUNCTION {default.type} { misc } MACRO {jan} {"Jan."} MACRO {feb} {"Feb."} MACRO {mar} {"Mar."} MACRO {apr} {"Apr,"} MACRO {may} {"May"} MACRO {jun} {"June"} MACRO {jul} {"July"} MACRO {aug} {"Aug."} MACRO {sep} {"Sept."} MACRO {oct} {"Oct."} MACRO {nov} {"Nov."} MACRO {dec} {"Dec."} READ FUNCTION {sortify} { purify$ "l" change.case$ } INTEGERS { len } FUNCTION {chop.word} { 's := 'len := s #1 len substring$ = { s len #1 + global.max$ substring$ } 's if$ } FUNCTION {format.lab.names} { 's := s #1 "{vv~}{ll}" format.name$ s num.names$ duplicate$ #2 > { pop$ " et~al." * } { #2 < 'skip$ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { " et~al." * } { " and " * s #2 "{vv~}{ll}" format.name$ * } if$ } if$ } if$ } FUNCTION {author.key.label} { author empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { author format.lab.names } if$ } FUNCTION {author.editor.key.label} { author empty$ { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.lab.names } if$ } { author format.lab.names } if$ } FUNCTION {editor.key.label} { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.lab.names } if$ } FUNCTION {calc.label} { type$ "book" = type$ "inbook" = or 'author.editor.key.label { type$ "proceedings" = 'editor.key.label 'author.key.label if$ } if$ "\protect\citeauthoryear{" swap$ * "}{" * year field.or.null purify$ #-1 #4 substring$ * 'label := } FUNCTION {sort.format.names} { 's := #1 'nameptr := "" s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { nameptr #1 > { " " * } 'skip$ if$ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := nameptr numnames = t "others" = and { "et al" * } { t sortify * } if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {sort.format.title} { 't := "A " #2 "An " #3 "The " #4 t chop.word chop.word chop.word sortify #1 global.max$ substring$ } FUNCTION {author.sort} { author empty$ { key empty$ { "to sort, need author or key in " cite$ * warning$ "" } { key sortify } if$ } { author sort.format.names } if$ } FUNCTION {author.editor.sort} { author empty$ { editor empty$ { key empty$ { "to sort, need author, editor, or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } { author sort.format.names } if$ } FUNCTION {editor.sort} { editor empty$ { key empty$ { "to sort, need editor or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } FUNCTION {presort} { calc.label label sortify " " * type$ "book" = type$ "inbook" = or 'author.editor.sort { type$ "proceedings" = 'editor.sort 'author.sort if$ } if$ #1 entry.max$ substring$ 'sort.label := sort.label * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {presort} SORT % by label, sort.label, title---for final label calculation STRINGS { last.label next.extra } INTEGERS { last.extra.num } FUNCTION {initialize.extra.label.stuff} { #0 int.to.chr$ 'last.label := "" 'next.extra := #0 'last.extra.num := } FUNCTION {forward.pass} { last.label label = { last.extra.num #1 + 'last.extra.num := last.extra.num int.to.chr$ 'extra.label := } { "a" chr.to.int$ 'last.extra.num := "" 'extra.label := label 'last.label := } if$ } FUNCTION {reverse.pass} { next.extra "b" = { "a" 'extra.label := } 'skip$ if$ label extra.label * "}" * 'label := extra.label 'next.extra := } EXECUTE {initialize.extra.label.stuff} ITERATE {forward.pass} REVERSE {reverse.pass} FUNCTION {bib.sort.order} { sort.label " " * year field.or.null sortify * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {bib.sort.order} SORT % by sort.label, year, title---giving final bibliography order FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}{}" write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} ITERATE {call.type$} FUNCTION {end.bib} { newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib} danieljprice-splash-4d1f09c/docs/conf.py000066400000000000000000000042701477365367100203240ustar00rootroot00000000000000# Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full # list see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Path setup -------------------------------------------------------------- # 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. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) import sphinx_rtd_theme # -- Project information ----------------------------------------------------- project = 'splash' copyright = '2004-2025 Daniel Price and contributors' author = 'Daniel Price' # The full version, including alpha/beta/rc tags release = 'v3.11.2' # -- 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_rtd_theme' ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The master toctree document. master_doc = 'index' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'sphinx_rtd_theme' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # -- Figure and equation numbering numfig = True math_numfig = True numfig_secnum_depth = 2 math_eqref_format = "Eq. {number}" def setup(app): app.add_css_file('css/custom.css') danieljprice-splash-4d1f09c/docs/contribs.rst000066400000000000000000000061001477365367100213740ustar00rootroot00000000000000 Contributing ============ Please contribute! All user contributions or suggestions are greatly appreciated. In particular, please send: - Bugs! (best way is to `file an issue `_) - `Feature requests/suggestions `_ - Pretty pictures for `the gallery `_. If you are \*really\* keen, you may also like to consider: - Exact solution routines for test problem(s). Even just an analytic description from which I can write the code. - Suggestions/tips on possible visualisation techniques - More colour schemes (simply email me a table of the rgb colour indices, or failing that simply an image of the colour scheme and I will add it). For discussion, feel free to `raise an issue on the tracker `_. Otherwise, you can send an email to the `mailing list `_ or `get in touch directly `_. Acknowledgements ================ Josh Calcino contributed significantly to development of the unified splash binary used in version 3. James Wetter led original development of the giza backend used in version 2 onwards. Several of the routines were developed from ideas used by Matthew Bate and splash has been refined by many useful discussions with Matthew. The polytrope exact solution is from a routine by Joe Monaghan. I am indebted to one Thomas S. Ullrich at the University of Heidelberg who wrote the prompting module which is used throughout the program and to Roland Schmehl who wrote the excellent function parser module (made available at http://fparser.sourceforge.net). Last but not least, a huge thanks especially to all the users who have given feedback which has helped to improve splash including, but not limited to: Stefan Adami, Craig Agnor, Richard Alexander, Gabe Altay, Pau Amaro-Seoane, Alessandro Atrani, Sumedh Anathpindika, Ben Ayliffe, Andreas Bauswein, Mark Bennett, Sergei Biriukov, David Brown, Florian Buerzle, Josh Calcino, Paul Cornwall, Jared Coughlin, Carlos Cuesta, Daniel Cunnama, Alan Duffy, Clare Dobbs, Carrie Elliot, Claude-Andr\'e Faucher-Gigu\`ere, Stefano Facchini, Juan Pablo Farias, Christoph Federrath, Laure Fouchet, Sergio Gelato, Thomas Grief, Doron Grossman, Jean-Fran\c{c}ois Gonzalez, Johnny Hitti, Mark Hutchison, Vid Ir\v{s}i\v{c}, John Jones, Sky King, Laura Kreidberg, Guillaume Laibe, Ben Lewis, David Liptai, Giuseppe Lodato, Hayley Macpherson, David Madlener, John Mansour, Ruben Martin, Daniel Mentiplay, Farzana Meru, Andrew McLeod, Nick Moeckel, Shazrene Mohamed, Rebecca Nealon, Chris Nixon, Alex Pettitt, Cody Raskin, John Regan, Sahl Rowther, Dave Rundle, Alison Sills, Kevin Sooley, Phil Sutton, Robert Thompson, St\'even Toupin, Terry Tricco, Yusuke Tsukamoto, Sigfried Vanaverbeke, Enrique Vazquez-Semadeni Antonio Vazquez, Tim Waters, James Wurster, Matt Young. And to everyone who has cited the splash paper! danieljprice-splash-4d1f09c/docs/exact.rst000066400000000000000000000166551477365367100206750ustar00rootroot00000000000000 .. _sec:exact: Exact solutions ================ splash contains a library of exact or analytic solutions to common test problems that have been used extensively in benchmarking codes (e.g. [PM04]_, [RP07]_, [Price12]_, [Price18]_). Errors ------ The error norms calculated when exact solutions are plotted are as follows: The error for each particle is given by .. math:: e_i = f_i - f_{exact}, where the exact solution :math:`f_{exact}(x)` is the solution returned from the exact solution subroutines (with resolution adjustable in the exact solution options menu option) interpolated to the position of the current particle :math:`x_i` via a simple linear interpolation. The absolute :math:`L_1` error norm is simply the average of the errors across the domain, calculated according to .. math:: \Vert e \Vert_{L_1} = \frac{1}{N f_{max}} \sum_{i=1}^N \vert e_i \vert, where :math:`f_{max}` is the maximum value of the exact solution in the region in which the particles lie (also only particles in the current plot are used) which is used to normalise the error estimate. A better error norm is the :math:`L_2` or *Root Mean Square* (RMS) norm given by .. math:: \Vert e \Vert_{L_2} = \left[\frac{1}{N} \left( \frac{1}{f_{max}^2} \sum_{i=1}^N \vert e_i \vert^2 \right)\right]^{1/2}. Finally the maximum error, or :math:`L_\infty` norm is calculated according to .. math:: \Vert e \Vert_{L_\infty} = \frac{1}{f_{max}} {\rm max}_i \vert e_i \vert. which is the most stringent error norm. The inset plot of the individual particle errors shows the fractional deviation for each particle given by .. math:: e_{i,frac} = (f_i - f_{exact}) / f_{exact}. Shock tubes (Riemann problem) ----------------------------- The subroutine ``exact_shock`` plots the exact solution for a one-dimensional shock tube (Riemann problem). The difficult bit of the problem is to determine the jump in pressure and velocity across the shock front given the initial left and right states. This is performed in a separate subroutine (riemannsolver) as there are many different methods by which this can be done (see e.g. [Toro92]_). The actual subroutine exact_shock reconstructs the shock profile (consisting of a rarefaction fan, contact discontinuity and shock, summarised in :numref:`fig:shocktube`), given the post-shock values of pressure and velocity. .. figure:: figs/sodshock.pdf :alt: exact solution for one-dimensional shock tube :name: fig:shocktube :width: 100.0% Example of exact solution for one-dimensional shock tube problem (red line) compared to the SPH solution (black line/particles), utilising the exact solutions incorporated in splash The speed at which the shock travels into the ‘right’ fluid can be computed from the post shock velocity using the relation .. math:: v_{shock} = v_{post}\frac{(\rho_{post}/\rho_R)}{(\rho_{post}/\rho_R)- 1}, where the jump conditions imply .. math:: \frac{\rho_{post}}{\rho_R} = \frac{(P_{post}/P_R) + \beta}{1 + \beta (P_{post}/P_R)} with .. math:: \beta = \frac{\gamma - 1}{\gamma + 1}. Riemann solver ~~~~~~~~~~~~~~~ The algorithm for determining the post-shock velocity and pressure is taken from [Toro92]_. Polytrope --------- The subroutine ``exact_polytrope`` computes the exact solution for a static polytrope with arbitrary :math:`\gamma`. From Poisson’s equation .. math:: \nabla^2 \phi = 4\pi G \rho, assuming only radial dependence this is given by .. math:: :label: eq_poissonsph \frac{1}{r^{2}} \frac{d}{dr} \left(r^{2} \frac{d\phi}{dr} \right) = 4\pi G \rho(r). The momentum equation assuming an equilibrium state (:math:`{\bf v} = 0`) and a polytropic equation of state :math:`P = K\rho^{\gamma}` gives .. math:: :label: eq_polyk \frac{d\phi}{dr} = - \frac{\gamma K}{\gamma-1}\frac{d}{dr} \left[\rho^{(\gamma -1)} \right] Combining (:eq:`eq_poissonsph`) and (:eq:`eq_polyk`) we obtain an equation for the density profile .. math:: :label: eq:dens \frac{\gamma K}{4\pi G (\gamma - 1)} \frac{1}{r^{2}} \frac{d}{dr} \left[r^{2} \frac{d}{dr}\left( \rho^{\gamma-1} \right) \right] + \rho(r) = 0. This equation can be rearranged to give .. math:: \frac{\gamma K}{4\pi G (\gamma - 1)} \frac{d^2}{dr^2} \left[r\rho^{\gamma-1}\right] + r\rho = 0. The program solves this equation numerically by defining a variable .. math:: \mathcal{E} = r \rho^{\gamma-1} and finite differencing the equation according to .. math:: \frac{\mathcal{E}^{i+1} - \mathcal{E}^i + \mathcal{E}^{i-1}}{(\Delta r)^2} = \frac{4\pi G (\gamma - 1)}{\gamma K} r \left(\frac{\mathcal{E}}{r}\right)^{1/(\gamma-1)}. Linear wave ----------- The subroutine ``exact_wave`` simply plots a sine function on a given graph. The function is of the form .. math:: y = \sin{(k x - \omega t)} where :math:`k` is the wavenumber and :math:`\omega` is the angular frequency. These parameters are set via the input values of wavelength :math:`\lambda = 2\pi/k` and wave period :math:`P = 2\pi/\omega`. .. table:: Input parameters for the linear wave exact solution +-----------------+------------+ | :math:`\lambda` | wavelength | +-----------------+------------+ | :math:`P` | period | +-----------------+------------+ Sedov blast wave ---------------- The subroutine ``exact_sedov`` computes the self-similar Sedov solution for a blast wave. Toy stars --------- The subroutine ``exact_toystar1D`` computes the exact solutions for the ‘Toy Stars’ described in [MP04]_. The system is one dimensional with velocity :math:`v`, density :math:`\rho`, and pressure :math:`P`. The acceleration equation is .. math:: \frac{dv}{dt} = - \frac{1}{\rho} \frac{\partial P}{\partial x} - \Omega^2 x, We assume the equation of state is .. math:: P = K \rho^\gamma, The exact solutions provided assume the equations are scaled such that :math:`\Omega^2 = 1`. Static structure ~~~~~~~~~~~~~~~~~ The static structure is given by .. math:: \bar \rho = 1- x^2, Linear solutions ~~~~~~~~~~~~~~~~~ The linear solution for the velocity is given by .. math:: v = 0.05 C_s G_n(x) \cos{\omega t} ). The density is .. math:: \rho = \bar{\rho} + \eta, where .. math:: \eta = 0.1 C_s \omega P_{n+1}(x) \sin{(\omega t)}. Non-linear solution ~~~~~~~~~~~~~~~~~~~~ In this case the velocity is given by .. math:: v = A(t) x, while the density solution is .. math:: \rho^{\gamma -1} = H(t) - C(t) x^2. where the parameters A, H and C are determined by solving the ordinary differential equations .. math:: \begin{aligned} \dot{H} & = & -AH(\gamma -1), \\ \dot{A} & = & \frac{2K \gamma}{\gamma -1} C - 1 - A^2 \\ \dot{C} & = & -AC(1+ \gamma),\end{aligned} The relation .. math:: :label: eq:kconst A^2 = -1 - \frac{2 \sigma C}{\gamma -1} + kC^{\frac{2}{\gamma +1}}, is used to check the quality of the solution of the differential equations by evaluating the constant :math:`k` (which should remain close to its initial value). MHD shock tubes --------------- These are some tabulated solutions for specific MHD shock tube problems at a given time taken from the tables given in [DW94]_ and [RJ95]_. h vs :math:`\rho` ----------------- The subroutine exact_hrho simply plots the relation between smoothing length and density, i.e., .. math:: h = h_{\rm fact} \left(\frac{m}{\rho}\right)^{1/\nu} where :math:`\nu` is the number of spatial dimensions. The parameter :math:`h_{\rm fact}` is output by the code into the header of each timestep. For particles of different masses, a different curve is plotted for each different mass value. danieljprice-splash-4d1f09c/docs/faq.rst000077500000000000000000000145221477365367100203320ustar00rootroot00000000000000Frequently Asked Questions ========================== Here is a collection of the most common problems with using SPLASH. You may also wish to browse the archives of the `splash-users `_ discussion list. See also the old `pgplot faq `__. .. _sec:moviemaking: How do I make a movie from splash output? ----------------------------------------- At the graphics device prompt, choose /png. This will produce a series of files:: splash_0000.png splash_0001.png splash_0002.png ... There are then many procedures for getting from these files to an animation. See :ref:`sec:movies` Using ffmpeg to make a movie from png files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With ffmpeg installed, you can use the script provided in splash/scripts/movie.sh, e.g.:: ~/splash/scripts/movie.sh This should produce a movie called ``movie.mp4`` from your splash_*.png files. The contents of this script are just some options for ffmpeg that produce a nice movie:: #!/bin/bash # # script to make an mpeg4 movie from splash_*.png files # requires ffmpeg utility # # DJP, Feb 2014 # opts='-r 10 -vb 50M -bt 100M -vf setpts=4.*PTS' ffmpeg -i splash_%04d.png $opts movie.mp4 The main options to play with are the bitrate (``-bt 100M``) that controls the quality and the ``-vf setpts=4.*PTS`` which controls how fast the movie plays (``setpts=1.*PTS`` gives 10 frames per second, this is usually too fast so we slow it down). The industry-standard compression codec is the ``H.264`` MPEG codec which gives a nice small movie that is still good quality. The best way to reduce the movie size further is to restrict the data rate. .. important:: The .mp4 files produced by ffmpeg as above currently not play directly in the Slack app. To ensure this you need to mandate that the pixel format is "yuv420p", by adding the flag ``-pix_fmt yuv420p``. You must also ensure that the page dimensions are given in even (not odd) numbers of pixels. Can I make animated gifs? ~~~~~~~~~~~~~~~~~~~~~~~~~ Another option is to produce an animated gif using the ``convert`` utility that comes with the `ImageMagick `_ package. As an example (kindly provided by John Mansour), use:: convert -delay 10 -loop 0 splash_*.png animatedgif.gif where delay gives a delay in ms between frames, and loop determines whether the animated gif will loop (0= infinite, 1=1 loop, etc). The problem with an animated GIF is that they are slow unless you have *lots* of memory. However it is easy to convert an animated GIF into other movie formats. I'm getting a segmentation fault, is splash broken? ---------------------------------------------------- This could be a stacksize issue (particularly with large data reads). Try:: ulimit -s unlimited before invoking splash. How do I write a postscript/eps file for LaTeX? ----------------------------------------------- See :ref:`sec:postscript`. At the graphics device prompt, type:: Graphics device/type (? to see list, default /xw): /eps choose ``/eps``. This will write the output to a file called splash.eps in the current directory. Alternatively you can specify the filename explicitly by typing "myfile.eps". The file can be incorporated directly into LaTeX documents. How can I get a colour scheme like the one Joe Bloggs uses? ----------------------------------------------------------- Send me an image (any sensible format will do) containing a colour bar using the scheme you want to rip off and I will add it into splash. Also feel free to play with `my scripts for grabbing colour maps `_ yourself. What about boundaries? How does the rendering work near a boundary? ------------------------------------------------------------------- Usual practice in SPH simulations near boundaries is to introduce ghost particles which mirror the real particles. splash does not explicitly setup any ghost particles but will use any that are present in the data (see next question for how to specify multiple particle types). Additional particle types contribute to the rendering calculations but not to the determination of the plot limits. Note, however, that splash does *not* set up ghost particles itself, as this may depend on the type and location of the boundary. Thus if your simulation uses ghost particle boundaries, the ghost particles should be dumped alongside the gas particles in the output file so that their positions, masses, densities and smoothing lengths can be read into splash and used to render the image appropriately. How does splash handle multiple particle types? ----------------------------------------------- splash can handle up to 6 different particle types. These can be turned on and off in the :ref:`sec:menu-o`. These types are be specified in the set_labels part of the read_data routine, which contains some lines of code along the lines of: :: ntypes = 3 labeltype(1) = 'gas' labeltype(2) = 'ghost' labeltype(3) = 'sink' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .true. UseTypeInRenderings(3) = .false. which says that there are 3 particle types, with names as given, and that types 1 and 2 are SPH particles and should be used in the rendering where appropriate (i.e., only when plotting of this type is turned on in the :ref:`sec:menu-o`). Particle types which are to be used in renderings should have masses, densities and smoothing lengths read. Non-SPH particle types (e.g. sink particles) can be optionally plotted on top of :ref:`sec:renderplot`. What does SPLASH stand for? ---------------------------- Urrmmm... it has SPH in it and it sounded good. I thought of: - "Some Pretty Little Application for Smoothed (particle) Hydrodynamics" - "Smoothed Particles Look Amazingly Stunning Here" - "So People Love Analysing Simulations of Hydrodynamics" - "Simulating Particles Like A Superfast Horse" Your suggestions on a postcard please. SPLASH is so great. Can I send you loads of money? -------------------------------------------------- I accept donations in the form of citations to the `SPLASH paper `_ (Price, 2007, PASA, 24, 159-173). Just like sending cash, only... not. This may change if I am flooded with requests from people wanting to send large sums of money. danieljprice-splash-4d1f09c/docs/figs/000077500000000000000000000000001477365367100177525ustar00rootroot00000000000000danieljprice-splash-4d1f09c/docs/figs/colourparts.pdf000066400000000000000000004777221477365367100230450ustar00rootroot00000000000000%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x´ËެKΖçuuÔŸçØ3Ä€ Ø¢‘Ôì·Ïó؇3T)ZjíÊw9|ˆ£Ãáˆï_ßÿéû_ßÇÃáçp¹}_ïŸëåzý>>O?÷Ëóø}|<~nçóõûý×ïÿòý?¿ï?§ïÿý}üþüÿ¿ÿÛøûøýßþö¿§¯üï¹~_ü￾ßÿÖçËéy?¾çŸ-ô~»ÿïÏï¿þù}½œ?·Ë×ùx:ýoß"ÏãÏñtþ>oÏŸÛãû|ÿçPùÿñ×fÜ\^§¬ß1>]ïWô;~?~Ž×çõÊ'tþ9Žß7«îyý¥Ê§ëéüszüáü¢àéJ_ï? Ò®?ÏãópþµÖ“Ïõ­ÛíçŸÏËÏõú ©[×/|è”ò®ú>~÷ÇùòkÞ/|ާäýü¹\¾“5ÐïÔ¾è¹ÏÓ7àçþ|ZÛ º^é݇ßêüÎ…Ú¸ÿÜoÆïgŒÿ`38·¿«Œ`}:Ÿÿoµñ!ëUÛñçsÇá|ÿ¹:6ùÆ‹íñx±Gëß}Èør>ýœíp×¥ð± ßwû¯ŒÎRßÇB>ã{:N?×—^ЇŒO»sü¨‰SA2¾ÞÏô„Æ}Èøqe’Ï*®Nq*è3Ægºcy´ÝB>äËJüóÒt®Í ²½/?÷— >ô!ãçóɺ4[î\ÐgŒ/´Ó[_[ЇŒ¯÷ÃOöát—>äú¸²0¿Tð¥ Ï_—X‚Ƙ[ЇŒ/§ÛÏãe0_ úãÛ—ðp¸­é|,JMðÍwMçƒñ‚>ÔxÍç“óGS<î9KüõÞ3úäüÑ$ßµ±¦ôÁyAÖÆšÓ'ç¦ù­sÏóíÂà ÆÔÿ©Î=ÑoÎMôÝ‚k^µ± u®™}2þd®ïZ^3ûdüÑd¿9÷lßµüÙlßœ×Ü>t^Ðïj¹Û¯¦÷Éø“ kÜ3~×Åg3~s^óûPyA¿«‹Í¹çüÖù³9ÿzdù¿žð\oçkyõ ÝgÚßéŒÅúšúÄÏ+A Ö¿à*~Ì5ÝÍãㆫ|FJˆû5Û76jû8ýœ.0þ@ÙÁBŽ÷»{XÞ.?Ï_»„ïl^8+â÷•Û &›Y Oœ®_G‡º.“‹|ó/:‡ýï×Íöʾ§Ãùçq¦Žþñëÿ;9O?b+Ÿr~c#çÓÕmä‡uñÆE¾çËÏ!Gà'÷Î&8?~X8Pù£þv:¿²yáüÑÙœ“ÍKmü¾¿íªÈÙçÄÖî~µ>š}ÞÙ¨íɰ,ñá;ûT¢-N—çã9Bmp>¢:ñ߈µü–ë`!Ǭãó‘pÈï‡ÜùÖ¤ ã\Ì?ØÈ¹V½O9¿±ój·+ãœk4Øvïl‚sÃÕI~Ù+Ö˜[l^8_LE¿íÅ›s²y© b¿ðîÚH6r®‘÷áÈ;8ï^wÿõÂôÂCž=F>à9yÈsçN„Þ¸È7¦Úk²cù˜lè>é_Á†Ã¸Åfq('Î_މ¥àåÊ~Æs±fY¾Ä9ÖoÇÄæìaSð­f„ïå#_-=êÅFÓýPá&r-oór½Åaäo«øÍ ç8túu7çd3k‚cÛßÏg]ŸÉE¾éÈÒMn†y[¯\à»üØËíðÑ4Y^õb#çòcôK•ßÙÈ9Ýáëâ‹|k½\?j¼w6Á9PBq ôÛº(wx±yáüÑY èj/µóǯUÎ-FM ò-—xM¿eüÆ&8§K çƒÇc¿ã|yœÏ8 Çy@º1þö×¼¯¬GO¼ö>iý§³|aò>ÑòOÞ}Æûü¼ßH¼ðÞØíúsý}œoÁ³+j7ô¡Ö—Ãíç@ÈdÝØ‡¼§Ø2OÖ úŒóéA ƒÇÁ¹¡9ëO¼æADªŒÐgmx:á>^T.ä3Ï»9G/©û÷Íl˜×>MŠSaò¾,Ó/=ïØØ‡¼IÆúaµžµ}lì³v|°ÀºOÞûLïëõÄA=áâѱ7öïl¸H¯=°±Ïx÷Ü%u*S ôIúPÏüƒóZ >Ëâ ׂÁyCŸèܳ>Mw3üýÏï}Ĺ֭òZ>«‹óšñã }¤qMøƒq#Ÿð]Óý滑øÖü¿›nMÿŸÕpÍþCÝœü?ãÚóüæ; Oê¡gùÁyMüê¼æøÁyCé¼føÝx=é¦sÏï[ç}¢sÏî›ó€>áÜóýæ< O83™™îtþ¾àßÝép9ÁF"êåþ¸ÿrgq~ž Nß×û“kñ^Ùkg2J>æ½ø81“®Ë™Ü•ðÀ_³~cœM@Ä’%íw{-”zã#o–Y–ëõðs¶~ËúÍà|#¯[/çC΋ͬöI'úЯY¯úX|ä}?’Ín¯ÁǾ?~ßCÞùÈž¤ù_O¶µ°~c#gâ™t½O¿ra·l"-»£+ã6r&ƒòb=¯ºÿ]÷ø“Oðv?ðM"Â'=Ö¯lçÏFKs^lf}|6Æw}Ÿ‡¹¯`ÜDùxfúƒœ‰c^È¿gZeúþí`9]aC"ôõzI— c W²5od¬ür„ÿɇ$ âç¦{|8OÿÁFÎ ;~^ï|ä}C×kúœë*ÈÇòÎGÞÛý¸ßØÈ™¹Š¹úÌïfw.“ïg“Çæ¼øŒÚølÊëJ]lä¼êþ³UëO>ò®.óÙâò9¯~þ)ëw>ò®Qþi…¼±‘óš›Výÿ¶ï½ó Þ9®NókÖ¯lçœbÇ÷x¸;A3è¶K½±Ï®?ùüóûX™&ÎL°‘óÁK‹»Ôò Þqàû¡K ëW6ƒógÝ£9/6³>>ëÔ»>yG"ÒÇ.õŸ|äÍ Úßw.Á7´>ô¨aüÊFÎDfÃñýlfú“¼#›ãc§úO>Á;2’?tªaýÊfp^Þð/'§Åy±™õñáÜõzeÞÛN5õOnÀùS7ò6jmöÌóÝ‹ü·Ïåó¿þæŠ9iˆßÿÅ¥õ#lI`¾añíq¹|Qvc$à,ryž¹ž}åžèÕ[‘ÐY7"/â/W\ðEõ%ÂÑü%âÔHÊûÎrEeüàæUúæÄ¦ƒ¤8µ¼D¢û†Ôª°¡ysz·ï¯ï|Ÿ8빞 iõý|öÆÕÀu ^ätæf°ö°K¹ y»oäë¯À.Ov/T\ûÉz(N¼HÉËro×Ç—Ü‹öÜîÇ)¯˵VM5¬)N ûÂj’0Î÷°Çê%v€Õ³‚oÏ@÷jÅËézþ:¸§x †‚P÷b„é³e¥ äp9Q1" €’öWpZÐùy¸N6ó<>)a…(ìúS*5Ušòe§wã4ùø8ÿ¼}ߘ1Hcðjý FHÏ/©O“Ilº_É9o„n v~ð‰P/ØgxÁ)‘àò²\Q±ߎ>Ñœ<»ôF–WˆåZ«¦jkšS#e_vo*åA›„^8Íѽ+éòt>´¿Y77BI^!÷õNöáFœOF|Ôà :àoNÒˆlyY®±#[‹É íyÓ åÁ©»wkU˜H[œ^«öE[;«}1§ŽNª§lt(3é^0ú]ªË9š˜  nÑÀ‰8ºÜx%ÀURTt4BealqHÈËrMEë¿' óÕ5(y…¤î¥Õ jkŠÓ»}Ñ脌ï—£”ÎxÌ6Ÿ¹Rß¼"Àµ„l(”bÎ1м;²¹Y?º"8  ärä¶}v§`ƒû±ee1¡hKîƒA: á!«~[h©3HÊæœÇ=ô{±ªZš‰òqà´¹«Xì\yÜ‚0Íaú±Ï8ÜÇ/òî1HëAÎc&>ë“sÝBäeú1øÆŽÜ†´(üýÕ²,“H?ŸÞ0]<@¼Ü°rR›„PÏD³2¢Ø $Ì ë Z)·l]P›Êr‰ 4Ù2Ì¥‘ÔÁ ‚‹*Ù]“ Oøª›ÓB–8Ë ,5mNeßWÀ_±„§NM³ ).hsc]~œË^摲P²¼¤–;¤‹âã’t¾Ð.¦OGuÔ€Ý ìzyl,–\öâYʼn¥:íE\kè|HÞÉGKví’"‹-6ÕÒ$ …±f…wö·«%Ësh´ôýž^Jc˜~¼è¥ÄêÌu9 ½pLž‹ê­âÚTéª,èz~ܾô O=ˆá8œ\ `tê]ÜðÑ$p¸Ô¦JÁ&HD¾DBV+*nÙx>j0"l|àÆÒVˆåR%x5Õ2¤- ¥ý›Ý„¸\»¾sŽêáwŸØ‚¼`éßéœËò›ó³^ÇíV¦âÌäÀ*ÛŘu¢e|pzA”GGc€Hóä„ò*§’—HL ­UaCóâ4Ví[Ížæã<ðö1Ÿ!ê“Oé­ÆÐâÖEø WOìÆÞ.€#ký¦qUî«‚’„;ˆxÿQ¨¸4R²²˜TÙ~¢á›Q<¦EwGÅ#ƒy\+ÜTg´DöôwÞíŠÑÍŠÃ5<ìÁØ H/å|âHHëð˜uSN dVì…X÷` Läô`õ—ª8 Dq̪›ˆîÉC^ƒ§#ᨴ´B”F§NM•¦DÅ%£7Û4¸»yìMÙ)‘LGNÚ-ÞXL,ÏX$/öØâùì(di=ܙ鱻²¥:0×5;möûÌPì`Üzž_--KAÃÂDzðdÃbùŒ1Õ ±»_T‚Õ º/SŠÛì…„qi»kY qÖ¹s›¢7¼D‡xcDQÏGxs`#4ØåÎÐT©bçþµé•ÍÉçñIy1Tvy²¬N¼D÷ä ½!/‘(×Z64'¹$9µ-e_ôuÖj<®´únŠVoÌÕY(y:.fõ¦÷ƒà‚m$–oýqB5±¨è½äß’ŒàUiÔkuq›¥=vàňøÐýä~¿Åb¹Vª©†-Åi %îÞŽy5½Ë]„Oò!1x¯K½`O¦DÖ5F™ PE¤$—šÛÙÃBè‰P‘9°ãƒ%õ¦s÷â4g¹_Êý}qb“c¨EÞ%/j}hÕTÚâ4’g€‰Š8_Ô+í©5­±«ûMˆŽ¬ªÒ QÖªˆ¼,ÀÁÇ4`¦þ Ñ‘%îKD6’´,~`ÌÂî…£j‘”–€Ý¬5*šaGñHµTtu&ûܤ{'öäÞvÙ·wÀ A‡Þq;çÜKƒ$£µá@¡›]bE´4ÝŒ–5(à†›ª+Är­Ô *[šÓ›uÈsf§×D¼ÁìI7Øre-j cŠÀ+wy\Qif;~ÎVòw®L7x,Ä…é|ÃíÎ<Â(–âIE-¸Ï¦+S3}˜’UsÈ*÷>ƒªí(NiYVXÊcƒÂFõrqyÖ-g8¤7æŠ{k6¯„u¡rfoæ&˜Ç-„ŽêüÀTߘ§4¸èP§FJ^–“ ^ìkIý˜œH¾âiË =±\kÕTiÍäônŸÍíó®Ù{ÑërÆaÃê‰=ܪ‰ÏWF'wüvÒ±Æßœâðd¯1¤…‰ð¢,SÜ‹S"Q[!/Ë5ÛCh͉8ó8¬Òâ·eR£Bð0†Åc %©bäzåšËìR+v!wÞâˆ}øéæî3ôqÁ6”Ø ìz2<©Xí@Äš’cb!JËb Ø>:vô-­‘NDêÔT,Î¥vòÙ¿SƲàáy2_wãÆRÙX4‰T¹SYÍ›a×åѸb\®ÚXl™sW²WšFªÊ_°h˜Á)ÓßO¤EW¥±©¤­QQ ;ŠÇ@vãÚ;.w6€üñxâsÓ¼…Eœðº!ZXƒÓJ•æð b=]EÐíòýxºGG Lä↢b´€’–¥’Ƹ}a±¡#“ÜàØÑ—°DB˜Îh¨TØP»9¥qÁIãrÃÅå’ó3Î|˜ï.ôGÆïÆnì³\&Aì48Ƹ±Ñb@¿Ÿp– Ð-Â?k(€Ã ÇUšbãJH Ëb‘±ˆ×³áKÝ‘oi…X®UjªaJqHS§Ã±±F­+W3´x@Àó@+/!æjqÆØVo„j×cc÷3°ØöLj…yqbXˆâƒØñFèmp§ºÓƒDJ^!Êk­ÃCܶ£ „qañ *dü)Ôcqvþr×tc§«©œTrád)Œ¿âIy×’  nRFÀ OJÏy±‰È¡‰lÿçaY¬1N’ÜÈ5#¯áxúµ¥%R.X©4¨Ú”à´ ‰þVò˜ÃðdÎ7ç^MÎ=Ö†è./éqàÕ·|éo9/„Á©3E 5>Ø)NDï qNŠ5t¨EóÁ˜›Sv8eW&” Äb–Щ©†)Éh؆0 ÆÏáùjüxq-Ð4Õ…¡'Z˜…E.Æ>žQLÿˆ‚j@t8;g<Ô«©˜it,§„¼,×TÇ'ÞüàD×% ”¼B,×Z *­ yÅéݾ°š¡·§Al_7}²÷qên,êÉø¨ûD—fêáæø9œÙk5‚$ pööBÅF‘X”£7É©‘’—夂Çc¼U>9ÙäînJ^èˆåZ«A¥5“SÛÒòÊÙŽ£ž+{ü»ÍÂK&KNjñŒ,=Œ™•›$á3_\Ýd‰P aŒzßàì9é¦"ÄA 8â´%Ïrãv ³Zs‚Š×ÄX7Z^!Ά`©Õ¦Ö§„}1¯‘ u¾zžƒ¦QóºÜ‹C~‘ƒR˜¯¢­ÃÝ%H0´À&°´±8y:œô~à^œÉ…DÈr‰¡=gl:Ø‹­HšHÊ+Ä™°µZØÖ|s¶„}a5®*±Ú½ØåÇéýưñ@OÕ¡½éØiõùÀ~IäÄΩëGùqóPdSá/Ü\Æ­­äÔHÉËrEEßbQÛŒTÞ8ý·‹-¥&ÒÆ8@ÀAKÛ§?,vXC"6 7Çbk •Mi—êld-̺ãê?/žëh(ˆ³›.øÝ¹ea"'¾VHqj$åÅb40òe2fVœX)Ùï’WˆòZ«ÄÂ-okŠSÛRöÅì†C{z8»Y)7Ží˜Ý6f·>œò ŠpOÚëÔÐ{uñÓB´#=x`Fv­³É“S#%Ïr;=M•hNÑa¶¼B¬-°ghµ©†5Åi a_Îéxš…ÕxÅOÃEžB-Œ…Aç›±O8/µ1á‚É@ЂlA²b6FÄ›RóÚ“‚ÓD”+à âÃ&®[‹ö°8Óoy…X®µZ˜Hkžœ&öÅðŽ£NÃÃ̧ßaŒ9ÝHÌo ¥Ñ„„ë°9rŒÅ’Bl% š@äEÐæHȸ1Â9ŠÓBPù¡¼,'ù „•ݸoN §ƒ yÉ =IÝS«I¥5“Ó»}i>mý’ÅÀêøŒÈ¾î…ešj mû"7@³‡{XÃ[ìä[$rr$6ÂôâýàIÒ‰\ﺺÉèëiY¬‰8gdÙÜŒLqp©C—ˆ“ëVjPµ-Åéݺ¨>ør:بÚì…»²=ºÎlžG<æ0у†ö@ÐŒèÑÆbƒõ Ó-NNt…(¦wÓÕXÄÄ'ìá`N-/‘(×Zö¢yq¶„}aµm°ƒ„·ßnpÃN–1¾.İà‚ã¹Yã„$í±îÙ>ÅÉ "qá S¤8 $äe¹¢ò,ðyÃåâÄdêñž”¼B,×Z ªÒ¼9 [Jž%¦WóàÊ^‚Q> 3ÂüÍ#ï¬ÒÐp¶ç‘ SÑ•F¬xwR„ý7{2û«åVjg ÄD°$·i‰QeW¢ƒÄs¡@‰+„!¾•J,”JKŠÑ´#¥¹?éÝ—›¦‚Á#¾ÀéUï~ ¢“³¶Ô)Œ zG6©r³RœÖökÉËrE…ªwÜ¥Á kˆNy‰¸–m­š*¶ŽÔæÔHÙWÓZë³ÅAq!Ôá]õp` ÓîŽh·K•§ƒöz»Heé‚:`¸ÕÌ©ÌzEEÒÃîÅi !ÏrÑ5Á‰î²å’òJ«¦JkÂüâônŸæ»]â:töò³®·KùÀx[ÖÍÎO&¦`‘ü@ÈOeýÑB´ˆg¦è7‰p–ݺ8 $äe9©¢æÉäp{ÆTe wGzËÛˆåZ«A¥5“Ó°¥äéµ®“^ç`ü/Ø2Ÿó¹æOìΞæë䌻ìzx pqÛ¥ñ(ÄÂO´0Â,A,Ñäð&‘P/¤YnP±jã7mN˜ÅLHŠ+ Å¡œšfXR|RÒÒaÏ$Dv¡öpdPEää»”mÌmçîã+q$9»3©ƒœx,„ìpt®,Œ-ß© /¤85’òœ7Ëý/fpb%"t{ã’—H”k­ š7§wûb¸³»#óNM1ƒˆ îþ®1ŽáYÀÙrYþ‡ölQ™zÝ)ºò-Ä¥ ŒÁÆ@˜©å^œò,70B± -FÔ½S\!)®”jª¡¸ICËr<Ê:m9DhØF žça;Û¼‚¨É<ÕõxÅ=8<Èa1'É„,wà…ØìOIhX혜 Uqò°'—I• ]y¡x2bóâWˆâZ©ÄB©¶¥8µ)%ÛWv"«"Öx¬‚éw÷®æEe‘A̤‡1˜@f¦NæÑBzîNã€ha±;%”<9¡f——¸,ר9¦‘͉˜¹“œ”§B,×Z5Õ¶¥m Œ‹©}èÅl$yq¶™Z…E#‘xÊܼ—‚o2¹±/d¯>t»œîL¬ØÜTì[˜Ý@Š“)yY®1>[‡…›“1ÞH iy…X®µjª´&°8½Û— K¨WdB/#(.h#®àã,l4ÌH5à4k`èÀ~’ù;'µ à3kŽwSVd3‘³Â²˜TQU¤|còfDß;ÔFXiaL ”Û* *Mœ¦!%ïßÜ’"Âì-©ØœšcÀ%‰ †ãôœ›f¶¸_n ïÌÏPá›n¸ðÏPH³7‰i‘ù—\bË) †,K5}Ò—õ6û±ËÙ–UH S¡`UT­t3H‰ ë㎘#=¶ØWq…S>ÎñÎÝ£¹×ò¹<Þq?›Ëœ»( ¹±\ «-€Yèx¾Ÿá´hˆ~›‘:Ø4RÂ,60¼&7„Ɉr8aœ×ÅV¯¤%✠Õã*6Ôæü29µ!)uhÎðú®‘¹V‚´}b7o ¼AzÖª¡8ÔâËA»ÎP×"bnƒ ™œF¹â4 Ó “£Ø¡6'ìñ½W‘’WkU˜HYSœBÇоlôåIJù¹rs:Ì8s(j8nbd»mÂYàZrK)6R‹*NˆHû¥ûS®8qܰå1P-W'Õ,L““¹'ÔYì Îô3ò,Õ:-š6¥Ù4’ÆQ,P]Íã$&ÎÃÃö3ës:îá½è§“ìüpeÒöƒçÀzÒDÛ1Jv!†ÝX G“ïÂöäÄ»ŽÍ©°\a¬Ðl’Ъ917Ýð†¼B,×Z5ÝËÓ}«¨85âÎ&ä1Ôñ9ÙL½¢kaõÄ8³eЉÝÕK# ìp£q¢öxÜ8ƒ¶ou®ðÁÃäbÀŸ!)K0©JüóÜ|;R5Cp‰)ÄB­Ì ÒˆÉéݬ˜É#©Ë+(È#q+»‹«Í‰ñqqç5âlON4¥"cÓyÍœ*Bp …²™L…_mž‰Hqb N!/ˉAE¿1‘{pb¿ç5É!¯˵Vƒª4oN¦‘Mû¢‡÷iJ-ãzIÄtqã›Îä¤ê»%ö-öàÜ"}):•udÔßz\™àaÜÑÏðÌ'÷ˆÙoN^_,䑊ã•r‘"©ïÖœhÖ my…X_1µjª¡yqz·/oMÙ¯ ×“+û1¾coI ##‰íYd°‡Ýª“ gaÌ·aa Î6¾Œ™H·ˆ[ÈA½©ˆ4U^™"´•[œð›¢<«r‘úLuoNL· —4·¼D¢\kUØ‹5ÅéÝ>ÝØæƒýñ7Ý•™ÁÌßXÙ2¾ÊË× T„s1’! ÿ'¤Qˆ±G7ðOÖ6K’_~!\'§FJ^–+*ýD6'WxVÌ!¯Ë1y¦Vƒª­)Nïö…ÕæÓܼ ^\ã˜xcT¦ïK½«ôÍnÀaYEy©U{qzÒ$ µ±ð÷pQ)N¬1‰¤¼ˆÔ,Rá'º{Òà]ò Iy¥Ubh5¬)N ûÂjfKÛWÓ,‹tÙÃó% Õ…s¢ rÀ ;³tÀ«btoH€éÚJ`Å…Mˆ|µ°,VT¸­¦š Fó˜U‡´B,—*ÁkP•ÚÍéݸ˜Óðv"ŠZôÛ~¤Æ ,@¬Ý±L>AAg+¿)RðÂÐÄ»ÊëÂDŒNN‰D-„¸,—Vtçä…msÒ ¢7‰d„š@,·"¬ I[šÑʸ°—Ç›ä¡×^#ÖXXèu%+5¥¸M-<Œy‡GæVÂz ðÒÈK^ME1¾8‘ž¼—å £uÊÅ€Žði"%rE/û©ÊÁ©†¯ˆòBÏâ)¯´jªÔ|rj[ZžÛÐma&ä Qó™UÍgéÞs/¯¿`Õ×v¥BÁ³ÉìF=9Êê€M~¡:ÓHq O¤äe¹Æ8ÐaíÚœÐ>óZ^"n€¶VM5¬)N ûlôý/±a$^t"Ÿß)0n0°ìÇ!vœƒ3„û ®$v-„©†˜>­71ˆÇšÏø²²P’pDÇc(Í…BÑ‘aËŠÖ²qå+ J/NÓ ÅQc4<é=l Xi9”¦CGVçÄÈ&Ä>â™ô +ôNÌô·ã q" ò…’×<<òNNô‰¸ø±äe¹ÆNN 7#ªŽÕ~Š+Äb­Ô jc`$´AY6s†M\'Ugçëâ5 Žû±˜p-> à ‹lµáð¾T€Šñͺ¾0· $p®Rœ‚KfrQ…^F #åû(-F…¤¸Rª©–)ÌûôµiGÉb»Ûþ¸ëŽ£Ó7ÐÓ{ú*ºo¨¹5zšŸcü¢ænL"¿ma"W¾¨ÜƒÓ ¢<ûƤâxÑ»9Ù7¨ó!¯ÆôÖ*±Ðª­ NÒ4öÅDa·^Z}4£Äq†WQ[òBlg}œjÝ&ðÃFÐŒ¯GìÄcçÞXªâÔHɳÜÀÈ|ÈMHqžxU”Z¿CZShA¼¼å:\bÒÄõè-‹ •ˆÅœ<=kdi(ªaHqJ$§.M‹©«×iNÓÈbs#YÇAŠåã&'uÏYËDèÉ @®»i·…¨ YŸòë3dºÙÛ w$Ÿ„4*lReòy3b·ãŒ0¤’ÒR¥&JK¢ÊŠÏ»mš¾×h¼1bLK·HmŽHÒÆto8Uf¬TÞ3/¨Fµ.†ìB˜–ð¢˜Q&’Û¾¼šœ)yY®¨pÃØ¦MN‘Μ¾å%â4¸µTmMqz·/ZcqÇhôbI;%Ÿå‚G„ÆÇ¤âê!ËÓ@ЂD(ºßÆp*˜ý8 ŠrÉi"Ê£§ *ªÍìÈÁ‰ºáSÖî–—ˆå¶V…‰”5‹ÓFʾ°š/ÄÆ@ÁrÌb©n×ȈŸ¹lb·øW±Ù¥»Ç}«B¬y¶¶ø¡Lh› Ïð›Hqj¤Äe¹¢bcj½NäAº*¨AÉ+Är­Õ Z¶È(HHMoi8d¾ës/­L’vg= *“ÙÆ’öhs±WõìDäÆc˜‚ `|˜”ifan’Íèâwñéߊ²HìÊMÝÚ0Þ3“%…¤œÒ¦©Zã`D±B½妣ÂWŠ{3(† ½¹^™ÝÛ²¦y‚®ú¤d³ q·ë‹4 q6‹i¡Í˜ó(Wœ¢<—ÜMEkPm“+¦Dlq XªuZ4iJ6j²y7ÎŽí¦5ÓPŠvËÍõÀ8¹Î­-³>'Tv ‹eÆQ¨À™»I.›&Z×ÑÍÉf Ó^ŠÑrà“‚î¬›Í®Ð–VˆåÜPÓ¢@÷Ê;9 C¸0™]íň—ÝñæŠÕyÜ|QÝñ»!aƒbòXX#‚~fñÈIMc"œþçX.N”¸,WTØÃÑùäÄ(Åí›ò±®¶VMµm)FãböêÕš´!ÒÑÁc;wU4½ ¨Ž+[ç@òfªÄãL ®‘Þ9Xº€q<³ƒ-*Òt­ =»àDøi!ŠËbéØ1#ŠéÆ‘4Ä%åÈí‰ë¹EjjK”+Ni](â¾èà3¹¡î0£­0yBÏ8…âDùá†$êÅûˤäþ3ÎkMXýžg›.¾0:˜éâ2/NQœÅäÉÓæÃÚÆ‘]¾¥-$¥¥N {ÑFKÛhƒ´-›¥÷åUóN$J"åÉ{ÊNåóÈÂG|ÎZOôwZ+^rdÚ^S,›wn7LÄk룤4*nÓpãÂf}°ñ’]e+Äb©R(.îÁ0¥8 $Œ‹:àÚs rhE6œNÊÀp;‰`€pÈE{Bõ¼ÐXnå!îßè’Wl é—Ì;’MˆDÍ‘'|+*=V³š‘3t–¬ú­¬Ö'±Ð°ìh6ÊÆ FØ€ÀhZÂi…ci¦ö :ÇžÕòÆæžÐeZK`[50‘ºNJ×HN yY®¨L^œhw¶†S^"vŽ­USµ5Í©z™öÅDÎ~›~7²›ÌEãð8 #{µ±áá 1¶þÃã žã9£n扬fÞØjŸÍ©ÚpÈë–Z&’¶£ 8®ìTNfÄèLÙ6\¨ˆ¼‰‘„Ìl®ýA:TÚ쑸Nxõlg30RÙ熘¢k'§„<Ë5†ª¥Fì¢8aÇûC^!)¯´jª¶¦95â%rì«̬[¼_ rE?¶Ù#÷ÔãKGÂÝŒGÎŒLœ3d`Æg²¢D Ü̪->ì ¢4+b…¡2[æÁ«¼‡»…z« $¡‡²¤ù¼Û]Ü}|d{Ó ¹¶éÄ|63bäBVƒÓIØÙ³Ë¯Ên/‚`\7~¡â}Œ"<9 $äY®1£H‘$Òœ²ámy‰XWníS«¦jkšS#e_6ø:p'¯»²W®ˆ¸ê[!.\±ÿ#X¸Dø¼J6e (Fê‡d›Šx(çX“S#4Š ¥å+ÎàT+Õ×k—ãLš*l  m@iTYîE2¿šg’xH™¶áVté¼÷;°xMÊ}<'›ô,¨Hp`cÂ5OzÿB˜ÞÀx€æ…ŠÙ P§„<Ë%/“<ËÜœX Qµ<4($å•VM•šONÖ’‡ùx[Ç“#%$â*¸p7FMþ ‚ïÈŵ°‘œ×`œÞãz-ÀøÄÂÀŒ¼Iç±NƒS!¥ò(·©pïM윌ܹ×ßò Iy¥USµæÍi ñÙ‡htöèwÞ˜ «I›ÍÃûÄÂFž»ÀF¨â)”'BXÛ}®’hMèÀ”·ºhð‰óî¬7.øœ…$…VXk,Ì7#¿Þ.ŠØB+€kF­Ð i;ŠÍ»eÕÉ_\TV[Že/‚hvvTQó`@"®ÜåˆÀAÉðovÄ»Oœê_Y+MEjö©dÄVw! XcHñ¸?ÑØ@r %®˵RM5l)N‰D'+yž†žg‚Ðd>’àÆd@ŒÖmRû$ò9O·¡ìýù0ÎæB˜£ÀpËÞ¨xæ(ë³8™;UHˆËrb¡ó åæ„5|b¡å¡A!–k­šjÛ"#""(i3ÎbÐ!Žjœ3üÖ"¶OŒ”v7îð=·ÄR¾ÖÂ6€1;| èb° ‚1›Š;sHTl1J$ì qY®©âÎÊàd¤ßMù–Wˆå–Rƒ¨m)FïÖÙçÝ»çëYØ\c|aabŒq6²÷Æ6¢Àön (Æóî9³•C0å'¾'•@I³Ô†bp6þ‹5¼…B|}«ÔTÔâ4šSl﵌ǣT$¡Ç¬ÎývÛ»°ìÚ>Ž$‚ÿš«I–vc qÜKã‚|f¯S^…‰àu¦ññÌÒ@X·”—åŠÊñf6óæÄ|ÍéÄ—€¥Z§MÃwlŽf£{TˆÂbwkÎ5›4&ú*&O ¿?瀻9©:}Žñ€߈Ž¿H¤ÅEDR )£¬¡A±¢¢ÈÑ ð°Õ°Ò QZëÔTmK2‚&‘h„7}b¸•¤ùPÁ¤Y#EáŠL œvúö96ó{¤·—&ÎCŸ<žÚTÄk÷–KNÐ’ò¨´|}E"»~p"jí J%.J•N›FSxç|±Ù†”q±¤±wÇo!“úÀ²‘ogºŸoŒÀof+pã>˜ñ¾¢žuLŽfh:€‘e?0óâ#)2/F‰À©ÄYnPqOas"J±ܔWHÊK¥šhè]ŒÖió¾ñÌžjY׆íéi´÷Æ\G¹ #¾:ߌÜ zÆí… Á<£Æâ‘ÇðãÂÖäDÃëÙ-yöÊ5Fþ@7Š!<‚¡Á©ä%åZ«Â†æÄ1“Ó»}åÅÔ¶Ô½»YvªÃÿןÂp,è<¬št-ß 3|¦WÄ—P³E0ƒø[«’jáù¶¬à4’—夂§‹ùÖsÂû÷}É =a´o­•šoNÒ¼Ú šqb,ÁÏ.ÅË-û÷!úˆEÜdf˜Ÿ&‹Ð€¹¨ ¡Ò1fôöÑD &Â:ê`º0iw!ÑŠ!/Ë5áˆÜ‘'&&Ë•¼B,×Z5Õ°¦8 ¤ä±¨™ N¢hèŵÔð] KÙñÆ®—CÖz›Òhï>˜u#há~9–ºMegá¨Ír$PË)‘-Ïrã•NÍ͉æôcªKœ Iy¥US kŠÓ@Â>û¼IëÀs[½Èΰzba¹Ï.®xPÌ‘AMÕ˜9Ð:¸;v%/<€Ê)6 akÌՃę͈ÅÇŸJ*ÂR¡ESv ~±ÙHYö2‘úÞs+iŠ™L%™™ ƒ›Ûá¡i6ÀN… éÌy¶hSa§_Üœ)qY®¨`ª?81-éÍy…X®µTÞdÑ–b´,IiL?s/Ê®ˆ]Õ+.³ÌjãAL7f˜EØ‹;'‚¤<¬ßÌ0.üfâó#ĢоÅc !ÉR#°c^Úâ£[‚ÇW¢àS@ÊJmšf!J%‚†eVÏåñ ö:²•+§²vðØYÅ«%`·xdÌ=S¼Â9p=ó/†;$s¦Ü£.ÌÛª¾=Hqˆò\6•[¢0q59¹Ív.'M=_(Ám Är­Ub±o‹£en7-NuÝöE7g£’oz@ÇËÐñtÃÄp8ü2˜žµË5öpùÃ5̓{Î… …Û®x¡da"<°`'ñ8N/HÈËrME’qëÅéÄñÁ y…裷V‹J¤­ N/HÉ›+XÌ8\dUAR Ã_-,”¾EÒ1H¾PbeúÍD÷HùbÈBPÇY‡J‚WSáeØ h–äĶm!!/Ë%†O÷ö›Oó´¼…Xniµ0‘|oesJdÛΈW=h'ì £ÄêÃÌk;D¼Jêtë¾’8ºM:ðg¾P²0‘|{„?ŠÓ@B\–“*ô¢"»›mH´±åEíb¹ÖjP¥-pÁˆÕä͸°Ø¯¿À‹Mµqt·ec±Bƒb\õ†ÊwLÈžá0y# nSÀ §L„£cg:d'§(Ïî:©x{—Ýœ0ž‡PBƒ’WˆåZ«ÄB«¶¦8 [¾׹ ñÁ…oÎ'h/®qê§&öÅ÷khW£‹ ×§«7ÈÅ÷ïEp#âh¥¢½‚8¨h ¶³“S"[^–“*°ðƒ'ÞLQMyp*Är­Õ jkŠÓ»}i>»Òø°˜G+žÈ–“½|1w`„]X»¡Ê)*Þg à7Ɠ얉IÇ­;aç…UNöP'ÖÙ˜´—ÙÒ4b‡ãpacø,Q˜œŒLBI ¤e©q©Zl¢IÙ+f˜µ„ažˆÅZ¥Âb_j§4$š³Ä½¿¬ÈjÅbš}3/¾úòCC<ççjJ‡òp:âKqækç:¹õqqôšXÑì%X¤Ø¤4ÊÊRáØ}õm6æ »üU€…–:MÓôk€Ã´ßTÜ7ŠŒ¸ågQ94x°„2Æ'ÆÚË“ FÜÈ=ã î›éq;›Ê·ú­·ø¾÷Â"š–ŸE¥f’“Ú¡åBžåcƇŒp}Ø«Oq…v±•jª6f1j ¥á½¾Mt‘Ÿî9›Q,ë`Ø8åuUcûcx-^ªq~7MJ$gÒb‚ ;ž^˜YäÓÁ›S#)Ž*ØDÌI8ˆÁ\F|ò’–¾ãÏ q…X®•j*Ç6X®8%œ´ÎYΈ–+úiNf…Ø¢ˆ—¯°àjÖDÄôp콜&6‚ øÜJVE¥Ãê”+N qYN*xy¤bBöæD6Ý™N²äÁ©˵Vƒ*mIFÀ{1.çõ F…VœãèÂ:,#ÙE }­g…µÈÚÉ“4yÓÆ`ÛB²ŒT¦‡…{y¢›ËBÞ.ç§1’j™è6'”[ l‹zQ^Û¢¤Šl—Ö¼8 [”íÜ]ׇ‘ÄCˆMKaÑœWOõ7˜Xò5ÃëH"\ùê€qSs`ÆÓHM%s†rÅ)‘-Ïri¬ÛæDcÆûó%/ºE )¯´jª¶¦95RöE£›NÈ…I¸ao£Øè…Ee²bd!UÙI þ†¡VHkè@Ô ÷Ó®_4™ówri De¡¸÷ƒtŒïÉIT!3){‘Š.ÄæÞú$ÕÔyq‚FË‚“–±ø¾ä¿°"š‘D•óÕ‰ðØ™f„ÿLå¯@—Dôª È~ÃÈBP¦ÂoÁª¨\Rk5(N qYN*x±¹à5¶É‰- ;ÙÐ Â}Òb¹ ¿5&’Š'£xäxYRÒ2&)ÛÞØ8Þ]šÈ>":Qã(W¶aôx$ÖK8>¸ƒ»´&02Aè ‹·-\¿’ÛËGJ£6©‘zÄ›™ÔýVH S%x'Æצ4§FʸhvÒ>Øò3äå;#ŽátòQó¸ÚAÒžú4 E¶F¼$ÚZ€ñ=š7ªxµSªâ„KßÁYò²\c—¸z±9Až1Ï–—ˆ•…î¥USµæ¨’œö…Õæ{è© qq/¸±WÆÂÌq›psT™™e´n hÆg 6@öet‡Í‰)&’ÇPµ\c|化mNPá&x fÉ+$Ê-­9 Ëšâôn_Liøù‘¡^lÀb"Ÿ›P×"fæ7HEXÅ•ýA–…X÷n#LýXX ‘ú!œ¤i$äe¹ÄОçjCœ@xl>5Hy al·V Ik§,ûÂj\}—%0RÄc+¾¶kÌ]âcdKÃ-Á¼$ÂkL¶…8µBEÇÝT ¶Ž^;TÅi J£¦6zÆ)÷æ‚,†wÊ[HÊëÑUæ~`ÉæójYX±?‚$Réx±j5„š¼ï„8#"¼@ìÕ“îHüÀò0% tJÊÃÀ"ñÃ:´\q¢khç—Å„B}ÀÍ•p!&æ¤SˆÅ–N Ûzƒ$#¦z@[˜§cLú±.:¡pÝ%ÖéÄB+ÖÊ :Ç›°Ê7®ôˆ7¥ A£HÉ¿©øîE* #Ö\Â< ”´,Ö¯K°ãÜŒ˜˜¨ï-,~[†ØBÊÐ;9M$å%|æ'ÕâðÈ6¦s¤GFà„ÔGü6Ìá2‡Ž‘Í·n-nðŠ„íÚTœ†$|‚"^ç*YY&(܆él*FxtH*ÄR©OÏ4Õ°£8 $,ËyÜm‡¯9xÿÂ#}YpâæÒ½1Ú–¾oâቾñ´, b!‘UD_6g²ÛG1ù8Éß)Ë2 ¾ã¢§Ò\è“´rË +IY¥QS CŠÓ@4 qxg„$È`]Ó`>FëÂUX*ʧ_á…N«‹u^ 9{*´t0 –S8-3œÀNɦ‘–ÅŠŠ’Û͈rÌ}¬Äc%-TWƒR©°¡vsJã‚“Æ1ï`2!>­mÌŽ6m7æFÛD!Â"¼D’Úmc5áŽæFÂQ±yÌ€ÀƤ"3,‘HF Ķ7³ECÿv+#kÙdÏEµ!‹þ €Á[¡„^ì(6o–¥½„%Ùö;™‚71fÂáagïzFk9^}cƒë?Ñ^07ªM•^p/Nž¯ò²\c<…M„¥ÑF<6Åb±Vª©†1¾©-‰ÖEÕ•´yÌÁ[WCüÏ[å±ý˜É LðÐÖZDê4A}š–Í¥F_]«I ' …iy±Hó)ÐÆ¨Îx§®Q>T¸… °¥PÓ¤˜ÙlÞ-‹ÎMZ Ù³6“agmˆŽãÙY,|x„JÁû¤­Í¾1Ƕtãi±±ðÒ· £P®8%j)ÎbMÄÁnfð!íÈ\ü!­”V:5Õ0% …ÙҌʗ§Å.8.úRw—!ôËôˆ£4VâH4†€ð`›q$üƒÉs0ʼnœ…Eô‡WüX7'#"%ŽˆèÏÂâÆ›T<5ÇÚÙò ‰rK«…µâÅèÕ¸x‰wÿ5uÀ qߘšúuoD3´Ùo°Éõ»¸X®à“Š'#ÒädDвJ…´,µ ž<ñÜ(Ùð´ ‡7¾s¿…-ÄbK¥…mµAŠSœJ­N°…tš :[Y“Ódï+‰Ð¸ô‰f6ˆ1Ï… 9$oTÄàD›‡i,yYN,4ËÖiNPÙÌÁ[y¡g –[Zmª´frz·/Üb0L8Ì8jáì‡Õ¡+§rteÂÿÄuAâ{"¬¿Lg A BYÕ€•ï–\/B1¶8ÌRÅf!h—c N‹ÙŒ Š¡­ô¶…•B Z:çtæä¿lR- _…OäùGçΘYCšË–Š€ó”„-|š=ÜËœ§mDþÓƒ¤¤ÅIEÔÈ=ÚfTjº©@q  ˆ†öw2Ñ’pñž¢b©T(l‘Š×°# ÀÌ0­}ùVwÄ[ 2âÆDn@ ˆï`“/d&R¸/QÂN:{ƒ¿&V<\–£:6> àON‰´8‹ È3ÓÁGß“µ5BG)-êlèÔT©wðNFж²ž¼Â¿#^_÷4 /‡¹.¬‹ÜÂ/6üæûÏšÆÇËYÛíðøÁ@Lót^£¾^¨P4k·81±-$Äa å;°/šœ¨ÚhÊ+Är­USmÅe$G”q1Î µ)Ätä銟,ÕgiŒê¼Úaʱ‰ñï™Óìpµ‰y»4ânÓ+ ç‚ö”Å’BJXƒ±7ÂU“çnZZ(å¶J‹ªÔœ¶!-ÏhiÅUv@I·Ãm&¶w@ ¥ùR1³(ð†žD”‚: Z˜ˆ;³â”–¬,Žg*y³`ÈûªèTˆ…V|‹¼S©P}OÄÅ`ŒvEK/³ î~ÌBUx=Â¥¬°hOž(É·•ÔÿìJf4)ÛÒŸL9<~,‚ˆ]ôµZJ¤¡¾±¤…1·é¢,>Øã+ -©~§(tA¹&&—„QÚÑóAÃTÓ+*äòb>Aã¥*ÎF1‘ø(q#è`$)N’6 Ž|2""4€HæÈbMDXÀ°U3ÂßEV—ˆË€‘¤TjP=—-ʼnøÃBJ^F’¾Õ6s&g´HRa´ ñ#ã6äk;ìi^“bEÎ>rØJx¡7YérÜë¾ÚÈ2Úmì `+"\ufíɈÍU8J)-A€R[¥EÓJ/6ÛŒ†Á[|µ4N¹ *Åu„Að̲?sVƒNýZ+¦‚`¸TöÂDÈC«Žï©ý@ì?®£/ÏW->ÈGunõDh ß,{¢Hk’ŠriJ”KFaÜ|a*g,6fÄce&­HSOŒx„‘ºµOµÇR„[ ÂtHê?f²„‰È‹Ë— ‹ ‘î$uQŒX› ˆ>“¥².üõfSM´„Á§m¨ÔTmJsj¤ºh-ÙhûwÙO)®e«"/sÅL¶1<îÞD`‡ÜY6Sú"q6M‰tCµ,!BÄÛq6PSá‰ñ¶c Å)‘è!/Ë•K£#isrÝc¢5´Tò ±œëthÕTÚâ4’·oÃØ òýBBœ:ñ^‡Ö:XÆâ¡·-8œCù’û#¿*¼0fgR‹x¾Öw×šŠ¼7¾/39 $Äe¹¢òŒ\7msr»£ß´åb¹ÖjPy£áî>9…q!_iÌŒ³zô=ïbö®}˜¼1Â"¾þño¶ÂŒïšê¶pŽé¢óƽÞ7*Öyî¬BUœ˜®)yY®1.ß²ÞmNžêny…XÎ(ThÕTÚâ4°/¬6FãùZ}|–¯6°h#G#9ê†lÚHR"Íh# ÷H&Ò XT °à £ „4ï -ˆx/=x²1t®¯f¸)…’ÂJ¥¦JµéhÍi’âhèí«1ÂãpÑ„{W”©0k’S}£7qr©¤–3S2éÄ×bA0Ríùƒ*¾s+Rœ˜ëüòmËËr]¼Y<8yfMhÈK͵jªaMqHØ-NÔ`Fd¢¾î._úl¥ ¥ñà‰pS†§Rá¦F˜yÀ 7Á óU’§ 7…ùÊËrEÅšhÀhp"<þ*.KULNIÓj7›h\Œq#3|üÜÞN9ä{£˜©#¢Ãçϳ۲»a¹#îÃF67±8m “Uœ,…ÉɉùÐM@ËËráµfzRq¢-#g}Ë+ÄrÌé©US kŠÓ@Â>[<^·É÷üpâñtÞŒåùÜT´—‘ ¢:dÇsÇÄ`9± ã<„0b{E8òÆ"ôô$381ï.Dq>cÛΛàÁÈÓAÞâ Q\+•œZñæÔHZ§ÉvñtgÈMºøHy(Ìk'_•¹/9fÎÎo:G ‡S6Ê1÷ˆ  ñŸ³çÆDH‰äÑÍ)‘-/ËIoÓà,mNèÌg³Z^  @,GC§VM5¬)Na Óí¢ÅÍMâ»Ùp£ ÙiuahÁúÍ}>B2ÜÜ „7YÙG€°{Z˜¯D,0x˧©»ƒÓ@Bžåc¾`>9Ñ®>Õ±å’òJ«¦JkלÞí[3[:/$;±ÅÁ`±{L–‰±e)7%êIB*>fe† K²m½*3®eÅÛ˜ è”KNQžôÆp} tpb%öFÊWå¶V‰…VeÍâ4m ûÂ|"!ùâ퉴f t`Æç'L×Á ³í¸gÆeFV€|w!(F@£› ÀNs‡¹Œ IäK$ÄYnPuYlŽlúˆ'’Â’ÂB£‚" ¨ ÉØMÿ,As'xƒÃœNyR+c/,tc3’ñ•pŸÔöì;C#ø&Œæ…  ØÅD‰ÆDXŸyÚªâ”È–—å¤ Œ¶6̲8ñT»˜ Å(/ï ÄrŒp:Ÿï*ªaMqHØ#œ"ú-l.š‹wb©_ÿ?4õІ¹—v @ü„ÆÆÆ…Q¹ò‚Åæô‚„<´ßT\ñ$J¤8Ñ©bMÜò a„ƒ•VƒJk¢‚Ó²eÛ§Õ{Z÷Ê“÷èT™…9|—‰±}bz!àÍj—ï) 䃴…8«ƒåû· 3š’ïß‚£(ÎõSÑvq0³91ÃêŽy…¤¼T*¡¼•¶4£wë¢É‰TÄíÚÌüM>1o6•áu,ZŽþ {…<Aâ"ñ{cª‰>àÕŠÝD„´,ñ‰¸Ñ†·ÖŒìÀf<´´,•*ÁiÓ´!ÅæÝ´0˜KE|À.眚ÐâY°1‰Äµìž«DâRv#(A„,FšÑDø ë5Uœ‰º«‰fQe}6vg´-¬»F«4©ÚVÞ?, {M6¡Ë ‹eëÂ3HŒé‰‘Нù.z!.[GSúAH(*ø ¯š,*¢(ÆŽYbÙJNQž£aS±m÷Û]ƒ›tYáÔò‰rfá„V… ͛ӻ}Z½Cýä-Þbì‰X¿&É©ñÖE´jªÖ<»œ:¬æJq¼JCÛGr˜Ì'¦OØÏ[8ŽIä2]4Rºpl ±êÙóÒŠøì ‰·p™6‚ÏøÍóÆ‘z›=ßh½ipÁ™ñ"öU²7ä¬Î¦Š‡C6§iF‰cÏé\IÏAK&ÔôÈ&¯gû€ËDLÕÜñC+/ÃX(Tà™ ¿ÒcÐ~ú¼Yw/²ì›Èp*sÅæCðѤ×-«K…>pnš´ ›Í›]¯‹Gì>л:KDÔxb¼-–/»âçc“÷€ü¨Ž/µ±3 »‰eHS®8 $äe¹¢"•›OiNNìÍâÚÄ–—UæËp¥USµ5Í©‘²ïeB×M?óÉñ/^ÕÆåÍ·t ¥™OœaØ;y> |þÓÔ=\XŸJjÄ ÖÃ~žÁkL„ëŒvʧ”¼,WT¸¼‘•—ŒxPP¿ßõ²ÅÚRjaËÄ%£ ¬ó; /›žúQ½m<›ÂJåxˆÍC´Y"|žš¨Ñª:¢[¶“ʸ6I]m¼4…´ñ ‹ÐøÍ¨Í*q]Æãeˆ›Tm Œb[Ò@odÉ•Ë<µªþþ‚ÙKƒŠ]ÈîÉìKX5ü'ËÅ@ ï~™mÖ˜ – ¨ŠÓ@”çPßTÕK§êÉC^!–ãÐ/µª104oNïöÙß_Sš6DžßD’YÄp‘qb û#ŒívƒÙú@EÄO8˜y‚w 9t9FgCÌ~¼•28%²åYn`ÜãÉ!_œè|a£åÁ©˵VM5¬)N ûª øH&‡¤„¾"¬wè0ôìçš3ÑX|û(¦€#Zq`H½Ôdæ\ÒQz↠ñTã—åÌ:ÌO(M$„q€´1ƒ>ì5w6'Ü ¥BwpVJ•ÃïiSŠÓ@p4κpôDJ±z…ÿŽÉã+5lÅA"8LæeÔ›‘\ÑZ0¨¹Ê«TÌ¢ŠÔ°:9±áò¡²–—å CWúÕä„=Ün™òqðl­šª­iN”} ‚9~ÇÛnzö ITsƒÉ'b\ôœŒ‹ä¤—‹WÎ)—ì]=<­$®Íœröur‘‹—æaîcfÄÒ¦bÛA8žîМ6Rò(W¼Œà5 NT/‹´<8’òJ«¦JÍ'§¶¥åaþ ¨ùž$I©<.êè÷PUŒWÀØ'êúŠÔËì,ŒÝyôYïI‚Z`õžä ò¥ÈÉÉ”%ïÑ-yY®1.IQÉÍ *â²LU% ±ÜÒjaKóà^œÞí³x.É‹Ëi!Ñxý¢0ÞGcçç5qzi:ƒSbF¦p-<åi!,Ü4¤«aàfÃj"t&…e±Æâ¤ÅˆrDÈ|MuHK$Ê1û¥J…-S¢\qJãQ^tüÈVgõ ½Âge ›Á¾0ž#eì±CÀ¯¤ßâi|8OÄH#ps·ÁÓø $âZœbGEƒ„¼,WTIá%Gà¢8±å÷¢åW£}kÕT­yqz±¥äåN&ÎQ£58@Ôw%ò!Œè ¦‰á±ƒÊs8¦ÚÁ sÈ ¤ä’òR©„ö9ª=¤ Ksü^ÙQ¢Þ_¬Ž‡ñ…E^.su¶—{æY¯=&€.@ùºÑ a*C,@˜+é^þ‚åk`›Qõß!­ú½âZ¥¦¦§Ô¨¢½9x$ç…¶uz!"ëùÂNÖ½*¦t~ò” ]œŸ\[ÙDRù Þ/oBÅLVLiQöŠI•óO¼¯±9EùÚT +À’êLжá’L–eU´³þ[¥´ãHQ)1ùßtigÎ0ÅЄMo|ˆ D÷•‰8 ÍÌïHÔmM8%WyqS‘ÙÍ«Ég !-Ë5/¢`ææD´Û×B,W: šÖºø ;”“Ywñ¸}Ï=l^8e¾Ê «òÄ·yXBAxk†e"6¬lÓøƒë l›ÂäÄŸ'ï¤2Å.]ªâ4ÅY,!X¹áa¼ù¸»1Z ¢4øb±Ö©©Zï`”/ ,CR+—7í ÔÀËä¶È÷˜”3/›/ÍaD¶›_ó§uÕó·jƒ°cmĬkž$fy€¤x4R’,•Æ6'2øk÷‰Ê-ª€”•Ú4Í0B6(80+–i’·yp·Rœ®Å~tcô_?Œcö4×géÚÜ;Éç%Ù5×OMåßYÛà1/ž™5Ø )1J KqŸÒƒ È‚qI*$…•2M•FLNïf…±d<Ó[SMœ‰½÷€È§º!"cœ}"Êóv“ôŸæ‚ì…y–q`"d¢d%£ ,õ…P ~·opÁÇáÚE %«e¥FÑFREByÒœ†š¦½n]YüB%2Ø"À6 NuX‡ÎñÕÌåùjÝcxºÚ añ€×[i‰°²¢CUœâ²\Q1íy?wpbàÜj^òq¾ÞZ5Õ²¥-€`„Æ…ÅÉò@hÅ›K~ÉÞ}ncg”¡»¦5D}Øø³;Î[ùX:€Å3ðÅÕý¼ÝRŒ8J‹7@‡+ŒM©/œoFôs•[ZöW‹9rC§¦j½›Q#-ŽV6Ù}Epãp8`…e=¤ËÁÎEC^!–k­•Ö gsz·/Ær/Í$B3\‰Ù—óís—æÁÄ÷Dt?aÊKÄù˜¤yÑ Ðî*“Dº‰ἨtI6D)aîÊÆ,X™7'¶ß!>Å ¸ÒhhU/¿`ónYtqžo|ëÕ™ÐóYA“ ã%š „7¶p3 b^ààûM @oç›c¸ ¦G]?Ø DaŽÍM…sWU7#A'Å—´B,—*Á=±xí²ÔnNÃ0N“·/BFÝ9ªçqåx¸0Þ§$ 枀¾ˆO@Þ H<(Ó“*|î(ж›ŠÑE,<Ås „´,V9Õ“k£¹V[Zœ/m•6MÒlÞM‹^N'áÈ“Æ&†síãÄøÄ•!ìsÒçDÉj1„B=ÒAu0æÉÅ~b­N†}r"ú´å1.¼û߯·`áæ”5 §–Wun¹ÖjµÃÔ¼8½ÛVsAž‡è™sЋÛ1Ù Oã-°cŠ;°XÍ#(º)ì>¬«üíŠKü Ä@ S?DÉÆPL"%,‹5ÆxÏÏ}$#ÂH®6-«~Shë3hÚÙµ…+!)/>Œ‚R¼ï›ÇÁCYZ™èÉS"n?ÓÈü^ [ù"&‘ð:¡*> i–K,õbÁšœØùÍ¢‡üR\ªÔ4­5öÁ'žxµ-Z8ÆôzD2–Ô#=/?H\mal&2ûƒ ²™0™ÓO¦¯`gi×-„ ìˆs¼1#$<ŠêTÀ"§…D¥…<¬˜TäeD¦810¬Ž!¯”WZ5Õм8 ¤ä3Á׊Ç:†Õ……fi5ík‡^Vƒ…Zû曳öè¦Âg">39%õPZXNªÀR×ÍiÙSòà´­ÞZ ª¶¦8½Ûg£‡àÛdv~½sÊ`Ib¡¯°x‚ —­Èq¢°‰ðM¿`5Ût>¢gXT œ åÈNN yY®¨<= g¬9¹×€ÁWå¶VƒJkÐsq*[¶}aµ ž4 :Þ(«7¦÷mT„3T¹éÖê@…ÛyÎÚ -ôÊLt}¡b¼gÝ'}Ã@‚ÊËrbÑŽ7/-NLV~'aÉ =±\kÕTiÍäôn_ðŽœx‡‹ì«)V#'s݉ûùçsîŽLë‚:î¹ã\œJ**¶ö¸9Á½8 ¤V0Ë5U¬;ƒS­MC^­iÊc“—Z ª¶¦8 [J]D¼Z¯£BÊŒû‰9f „¢ÒS¹q‚#—û)Z€‘Ìk'ö%Âé©§(ÏFßTø¾‡68éÝó6…HÉK$ÊáW¦V… ͛ӻ}6úkŽ“ŸÆã‹¼ýdØ¿×eb7ÎAXx¼)O…âOàþònÆB˜¡ÁÈŤ¢FÖ±^Åh!ÍR±ÂûÄæÀëQ¬%‹G: IY©Ñ¶ÖɈbiZ¨XÂöÛ[e´ÒYèœh}×A¡6æáëÈÕÔ¶³\£@ò(h!hexÆsÑA…›Kfb Å)‘P+äe¹¢â»&'ŽÔt®†¼B,×Z ª¶¦8½Û#Ÿw=ˆQ0àÑž˜o83…¥>÷i4Š÷ñÞPÅJîà -Àè3öÅy1³¢u“œÙò,ב}v3““‡-Œ¹%/j+”WZ5U[Óœ)ûÂjbfœÁ³æ¢ ¸qÜUXhFB•CœîS.æk°LlYXÄØ"¤8ebKp yY÷4çBÞŸÇaÚœ°‡¾8Ä%`©ÖiÑ´)T^²i¤Œ«f_Y-ì'Ý E`{ÅÚKÍ;1Nª´$ A3c7 #Ø&yMÅi ËöMµ”ޜʮMie¤´ÒiÑ´)ͦ‘a»á*¢[Qû5È ÅcŒ à¢çüç6v#S'HrŒ Åš³{^WЭ§ŽŠÉ@j„ªáͦFî’¦:âµu«ÓTašÍjêÊfîô#]5/ãDæçZ†ûŠ·j ^à¾ÆÁŽ ÷Øi$CG†â¤{Sƒr7/UqHÈËrEåI­ãæÄLÍ[%S^!–k­UYÓœ†-%:8G6=¸{cT”/„žøÇüdÿÄ) )ï d#­¦ÄÉC 0šZ»}Ýæ„#Ák9w%§¤[)W-£x ¹ÖD´‘£¿¬#W­Š,V­‚F }Q[›Š°[ÖGqÒe.$V­(VP®ZƒO­G} ikÕš:5Uë½5+²–Áãq±Ô‰T¨Û#Ǜ٠äè§´åINãÂ{’`qÙB·§y¹$Ç‹³+ȳ  ƒ×G*6&cžb2 Þ›-iY*i8¹zÒ¹Ù°×e ÉfÈJÀB­P@¡aÛQlÚŠ–•)zÏÈ­óê ×Dµ—aÞ-H¸ „ûeŸ‹ƒpuo (Á0'cu`"Wn?F¹â4—劊½:™½“z2K¦¼DÂËk­UiÞœ†-%« Ì‘9nËH‡³ÕóÐYÿ”Œš³›Œ&3%@7·" Ay‚Œ„7Flòd‘U2j ¥éÈo".“§6qòkúØGï(Är­Ô j[ŠÓ›u±ŽÇ»/®ãÆè8€WcÎb¼7ˆñ#ÿ 9<¸ÇVÎ0Ø3@C¼>í± Æ «5RTŸõ…AŠS#%/Ë®%^\‹i†)[^!©{i5¨Úšâôn_»1ù±E†l| óãB¤nkcÞQ¡©#¨G¾uŒLŽ Ìû`X ̼„óÃ> ‹@c|Ƥ89"½t±äe¹ü°W"'#ecþ2*q…XŒi#•jªV|1@XKÓ(ÙSÎÚ4×%ôÝ YÑ¥‚Ä}ÛhL’ #˜Èaxvn>Ô¶²ò Ì£éb“S"[ÊU`ŒŒ&žXœ0'žGQ^ÔU –k­šjXSœö…Õ¦Ä±Ï n@uXŠÞÉú44IäN dÌáØ€çÑ6‚`n ÃĦâjPVCq¢Ã'Â0G\k(1[Œ¢Kñ ÞLj‰r­TaCqæ‹øôÔ6¥Äñ†©p|Å%G_Mç/˜“póx™$-ŒéÜðçxÑK£n ÄÉ´ºCqHM¯ƒÊéÎ7u7§š¨‡¼BR^iÕTmMsj„AèrU«ø¸%I ·½†Ú4ûÆpˆâÛE4(‚ïŸKƒbƒ‚JD ø ^ÛÂDðCاD¢kDef¹¢ré w N¥ø×¦ˆ•Vƒª­)NïöUP>›¿Üw“¨ù†jµ7‡ËʳßÂ}1ÀÇ'9´¦¼9R‰ä Á0BæÁ)\>£‡$+¥{—|PÎÜ Jlñɪ×#VÙÂÚ—*6´nFÃÅÑ[ß‚®&%’PÉ›*ÜG'!,‚n‹J•ŠÜˆØá1nˆþAÍõ=žG,„5ÇW¼Ò˜i¾ÛÉRÙh qYN*xÁ€'f&'د–<8b¹¥Ô *[’QäS¾Z7û€= žÞeTó:Üñºøê±+½#}a¼ãdœ‘qîe^u8úd›yŠó­ÀÈbæ­™IÅüÀ‹1p/N´ËBB^–kŒ÷íŒt6'ô$]Ly‰èYl­šjh^œRòtîˆA˜âÀöš=GdŒ¼`|<ÎdBú~6Pí ëÒÒã9WÛZ€ÅíõEïár(ÏcIpONÐ4¢<æ$Ë5vô!‘Íé@ žÛŠÁ)åb¹Öja/š'§?ì³ñ÷³~ùâ• òò\>‚50Þ®cS=ЮÁî•&ÉÀ#‹4ݵÔq÷Jo™TD¤¼*UqHÈËrRñL5¿·¾9ó§ëžDIb¹¥ÕÂD´fr¶”¼ F’SÌHlŠÌ}/Œ ¡)û#, ã /a!ç!3wóÒYZ#ÂlF–ý†Œ1âØ/ŠÑFPSiá /*0â–:ŒÅ€ƒœ”ŸÒ’ÒÔ)—Šk$¥öæ³0-›{ÍóFÙM¤å~s˜å®°0”d5Dþ#Ь Ü­2jH@’:iU˜òøB÷†HÿKD6 Lå"Å……¦ã˜Êðg18൬ú­¨P'uQ´ÅãÝ,­ö®%™*i,§V™÷˜XËÇtuéhgŸúÐ8î>Ñ Ü:;|Ò÷•ÑÄx/jIN…D冼,'U`nV7£¨}÷WˆÞT+µ©†1ÁèëÂfÂ~ý(ôäÛ ñqø‰‘T±ÊøúQÌS‘üID ¾GÔ:€ùõ#X1çA_-НYUÉÈQÉ™œ€ÒkŒg·a ‡kìJ\4i –cOÂą̊©¢¶§”<ÚÙo9®TôêœN]X(Ï!&­Âe2u5ç» PFL®´#KÆymPELîʼn…Ë XËËrîhFQ5ñ!ŽÚó~˜ÅZ©Â^OFiݦëNR#ï¡¥SÁÝÎüÖÑÀò£V¾[æcºñ–l¤ú½…ØÙˆ²Ã²fš W‹ƒ¾@ŠÓ@B^–+*+ÒGº7'“;zòUåb¹ÖjP•5ÍiØRòòt!}.ÊÄ ß;w€¹+˜)~{¸¯‘+Ì;Ñìhž@â6o#,#\‹á+1T妢1\ å^œSɳܠ:è Nlœý*¥HÉ+$å1sªUS Í‹Ó@Â>·2üŠDHRS#Ù­0¸1ʘñ¡B//ˆø)Î6€@$ømÈgÉïcÞ(68z aÛK½‘F,ì& i‰¸Üm•šªMiN”qa²Yyá€86ñÜØÛÀfʧ¬=P‘–ñ1> ?´àâ+3ýƾyTIY®8 Dyáf5F|\i͇¡é7³ÔHi4B!J£§¤Nƒªl)>ÃŽ’µ]³HÏ‹/hÊ”Œùum¶1&I€8[|DSøö Í;”e{I"áo0eå âMÅ w›!÷â4‡nùÙäy+N&`ë ny…X®µj*ƒ.zÂÈ+N)yyç,¯þ¾Ê7Š)@wÎ*ã°ÙÀû>b?Qóx¨ø†ÂâÅeÊÂŒc䬌ÞTù–2TʼnÈwÂSÈËrE…$+ONfÓùÂÆ–WˆåZ«¦jÍ›S#e_¬ßªãküÑ“¼ÆZVXhÆ 5ÒFÕåWRhθfBîhöä@ÐÂøoÁ«©HgœÙò²\®Ä0å žY|sB{ã_g‹z/Är­Õ jkŠÓ»}a5OEq»ëŠ^¥)VÚ³«0Ô†‡h^*WtbZñîú ìÔRD´ÌO`û³Xx"‘Àª%"j 1x÷ƒ ×&X‚¢ÚQT+ÓTiÒšS#eVË·žžbqªe™ ¼0Êê+Ù­@˜ÈX‚ÅIÍ „Ï! -ˆà]õKMÅ Ë”4m ¤e©¤¡–übèbC)*ŠX™‚ÂÑYÙ*&¢)Q®85’Æ1ùà­ðº‹‹½“èy(í;1º4?ÉÎr~`­‡ „·Z7¢«Â]Vîkl,öŽvrÚñõgHÊBMB†(=©ØPm¼…à…_ ±\«4¨ÚŽâ”–Á©,ÓÞSá,OHÃsG•nʆâåBŸÊ⚌ È~7†ã8ö€<ÃØˆ‹Ð%rÁ&Âí*æÅi ŠsæŸTìá<|lNú} my…X®µJ,´Z¶£mI¦óšWùhÜ#>D“G„ãæ·ùÚ®7‰h¡NЇ#ø ·†KéY7SÜ‹Ó@BžåÆÙhÍâİås5„Z^!ÖXjµ©†æÅi %o/Ú¹àn"«SQ<ñØ:³»bÛþç(rÑ:ã)àM æÔZ›Å{ü~ ß›£Ž¢$ Ås `¤*÷wï@pÈøHâT‚ñFˆøóAÎ^臵ÈÁDhýŒ_—ÓB"¯Ê i¨§ ',ôMµ%¯ËV‹j4oNe˵/ý›à» 4ÅlO0lп/F‡öÐmÅOú;pÅ̹Ӡ‡s.öA (I¾8˜ohøµšÓBÜ}A^•“ ^8^&MYœ¨}ÆÄ#.j ÐÇÑ€iÝ\š1E6I-HÌTœÅ Šdlc4»Œ°Êcž‰¡”¸F,7J Õ²¥9-¤ÄXqLœNkº‘,¦‘~)Gì4_‘rÂ`oœC›FnìÃ$]›S!Wžå–¦¹8uó=òò­ÒìK^k5TËšæ´îTX͸ÉÕ7êБÍÇ›©éÆjˆ?¸gGr)“@zºÍuÞ`Üw¥IDŒkí1‚7†Qä+/û`DföF5LŒ•- 3`˽9-DyІGÁ2ûròxìK^!)7Z5ö¢ysZ¶Ä>?ÃÝeýF–)ôcdµ–œÎDt"qk€6÷cÑùAWÅ2|èðé@×2*ÍZÁÁ¬„’R£Rc/j‡Ï2£Dý¿ãµeN6¡#Çý3œ3¬5Æ©H“’ÕpAà¥KF³ ;œ¦ß5¤‘å‡SZ—‚ÝV•zAZÒËs‡/ùDî#“û¤e± pad9«èÓ˜ÈØÑœ¢eµîvÐÊé5ôÊÃ'=ŒM]Ç-Æ ³…ª=Û§LÞŒ,uœ¬—ÞŽ?¼þJUçÒ jNŒdF%åyU®1F7Rn3 'ByêÊkÄr£ÕP5Ãi‘÷˜¼k„ÀðÊiO¹F™Q#Å6daG‡$`šBrÕ Ä~l¼ RÆ(VꃉT­7›úY’ühýw†^—,Ý“T¯Å4b!ÏøÓð¦'#Ò·š“ß6«F5Ç+ÅÓãˆNÖ¨¶0“9ÈDžÓivT_ðʰ“TñA‰ N¬U•{øZ˸>÷·²4—B‡„••Þ©C\¸ÐO]‰/YX¬4‚uaì4.¥›ÓBbšŸÙhå¸$«¹§ßiŠ,Ét\6–¤ß{ƒ†[Cxq¼¢q:ñÖÉ—„ßd@3ç=n¹‡IöÔ‹éë6l\æ=‰‘TMá¥Í¢!_´ê.4RV!ëßÑœ¨Š^>UC4†É0~0_AfÍ-Çø6Qf/RЀJ8øð Wî¢É³Œ"Å…#g>Ù7¢ªÔ`I¿×|BÄaÉ û( ý< #ÏQ‹Òã\¢!{³•‰ªdŠ?:xH…ÁðR‰°W_ß*œÂ:Þy¢ÊIÍàÇ7¾œÐ•Ñdäå롃_­•Ö\NË–‘Ç¢›.@|£4MbõÆrpGöŸ5‘>F4o“Á‚`ï¬.VGO¼HF¹bÄdMú‹JsLËù”`l'iéeÔõ³ÄM‰åAÖS‹ÉrÞ¶ §§ué×g03~‘ŽÙL1=H>ZfE8hëZÏ#B¿\&+áÅ’…‰ð†#‡O?œ® M,-sqêÆ{äÁišøÒjQµ%ÍçÕ²4pbL4 º>±ŠDÒˈAÃc R)âG|ÅùÌmTbj‹Á>‰ F«¡"@Áô÷æÄ¦íA"¯Ê FTÄùêpò ììÌŒ¼ƒXîhu0­‰¼æô´O«·j¿“§mu˜`è7uŠeaÄBhØ„BH÷ [æ.Ž£äIgnÛ8¨B?•Šû6 3iù¯™£½ŠÑ"%ØÐ0íä Ë†©) M@ZX#%¬UªR›šNË×ëíšµY­°pF_"‹Ÿ¦ófâÚµÝaHóø1G^ß…„ôT`„Âq0%ü¢!æHB“°–MHDÈwߪXS1øpb1²¯2ú)½„5`©£PAѰí6OËRéÞ}"ìŒRú¶´]'êÁ\°Ò7sŠÕTz·tˆáüåEP³>Ùµ¨èÜœu ÒœiyU®©˜ß'¦;É’Wˆî zâÅ+oQ5Íily4un#ñØiiš'ÒB(Úㄞšàõ [g“µÕ9 ½áƒ CÎ[èœ7–“>7(ÐŒ8¤€»­™»<µÑc!ýî2჻…xDÑ2)Q­ÐP-3šÓB" c9ñmè@ð/Ò¤‹–¼HèôÉ–—ƒdæqiÇ-«… Ø·/8Ék¨¸õT 9Ñ<yU®1¤ùßœ2Aò®¼F,7Z UYƒžÃéi_ÆpœÞBQRùf [A?†0vÎØ‰­À  ÂÎaTq‘hàl0‘ÎòŠÓB"®Ê%p&qkÒ'š‚Wf޼XÄr£ÕP][d4³1.³ÂãÙ¨ª/ dɵ±¸ý.üXÄU}±0à¨6o´^Äa[7Ä^ ©‚°hòwó!P¿#«Êè©[/æÎX<¨;/&-IXjôª²cszZ{Ùòùe0Ê·#…d^ÌoÎÈœL@i±œ%¡ aPë.+‚î˜å1ö5uÅ´‹›S!Ñ+òª\S90v®§æäà©#|å5b9–¥Õ¢kšÓÓ¾ Ø3KÃ̹ˆŒÜx°¬/=јCÞXÎSè‘8p³¹À L._õ°]4Œ§ìŠÆÒfSÅFk÷Í»PRã MêwJ`t^ Љ5…†ft6aFØ,¤…ÕÉ s[mL–NÀ^rƒŸæc³+a†­Ìº6[~'õª35¿QÄ)ûR˜Ûòm…Œ¤”ZXÒk^>,ÍnüåÄDìqËkÄr£Õ¢kšÓÓ¾4oîʰŸ«Þä‡?VoÌ,7¹vóË8å\ÉhQq8F|[*—sÜôh~s‚*N)¬‹Í"ËB…Q—ÞðaÌa“ÎXÂ[T#%Šçh?TËùpWh!-í±wg¾oÎS™Ä8’üŒYúb˜“÷SA˜ªXi™ð¸¨Y~}ObFb0ær>ä¦bî A4'"! pjyU®©+9j¸81žz&çŠ+ÀR£Ó¡Y¦4›…Ä8ëûß -û6'¦cÝ_†RyNƒ¡9ËAÖ= ôw¢£¬ ÑÉþÎÁìÐ ˆ#„­b€÷¡Åf8 ³ØÂ¾Hº¼±ÇM”ý‹ŠJX)44£3ýªØ,¤…á¦x#އ˜aFûàÌšö6EY ª"¬–# þç“f)B3d8Jð_" ÄMfðŠvY¡9-$ò,7Ÿa'ÚXœ+¯‘’×Z UYƒVÃéi_F9BctŠÒžÖ«/¦s¬Ç Âñaú0„ÕªÁ1VÕLÀXØZBc÷~S¹†f ª9 ÂgS^•“ª¾|Ä #¾‡£÷s‚Xl”ZTc zœ{Z›‰2áA1Hð)Yb$z1®ž˜^3q4ïéª;[ÛÞ@âOÞØ8ˆºÅb{1bzÖôp¤ä̼Ttï™-Nô-,yXŽØHiUX´kšÓÓ¾XSf&H4.–5ŸûÆŽì¥:q•tE©àl×bÆ·y÷¼J óƒÈ‹#ÏºÒØ¡Â]ÄMiNÌ IW~äU¹Á¸Çkv9aÛ]#/Í"HéÞZ Õ²¦9-$öi~žÌ¤r+ý`·ª YU¢p´·Ò)çE*WÍA 0ªËî=Tö2®Dˆ¤ù˜G¨‘nd–[XªjqªêÜò)y­ÕPñq=÷¨5Í©k_¬&ðÄ¥; Ýí/~ u}1:¥§0Œ†y£Lå‰+Bm:6‚MM5˜ùÉù¾õiŠÑ-Íb…E/¦àa„ƒDqÑ2H‰k¥†ªlÙœžÖUC?[¬Ûq½k.BMLß§EñW@8\äìÌÇ hhÞs&å (c¦‘lLħ‡ý®2 @)—,‰CÁèä+l‹‰»6„ýÞ¢QÔ(TXTl3†Ó«a©i×ÞÞãÈ€ï{̽óói²•·c£þ.‰ áþQ}¤ è`D ëb]QG('æpºZyUn\.^è'¦cƒ7K^!‰›áá”»µ¨Æšâtmy¯Íœ iÕqû*Á†r~W爖·Å‰uþI[iÄ ŒÕ݃ŠÇlø,P5'¹ƒD\•k wð:ñÁá„狯³å5b¹Ñj¨Ž-Å($Gòù6N‹ŸJŸ3¥Eª ‚üÓdýøoÈÆC*F÷ôÐõQØ•ãÑ£D鸣§• 4„ƒ.dÖÈ kÙ@RHt‹0‹-*^k2P9Œ~æfHKk¤Ä©¼†j©ÝœÒò¨}òpyõVµ¾·±¸ èõ×E¶q;Ò}Y¯|pNyášÇBÐÁQÀë`—ŠžËmA0/N\q”ÛØ› ='¬a£iä•}"%¯µªkK3º@ŒK{'þÆ®uiuLn,z•¦ ¬òèªc3Ñ=ö•‚`ÄYàlªœí“!9@ë`©•žÍaeJÂ-¬Sبt Þj7§2n>pº¸aC.¨:ú2;:°oŒÝ7%Ž‚»Sc<Í{Uç°â@ Æ=æEeœ0g¬RÍrzA"í7;œ¿¿œè­tŸ%®¥N‡f™"›h\ZY «P"7ÍjXãž(·õz¡ @] Œ1BÏJH€PTò° ‰H´‹°*6Tdݧy #ŒâOKX”… ІcG±ÙV´0#‹|®ñ•½®.iáûa)À¢¨å_·óA¸¿·t fðÇ0„¿Û2F*¬m…D  VZ¢$\Œh?¹ÚxÅ5b¹R ^‹jliNOë2;®ëóz,È- 6ì0~c$üÄkÒ q¯6m6×8A¸¢»ÔÁYàéňâ>ä0Ö7§…(/~Û`ÌŽ1ör⃲­‘xcË+$åF«Æ–æÃéiŸæÝãVYiJ”+ƒÚÆx€–ÂIŒî©ÎÚìvsÚÀ¨¤}×I«ÁÈ€/ÞXÖ¯Š$ˆ´*UÝÔ¤LÍ&uùmZ˜µE(vUjl™r8µ!ia-î᪦«'{þ²©‰ïëÔ½1Óka«”Žy|ÑF¢÷Ò%øÅX7˜ñe>TÍh!Ǧإ"Ž’,†‹g£q®´ú­0šQitI4„DïÃåiÚÃm«S‡† /hÛ³œPà4/>Ч¥Eª‹ƒx¬2?JÐp‚RôBŽ—½CEƒ>~9¹hü­ÅU±>u/h{ÔA¤¥¢£|uªeJ1Z€¶UuXÙwemmmUòsó6ĨÃpÁIT2ö¦æŒ-’óa!Ô%Xm±j¯ÍI¤öSµ·8-Dq˜²‰x2š•A3âñ_ÀŠ5H‹kÄr£ÔP-[šS!i%N‡õ8‡“sæTuaœ7òÍTÎÁRtçì(J€p³Õúl%ˆ6rµµj´©8bêÆDÍè‘V¥Š†ÒDµˆ•z„Á§‹JC5j§AŒ7Æù†È@Æ©@,6…Ô÷q†´ØÂ2Û\F2dҺ pä…†ftî¹Ï£/–!ÌÀ"§ºñU¸Y©½cõc`‘áÇl ñB¼\i/¯#‚`Ü7Ôdü¨æuDfD¿ ,%@‡S)UqNµn6¬ñ|ÑìË— ¢°Qi¨Æ”á4Ȉ«µgªz`Î'ù¸*Î *³Ö ®³pÏÙ(ðÄ=Ûë¸o9BçbTÑI3'šÉ}‚ ì|iNƒ”4‹-ˆÀÌaCJ{¶cŒƒ‰´°FJX«4T׎°¹?M½•ÉŠÊçÍBfa_,eŠÞË=¦L¼Ì)Õ_œy–ËÞ!=ˆÖ‚}òhÎ`AÞziNz D^•kŒÀ/W®so¶91 yÝò±Üh5TcÍp¤í‹ÕD¡x^íñéÐhõÆpšÝo%òà±.mä¹gvä‰qý*;]EŒC¥ ñÝ{™7£ DÁ¤EÃM1jô²á¾Q¼ ÖˆÂF¥¡*Sh^¤ §§q5™a¥Ÿdn›¤@{߆¨Æâï„U\}!‚Ú¸ß Dl¹ Ì"¨cH̵÷`"Düf¬=ŠÓB"¯Ê5‚½Ÿ±8!8ø•Wˆ-ìjµ¨Zóá´liyu1l’’?ã{rc+ÀyûÄÔTšãކÐ*€38RÉPsÂ\Òa¨ñ¨Qµ|û¡JÀlqê@ÛÈ«rMåJÍ‘ûr"\icÉkÄr£ÕPuMîÍ©k_Fs"gŸ¼;{‘*‡ÒÂL˜¼¡"—~U1Ë Ü%"gœÊ"‰VA 0ž%¯J*ŽåW¥7'"n‰¼*'͸èŠ{t91œ€=òгËVCUšoNË––§‹f˜+Ýœž.Ú‚8‰†‰ \ò 7½œy*º…÷ägh%oñHÅÂDØô¬nÞœ ÉÇR\"^;æ_FôàçP׈åF©¡ZŠ7§…”8Lví»ÅÑÝÔPØÜX,$z€….e3U1œç*€‡x,\÷°Ö4~cÉ&Q®AÔi½¡B¶s#„…Uz k_vZ4mǰyZ–†ýCô/‹Gçjv4uS.æµNÏÄ‚ Yû˜­=Â%òÉJð"XÌú–'V.Fì ï,‰¡jNƒ”<+ùRM5¹óâÄ ‘® §‘WHÊV-͇ÓÓ¾Ì_Yc;˜³)lúVr:2E1iJY J#'¸z^©‘Š«ºÌ6 ,ùéב‹®n*V¢^ ‘ª9-$òªœTðÂõóFïâ”u'D˃S#¥{kµ¨´fsZ¶´<5ã¬zÉot-Ú†JðÐ@|°Œ¼îPÇC!©æ%L®õW_ï`"$ö`mÒœ 'ÅU±&¢¼îɰ–Á+â[X#–*•`]X®Œ¶%ÍçaÙëÔMœ‚p—ʈå}yk»1”ƒ'/+¾ÁˆÔT$<ù¬E  9¬¸É}!Ž "N_-$ÒªXSÑ‘òØñ0¢¯Â]ÒÁÛA÷dpü.Q[2|ž¶¥{»¸NÄ‹’&´{_Œ¯pVqåµ LÒBiWé~ŽåZgFCLG|0œ<Ð4‚„ÓBJ^—k*Æ÷¿0]œ|¦âÊ+Äî ÖZ5¶4oN/Hì« ?‹Nµ7oÐøáXóe4ß QFsÆãdœÔ0fKœd·uÀÞ>ÓÒ‡ŠÕDroN ‰<Ë–÷ÈÌèv9™ÌÄ£@-N”¼Öj¨ÊšÍéi_*ÝÑÆ{jÏéŠÄÍ6ÆJÏYš!Œ¹+ ÿÇŠ'üB±(Ápc N9 MÅ_@šÏ‰È´4üÌ¥áËïU/á0r“3‡ï;FE?ït4Ê÷#Ú3– ŸAÚ¶XÌ>¢¸ÖC”¯:ÑÌ7ÆàË–(³‘cUf1ŽPàÌ-Ý=üÁ©øW*œ+[ãOqò»7yU®1¾Uf±Ë‰oÅ,Þ-¯¿ÕÕj¨Æšá4HÛ«IEÅÆ1zY•ø½!¦b><)­ˆfÖ G–$”©¹(%Àê°Æ8fÅ=/€4§… Î.z‰ŒZà]>ÌI#FZæ¤ %­uª1å0 ¶!¬ ¬ÁØ9à•”Hñ¦ §í…ѫ܃ðÒ–û…}XE€ˆ)ì ²rMàq0Îä{µ\:žŒqŒ†cÛ„Åí儘[W^#–;J ÑÒ[FBŠö¶.Æs°^ê"–B’ìúlŒ”œ.ƒ9„Éj(ï*>‘iYe°`;J€1º3B,ŽI¨¤91Þ$òªœ¼XüqªpsÂÝůypjÄr£ÕP•5›ÓÓ>­¾{!,ŒIm•³¤bnµÊ/Æÿ4gL¾Y%½>›TýüF¶9náÂÑ í›Ø~™„DÝZTk*—ã4ìňµš‰,®°,Ææ›9Ìá44cFóyVvŸ)Œ5kË‚ÊI?³1fdw!˜“<é"ك艬ˆ“ÀxúXŒy—‰4/3S®9-Dy™‰ÓÃÏÓ°ÃIž³ëK^!)7Z5¦žmÍp¤íÓ|Óý2q–=Ä'²r1j›uBV¶Øh£¥.½çZ /â Æå¦‹ðÉÍ{h¹æ4ˆß¡·K¥fF]/'ª“EÊ–×HÉk­†jYÓœÒò°š\Á¹g·¤ꟾ`t=dBE¿É/ï³€ä¶ÚAüöJc¬hƒì0iNƒ”<Ë¢ò8´KÐˉ•Wï©å’r£UcKóáô´¯?{pÿ{Ç÷»à3à—¦̪Œ–ÁpÊÉOêÑo…¿á€– ¨X.ü*&Ýx~Ãh‘†'0D¾ñiöñË„CjúGÜAJ\)ÕØZÍNÿZçG˜G8?N¤›ž‰zÇö‚þ#¤é’p:Ÿ^r ¡®B›d!AY˜¹Îma”ÝâÊô+lFÇÐ+¸£Ô¦Š%—Ñôtyryqîç¥Í3Õ¬Û¼YNÂN á¬ìBÐôi$Ü»«zÁ§ UÊ¥Í/dÚü –6¿8u›_ò¦Í/­kšÓBÒ§ÿíöø!DÓþþ—Kú?Õ¨?³0‚ ¶@–;ŒˆløÓ ªàHügÛŸ³Æç¦q‚`Ù'ëf³«bRÁ —Á“P—‘#KG|°ÔQhÑ´ņ~´¬haÌmÎüÔœ:á/$‹Ë‚¼²'Æ´˜GBI.E㞘s'6·]U¤Å”w1b´æŒÃF„TOç`tcÅ #47´Ä5¢8|˜Rª08]KšÑbZš¸$Ø=ŽÞdRÛg±?â+Dõd˜—!°ã"¨ ãCsŽyuj;9`DFñCD¨Lv6f©!Bq/XªŽ ë-«KF…EÇ6äðyXÖm»Æó¹ Ûþ+ùÒ‚¹ÁÆøÅ6Í|AÜîÎï`æÂ«PWnd‚®Ã‡¡å¥U*‚¬Â½Æ)ïb´…9l"ö2Œ5#Z‹­Ç{XG#7v¶ÕnF¯¦!5ªQ?rtüñ=xüg»uAdž6ÇîDp¶ÒwåqÖ5 ^ùºÆnš†ù—±Ï¼Ø,$²ªØP彞Ëȷ牑…SIkÄÏ4*lkÝŒbYä—4_a7H织ªÉ²"ɸ.Æê냥ʃšfë\ß=¤\!¸žN®$YºX¼{(U8IÓHË«rƒ}âÓÇ+hNn—{¬âÊkÄ®=Z-ª±&œ¤$ö¥s3ï‘­•3ÅXͧŒ³r1,Î숻l1!™£ÆÉ¯å"öS0²´,L„$qœ¥\s¤äé¨_*9ñ)'ìqìiyXÎØU´* ­–5Íi!±¯û8iôÙLÞbÖÒ¿Þ/°¡û‚8\ciüœ|G%ºmaK§j‚äUª´kyY—ø(ƒ%ðÇ5Ü͉‰äÊ«rƒq•jN6ã\#™Ü8%øé ~©hÎ~Qöô8׺GãIÁÌO%$ɃÆç©õ(=ɃƒXjôªÑy8§¶L{ãÙæa4Pf¾qÒV¯étPÏ¢§=ñÝŒøRDh rDX>]J…†fì‘ β¢…u`Q‡ uÕ4ì0˜k/v1œÒ5£¿âºÝ…zù‚$ãØÆØ«÷Ñ^›‚;¿Þ´¸ùÍÐ’dD‡Ä0kS+ÙÝa怃Ð6Zš_*D{p1B„û6#«—¬R§ ô+†Ë # kYÌ{, Ô˽rþO€¸hyÑœ2•Õ­ùxŽ#%§}þì\õ6 =ŽFÊPåT¡¦BEa\6XÁEæ-©‹áp'á]e¨Ê†áó0ÊÞë*ž£V¶@ÈL‘¨SRX©EÆ_yèŠa ™tSè0º_8³C^Ø…Õu1ÝUk2œ a=Á(väU¹ÁhÌž¶N´–\¨iypj„rW«¡ZÖ§ì‹Õžö jnŒØµû[X4cæÃCEæ´ÙHøK…±ýH®ïÆDÐŒÓ~Œúh6Tx›‘îJ‘V¥9Øø=›£`$ûU sˆò~šÅŽJÑ””kNA!Å1`x çœrà { høþËŠ5~1Dh‚p‹¸æ$¼lç ;5#A¯ßõŒð¡"ã`ÍRÍɨP–WåÄ2Sò’(æ_N./p޼èÄrÞŠVCUÖlNOûRãl²ò¾8£¶‰§v°zclËЪAÈ B»À³Àë¡Wgs–&9Zpm‹÷Lõn†ÊCÁåÞœ SË«rCe.÷ňveDw‰kÄb£Ô¢cŠÑÓ:m~ÝûvGÄ<‡ÄÝØKXaclÿ1Å»'·*6Ú˜ÈðÖiCTñAŒõàõÖFb)v@’}ªæ´åÑz¡^C ‹ã‰ëí%¯”­«,U±f8=íëOð §1ÒôP¿ÚÛÌÞ*8~]Å>» O˜ôõ’#ä ªåá¯Eª œ µèÒ'üøƒ(ÏÙ›rƒq=ÎÚpbâì´T-®KN—Fµyj…Vl–!1.=ŸNÃ5M¦g°¼Ñä‘¢ìÞDÝá†oëFàÜ­% *ççR賃À½9§–g¹EŃºdà Á®Ü–¼FJ^k5TËšæ´Ø«¹~ƲšŒ9ÄÖXl$êLnÜ[…LÎÜ› BžÚ… E®·¹œ¹Tºþðb‘Hs*$ß!òªœTÁ8ËUAº"rAÈÑÂ$×äÌ?Ä× b¹Ñª1‘±¦9-¤å1Ê2ûË|Ùz±¦¨0šX´g±¢ƒ…#Ÿ¥8Ú3aÓ µ9’hO´ ¸Å–ÉÍ-‘æ´2”dðR1|ôi½æÄæ›Ñé+®¥N—¦Õ6e\”TXOl}[ÐÀ”ñb•ãÆPm]ˆÔÔ:D;’ŸU>Ÿ$.Ò€cc~3ÚMË;—‚§vpj`Û<õAUj0. ™¾`øÐ/HR?²àÔˆåFŸ¡º*Ë($§Ç,[·&g{Àp9 «¹r0,DZ7Æ\Ç,B®u;)ÕËszטTÌ[w 0nMv#€ ÄmתVxqZˆò¨ƒEEý˜Kþr¢VYýiyXn´*,!¿¶f8=íÓü„¿Œ~ñ%y@7A¼oú«)Yã°€ «=Ó¥˜®y_g!èàÞ]£h¼AK9| („ ha–*ký>ªK¥]QXfô KãáqLAÛoS|¼kþÃû ?+,ºá›áGñÇò¥ùl¿ãÓ€$ç§Af ’”•ME{ Ö´9’yUNª`uã›^NŒÈypjÄr£Õ¢kšÓÓ¾Ô4ÖhehÆÁèFøm¡fäÜ$ˆ›ßC}Ü„Nø3=Ί Ø'¹b"Ç ŠŠfnƒF¬$qUn0nOaôåÄTì6Ē׈åŽRCT¶D\3Zˆâ2¢½ømækâp¿–”ßæØX¼->“3Mûm"„Ê¡A#/Õì3T|rĦ\sZHûm–“ ^ím-Nüɽ–#N(o´ZTZ³9=í³Úù¿Ǽ‡¢21@ÌÄÖùú9÷lj„¶"á1F’ *™C¡ÀDt ³T•’M’_ aU¬1";.Ý.#'žy„5ÀAÇQhhÆŽa3H[æH{‡g'ëÓ7™X%2õ‰IžêqVÎϰbfZùöH ÷Õ Ao°ÎÆå :Z^Ɔw1Z€Âôm7ÞŽÊe„™$q|ÿFJ\+5TWíft–†½t¦#š+J‘"NjcQÌ]Oµx5ð‹Ü ´HÐ ‚vO†x-*nâ ‚4':z!-¯Ê ÆÝðŠZ6'n½ò±Üh5Te òh™Åéi_j™è[ލñòÄN7Æ•}´á࣠”­S“õÛãðNÁAÐŒ òƒŠýmŠ«˜ƒD^•Ë—gè£a]NhÏÚdä•="–­†ª¬ÙœžöÅê¸/îŽ#F`§ö¨yo‚.Œ¨û€í—ùZh¤› ‘椹÷“HeȰÒ܃„Ó y˜q©"hü‹“à k£%¯ž«ÕPæÃi¶Oó'’ØF» xâ­é„ó–Í^<ö¡Ã 06DLò„/£…´É‹ê(:ŒŽ---U™o 4θ¼ä5b¹ÑjQ[šÑøôiÓ¿›hF­2Q`rc¥×»AØîÖžtL7Ÿ´’ƒ ƒIéÍô8˜ˆÛÝ‹S#W^•«Mq¦c‚&z¥Ã‰:åˆ~dsÊB¹«Õ¡ºÖNiû´ZGõ?ç”";ú®3èüHeß5'x£ü»qE©ˆÊð¡@˜™Q 9²è¤ã7B›áaæºT8;]ƒ4§ƒy–[î?7E‡ToY›^y±ÜÑê`/Ö4§§}ý â¨\wŽ!÷€×(MwA\žŽÂªG×ÓamŒÔ¯nXèN½÷Š£#“/¸ ‘‘ߦ҉õ¡ñË©+¯ÊIŒ32?œ4ÔüÈG4Rº—V;šoNOûüÆ¿9—n§4¶ª„~p«<±?ÚåBЂ!ý€±~ˆéèª ÀoìÇ®R¡²Þ†MT·p4Õ^„ižmÂbG¥ƒSÊäâTÆQ\ÆzsÙóÚF}äcò`£©Î ¿|Ôê‰ÛðÞø#ÕÇ9Q”¤¬·ƒ°|¬êM¯G 0&£…A`䵪¼9äȳܪ™'¨ª¼FüZ`¥ÕPæ Åi#ÓÇ1G¢§_FJ)Ä Kúïæ‘ªîùEüM„ÐFwkOÚ‹$…h¾‰%ñ½cÕÎÑ>¨@ÈUÕ=œiqU¬ˆT›‡O G Y±4HD”6:L¤ô>Œ6 mÿÃÕªDݾwvrÛ¶ƒ‹ åÂLByño,ÈWÁÅÜ-k„0(H®¾Ê¦bÆÁ^§¯ÞH3HÄU¹Á¼~š ds¢y›ÎÞrK^#–# SZ CH+^÷XS¸ 8ÆÙÊO€Õ±}žÒä…=ÕdÿCð«"޹=ˆ÷bÐçDÃŒ·a;æHà%æA)¨¸ÿ°0Ƙzø—М S˳ÜP1Xð¾ÏæÄØ`Jgy#FÞ”¼Öj¨üÄmMsZHì‹3!F} ¼\­n,š¹xã{*Ÿ7ªèCu<J€+,UÅa£( ÒªØ`æqGxy'!aÏWˆ m‚ŽÙ›Šh“ÏûùešÓBZÞÎób¤ç2†Ò5Óì ÆpZq¾íÀVºU@|°Þº<ê€ÕÚ‰“6Íè‘V¥Oã.HgW€uQNM¶¬Bô¯F‰hI´.F (avóqdÞeŠnx‰O6žw ò/$ì˜ÛQ©=÷o©…OWï8Þt$…Ïp-€½¤%Mؼ ‘…—ŠºÓÌň™„‚®´F7* ÕѺ…3R¥-­#Ž ŒV™Ç°×ØÝÁX3ß#à\ÆäÝ®7f­s>Ïü…Š™m.N ‰h$d·b!hä)D,*ŽRy¬ q r€–VÅšˆI—®ºéÒ5T Å¢s•ZTcKszZ—>O°îœžöÅjV²¤.«¿z•²1rHR± Ü#,{phiè 8Vöc÷l¡}†¬~„ÌzZídN´•ƒD^•Œ-zg€{Jrbieʕ׈åF«E5Ö4§§}Z½²²8`7: ÌJ@ai0‚ ÂpIŠtÍÈMvHLxÔaÂâjKñj*†YV,5£ (Íæ4l0«übÃXââVñ-¬‹•JùBR%Új§eHŒK_•Ï—ŒÇ¨ÇT“} ?b±Ôte ðy†Mr…Þ0 §Â  Fza"øŸe;Œrtq€H«b1HhêbĘêŠ+Ä9-¹˜XÍ£©Æ–á4H[§ñèrPs8¸þî|¾1Ö´zT}†0µkàßÐbN‚`9Ùx0ö{ñB“3Þ /N Qž3Ô¥B×$°Q7oÉ+$åF«Æ–æÃéi_¬æ” çpU”¡#Óù‚ÏtYÍÂÏ$žÎ‹Žêcv=ˆ_>!H¶âŽi7‡æ´ˆ³ÜÂL¸‹÷i 't÷éZ7oáÝHÉk­†êÚ"#Ѝ«q±˜ý›ž´z’Ù:&oŒy › üx E*žôÀfOÃŽƒ ‘@\Ì*] –R5§…D^•“*šÕåéË Ï4Ÿµ<85b¹Ñj¨ÊšÍéiŸVß|tFü*Ÿ“f~1¾üç;ÌÕ>{aPñå? IƳuŒÐ/_©H<­ùÉ ]!-¯Ê ÆcÜÖˉ9ƒtY[^!6±«ÕP-kšÓBb_*•MMºøPÄíÛ b· ðÐmd8cïV9Þ„M¥t žÇ`ÜnT 28ä0¡'œäƒ(Î.J¹Áèœ*ºœ8AÄpy…¤ÜhÕØV¼½—ã«ËÊcBT:à q‹œûºsˆ/nzÙã¦8ÞµS˜ëÊžä„ÙÅKÍ_øÓƒ‰p“ïF¹f4H‹«rRÁ §Èk·‹Q´x(À%7fh‚Xî(µˆÆ¹|Zg•ÿ"Žp"uÜÝ;Ï|NˆÆBüÇ^ÇUˆ8Më‘eï3ó¤ìBP ŒEÖÂDx‰æÍi!Š«bC„»m|ó0zg]ÎKÜALd}”:˜È(ÞœRâ@Ñ­ÈQŒVd+H¿uCäiÔƒ#¨äf½ª³ØÇ©!¬Cºt#KòÅð6Yšùܽ̋ÓFÜyªbMăNëaóνƒ_×* ã –F(5*l©]|¶%êún¹eŒGǵ¼Y1œ˜]cÄïI³‘è$ Þ¯ãmã_ÌKƒè…½å±ÏKńüªæ4H˳ÜÂH‰À3¦—ê¹µÝò)y­ÕPæÌgÅi!±/ƒá:$ª«‰Ìf÷lcDõj ôqµ§ª€}¤.â°›& 3ˆ¨Ç+ó0Ú@¤™gõШºÁŽËÆSv|3‘ÖH k•†ªL¡Q §§q¯Óš©ÏÞ]”k»K@Fø‘ÒŸXÁ½d´”ŠÈAA&RÒ¤\Ô!tÈŒ…‰˜‡Ób2 @Úl¤U©¢Ac¦ÌÍ«û·°F,V*ÅÒ¦S†Ó m\ªû\5ŽVv%L>W©mÒDu¼™ #cóÕ_ÈMê AÁ\Ž8@nu69¯ØÈôÒE¥Z-#.ŸdÛÒ ‰§8* «öäôq1™ÃJ\peòÅ\7©{!y0²yòáA¸#P£®ÜXúÿr#å‚`4ä«8¥ÙäÞœhQž=ƒr1Ý>YœXXÐÊë*uÉ+$åF«Æ–æÃiÙûb5¡– NÌ çŒcVôÆð`cŽëÄåFŠšÙ¾»ˆŸÞˆ„O„¼P±ÑÞÅ'[ZWV:$¼_D›j.´YÆî¼;²b±£ÑÁ^”nNe^A›ƒÍ‡i„S?€ÄqÑ/Æÿz~“{Êœ«,¿ƒw“ñ×¼<Íqü• háåiî{‹I´¨ì›W¤9 ÒòªœTñWˆßñ=/'B8f";ò¢gËVCUÖlNOû´únžt{Ħè²Ìš†ØàfZ>1žw 2FŒÈ¹Ëk^¼ ޝö˜J¸Ÿˆã’¯¹„B€'¢÷}†´…Ìö‚eH[œz°iy3¤-­†ª¬A^iÇ–kŸ5ýºWÀ&DÅÈZI0˜amcߺrç±¶-ûL7 IÞ™m Üá‚éá@¾B“w>DšÍB"Ì â`l©{šý¼^óÃ%Âoß‚»Âpl ÷ƒO›F;xfiØ<-kãsÂåîé›Û‚¸™¹?Ü̈¼&¤¤3ì¥N·Àe6WöEh‰ºè¦¸~¡JìÅ =û'G^•ŒóD†m‡CCÂN-/±Üh5TËšæ´Ø—ÞÎéÛtYhì––ßX´'Y16‚äUµ§·Óÿ8|”—fA $±>>s^µiF a™ÈÚ¥¢ÆÞÏŠò©gB8û#­{ûÕ©±¥÷0*ëb‰â™ÊYpÔÊåˆYyøDßÈ÷ðœÒÆ®rM³$8ó "Æ.V‡DöYKønûAlý`$r_˜ë ß…bÈ)N Qž“ܦâ=wœÀ¹ÌN¢¶Pc7¬Ï$ÏEð‹ …A|†¯Á²ÓÀ£­>ŠÅ\œØ[:ˆòlº”kÌ‘…á„=Éwµä’r£UcRµæÃi¶O«_†z_7#UØJÂÆÝKgø…qÖÍ %0n@Ú¶¡4ˆùL¸î+k9‘' ëm“¢¥­›…DX•“ ^LÔ á^N´â¼iðéß–: -’±C6¸ËŠÆÊ…Ð' ¸Âë;¿õáÂtÂéyÆ×AàÏ;á36=òü/K™‹Ø½yì—èÍÂ|6˜™Sï”kNƒ”<»÷¥bqÍÖÓæDÐäÓœ€ðny”¼ßÒª0´ZÖ4§…ľ®òšàþíˆ÷}±oÃK<,ó B† ¦_Ôˆ;ìšÅ`ê8,+郠#‡ä7Õ›¯µ,NL‰¼*×kd›kq“º/yXn´ªÑ|8=íósä!ô²ƒàË`5Á?öàTÖÚeaìid K>“DFâþ­cCxë ƒø›}sfBø6…DR•’Šüã~Msj\>~'w¨=ÿT²±Ü賨´csZV´© ìzÚ8A |tg/,K®…*œµÜ®b´çþâ¾2»yZÉ{O®­J\#ôô«ÔP-[¾ê½Ú…”8LfzÀÿÒ`6l³×pì5W¾ |´Ò›P«1I>0«ü²WÀÞ}û<ß ¨â31ðUšÓ -Ír ãuÆ 86'LÉ=Ò+¯:ÑÒj¨Æ’æ3¿cÙë4žM _Ãñ˜s˰±| š ¾ Y”l ©á}rÃaTqHàPzÄP9!¥#º DZ•*ˆ¦MÐÑn³$ß–8P ƼU½Z'Ÿ’ü½¿=×'^hL…Ö͆«bƒ¹_Ç™¦fäÀä‰ ;€¥Z¡½Ø‘m¿ƒPmY¯™Á‰ôð‘ÐŽI†sF1|cCôWø„œT¼Ñê-G–î=ˆŸŒ³ä ów6éè”kN QžŸìRéþ2W,NLÒ¿#W^#%¯µ* ­Æšá4HÛ÷ÒÔ½ïÆÛFT§gˆxÕs…ñà‡ž=-“œGŒ¨œ b}ÌÄMðL„Û axã\ÍÂ<’C„ˆ¡õr*äʳÜÂøAüõrb,à€ÕȃS#%¯µªeMsZHìKíszŒóztpÌgÉB´14£fi®uÝM @¿Äx.‘‰APŒszäoÞTæl¾|YûwdU¡‚h ÆC ¹À[² qüGE²áȺ1 Òœ)ÓÒ½½žÆÊ[:²'0\yf¬ÒL/¶yæëGYH€°ùô‡æw¸‰±ò¾X·´ŽaÄ¢/@K«R¢½197›ª¯#.a¨.b±Q©±¥¶õNeH8ŸÔ1'g¸«Ï8ëùIï?¸ì^o2â£è‰2¸ðN‚ c<Ýoúå há2Øg+ùøÛ¦9-$òªœTðÂ!uÌæäƒ8ß‘ïF,7Z Ui¾9-[ZÞZv#0Юe7©ŒìŸe763®èµ8ZPßÚ„Áe–Ý©õåt–ÝG\•*ÎçÖ¢¾ð6¾ §W^#–­†ª×Ú0oFˆqÖ³ëV"x)ÅEÙ‡7صƒÐU´-x¦i.̱ Î÷J•Ю ÂLÖîÅ|2uá‹SÍÜZ©dÝö-LãÖúÁD¸Ð_ƒcsZHÄU¹¦2Ô뇾œRUxiW^#–ÃæÒj¨b j£à?ÐÞ2ds7‡MŸ™éñ»=²ñâ#Ž ûÔ•³!ÓÅEt0¸ÇF–‹! KÍûÍÉîF"¯Ê Æyœ²Ë‰97^ٕ׈åF«E5Ö4§§}Vø„ÒÌE fÖÁApk2|oŒ'C^c¤þì U:( ó%bÞýÒ.Úë~öf|&¥F0n ,*Ã!y‹˜/Fài½ÞtiØA$„qÙàyz²eåc”¨VèÐ,eC©BªZK–ã#nf¡¦å%ŸáṲ6q°ŽK5øLFLÃÄÞ (‘hˆ©}..0 ñpoN ‰¼*'U4õdÖ¸œtü®¸29“¯´N—fL‘M¶qqÈXgs¹º4¯¶Å'ÛXvÝ _|Õ“6T(G´pÀýRüê¬êyᘠ½!\]¿ìæÝ a¸›êhÜfDÃÍˤWZ#ˆ»*V1–cJq‚æÕ¸˜ŒXi)Ñë…–­zc_¼¿žKZø_Ý7©u(8;<¿Ñ@9É3áãÎ ¿ñ²úSæ ÷FR—‘T¥šŠH¶×<ÖjŽ€KV#–cBx-ª¶c8=-ËL5n™ëO35È‚IéÇ3 ó±TíùÉãh&BÑ…  iŽ#§nÙÕ$ÂBÚÇs[ Œ 4ÛÈÆHîe±aÄ\ÄžjÅah#–¥†jÙÒœÒòèÒ\Ë"9ŠCž‰Ëln UÙ qy÷u†Èt©a6(Æê… O6±@T³CÅ©Ûüp¢c$òª\cŽ/Úx9Ùo³ä5b¹Ñj¨Êä §§}VùË9ޤ“7"ÂQS¦aÆ ¦0SÌì¯{pæwú1îÇOOÇu`…ŀ݈sЇ©òâÍÁÌ.ŹTÚÌ›ÑB§{¶©øÎ8cÃÉIž+kAJÞAJ^”j¥–ÞÍh!±®?ÀÛËTÆR÷€f©žìæ²ûÅ´™v /…0áa‡3×Òí8i½´r(0ðw¨ò'§ØÏ· '¾T!%ϯG¹Á¸ŒÇG¿œô†8·ä’r£Uc/Ö4§§}éúÄ*ÙÏa˜ÆB©úe|NÊ'&ßP1„óèo¸±)8_öJÅkêÖ=Ø‘¾b^D^•k*Âܶ‡Å‰¥O°ä5b9VÝ¥ÕP5Ãi¶/V›n×[ÛêÅáªølÓ!72U./DÙ+ç:u^µ˜ˆŸŒ}€…%îå¥S©ŠóÏ" ÛH\aÔþyÚ³Ñ }h‰k¤ÄµR…ÁilNƒ´u±yW¬ ºD¥~=ªž,…sýbc¾ŒÆ‹¬ª&Z ä®Xjeó!AyIÅ)\ÖŒ,”ƒ4§…(ϯw©ØÏxg±´8Q… py…¤ÜhÕ˜TmÍp¤íó3Ìåv8BU9Û”7„O쪬qcûFÔ´Ï+h ¾Qk,HÅÊ.§c‰¸*×Thê@³8Ùlõ&¢Æ`ÄrQC«¡:Š£` y°GZÝ·™·7³ÝÃ_óý™è¸ª1=•dŒ¬ÏwE&Ž–tøK@•„Éz.fæ©J‡UsZHš—åëJZœº"—¼FJ^kUXÇk°N»Ù–t㢲‰TåV[š¸iˆ0yc,û=ì‡?bâ8©ÈËLuƒ°¯¸tKîúEåV÷sA Ÿ¯5þLA©3Nà«_6,:š×² (Q­P DÜÚæÐbó´¬úød¡°ð‹\òAÆi'† Ö­C]@Êÿ¶Ò¼§+¨ÜC¸Ú˜c†êùImõj[Ú;½ëË lΊª â…x™‚p4Ĩ8ˆÈˆj¾'Y§´FœPÀðƒ&‚wUsZˆâôy.{Éz9™Ž‡Òò±ÜhUZŇÑÚ8-¦Âã¶ÒÏçØÒ#>꺉ûÊ ²Êƒá9þã?FqX÷¤òÓCåÀHM@CjŒ€ J%þå´åù/•ÝS÷õr²Së¾^y…¤ÜhÕ^ÒÑ|8 Òö¥Øe= E(Õ@qAŒ¯o@•|gJ=„nÝ­¤‘e«ŒðÆÅ‚¸§çghFô‹-­Jˆ°´ÛžÅ†$0Æ+MKX#•†jÔÆäâTH8Ÿ˜LÔ.Gb²³UÅCSÞŒNlÝ*ÜRt'-¶!H÷ ¹$8Z€qiöAÅÌåNlׂÑÊ«rbÑŒ³ÎlNØãÜwäÁ©Ëq0·´ª²fszÚ§Õ†ãäÙ?iwwh¿›É„L@p+p¢c#Ç9:Ðh– í Âpc„0çÏ–¸¢ó‘Tátèyho8²¨è³Ú¸8á£zýÀXc‰+ ¤µN‡f™ÒlÒÂ0™ˆ!C›ÞÕ&7IQ„œÕW¹.ˆ „‚žåzl}†¢bHp4ŒÉÅ©+¯ÊIŒ”|ÐË s\:yùTA,7Z-ª±¦9=íKó6´ì)LÃw잨òtí…uùðXÍH×6\ÈÞþEtÕÁȱ±º¶뫚:Ò·2û³O&ÙœºßJÓò)Ý[«Cµ­)N™Þ]A<·û–ÕÄ*µ<6–®‰ ¸~m«Œ¬Œøç; E‚‹ê&’l÷—ÑŽÍpºP†¡Åæc˜"é÷Q2CœÂ yD¥E¥ÚiÍi 9âèÚ }úšH_`«/áÙì‡oŒ€0ûØ ¬ª{ ó´²¾… ŽYsò’6¼Hv •3¦—w@šÓB"¯Ê5;nž_^œ%8./y…ØÂ®V‹ª­NOû2²éã"dµMÎo%'ÙÆ¸“\ñÀGyr„Z€±·P_°©8ÝÇ©³Í©+Ïrƒ±v?‘Ææ„ÿ#d-N”¼Öj¨Æšá4ÇZ}9&VÓÉÁe3e@«+͸º â 7ı‘ ·È½“ávøAЂ(" Þƒ‰ÄEຑŒÐÒªTѨºWš ¬Y•¸vX Ñé»*5¶ÔNe\8i#…§@z»øéDL!îúîP™ý!C€8À 9‚ðÊ:Þe‡cgÔ™ã¥:ÆËi–Wå Læûsþ…V}9á"çTNK"œ¿Xjtº4oÄÙ$N9HŒKuÛxÌ=m7b¬˨w0’3¬äcȉ¥lïècRǬ6SïA| =šÀzªzeîÍÉó^nyUn¨Üp[Œ0Ë]š%®‹RCµ/F ˆuoPŽSLx êPõ}°X˜ú6âÇ™¥jÙ©]Î,-%Œ9š_››Šù´?ŒŒpÎ0µ½¡TöbS¹dP¢TͲ£Ù,d*;±ÅìŸb/õZ7 ˆÔU’=!@vÞ¼¨FoAnÌþi¨TûCÇìžpÂÕG–ia[ç>¨Ïˈ^›Xö•Vˆ³9X«4T¥vª®9-$Æ¥Š]ó»Q 1œ6Nr¶1ñྀÐ`”ä+e" PUAЂø ƒÆÅxÓcì¶¿T]@iú/CøË6ëfðDPi„¥/±Ø¨´¨Ú”áô0.#¸A·yFÜÈٮ̆¯Š9ÆEj*žHïIÙÛð"..'’¥çu1—*"bDgzê§|+S6F-7ƒòGZ#”º:-ªÑÛ“3m[šnË¢Sf$CSùg¼‹7ÆÕ9Üæ#]|à1¨`1?\¶òÏ‚ ƒ¹Z ¹l"¼çqnf#b.‰¸*&†b´I2h,F´¯ש- FX̰btªeKRqük]FqÏ zb>)ã$“öÅ <ª b¼‰köfœ0ÒÈB†Qý΢d ó:Y‘š(×þ‹ªù°„*¤¥±aH¹ÁH¤Žct9qTwä—¸wTZ4ZBî]zRñyÚ¦Åÿú¨î¸cJ‚­w–[gµ1˜ª"Æ™ ¾*y®@~ ¿ÚÍ~YË€u/”ùŒ¡‘ QB¦„ƒD˜Å£!9Ê.F®¡ –´BèUb­ÒP)Ãi6.µnû¯ÏD<ס«¶0þ.;PÞ]8|wIˆ /%è’I¥w¨r˜‘‹&$C£\A2€Òl-ƒñ‚øžÃ„Uu) 8žðh„r¨PJìê=œ¶%-¯}µÜ‚%VÇÚ+(À²0W‰CgE|µDqS´¢ª 1EfóƒX`TøÅ@8…95£Ž4K]ÏÜ f±‰¥yaC„ó£ð¡XFLsa†Ç”æTH8ŸÌežùc%nDæjsxadãÒC¢¸F‹îÞaÏÛ'fAkÀÞ’«ë`†¹}E…£k8½ ‘‡öMU6æuÊá„ÆFli <85RòJ«ƒå#ÖlNË––Wg´;GG†”ù¼ŽêTF o0‚Ä_@Ìjóv˜ÊA¶ÔñH¢Ç‹ý$MÅòÜ|%šßœBH0ŸrCE½ñq‡“†¼u%¯§ÎÑjSæÍiÙÒò˜ÎˆÃ¼í ^´ÉLev‘0:ˆ Í€•„MÈš›³áA"¯Ê5ÆpÏ•ß2›“{Åtç%¯ËV‹ª­NOûbµi¿¼léLÿ£ËÕÃý67Ö;šÈût«•C…•ß¾G30r•–k#U2“úM‡·’ç×¢Ü`Ÿ¤s؜̻Ä`©ÑéД)´3þSlžÆi²äÚ åú 7탠B]®[¨}qo-)æI»…ßÕ×€ pÁ–…ÊE‘¹¢úËHr1ïÊXLF! CK«REÃZ”#2› ›`ÏaXŒo‡J°ª1e8 2â°†Iújš!ÑKŽúg3¼1¸¹'Ä -Õ·'q"î‑g¹Â¢°è»œ°Ë[šK^#%¯µª¥ysZH3ÖtM¿ÿí†ÊH×"¦®‹9³)Âá +ŽÎfrh8í²´0Ša×\T dÙßœ ©¯¥¼*'U¬&ª…Õ—CéuF^¾VËV‹ª­a”)NOûb5IõÉ FÀa€Ó¯Yp7Væ™÷+.èpöåe’^áC èAPŒ1V©•ÐÂèGZ+""]õȯ`€”TÉW\#~«Qê`"Ú’rÍi!ZWŽ Ù?òè/SKO\D—.–‰Ëqoª o eƒ4'«BJžSåcáïw81dP0HËkÄr£Uahå!¾¶¦9-$öÙÒÏæÐZŠʰ‚ñ ¿=°Ï„ÆBp0&$>ŠÖÇÂ3v¤&’òKßôóA-÷?Z 1k¢HdU ÷æ´åùù6S?Ÿárb²#€N-¯”­{Ѽ9-[bŸŸáŽò.;?¹Ù®ùíÈ=£ù³ ‹¾x2Pq¿Ç9‡Ë<,– B{v)š÷¥&Â,Ó·8-$òªœTð"Xà{Ü‹¡=W -5 °ÔèthÆ”bSI“_ŒË`Dz€g1­9j7Ã!~cì}¸%ä’ ë—ÍHÖ…4Öì‹4âðà ŠVEà‹*Ì›ê$âL °0¢'ŒçÜۑßÒQÚè´¨´%ÕÐŒžÖÕÏÀàY…&s]ÜÂ,Ø"`0e@á¬ܸòí—!釿4‚ ãD3–ìÅ:÷5#fˆ%Í!Òé !tbàe“oÇ7¸Â±X©Å©“ŒÚ„õ‹ÓBb\š8mñõ‰ †ÂÚ{càæ€^bnƒÕI OÕ£¤ìPò ²KÉ”‹q¢Ã}™È«1 ܹÒœ)y(FˆPÑåD¸‚8VØ–WHÊV9PŽ5Íi!±ÏÏP#}Šá™ªÌÁž £ µñ ´KÅ72ÔÆXf¼ú ×§¼ît©h ~QføÌïȲL#täÿøåˆi–ì–ÔHIj}†Ê±.v §BàÔ–¥¥;xá¿ r®6B/Ä2ŸC‡L²$axöàã [{ðj„¦ÆqíUÝÕþâÄpF\àŠ«rb±ð—D6'ªßÌËGå±Üh5TGqZ[½Dr€6N‹=ÔóßÿùßöÚ Œ¸ÿ›âõ·…1+ÑÑîx,B"Â6h¤è@F$óE£ZÌeù´Åf!Ü {·ŸS¬©ø1Þˈ¨Q°,…ò9š¦tÎGl6Ë …Ñ-Xž1à Ù$»“aïź+Šp!0ÌÒ§¸ÔyPñHíôè<¯]DéÑ’4Ò#H,ýð2ê®z…Mn…¢µ~tFEFI^-ëÊÎ-:'ðNþ`gºÑÊôÏüŒôé~ó¨׌h'Ó¿4äŒàÄ^‡ëüûá5̃‰pê9€ŒØx: +Ÿ¨REC )/:\6žöŽÕÖÇ‚®J‹jLiNOãüL$/#;!bÉŠéãö„¼iô ÓPV+ÆC¸W¡u>Ç£k ‚ËsÇ80T»'“ rÍi–g¹…ñT×G9ÍÉŽM·[ò)y­ÕP-kšÓBbŸŸÁ r4åñÜ173³>¨9‘/ v›Œ5à“‚ðJÐE¬C/P¸ãz¨‚pšÖO¹æÄP\HÉókQn0b¤Fz†S" øÎW^#–­ ‹VcMs[Ú¾tx?¦!S¯¼šK‡ßOçT*-+4\¶|'4¬"‚žXñq¯¡aiËô‘¹pzA"¯Ê %P³—ºÒH¶¼BѳµZTcM8½ØÒò漈¶ë‡'<ê±1²`1Šù5<£=„Ö°S‚`ÄÈåUTŒÁsðÝm­nN ùFmä…*g£'o/]ò I¹Ñª±Í›ÓÓ¾tô3Èù6¬U°?æ_ŒÙÊ7Šö9o~š†O›ÿg f€å~Á`FW8ÉDO¹æ4H˳\að¢+ãèp¢{FöÈ‹žAJ^k5TeÍæô´/Mq”ã=8™wX3ºÑXF"l cãÖDjhÄA C5™Î&Bð«Ï°v8Ͱv°èà`´9õ€µäͰ¶´ZTcMs[Fž'!NÒ‘8KÐÐ9mók›¿˜ŽufìƒA¦ÁœÅ©Pzá‚ù`\Ø¡4gXXš4ÐŒPÒl¹CÇ¿n‘^6í`-ŒoÖH k•†j™Òœ¢qˆ«ey®z˜‚³:­õ÷—Zbl¿X–ôŒ¬¸l1Ј  07€#44o¾Kvi@a€v#›AZ˜Åö‡¾Æ|=ŒŒr¸?ÒÒ)q­ÒP-SšÓBbœ¶{˜E©"þdξ ÞÁcváôþ*u ÑbÆgöÅ.‡cgla$Gc}ÃW¶\qÚˆâÌ:D,¯Æ_>îÕyn÷Jk¤¤µNCUz“éÿ0Z†D˜{º#‰”ȲÀÅ#Üãú  õðbÍC&ž÷067:p–#¯ú&âkÄ¡jN…„SäU¹¦rÀg¹·8±60L’S!%¯ËV‹ª­NOûRÍàjZkïYhãm…¡*š‹Q„þªöæ4׬l‚ÆérfSáq²Ž»œX%zì=_FyUn0FW¥Ã‰ÉÇväåk±Üh5TËšæ´n:*Ï]$inžD/öà_¯P¡+{”F¹+}YUí YÖʱ&ƒ0¼¸.ͤv0‘ºu9-$òª\S€ýrðºœ8R•HËkÄr£ÕP•5ù¦Íéi_¬6¨ÿʶëuFð‹Q×>#(ò¥óòt"ÿ\»`F;Jà«pT³«¿¨8‰AI¹f4H‹«rR¥ óØNt»¤jy1'ˆåŽR‹hl‘Q‚xƒÄºØÌ>ć—[loa¦«²0NPRÓìá²8Ø•ªI”D€ù"´©>’¯ò|¿Ýð>²åš5våégzN¤0úâ'ßhq¢¿zûH¤å5RòZ«ÂÐj4Nƒ´}éÕ3i_ÌE]Z M ±1êÀ0Qdxž(ÂãÈ€™Ûg@¢³¬¸ J¹-vØp c!VÅšŠÆç˜½Ù5µýJ+ÄoÖ*-ª6e8=K‰ó´¯ïÔMYGit$Cc5}hõ ÜvZ: ô ¤C•C"8]ú´íâDXå Š³{,Ì8‡›¢—Ó0;h9ØÑò I¹Ñª±«ø0z5Ži²Ý߆Ï-¡xÎÃæH¹ÃÚ Æ˜ÂâˆY°>5 Ç3˜d@¾H|@êûFäE¯ç$Û¦â[9BÔŒ.i–:cš;.—£•×[|)a­ÒPDt8ª9 ÒÆ¥¥³‘»\,3iŸttL¾;¦©Èý¢þp£›qw ÷‚r½ë |ïå-âÁD•iL”kNƒ”<}ºKŶ®CØâÄö«mDZ^#–3­ C«eMsZHì‹Õܸ!=wÙC*ÛX}1†ž¹>Ä“hï¹£ÈÞùá„ÑEЛAñ6UÍöƉ šFX#(¯Ê Æü§6œXñ°M¶åâ×BOÖjõ´½Ë®­»’uUßO±_þu›ëR¦€D QàRüHˆD‚,ðú´Ö#Ž1æ9èäÒɽFŸvw„íÏ—p8|R]É |¦tyZXøÞ‰†ééšîº°8cŠüüá T—&ÃÆO’‹ $¼©bñˆOŒµÕL|zɈXžZ“o0–Fè8LèÃÙ kà〣†"Éw¤:؃äÍô¬_Æ3ïÙ…”‚^ˆÁБ0EŒØØ28G*}Œ–ãFnD’Ä[êŒK¤áyö›&fÏ˧(Ö”b ¼˽E &M‚m¯¢Re•<Ë-¢£G3•f0µfÑW« ÚÒ—«#®RSR^ž(KŠQcÕŽ/ºÍ(Ø”€ º«™ç@a.¤i¢VÙL±ˆÃMå"yã8&ÇúiWaîßG b‡¤‹aÊf’ ‹ˆÇöÊuaÔ;…ëlb|Ç´’fsìKQh°/º©T,™h¸ó]ÓF,Ï>±1ž—A»a¢åp¾§}§¼ƒTy%UcHµ$o¦…D¿´/ÓáXÙù:\UÓ¾£—k@„×ת׳¼f•à­ï—XËAŒ¡da"¬÷ª÷4Ó ]^åëT,”y‘~3±ÈsG°Ê+ÄÚºRMª¥M3-$úeÄžqIPh"NXXU¿±T A²4£05hU¥ŽröÜÞI\— ŒzòeVl(W]èiéÂ*[§b¶Â0´ˆ˜†¼µØ…EÄæ:MšÒƒÂ†f!Ñ,ÍÍ.½°â§îzMâµ1òöRB„ÎΠ$k‘x„àN%|äËŸ„ß»L,•Ò«’•ª›©«¼Y–,©Vª–|˜žõSë‡C@£±-c|Ð\aocÞÚ 3K°@¢ ´¼0®Ü>hqa#ÄE)ª®Sá$Ÿ{3¹œkÄòœuÝ@,Q/“v÷Ÿ·¼ƒ˜ïHÕX¤mšéY¿®‚ç£1*‘s ˆÎI¤³7_ë@øb²:!Vc¢Ùià†:RZ,‘Ãf]9^P/Í´>+Û$buÉ‚èYy‰„äöß»ªNóP“j ÞL ©â4¢¹ê3RÿÈ£ÖèÜX4$$Öø8ð™`›Ï2­DP-w3Êe§ Ê0P4Z׆ȕÂ*[cx.㥢|“Ý”†Ñë·æ‘Q•äk¦Aª<º™f4F£/T‘ç•Zš.Œ÷WX4‘ŠÐ+jˆ ‡Ñ<&,Î:.b§Å¬ÅiÇÅ‚6¥tl&L+Iy•o0âuê%7LÔ#óù.¯óT“jIÞL éòÐS†+?B2†?ñ±×hÆG¨‹Z3ÿðòHœrbÝkZKèäN$.±²7“ûOŽ¥OyÖùÃN¡Ùn˜8±(Ly˜o¤*,R6Íô¬_Ú:Žk†XÔž¦g—âØƒ™Ó¢ÃÒ†5ˆáJ¯5úY™ÓôZ»ˆTíµöŠ¥+3æe¢Íõc;ÅU¶ˆs\Ö´¸¿™(ŸƒÔ]ÜtØ%Ô¤Zº4ÓBÔNݵH}ËR¶8Qig¸ÕìZ·xSIq®øÆp&Bê… <þ~[• c–Ma}Ѫ4d¸iÈÝe5 iÍ}ʢ橲Z¢Iµ4)¢¨Z)Œ…*“‰õÙ¶V«LhbùEbàLcùakýÊô2B€%ˆï`"yÎj1-¤?´‡T~Ž›©?ÙUÞ|ØKªIµ$o¦gýª‹Ÿã/Œ[ßt-ŸîD{o,cp.;á—•Ttlb,Šâ­@ Uß"@ôí½‰V”wÚ¬Y‡ò¤†òD0Âyc À‹¨éUÚ åb<È«H…ÅNתô¤ð HOtqB ã{W%òò©_õ†xz7L¢c×ÈG148V³…ÐàlèqÇ“Ši½R±‰I§E J€ôU «L'Iö¸—„Í®Oñ®¢1×TXD=ŠèI1[úaÉÆ"×ÖÎ<ž.³ÞB÷Æâ\]a)mŸ`'ûÍ›l¸äáݱûá>ê!VX_&@ny•o0±+&c:ÑœòØö6b¾#ÕÁŽäao¦gýÒÙ±bsi…‘÷íÄÔbkŒxíìµ|?H„°§t(„¹!ìéB˜U4s‡&\Š¥¤ÁbZHÊ«|JOf]f.›u§î[\æ™nU¡°¡)åR¼…e¹rÐùÊǩà#?¾¼IÎ÷‘E;ßû`žbÂC‹–x2ç‚p0Ruéø¹ÁªNä”kÀJª°‰bqNèdëT2Pæi¶  Vi˜­d‚¼0ÌŠ#÷ ÂîXíÒþ|:l JPV3¹M¶1ú\¬ŠœÔÛŒ8бª`Ùt¬‘A°øšÝTc{DgˆXcÒe1F¦îRÙv"Lo´þ%Bäóèc?Ñ/H§PpMª¥K3-¤ËÓ¨è1¬k2û·«ú|cÕwíØ"\påûDEö0¬Ñ1òqÕh!H†qya"¼ \|+ÅTÈ-¯ò™*öqÝƉsKp‹ `÷¸24K•¦YH”³™µÄá|Q*[.]6fëh,$ÆPé’fáRÝBkÀ°ô^,Z˜pK—43ÄN3o,³ˆºOq·I«¸jR-]ši!ÓÌÇ‚˜†èf>Xª=3†¼ÓÊÞ ™fG†c ì4q×*«âiãkg<}ª²Mª4Î%ªæë²¢¯Mnž¶+:†ø»Ìˆð6ÇB¦]²èK!‚ª1ò8,-5o°ß¬‰ƒÔ“‹ªäR!6À¼¹ØÝMK!_—cÖIÒ¯¾è«#ÓFR^å›T>GËâv˜hE–»¼Fȇœ-ÕJ5’Ó֥ˣ³]çi¥ư¿æœ{c,²vaŸPuÃÁ"VZ¼/b$ÄPz¤¤ ÂI8Ë¡™<·kÄò¬-ò5–sS–—‰?áì2å5b¾‘ª°HÕÚ Ó³~¼¯…Ë™ž Ø3—=±tÿL8"õø"©2)ˆ,­¾sâ€Õã‹;[/Ìÿªïh‘[^åkŒ®ëÔµ˜z¦:å¥Ãg63ßH5©F›adÍ]Úøp<Â͹°È¸`k(‚ñ2m‚«z‰šøZy ‘pÿI!7ÎåµZMª¬hán"¦7—¸]Xe*„ÞʱӰ†ù˜ó?â!ñåUY…XÁW¢Æ–ÔÃTªÝÒ8ô}X®&‚8¡¸ˆ¼ÎA]ÐIŒk¸ÃÆÐPö½!š*Þ‡Z÷ˆŽ…kÇA˜VÀX ÛÁ´Š‹/¤™’òÌW\Þ2רp™ØZièêâ * Jk™Nš»hò:ä(Ò…Eÿ˜ë:R²j$§–ã¿Å×Ô˜‘1~apa3YµBwA(6€ A*¾U^uY˜ÎÖôê ™éò*_§â|€±j3aÇb—WˆSù•j¥mšit™òX¾ìuk"h1 UÕqEû0ú` ¸1ïqlb]¡fSÍ{˜/¢T~Œ‚Z©Ø0òi„¼ˆ€%·l‡ KpÕE¤-@KØ-®‘*®…šTKîfZH—W6GB²Ã¢é‰ÔtlŽƒáŠÒX÷ˆðQ5£?KYŒ.)ͯ¤ÀRHpEº1‘\¾ƒ4ÓB,Ïʺ©°2¹ã_LÏC]^#æ© ‹T-ù0!ʃ~ð±Ûq«¾$eáœÕúÆè®1å}0¼—:¼ès«¿… [Fæá…‰à˜Éd ÒôûäóNi•­!©—°Úð´Ç.®óaA(¸VªÖe˜žµ«¥+Òx"T„nȉ©†Fý­T/Ó˜ôt!XK™½Nv^írl§ª‹b— ;#þ·¸Ê×’rg|3II7Œ¡1××ÔOÄ|tÍ’jR]†è­\Mëg-§q‘Kð% þ¾LpâðY´7æ2Zùèat»iE¼ïŠÅШ/©¡J…1ЋĩÅbZã“*h”¬D|#mË”'íHܤ²8vi|""f™[r¢GÝøžXÆaJÄåÛ‰È0l¹x]ë«2/ÆÛÏT\c=‚)1®…MŒeuœNE¬j}ñLÕL IyæŒùKž#&}èó«¼Fª¼–jRäÃ4HëWí팦MM{è# QXÐ~Cì|©o- ,ÕhrýîEpãt,lD*ZÀuö`"˜·ª>š©|GWÙ&Ñý‡ ǯ]\#æ¡&ÕÒ¥™RÅ•Áñ{œÇQ™ ŸÇâ(¹X·}ÑPä²(2hÔLyDòÚÏ@F2'æhupiÛ|F¶ŠîΖkˆh5#<ÞÂàsÒà& «æ£GÓ,¤ {ZÃÅ”ÇGœ¦ì5ÜÁ¢GV^"Ì%¥YÖp"ø -=¸åû›96\ŠÍ;sÍfZH/«Ìשz ·˜j}¶Š;k¸%ÓMÃS•¥ I©j¾ðXö蘄kõûgœÔÞÈÒë`‰›À’ûí$úÃ.*I²Š?ˆÓ/^…¬­ isSa=ÓUH¤ˆÒ*['bÔµˆ8 ¿‹kÄ|#ÔJÕrÓÒ¤ËûGëV>ê…b-Õã2ÓøÆXæÄ‚—çTMÄö‚Jà#ãáš‚T`tÆ…évH¯·XßÅLVÙ¨`Ë« Áï$¿ŠGÎjšíOß&3W„Á(ˆ™¬˜:‘nFÀ°b‹g!)Í|ƒ1rr8´™Üûºnƒ»Šk Š+‘&ÍH=<ƒ”nõÕµ2þ†$ªîdͤ¶1,ÿezÄÖj§EÕ<Ö™—c#7§éQçÁtUä’i÷*™”‡ .§Ä&Ë}€.îFª¼–jR•6›éY¿,d0Ûa©FÁnõ†"„zŒ{†C/=cL8tµA ­‰Ów°+ú0±«×ÉÙšIy•¯Ã¡Ó9ݨ-& mN¬;«¼FÌ—n T+Uk3LÏúÕò?³$Uˆ¯®L\½Š\ºhÅÄçÓüfuäK¢c4f ;‰p'ô“÷5†» ¤¬ÊÕ‰(”h‹Mìôß…5RSâ*ÒJUzžÒâ*mñ?ãH°>OšSï¦òlŒXè¨G*–Œ5ãÜF³óÇ¡q!ˆ†­È¯ÄÃR6ª±z=2UL|±<û†ƃñe°ñ¹LŒVF:[å’|#Uc’7Ó³~jíˆV‹UöóJÜi…ö°µ7ö¸³A*0:©XšÑHc`tºD#¨=±Â™L³ Aši!)¯ò™*ÝËWYóSVŠ]\ê1ˆÙ˜­Þ4©Zf1é4éÒX­â¡HuÚ(³zyÀ\thÍ#Dê]½$*:ëϵRARwâ¦áø…š y- V1(v¢Zsl¢^—HÝÅÍêe UL£Ë0 ÒÚÙàËÚÆ6ÃÁ“30:kù4+]ŒàêlzÀ)ÝUäÑH–œ}ÔE‘¹IËc¾ !î‘.S!·¼Êg*0ßbö\L:áÀ—,ugp#º—L'ͨ24ƒ´rÑŽ’3@¢„aÛà³dµº1îw ²½— )‘óAmôU¦Ü‹ XNü”ËT¹8K¯§ 8[ÎA,OÕ ¯ƒ>»Ìerfðaì[^!É7R5ö y3=ë­ãG?dâ!†`‚Á„åT7EmXçgÐDv¯^húúéùvY8Q•Ý4Ô6.äšf. …9lêT,$‰íW¾&bù©KÍ*­óH“Jç¾RD¢$ Mi{••Fù3—NŽG‘J ûõÓ%"©¾9Ž«éôèc1oß Ö~Œiø|TAžBÞD|n ¤4î?“ë@­s5ÃךØx¼”@¼£2ÊuaX؈4©4·ýð¡ꢘ IùUÜÃh®I-ÑÉÀþ5s÷Æ0·Åž•pè¤á²ƒU8ôƒ0°éÍÇJ šT4j©ÎÜh G¸”U¹: F@ãá.ý©ØÕÅÆ–àëTFóaHA&¸&Õh2Lƒ´nör-RD™ñ룵= `þj,’a%b²ÖÞ–$$Åî€aË7dÍ €p*žIÄáö{ô`‰õm”Uùc“ëÉÃbb£—:˜âÐWMŠÑbXi½¢-V4‘~zt}.þýýïæù™ÆZ2Ò·9`þaéè7Ô’cYcß{1˜°¿y .½½˜éò*_§B2^ÂÞLtSi"S—Wˆ‹•+UcKòa]ª¼ìB´žñ ¥ã°g@,hãqÕ›^ Â+Ƕ #s‚Áƒ|'€Ç °Å©ŽKâƒa!WõÐL4ËAR^åŒø7\æacÍë}Õ?ˆâ¥MoÊãË1ßHÕØƒäÍô¬_Úš«§¬åÇçÒ‡ZÐzcüQ3ý„¡!©8ô‚*Ó¤ÑN2uƒ(qÍóžê`"LùjM7(¦…XžµuS1šçúÖebÖx·ÊkÄ|#Ua‘ªµ¦gý2k±,m7.v\r&ü,3 &A&í¯ˌǰ̖TG6Æ$bßi]aõÿËeùAXÁØß/̘YX ¨Û"J­º4²ÝD¬/ T³ˆXd¹Åâ„y…šTK—fZH´‹òÚ;ò û"BF|ÏBeaÛB Rñ?šŽýŒ×€ ÑßÅ ®‹iðµc´†ºi@ˆ‘_…9ßì`D‰ôÖÁ!ú†•cΔS#æ;"LdTi¦…¨åõ´}¢`ØAF/ChÑÞš2FðV Nð!‹ÐÎ |W>ƒ®™C¬¦ÁÆ‚ðGzS “nÁ¤¼Ê7Xæ¶ÅÄY†¯U^#æ©&Õ’¼™Òå1}±Y%àí„\¬+Ë®²0ÖŸ °¤âj†M…u—Ƕ­© °é´Ž`H §Lš$…¹V™T¬üòÿ1îT8)­¾ð+Ra‘©Ui¦ÏÊU‹Ÿ­§ã4ËHŒ‡AîÇ6–Î…C Æ|,â¶/º³i •sARá…¾0­$†þØL…ÜòÌ7à—5+ MÛ"–S#U^K5©F›a„¯JýTßܼۖÃô‡ô<\X‡c…E2.t gÈÁÑ/:çE|ëõ¬½\€X¸Nš8qa¸zEÓ`ñ:H «lƒå@ôy ’£¹…˜ë4i–ÌM³. }½eø‹Hí|ŠlÉÓÈeüÂäIàiæpŒ¼¬%ƒè¬qDÀƒáœ—Mn*l?luf:È)®òU*Gvh‹‰6àÚ ª¼ƒ˜ïHu°Ö¥j¼ˆ¢\•«åŠÑ®ÒVwæJ¬ÂjæÀ‚¬‚=s‰PËqþ%²¹ÁW"F6.QÉÛi¤h`&.s ætƒäðôŒ´ kÄÂF¤•j4ɼeÚ`ŠÛÆ…f"£#[žq8g_(¯ñ›¯ŠNJ®ˆ§„ ÀEÍ>HY×Lª \ˆ+î"bmz€fä©Áè+Œ”›ˆžA=F .®‹¡ ‹P¥É]=ª4>fFvW4ö:®ÈGá1~z‡Í!Œ9ÇT‰.%ÂI A=Ò¼—´R18yI¤™’òÌ7KMï/&×Õ,QWy…¸L¹RMªÑf˜iýfÎNØöµ„ä‹Ä4ó“çÝlïÆšõñ‰…„>‹™@’`¸¸ÂpÌø+6ôIƒí…ÇM7ÍBRXe›Tœs£i‘í<ý$»ñ.­L–lÈK¤ÆÄn¦R.X^>îk8eËÊÉC4zÂ.gckëö—¡ß Ó¦"¶({Oï²qO6u„/ÏͶ±RR±ÚeËC¾f2Ð]#)¯ò‰åuîβ¸LhH”Ò)¦FÌ7RMªÒf3=ë—Ù G@ wvxåÒ]ÑÃ1[P$Ÿˆ ¹Sg´r»ËçØ-.‚`8íJµRÜ ª´™ØË€¤²,®²M"BÀÕæ¾‰h1=ØWq˜o„šTKðfZHçÆRý{†"¬fô$un ¹²#eÂ&Îߺ ¦·Ÿ X‚`\ãY]U A9.S#aJyä»»áÕÚ BÖå¥ÖƒTy-Õ¤m†iÖ/ ͈øU#lÞæk/–Â,‹÷ܬZ]³;–ëÞ…}›†®A:2éRqÒ°qv®Mš…¤°ÊÖ©,žLƒ´~]}ï¿Ï»]¿óÐÕà‚€æ¥çoŒjØA@J›“Š –M;ˆŸ™ÝâHÍÚ+³ÛÁxÅ‚ùÁÙ $LHÊ3ߤò¤:¦ÓaB<—P«¼B\9]©:Õ’¼™ÒúY w„g/BàFÖýÈSGg"VB{A.Ÿ»UÌÛßî0¹ÄÃçžÏi§ª7NT¿˜˜åóêÉ)¯ò5†Ðúƒ,&£ëïò1ßH5©Jä¦gýòáã“ËJú‡(76úÅ肼+ä;ñ4`cáó òw4l)XÛraâ!•F&O~HÕLƒty•ÏT©->?jù2qস2Y^ê=ˆù˜RJª•Jm6Ó³~itÈ_ø¿s.êçn fJnHÄøt`‘ñ›a|¥HÃí‹úüùRŸcŽ¥Rñþn_äk&ÎR’Ò*_c ­Ní~þÍİɤË+$ÃÍH5©Z“áyÔ,Î×ÂÌ“2ý$üS.– †?¢Ï?ú1pá}ÊcÛF¨ ÆÍú;Ç•i¥á&'ù‡¦), ²…}×2—£ˆhŒRSLTq-Rc~Ô£J˜•£<¦u¾bµàž—ºã‘ÜX„ÿjP)Séö¢ð„xñócEŒÇâùí§Æ„Ï\q ÄŒ"Ú—Ý«X±°J(¤Ëªlƒýà)ˆEÄêÌ3Ð*+æ·™Ž8+‰ZP©XJ¯ ÑKm¦7?އÞý€Ù+ó1yBætï|q÷·ƒ,_% ãŒzÓÐIñI,yŠf!ݹÍשªSbº¦î¶SZÿ¶4:nZIZîÛG‹ê"~·­|OlœòfßÂýê¼òšÈíö{÷© c¯"wp’ÖÚg Ý&ršÎ}z +_ÑÌM(ç3tR5S!aJç4ߤÂ;†èx›‰“;Û*¯‘*¯¥šT#ù0 â’A×q'¶Oc;UÈáºKñ\ Cx®CÑJ„3bd ™8×ì9$^b±·³²&§y&è2 Òå™oa„T¤.CK§ ]^#æ©&Uiƒœô“bzÖÏjp§Ç(@Gæžëȸ0nÌÓUœ"agEZ›VvÜ*ØB°ÙdÇmEL*ÍdLX’ÑRZe3Tìª}/`±*÷³Q‹ƒ¨óP+•ºl¦gíÔÙ Ÿ¬‘ŠC²,äÄ€æHÓxÏ! 2Ñ0Ö¹UÍí Ô ÂGV·/&R÷*@š©HE»¯Ëp쾑=·ßVì"¸$¬¡aÀr/}¥b éû33°s‹á"=ÐŒJëáx1õ}ʃiv±–jR•6›éY¿ ì©Ãs>Š—mÈI>Îáž&=`¾ë€i“ÎÀý˜¤ÂjDöèÌ&gŸxA\H'†|â D£îÂ*[§¢b**Û1†°Ý¥5¢à%R"•wªQå0}R.MÏ9#«DÚ÷¾¶¬Ôƒ-ëT4ä“ý¼ãÖ”oB„åÒBŒzY˜ á8Í-ËTÈ-Ï| K ±ÅÄŠ!.é]LTy-Õ¤ZÚ4ÓB¢_´æÀ‘ÑŠþŠ\„?w“æ!¤‘9îön6Ó_ý®2—s0ÊAÌB Û>³ÑNUÏ>\&†¢z¢Ë«|ƒáÇïå0!`˜×¦¼ƒ˜ïHu°+9H3=ë§Ö.䳋†FC.{Ä`X\Y·’Š£yz*ÒswÊ™¦¶Ñ0R°uaÕÅHqRÝÍ H˜ „¹#Û[žÔ<ñèjWTLHÏ7‡Ar¶ a4©&¢ä—é Õ‚U^mTx݂պ­á™Z» 9ûììB~ó¾{Ôù‚§O+w5ˆ X¢­T 9‰4Q!aJqæ;©ž½óÕ0°©ÝK•w*/BèÊ}‰–&]:sº„zèlºêß+ÁÎ+A’*{º·™² €@’$ãO?“{l:…U¶J¥èvî!Hߞ º‹=ÇÈI³ôhš…D³ôlì§„¥4ØÆ }0·‘ºIE4p¾^…Âa<È×#?ѱ†rùƱRá:î@‹\ä*¦Aª<;ÇMåVÒ&½Ln7} º¼B’o¤jÌT£M3-$úe›i;ϱ ÉTÂ9]|c¼ÏgìÙ£_\¦©Z¡@ø‹Ÿü"¨Væá'޽|êN]Å´vù6:\n µ0]&vÝ_ùðNy05RåµT“Š.9x3rõS}mMýô 'x²S|\ðõ‡ˆÏÊø˜ÕtJ3o‘3¸‚`%^øÖ,L䃵@ò5ÓB,®²u"&bì›È‹®¹Šk„óÖ+ÔJÕ‚ÓR¥Šcņqñ÷1¤B-ž„ЧÓÂ8$¡HRñR•Ú°ôò¤nÔ¿õiáÁ¸9Mûvª¸dc àð‚\11ÄòTš|ƒ%¬ÞbÂɦ,L]^!É7R5ö M3-]¢_:¼¾Íš3•”eÅ w0Gaì4 d€}ŸT̺zÊŠ|Ƕ<ˆ†>0|5­ÁIŇÏ&&ìÍ´”g¾…qÀR!V› #Œ–èU^#U^K5©–6Í´.Ï ·ûq¿[´f!ïZeCØÊÝ^»§3ª±|0ròPQ#V}vÀ|¯'Uz‚òfbçœ‡Šº¸rÈȰ‹Çâzð–Öˆ¥L“ªT!jŸR¢'Ý2š»ÛÖ ÛTØÆsJz1šëæ”ìlõyV¢Â×ámü°axaß?ìÁDhD;÷0©R^åëTt5ã@,&v¨žØÊÄ|¬KªIµ´i¦…tyÌÙµES®«ucѱ´aÿç'p´fFD¼… ׿&Â2síhÝÈ-¯ò™*XÉz™Ž> –—Ú:Z_©&U6œ¥M3-äjÍ$ ‰­H=3X9u5)~ÆjÌ´Îó<ÅÆ‘•š±4™/Òƒx‘UýÁâ£`318$å™o0û)#Çbòf—–ßUVKÔ)JJŽAJ³ç­6ÞBê›ÜP(ÎÛ?ƒÕëë ˜ØjLâjœöcü­ ‚0`¹Ø§â“ŠoËYËÖòs!Í Di‰/@cTS!¡-7!û¢SDXÚÈtÒ,±¥áˆz!]=[%׈±F8O32«òÆ~œ'ƒX~91Q³5ï3!U.ÂH¦‡4‡¶l¥AS–0Mt”fÀ‚1¹ºS]4LÀøÐé©ÂZ¤IUªPsÃô¬Üã…{óøhÑ ¬Š>ÊQÕ»ôƒqàɵ' y¡ˆÕC>ëö^T`²/„q¬^(:'œHÐK —ˆ$ˆ³Ú¥™ë¦á,ŒµÓ¥¡K%Ò-¬‘*L‘ šTKìfZH”ËlMgÄÁŒOÔ¥¨ó°Ö”Â`sµ§y¤ÞáÂ=²Ûe™“/R€Õ E;C2k×ËÄ—7‹@R^åkÌS&½/‹_çS^*+ˆùFªI5Ú Ó S³µ÷äÚ‰·…Ò•>^-Àušõzžeq©»7—ÌìÙ!$ø>X.~ fª\ü’œ¸†™…¤8dßX|‰4S¶ÔH—×ù®T'Õ¼ˆ`i5¤Ž3Ñ²Š·ñÒÎc™C>f‹Š …†ÄM¦5¸pÐE\•iÜH$Â›Š½FÞ+i¦Aº<ó-Œx¸­]&ÄsYx‹+ Jk™Nš¥Š4ä*$íåÒµ³ùHüwF²pª;QqÒ¸NÛmù- -)ø ÛX/‘ÑK¸×?ˆCXîõŸT¬Žú^z€L ©ò¬³›ŠóÏÒgº¼å5RåµT…!ÕH>L ‰~Y a½àIÉõ…¢õÅ\MqN òÓMeô!FIÒð„åBÛä.LÄ-T”†(IÒ=Ü4|e:±.šþ-¾ ›Ïóˆª KìazV.*cšÀ]¢TÆ2›-vc°ùÑ2ÛjÓà<ÂÑš†þà1—žeTÆšˆš Á{SS#䣡-¯ò™*1M˜®/:úzÈ)¯4!ß•jR-mŠé“~Ñ ×Çüg4Óª!)2‰`$¨ÎŒyC» #Hl©Ñ)ÀˆYàÈ¨Ž {83Í =œ=`…ST"]^#–7RMª%y3=ëW_÷9!| "³`A@Ǻù†xc•(VK;p G¹5ÿ×AÔ^_5ïcœTAˆä ‰X„5`a• „ãKâ0a‘8tËÚ.ªs@“jôPŠ¥±q©'~\4ÐAUwc¸bð1ê3§g·Š`dúž+ôõ`Q#J®÷±Oª ,3­¾¯b”wËc,3ß`˜ù°/…>• ËkÄ|#Ua‘j´i¦gýª±‰Ûw©œq§%Š?½ò%KAM+ƒ€PÙX©}u-kÌT#[ˆ0e,„¡û‹ÅO¾žË„èo½Ê£úÌ7º±¿&l \æäjÊk$ùŽT»’£M3=ë—j°æ «µv±6ØÈ Âb´¤/­11ýòŠð©'$°8X,Ö ºÃebb rÊ«|ƒ)kÝègKM[”Öaªòb¾#ÕÁ®ä­5LÏúEk2pA•U)8yTëñšHœÕX›!SEA,+¨|™Xz8{œò`jÄ|#Õ¤*É7ÓÒ¥Ë+CÓÜÃöÇ«ü®]<Ê ­‹°úe×…ôôD½èî¶ü H†{öÂD¾2W›¨ˆ µ<à¨\•Æ£Uƒ]jˆ|va­EŠà¦bé2b¦D9ûýC$Éİ&9USu 5ø­DÑyUš×NÃá_& lK‚4Ú‰ØdìTŒ48ùl¦B"±Å™mAœ-ò…]"f<íZ±8Uq…Xg¤j¡&U òfZHGs?˜œpmMÿÀ#!C¼†°(Á=lY >õ 5ªzÍC€ÅIµ¨P=hÝi´$ù©Xaa¹½E¡À¤¡A½¾qXÈåøID¯UT!]VËÓXŒM%ó0UõÅŒ®aÉë@¶5~VñZÚ“J!uµ"­YHnþ¤ …µ5å ;¶&^§ y- ¥U¶I„Yûà—mˆ—º¸FÌÇn»„Z©F—fzÖ.:kaâ(5­¸ŠŒÖ9VsœÉÏöcIT®8Þî9ˆ5¯È!Z]}Åtê˜ò¬¬?f¡Ž!¥clªâ!›Æ¦ª°xõŒ2!ºšTiHI;kWŠavæºwt¾#;ñ)â‹ó-ûMt&H5íçCoô ‚Úš|x@'‹Š% @¾¢”V¹*C1Ç¢ñ|Œì«°F̆!ÄøVvÐNµTi¦…tq~ÓgÙ†=Çš#Þ·ŸîP6Æ¡ š‚z¸4Å$H°«MÀFõ ‚8îtÙFU±Ø£Œ5¤™ô ád4p]˜õïÙßeò8Ùpœ·¼Bì_WªÆ–äÃô¬Ÿ-þ°Œa§WkE–Se}Œ…€wWX 2ާ˳ŒqA%BèZÇýF Œ»hN“ 3gÃAši.Ï|…Áå É°°˜ ÜÙåEÎ U^K5©JòÍ4ºLy©‚\­¹kí<^ªàî>³È83‰ß“ ½ë䨇èÞ`”/“拨uebk>P<™ð´ " &$¼l’Â*[cœŠS‡—‡/3l ¯²02†|lnšVã°<ëeÐR„crs—s9óxCpèÊg?ã¤ë´ìT?Ú’æÛ7¾ˆAAÏ&à o$Ö€›‰uÈWÙª`PÃøâG¶J+Äi x¹ÉÒVªQ¥ˆžt‹ÂlppáJ0Úiër±¾±\asHhŸ¤ÂÚU& ®H.4 B.S±ŽÂŽî.ÒL ‰mÍ|ƒ±±:“ŒŠ"]^!|èKªÆ–äÃô¬ŸZßu[†cëŸôn¬Ð~ Oi\¤Ônê‰ Ÿ¸¦  “q„ËŒ‡T§‚TÍĈ†Õ-®ò‰Ñ)PÂO|1yCÆ©ËK¾ æ©&•SKé"QÌSˆrið»lÓÇ9Ntw/Ãï÷\˜½A/ ã]¤Ï2Š3ÓéwQÕ!Âxãg–xVÈIe$‹¤j&OYX&Ny•¯Sq2 ³ÄbŠÛç.®sL'͈=4 I˜VuG“þ¶«¹ÓJ"8ä8âu{kâ`i!ÆÐê"XnÍ%OìSùÝ]«ò4’–^݆«¤FÌUò¤âÒúGæèÑLl¦4‹¾Øo²¼T¦\pÕVX5(«È YMš*[ÓðÜD5^¤Ð>Äm%"2„·NDx¹A¿ë…¤¸ÊÖ©¨o*\"ú{Ìf·´Ft¼Æªä28_ÅIÕº ѳvõiŸ%Œ^A„‰¢ì~Ž?“´œÝç–vVÄjFí˜~p \ZŠ+ÛrM*Ö7}.¦A{HU…¯™˜^ótÈ)¯ò öØ’±ø4õþÅEò-¯óT“jiÓL ‰~ÑZ¯:•OòFØX±ˆaKfi®BaaAà~»ë=þ±Îó©­4Ìͳʪ\¦É¤öEÁŃ5Â!æÖ€ÙŽ@+Íh!OD$e•¹çnzP"t±ˆdU™˜<Fc^áê·O{­’Õ(ë8ß&|fŒM^ǹ` æð|Á4MÂâ ædämíÂØ8wé”ظJk¤Š«×ƼBF*®cØÃ4H+g;»í¥z¹ ϘXŽ °êóYPg°¾ ) &Šª®˜ M¦FŒÿ-Ììºé ¤j¦B`ªÂÌ6‰è9¿Ãu‰X'DÆ-®‘*®…šT£GóÌoõRյ߮3¢1‘5 ÷ÙMƒî²vÀÍE4µs>’Ldȃ‰=5‡©[^å«“9ð£  áït•SL˜u_bLìH»G‡azÖ¯ÔgObLìq–0Îw9f5_…æ çév²á¹>A¶qü8ˆX?„Ù“ã2Ñß éò*ß`\ta~™Øiâ>³Ëk¤d뇲wª‘œÝg1-$úe@#´ÄWÞB«FàÊ¢Û’a| LF©{Tzænä©Mm#O`¹°zRPåÙœ[[Å´俬­›Š¦Ê>ï2ÑÄÙÜâ ¨ÒZ¦“¦TI¿hšgå¢2w‘ñ ®¯›»çY¡mŒ’Æ{Wì_0‰ð¡R<•àf™Anå…¾Iä=`½–ýš‹h#§Æã²ûâ¡~ó ×-¬rµHi+S1Ý-U³è?c¸ã·0丛@‘ì5Z›‚«9@"pÀ™µÈ¤ñ¤Â…Û¾M"BµÍpz0Rõ »ˆz°^¥5bqÌ ˆ”&È ¥¢«Ff&Õ½öqŽ È„ \óañáI‰‘äË]‘¸ˆrÌÏš* Ë\÷a„#*ËÅ*DdÞÀðV‘·L“8-§<>Š…±vÎz™\9q;k•WHòT-ɇiéýTtWëĢòaŽYP+â`n6Ùw‰`ý¦ÇzÊw÷Ü/¡ ³çA`é×1¼L$Ž`¦ ÓBº¼Êg*¸(X3äb¢`Í"–9ƒÐöWªNu$¿L¹ú•úÇÈdü¶‹¤h Ýu<BsÄn„Ï›‹=Ñ5KV7®kUTa€|mf æüJ$M’ˆDºVÙ:º{Ät‰Pʦì:RXæ: G¦-Z³|åŒýcÚÜôv#ÅiQ\îKz—i±t€"!> ·ßú ‚`?|zn0æâ% @:IJ«\•†š˜—†Nœh·°FÌV"¥î:Õˆ=Lƒ´rikfÙÇH’¬222€…õ$ë,×0…ý-†ƒ5ß6Äò…_BHÙ1*_Ä®K/¦âÿZ©˜œ0ÓBR^å›TLØ.uNÐÌHÐå5b¾‘j¥Êl`yÍô¬_ZÞeJî@£OWø/ˆ=/š+LÔQ‘hí½’ðú“ ¡-\oxõm0‘ºÜLªfZˆÅU6AE½;a_=A‰ý#R®IÄl#Ó¤¹CÄh€ÒM…ƒ5–kU–]mN¿XÚ\„­ÎmLW9ÇÓºˆÄ~’3óÓ/DxŠ’óq¸›g!––ÌÂÒN‹©Ûò7 Þ"Á]‹ª%uó,¤û×=fTyêþÞ–ñðë» ÚX{ca„¿b׫‡|`ðBs½éŸ¾ó2(¾Úã"¦}-²‹f!)ÌlƒïÖó±!bWÔ…SÖï*ªÄ9)Fàá¤Õ²h·sÑ •kr0g÷Â+fV׎Ð"œ›hd(!pÖEŒé„OᦢÁãp™’òÌ7˜»¿ìˤo ÐÅP¥µL'͈=4ƒ”rt3ɘ?~cæÇÔoo®sÁ…(ÒD¬Bp_ ¦Âš`‰ßvÈœt òv± -€|™d€”VÙ£‚Y-p’9DÞ²O8E —)®¿ôª±¥K3-¤µ‹ÎNãFHŒÎÞcbtÛÁ¯98qÖÔ4¥qX(3cÅØ£@ÎDîÎö¤ÊÌYª}¥‹‰¹ý Ü5,_°Á0rœøÑ<Ì&V\ÔAë+U¥ªÉ¼´¦gýÔzâÕÌì,m÷òƒ¥·¦—‹0UEštò3]OF,{Þ(¦>®S‘†ÅSÐAº‹/¬ûæ%ªÞ{Ë:¼ÅA¾›"K |&¦h¤ÕJ[{Bñ"a%Œ? -P¸8sg¦Gš>~²ëˆ*ÂÉáBÐöŸ»æý•Š~ÆâÍTÈWÙLèƒ>¼x\—Q«´Bœ®L+Õ¨RDOº©°ö(¼é~:àØmÃ.Ƭï­Am[l4h^\gØ”2Êh[û¥—ÖAø4Á8ñBãÆòB ÎŒ(ÒLÔ!Už; ¶Yƒõ%÷ab•ì'°Ê+$ùFªÆ–äšv}¯.­_´ÆºÆzŸŽÇµ4VÈå¼0ZUod†í0¦bEÎ\¢UÎ ÍAǰƒÅ p° œr0‹“¯™¼£ØHÊ«|Ùã3LÔ2‡M»¼FÌ7R­T­Í0-]º<ÚU݉RN—œ¯.†©Â÷•E¸Ù ŽØÉð½f€em”;QX÷¬ëRõÁDPX­‡i*/£þ¸sìÚt˜´Þ`Ú^å5by#Ua‘j´i¦gýòI»~Ëu*äʫ޽8=Sn»ÌÝ%R1h÷â4÷©ÂWæ¢2÷©&´aŸgéVL Iy•¯S±aöžÏbb›ý;E–§U^!~ÕWªI5Ú Ó ­_´Ö„–)°ÛZÍ‹u iÕúí£ÓÖ±s±K^RŠÐQ“(Î+¿¹¦Á…–©þ Œ2Îõ¾>0˜çy|ߤ*¦F`êò*_§b wѾ˜\¹áV¶Êk„|Wª•j´)¦«Ë”G»ã³ÁÉ"ýƒ üâ>­C2Õ‹Ü:VàðO[‚àDÏØ ÂUIºÉAŒ@T©°j½o3rË3ß`tü£6[)^¬žòRïAª¼–jR6Ã4Hë—Þ®^B‘‹o6'DE2¾l̇úNø4ß›'Ei€ @¬šÙo­4\oc”£bšÆA¦‘VÙc€(n‰ÈǦ–ë\S§´Bœ.¯HÅUR^3•rA,¯?p{zއ°a¥ÌŸÓ–Îcƒñ½¨¶0.`Ñ‹únW qÑ4â°eb±gïéTµ‰Òò¦…tß©|8°½·‡å’ÒeêvR‚,õL“žÉWöá=†ÁŽä—é Iý2¦³á\¡ú9o»ÄÑþbÈêKEeÅä<"ú0B!<¯} E£)7¦¯†¶Òº˜ ‰\)Ï|“ ­9…ÛLèˆ#Æ.¯‘*¯lÖD¥ZÚ4ÓBº<¶Ùlƒ¨‚Òšljß"ɲÏ3V›aæ`x©Ë+h)ðÃ`Cñ .Âl¦BR÷)¯ò™*7$7}_Š]\!.Y®P+Õ(SDÏÚ¥¥ñ‰ÀT£AöâŲ± ¿Ì‹tF¼´"Gyx`hZBèsS#5oªöËp¢i&†lUA,Ï?`™à˜Ã.cÞr0±¾«ò I¾‘ª1Sµ6Ã4½Aý2¢Íü™ Wh&Y¦•¼sÂç}1þÈÁD<)*þ,£ —"ƒWEÅ=j€UT܃é¦QQqAši.Ï|…Ñ1°úVx3I9¥EJ~WY-Q§XzÈkÇB¢™ŠßùÛEë.E³äñ†™lc섘­]ÕйʬQÜ‹.3øº“/ãN! #È4G;,¸Í×L…„)å™ï¤b ÅÈ2L ½”UÞAª¼’ê`WòËô¬_Ú+ñ‚.¹2‘5Áð“ò.‡bÑ XئƘ‰ÉUçA‚Tø´,ÌM/î*|à(]Lt5äjä†òäÔð(º¾‡2WiÐe¯L7ÕR¥ˆ`¸Õ(Ì Þ„dHC¦\$§™/FÂáò1ƒ3hQí¤áMÈ… ƒ[`¼&Uî’ÔA€|Íä—¤ÊC ó –ûX‹‰JdFÌ]’.¯äcÌ(©[’3ræÚÇÕ¥õ‹Ö\Äà«’ÒåXAZG"/0³¿âº@„ÿÀ-ºv»,&±â³ ÷æ<*Nªz5Æî"Îé¹·´Ê6؇±þ3µîˆ"©ÕgÄ|#Ô¤Zº4ÓB¢]tη}ZäRåyÞ-‰»ñÂh`œ X‹í¬L ÞEr'Œù¶3à Öâ…‰|34eºJ1RÝÞò*_§âû¯H¼Ã„by@ô–׈ùX—T“j$¦…D?ÕwÿŠám”.(ÚNÙöòÿnSŠð6P)“ÆEöÏ<Y*!T´Ce<ñº{U¶Ál¦MÔM¹Š+ĉ۽x µRMšèIµèËÞ•ù°&.§ÜÏ6† LjnŒyžÀ¯ŸÎË ZA:ôI#ˆàecÒœTl–4]²©qˆ`ð†¸Ù†-“æ%bN!ÚÆ—¾¤Šk¡&ÕÈÍÈWL éòzן-&Ê?Æ|Î0îS¹(¿1œdh ·¥ËG~ó¿ùÍ•.zèŠSèz ]}7d"grÔtŽŸ-Ÿ3¬±³q$ùѯRa+ òfZˆÅU¶J„ìl“90"6ø%@wó¡v¿LOÚõX6Gœs„E î’û®Vpd Ç.­Õ¬M0 “Š-‡ñ"EØK.„!–=Û¼…‰pq›öfZHÊ«|“*a_(o?ïò q¹R­T#y3-]º¼²6`Ö¡ ‘Ëelˆ‹nõ91 i„ס'æ^¾B`là¨çb¹5âæÈlMÄ–­ Y•©º +ÄEB¡LQÍiÄ\#Ф²“DC4@£,´¥ÑØ1rNƒDØVÀŽÂ"å2*°FΚT¿xº.6…?F5_dàŸ8Mb;˜È÷øJðfZHÊ«| »eB—‰Y·‚Ôâd[å5b¾‘jRäÃô¬_ÆqöèY:SN+í–ü@‘T€Ñ”€DÑPÄWƒ¯~È€MJ[qõŸÒy#GçÆÒ†¥óejmNyH0:/©Vª¼TN£I—ÆL­!ïê,•7V:ëŽåY«œs]üF™—O%0ÀhZÈ3D‹Ñ oí€4‘LU ;jZ(¬g1eàîò®Ê#TA9Öm]†èY»ÐÚœÄ>_®úìIÁi»°4fÄO,ºZ šp¯-åP(ÚªûIÃ'^‚<ÌãîQIi•­1†#ï]"–"7B­…5àåÏ‘h&Ã3ˆ&<Ì'éàlÉ&¢× æ.} Œ="DA.Ñ«T ±„‚è`Ä.¾Xì ŒüÕMš –ƒÔ0f¶†jøY<=BÒò dd³´‘iR܇h€5޵m!—+ˆ¸Rš@7«lƒqÜGËj5ðQ{'-ºÑ؈™z{,˜&°•Ès”óÑBRœÙÆf‹ÌÑjXæwi˜mdšTKn‰’FMª×ªÝéè5ckKøâŒÍãâ,_rñób,ï¾xOû‚>ٸò1Ì“ö…„oÚX|—û¤*ËA¿“ª™ø@ ©òœyµ/ ë“¥ö…bÂRÇ=á ]^#U^KUX"²Ž6Íô¬_Ô×tà½}µÆ^ç ãd…uŠ|¬è©# Æ–àâͺ@íÙL„{üŒï ò$Dº´ÊשØùSÿ‹ˆÎšp_ZRZä‰ Šˆ­HÓ|Ò,ú²ýæŽßß¶wÞC*óÂ`,pÙú’Špr ÝÈILN,0 ü1\Í È†“Sõ˜IUM°7ÇAñq:åU¾Á˜ˆiåË„1Ô¡q•Wˆ½ãJ5©–6Í´è§Öãiíne#ˆC¼¬«B,Uò3¯ °ÏÇEÅPÃÞ—?!T/‚8¤be¶Iåýæ™ß)ËV‰ÜDŠgoj[Z!ö.Š#ï–ØÃTÊEËK§wÛ‡Ùð3Ì®äbÔ£¡ÖM×Õ!Zl¹8ÄÁà Ö?ßwDW…”&Ó4ÒåU¾ÁØ„k˜<ŽdT‚.¯¾ô+ÕJ5Ú„é³~ÕâÇa KÛ?qÄá#fér!:A9öùh‘Æü‘Q„¨ŠÕÓ‚ ØWÔjß©°+8Ö‹4S!0Uqf›D6§£Ü%B­Œr·¸Fª¸jR-]ši!j—½;a3¸©TÕÉÝÏ‹•†vrŠæ¶©ì丟:Ì€±B0,HçÓjn¿•˜éN¾Ru×\DÝ¥Wi…н–H+U«2LÏÊEe¼ÀqÓ*•9ºùíéÈÅм ÂÍUfóY÷ü¸i-)b­`§|RÅ᫆Q‘fÂVPZê¨|ƒ}¸^L|fì~NqisL'ÍR¥iÒ…1}sÞØˆ¹‹¸óöìÆƒUnï…_Ñ5X± t¯ÿëBB+ÅÞ@xHE Ëš›‰ÊAR^åkŒ'7/³¦ÈU\æ™NšR%õÛ4ƒ”rÊü¤{Þf ‘‹»\ àJnE™ŒeA2ãÌ®§3Ë)L¹žôëuÅKºÖh„±Iß&–Š•”ñgHÔDèÒ*W¥a‹ðx>‹F/¤lÄ«0x1MY"­T£J3"S[1üßñQP*s,Ùœ¹6†35“ qOi6ÊäÂ*×v@ˆŠp'W~žˆœTA ÄÐ{3±È:ˆå9ü»ð:¡¥u&Ì·,@¦¼FÌ7R©F›fzÖïqâf›‡k±¨p¦YÔoŒÖdþ…¥‰¾M ¨AXfn¼R;â°‹&šÍC*ÆBÆéÍTL]^å3˜«KòÅä’ÔuL—S#æ©VªÖf˜žõ›Yl‚VP Òàn>Gü âtmÀMDDÔ»O6ÇØ³q~H•í¶H3õ|Š«| ó3Þ.l{+¯ª ®-ø æë-ø`Çr Q’`JHåG¹Œèüç¦ÖÓ oKƒ‹°2·bºÁÝë¹[#ȆörM*L4œŒ†½™’f¾ÂÒ˜iðÅÔMyʃi|I5©J›Íô¬_ÍcØ+=¶SRÜJ+ÚÒˆé<Ædˆû lŒ"ÆÙᣰAz¶Æ<œL„ÓêøÅÔHj+åU¾I•ûž‹‰ gŽ]^#ä»RMª%y1i}Ð/Z3*âA{4×¹z Öƒeï¡[„—XÌ6ƒ¹ýkañŽçÑÍ„Ä7E­—‡ìì¢s¦©OyUëŽðæ©&ÕÕ¥‰.Ð¥•aÍ™Œµ>g ®M~Q3 Uì†d0æG½Ü2ÎÀƒA‡w[¹‚”€$‘ŠEwRqœ@ª"býR@—ÆèD¶ÁØx¹Û)¢¿” Kãê-®óP“jäfQL…„)ÚÕ¨6VE–y¥:¦äÔÁ‰ˆÝ?îºÑž%_>‡_ ¿Ôˆó™f‡„_:˜/ÐÆV«Lˆ¥9ŸíTë9 “›Dº¼Fhõ+Ua9ølMÂcŠ­Y©½¶$xT–p\h?{±ÔTG¹Kùž°*ÅÕ]CÞ H] [r+ NžU§ÒäuVÙãЄ‘û¡‘ ›UZ!ÎW¤I…•ñ¨ÒL éòX¬ú‡gÆ5ýÂT聾ñÆ…¶Dº”Öa a½ìíQÍ,@ mh àƒÍPA¢¦)d ³¦:îo¬›rßÙÁÞ PáhÒŒÌC3HiFaÐv¬È‚ç eÿý“]ÞäùÎY †ô.ߘõLü‰¸_ j(‚sÙEì¶`_¼õ±Ryl§ÙÎm^1-$å™oaø¯|˜2£”]^#U^K5©–äÍ´.aŽ•u«Ö4‰oÈתm0c>eÉ”+Ý$ÂÃMã•«%Ìl"ùÆ©·/¾w0Sa»ÃÐ RD Hi>7˜5ÃÌ*ÒD,ñ¼m»ŠkÄ¡(¡ ƒit¦AZ»LfŒäÒ#bñmV`Ð…aÚö9f…\„$7¹éëž_äbâAè`uò`" .œï€4ÓBR^åëTnOcÍ&Æf¬½»¼BìïWªI5’Ó ­ßÜêþŒË Ÿ+_ܶ\ ¶Äɇ‚ð\Ã6L’_F «õ’Ö⃠JÖq[–ƒŒÄ˜i&v¹F©Ý4¹qÏW~i\Ð3–œÂ° ‘Vª’úð\-RcšS‹Î6ýEÇäp¡|†¦a5ZZäƒa-ºŠgåÄ=Š‹aqÀ(wÅÎý€ôö€ùn¦úTašòæƒ^R5&rti¢ Tiñ9b„¨1Ü,ô@g4>çýÒ»ÙH 챌0¤°JeP‰½ì b`84=¤bÛòÕØ<º‚ÓBRžùV®ä—‰u§¶ÈU^#U^K5©–6Í´.­1½–˜"úˆ¹D[w\"¹¡k¨#6RV*,0I]ÄQÌE“¡‰N*¾Bzi¦…XžµuSQ¹¾m·˜8Ú¤&ƒty˜o¤*,ÆåÖf˜–.ѯ†1z &¡ÈÅf9n¨¬jcɲ+£‘JÇá‚åÑx‚`Øø&B50//ÁSàV«£¥U¶N¤MÂÛ"—mXéâqc/„Pp5&Òr7ÓB¦<¾hÖ7úpDO¯ÊV ¹ˆ1€Ù”4¼Ë·ªÊn»Y:ár}$Â2w!úzU¦4Y– B$ŸøßTˆéå›E„*9½¥â¨}EšTG‘!:êVi.Ê=½DߤϢlaÜ©5˜!¹“Šƒd¤Êhëõ-òAÇ)W¢‹&ÖÒ¹™\±<9&ßÂâÿUvéfŠÌ¾iàèžò I>—‘ª±¥Í0-]¢_:6gpìMlerÖ fXÁ2ôˆp¢š0ƒ˜D]ÄšÇx‹ÿN”îDLŽZ-f 3É =¦<`y.QN«´–L+ÕÈ-•&éüwc7# ƒ-^=¬2Â6ö‡VÈúÇt|wJ«0^î ðMºßuˆ>ÀOw2ËRTå2Lžñ05 >NNU×ÝòÓ-ËýûÈ/æÖgl[Ý~Ê5ùò*znŒP¦Z]d“ˆ;u^FbÅZxG0*sa.–ña²Y…h)õæMÄÔZ®HCÄ® ¡?nqTq-Ta0.Ã4HkY—Æ–±\!£óƸÄZ~A±Œr–Ïøe¼*W¸¿u/;R°6Žet0‘رÈÅ(ŽMð2¡ÍwV‡§<˜1+’’jR]]$b¡.ÍÕ¶_w6*>਼16ÜLM ´I}£¿>+iÇ.’ÉC›Ž{ ¸LÅ4„†ûT€"Z@JÓ%ú¤Alþn e ’Ò»¬FÐ÷J´R© 5×D[*̱¬Ýб1bÕúgúã6öÆx¬âúf« ß4¦02çrñˆ5jé]i˜* š2®¶†P‘—Â̶RáÿD5ã3ûË2—Vi©â‰{Γj©ÒL éòÔºjJ{31üä©G:6›þZƒ3Õ‰qOŠ#[D‡´å›v„¥è x¡ÐúaÐaFÆ3Ä;ΓJŸ‘JÔDHi•«Ò°ÔÒ~h ¦»âÁŒÓ0«Ú*¬§‘+Rc"-ö0 RÊ12RøºàËKÛ &Ï~ÆUec,¥PíÎqô\RqA¯¡o_ÄqÖMZ|ûn*V†Þæ4_3-$å™o0·¿^¹ºLècëU^#U^K5©F›a¤õ‹ÖlXòHK´ŽñÄ=Ì@?|¾\Syµ<ãµ{-üñ}&Õàæ!Økq¾T*š*Sz5t3i½k·¿Ë"߯8=G‘wL˜ñÚƒ2kÆ ×ŸÓ‚x’Ö­KÕÚ¡î ô¿\l@M­…ƒ0Ú0Ýæe„ÁD¸¢é ÔÃTÈ-®ò™*Xü¾V2‚C†Ûò`jÄ|Tˆ#ß`Ù´µ.Mô¤œªŸ1½Ý$`$Ë•ö;y.Z‘y‹Z§$tf“ 2hu6NÌuÔîê;P/f¢/Z<ƒti¨pSa2äÛ@& WÅ„EÓ·¸ÌvDš4#uñ$‰z¤Â¢[>tö-‰}¥Æl,çøËxXbX›èz¤J¤+eçiQú>ˆ‰iÈ áf —Äh,›0/UÓ’ò*úî7“£á­“dzzÈty05B_¿R­Tjs™Ló¨ßéëuŠïž&/@Q4K½|èûCLíDC(çZÕÇ/»±r­=ⸯ"Hd©R}áü®Ô/&Ö0Iy•o0†z”½L(æ¶@¤Ë+ÄqÕš†íTI¥ZÚ4ÓBº<æ46a9³Â dúp –îÉI•£§tk_ΚªAâˆìˆ-¦>;å97‘][ÕÍ®ºo&:±÷«Wy…$_ˆÉeªH5Ú4Ó³~éꚨxk0íC¨Ô8¬lŒ~ ²°V1µ°LÂ+Z±îÝ.åÆMÅj§ñ°7ÓBR^å›Tl¯Œ$9LÕ»¼FÌ7R­T£M3=ëwºz ëYbSϼŒƒí8K·Zv7Æâ¨ËL`Œ¼¤k bzhH·ø^Ý&ëIv JâYCX.`Q®WWY^ö„ l»¨FÌæ¢ß±•ÞnªbáþVz4“Kþ­™ŠŸA=k^ÜhÎPœL3¨ç@†k=© ®l%UÌ"L,ž¹k4wò8ˆC•½–ég0MŽ›©[^å‹aR5¨6Lk—‰É߀§<˜1\ãè`"­Í0 Òú•ú¬e\êa% c®Ï¸b×¥Åð-ÏôÜaP‹êÜ2?ˆÞ…¶ãÌÁ‚”³üeòàÝÏúWùccÇ}™8ê£Ãtq˜‹»'ß2Uš#5§ÿÚ2³ñПþUëuFœ+©[ÛUï`ìÓQ¤ž’#UZ[„[?Þ˜lXSsDªNÄ’ˆ*H-$ÅU6SE°4ö%ê–=¥E¹´¾ÙF¦•ªå®¶Î‘ÑhÒÅirâˆÎ(:Ê®Ÿ«Õ aEbÆ!Šwµø„ÇeªœÔý´A^³0f)›o[¬–Ó邱GÉtœð»8vWújìîEćKtãO{±¸ª°5º4Ó“vÚË#zîþ˜téx˜^ Ê»™,xËÞû²)s(×Ï:ž¯AøÖÀxÑia"®7S!·¸Ê—µ¥"Y‰ì2ñùf½ÜåÁÔˆùXþՓÓêêÒDˆr{`+c9]JOðÝŠc>/¤^'åw¹•[;¸ó0 x˜§«ñAdÊ<ÂMªr+'U˜L3HJ«|1Rº‹]LŒ“ÜÄÙå5B£_©¹›g~—fŒ=ŽçgsF÷!‚“íÄrÑ9Å7–kܱ³ÿæS¢‰ÔIÉmM*CQ´|gz°¬½8“K¾fbz9HÊ«|bpa¼1ÚóbÂV“õS—S#æËŽH©V*µÙLÏú©>Ù‹­|ãHŠkJÆñ‹ÑOr„Ë® =ü?*>VþÁmW?F Þ.µL*º.–š ÍTHj+åU¾NE·`°ÙL´…—Wy˜o¤Z©F›fzÖï4z꙽xö“«þ¸•~ÓÄê]3î–Lªqg56¡“:Ðuãgý¶ÏzN£iù¤ðÀ‰]‘¿›£)‰nb®¼Õléu2vyüÄr¢Ê‚©ó!FɳRµÌÃ4Z”f”Gs×2Ž•s?ªgm%å hÍÚ"XÅ׬=•ßsm4œT™SÏÚÊžâ*_§Âºëù0±ýãñø™µ¹RÀ\=k¨Im6KM㧨|ÜD÷ÁAA”^}/fÍ2j;C&ìžmÇÌ@£[ÿvB’œ£Ü$ØÀ=¤Yé²Ì¶0è8ã QBÍéöÁqŠeõï*«Ä™$K YÈTHÚ1zÙ¸™ 40rñ†,n- jf`~àV`Rýf#šy…m ÞuˆÐÅœk(ë1U.暪™˜µ¼È5åU>1¸<Íc¸˜<ñã±<ò5b¾‘jR1ø Íf*d—g—¦1‹Å¡ªV¢ c®›®Äý_Øt@µ@¸ ¦ôøaq"ñ¡ÄÁHÀ±“îÖM1’ÚJyæ[©°ïh&ê5Ô*®€*­e*èA•Ð< ]Xø ôo¤ÃªcÈSç‚Áxˆ†Ñ$ª¦¦‡Ïoúœ†‡Á ¿ÁÚGïb)dÊêyÎTÁb_½D¬fÂSVýö[qV’‘¸Y–êUƒ—Ó “LJÃÿ&Ún,^ÒÎ ŒÄÝs 9Ù[öB‚¹Ê¸ÃE bvÌ ßŒ®¤ÆÍ´ËSã›Ê6Ãl¶˜è¹wS—WHòT)gk3Lƒðýª_¾êOÎ<ì]¿º>!Æ©>+u@v°ß ì€ìƒ9ÉÔÖ̲š#¼øVâ-xÄÊöù·N D j~7Oý>e™G„sM–wÚ Ý‚‡„ójçÜrXÒAª¤’ç`îÁÕc3-HÍRnV9—›_n9h¤ºÆâvJäâ½N¨Kü ?âíp¿¸ Ö­n¥âp?¾ —©ˆeqf;‰ËӔˣ2tÙUÚAª´’é`ÙwUŠèI·™¤sŠ|¸ÈÍuu°è‡“œ%L‰¹…ä,ÚGR‰­ƒ ôWæÒºu0†•ª©f*¤:”åU>Scãå²à0©§æ™§)/5Ä|Gª›Š‰ùhÓL ‰~ÝÏÿþ˂ӱkL{°2 f3ay­y³Ž‰ip¾Ù Üxp\Hæm"²‘ŒTìÌêHx˜rÊCI†-ƒ¤˜T¬/BUq ˜‹¹<2­4£Š4I"R½KåÒâìWsˆ|„dëq ”ᘂÖÀ îù­ûS»)ˆw¡Ò'‚ ;æº uS±öÊ]¨ËtS\å3UäÊñÌe"oa–u÷ê æ;RLäè"Q¶Þˆr§µË~ÈÄu•úƒù¨L½ÓŒéÍH¥Õ”31:Ço”Ï"â#`ðÁ¹hÉ[;•V̰7‹-¤S^åëT¬×|æp11&ÇáÀEK•׈ùFªI5Ú Ó ­ŸêÑ þ»7Sð õH"¾\3‹s ¯§yÚçjQû©«—\%8ˆã }ÕG`NªÜö&p«R…É4TyÞF«Z-5“3,ÂVy…dŒ©{Ð&LHô;­? C1Dýß,†zÓÝ‹n½‹Y0àØQÈ,šèzNël XÔôÈnx~#Ir8ÐI2gç½XÊ´Ü!-Ê}6ÞB¾¿riÐCË\æjŽWø{~WI%Ì$é}÷%Y@ô_ÿþ?ÌÿB‚"àuÁÀ¾þù7V"è±’éB å¿ÿ!];„¥×êæ@žÐÙüý¿ÿý?ýý?¾L|X¨púþè5âO4‹y´xƒšÁåÕÆ›Ô§R1B0ÃÒý·ÐkÌXȘâY$Ÿ}ËüÖ ?µq†ôÅ| ×d¾Ì3ÌOm¼7Ì_æç/ó[ãüežþ2¿5ÐO žq}ÕóÞ¬çÙ7ñ;cýÔÅÙ7ñ[ƒýežÑ~j™+C™Þ¬‹3¶/™ôó´_ï›øêâ ï›ø­˜Ïø¾˜ôZ]\æó§ýÞó‰(‚DW”»yºÃLõêÚ¿+.“°=ØÜƒ½ÉM¨{v¼Üƒ½ÇíÍS<ð¸/æYÖëuÂë «è|:{ÕÞ”{''Rö&7Îú.5¶Ôz™@œ“²¿õ1ЛÌú:ˆÜÈ{s&ÌF!~âÓ9.ö&wL˜}šxÚué1or^‹½ÉCÏ#ôfcorsžé¥¤]ÛÄkì½vä$‘y¬k«ó]ì=¹ñZgÛªâíØ{K$¾~z¾]Ç=c?®r½ñ^Ð;Æ´™ ó™ Þ³¦1'Ö\°˜/ôŽÌ3êÓtø6»K^Ð[Ì=\‘Ï4ð^]|?#þ"¾Ð[÷€¿ˆy‡÷ ÷—÷"oñö`›î ÿïÕpþKÜüßcqþò.èz˜Q~1ŸÿM™Ï¿˜/ô–Ìg„¿7ƒþ{2Ïø~e^Ð;2Ïè~™ôóŒí—yAo1c­þí W;Þ‹ñ 'Gϧ¿ôÚŽå #'7°pø&3–ÁíuÏ,òâü¢_$~6–ð2ñͳ»9T±2¸:Æ^ qꪓo“ô‡;Øú_döª±©p­€Ø¶ßA¸ÁjðÍW‰qÎ`ý²‰ò&ñQܱ¸†ä"'JÄ"þö÷§­³zUèO<Ôgƒø÷„ûË˼µ.G¼/V±îy<8Ä9Ç)/Ÿ.~¢ydÖáåŠXÏ©êÁÓÒ_Ôû‹=.õ¹hd¶ùá øíeâGxÓU85ÿ ÜËþgy=ùQÞ·h%Áÿ½Y 5έáwêá™fFî…ù­¶ûÄw¦€è¡?Öë]îÏ#÷;ʢͩ¼òI¾Ø“S‡ÎT|ý~kúÄwºr¸{Ô{QæOñ+¦ùÄg­óæ¨ô‰™g­Óƒà‹ÍøLó¬˜ÞcžÓ¥góf}|â9Ó­ë¥wÚð®˜NÞ5Ó{Ãô]Ùž3‘»jÂïùÅAiñÂqê!k>Ö6/o¿oEð~¡4ô‹Y+½9*¥Ë¹|áâ*'ÉÓ77)ß™ gpxNwvÅ…”+y&+) œi‘Çí_¯ãO4›ùW|ߨoŽ„‡çT„+\9T~qÀÈg}YäíiûÛ//¼ÌûÈïLÚDdøÿÀÀQ,òö¤ýí™´‡v&Û÷êá™gª}¯åži`¾“á{ÝíÏæ~ï#ê¦9õátýÆ=“uÒ3Åž‘ãÅÏãòÎÛÞ‹ÔÏ40ÏTýóLÕwDž)öÍúøÄs¦(§ê×ÛïÎOÕ~wš~«·ÝÙtzÛ…xµûå½Ã3Ë©'j”¼'ñZ¯¸Ñ4ôŠ™¨F"oø˜š ÛDÏÆ—KÝ^'$7K±é±0ùëÿú_þþŸÿþ?þæ‚ößÿ7‘Šþþ÷¿ýý_þûÿøú÷ÿúþ÷[ÿ÷£ÿûÓÿÞ+IÜ¢=W’úŸ§È}#éÇW.³GÿNttL·Ì¨¸:`fËGkºÛþTÿYâby ®²žkù_"&XÛi„"IŒpb¼rƒÛѪÂÕΉ‰ôÿÞGá脊ˆeŠÉŸh€\Y|Qàg©ëj’þRD´û¼øëx±øÞ¨Ä]íLNœ/þƒÅì¿È¼iŒjî8âÙj±—ªƒ»ÛÏntê“økãË¿óMr.õ“øAï1¦YÔã3õRmxýA½@:.zG‘^b>,uӂż÷EX`„êû`o1Ÿ«‹ø@ïñÎÝ‹øŸÝ½ø—:ó©‰{ó‚ømÿ¯·ëþS´çŽÅª†½U ç†Åæý'wëþsòÖý C–LýÚØëv_ß묵ÚëêW÷´½UçvÅ¿ã•P w÷hs·âñ˨ï~÷¾ÅÔðÞ“xn[\ÞrÛâ?Õ%ÎÅŠÕ#ô–¼sÓâ´Û?¹Y÷Ÿv]¬ë^vn^¼%ì¹Q±*á@ïñ抾>›ø`/1@†{u¬ר>sÔ`ïQŸ‘|Ítz“xF÷ù­ÑC³;•q‡÷KüO.ÖýKýmjùŒæ«*ô^UÜ~$>ЛÄg8ß"ìMêã¯ÌÿäZÝ¿TËÓ|gH_"è=‰gHßÌgè“z.QOe¼5ÎO—;wè¶Èï ôC|†õE| —ªbšo†ú©‰wÆú+ï ö—÷ŸÜ©û—ºÛŸ¡}UÄ^ªˆK|†öÍ|°—¨‰mÅãbX~rµ©âd„à›ÿÈ~ü/Uů³k7€‹˜)ÎNü׋ÿ$% «Òû@ÃKQ/ªÿÄbâ>fÌ]T_>Ræ5§.cýƒ+Šÿb<±<cìçþØ‹•0ÄÅòP ?|Õ„`×C±HløƒtŒô»~$‘–Xl:úøÆ¼W_ä}b‘“œ×Þã}$–§Ibïày£žY$Æ­œ“Gxßh·'’ЖoA¿ÑÑx|>Þh‡åøOãË®ˆ—¿â©…pxmÑsº÷Æ›'åä2ƒ¶Lx‰ûªá«‡×ïØ{:È¡à°è&JÑ‹_Ãb@Я?2v•Í{¯~a$Òö o¢ò¼(ë‹Ä5³½ÉûH²Úë½z8­~X$®/÷½6{" m}s§k¼V¿ç;,Ä9 {±C\âbÙ‘“ì—y3r€áA¶ †[åïœi<³@<œ×jw3H8ùuÆM!åùîÞÑý‰DÚ ï´Óf°Öìμrôju†ÄÓ«éSÅ+Tä‹íTÒñÆ‹‚µªåº°‡Oo’†c5?¬\ݹº–×rì=q{M×$Òöò‘˜ß9?|±žXˆ+üÕúâby¨Z}IþE‘§*šFêZšÒE¼ìö*ñ#‰´½2%ލãÙ«ÆôO4R×âô]æ'ˆÏêô½ºxf‘¸fJ,{§õžYB\s%æ…œá¼Ö-ΔvXˆßùD.q±ìªxcšŠ8P/RÏÈñb-Ôrù(k¯t¾ü£ËžÿÒ.؇ÿòÌ &'7ƒOóéÇkŸÝ†÷Ç ,½G¬Ë-³Ùù@os¸kðŸM<—sˆ÷âŠäûO@ÜO/‘/öžÌ„¦þúg°÷¨·ûù§¡·ˆñåùø§¡÷ˆõZyìrqdz«‰oŒk‘ïëݳÿ‹½%3Èú=F¹ì=êŸ8Êrƒh Íc=½GÌÛ NÇ›ø@ïÅÞô(p#o5ßo %DûyøboIŒ›7çèº_uq±·¨¹Î‡-9/eÃÉÅÞ¢ž!þ†•X^Þé~i¢:Cü"îyà=ÇÞêÌ ¿xyGÞ3Àßh#y‹÷ ùWàñß« ^«1_è-™{À_ă¼Ã{ÆûË{‘·x{¸¿mwFû÷jxFö%ð™ÞcžÁþ2/èº8û"î¡þM‰{\_¼ƒ¼%oë·é¾àÖÔ¯¸ z‡yÆô˼ w˜gH¿Ì z‡™‘Œð®,;Ù xÝ&7¨Ã7”9ñûkÃü÷?,Ày“†åþÞù÷,ÏX_x¤—Y–ŸÌtxÐ|¾ôü/mp>±„8Ž(0¿'¯÷³¹"<4R{A›+o<@ùÝ©û¥9ôË"þéã@oÒÇ®‚žrÀú¢×4UÜqh¤&Tμ¿1¹ýƒØIÿbÓ=pHÊq”·ö?~óÊË\q_¬Þg©s ë]âGisÛ€ïUċĹ®ñqjüÅŠx$ m]Ìûx«Ÿõu«&Ù´o~‡øÐÜŠxóS®ŠKcÆ3|âÞ|žX”×û0^äuõêÁ¥+^ŠC¼\(Mð¯¼sõár¾9öR€uQp_Pí!ïUÂ'ï'0!émòf-|¢‘šÓqþ]êgšÜª¨{2oÖó|ލ‡FjnÚØÝÞk¿g‰’œºŸ¼Ö/žH.í£Ä‘ìLFSo iŸXv³½3Ïm3’K|úÈ[ÓÑg©Ïò&õ3 Ôç£~«6žH¤uìx¯í(BYƒÜ;½ì ”ÓÍðÖñõ‹Ùù®î x ·f¢O,<ÏûÅ·¹ð1ãÅKñg©é^œ#Ü%ì‹ÔÏ4¡®¥ß{Ka$|¢ÙÔotŒK|zÆ­Œ·zñgš4aœ|ÎØñb-ÿy –=3a]]¾³þLêx>½ÍüÈ"±OfFæ7¶ŸX$®·–Þƒ>±„8¾¼ï,‰¡Ý‹ô¬d_ë‡ö°¬jxoJe~ôÀPKbêÜ3x÷»ïlÈ?Ó(4«a}Z³ý—ÿŽ›ÙÿöÜÒæ=Ò?¿¹|íK¿ÿño'ª9±òx_™c¹ïyÂì`þ¡>|Þ»kž¨]°\H[¦·ÜÏ]Ø¿Á´°¼®zi¸.ÿ‹Ü«¬F,k$Z©T„çŵ»Éó¬Ùyå6o9³OÔ¸ÄSÖ¼ÇÊW—­ãˆõø‡Ú7OTÓSXŽ|°³ÔŽA;b‚äß‚±~@Ïê~ Aš‰ …Tq•m ˆ"ya…¢¼]\#ÿ¶…šTK—fZˆÚ¶æ%vz%r~ýòíûZKƒýð¡‘ï¼´lª_¾k‹üù½€n민||U;â­¤‰ŒâÖˆÅuiŒÖáùsí[&šôû÷ïaªâ H¶‘©±%÷-Mª¸|՘ɱ¾|áíV¿ê…}§ üø™¾Àªó’Šp4S:‹ä£æÞÍwFQuîTizŽiJs¾Ç´õÆ>M˜3~ÿä¥røŸD&?:àA¨|}%`ËÅœ~³‹ªx`aö›Ë:†/nÿpÛs—ÖH•†H© 1¯"‡g†5Ë÷Ììôå7š2qwE+•3Ö` ØÝ¨Ö£žÁ<~p¥¡”±·ùò3ó|*!©˜Š˜É[aˆøR IÕ¥8òÝT¬]|ý{1áËÿ‡®¶Êk¤ÊC¨tN4rÑ ­]tfôíW ú…î¨ÎE0É@n‡ñ8v Ÿ7íE~²Ñ‹‚A,Vy•îT¬–¿™ I¾”g¾Á蘎‹‰¾û“û” ƒTy-Õ¤m†iº¸úu? ´¿²@ãÓãÞ‚1’žê¬ý¥NE¾þ?­½Ý®G’žyΫ Ï(À¥Ú?äæÞö`€ž=è{܆ ðVPKâ4EªIª«Ú×3WdWúZæyÞˆŒ/×¢J%ì5uPZûefüäOddd|™¬Û)Dç°zy 9fw­ÏT0Š 5¥®MÚiJdÊ.DvU­ >9xÉ.OB $Í9ë»…Xo µ°CðƒÒ™v¶kqV ¥ºz Ù¤VìÁžãf¤”«HiƒËrékôQ@ÙYg±›ÌUᘥ¡ mHعò.LI¹x£¤6·l»3ì ;LydZØÒŸxk—Ñîꌉ WøÚŽö{”›…ÏmxA®®4„ aðéÝ27‹çu«e TbÁ^€Ü4iºgÁ”ôŠËAHm®¸jGŠÝB¬Çª…Pø»U*.cérP:×®Çz›sVÀ»2”÷¡Ì[aÑ•ÓÞKhJ¹Ð»¼r8V£^a€^Üc褴ÊÜÜ÷ô‘LåA¬ª†ÄwD•7B ì4n‹[#q–HG©¥ÊAi!K¹ô7ßTqiA Ê×/õÐvŒÄj4!w½æç=cÉ­L*é94¼¿á²©…=Á±«–iJ"?kJ!ëË—¶èPáH›] ¿FRoIµ°CòƒÒ¹~jí¦³}rL~\"rØñS׬¬Êò0â»rSÀ.cWH¯âxE µ•j]†Ò¹v5ܹæÁ0ªCÆÿÁiÍuy¬@O…îtb-“ €ÈA§ >q°é ©AûâÁ ê¢Ä;:(mHØU½.e44þ)¾PQ"Šar™”š_#%yK5¥¢ ì†ÐJ¹ÌtJ…‘Š(œ+ø Fˆ±BsO$¹Ø.dâ‰ØŽqã‰G!lmâ‰oBv=ÆW)‹îP*B.p=ŸŠY5À[¢£Ì("•Q#]мj|—“ŠLœaGaï`w:®Ž¯rR)õÀÒƒz©Õ¡"5ÀËMÝK• Ò”èäx®‹_ÕƒÂsQ¨7%â–x”Ã/ýÄz#Õ”*ÉwJ›.ÑÏ~KˆœM8K7·ÜÝ<°‚0²w¬1œ J‘‰¹¾fZÂP#šÿò9O† &‚É`’x‡^†h#¡~U¯KùÔ5ù Äþî†ØÎÆ¯ëT[©Öf(ë­ ?Ñ›ŒHäâc¾åžŠµŽDUô³“$7ÔŒ/| ùn!ί+läÄ]½¦«^¾d7»0£ÖŽñu cÓAðëlÉû)^¸k]M¡M&³!Íl_·bÑ_h¤CîщYÝXtà±7vò+c‚àÎ1È]=yâø@t`lY å*…´~;"Ò„ivVÛ°ÛìyŠÕX*®ï¯sÔÜ qJ25¶ÉÍè/B®Wœ|,íÊ’áQ´×l‰ Bƒ`«GÏ[‰%£/ŸÓ=G)üNL¼<¥9”Þ1eÅ” ¥¥ÏÁïÐúj+5Ú%Ê ’>uˆërX×Cܰ<=½c÷÷,^:žY‰•þúþ rË÷ÑGĶ7LÆY݉k«QÞ”6„Ïó_ÚZ{)¾ág”<¡Çîlü±ÞHURmÚ4¥ ‘r¢5y°/ða‘s†Rj½cÜ6Ŧ×lY} KêĨr,b¤{ÁEÙ§¥nÜÚ9ÜæX Œ™ÜªV•Aô7×kZvcÖˆÕJ$HM©Qe( ÒÊ©²;îòQˆÇ½¼70Ê'”ð¸&ä`Dn0â&n‚Ù˜àœRŠHà5ÅÇ»ávÐA´Ol^‹éRäÍ»PoJl"?´OäpaW÷l?6Jì¬=w3l;"fXkd:ÊŒØMfS¤™Å®ESñÁ0çŒzÚ€uªòø7ìáŸTOÍÈ¿ÊqZ±F‚ñ úF¼Ù90d€ …-wÍtúj!áVÕãñ˜‰5z„ ¾๮Ð}Å­«-‘¶B£‰tRD„†kÝ2â݉Üx²#:§¾=<7p¯×ãaúåô—ì6€X#ŒA0–Œêô)usÏž5*%Š/DvUM(r±!–ÝrZá‹È®AÄz#Ô”*]vJgÚ©òqL¤ÛcžÅ¦û©;; ,çKgíÒ´v 4Ë Ã7™É¾—ººÕ3²»‹’üFZwª Tº„–V /¯Â®ÎÊ¡¦Ô¦KSÚb‡3bxí–©z’Ÿ`™š"xM¥s&y"Ü[ý‚ 3ÑÀçÜÔ=X⊬û¶ _ak.,3HÏ»,³s£TXàvôäšä›L«Ì¦J“Ù_˜ä¦­xŽuGÆ·GäÄÇîoñ¿âÅÞæÌ?EŸ’…í.ç þí ÇËäãÈtV0¯­—l“Ø0ªJSêêÁ(b‘!‰ÂmÚ95b5–´’fJmZ4¡B Ôz9Ú=*}~ã)>èí¶Í½ç†1¶Ÿáf8Ê\y¶­³HL„¾­ .Ÿ9 &Bâ`ˆ7¡·ªUeHx`Ï?´É0=hãÅ :X¨Y‰4¥Fì¡4H+›†Gz‹yˆT·ÌœrRÂcaí¥‘¶Ö˜hBÜF¦¯H_`Œã6Þ‰>0"ŒzÚ³)mˆì˜ŸG!$½ÃyÜ¡gÓ"Í®ÙP…å¸JgÚEeO{Ý:ÙÉ´š*o_½ãšáèñ"s5 ),î=éO“B¬DKæKÎKh”—ÖRª(á|¾\HØQïÀ”«dwJ(cxãWˆNÞ!Õ”Zº ¡´r§Vo'GÈ›îÈñ ïx”ûPU/ñæVtSÿòž=´ª‰@ØÓ8˜Ìºú ƒ,ålÉ|PZjüAy°–j+¥6ðJçú¥Ãuø^ê© W±8 ‹Ârü]#ÚþæÏ»«›*& âŽUÃ^³­ÀÙ"±#mÄNJi{p‰õdC§íÓâEb׊[‰3…6-bÄ–éfWKöw›‰tG¨ +Dj7rí‰7xÍÕ‡œ¾3'î°7”¸â2ŸAÚÓd"¥*O“á@ËC»SZ@˜±…ƱìŠÝ@Ó1g³ÔæÖ¶ °5Ê´•Bj"öx¡shQ¼â›Ïy>è­¦‰âóñKÆeßzŠ8YØ(uï¼á†\ŒÕB´«¨GlõÀD²å¿J€nU«ÊŠ~‘¼!C¸š‡wvfX­D‚ÔVªUJçÊÎo=Ô}#)9 Ý1Äb'ª7˜c楞HF/„ˆYgß%$XÇÚ M‰.ÎA7ˆüÚGmŒþCÛ¹,/Üü Y>jIÕ˜¥Z›¡4HëWg®BÔÙ>ßB°?,)×Y¯(CÚécü¸Òž7ûŠ^·9/ÚJ]£MJ5%˜,Dn´¤¢›ØvTH½Ñ•æbyAÖî ¥®Ÿ_=dôw)µçLƒj„PÚð³Þ†ñ9Dñ+J‘‡EÚÅo!ů¤Z؉äMé\¿ŒmÌ;ó”KŠnøA0N­ŒlëÛ,¸WÎ]ž©EHÚÞŃýÝ“AÂÅêŽI3˜{ÐçAšÒ ͯêY ZX&ôvJ°yp÷Óü"gëT[)µÙ)ë·ÆùœsòéûAzš8Ñ:ÖŒÕé&~ÊMøtæÚÖÒy¸æþn!Z£cí Üä|âJ‘'îªM)Ž„ëX³±‡&îºskÄjÕ RSÊZëÒ„6$Ú­.¯ÄyÄ"9,Ù+4¥ÔtïÌ^©dz|4öÆ´<Y@÷xRà–Oê|*‡¥f×=¾°›{ÏR;E‰Ý™ »üâbdšB%wú¯ mH´‹Î¬ò„f^¿†!íنݳˆÜrf^=è§%",¸£hÃß•@Ãá›!ˆ…ÅѸeØK»è[«¿å³t@Éj(‡ ÝljÂ𪡉¶R£HSÚÔhvuÎɉ±'«d¾y‰\sŠq’ŠM½eÕ1JCÔ›1ËvˆÖ¯¨ö††ZCÍÓIVbõS 3ðÒïFJ~UoJ]¹”¸/ØKó Ø5`­%ÓVfÄn2᥈Ìp+p„¯Â~H¡îѳG…¹ß{Ad7+~b¨ /^$ª­Wà²CeŽn bï¥ð¨%A¿ª7_j_Wì(”(uãµå…Èo!Öc‘ŠT mšÒ†D¿Œlœ“|à„Xx0šï á¥Ù åÓ¡·(sO áÞóÄ{mı†ÁÃE¥ ¥âyàÉР”jJ„X"7#G BrC‹]Áÿ)§¥Ø-¤Ø•P%rMB§ªÕD¦¡®o©¯#Ö‰¼a/ˆ™Tä('êgRs|V®ÒXD+„c‚³p`"œûu·‡ÒŽ„_Õ«RJêyÊAIeœm¿FVä(R¥–äCi×¥ùy¸‰½óÈ9C›´Í×`èH¶ly$ÕUÛð)¦¡úÔSïêA¤ÇÇ j[}o)‰™95€T÷pëZ)£è®C„›ÊÊ’YLN™/ŠH{©Q¥))»:Ù|ÎZj\öÇ„’XÏp,«Ñ.‚nså§(†qø”-%?8ÍŽÊü$œÇZ¹0Ká^¡³*Þ‡Ò†„Òï¥H2–ߢ„q"A¤ŽD‹ßB¬·¤Z˜ÈHÞ” 9ô‹ ã²cøÜ;ÌcÅZ° !ñ׃O>AÓ§~žnÒ Ë8öy!?¬©Ï¦«SÒ Ý”6DnV+Rœ{]1÷7B q+À°C€FŠ] 5¥M$ôdW¤˜a²z1½ì^b]QøÀXíÙÒÁ7`î¢qYSLTÊï<Qt[t$]º0’"4¡4·ŠU·Î¼62n¹q~7fÈ IJ¤­”ª¤åšÒ¹réaü6â¥v±çÂèî*µa±˜"ÄY9O¢VÕÚÓÍ HQQ“j†.ÅPð³K5¥BB)üª^—òØ›XÀFÉCnZvã׈õFª­Tk3”6]šß~„©£™ã[Õ'à C¶C™yñór|K!> Àœê{æÌ»_#Ö©¦Ti“&mJçúŘUdq¯ACnkÒì YÙdÄçÇ)(é¹ÿ©vø)8j(‚ì(ðSpP&BOWk¥adʯêY*-Ï mLl(1Yž{Ô‹Lò‹>A¨ÖRm¥Ôf£tè2üöE[/>Ÿ ÛéXu7]†ú„›*“ò*™v(ë-)Ù#ðQr©*‚8ì^L80N†[ý¢4Hó«z]ŠzÇLÙ(ÑŒÇ_!nº“ô2I]jÓ¦)mHôK§ãë“mw|É1Þ1µ¹skJëb£Žïò¡eh¨ÉM2«;Mrñc=b§ÉÝ?AŠÒ„]WëBèìh#„†ÉFÙ¥3ƒÀîj+5º¥C•ÅîÄ ÷×Úì>noš^ëoÄûv`¬ ¶»H‚†^—òœïʳG`ßGµ ©°#!B‡8 ñÍL®iBƒ4;ëm¾ÇÆ%Îî Gˆ»¬62M¡M ¥ŒÚqv?ìzSrŸ< #kxÇè즤0²ž ®×à^§áÝ}[„%Ñ2°¡Õm½U†•:§ÒMffVÕ,±HÈ•ÙB+¿‡\Ü Ýˆõð>K¤­”bï”F‘ágè §ˆZ¨½àŠÁµ)YÑ4xêþß>RkRƒ`ï«‚ …¡ñ|äx”¢w\{•µ)¹Â¯êM)¾´¨MISâ$ØKA• ù5b½‘j+5Ú4¥sý2Áñè_°صÖË‹d‘U$ÎçR'›nª Z73νˆgª à†¬@ë\›“…´Î'¥"éA¨•`Û-·¥râà%ÒÚ4i:ÒÜv‹Ž_ÏuÕþ^—l-PöŽ*;ÒÜr”º©|ö’/5v AsJÝp&’AÑ¥˜°×ùúV/JÂ¥DFß°›8ä%›ˆ.íæ×Hñk©¦Ô!x:¹a|p\pܯ½ª„þ`råk§˜Œ¹ ŠMBòÔ¹L€`ÝKcW0®X±k§Ù£f:‹4¥Ašõ6ì†f¬ôÓ¢„.,ß·ü]¼Z¢.qh! ªHGF-uݶ#L¸Ò¹·Þ«S‹!ã˜T'kº³¡Ck,ǘ#Û N/{'¤TnJtV!eLm*“û“»Qj³¬DÍoŒ·XKUX¤jMšÎ©f¥v_ç–# ³Ä Y¹ {Ö6DŒÃbºï¾œ^RTExœƒ’”ÙA0/4;@b¡ìDivUm°ç|Á±"8x­Q?¸5R;‘–iJmº4¡ ‰v*r6س"Œ,ƒ±å€ñE(cðŠqð(¢…éÃìHã¨Ööвr™I5Y—¹2ÿa#ÃÈB¬ª Ff ÌŠõ`BviNEš[!aG0¼Dj,g K즴)"¿Ìí#AÿÆ”d$ë,ŽêŽÝù¡{ƒ‡O³)õp¥[rGÜ5m„± æ¼{)v—~Én½¦´!ág½Â E$šÏÙwJlòî°‹”)~-Õ”*mvJçúÅ´­3å"Ÿ7¡òㆠ¤ÀÇçÈίª –[ ‚çR])ØSäLä(’Ó©¥FÒZáWõº^39ž;%\ä;CåHÐü¡Þ!Õ”ê3Û¦(íº4? :Ž}O•‹UÒ%¬¡Æ·7î@ôìqH£¾KdÑ‚ì@Ì¢ÝKUÎìN©³h»ªFµÆÏ"ÉnÑØÉ)F€fWˆVñj+5º4¥3íÒÑœ"Üð¿ @g¾ÑÓk»¦÷ÿ`ºÆ®‰¼àï@Œü%?¯RÙ’Ü/ t³QÀ˜µŠ1ÚÈ´ÁZÌÒt1tŬEšR›*MiCƬ9µ¯žøE:Î-+‰©bÆxhõòÊ£•=V·› s óP\×™SZ£:@ì–ë`AH«2ßi(1K i~Uo0^¢åt÷ Ä–•§v~”ì-Õ”Ú´iJýά:‹ª·ª>‰Ù”àùÆIñDÍabã—Ónv»ÖßÈ‚{΄‰œ"„”ñ¨B¹©lˆ¼l2ªM)ƒå5„Òs?k¸³¬VA¼°äÒŒÐMhS#ª•æ+¤º¼t5'©Òõl¼t1:‹Ú^ºZyê¾~ó ÃöÒˆ—¾è^úp«jSŠ›]äVî¾Zgâ//}ÊVÑKhI–n:í¥oÜêÀ€vpÈ+!B\Þù`°Ãrâ7ñ t¼!¶âv€³"õ ‚ì`|Çì¸),Ù*L|‡:»(yV؈ü =Po0¾^4–5”ØBòÅE(5¿BRo¤jL9Gò¦´!Ñ/Æ O½äÊÁ˜Þmcxf8Ýñwy»º¦óºÅö?5ÑÂâHsaŽcº° Ü[íД°{…بzƒÅ>(“2ÅQ»ø5b=ú±¤ÚJ6Mit~›Û§Äùp‹L˜Í0×QYX:&ŽyÂ$¸áÿF! ˜N_â肇L„¤%×Þ°‹JáWõº#‰ÈÈN OžC˜_#Ö£•Kª­TK>”6]šßY©ߞ+É” ¶±ì/ˆôk·ƒ8T$÷¦IêåÁps€jA†RÜÌq”bN³Žytn©¢´#²³ïŒs? Ù(UJzòJš_'©¿–ª±\]†Ð¡Iqã~×ã;fíW¤­‹À*·Ã>i£W|…†)E´´ng¸½¿&L´í-þø5$33·ƒJ¥ ?ê5-Ü0Úi§„׆ÿ'v* ¸µL«Ì¨Rd0÷ƒ´r™ëøäuÏBÁ;»ñ{ÉÚaåý\pd-öã]Z]ÖˆýV—†-Ì¡íaÕEiCä§ØK‘ÛZüšm]û„æ–¿‹WKÔ%JtAÓ8×,ú.ÖNयâ-4H2™ì¾«\ ª‡}]»ñ˜AÆie-©oJt>Ò¢ÔHä ¿ª×¥ðñúvJöÇ–¿F¨·<ô)5’/JŸé­É‡ô°Œ>¤¬cƒÂJ2ö\ñ†ër.Ú”úÿ8†-!€¼0,]Ú…tµ=y³I!”4¦FKvÖ›R(d¶ÅF‰¶õ–Áƒ],ݰk™¦Ð¦KÚfWÁãú’Ÿ›1sfj锆ñ­Œ–º”€R˜q"Ø:®¹”`!NJOØÄ4w‡ŸiJzïÈ¥­×K:î”X¨0ìÉ i~…¤.h®JàBkKEª–|(mºD?{Z7Û¹˜²h½c¬¯½ey¡yæˆ'Z;©%_x6Òžf¾ÛJ±ªx ¬Ô›Ò†°º®«Q§ÃÓÃÒ“E½'C‘Ȝ ,DF€®„ÚJ2MH³ÕÃm¥êšì?ómOv¢†?ꉈÎ_ÝÓ„ªœix[8 Ksˆ8^ñ#‰P@ÝEµ&4H³ÓÕÜ0Vér‹lû•߯­¹L[)u‰ªMè\;;|/½»ç®¶ivºzç;ÆÞä̪îýö)ç³È‡7I˜Ý>mqô0óáõÂâ…šs&õ¦„_º,²rë«.ìú…×”·æÒoü q8¤šR›6MiCš_“ëVäâéF=> çºRÞ‚Ô­ ¦þêMzM@ÊA °º• KUX8ßq”ØÛ/D~ê5†ôùÐ÷ ÄüíèuÝJà„°§¹)¡¡Mì!Cá\¹ûfÆ'¦ÊA¾‰9´6~‡S¼1Ò]˜Wî¶¼šF'rer"QN>Q Yœ»áÎÊÐêR´A¢Ò†„ŸõãÓ5O$6J¶~ßù5b½‘jJ•6ðJçú•a#-"Ÿp ýsâ¶ {IÚL>á`x{èè%V:KäZÚZhiˆÂänã…‰8Plš&táVµVÖRo…2ˆî…‹Y)#b5¢)%Ò”ÚÄnJÒìv»†Céê9¾l^NÚ`y0È)eªG4e‡Æ Ç!«Tô °3Õ#-4¥*‰ÃqQ”*Õ#£"üªÞ”ºò%ÙŠá9nì °ÖÈ´Êlª4™ ifî¼—gcw·ÊÕ` ímÊŒŸ¶©<~ÚÂôÜôÀ6Jã¹-~¿c%ëA©Õ9؈-+߱ƀͲ«RdväPWç¥7Ï;ù>¦lÇø s ‚iæ¸Ç±kV¬w¯³z-Ññ¶<ào$Ô”5h:܈°¹i’¨ÕG‚Y+¯–7û³yÑpXk$ÚJµ&CçL7¸ÑÉùnàÓ¸¬×¥øqÂÚšœ8 "•ØAKñ¼KÖëNì­`Gb‡]J“Ø~H`ô /úˆ˜"¹½­~X-êR5&Bô§JKJú©õç¹zô S’›· ¤`Ùv¨®Ïáƒz_ú`¦Z°¢z`ØÆ&ªºô-L$rŠ4¥BBIvU­ y˶«ôAÈ›¸sÿ°[ˆõ–P ;?(ikÎÕäg1f‘ªUn(bõ‹¬ƒ·ºs£Œ¡ç|?³dã°Šá±°xëŽ ÅY¯Ãòbf%z‹Œ”Ce4^ )^JDŠÏj•Qä t¦Z­^Gø/}_¸tõ*, sqWyÅ\P ßã(Q†4 -ê!ÀØ^”~]Ši`$Åá^ÀµÜ¬Õe“-y1+2 /®<f á¬DZØ;mהΕË䯥%ñª†¢è™íXœ‘º|ÁÞ3_^äxx@„ɦ3>€•Ÿ½ÞhJxÞ ©ÇR¯0¤ç£®öÆC ÄkÌËù3ÐHø-©vH~P:ׯ'7ÜçÏpiY¢ª/#N¹ãƒ•иÇ|‘íáýR„ÏÏM9jDZdv¸ÆþÃ#Ò”6d©ß¥2\Ký¡4Š5¿tgîu/~%ÕQª´Ù)ë—NÇ©å@³ÆfÍkÝÚ2¯Éõ#5Ô’ 0¬ºDŒÛ¤Ê(v)b*Þ¯ó*ŒñP*KfjG²Ÿ²ßB*£%;Ø-¤Ø1X‰}ˆ}Ú)ng ÜéÔýͧªw’'#;ž€ >QiÊK„O JÏ C²Kwõ·X²É1­ÕßM 'a!<ºWkÒÂùŽ×ô6J ¤ÖWRIñkĶ©vH~PÚt‘®N¹¨u»Îl@ÖÅøû¦Ä›ä½ˆÿpÿ½’Þ ûÖ¦„«3ÁTõ¦„«2¦ÔÚn”6¤/â_›ha.ÜÆo”a^»¿øA»ù­MÉÂDj‹uP*$25¿íÌ ;‘dŸSz+ì‚S_;½+S-Ø è QæÚ.TöùB´Óž‹X˜ˆùçA|ËdÑ3̪ZbËâ°ÑawêE"Í­«E¤PêB#ô¢³Íì|kBáXQYVönW #”¦iÍ6ÀQ©çÉ`â„€QèÎäÆlÏ.” 3GX&„¯[H±sôRo0¦Fþ „áŠP*v¤½^25¶ÉíØ¡Ñd±Ë{p4¤7Dg“Ñ5íƒa%<æ¼-ÃbrOT„mY©#ânÁÅ3O)wÞ$R”)äWõº²bõXdžú`¾v~Pïj+5Ú¥C—á‡³Ž›_N½CœOðÕúÀè ûŽ!×öéù¢„ËzË}D”¾·]&ׯ¤é¬­Èâf,xÃPÐrms(Ã!ƾZˆ¼ÖödaKêŒú¦s®[3ÝwR œÌO´èÑ©y¼ä.™ËˆNM‹î|õ£š… { ަH€_ )BnŽº#·o£C¯_Ì<˜5Bµ)r[ŠåcÄÆ2†ÐŽ¨Û©5Ç÷%#Å4Âï±æ‘M¤·©¶n‚@Õè6ÝÇñã`bpµù0Éܦ)Å™½×%m” 9øU=K#X~C‰¨ÕÜè›ãNä b½‘j+5Ú4¥sýT?‰{ÉpÁéMOõ‰T¬i0ì†ÓKרP^´xδÈíº ¡ ú¦ð‚ä–^‘¦CÈŽ1Eíª ÆJd°‰Ý^aíØJìܱÚi+4šH'EDhüÖmõ|¹­zè~ê?³èä|lÇxè Û¦×î˜*á%ñÇóYèBb£èUoõL?>_|Ö¸ ¥ ‘_lâ†ñA SŠzM‰eßÌ‘æ×ãþª°øö£MS:×/3}ÅÉÓ(ÌæXôŽ7GV&Á;>Þ×:±ìA‡:±óÁDß(mˆÖÃÖÚKÅ~l”ÐÇ<|‘Äêñ‚ØZ+v¾° 9 _SÚti~;硞ša$…å*¼õÆèÙ|ÑÂÅ 5§ÉAeã&¢Z3:R€ñ}QÙ±Š“œR½_”0Ó…`Uà§ÖÔ,™q%¥÷1׃_!©7R5Æ”\’3rͱ;A¢ßÌòzY…\ÍûKVN>ü‰‘ÃŒd}Œ^Ó½=d)~¸MfËÅ}%¤v5âÄã´ß»rË9¾Ùˆ%Oö~Ôk Z¸×¾Ã¹Q¢ÏîÛ7?(5RüZª)U’ï”6]šÎŒe0Y ƒÆ¤r¨˜7£°iÕƒ"Û=*šPæß„à–6ùzˆø±9N*hN†ôošÊ ÅËáz”RòNÁmBD©yàzçÖˆõ"QĶP.)EšÐ¹jÕß+}¨+1'FšöÚ Šž Áß'ßE+ÒÔƒäÛ´A†RÜSª§*O2õ Ý!w¬‘âF­£ªßáâtГçάÜžC¤)µiÒ„6DÝbÕÖ© ňÕcë³òhÃ9þQNØEò9¤þQ’«€è@9õ_…âŒåŒ#Do› rãÖÌV`‚l”X«3ÆA,v¤ZŸúÛU¢ÚÈ=„YìÌåq˜æúÕë.³PናlûYã½1g,™£‹è®Þ-’÷ʼn“ÀAkD±ÀˆI[˜£™pî;HS¤øõ˜ïR¦«cø6JäL\¹98ø5RüZªÂ2èG›¦t®_-hìëB.Ìòºœg0Ü6¶ qô[ú;AÆÖ»5A J‘ÞØm“Rt0ö”­Z‡ÒŽ„õ ­uŒB¨óÂÝH³k¤†;¡-›tJ2‹Ð­Ýšèó…ÉÈd¶°6ðL{¯IPÃÏh_5·ï€0îÙW6AÙ2A4ÐhH^khM©¤o”ÂåáWõcx¼²Q"wA;´ñkÄz¬k%Õ”b]3Ý:/3¥BýT_ßÙÇîé¹É³¾6Ù0sy9æA,mµnåƒæÔ²\[Œ@[ÜÊðòTµKS!дðªjb%•ñŠÞ kÎâ]‚X·§Ò> V…6¡óáýçªeŒë–’Ï…ïŸÜefêpõQ9…Þÿ 6/È Žçh$­þv€]憧ê…y[ ¨ ÂÐWU³T~žÏÎB˜Kß 9˜5`5wŽh mŠH¨üÖÕjRc y+ ßù<- ãý5†p¢WàÙˆ ÂÓ!ú­ô±b!™Ôl:ì¤Á,EkW+4¥AQ>4†ôG)æ–Go"M‰Ä) Òü±žáâHUX¼éѦ).Å9ËKå›ï}$Ô¤›ñõcÝÔÛdNäN%F¿9ôdkWmô#óð”ÁiÍw•Nîâ|‚Ô –YUëRˆnæÁFˆø®ýέë•HÐÚJµØCiS$Êe*ôÙ/ŸûÁEÌTnŒ| OdÙ†2_z©a½ÿÄâ%BŠ]Ÿ¡@˜^`ùr0ä,Ñ!.¡|5·€p³ÖQæ*™W¶ ‰BÌéæJ¤)µ©Ò”6¤Ùi½È‰Í[ª—4ž â|‰§;S¨Þu@?_Ê7ƘÛRhPÈÌS±wÖ;ï†*B 3›iŠÐâ é z†oy¥‚X ¿+/M v—ÚiJbΡ]¬wrm¬Aß› ¼êkvY©,;“8ì7Köå@%®®‰›ár§Cñ.Å8Ë»ì l 4@ö9\Û1VšŠ–6!öV‰aGÍ´ E}ÃŒ¼Vp~К¤ž²ª,„ã;4ÝKq!.ñ¦Äd ‘]Ukˆé…éË•MˆéåpÜØ5b½jJ.CiÒÎî¾%D×úJ”gºFŽ7,ßáêårÝgiùÓ}² ¢ª' ì¸Þ} ݘÑÞjÏ&´!aÇ"´—ºöy£äîÞFG€b×€ìF¦)Trs(ìî:„6MŠ]ÙòÙuÖa¨™^²cE²œ+~\Xˆq [Eb‰Ð© ñNïk+ÌÉÙ –º—ìl¥|̽S*äàWõ,Œ°•ü†=XqЃðƒR#Ös&Eª)µiÓ”6$úe¦·ï¹¸-Çbã;l¹s +»Ü_îÄÕC÷¼£ ÀÜkGR[¡rÉBË%·‘eWõº39‰%ÔñKÓƒ]V™¦ÐrÉ!Þ„6DvLÊý4þ­{Ç£ËËçm,]®¯”ÎõëfëL•x™·ì8íGâv¬Þvs÷òÒÆê'árÓ/0 àöHœ[ ‚o–Ý‹5øVUSb?³ù¹8º9)Œ/GrGëA‰iËf4eš_#Ö© CªÑf( Òúe™ÃïgcI'" z•Ï·a/9OHÂ×’·Ö »Íxà%µÒPD‹k$Q5V)²wZë¢Äžf!áWõã)„Êð˜7ÁuÖYEócu±µ½¥*,ÈhÓ”6]š_ä²D”沯œ¹UÑùfE6LáÜ.ywëPù™ì=D·`u19ÕÄlòà ÄB ³TŒÞÉjr¢ñ ‡9a»ºá|aÙuEì!tèÑÜÐ?þžc{hÑËëm¼ÂJÐ|ìA)ânLq•Yã%l42°»¸÷iÜÁD^¼È  íBiG¯êu)DÍE%4\ã5¿F¨wHµ•Rä\”>ÓïtMÃé§lõIOm7ƒeBŠÔv{Mm‘+ïÕÙ¦¶Ûâ ÛÔaÖjJÒS{+…ÐNíŠ9µ7~ þ!UaÙXµäCiÓ%ú©þ‘+a§—A;Á”59H-Si‡A«­ÇÖ•öñRº‘c²Cø£Ô5{˜êºÒùàvè V©(ó´ He°Øåi½iíV—Ï#yu»Î"O¬&ËÓUæH…¯Kémˆñ§½ dìŒþ{Âm]ª<ó\ºÒ”ô\=šŸöPÿ½0®@7®¾Q"†Ë›?µ](~…¤ÞHÕ˜RµäCiÖOõ·›–c‹8,žÙ±3Fòåy”‹ òOºé…hf—»½0‘rÉùÑ”6$üª^¹÷y(Œc´Ÿ¸{iv´ZÖZn{CIÓΤɰ+·ºþÈüXå±!÷}aæ;è(çc*uZáõã©<M˜ë£¾úz/t¶¿åŲd­.CžPv C†%˜Œ³°ofX­DJ[Xª‚ç%ô"ÄÀXZD³Ìs<ö[ïüª^cìUà³S¢·ü0aãWˆƒCw½¤šRô{I>”iýÒÍ”âf"(·ÝÖݱô€ã—¼.Ýfq¿Œñ(Byõ4_#ÈF„Ζ),Nz]žV%FI®ovN\òÁˆï¿¦¤ì&Ëü I=‚‡¹žœœøxˆttiB r¼sbÍܘ}ð¥³~-Oço0sXË#õö) åµ¼òGŸsmÝB4/PàÔj+Eæ ~šM᪡èóF²ÞO1+2ü7ó3²„)fÜ«€H ;¤8Ö£Eó*÷”OšK_¢^É]Ã?¬Œ.#£—Â„ÙØké¡"V©bãƒñÙq)l)B®~Ò¬ÂMiCäç@RHÊ] ç¡ÂÝ?üRüJªÆrÔ_’”6]¢_-^kCŠ7Çjgާ~\ÕQu°ô¥KGÂ×,ª)„ÉAªqŸfµZ¤ÁÅäžÙ½He‰C(ù-„[U+L‘Ù¹n„TË}ÁÁ® ð'LÜJ•.Cé3í2»qóò†b9’â²aŽL}Á<}c¡ q¼üm8#þh^ãY¥’â¢C&Pt<Ç«¿{ÐÅBLšë Áßõ&dsÊ "§%Ï^ªÔXt6ŽñíÓ5tK:3=eÄ¡0„äƒY=×aB¬t9.Ç²Ž‹FŒ)wp.L„"‡Á„ït*U¯K1jðŽwJ=ê6~Xo 5…Fî!´!²c`œ3‡}Sϧ ù¸cåä6f\–¯”÷}øgÛyâ–QnWj¤\,? H+/ÿ‰4¡Aš]U³TÞ4ä’Ù ©!CÕ´âªù!ëbµ‘iJmºHƒ¶!Ñîtjãäí£Äœ)“ åÔÞ1vå±(3>Ђ{‰°YøT„šm´Fè 0zÞ+©¶R7,þ¡Þ”ˆ¡DÓð«zSêʧ¹6J&„r·ñkÄz,Ë%Õ”Ú´iJÒüÜ~ãÓ’\¹8fEÇØ@KÅÃR¯ÚŠƒdæò/ŠtÜҹʘ¤Ë€±LL·EA™UµÁn|Zx#DËúÄÝÆ­Ø³i+5ª4¥såVŸxãyŸ’+°N½q’á¸$Hóºœ_ßxLH¹È ©žÓ¯'%«ÔòµJ~U¯% yzdÈ,˜Š[¡‚$ýÅGĶ_A2 çw0íôG  .H€4üÑ!4ÈbWÕ,EÖk‘YÎC€œÛ/ÖS_,ÄIÎaJÎ`‡ÜMˆI¾4‰vêÌ«„\k>ð2Šs{0DåÑV|†\Ðð‚ã´$#WmD–ÓbJî`qG¤>á´ivËiY.N±KN®Bñy]Åo!tôª¡òYL.¶Z:×.:{‚_ÉEgÆf\•…!ª#0ëyAXuH5D,}¿eÄÑF³åbð)¥¯â©kJ€téƒÜªVÊ((÷ŒÊx-çÁl!TCE ©.µÄJŸ)•M`åÛ‡¨Œ…Ï„n,Öe‡Vv~porËŽ!õŸ&6 Hvm"æ`:÷|±S*äàg½ cÝ)~E‰÷ñXÁ˜ÐÍ )~%ÕÂ’Ž»´iJçúeBáÃ;Iüvë\‰qO)ZëÊ-”f8€ð8_%KòÉ­µg& ÷Bk+Å ´ÍA‰…«æWõc‹‹OpPâd‹S±+ÀZ|´Y2­2¥ ÌÈ+2¢rñX‰ññÙ¼KÅš¡ ÃÖ$QV4®¤(ýf2™DÃÊ®."Ó›`Õ`¸7„ÅŽžiJ‰%‰°ÖÀ®ªu![ŒÓ¤íÃéîÆ®ëP[©|(*‹Ý~ ªgcñRLJæÂXWqH]øz(I†7´ü”J­rz)~;´ ~,ŽÞ/2"3-ÙQÊ …}!V8ï|inX¯DJ+Zª¢H%öP:W®Læ·,iÿz81.Ia¥£áü z—URëBßz©¹ A 0ÆÝY)2תeš+}!¨!¿ª7X^<Ü(¡cmó†_!¶®SK5¥6mšÒ†4¿Š%ùä”Jgä³f¢)¨gµ¡ò’=³ÚÈ΃ˋ:A0òPKg±|îÃèØfµe™Y}‚e:n”jÆ È.ÆÇi.·‘i•YR÷¤>ÔVàëÔ³_ãñäÐË9#ÎñAXð|ÈCIæŽeˆÓùy‘ƒõqŠƒñüŒGáSŠ“$r4¥AŠ›Õ6ˆL;¦øAˆÅÁ÷ˆ6v»jJšHˆj8c_Ì*;¢”º!t¼FÝdaX~j‘< .yYL‡+L}ߪ­ k8ö?O)2N˜ ”jJl i~UO,‚å…°’ë!Ùâ9ƒXo¤šR%ùNit~å™å ƒÕå˜5Ô£äcQ1Ý,âQ'ã,OL7ë™å ‘tóB"–ƒÊjSÈ¡Cïl„º7v»jJÑ´¾Ç .MiCŠ[®åͽ°hXOÁµ ëQ¹qÌŽŽ>³…‰Äéê~® Ròã¦Ù2ú›dndºÿÇ !«—7_qaKìÒ8”>SNžLÜÜØ‚çcFcÚ¿ŸLÔª,G{É'ã%ÄãJÏl€æ×Ï2˜žÞN™•Šy^+\Õ*9Ó>Jè½ EMÌ)fsCwÔ[É™ê.¶‰=”F‘â‡í¡»–IcÖCüÀ0/LÅóä‘з\v/«f¬ˆ‹ ¥®½âW¥«ñý R®DŠÒ4?êí˜Èœ­6%’9Y—vók¤øµTSÊ SkÓ”6$úu/kÎÑ_¿hÀ}ʘ$Ÿ$"!Ió†ÿ7Ø÷ñ° Egvdì¹6óx<Ë—$嘩N}hC'E8ðmfUm áŸít8_ñVƒYÖ*‰ ´¡‹Î¦E4³tôê^UD ±)ß4±X5Ýf#Ù]¥‹÷™‰Ô­­j,¢y5áÈEma"Øi3`S” I„_Õ³T0>’ßPB?ÛZüJAëT[©Ñ¦)ë—Á®sÊG5‘+o_1Ø‹õB–ž`>ÏQZ¶üEÇú{¸~1©­Peª4‡ï)3Èzj‹zƒÕ Y%ÔÉS[º§a×€ìF¦)TºTë^K™úÊ>]omÆ W¶3ù県ì ó¤oRC+­ÐdýÆSWO„ÑIͬ^˜+3Þ º¥ ©-k—IãóiT9ÀM‡~÷y»Å :ÈmdšR¥ÉNéT·t6ŽÞs.ŽLýt ®]cÄmŒ¢ŠøYkôóé@]Fv ˜,”@ 2+k€¯2W¹Cg²§TµÁèW™ !tbòskÄz%R·T}Ú´TiJ£HñCÌZÈú.&<·Ü'A2¡—GëâBGŸU5Îaô@È5e²Q„K‰<„i„Ɇ›ÉÉ3Ø…‰ÜòÐN©Ê4»ªg©`/Ýì”8€¼#ž¹øA©ë±\•T[©¥K:SNÕWG >gÅ(—q¯oúIe),M71ﬠc±üFòJ8"Yˆ7ßzó>ƒU†ÞÎ×_’.2;fh°c,)@H-YDÙ ùg³*€:#Î*‚òK঱!rÊê}Ln“ðL÷S4’v[Ú±<Ù¨£ˆXÉÓ„ø2 \ˆF˜_%E`îJ1Oô¨·o?ž ag5\¿“U¶–Z„ЊKÈ Ò·–iJmºH(AÅSí2Áñ8û„žöR¬ùŽeɺ¯:¬ õͳ¾AQgCˆ9îìRAˆMV‹%}×…ÈÏ9¾cמIm”Ї;Ü"Sók„z‡T…Å}mŠÒ®Kô‹Ö8›ó<_æŒwÇŒ\ð÷¼´Eî:G¼º¨ìëJgdе4³$-S¥pIIga"#9%ü;]^UkÊð¬ñNÆ9e’ÎÁ¬«•H™Sj)BçšE_œQâÈݺÝå ŠeÔò™ K ¥¼…&º…G]V¿òV» ¡©1˜ŸàÔ³zM©nøU=KãYù %öîè¿´UëTSjÓ¦)mÏʯÍÙºˆH[éA\º^Ç!ú?Bôé]FB´Ü³lfó]>TÄK`¬ÂP-§Œ~RŠ/=JœyÒìªÞ`\]—ùóÕ¨”Èöê2i7¿F¬Çš\RM©%8à B)‚&A7U_Ù zf9òäŸù¼)Ç"ÆZåw±ñŒ8\ŒØÞº´Žùb½¦Ä¹¡¯=ˆ4¿Fèyýµ’ª°Š&.mšÒ¹~eÕh$>ÝLã²­ŽÁ°¨„9õ‰Èœ­žcÀã]áÜ1ÜQ'B€aÎJ‘0^#B)"P] ·ªÖ…xä«H7Ž‹_èi̱V‰J]j¤n:ÛßѬFºßS¸c¼p6›©~‚DŽ c ùˆ”ȵߋæßpìñ¾'Wäó…ª*ˆ’ÅAk,ñoxƒ^¤_”¸©2BM;«zƒñìžü†áv·|ÍŽs–Jò–i•ÙTi2ÒÌØ|÷h†£ÄD¯Þ8NÄ< ›¡$@þ Æ| ¸Ap5,CjJe€„z, „[UëB FŒÊ¢{F0Ó—ÛÃ{!™N=¼[ª¤^êÑ}pËʼnŒRStÉ> èë@z`¿k™Ò„'Íñ¿â!Œm“U¹ee R„6`é{j}›Nº3æ*ûâV-)125vH½èZÈ+îYyMŠo7¯0Eúá#Æ¥ZŽ(B¤yMŠR†9èæy§Fb¾ ˆæ5©)…£ÉÇä i¢´#áÇà<0ò&qåãÖ6%Â4ÞÕ·ñkÄA=RM©‘|( Òú9£?wJðÊtéíå”FèFÆÚ)%Fïù>ÊrJ£Xjû’[!Ö ÒІÈNûÝN)¥H˜È†v¼ÓàmÜ)nqJ­f©Ãݵ›ªÑ®Ì7Mâî°_æH²!æ¨Hež¾¡aÚWï6!”… W¥1¦kIúÇ"DSBiGúaŽ­*'|qPBö¬;¿Bl*Jñ]’ÃiJ-]†ÐZ¹hì¶y¼QÙ¼ zyÇêâ}ü?ì^ VÎhw/}²ZDª—¥K^n”²T¢—ùØ{Ø9=ãÉCÒÜ»PB™\Ž:ì Hµ‘©±Mî!t¦]lâŸÇçZúÜÅ\ñÃÁrcs"x~rïýÕ¹Õ9ÑBfà*áÂúª áëã&?°IµÌ uõs>­(l]Ø|PZ—:»ÈÎhCB¦Ä;Èa¢ÜÄ®Ùðà ŠóÜ¥˜Ïi (1R9¥ŽuÛ° üa9}×Btækî#܃hlÌ='ãb0<Æ õŠÐÈ-6qaHJ P‹3[÷`±[ˆìJ(ÂÒU ›¸ä>(-di—ÁîŠ3aQï‹é{ae,ôþ¼3ê$|í"šóm›A„Që’î…‰Ô 7HSÚð«zU Yá ‹°(ÜÞãCeÑ¿Fœà#ÕQjisPZÈÒïÔ¢³ë7€z¨ßXõT,*±°ê»(‡ÇqÚiXx¹JÅj·ˆ¯ÂÕ0Wû”di?¥Fæ¡4zð*jº7Í!»%ÓQ¨tI©jÆ]ÙÑh8i„ãòz¨‚zé;=¾C}¡½xmÑÆ v¢x~ؼ{ÀØ¢¾ç‚ä‘S‘¹ºc>aCŸ;u¸z£}È‹HßhïI„ì"»%ÔÂÁJgÚ©ò ¦1Q0øn¢½ÈøÚ+‡ÚY—²T@‹#b¨”â••Êc¥Gš…8é2X¯‹kB‚]¢¤³Já§*ŒRFféÖñT³ Dš_#ů¥šR£ÍP¤õ;î“„‡W|šâÒ¶cy-A"‰y≅ ªU¢ÜBè ÝÒu¢«¥ð(XÈ’rG©&´!²ÓH¥c?Èõ¢>Ùå2ë Å®dšBœ^&/V,:”n0«Óßëk>G±ãrÉ=sh*Ñaæ¼$¶â‰¥¥r‰¿Ôñ¿dÐíxiåÂâšøÙ‘HQÒYH_ª¿•BTEvJ¨ã%þ¿FŠ_K5¥Fò¡TÈ¡_´Æ]!âY×<1¦«)†ÇÙ:æJ} î®- EBÏ#_°«u•¢[ómºZçù‰êšÿ~Ö«RÐbprø¹SbÓþñ˜`GµŠ[Ë´ÊŒ*Ejav2Å1ƒ×Ü9“ËŠ ¡Õ¶{0r=j½!ØHt‹/‘ð4™rø®ê9ˆS'ÍüØÁDˆàygÏP” ¥„ìª^—²‰³j%šØTî_#Öè—TSj´JƒàÉ©ßégQäÊ»ó­Üºc/rA-ˆo¨…+v–×á2þ’4½-‹5J‚ ;«,§ÃFfkLdS~Ë$ЄpÐè¶·VAÝA™îÄÅŒ¦kDf#ÒVªUJgÊ•I£ïH?0©ƒ ¬ß¡rc¬–Ür€C¤^!òþ Ryô ©îª<ú…Ùý¾ÐPÚð«z]Šˆø-)ë5¥d6ëÄ1=ë¢F¬‡#É׶ȹ•R› Mé\¿à§;­8ç¸â»slBlÜŽá6bs°Ù+B;"»ŒÚ­o»¦„±$Ryp«¿‹™Az)E‘0VQ9WÍø'ܘßèr°.±gaÇvü|Ê!*Æù),5üO¾ùá)Ÿ #cw´n­ZÙ²¸ ß>ýÏOÿÓc •žçàˆùæé`¢ü9™ôèñXÒd7ÄV}Ö—Q^J!K9‹™MÍ^€TïÁ%ó¢ÌilçÍh ºŒ.î5Ûºº ]F—[Ypž4K t¼Ä§¬…A."Ë 7$¼‹» Ëè›`ÛyB·¡Ëè»çXH»4ýÆ7‹…]F™Kî /œnè"º¬}š$讎[Èed¹âѝ]^ñ…]FÙƒ6N¶öû&¡Ëè>p±D»Ós|Bè"º,ú& îò.è2º|)ÿ¥dW¿q”&pÑ{^ÊfÙ—›Ä]D—ŒCWŸî‚.£ëeqìN/ìQ”ŸáÆùÍŽoëÑe¶}H/K¾Q^Ðe2<)ë>Ëê‚E˜{íXÝiŒeÌw‰/±ïÓËšo„ô(‰Âcá§)øn-FÿBÂËœï"/ìBÒcã™/±ñÓ}ˤo"/è2‰Ç¤ï”/2óÓ˨ï”/±óá1ôÓÊú!¼Ìú&ñ‚ÕÊÓ}mÙwºØúCÞ1öÓû!¼Lû&ð‚ÕáeÚwÊ {i. `a2&0{>‡hì–ˆ 7à>nM}þÂþÉfl ËsÑ:·‘taöJAŒ|M[ tgê+ø£Z™+SHºL`é <Øe2s­£Q¡»Œôµž'í|» ‹ßðŽ>÷ÖÎ]F˜ˆ³!Ç'Ã]Ô$Èáaó‰Ó.ò`ÉÌ%/žžtà]Fš#aw›ÐžºŒ0ÏS¸áØ /è2‚¿<¸‘‹º[9‰iŸÚ¢»HbŽ?Ù–âÝÚâÀ."Íë±ì¥ç«q`‘O¶xo«7è’HÙ2ñá^.‹“qãVŒþFwKä]Þ+ ˆ²‘:‹è.ó~<«Àe-A º,þFù€.’¹­ûFxKè.ã~Ð=‹è¶m?únYûËZx¬ý&ð2ö—QÃ~PÞ KÚböp›ú %n»¾Ñä"yË®]Ç@šþˤ£~ˆ»A—È;6ý ¼A—P“~PÞ K(ó­^'ÇRÜ;ÉÁÆ”~à..èQþìgT ÌAÎë „q•ç'Ÿ‘,'¿fQp± K÷ŒÊ aîxÃË}\Cx¤zO˜—l}Î6 eiˆ«Í‘ý‘aY’FÍuå,™Oš8Ž é…‘¿ÏE md.û¸c/²nè2ºKq¿lsE[õ$›å)‰¸0}\+FFÒÉ› é«Ç’ÝI@Òo¸ƒŠ£ enŠ'm2ó9m2’6[¿0R:;&ΩìÍÀÓî©'r“Ã;rÚCEÂ9.})DºÍc%>§á ŽMù†ë±áú3õópÕS"åÊPr3_\ØçT ̱Þ5—¼Kø‚n;§òÃÓ˜|d|hŸQ9%|ÁäØ)™ÕÍc%;•Ó‹ÄÞq—žé¹EÒ¿$O-3÷¸wN™„|xáP!×jQpÖ|®f¸Ð FÒYõÉ-» ëB‚T–¤«&ŸÅù|\Fæ„ôK´•áY |xoÀ#Ö¿Ù¨@˜ïèùhÏéLš0×9ØG|ÊšÞñ³KcxìJ·|¾!³Ú‡mq{dc´Ã¶¨¬VÆÁ2ëõ’VÞ¨ØÊI[¼'ñx?†%ü¾Êã·ðÁÏã×s*^žËÍ%)Ÿ“ô8A7×$>v0§ÒT$¼\ .>ÒU~\3ŸSÙãšt¯xåñI/'ˆÛ5uÇKúœ ¤—Ä%6E§4$º<˜‹¨žì± ^Ô Ÿ‘ô¸0«Õ×yŸ‘Ù=–KÜá°4•SŸ";áPY¡sÙ´gh‘Ù»ð"S4=ØT <ŽÌ²{ëÀÏÈ@z¢ËHG´È@z|™‹šãœ „Ç!Zmÿ¸æ§h‘‘ôrŒ.²ÌçTNsªúHyG6H¬fˆS÷ÀÍ ]E¦„TúÔá]f‘3ܪÃ󢯓Åú–Ëä½ðÍbÝTh‹Y¬½…íqÍ{B’³HóÂ6 sñbºÈHz–i≯\1Έ¬FpIæð•‡»—™†Xd =qŠ \_Ù\=õ“c¾|úáõÓÿòôÝÓÿíwOÙpßq;ŽŸ(÷Oß;æJ.ŽzH³áž½ßýðô·ÿ»ÎE$¿ûýÓÿúôÙ¿óÝO^ñô78lOŸ=ÿ7üòšÍgÿî¯~øñíüÃû߯"?¾úðéÍ7o_üâIÕùæýÛ÷ø6ž>{óîÓ믾ùôæ‹§Üdñ쟿xÊ×îÏ^¿ý—Eá§oÞ}·þøô}óxòì‡÷?}†_={ûú÷Ÿ¾úb•{õ® äÇ×o_Cþý»õoAØ¿Zr!è«^#Ë*öáÕ»ï6úÞ|÷= þõOÿáéïþϧÿîw¿Ü‚žq¥ég ø‡ïß|ó}XÜ¡ûÇüzùôÙÒ ð#b¬¯N Ø‚øñíûO«^kºQ°)V¯iOá§$ÿý{[úɳ?¬f|ÿ®ÛQ޳—ùÇ7Õrüzµ¨V™ŸÞ¾ªÖº{òìÛ×ï>¾ùTFÉ£ñ øÕ³W¿_ +•¢Ç?¤ïxýí›WŸFåh÷äWµ1çp\'ýô³6®Ñ÷âêéHEËùç?§9ýõG5ñG5 ¿¦güão׿×è©áê?d¼øããO_|Võ¯ƒåIó¥F E~ÿf*üùÇ?3Zw=y),wçÆ€þ½æ£_®cê£)ù73¹Ö A‰×_=¡•ß|õÅ1™ètæÿŸ–•ûï¿å÷¯iY®¡äŠ‚Ÿ½¿«éG¤òÙ¯ßýd#ùûýk~ùbän”?}x—6Ç–ÐÔ¿µ™œå1){¼ÏþE¸D.&Œ¢·Œ¢w¯0OöÂ5t¥Ö¯Ÿý÷Ý®` ´+Ài ‹”?Œ¨ý³ÿ±$¨Áož`þüñ«/^•mð/F‚ñÕ_bKøJõé³ÿòW-П˜é¿ª½ÉÄÃÛ‡ò“²·Ÿ¾/Áåe[+û—M[Ã2ÿ–9寯– þñíëßñI^ýô¶£hÇú©¢ùõãÞÿøaMŪÝ6ùÍ7i7žVkkz0fÔ}ùúK¬"T0§ÝHl5žýß¿ÁÂ|cÃäúâ)—<›rï0aLJ¹üö»7þ~{ôÇ1¶Evì‡ÿôúUYP—-ü‡'Ý"óÔ\ö?3-3§uÏh‚ïXÍ?‘ÚÆ{ó)cXä÷%¡??þøú›7ÿó5÷ÏoÞÿð {”üðþ‡ú·'«U,ÆEG¾Á}ö%ÿzË6ýd´­M¢o~úðñàùã{Œ,Kíß"jL]0ÿåß¿®…Y.5jýµ‘Zë†ðI×4©¯ž,³›~ÝöòOŸ&ú¬ußÿôéã ö–QñæÓ¿ê~õ/Z¬ÅÏ¿3u¾u0ÄD Î»  î­›¿káìg_´!æ¼s®óŸ÷ÿXöïÛ´4Š>ûÏïki•Âïz¯ &y{Vbe!óçÿlëÍOºî÷?½-AŸ<{õáu¼>‚öwŒr;a9/K™OßxÿÓwYî¥õéͯ?~zý#,«ðä/zaÏ9­È«Ÿµé×µÎ:þ?¼þ8þÑói\Èø|UÓ–KBž}Ý+5øWUI-ö§¯ÿœŸú„~÷Þñå?ýê›üê‹›`~ÿ·÷5ª¥Ù~…J°v¶ÚaãŸè§¦Dƒ•ÿ@±?Ä4‡¡2‹K7¼>¼ÿ´ü…céiJ'Kl„þíÛÍ»<ÛÏ\?ØàfÀó![3æwÿÏ_ôðˆBpÅ·¹[M –e@Oâ%?û_¾xú Õ¹œÈ›\O+‹­…Lå'?럲á^ÏŸã].Á³ÿõysE /ïÏ'ë¿þ¯±Ð„Ýžýƒ]®ÍÎjñ‹ Ê-¾ÜÃè{‹Àj¡¾úê¥âž;£Š«ö©?÷„MÇÈôÛÈÄ\í™Ý¶ãc† —(<{û>;¶WËðùóÞÞ5k›u©ë¯ïß¿ý¶á³Z‡åõö¥¬Sg^® þë«?ÖòßeIü9³–}FäOo3EO•¬4¦ŒƒþgïÄ_êüéŸþ|âJþe“Böí¼;½±«É¬›ØÍŸkÅð÷ÉŠA3¦h †¿þé§ÃµÝ=/ZýÄ(RTÏ 5~qD1Ǽªã9Q.Á9Ä­ÆøUwñÄ"Ç$ûûí›ñ¯ý]¹¿Ð§ö‰þ1ë-ïßÕ=©ðõ§WoÚ£â*ž"þË6Dü³í•?{ˆ,Z,?Eu+²šÐâçM(Ö¾˜?÷Qáß•?}ŸQ¡\磢8~õ,«ŒÕÚEñç÷¯ßâªâ–þbc÷&Ë¿<{?núÿ¯÷µ=ã²(„z•EÙßß|ï¹F!ã‡WµÌûO5œê×Ïîï3t)?ÜiU¡úÒjkGêïZáýõ‘Ä¥}©lò­Úš5~ZÑ©N•nEþécÍ-ʵšéç¨Öþåbç­=Ì$çÙ„ô‡?¼©Á%ŸeÝMÿóö|5=),Ä\n>oúYÄIR[‹86êågî¾yöê[šC—éÕ»Zð-{üs7€à;\%ý”?fšXw¹$îEÙfQ†`ÌÇêÓü{oøø‡­·ý—ÕÛÖaëü¶¦žÿBß7­Kpôš}e jÏ”]hù±~ûæ‡7ŸÊÙ-Êa,ýªñÍ]¬>Â÷ùª·ö‚2ŒøÛ7¥¬Þ÷¯3«cí–‡íe8^°ïþá}É[EÚ/¥^ºŠ /#ßµvä'›ÈÃþüiKxËyï“þÌù»únˆ Oâ°w69ÿöÍûŸÞfÒøGÍ+½úöÛÚÒY§‡ð:hù ]i›0Ë´Ý´z­y®©l9æ©cÚ¸ÛYDýýæ‡Wß½qcÿþ]fù‡Ïþþík¢-h½¯kõ´tùðCã×7²¸,û¼ýØ»‡“ñÇõÅ“_pÛÖL%çÚ‰~.óå5ârs%2þÍ·¯ˆ‰à£­wK¦×;|çï´ÔÉvà/û«< ËU<< òÙv`||°gz#çÏ^Óóëç'ŽÒñÏ3ø]½Oúƒ2„…ËXzF3¿—Òa÷QþÀiqÉìäœ üËoÞ½ùá§lý³×¿ü ÞÒü Q™DdãýO?½z÷©ãŒÖùúu;oþ¡`X‹cJýbˆÖƒ4.”ÿ™öÜÃ7¿¹ásÓ%?'ìì»W¨é´»ÏÊW¼Ûfô²sêdñ™GH—)ñ_7ãÃËÝœ^‘®®pþøšÁ³¿yû1½aõ?$ôþÃ?f­abí!´wK>¢ó»›Ýâ?v¸Ë߈ÛZøúv…íÙâcW~&èÃ5k ±ó§£È ŠüøêÝë·£ ¹’Ï~÷ÅSî ´½ëŸ×Øô’åzóß´!‘”_¥I~¾úð"êþ£ ªrýëúñÏ_<É1Ä7Ÿ|É?:¼ÒmÖÎZ¿Jÿéþ‹’“4,ˆœÿý•¦×m¶á´BɆ.ã~Õ¡ÿc1ùŠeÖÄhŠM§5 Uë“ÂJ†þa§õk}‡[ ^^ÿ:**4¢MëpÆŠç°J||Mé_ƒ+â¸æôþ)›MŽc¯øÿþâþ÷šc/Ÿu>­}ìžù:üËkºâ¯rÞŸày¶ûžýg1õ/oP¾ ùß½úÇeaNÍø«?^ÛÎWiüðæ›_çk›:ÄsVG/LDlù £KNO׎ïÆÚ ×¯Ÿ7èô™ÿ¼ º¿kaÆú»§tYÑrp¦Ä¿ª…ü5J•¿rRûIŸˆUlÒ_þX›ÞÓÞX&Q%;4eéö<øµdÃ%hä¿fs¯›»šº••ŸÓ³Û'µ/Nýâ0ìåœËö ¨ûٚʆZ–µ–Òó¯,ÈûØ'oþ°K¹²5ez}Ë–’ÐÍo™ DЬ%ï5ÐfØR¤s`0ãL_η¯¾Æ4.^uDhù?¼®íS8Í¿ÿ\«µ,eâ>Æoúë³×¤¯àœ¶³·C_köþü›˷9…>­½Ï^çï_wü¶Ÿç{¹ýsÍ óù{Ûó÷ɳÿ=ÇÍÛÎpжᯪEN6ýòVø7æ™#Ï^5ØÈ¯åÜêÇ8÷/‚ÁU%!áï×üJ‰Ÿ‹ÿ%‡0À8U?ãÂü­Kï¼i3þ¢¥ðŸÇU¶¢·ŽVÿ)-åã¨Ó¿Ê/óW·”?OZJ ±Rr^—ó(>î“xVU •ä¯u€íïoÞ¾©‰uýrÚ_œøW­õ‘uãðõûîæÔ_ñí4DV´|ÿÎ^‹ãß©ü×ÍEZœ5°3ŸŒ'ÈS6ô»Î4à5šu¤àϯ ‘}xÝk%ŸÈ5ä¿.oŸ”àâ]=Ÿëß<¨¥Ê¬øëYÁ«yý¹WKë¤_,°"ï•XŠúGýãïß­€¨ìO,ëÿñ÷ÿá?Ö F«$ZrüÊÆcͽ}ÎkŸY[ 9cŒ$/™*è£Äµ²GÓpQï3NÍem™ì%“ríGD×^3%¾ß±«ÉCéú{KYšÚ›(ΘõïWeLC”®Ê’¨ChO"c-‚ýsêü‰€M Â:¥>{º¦‚Î%Ê,f¿²AÉbä­›ŸiпqhùZ©ž~B>+?'`¦Ú­{õNa`t ·ú«nͪÔè)™:ñÍW™ò²å4¹A©ðCþ›æü}I°u@ |ˆé  Á*5¬)ùõëOxÍdÁó•Ïò;çßË*§&ÚžïkNH¬†ýù`K¼‚Ls’1žßrŠýÙHu°µ·Ô¿sóF/“›ñì÷¯_q&ŸŽöÏo*äO‡Ïk²óoxñŸXîÝ„@ Ñ>tôç ŠUÊ \NˆÛÈØhË}óúƒ6m•¢Zg3µtg 9¯¿üîK›—˹;vfn {1óï=©‡?—'é?ý‘ úë)_ñÚÖ–5à÷Ûêp9#îg+/oǵëë?ÍþÝÙ*Ê[b‰Ý´¢z쉄èŒ)hg.}­8YAG¢P¼ÚçlÆ«m-u’(TSäs™SðMÙÙ²µ×¤«ãGÄÔYËßCö ùl¦²üºVåÓx¢ŸnK—YéF}ý­'v5ϘêûÌ,®‹ÿ¼ÜoÛ?k™öשíÙj%iuÃX.©sªîËxäò%„Çx¾J¯-oп]è÷Œý`áéÏšPÒ¬è¯8A+ÑìW µdS¾xù³ãv-8¼eÖÞ‘̨CO—÷BþCF•Påš ÍŽZÞ¯žSKe¤[âpÀ„«ÑÄOŒCjT”TÁ:×L´WMk¬sƒÔ®XCX­uS|ùdV-Î.u†Öôñ?¼þÍÖâVUíõˆ¾ãÞ>Æ¿ý|D/ŸÅù²Í7ãëv.Y:§FcýÝö…Ø.kÑ/N+zŒ„W¾ ýÕçêOMÕ³»RøOÿ:è endstream endobj 5 0 obj 113453 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 595.276 841.89] /CropBox [94.76723 575.168 503.4817 770.1055] /BleedBox [0 0 595.276 841.89] /TrimBox [0 0 595.276 841.89] /ArtBox [0 0 595.276 841.89] /Annots 13 0 R >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs2 8 0 R /Cs1 7 0 R >> /ExtGState << /Gs4 18 0 R /Gs5 19 0 R /Gs6 20 0 R /Gs2 21 0 R /Gs1 22 0 R /Gs3 23 0 R >> /Font << /F2.0 10 0 R /F3.0 11 0 R /F4.0 12 0 R /F1.0 9 0 R >> >> endobj 13 0 obj [ 14 0 R 15 0 R 16 0 R 17 0 R ] endobj 18 0 obj << /Type /ExtGState /UCR 24 0 R >> endobj 19 0 obj << /Type /ExtGState /BG 25 0 R >> endobj 20 0 obj << /Type /ExtGState /UCR 26 0 R >> endobj 21 0 obj << /Type /ExtGState /OPM 1 >> endobj 22 0 obj << /Type /ExtGState /SM 0.02000000 >> endobj 23 0 obj << /Type /ExtGState /BG 27 0 R >> endobj 28 0 obj << /Length 29 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream x…ROHQþÍ6„ˆA…xˆw •)¬¬ ÚvuY•m[•Ò¢gߺ£³3Ó›Ù5Å“]¢É`¨‰µé²™…}v*Ëìðèñ²bç{aÿ[QÓÀ'a?d‡yÖ­ö®Sà{„=5àήÅñÚŠ^-C÷T#hŒsMÄÓ×9s¤ˆï1Ô˜÷F9¦ 1w–ª7€;aYªf ±]û®ê%î{wÓã;Ñ›9 \ Ir±ÙÐ< X}‹°I<>ÎUàw¨˜À¹‰ÜÍ(÷Õg£RVzWÆOã¹ñÅøelÏ€~¬v×{|ÿéãu×¶><ùzÜ9®½UaVqe ÝÿÇ2„Ù'9¦ÁÓ¡YXkØväšÌL° (Ä>—ú’UÜÕîí¸EÌP>,l%ºKTn)Ôê=ƒJ¬+Øvp’Ä,Z¸Skº9xwØ"zmùMW²ë†þúözûÚòmʨ)(ͳDf”±[£äÝxÛýf‘Ÿ8:¾ç½ŠZÉþIE?…9Z*òUôVPÖÄog~¶~\?¥çõAý< =­ŸÑ¯è£¾ tIÏÂsQ£Ið°i!â Šƒ3ÔNTcâ)ñò´[d‘ý@ýf endstream endobj 29 0 obj 704 endobj 8 0 obj [ /ICCBased 28 0 R ] endobj 30 0 obj << /Length 31 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.> endobj 32 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 27 0 obj << /Length 33 0 R /FunctionType 0 /Size [ 256 ] /BitsPerSample 8 /Order 1 /Domain [ 0 1 ] /Range [ 0 1 ] /Encode [ 0 255 ] /Decode [ 0 1 ] /Filter /FlateDecode >> stream xc`Ù endstream endobj 33 0 obj 12 endobj 26 0 obj << /Length 34 0 R /FunctionType 0 /Size [ 256 ] /BitsPerSample 8 /Order 1 /Domain [ 0 1 ] /Range [ -1 1 ] /Encode [ 0 255 ] /Decode [ -1 1 ] /Filter /FlateDecode >> stream xkhÙDÀ€ endstream endobj 34 0 obj 12 endobj 25 0 obj << /Length 35 0 R /FunctionType 0 /Size [ 256 ] /BitsPerSample 8 /Order 1 /Domain [ 0 1 ] /Range [ 0 1 ] /Encode [ 0 255 ] /Decode [ 0 1 ] /Filter /FlateDecode >> stream xc`Ù endstream endobj 35 0 obj 12 endobj 24 0 obj << /Length 36 0 R /FunctionType 0 /Size [ 256 ] /BitsPerSample 8 /Order 1 /Domain [ 0 1 ] /Range [ -1 1 ] /Encode [ 0 255 ] /Decode [ -1 1 ] /Filter /FlateDecode >> stream xkhÙDÀ€ endstream endobj 36 0 obj 12 endobj 17 0 obj << /Subtype /Link /Type /Annot /Rect [ 441.498 201.31 463.416 212.378 ] /C [ 1 0 0 ] >> endobj 16 0 obj << /Subtype /Link /Type /Annot /Rect [ 183.14 258.471 205.058 269.539 ] /C [ 1 0 0 ] >> endobj 15 0 obj << /Subtype /Link /Type /Annot /Rect [ 387.409 84.374 394.383 95.318 ] /C [ 1 0 0 ] >> endobj 14 0 obj << /Subtype /Link /Type /Annot /Rect [ 256.515 120.239 263.488 131.183 ] /C [ 1 0 0 ] >> endobj 40 0 obj << /Length 41 0 R /Length1 37 0 R /Length2 38 0 R /Length3 39 0 R /Filter /FlateDecode >> stream xíšETœ[—°qî’ EðÂÝ NîîU¸»»»»Cp‚»[ðà÷ë¾éõõêQOþÁ_5©çè³÷Ùï;¨u(HÅm¬•ÝlÁÌôÌ L<YiuMqMZY3+C'E+Yniz0È ðÖÍŽBA!b6p4³±5pó¸Y˜™¸Q("6¶nöf&¦Ž€R&&V€­­%ø­ÕÊÖÉlO´6bXƒfŽK3#°µƒ½ÀÀÒð÷<€=Ølï 1 03@fFŽC°‰™5 ã_Ž’ÖÆ6î5ƒœlÿ«Ëlïðf þKæm µ¥6~›çdi)k`Pÿ+À[@Ö€·˜Ò€¿‚r²úS ¬Ì,Ýþ·Iÿ>Z üwÄÔJÖ¶J¦6ŽÿÞoæ næ É›9™Œ ,ÀÿS±í-ͬÁò6fe@ÏÌÄôo}ʦfFÖ`û¿ºÀoÙû·ßó·+ãÿ~ngBÞÀì_Ç øÏ]þëØo™þ;Uo+É8Ú›¹´˜˜˜˜™ÞF¾}ÿù©óo[‹Yـ̬M,ì{{··áÌoÄð`˜½è »¾…ÍÈ`mãø¶à­¼Æ6ö(3€Q诖¿À(ò°eþ6£Á?À`4ü8ŒFÿ'€ôpÁÿ7€ñïÿµ)€Ñ䟮·"c4ýCofèÍÂâ½iXþ¡7«?ô&bý‡ÞLlþЛŠízs±ÿ‡XÞ\þЛ‹ãzsqúCo.ÎèÍÅõ½¹ØXÿ —åÍÆÑåË›£©=ø¿xs2¶qúo"oZ¶`{3›?d}s³5°[[‚ÿX±¾9þÝú¯Çü¯ÃûŸÕ(,lã ð gæàг²1ÞÊš ÀÍÁäõ¿•’ãÛKÁÀôO=½• ¢‘“ýÛުå?ÙØìí•»‚P–æmŒxÍS3ÒkðrúGEÕ¿K·ds ØÒ¹ú“™”ÝÇjÇ=°Àƒ-æ–I%°2%‰¡ <®‚mh@ûó±³Q9–_t{ÈTî1ÙüÈ6,’Ã÷¥ô¥þ¹»j 'vÜ”òHë\AvmáË”…‚jêò„Cx»9«Nˆ»á̃ß9=Ç5(0s7W—R©ÊV†Ž)ï%¼N1ûÄɺ}ÛVò1ì ÑûŒY¦ ÍÜì2yûøoXác¿ÒI_«Tô`ÝÖöµ’ǹ­p@Q¨ú¨qMx8`:{³Ô>Äàsjûö9+n2ìÂŧóà n±ËL!Žèm<|µã—Kø² m&/=LÁyªçQaìá¶¥úrú›D+S¥ú[Ôsy;ö)ñªX2:¸8Wò7߯Ð3’tý½¤¤Û“µáiam€Ó¦¤9é娿š“èDËg¡{å̆„N„¹³]3ŸÉ"hõ "󳃥9Oh뿌½0šz&BMÊY«8µà‚÷™¸®NïŠk¸¼åëé:µ³°CI+‚žºÜΕ1'11—íjw¶dªÈÉ,4Âø¾ÛUÑ(¶Õ÷HVE®²Eñx ÍÓ4Q¤d|Ø÷zµRÕ-OºA³ÌuÎ(„}Fª*+ˆØcdØCc‚W.­˜·ÓÒ^rz‡Peêrôó먼xQ¢¥RAaÍCéG÷À(ÕÀªZåX¼¡9UÚPÕxä­û¢ÇV„â5ãgI&ƒ@ŽóS¥dîwüšóMöM)Ûž„Š°È±58HÏ~ŠèJzeú«„iB®”±%qÚ¿¥—liŸBŸ«êó%Òa dçgõ«¦|a)º…¾zÓô­-Ý𺱡M‹.ᆸÁøÀ<3/ˆ[{ƒMOGyî­cÎS?Èb“d¡§’•.C0~²¢Ÿ n‹€­~÷).+7èK¨Š€QèèöuÐ}ÕT°èÀ’%곪+d»¢¡¶w#T€‹†Q¦^‹p »¬v§+ß`ŠèÒu.Û=ªæ5§¢«¶"ÿ%gCÄ÷ìJ*­I÷“oí&ŠË§NDÒp‰€ºhŠ•ùÃ7¤èéíhí°øï§HÚ7?äÛžSheÑŽîƒ ÛR:uíÚn%'¬ 1AÙî†`Õ/({8; ÈBóa„™s©ä4Š%ÃÞi×½3 @ #ØË‘C{ÊJYšªehÿÙH]»D梟©Âùrèò2é>479=ðFí¤±/üC±&xß¡ªEŒlO¿ÄÖïÈø%IIèDÔi¾ŸKSò½“>µq¸ŠuŽÔðb ;;6Ž…L¿üÙ4r¾&#¦KÌ×ó©M˜ƒwâæX½®² ;í%5ÁÙÛw½™FÅcXNÖ£\¿ ã¯Î4xõ4‡xTf¶3›ïó?©¿×Ð9s”@%r‘Æ»8{²œ1Ì ÜË 'X\õ]Œ)* †EÝ ÑñÆ}ërþ„(ë”Ã)þ*=7Ÿ¼Îw¡gŒ™jÐ^íªDŒdnG+Ž–^á „„­^»+'àz =µï«,\?ô6Ù¡Z>yZùŠ$»jù«$zÅ‚]©g6’Ù/t-¶t6›é˜Àu×/ØÊ0‹4KÃLÿþ)¿‘*¾“2¿ýÛ0Ý qì:à::M·Â}§£è×~ŠæÁ-øìÑùÛzO2¡ž…öFbefLÚc#]*£N ™©úÂåÀžòï5¹µyzBkà»Û;l5²÷ÕÐHTîíx,éþ…檱/r›B+…"#1‚ÕÆ©óuÒ06IŸr î–5&ácË ª‹ª'4{U­ô|]V‰Ì:3p¥-Q hˆKv9ûœT2]Ž£UA­Ø¯B,b­qí‘ôìñ’Ô˜èËŽâ9§?ˆlB»¡Ô,VØ"ž_jYé¾PÏ‹ji4{“Ã'²Èvc­oÐk~‡jšTÚvb–pÃÞÀ‹ñPÁá⇮z¨¹HÓkÎÜ'«ï)ޱ‰`¦{¶]|ÂØ RC¼´Šm¨eïPp†ÃÍ9qLo?Ì.|!û„<|ÊNÙ*&)ÖdÅð¸®h<ð.-œœ²h~ 1qÞQÚ$Rdai›É5r7$öÁ€Ž£¦+bÖ›åŽfÇ­yé…¬º„“Ú¢r-žÕ΃o§Ê‹\6€jdÅ!Q~€¡„à3ʨíÈóíeŸÃ aAŸ’ÃWEÚ˜QcVK‚l˜Ó-÷˜dJW>¼œ6þA>®…»—RG¢?47×€ýÚuw~ï×dOÜÁÀó×ô%Xž4UwÙCmˆùÔq˜§töIîÀÈŒ*¹«_<µr7JcJЄ²Ô+sÇùHóòcAaÕîÏ5¡~Q“qûrÊÆ2ÑÞ×;TÇæƒÒqHµ2³:ç“ÆýéŠÌ˜c5ÒšïíJìúË¥< N,$#âÆ§Kö¡Ð¸L|!É ¬É‡¸Ñn6Ç1/¿êdï|Ëur*#ØXè2GÚеl"Õn>k‰ùI+qéãs\ÿzÔâýÙÈ+ú#׸iJ 1샊x˽1éÑO k oÛXFËÃÀ[ÕtÐÓŒ0…*_ ¼Ö'3¼Úßú Ô¹Ûõœ¼±ns¿%ÔáD+öš¹2LÈ› P{´Ô¥ÚA Q˵€Ío6&õ¨¨ËX„©óÄùš¸[¢€:é±÷¯¤€Ç™°ûu3szº ‚Å•UMÕòO´…¹È æ/Ê^-?Ê0gë-YèÝîGÌqPådk£ äð­ºÃ1ÊkU†ÓÃû¦*Žö³€È†8¼m½ù-ù>Ïx´±U;ÕntdŠšs3½±þUT×€åÔÇklE'SFîO\µØ®ÎfñÒa»ˆväĨ6¿s?5Œ2…âxnâ öÌ$NÔ¨O=Üèe¡|·’0á½{=“Ç:qÌP”×RTE5%¾xÎ007¤àŒ¢½HWCw´î_ñÜü3k8ÚEÍBD gQɪdÕ ÅÕºå2õéà§à· FŠ!ô9I¹xѸš¯Ìt51Ì^Ã1 t6 8·ª¬y ã6ºÑÔÉ‚/ïÃw½TA ´Üó~̃é¿ßg[bí²I'?RêFä´KÒ-²'£‰ 3^¡°#€–Ø­y}‰m…Õ’çð,ˆPLW‰Ãú-“ºî7þ4é±ëÍKXï» TÍ"ÄTÒ8mé§J·)Êr¥üxȽa±*&Ï—øº­»ý•Ž–ÑZÏ×–ôGºØ é·î•Q‡hsí¬cïóÝ‘ÛÒ¡ ªÕ›É¨Ùòl2°‰FP¡ïò£'“‹Õ¢ë¡2FpÜ>ööi®òÏÃïÇ×Û‚ñjèShî†Îpí|ø½¢§ÍaWã&®k&š5/YÖ†÷=á/òœä‹Œ[Wkýë£;W.u'+6´MEæÄ… oj¯zQsFúDûLa‚¹œû²D—*ã³ÑbÚ#.NÇß+ñd²:–åùשÀ¼Zj;åÇDœ×IĨƒÉ$ÅHºlÁ,Ñx4únÔÐzqæm÷¯Â•´7uÑ~d§&o4.Bë½¶Ê!#/{1Næ5ÐÀAr7Ñîâ©Ù/W Ú^š¸”Ü}$”®f‰+épÔsh%Z8o9’:Á;Ì×AXBH9ºÂAk¬#®ÆM߸ü‹Dk(c²¾pùA–ï/fYˆS>¯Ôë BÈ_rPŒpßuÏ}&¯º×yxí| wƒt¾ú¤Œ¤ÇÖâÆ™!""³ï$ÙÉ!¤ça ¤vŸJ¥ßÕT+P‚;ª6ôÔ¥©Úw ±vUä÷dyªìqrµãm­ÖœÖã%GB&ƒç¯eàÑ,ø5Ú4§È[‚í-Ř»ÐéQ» ¥@j@/ÆW=ïò¸þùDºJj>—›Jón ¾r¤WU,Õ!œpÛlÐÆ¿aêS/bµ[éÀ;b8â_T‰˜íæ„ÍFˆ-eÍËãþïÊÌ®íÁÁ•±X³2ˆèúœÏ]&Ÿ3™›¡í |yCÜ‘âëÂ:œ kœž=÷ï8Ÿ¾#—.$ÞÄ5†™ 5}RÏþeGÚjÂ&šoÛCI›Æ7â“Ež‡X¢û-¦`«éšö•›™‚ÓÚÆÚ'Š!eE¤ù犃Úî^ØãºžV½¹÷µÆ4>Ý É†¯V«7Ï8jJyT0¬}’ÖøÒéô£ñ‰˜J¯ÎWá^ ë @ŽHœ¦œ Õ›Â‹æÂ)JCRÚC½É!ÇË^réì Í>æ6e8¢ÿ˜fŽJüM#}´žíYø5 ókšØ²ÃíÞ+üõ1Õa§"cp6³ÆË¶û¾63>âƒÂÈîq‡@£?Ö‹EÛ.‡%íBá¡×,Á‡iXfÿÚÚ·üê;Û ç=*…°F®·£jmn©æÑÑÚdƒöp'f]g»KA²…sEŽCÿéìÇã. ²²µÊþšÐnßÙ>"tÁvJå]È(.ö«T›ÜHáÞlö6·¡¾ÅZ¨áï×äìmdM){Šeч‚£Æ‰’ù‘?»s§˜d*ö ‡W \µ¥6¯6æTïda>'÷6Lœ4X³Ë;y¹DàvsÙ%±Ô%D{æÚ\Ÿî•Ž+P–¥_ŸÆáíHãɼ8Žò Ýùø"¬XϨdª KÑšáOãše>dKŸBL¯«üuŠBGS /C¾èYŽ=7ŸD©7߉íVEjŸ€*ûĪìZn§4†æÑG ä¾ kv\Be!¬ Ë)ñ(GÞÆaÂ"Ôm\ÀÁË4#TO¢ôÈ‚2¿ý! ²èew1³\Àþ€ËLd¤Öe`KЫAà$‡@|5 5Æ-¿i\ê^çŽREœfõYý^‘üYhÊÖ¢òËž ]8zx»T*·µ€wýD PíQP!n³P×®L¤Eóò|9{¸ìV}=°ü=  ~p[½ !"Iÿä1~±íb´ËÝ ²jãÅùf}“IGêÒÞ~$s4ÁÛäcÎ’òI׃©¢µ^ˆ,¿î¼†ž8ÛpTiÿãYáë•8žÂu¦I>ûÐtf~=ð|KMéNŽr0kÞòý‰ ƒÇ ÝB_480Cnºê¶|H„óÆPsª»»& £Hm$ï&E˜bæµ¶ÌY“¡Kl1bê®×šŠrS³;Ø{sÕt”\SÃTÅëKO_úøTÑ6»˜B*: Á ^$!‡¢46áYñ.å…ÿð¢ér‡ÔR÷X8Þ^¤2ÊMÐÕU䤪vä²ö 2ÕP ÍO_¢s»:Ÿ³Âïq©)‘ >¼”îTy ?c ¾f„„Ä^ôýæÞþØaD^:óK9BMž8{UJ⤬µ¦éηñ4¢íJ“9F¦ÅDZÀö÷µ8“ "OŵÑ8ÉLüzŒ×ôH8ìÊ"¸Éhc½²á{Âé<ö‘q¤ÉWɨïξ/ñùô²¡%xwÙÙ!V¥8æûOs?óA¥._Ÿj%øpj%ǤfŸ£8&6žù­EUj>¾à;¼&Ç÷ÓÞí_°)£7à©*iç2³å×¹À£M˘–Þw`äÙZFT|òëHôQG$]Úµ»l²Ê ,RàkË,ßT’œV TX&ȧ¸ŒOcêâ·,ïâwòÆY©ÀËŸä[¹;. ˆ®¢î‘}ÙçTeL‹òIû˜€+Ëtf;u“öÅt#űhp´‹¡'kî©ãÌê/ T(} ­1ÔTã8J•΀\…É’¯[ÐïØ¹ +³ûEA߸om!²€T?:vÆNõš§¨Ù|*ÛÑê^XýsŠ>”ÓC:p§ê£äuKUHŒOk î—÷}ìÜÆ½.nQñÖº–z”ºFÜïݳò4l'q>+/‘( xмfûèƒÆŠ2«c9[ê)TI3¾µõ"¦Ú.Séfè…ªÞÏ÷%㨉B6Ž·ÉäzŸööe^ƒEç^޵sÐOƒMŽ`¦ï¡¬Þ´½3W$Æë#4jØœ\ñ­&ce´hµ(¥è+ÍA…Øt$Æ¢¬ðy)ôãÿzsBb|¸j¶èŽ‚¡âZοé[iøÔÜp¿P˜“™¶o1<„PUa‘[$Ÿ&·u®i›á™ b$Æ%ìÅoÕdVÐÛ;&½]»ò¬w årÃÔp1»^áCˆ«ë§WŸ kaY~Åv(©Ášp Z B06 T·°o»P¯Å¥rùÌÕ±WtÏšõY¥p€b«R¼Ù“âm8áð¦ÜùÏÓFC 1Þƒ'ñìŸý.FÕgtÈí—û»Ý­Iç1Á+¢?ŸK-yÈzãÏ ÔJ}íF[ ¼imƨì;‰RA“¤E¢Š”Sûþб9gC+º?§?ìQv¾;(r=­)+~¦!:wDÐ]£Wþùé+èÀ$ûê0ªkÍ,%«b$”abè$ •á£SÊÌÙ×EéϬ©/¸´¹u›§X ÕªHÁ$d¡µ„õæ«¬Žž_­®g# &ðß%òJX—Âí°ìªöž Dw#ô›©o¹‘ïq+è8¼CÂ|²9'üî¯ËaJºÍçÇ]'¾¡þ$KüMø‰™€Ë 阩L ²/Š­?ÖâçO©ìêÜ>*Òm±Æ Ó3Å{æ¥áŸ%Y¨â. ’䨭\íCGCbršMWÇdù÷]NÜš²gœNÞE@ÓÊE¸¢ÈWÎêyUý—Ô_ùG5ý}?U¾Ç‘žÆÞ*tÀú+W‰ªXNýÜvaj÷Jøf|Î<Š3“z.’jrí#•ɰV=’ðSb9< ÆØ2åc0 RÂ#^kHר­xɽþQí& ¥éºõ ­ÆÛÞh+Ñ £ÞU‡ä²Ê“i\LÂox<œpKEýÎÍgÁÖiƒœz.îé’*á˜/HoJ€k3Š™æƒ7¦Rªåˆ˜zvøé;oÏã)y ŸVÓkàIQa㳡-ò³6íÑ`ÿõ¯š—©¤Ý½å®/Vqée‚î]#—ìg)“ÛårÊšIƒNûäíÊÇ‘fâꊮ¯Æ¤=ŽlY¿˜¦õ|ñUsLÁ[¢Þ”ëÔƒw^õ ¤–= 1c•dNIuØgíqOZôWMÚm8‹ÉúÉóbo¼s-¥@áD ^¥Û¤ÒŽOíEŽ]Îhöx3^6é…¸\™Øá\”Jó­ö(“ÓJä›N× ¦üÎé+ú>s”¸ZK:¦fÝ6"¨Èæ¸)Ò¥b`f[ÖñîÃöoü"^Tò¯[N‹ .tqà§å›Kí®‰x¬ùÜ•ÂMÙwEÝğܬ¨DEæ'Åz^òëF¿ÝíþØ|ܵiÎ: (>×´æ«Úò†Þª-å48ÔÓÒm÷Ãúý{eì³Õíenn#ªlWK`¸(¯ƒEÔK…ÊîÈ&SéÞ|?S†‚ÈßâF¹ÙÖˆœZÄDæÇµßëssñú‹dÕðïóM{%…ƒ4¾ÀúÆ É=wsWÊÒb«¬y7â¢aôô³Ï(c^;p3…ºëØä¡÷ätÊwÛåp·¥s~'ä$X̃»’É*NM3Ä Kb-¬çGYMƒÕ+j3r3-ú¿9¹›ˆ%%v„ðµ~zèÖ”hÜ´q¶!9¥«L›xÚ•åDÐáÎέ+# ÏzÚ”ݹ4xw*‡°gØñÇeÔÒé…€’aq ”â¼\ö„c·Š_ʇDnJGŽL^ )`ºN_=ÉÎDõ€=ˆOšìYÄyHOµ ÃS¹õŸí #vzLž3Õm÷()çp©ŸómMøšÇ%J ò±ŠÞë´æ„ ”5Ce„&z_©›ÚÚmIßXuP J-#œPÏЧßûq·ÐQ*hŠp\ô¥õ“P¥H’Ær*JêVÁÅ#¯’ÝRûÂØ†CSsSTúÁ‰Wé—³éõGé æFÙÍt“æÏë'›}èilŸÈǰ7“ºžNÔݵç˜x>ŽÞ÷òîÂúbˆÒ¨S< ×TÊbªÌ’Þ_ã·g‡)2ê‰áL!c­+ÑÕ 1ìSÊñê§™|òéR²¦Å¸Í6ÇOŠ;4…Üj?àųiÒõÀiá]7›"i˜>¨ì ªG£[’çBŽxzžJ˜%Ó×ûýVUV„^Œ‹àÇ{Yjç«Ý#΢—š[‚ñØeÞ­¤?úR™X·ü€j³Çä6÷ˆ¨Í½ÏO–%&µ‘?¢àë ,|6œ&f öã7 "ž_0ë}ïóp¸Vé;’SõšôaÿökÏN\ÈRÝÜ‚mK#ò ™â0àϵ™ª#‹^_e%Áž´òFszeË\ëî¤D?sÁnN4$Ðc˜¦žp^7iWI“ñnå šdé“”v§z»'$ŸJ“pÑVŘ£¬~¸¯¢v4¸ˆãx¿fˆ÷!*(…ꩈ/ZÇ™g¯kYîå0v0¼“Ôýpù2hѵîG.ø\ráÛl1:Œ3àu¨sP-~DœnÉi^á|ȘÏ_`¹/n‹Õ_Šoôêµ·÷@Ò¸×\Hsïnn¼P‘¸ê ¨âè75RVø;UiÉIÈÆ¼‰>¥p—`æÉLƒïš6=‰Š,ª'ßIØx¤ÓŠË¡Y‘Õ WX˜ÓaùAÕë‡ ÑDÿ‹üà~q‘¾+¡~A±pëÉ u‘²óþÚIBÐQŸPãÜ·ï=Øø켄'̇‰ÐÑlÞñ5›¯f¿1J;yu§©˜§èž4åÊ=¦M» ugÖ׫)<— ƒÀߢ¯yJV¼Q +ŸEÆ·Yдé¶5¿í1ΛΡðg7QJ°âJý0fƒ rñ·+y¬1¹Œ£Îdë*ÕYœO 1èßdG‘ÍFÖO¾sš:î±5ð(?Í— ï]ÀX<)]*@ÏiˆOe­JM,ö7@1£¶å!iÆZ~¦/Ñ(–«’.&|½¿TN†ÛL{³›¤ÈícŸ¨DäÂà.ŠˆŸCÛgÔL9­ÇËnT›„ó…c(æí#v¯LX’Q[$^°Ú;ö# }>N3# ˜Ì$†O¨”—C)‘F×£ЖÃõ }£]j‰q3¶ á§¢!ÅÔå‹Ñš`Á”Ø8vÎcÌ «ƒ®FRún0]¤Ôº?–1䜷۲׸°æž'F‡Àêã ³Á†»*JI¨·R©ƒ³RC®„™WåágTÃ2{™ýºÕ¾Äî‘L½C²çŸ)R^`˘ä¤[îu¾"x¾àæ@Ž}›Ù;û9è !ðî‰>„rªOþ6߬~7­ÅXü؆Sv9ïf¦»9€ð‚!³auø»2/]SpheâLSÂV3}.)°›ùÀ.„r_$m{óŒr¾Õ4<šï…§úe¦Ú²ØáÈ`$ü%YZÖw[‹?›Ç'ʰFPç†õ‡DTÿœÓ9 u$+u›Ë>ƒ<‡1ªÿ½ü`Íc %ht¤IÊÏúGã‹%Ç,$ÿñu× Õœ‚ÚÆIxõ… ÅNÏSÖk=Õˇ=ª»Ð¦’8ÍL]E>{ßk¦æèæ¸á© vµÜ¼«‹ök|= æÞgö›jÖÅ™¬Àô‘äÇ#·&íùç@•ÉU S lÇ2§ˆ¶=vç‚´aa?³m^؇çyf ü£IGd<¨¾-©¨û #·‰ÛóÞÐ! K“˜þÇ0&ÆÚ £dÕTvÐlêOÅvêÇÀ³€­Ä“Ëïré"?›]@ª.òaï–ŠÏúWµã§iÉ!‘ôúÆ# BŠÚZ.!ówÝ7ÐPrkˆPìÆÉ¾¡9mÛñ~–Ä )°˜Ðsv)ý2úœF•$µ·<ÂCZÒàú (M”›m®Ý6â8†àÁÌÿU÷¡Ä)Übb›¤~Ê­õäU0¡v*Àâ.†õPÃ#‹±³ ñ8? {¿zÝQT¦«¡âáçIµ{Õ;‰Šì2GLЬpé§Ón8Ñ)õ6‡Ð_K™ ¯¢'Ø>âù+L_ñOÖR¦#föipÛeürÕ/†²÷_†<ùÞ%–„hÆs2Y5]šÕ|a¼—šÎE@RfÚ~.löó×Ö ÃÆUøºVDÉ(¶QbM°öE¤"|ùЛKKáݸ46O;a"ç¢Øw—!È;¶Ú ¼`w£7ˆ¥Fd`k•g—¬2]iÏŸ~O,ûJDjn¿k\RÈ÷T‰µ¡Œ›lºi„±H§C @Ñ oÌTáµ°cvÒ{ñ;q`io¬º—I¡iŸLõbYv¢8ÖFíˆ,ÞE7È£¢£Áÿ¸¿é«¯?^†jŽª@nÆN»·+ÌþY%ªÙ¶]aI0ÒïT¾<™@ „éªgfðmÍù¨àËc¾7™€ÓñÇwrL×PŽÍÅàZ<…AÏŠGòihÞñ ~ Œ-¼Ê™AÎá(K‚ÄÈê^"êƒ…Ž›uú—©ñžÍæYüm¸†¼Ù28›;Ebfõº_RPÿçÔ#W ‡EãÔ‘œUbåLLÚ¢*Èt¨o»‚Âe/ñ%$—yn™„?!6¡5É©‘h±´m }Ð0Òò‚ER×hU«Ç…èÕpÒžàV†Œùc†NM‘ÑVõE°kÁFÉí‰Ù×hzíÏA²ù Ùs)bø6ZM Üë ãK¯ÒótJ·¹ZÑëVì/wz6FT+ËñàêL ,èÐ#;ö<2´õÃ[¨&# XÂ|e ;cX…ç0èhùÎÌè%©Ê8E”F<&§I -’iÏÊ3›'äõ[çk%LwŒy%=Îeݤî~Lš|=g½eÏÄ—©¨|ð§ü>ë›=òó¯Vc™×68vlæí:ž@ùoéß '^ã-m¿d9ÖàÖà/™¾ËªÅo|¬ËK>Ŧ.Ë›Ð剛aÝ>£i•i·ôúf6Àÿ»hm˜YOŠbDß©LH…c\LɆdôa³8ݤý~º°¶ŽÅ>¼ð}BRL–^1×Ã/®î)ÙÖ"½k/ìÄ’ÙïAδÛ3Ëü%ëÙ’# lš’œ!Té}î9fÒFvPÓþcZ£ B‰¸ÎðFŸ|8ÆöëXïôgÛKÅÝÆ”Êq6÷‡¤vI¡êœ§»¦†";1î6¦ö}îA18ª“¨ÅsøX·²ÃÙu ]g”’×wÏ”ŸEx¶Ýõ-Óº¼\ÍW‘^›IóÕw<5fDhˆ}€}-?‚SÓ$Zæu+“öR|ÃÕ.í*#4§®Ï!y$×D8|¾Ð#h¸2ÃŽÞ~]²çþ‰K–Æ|$l/i 4Ô­%’&]écXý˜­¹a]›êjjk…sk±ÊICF¸D¶ÄãHUeá94ìgy¿hûŠ<¢>o7=Ð\¯Í㉼ÎïÖö7+Œý©Pàj#þÙÂsÑÙ‡ ¼È"5º”ˆ<µë ̃—ý‚Oу³+kðþ¨“-B°Œ²ŽlÛZÒ …¯–˜÷ÝsŸqmAúB‚8dÏóšAOÕB–°xûs©~³§m…¨”§šèξ°D:ê}é ÎüŒ?·MA­(\š ƒüêÜ›ÐZVÞe 8Ö!úi¬”Ê$ž9‰Àõf” {­ÁgÐh (Ы²] uF—Q„8Q0¤!Û— j½“Ò»meµ¥4éÆŸ.$†1ž÷*%8ZØoCrûôA­úŽØxPùz¡”#†œä—F¯ å±Ï]š× K~#s–2dHøj›×E·ý5„ïåýå0j°uH2‹2cßæAY9ôÇ¥´ÖÞdYoÉàº÷÷r}¨;¯vÙ7탦ñ`%«t:£ÅT9µZ6 ­ÓœAvl¸GR(±÷¡*kx¨‡ú/T_÷×Dàò$™¬çב£FoW9ä™`äµw{ŒìÍvó줜1†ÀÕ˜Þî7Gxo×?ÿO”ÿÓì·Éÿÿ'r`d 6°w|»~ooò5=à endstream endobj 41 0 obj 11483 endobj 37 0 obj 1209 endobj 38 0 obj 10664 endobj 39 0 obj 532 endobj 42 0 obj << /Type /FontDescriptor /Ascent 960 /CapHeight 853 /Descent -341 /Flags 32 /FontBBox [-199 -372 1031 991] /FontName /NLXZFZ+NimbusRomNo9L-Medi /ItalicAngle 0 /StemV 140 /MaxWidth 1230 /StemH 33 /XHeight 640 /FontFile 40 0 R >> endobj 43 0 obj [ 333 333 0 0 0 0 250 0 0 500 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 722 0 722 0 0 0 0 0 0 0 0 0 944 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 0 556 278 833 556 500 556 0 444 389 333 556 500 0 500 ] endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NLXZFZ+NimbusRomNo9L-Medi /FontDescriptor 42 0 R /Widths 43 0 R /FirstChar 40 /LastChar 120 /Encoding /MacRomanEncoding >> endobj 47 0 obj << /Length 48 0 R /Length1 44 0 R /Length2 45 0 R /Length3 46 0 R /Filter /FlateDecode >> stream xíYUT”í·§P@f¤›ºKºS:`d`pnAºD:¤‘F:DJ iNi¤SŸßÿÖ:ßYçê\œ›ó¾7ï³÷³Ÿý‹½Ösñ2?UD8£ô=] `n0H ¨¬b¬«dÌùLCC ‚yÀ 3ó3$‚‚!œå!(¨P”—Ä %`>C¸x"aö(` Ä”uqCï£N.n((’ ¨âlÄ8Ûa(W fuvE ]¹€8ø§Îˆ„ºB‘îP[0h ³A­¡ö0gÞ¿€©8Û!€¢‡mÝ\þr‡"]ïÑÙþàc¿?b‹p†{m¡v÷…np¸&Ä dû›ÅËCœ`pÏíøT ÂŠtþçVCèrlzÎ=êŸyäž•¬³ý=kn°Hào0WE˜ÔV†²qÚAà®Ð¿ãÎ÷]à0g¨6Âö— @Ð?ú0Gg¨«ë¿2Ð{ñþAï^—?àyÿ«W¸kC`Ûùïƒÿm/ð^Ü?âÜWk@PH˜ÐÄÝ›üçýÏOó´Sp¶AØÂœí|‚B@ ñ¼/߯Þ` ìžêqO“—Ǻï¼÷Þh‡@üåÈ ÿ‹Í}ðÏšÈkÿ×0A‘BÿšœÂèÍÍÏäæ¼ï ‚|ÿ'Xz¨ûù‚ mÿç=|7$êŒú3N÷ ükm»÷ õ€ÚÌ|G؈‡¼HIOEU=ÉþòMÞ¨E½)K×…Ë#ˆÑþÃEœqh¬Í%Àßqrö©Røã :Œ<ïãP»íÏïqÑÙpU‹NFƒ A×@¦à%Çw?Õ,%A9†¶n‚äÉ¥QÎ92‚frGÉSy•l¥‰Û€—K“Níhçý[×ÙK»UX“§ÇGj)ÞúNÖ¨d*%ß}’nEÆŽ€Ö¹ÄHk÷GÝ®v|£ù0)Ï—âÝ’§ü€¸îAõƒ²ÎÇgÕÝÍLñž?„0˜ŸB 8ÈxÄ„°Ú»2 ©éc)„Mhq¿íˆ<Ìþ% ?~çL\ê8½íÿ\d¨?¡Ïþ[˜¡;7úçÆ „õ“s‹ðÕ Òòò•Å®ê™'©ðo× öKvW‚àsš¶‹yKKfÞô©¬Ï/Çì:´cÇÁ*'® Š_ òáJ=`aã¬ÆA‘OB¯>µ=¯éJ<•¾±Òâk>RÜ]‘Çî(`ùè­•ˆ—aWnÔ¿æ¹XôžGçݤÈ šÁ¤áöÿƒßœœ‘Žè6cc3¦·(Íó·6½ˆ4a¿ žQ·· ÍXV8qÛcàÅ— ã!†gzåü1b;—ÂQõ1"‹K½MÓkD€C>‘:ôèF'ÃR£¯^³ZhzHZ‡²<ÊóoÕ]˜:¼¹éÀÏ•|º{Ë¢¶Œ¹¨Ü›ßV(·,ð!Mœ$•óÆ„ÂïnMÑyõH…‚}}+„yâ»ÓŠKÆ3.ãy­>·[ ¤–(o–=§É¼LP£ÃãÆ „sþ\•ÈM˜!<Èŧ\ÌÃ\™PÉÈAå—óå·˜B¥üùµ VŽïAÄ’vdCÛN}ûnàI5c¿)&Æíc6ý›C(ÁÃÑÖŸõ‰Pó´ßZ ñ|M,äNW#Æ '"‚\—ñÔk}j©N;M§÷''½C±GÜLÒ;l 5œ45Ó̯¬–ßð8çv¢/¸þ"ãè E¼1jô”>%¿àËÈÂå§tí "¡ßÚò(KFÛG`Ü5ÝÎ|>VXú5¥7¯21;NÓù(Ð?)\\|„èG.Q#"õù IV‡Ü‡£ê·7S|D¦›EuÁ»Åh¯€(O IÒ/ aÈÊ‹*éÇïýþBF² ‘p°A!ÈT%YÒEû±PÖ2@×ѯ_¬rër}áÚ÷5¸ÁÍ‘…Óok¥ü'ïSÄnå (c/Á†æÛ>¶×ÚüXðfX~G'g¾ “íèqo*Ÿ„œ¸¢#,ÖÂ#[û aøº2cÉé-™“Q!zêU»ùÖ2ÎÙó ŸÛ¯F:-{ `ѽk2Q¶KÑš¦ Ь/ú°Öqr„%(ØçØÜ^Š£_Î0Æô¤Ä©}?Ré¶žM‡ ŠÐln¿X.CŠ`É EÈWßDZ¼dZm,ÉVà+Ò2.ï%S~w¼mÑ=Z/sBÈk˜û)Ø!ÂÑ>ÅRª¨±£Ÿ+Ê–ïÌ{|DµÙeÈ„ƒ>‹§ eRû%}¨™w™À âN£ü@¤´¤ gÞ]c¯¥LdŠ÷Ô_‚ªz/+\œÍõ#–8ã>Dæºè¶k§ü•é·¶%侑T1–×ñ ·fJÈñ)ž€ >ÔåCòñšºκnlµŒÌksýý0ÑkW™ÂhëÏö%ÔTä^"­\ ê¤Ï]׸E›çÑòÒ¸eö˜æ©ÕÉ<ñ׊Q¯ƒsß­ì‡v6­výØLdQzh¯”2ûÌ®ùÜ2ŒXf¦ë¸Q&ˆh)>`À=ääRvéú:[ÇÝßþƬ1{•Ø„)i¬Û]îJ'Ú¼ç”û­j»ãêv"¬ó8p§”ƒWZìø´†x.î!f©yA+&òÍíêtZ ÚˈLùüh²,ÏzP“¢´Z 1U'è®ÊR$òÉReà X"»à=Ëø·>¥üÍ×åYzŲÅëS7G÷Ó¥òÉý)ž/²¾ngùøJX‰á«š2þà 7:“ðO„ü”ПH±‡ƒœŸ:óßåžxÑ=z/O”ïÜ‚RHŸ>@hÆ=£À˜_Õw¤Ázð3*¼w¿Rê¯( 9¬ˆ?“ßÐMÒ›ˆÑ7²%eŒp–„©‘j«¡ËIPù3Ä0VRÒÕe¿àDx4™1ûÏèWÎXÞ¦Ùâ.Ù1¯×/ôì䘡緌gºÁÜGGÆ”ÞÖöQ“gÖI°‰ß±ÃL irÕ®œ‘jA²­…ûôW “`/nÇ_A<šO&Ÿ¯ëo_ª1a€ÙµyoÄêKꎧi_Nª g  §#ªv7]¸ý 3 Á&+1ãQ™óÝïãŵj¥5eçUã(ž¹7mv3f_ ¡ÇP¿àø®„æ8&{]¨¾|Œ· „;ï`¦¢1LøÙ—žæH ÖþŠ!^ºBfTß §hÓ zY•ƒw­QËجò©5¹¦<´l² :^.xþXRå[¦ÒJ<n5µšÊ„ÙYìZA ²FáᛘºUÔt;=ÝÉ.z‚¶r£w-iÃMÝwÁå3µ*4O®è ÛµíËa©U !ºcVÑçpÕ ÐVf²Ú`×pLÍL™*²VÅ'„n $¼¤Õ X³¹6xV1«D¼0iÛĈž^~"‘ äÛîLÓ`Ÿe(52£(» ãö³3ëÛôélsöÙ›W–Êâh^å2T˦!•Ë~YîV¯¾dñÚ4(±ZÓ*ú™CR[þœ‚JúäCºõîr†gKÿ[ïƒFçd"$V½£4¿õ+ŽböÉWwøpßÙ¯‡Q{Ù—!‹~{°Øö…DZ¯Þ€Ö7þ/xÒ¾åK‚‹É?½­ì,£YÜÞdd9¹ ¤ŽŸd¡ò|óôîSê/XÈÝÖöFTÇÔ”^êϊ惄¯—ËD_}"èòè»Ù3 }: Óç|”O‚Î;IášR9ÛÆ³Ueµ‘Û9¢K=0s’tÁ›bJý<0¢•o;Ï‹?À€`´G鄆šE´!Ï'·øæ õ'U”¦âOFîvvH;mT‡$O«nIf^w2奋Uo}¹ÍR-H3~E£O‡E|¥Èãa@Ï#‰”$ÙÅÚO@6¶1"É%C½ÊZ[÷"'·ÅÓ½ Åè³&§\Á”څÈ<Îèµ=¥Ìº2áôíiæo…BsË ûà A˜<ˆÖ5׉Þs ;2%“ü‹SŸ3ŠÊÎÖu]yþ"ƒs€¥—r™ˆÙ6;aä³¾BpbwIF2àG`Wñp·¾âöÕé_$É8½yÇŠ’•$¸Õµº4Yà礡ˆó+´—u}º+›pÞÉ•±ø&¾¥~ìÖÈÒô ]~î†Ø¤‹yÐŒC‘¾TÕÛÛÕ¼bìN:9 /Age"e6ï×xÛÌçÀ¶9¥ßP—²âÙtW@ž8ÅâŸ6&Sg(¿Á“Ý/kHÌÄF¡¥GöžwüíØ{€Ö,)ÍR hDó—AY¾Xó>{ÃlŠ`¨¢Æk—ª³*¨\Ð"ó¡cÉדY¨2rÖÕŽ‡žçÁ3²ìóȶìLWì£×m™ ÏpÖŽÇ"鸢=ðÙÅ€£´¨”ÔÓM“$Ï4®‡‚¡çê!Q½G¹½!háú±“uBò_žø§èÓõ´Èé,™Äî¤Ùë©Ì ²…Ì6a‰\”éDzR²õ¿á„[XaÝ[,¥E¦¡m¢D7ÒªR->ãöJtm†Vsc G£.HÙ´G¼4‡^DŒË‹k›`Þ¢¡-úü©/.Þ¿1Ó•ÂFO G*;2¦Å”ìÊël{ _yÊv@ ÜÏxuYÍlÚ+˜‰¬ßT}øBŸñò£Õj™úç 47GÕª£å¥4^s$Ó4eºœ[¥1Ævˆ‹ZÜ…~-|É:,œPAä3pþMå±i úIhGlİÃm^®`­VHâŒçPL¦CP—Rnð#iZôf4‚M®ßõÌ4çPŸæ¸÷UãŒMâ\.ê=hÍa§¬‘ßàŸQe×6±ºVG³Ç˶q|æ²ÝÃCÌ@8Ô@šóU09½Ÿ–€âÝ:€~1” qQ x‰)pP¢óùÍS4£üœb§¨¸+î‰ý#šj ×™7òÉo}òôÒ"ç¨M¶ÕìëBŠ 2ÛðŒ2Z¾ -,·|q(iÉš—ÄI.Ñ¡-¡zÆB¬wåÐðç KW:ËëØå®ªc’ôEúå©=]øùíåQI››Úì·«Æv˜™ñϤՄ˜‚°=4ædºMS]1³Èé ϽPœBbŠÚï6ï|Œ˜cJèõËãíÓ= øãp¸ŸO™ ®hÄË’šéÈæaæ•ó4W \B3É}gUÓEPí%ñ¶Ð3Éžß¼¨À%?>`s¿cÅ@M í¬Û]‹S«BOCUÙè•>™I•ÄíírÕzÕýCðÕ®µ ^ä¨ïí{÷Èþìðw3D²ÖÐÉÉ^¸8?~B9d–TD»!’«õ˜^r?6˜=G\†…ósŽ¿¼|ÀËâ&ã€×Ç3õ·4n ¥ žœÜKU¡,"Ñâò8éò.öûýVÉgÄNw®=ýÊ?DÈIĶÉÎemá묋Yv˜¢? aÓ¬”§OúÑÌ›k4uS{R÷¨JÓ¢ÊɉÈ,u Í•D~²5í°JTL*àô¦g”Ù­Äø<1K6¾ Àº7üRß®A`¡€ÔZ@·®Ç`ç’½7âÎdùù⣦­ë)à¶œ_ñ3j<2È'ǬÑÕf|‹ß‚ Få×_¨ ¼Ie­r—7ËýMR—¾ðßã%/Ý{¯Þ÷tìcåôÖ't ®‚Êl.~vµ¤e…©¡µ nMÈëxñÛÔȬÈ`¼ŽO" v¿%æ{“í8æn2š ’#z´@–ÕVEç¸ô&ã‰L÷®{¸¦ô9àщ1¤ßÞzݹùޤ‡ã &®4¹öjò왵vZ >×·<ƒ¨ÎghtŠWݯ.2ê -ž·dŠE.ô Û)…Ò9ã¸M´Á¨FÿÐý¯±¯BQ¶¾ìò¦…Âé0ÓÀTÙ7€zålÒ‘´íMëÒ“šÏªIÎm±ú„¿‡¥Ñ>\9|Û» h„ó[ÜF¸ÌqÄ8á·j–É2.fÞ¦l~dno´í¨¹ïÁ×_æ9ökN]£-¼0še”ÛÇí¼µ¹·îg¬$)´hÿgF=¹~äF1H4Äu3ºìu|hIC–ºþ:ƒ®ºE/­Žß´fpš±EeYpâ_«¯›_ÜæÎ†? C~f§Í'ßS“hÄ#ë-ægçú­ÜˆÉ!\SômЊ€Y‰ðxzªm^~\„«Qç)gejTÝ“V¾žö¡â—M˜fIH”x±æãýWSÆÑ*±oDr lù ®”—e„ck Í™x6bÍWtÄ7ocy.í˜Xf¸¨¼™ãy>¿‘6ò¬0ÆõNanUÂçÔè¹öeˆóY¢óÒ ]#n¬^¥ î1‚+¿±`kó¶)\çC¡ž+·¢)ÝoDFõ2xEÒ$—ŽUOévÄ7úWôÕS†dÛ–¯LÆ´žß LlPáþbëªá㎦ÇÄåå\;{ a/B}¨º­H!æm2B"˜^²‡4ÍÿÈò…ihZ™/JäH ±i›²䌹™4ùë~N¨º=žÚ^y„>ý¤¦ÿ¦s÷d”ß®f¥™xÜêk£xîc¬Ý •0œ¾_Z¼{Œ¦mœu>bâ„ùöûŠã`ªø¨Ì$,´½ÀlE6Šâè¢_Ú;/nY~þ4ù$¥´­·F–øÑèY´Eeql…AE•on\õ&@ûJÏÿ·ˆ8?e.IqG|_6«ÕWð.k2ˆéwb—ºíZÚàêKïÚMÿpBþ}fUÊ#ù‹fêÞ ëŒS\Ë'0,i‰Â0øqª Ï“ÚË^Îrô¥óäps’!ÙAS.›b]vOÒ^Œlz4;ækã+b|6ï¢P>å’m »sÙ^“p›·â…ÂVy<›®xÕ#zꭞ˘ÄhGÐþ:ÒcO‚Öë}åþÊü>Ú¶²U¶ZðAC9ßÏG§*Ç{‰"Ò9{‚êŠî;_»CŒx8%›avèøZÌ#‡‚Uù/óg'ïJÏûM"“ƒíÚ6‚¢I¯gghÍñ(˜¶¥Ð½Î„ˆ$ëýQ«.ÓZ¿E^¨Éš壻Y9È*!Ë’¶Þ„šƒÜ•¤kR¥30Hg^´œô—Z?FV#çzz’¾²ˆR«*žMšÍKÈ9^<-–>TòГ~å±e7ž+»nÆjb±“ ¶ú5—Z¾ÍŸ q¡bŒßU{2¬½¸lDÔ!'~-Þ¤-šÖe‹µóE™÷+κT9öBM7&{u¸)ä"üA—ãB.Šõ‰ _˜&ÕSÛós¢gAÿˇàYúÿîÿsþß‹h‡B(„éHð~ ‰j endstream endobj 48 0 obj 6910 endobj 44 0 obj 761 endobj 45 0 obj 6286 endobj 46 0 obj 532 endobj 49 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 667 /Descent -250 /Flags 96 /FontBBox [-63 -281 1079 781] /FontName /HIYRGY+CMMI10 /ItalicAngle -14.03999 /StemV 72 /MaxWidth 1142 /StemH 31 /XHeight 500 /FontFile 47 0 R >> endobj 50 0 obj [ 778 0 778 ] endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HIYRGY+CMMI10 /FontDescriptor 49 0 R /Widths 50 0 R /FirstChar 60 /LastChar 62 /Encoding /MacRomanEncoding >> endobj 54 0 obj << /Length 55 0 R /Length1 51 0 R /Length2 52 0 R /Length3 53 0 R /Filter /FlateDecode >> stream xíXUXTÝ»§AB.e¤%†n†%$†™¡™aèIi”nAR@J)‘–né”:|~ÿÿyžóç\›sqö¾Ùë}×»Þ_¬‹µ6Ûce$­ïéààŠž©éªq+hè w!66‚¶E"!h¸8@Œ_È#a( §gÕ$jÂÅìR\ðâ ¿õ8m×™ÓÚÀŸxÜ 2lŸícL^jDp=Êé[Xì§ÿÊôâÏ_ÐBäüyý”—wËÕGUÄ6Z@¸ƒû&P¥^æ-E{õy}ttÑí ºECL;XM­n"}ã§Š›óõR¢o¾#sšéþƒ[Ђ㖱pŒ ž"CÈ ¯»`T Ò… z½vÂËŸ îÉZ,ÎÉÛ$>Ñ^q»ç£ŸSyŸÏ´åy¶ÌÁmu3‚†FŠ-^Ú‰¯ Œ;AX)\7ŒýiÌ}8žLÛ«ldüßäž‚¿%˜="†¬ð==I›}iØ1RÜ“Iå#TBô[N•õ™æ-/åŽàÓ(®tC˜0#cá•)'/¨ZwoKÊù”‘§ê«t\³JËzá>z?lôoÈ oÃÚSxqÛ–à“²æef)jA#ƃ¸¨ )|¬Î6^ÖÏXŒ_¯ÈŸ å/ ¡ÊU¹“—̨:lÆoÓªTŽúçgg,àö'üËû=aÑó—UÏôäFå«¿˜²“Äqi¯jPîl¦§%ó[cÒ™làÆ¦’eäQ³þž©Òäc4wÏtj°gû‘T„á â>¤ø±]0¹0— ”Ï©d÷vÌ»ßq<ÞçŽ'‘s­´!6½9E¬k·«í½[CåXkköLxØðóLŸUTþn¤ #9‹© Ý̲?¬OäS$yR˜—¥DÇ:Hv)ËŽ"é}1Ú²•a$,´ þÛËgä±®|ö¡…§ËàðÞü–7MÔo9QñÂ;ïú@†3˜Î^^J{úY·O6nŠV-I r´®ày¢þÒ Ýllä7 co;ªÑs‘Ú—Ø8F<7G†HR‰T9ó™ªHFäzÌ{¨Tº_yãP‹°­¯¿#óMÕ‘a‚ÒÝkgÏþ‚O¡‘¡*宽¸)'èRïmª…úJ;O!á(ã8½È„%“~  g9‘HÊ’äÊÒéCÌ{4_¹ƒ']c‹Œ ™žM$x½ ¬ÐM‰`.}¨Ï3ÖQìb•,Ôï±VÇc‚÷^G(Cý¥|øÇŸŒÂµÇkU˜0G|¡3+ÕÛ·eÑ•lCUZ ]êŸä‚X0Iœ-ò*£ Ê7%m‡š~©â'ªŒU‹:w‡™Ÿ`ˆ Êtæ® AÝP‰ «ïЕúWI}„2¢[½I^íí ë¿Ïë»<Yúº—u»Ë…‘(u|j/¤›ŒTËÑkØL‚¼ 7SDßöß'‘ð²Äh&^¦ëÞVã £¸Øc/œàW"¹?¨(ýç>œþ~öŽsi]{·¬½I¦g1=äü½ö™»Ç AR‚}ÏÌ ®-qù,ÍøÊ΀^f1Ö‘°¬CJ”) æ5ÓŸ´ÈÇIbÒOù Ütîz§txehòHË&Ì­`˜3ߨÊќĤ ×ñ4.m唣ÞÜmdÊüfÜ„~ô w-zØCŽá©Ë`’>Ñ“‹ÙëqÙUÍ®ƒ™esC ©©o^G¡:~R­»ÏBÔ15OZ§³*È îS‹¡Ék“zm½Ÿ¦vBY¨b[”é»Iu+}^®Žê܉Êâ¤òU`U&ØÓ$X‹Ÿ?x\â†B÷YDZWÃè†âXKÓ|V RÀ0ýktÉ!ƒS€[§{8¤äGÊÉPÅ:—bOÔTú8«ðò­ñæ£Æô/¸ÅÚ=<;±Þ3± ‘`÷èä‡JíóÓGvU¤ž!ê‘-br[½gJ¬ Ù3 q=z–úq+€†È*=TÑŽ‚7ëq“M±§ ö±ðà»Ï1²Ï|õ¼ñ’x_$uïµÿàt˜ÓQB ÌöfÇ­Æs•y^ D5LÜŠ3™X¹=öó¤ rßgX—¾…Ñ6”¸áö‹FYËjð8ju 8Åddor=oñ¡k²ˆîž *—“`Êö{íú.³”x¥;»‡ç®MœÝlµH ¥Þs³“s%“£cêx´ë‚­­|ø3 Š˜JæS\L®&{”ÉK N,ÐÜûi$3¢?÷)ð–Xü1ôÛüûÂdfÞnòæóEq¡Ð`¼JÚ ÇI†~ôÎÀ\Ž[1Ê¥Âܪ`ä›d¡ÏçS ¥ÎÕ*o°ž5Ñ&‹Ü(¤mÔ=…OI¥Þ_·Øÿâ]èçZ©ëÇcm î9Ä´˜y©ººÝIŒbØø‡&õËÃT¼æ˜ÕwΓ¿áX1ƹ%®HS{)æïõ¶X«¹`'¼¿µKMDX±‚.Áib:`N”Ó!Ö…†$àfg5…|‚Ѷ²`ÎAéË!zù¦/Rªê8Øiæ<êÜÚN¬• ¹×óRËì<K…ã„+èÛs8¡Ÿ«Ýb¯––̶uôT&s*³N(6Ÿ¼ÒÑÚ30‹€\ºÈâ,»õÕH¶5ÝÛ"@ïÞP ÓK1=ÚÙ°V¿OCoé®[ý1Ô…,“ÚñE’Ð1-VÔ@|qÓ\±hzê HP®ÐX¬ö©)Mù|./(Oœ55T9ð4È"БïĤÙVZ׬ì‘XhÊ„—0ÕN3D ­0´Ž3‰ÞöªÏ×*1ë+-Pw´¿TŠÙmòü¡Æûžë%¼â‚7êHLâÖŒ„4”²^ýDó%~´6M‰I9þÐ äª^ê5 åí#?º÷‘ƒ«b^^P>ÅŸŠûôšhfÄÄi¡ãgÄŒG@T£‹°|ÿÉC@Ø&=^ý¥Ev£N'qŧc¯6v!ç³TÜøK¼6†uüá‘é®qÉ Gdü›×Ý2Ä飲¨*‰TÃ$›Ò%mÇ“ùÖx’ñGYùnË ºf J~Áœ¿av£qýÁDß¾'1´p ™ð'H"ßG+ݧzi:Öžg¥•‰¸ú«¥` ÃÍf f&3ƒù€²wõfB_1$ëÃO<Ž\Ú£É~Å'¯?Zÿµ0Çœdóìñ*ðGhkÁ}OYÏåÒÝhéP sc‰}^ÃA5Â'ºÝG¦Çº–_$Ê—½6¶:¤X5x2<ßqyQN~ üÖyÙš>ÜžF1W½äñøá÷¦È§Iƒ/Á»äý+?†òôØWxeÒè9;÷CÝE£çm[¼°·ïß35îs£3 þ@Ôný± F,ãµ·oCK{[ZR6Oë¢2ézÁF¬±èû +r7å¬Áº´;™‡p=w­|aŒŸIOåY‘õ9N!Á}YÊ0;Åao™%¤dá{qü±_Û†$¸AÇÒšTk0Àl!é7¹Ò°ƒ¨¹4™ÛÑa&þewòdK¿þc{ó½Á¾~¢t&< ·ÒÒz…¸¢¦´‘Ïé¡ÅÀÞ¹kÊI0ÊÉþçGžÐŠLúR{5:´wÁÿšlˆ¿¶¿1¨ëŒñå•*é­µŠñÐ/“™§b%âžVò8onq§Ÿ–Ê#KqqåÆUV˜‘,ì’Y†âꣷ³oC`ùÍ…’ Žß%L-ý©µ¶øÞ#ýßã‹ 40Ôƒ '\mËG{ăZò^gÞf:Ùá´0ºm}+ ³„KÒPò’ ±¿Èßü„@ì1\ø‰Î$ø‰ÐȲœ¡§‹Y{;´b-ú=}¦ð‘o>^µUšo<#óÉOzo…'I~ ã„*:‡®[%G4’‘knhßFøšÜó%Yí±Á–š°iåd”^å»û£hü\~ÎþÙjǃa“ð»6¡uW#Ö¾:(œ{MO§qv!D]GŒ#ÄÖ»¦a69•G:ýd”Ùš5ôå1ºî§e'½7צ<É‹w§æîá0BÚ·<ª!N>›ƒíÓÞÏš67´V¨Qýo÷‰&ð^ì‚¾æ±Ø—–×´M¶àÌŸ`Óy¨íÒÝ,®ÞÚeO+=ÍÒÕÕÆïfUh·Î£êl“M€8f8L—SGGù7è·’­Ôj€Æ²¨S¿,¤T,…<ùYVðDJ ’@•צ]Ú¦O´s;†±Ì\€ ã6| è©`Î=g×9³…wÛ¶Ø¿ñ­¿w‹¥ÛŸ–=dÑ#N#êô¹vžÇÁÝ"¢U°œ«~ªÃP^šæ½1ë›õUZG˼ 1ÚC,ÊÙO·*“â^ ˲ÏfJñØb¯»4 ѯÑîÞãã"ö``]€Cà>M´þ¾lgâÎϘêBfÙü£¹™âÛ}‡Z´o¹gÎÞÖºËG†žÍÎ"Tj|ªA§‚ŽÕð¥ÚkÞDÖbE-ЉÒÉÁN-ý'‹Oбj7Ë ¦ô0 ¨Ê_(;Üÿ U7.j>³cÞDÊ£‹stª^ý%Ô{Å÷x–{ÿjâ(<£ÉvFh4ë[­è°nà¨ûݵ§‰?Þýêãø™«ªžýKP¡€;“ :4'°¼9íCGwÄVtFXDã,(e³i×F&o–³CrŸ=†K,ˆ[ZxÏgzÕ‰93kµ‰8€1ƒ %yÇêXÜ4¨š8l1¿y‘Ç‹¦gÛeÂ[X`®«r#2©ü5Œø-Ê•fÉ k5ÌXMü­…ÀP62ÿ÷&3µR6«©¦Kú²|~>Ñäå–ãºâŠw5ëô7[)TÅågž<>OMU*ä8çŽíZ9ˆÖŒÓB(Á¤×ôd^Ÿ½­HLrq ß Ób+jƒ´›ëîpÀ ÃR*Ja~ÕBæÔî }MXaœ¬ÕIÂy=Í2?”ùAä·å ­Ø ]ÊR¶sVcê>¯pV }çöÖ†‰v €âQvuBcb¿Õ¾Vs@íŒrŸ_³)þ+ Øã ™äYå=$Y¦uv>dœ°ƒPªŒ\»+ÈÀ‘1éTÒ{_¶ÇØîø…]D.éØÌï÷M4ݽº')˜Í€aAÝNÔ×+zžKÒÈÍȳ}n>Ó ]kÈ€=;Œ+o|2ȲºÅ›m^«„¦>»Øà^ äù•BÄá³'R±Q:˜'–ÐàߟǩˆóÁd¢àe†p&ÿœžé×ýÞ©¡£É¶„k8± ¼?9¾àJ%Ï•i}XÒžsl¶•1¿ñk}Ù”;~ågÙe³òi\P[×I‹ýÓ¢§DÍáºÛjo`ñOó‹a’ mP@%€K7·Œ]ººíUTi>?ÎÏ„nÝ «l®­‚‹kToê“§ôÆP^Qývÿ‡ÂÁ#Ä&aêWøÈ— ‡¢Òw§×k!B×ÄšŸ~#{Z[ÐRSæD›#Ne×óG¾3($°gSñ{¡@CÞXyŒK*LêLô:®Þ/ ¯‰uo#QϼPÙïlA|.êT¢6OeûÜ•ÑÍÔ£Âçõ!…èUÑ/åboÆÇ†‹v²ž3Ü/æÊ4}N]„÷Ú„^à B°Ç"¢HÔQàfåãêvÙÒw–²z“u¡tÖ%…IRݺ0l*%ÛªS¶®MªTøÐ:mIHåÈ,­¼DÜU½TOG®ÿòœ¡Oïo PHG›—[¢ˆ&¤ 7Éò¢Íw¨Â&ˆ0 ¤!ýb=±äƃãŒeð‰÷Ì HøôKU uöiÛ¡¥„ÍÏÝ&ÃÀ´Úý‹ýbåiv¾uǹT®f,“ep ÷I)¶© ¨o¯ ‹a#ŒÈc¿  R> Ú¥’ºI” Y¾ñz%ÑM¹‚_·/ðzMD§#æqƒ£•ËE^Ò¹‘:Å¥Å÷;Ž’fäå¡I}::HA\à:oMõèR•³fgKq´Ë vÙ¨ò»š[äî(§E-J¤³šÌÌâDÞø…·/¿ÌŠïŒ.Ø[Þ46á\«­ö:¾žiN)ªú¬ã•éuƒÅr<û±‡Õû¦ÑwsŽ(PO)/Ý5È»@4ØGQ?Gä'ò.+Îq~ è> hðYÿÕòDé^Ay7šûӴѾžÇ¤vrÁ±èNÈÏç7ÁUUh‹ÃEéˆrƒnFþ‡R¥ö‰vw Ýå}zå°l|—RÃ>àÿò!ù_Öÿàÿ  p t„ ìIþã­d endstream endobj 55 0 obj 6962 endobj 51 0 obj 762 endobj 52 0 obj 6346 endobj 53 0 obj 532 endobj 56 0 obj << /Type /FontDescriptor /Ascent 775 /CapHeight 689 /Descent -960 /Flags 96 /FontBBox [-60 -991 1147 806] /FontName /HIYRGY+CMSY10 /ItalicAngle -14.03999 /StemV 85 /MaxWidth 1207 /StemH 40 /XHeight 517 /FontFile 54 0 R >> endobj 57 0 obj [ 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 ] endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HIYRGY+CMSY10 /FontDescriptor 56 0 R /Widths 57 0 R /FirstChar 92 /LastChar 164 /Encoding /MacRomanEncoding >> endobj 61 0 obj << /Length 62 0 R /Length1 58 0 R /Length2 59 0 R /Length3 60 0 R /Filter /FlateDecode >> stream xí¼UT$ͺ®‹»4îP84î®CÓ¸;îî4îîîîÒ¸»»»»Kãôaι×ßg­=öÕ¾9nx"22Ÿ÷‹Š¨9ª '³±vTr³2Ñ1Ñ3räDÅ…dhdͬ œl¬dm¸dè€&N€Ïn6Dròoö@}G3k}G 7€‹™‘‘ ‘ðÍÆÖÍÞÌÄÔPÊÌÈȲµµ~¶ZÙ:9íi’Ö†ô}k#€™£ÀÒÌhí`cï@ з´ü{œÀè´wÑ#21ŒÌ @3kD†9JZÛ¸þÓlädû_]Î@{‡OÕ¿ô¨?O¡odcmé0Žs²´”Õ·¨þ“ðHßð™ øW(K}ûÿmŒ¾•™¥ÛÿiÔÿUŒþÒ§ ðbþtùwMþSO“¿}Ÿ.¦éÓÅì/}ºXü¥OË¿ôébõ—>]¬ÿÒ§‹Í_út±ý‡X>]ìþÒ§‹ý_útqøKŸ.ŽéÓÅé/}º8ÿ¥O—¿ôéâú—>]ÜþÒ§‹û?Äú¯ºüËú)ccý·l¬Ÿ:Ž.ƒ°~ Û8ýõeýtr:ÿ&gýô²þ\k/ñ©f ´7³ù;7¬ÿš7ËÏ…ø_¯IÖOGC+«¿3Íúéé´2ûïÇ}®M;'G %ÐøoeØ>µÿÝjd`ùŸmñ¿ÎËöà¿zþûÏ$Ÿ ÆRÿï ²ý+‹¥¾Ãß×Âçêb0u³5ýÅû\~ ¶úö@ëÿ~¶Ï@ÿnýWÿLe`¯ohtüï‡fû_íÿ}ûÅûÛü¿oAÂÂ6®:&vN3'às/cp1³zýŸö EÇÏ·}{£6‘ÏýÎÐÉþ3…ã¿wþÏ­ñ±±Ùç è 4D\Y´1ä 0OIOu¬ÁÊQk“iÉb‡±¥uõ#5){ŠQŠ6|f†6‚³XX%EË$Ë÷¸ ²¡6:^Œ™Ì¶”Òé%U~Besð%óß¶H ;–Ö”úåª9±a&—GXç²i) ß&/åWS•ÇŸBÛm/Xu<Žfœ¼f÷nŸ× B,<ÜÝJ§x(Y8&ãŠ{]¢ö‹‘öül_ËC±7pþÒï`Ìšc bæv~=é V•W îüë°g\²èöc!¬Èå1ZßöåG4µ„×"ÞúÍW%Ü®\Ìí0L7fºV”VŠ„¶胱]lý&ßï³=Ó¾ë;ŠYp­È»_ýÔ3´ô«ŒEÙä‰x1eØ 4ð×F€€•èîz‚-‹´E‡å‘`éàQiG£4Îaâ* 4YFüåˆäñ¼´ ä&R=»éa:±k]­¸ò@ž^s9Ò©íjã†ùõ¶²¥'Ci Þ.ÄÈHE3ICVBõ½ê~ü°¦DÜÆÍŽ3.×ÅRÒ™ºI9‚õ¢—ýŠïH¨¬ÓCˬdBÎËLÒ&üÄ7ß©„ÇR•çtòË»CùGºZz½ÝcÜ¢Ö@jÆ–Fƒ™ë**QÜÍ]t6‰£¡5ásŒU¬\é-þ Ö«ÉZ¡ m(®ˆfî Š0èlדÆ„í~T\¿  âíÀM~ûÎôJÍ1B(Â×(¹ˆÓŠ*}ìâcÛ‚à8I9™ãxob{myç â˜~}ÝvPl–YXŸ•jusÚÛ¦)&í.÷ó«UÙ¼OtŸ^e2_8Ÿô¥ë¶èdù¸UDD®¡¤¾ kÑìÓ¯÷‡ø›˜ÖŽfCWÃÍûpꞣ–/ªþ&¿úâúS¥­ù]Êü'žßœ/µ¥¹¶'â9IQ±Ñ…· ²"˪ü$¶¡aZ‰ºð*¹æyÿ¹IR‘Á(£¹¾«'š—úNZÅPȨ̈T†k}Ûc‚³†ítÅe;=^«ß˜Çéï?Äü¸Å Ax†n•¥£g(+æÆ¦~_*_m­ÄßpD9ëv¿9 i8øÝœcÔ™ÐhƲ0ßV¿)5•ã=Zgõ²ÿšÿ‘DS‰¥ðÃÍlŽzªŒ90Ú^çŠ =þ üDX \J±è‘;yv׸˜föòVÓÚ°LÌuâh^_{­p§ 7O?ÈßÛx a!¡@縔 ï: -¤£Ù@ö ×M©ä’·žŸôv§€0sÍ(¨)}:$¸)Ñ {Ñõ,·aF%&ÓÄ”²Ìg‡X—…V ¤U»åbé¨M!&ägÔ¬9Tqí$lÉ剩ùŒ³Þ´BÉïÆÝN±¸œ %Ï`:ºmuåUå[¡ÙVPX.¿,! r?C{§çưú«×ÙàPÇO$•f*¼xKÐušÛ®7jÇgkd­Ðl¬à ç3†rA¾-á+ÈÒ)`J™‡d~s ’hÕ:ší›1$ñ[H€™ÚÖ>»SQDá¬;Ó zû%;@˜ƒŸ§›”1qiÍšw†XÔr‡÷XŠÂÁÿu¿…Ãmñ ,»i€¶’÷1Ôa›à.ÁŽbí™<ˆ_°ÌœêOlz¯4Ou¥Ž¤çøFSȉãdM%”¿ ¦ åD—«2â/ÝæózÞà\•s‚³>]ÌpýŠf+]œÂˆ,«~{8´ٌʘxõ±.ì ¸þÄu´Ÿw–¶Õ‰ºãÆ.Œ¢›eDx‹ßVz«g‘µO éáVŃuÀÖCºƒVË×(F8 –BEÎý|=³Á %ÂÍA¿–2T¨#ç *~õŽh*]öaÌ–hz5èóSŽð7vJÎÆã³áÞy[$o¼ìRW}ržÃØHê˜þ{>ž1“èŘé¡÷5 é)|[»·ŒâÑcþ˜qÙ HK¯Ú2Æ÷À¹I–ÌïÜ]ò—Vâ}º,»ª1c²Yo ËU ¿£Iždæ(5××)×PRÓݦ±Ž8 Ü=¢£üf™n-ߨ}Ȫt`-™>[f„‰h ù½Ú€Ýiv*ðKí#¯»ÂÞ¢’Ø’d‡>œÿ¤Hö’À*g´÷W¯-¯jóR¿}߯p[¢¨ ¹n•F6fr‰é3€+ñµÞ÷ܵ!óVl½t>éÄô.ç œŽÆ±”ÉùͲ±€…u‹R$6ÑܯŸ-Ȉ*9"ÈK•¿Ñ—Õ °©áv òKøÓ—]‰“šÙ9ðtûªŠ4Kœ$¦p¶×yëÔÌí ÐkòW•Õ™ªT<ëéGv$;r|ve¤ø(§ÏÒÄ­¡ÈÊúEm²áE^¸´!θø¤Þá‚'Ýõ,ÏÚ§ÅaÇÆÜX i _@NêèÆmÇÞ;q~Rº•#¬Í°hvÌçSy×ú7=ÔÜaÜô´€lU¦ÐJœÔÕ¿[ôË»W‹I²s8ÖS5™Ób¥(+þà¨â‹®ë˜ÐœbS¬rµJÐ-¡¶Â)ðaS ‡ŠÇû¥Ä»OfíËoܧ¶¾½ÃVhÖ1»Ki¤¹DœöÖ.³ék;1|—†ê}»d„ëoÛDø4üR ÚmmŽîœ5Z ^Ã¥aŽh­T§Ån‡Q‡ˆûú%–ÖVÙTS¯Î(ƒyNó@À+· ?þ'f…ÇÚï!S}úTn²Üã•M“:øš8zŒ1Ô{®ÖP<¤t…Zi ¬Xõ-3ø:rF¢Y¬±=‡8 “׌[Ø“ýl U?ÂøàKŠ'¢ÏTàÄbs™¯ß}¡JOñÎïìæ÷±¶ÞU%RÜÔ?¡³gˆàØ€ÉF:c醠èUF{}zEI0nIó=©à?èQô?) £9¯½ÝEöT£¼¾$oûBmû–_ܤL¶(P®N\Šññ[qm'èý»#Ñ“ƒe*hEéØßP·j¸`žvÌfF;=š4ªó9"uú ìŽeꌅâX •0. ŒZå³gzé `Õ%ËUäE¿‘~É»ŠÅ„ºvn.ð@~•Í›unX}!±z¶ªñ…]¢G_Œ¾óÚØ’„­î­é¨¬—£€æê“âå A}çIŸ4ùB~›eì­ݱ#[÷žU”šöcŒÛc±´2o(ÞÅÝÉœYØHƧã‘BÜp˜“}{ÏœG­7Á ŠÇ¼Æ²ß56eF·‡q½ ;òÕvçØx‡Å9^>LðM–KHÏ…|öƤÀôÖf0"· ¸Ëá-õ bÅ êñÌl1Õøá¥¶[„*´dz#TvψëüÊk¨šñÒóK)Ÿ·*àZÊ„óù~_NŸþ“Öà„qL[™N”ƒ¨$V:+yp/(z“w-I½8`ÏÛ&Q_ªÌd0±õþšqƒ‹@û€_åwSó¹û[PÈ0óÄöˆÊüÒ ÀrÔÒ¢TweaÞW¤l“—Øáõ®à\ŒØ“Ìq9Ã’o>ï—4îƒI-„øÑë™–AiœaTã«ÜàpÈóÀzåU¿Å]QÁœ‹î±T('6±XÃî3a>,í˜i÷ÞnÅ®!.šš~¦GnÞ4þ>¶‡ž¸&/M÷3‚ü©÷ʪ$±ì‰uh.839åP,SƒÐÆ¢ÆfÂÒ•be°ÞZ"2ùÚiâGo7Œ_Lÿ©ÕÙAËøt¬êbsW8‡ƒP¾´&‘ÿã‰ótDZÕm‚ Šl~W&Ee`­ÒÝ!§ÔóDb‚êÅ:˜ ÝápØ×1 R¤[¡V´2|äSSƾµœ/¾Òà9ÕÂÚã„ø_…5ßÝc³O=‡^´8.@Q­dæžÔµìÞUûƒä=²Ve~(Û·Xc‡¤ŠðÑŽƒ9ó×E3Œ 1RK@/[:ÄÚgÔÄÎûC.d¥4Œkÿ¬ pÕÛ‘í\1f²“˜ ƒ©åíh³úOç”±Ž»dÈNA~™)\Ô,c|¡\ÿûTÍWùÄôn¥0p& ;dІ,ìú©2a‡f`|ä>7åÔrö"¢Úy_tïIµ9J>-c3]¼ð<+Ñ8ïÞRã ‚ðêfÖ‹¾NÓcŸh7Î=/6»T"]cMWžÖΦjc¨B TWtŽ™\žšÍëS UÍà›U©MÚ¾60}^›ø†É**%âÌí~°á¶óå õï5pêe&Õ“¾íëànÑÒ¦¿i%@'/óèH"±ŸhUg¢ÈPììf¾ŒœŽ4Üu«Û~-ÏÄ}äM÷\!•tz7øóµ{°PL`nÚô<¼s,íˆv!±ŠíÁÇŸ,/ö¥PZä…È"U7ÛYЇCø¢°7‡¥''½ùÆœOÄbÆmjÍ7Ë*:L¼ñµ ' ±R’Š3“0™ø‹í°—)5Ñ ö—½§•ˆˆKw¨»à6¿˜~¦ÖýÈ‘<”Ãh¢üÔ¤œ&}xAlsƒ65º˜|('nfÊrí8lÜ£êì–ïq’t ú‡c.3L7 z»œˆ}}‰Q/¤ÌS¯}$m­«9vVB:¨sÝ~±©¨ß~¼õ.É@$j€ßøÀ_DçáèGéY.•ˆÍ#ýDÈK6`£}´„ƒûÞIé¢#„U( ƒåÊ;>ëT"ôΛ’òë/‹×ýbì¡og?ÅL:€;´®=q¯#@jjÿq´r‘' Ã1{¢¸~l‚”DÇš-^ÊÒ°qåæž,N©$3âÇÃ!Qßþv PFçį KW}®7õª5Ÿ(LUhªtO=mÀ¦Æ·&kVjOÏqú)ám—'Ø ö¨ÙÏ7Ô¶J|³Á¦6Ï å2èþ}êU'“i"xÓçÝÂk²*®Õ6åP %ÂÚvãy°¢¥?©c'Xik–2N_®¼HXrÐÉXx˜ûãâã"MI£¨áŒ‡á1-{tt^¤¼²Éà†Ãö1¹{±frª(X Sǘ™\µ÷çÁ—r½µ¡{Èø^êö];:_°îÐjû]d¹WÚh=¥,ÔÓïmÀ@[ñGX§\oÈž‡ŒYlMøCŸˆrmÁÕI׋e±qâcl.cÌ•±oÎ Àv³M÷Ù›Zhñ-ª5oîïW‘^*6¦!M°oÙÊJN¢­0»lÂpÁ•`´ÌMñ4¨ŽµHÆ2>'›É·”O·?t‘ ޱ÷^÷‚¸¯l+,+n)^ãV²;Á°æƒ9'*_ðÒI†Ú ÐbW£àïÐ.ÀûCG®Uî{‘±Ùá(‰é5 .I ¾ÀØéåÜKE%Ÿ*\Ë€ƒYtd1ÁzÈjB//wâïÀCpäâÎH™”ÿí[ß!3åÆ¿æv/)˜ª|·æ±’!6ÜZÕY” SéúTh#ÍóMãJ)Z˜ä‹Ù¿@,‘ãºñÓæË6/؇ãÇ6° s’ªƒ dDk­ŠV÷à*]”žŠJÈ\ü5=¬Rwì»ÊKÔ˜!œØXÞcdB1+Ú°¯ß؉ùTK×ßUà(oʃ¹Ó]k\ëdAtްãUs-¡­Ÿ—átFJC¼I?eG•G»fOx2|ÔOÍ8oCFiƹ©Sß·XyË›$È›<ÆXû—È$KƒÚZô…ÇOãPæI„³ìö¢¯«~¼šÊ«óQ«:ƒÔÔÀ ›ÕÍèˆ"}sžÕûK{òH¢© o”“¹xÝç "¯Â™êÐðˆ™±%Ê>¾s‘Y BÂ]„ ÙdéЯ3a‰i_Áã¿lÓÇvqµ“ÒÇ"å*‰hµ7..€1y4E>2Ç\õ¾>êD‚ýAÓ¡þA&> ¢§Wç4×üe dŸñŸ!s¥ZõªPÏG(À`U½ÞâѶã6Ï;çd]­ØD€ÃLFñrâ¶ôÁåÞ³dà‚œø¸é Ë{åäŸÃ¸¿é‘(BÄßžÚ[:ƒ/^ΚÝ9ç4BFž“-µ@ \FÃ&©%áTúbùŠFƒOjx}×á ž 7G­¦wb=Ñj˜¹¥¿‡¤Î]‡ëT{ #^VHK¢U¯ñ¨ŠÉ3¯ðp”S-ßûƒ¯å€[z꼅ծυ[Âqb3H}Ùåó„q£¥v^Os®¸éã~Mã¤æÚ˜©ˆQ3*Uéæ»”ëëšxü9¯ƒ»è¹†K„â f)V.„€ùŸGÓ€™Ê¯I³“‡_ºVù~Ðbk¦¸ƒÄI‘tFžÉFgßå2 8V¢ ð)¥µËÚªqÇEȤéÔÛšÆuo;¨tXõ ÀŽÊÑo•ÈFPÔ¦> -ŸÏ?Må2¹¿¡›3”””ÊGV‰-l|ƒ’›‹×[wãË(Z^VŒ~ÙÅÏ»K»½¢ð8x«©ƒ­‰IÆ.È0Ÿ¢4)æp&æ›ø,åd÷c.·“€ü[Y‹àÜ9^T;æ@þSU8©K¶Ôên h©ôº×U+Úü…P9ÒF¸s¡XyÍ\YÒé.~lcõ–=1Y½Å$Ëàsñ]®@Èc’3¥8ÅnË¢Éê`¬qšTÅî·L½õ:Sì÷4$¼Æîþ•c¥|G”¤ÓÐòƒ@–Ê"ibòCoCÕµ°ß8ûבKò—N·ˆß{J¬uªxÊ’"5Ó^¶4‡ -Í ±ÎÎÐøÕóÖ½f»iÛÏ ÉÏãÌs6 7ÞÂý#MJbø‡_òøÓdÂܬ#2£Ïú´H…y¦ ä¬µ€SáZµŠþLlzEc¦k´²ã+ßqè9Ð==È‘¨\% ­¼N`™º˜f#Ó`UlPÉ$ÂÊ‚øit_Òp 5 NÿA m«Q†Šcb.íÞh¨]3'µíüœãòŠ]±‰¥¢,§î4å· £µ(ƒ>Ì­?h3}B‹rîbDCtÏ2˜ˆE²·7óDÛ²,Òµka€Z-•·¸ã›¶5 åò=\JÈ-ú g凤 ³øk#&°WI“²J%;…#Ðe.…vŒ¿Æ-‹àY£À7·†!ák¸c%Whã>5½ÿõE6Wږ׌Óû¢ñä- \Y1ëÛöÛz 4ÓF TÊ"Ë@¢[H°ÁvmGwÿÏ!wæKQiÉÁu^7”§²tÑF~·‹ IöϽµL/ѸZާ° ,:ºš|ÇÊ$IË.!*•+Çq“ÁîÆiNÓD1™âò›¶[ÙˆzJ ¤!é Unùi³¿;Xù¨uV@Ÿ¾ÂGSÒPK[hØ*fU±>“ÃþÄ™}KÿÏD8šføYZf´ ¸¤• òM¤lžn”S²ÜoVòηn}ýß']"±ó%ÑCül—_ìÍ©^¡ÚÛwÞªOl»§ÉÒž¦$éM¤I8#ªf'²ð»9ãâŸ3î0ÑÅCÛWè “P‚¯)uNËdšcô3œž?ÚŒNA2éÛìÆ•)NtÄdº@Smb{Š£•‹¶øAQ[ùyU¶l1×Ö°¼FËh“îIˆÉ+,ÉÙÀpÁˆTIdá}Çxƒ£Ñ©É}­PÎn|Û’ ’‡–½áhÁùǬ’ +qÖÄGÁÆÖïëˆc ç¥dþ ½m>ãa ^ø©¡,°ôàöÍ¿0Q»Ù0ea#åí†W~/viPvpÁ}ÿç,ßü³kÖ8³º¯§K;ŒYÇs²‹˜Ã™n¶¼D¡«sYB#d¡¦è‰áΫÄ}Ñš¢̰/ÕQ\<‹KB+n|bi„©†%‹—qDyDÒŽÓ‚6²B=2R7¾JýÒCV3td~es@UØ>Ñ·¢÷ÂàþK¥ðên•ƒÂ9ëÔ÷æ€?¢ûDbN8Šj£4G™Ó_…¤_G8iÄóÖçc©½m ëHO$~x Å)òTàÏFûªëìò­ÚI·_ ²ˆätç%\²‡­ƒ7†øs§ *‹¼®ºâJ'®)—.ÃäÍÜ,‹õZAñëÌûÀ¯‚‚Ä%uJYò.ïwuǾG¶yý‹X:X8Gt%$›ß lKJÌyVG>8Œ·£¾_ÕÖüÇ®«ñÅÔjD)Ëq=Áz¨¶íGW}yºÿµ›º¾vžæ xÝb VäL£²öµ7JR¨‹GD[{†,w¢ÆÉPëþªKÁ¼ª7‚—¸P9u·Ù½µ¢UÙˆ×lßS µÐi«¿}ôa‚·ŒæŒ“åÎRÅø<{p‚M–kÔK^^ýˆÆØý£ã—Ü´—ó6¢íÖß¶,äe|Ä©BV»ˆ‹Îá·ýxÈ‘ø•?†¶…3ÔtÕICŸêD¾X hÙóê¡Çàzäëm‚F?®›®‚¯mE*‹½EømÕ?®(]ŸÕÑ„ŠæÏA: Ii„éàY¹3k±±òÈô?aBàcŒ&ê¼$ÿž5~¶V« „ÙKT‘ Ó‚ä¯&qL¤BÄXÕkSˆšÐùB9KÛÊóøFÙbyµ¡e¸+ÓÝgŸ=N–*W•·Eú\œ!»¼³¼ÁX¿U,ÏàÈt/‘Pä#Ÿ>}}›ÖÿQŽ.áïõmkfd%%½Zü]NesÎÀ|«ÆofÂ>8 Îóý‰@Á^¼J „ÇŠ,òLŒ×RÄGÕ*›«'Mô7 j²ðm$xfkQš³Æó*çÀq +ÔW:x[&ðùQn¬e0šÎ£/±ÿr1—PÀÐ4ù ¿™‚|žÍóéRœ C= ÝÇfÔƒã'bÒƒšëµ"j2³ì:FÎç]ô͹ï}=d/³«Q|e@ýùÞ3)0¢yÊ™YFaGW5s~WGÏüƒoßæ¥­@‘meü ;·qïkÁuLã%R Þ5Ë€ a­"%ÊϸYØ¡Sƒýíý3Nø«BõÌ]G@è(ë&:½&˜;¢h;숯O©´d¿†N6†xj‰ ð½øÔø|ã\/”.áiÒ"wYñÝ ähùN&ìì&õ»!0«Ñ’Üͯ}é%ú4]?ï;àœ±„ ½qÙ(yâØïV¡ í —…ïk¿ù—0Ù*=S\¢Þw¸¡ÜÕCâ¶QqXàS®m®˜W_öR¯—ê–«6µA”Óó¶!¥ã„ßÔê/Ãû=ê Æ?òcÏèBÓê÷»Œ— l%ûú -.^ÅXö—jYœ„Þ‡¶OÙÕ |;“P},<²•Ø´T4Çäˆc?ÿ:!ÏPwïàïzé<µŽ¥ÃáT:õ¢ÆxÙ?DeA&zå÷ËOñ>q¶“¹¬µÂ±Þó‹=Ýø÷¾oqzYlÙx‚‡|­8ÊzœàˆYsƒ?Tè uøÜ,0¯³l6mYe.};‚o±A-„ÜZÞü=\½Úqß ŠJÖš²¶'3'Ü¿ž¤àûMJ.5ú“¸ã‹•Íh“à쟩¼6л,Ð a´Nv7ç1íÔ7i^âƒïÆøaQŸß`A_5ósÁUÕ8d u -sB$0¥ú"•WXl¦nƼ“âÇ(]EÞ—d¸¿EWÍRrˆEĬOÊHý†È#ƒÙÑÆdkô_÷Ÿµl„Â´Žœšehn_{ÿñx³?˃*sf=²šÄöâõN¦ŒÃØÔjïӢLJdòÓ™UÁ]c¥y‡s˿𪿼Î0Ow[}ÈU§›¼&˜n "«žŸWM)PæõÚWØî×8áŸ@îíiS¦Öµ—õkÿ¬•µ|z‘7¼t;|§yBÝf?åïŒô¦²Ç⺠'ȧú¦ .Øc|ƒ>CÆŠJ[Áþ¡ƒD"L'xã™kœnÄcï߆9l-Í6Ml£$Ú€Cä'•wï*@MÇS|¹¦À}6—¶lHxâîæÃõ”g£P_[=JÑ7‰€LÍ/†þìa¦Nfƒ+Oùö ©ÒeY¹¥ãÃÅk¬„63å\±Ty‘©އ©–›%Ðþ/h8&uW¾ïÎ)¿§È+5Ro³ÜR±Loò: ¥B\ÍÀí¸žžj÷¨§áŸ(òöÃÜ„“§¬ê§ŸPh]ßôªÚÃÂHæ2±³ÁÙOøûH.ºÞ/ùÅ6Ô~d^¸£ßôщ"c£ :ó˜ô(< ¸H\“{ˆk@hœ¹å'F)ôîϱÇûÙ]©lú}S9mNPËÓÑÓ"$eÀŸ QÃJ mï'›fË‹Èé9MØÉt–£è }Â’re –Dµ˜/'½Šͱ"„ÜN:]=ÁxÇ–²'·l߯0_Ù«° l¡¬I3Ü&þ––%Òb1*¹Ô³djiZÓU‰xËn&L•QŒõ.¼0¹sb²P¼*íDLwÀ»à!ÄK玢jÁ¢Ü÷s]Nîå'º£¿d›'¸ÚHR2ƒçZ¦Z°÷‡Ðs2&„虡¬&öî%(Ò~û9d+æWêÅÍA{wS;VR¸ù„ì•ë.Žo-.(}û4_®Ünãrn´KÁ4óD ÔœµÈIKEh|—ø¨'K9W»šÉm¿3Ë!ò$€y@Ç(’ͽ‘x,šo¡'߬±yS‰ŒV/r„ˆ}] /fKÝ/þ’Ú¶›}§r í캗œZËõB8æFS!‘Y,¦ q9)J¤Øá݆¹’`P£½‚q@ÿW$ATÃ.JB¤dáu/PI=ƒš¦ÁêËÈN˜´üá¯û2ܺ6ä¼y4ž‹Fd@?Ùö0rÞ:°³¢Õ®îþ<´á=ÓÚ›Š‰ÙÌÛLå>t4ô×AùíªÉmšΡ†¯%[hË8aZФ9/ÏáÄla,Úšb麖bPFÛ(QgÎ|›çÒÅ›”ªî ’jÖ""Ì^]G)É~Ã&aˆ±÷…æ4Š))taëÆõ~E°gæä檅ZC[Û›GÆç½wðä×3{åâOx€ƒlcÛõ]õ¶29$XÉt[†Þ;Ùr/¨ 2Ó0ñÆôé#5|ä@ŽIyÚÒVùC/Å´L(Hs`6b]w¡¯[›CòÒU×ú'ór3 G°Ú£­§ Ñè&6·kýû~@qiB(ï“IÚþZñèÜþ†ŽSÖŸ6ï,M\ãl0Zë 7.FoÕhÔnÐÉ’ÏOcØÃç²?6ÊäS 6$;R×`% ƒ§íý¡ÐÂø6  ’‚ÑìŠê,bß/‰dØtFSk™[9àyqÂv›´.Î 0°]t­à€×cSr«övïÜÆ$3I ;÷P¤2™žlð9 €‹¦ºd¶†tž4Y÷éëŸM”õk‘¨˜ð92®–i†ÕNŒƒÊ&y/ [W¾ÐÑA½9·"1iF¯Âz½5Îo^jêÛiÁàã€_f‚¸­ÆµcYp$´³…•Ñ×Óñ¯ŸÚ OTä÷‰ü¦’Éã¯0ícЊ×3ì_N°¿ø»S °G¨ß#ûHFÌ.IÇ„‰”¹©ì\Ë©¡8rT=ìDzþžL-x§¹âè4]¦¿8«ä…úü],±ã|2UåÁQ­åÆu«] ½BÃ{Î,˜×ˆð½|#[ÈõMÛiÍPݱª©¥(`ŒøG\¨v”˜P®Ù,Š£–[7[Cö·FÿßÞ{z5Þ»ì*g©CºtIW n?V`ßÛx´h@Žõôí}!9­_Ù¹š -hÆK¡1»ÿ8 h#´G-ïûjWÎM%¿ 碽ùÊ'L‚f ü&/ÂM©.ÚD %kd ¥PÜ[I‹ß鸋Ä2\AoGíx K´Â5ÂæþxeÕè3•v°½%Þm™pø wó½ÜiþÚð†§ºö+ë#åU†çmÔ8E=?•K” \}„ÃuôÝYÓ»š&'[c£üàvw|JíyúåÌ×_¹×GQêÕ>ÄI›éóY$$$°å«³tI`  žõáFc Âß\ÅÖÉ3FÙÛ°ØßæÎmÌ,'sx7—ž^¦«; KµW„fÛ¡Iè3•ÚŠê÷%A+ DÖá×çYã éo|aDŸ;[Ep…¡UÉzSîÆíé]aÕç½C 6¹_ŒÆ])^6j %ÙîþΠȈƒ+t4•ùÌ÷·Ç_¿û*Œ­2ä›aÕêË·àÔ•Ž’“A3éǾ;› Wu¬•ë¼\²;ÜÅÃO•ºÐ—Ÿ` ‰­“ ê5È Ú„—¾R>ZÜy›q}ÜÜP7 nÌþ0øX?áÆ"=ᢓôIý³þ•CרӣéÕ½[˜ªdF°êà¦j VV…kÊVÓPLOb+¦?ùGô×§èqñ®~ÙZŒëŒ"èÜH‚:gUt²®]( kóZž<¬–?¿Þ,{RëÎ=§ñt#ÓÕ5Ü—éqà]ty©Õœ¬ða¯a·ô¤qÎë*yÑÿÔÁÑËýbö |#-±Ò†~YÂqõL´U[:2›¡|¾Œ‚×-gï‚’t7E];•Õ‹ hÀ^×OÓí7—#,h©uÂf#„qmEWÔœç"] —Á,Á£1Ûöëйm!BíFZ[CÊ.ÆØ|0`©«¼j.æq!`nVq#pøpY«)pèЩ2í«ç÷ŽGõÙèëK ÕûOÙïÞü4ÓºÞŠO¡Öðå r¹¦#\LÖYÛëi›³™ŠÕüG¸´ãåÛ—¤w¢–#Vlµò'0rcS!(GëÞà“` Í-MºWÊ1mA<ãi#„ òJ¹Gu¶}}õ-Ðî‘Ó[á …xýï¸%_ÔKÚI3ïg5àvO-÷ÇY¡„‘í"#£ðc g–k+4cöº{¿ƒ.ô$Ðè+Øì‘Äc€CÓ*…gQ$è0‰Ã ­÷ÖPçDfçN¤«‰Qý™-˜ÉVý(ÕãÎ$e¸Z\U —Áô2ŒØÍaͪ$ dÄ Ĭ;‰ä;òüµZß‹‘ÈPͦ›wZºI_‡未RwÄ.çKë2á$[žðØðLn« 2Ê]oíg^bâäÏ’†9»ÑÚˆb¥Ø%·Hª­Iå`D Þ¾\zE™c pÆ_³w–p4My»ttÔ^™æpêçJÚݰP÷µ¨B*ÁFå¶þ&*RL8,•f»J×€)øÉ®ràÔF}Çaìh c|CS·í›où’1 šˆ ]/¯§Á25.‘ëqç²E™9bž—G\8¶ÀÓëŒkäÏðíýVŸ=5ÉÈI1ÓLû®õÚò T̳‚5˜J[7P‡Î¿jSIG†£ÿS) DÝ)vep,£§ãÎå¡-Æ2x»í‡ùñ^üùùxÐßD~¯“{\žÇÄ*²vC±Ç‡ëKx$‡žû³°JhfÈ\òe¾`È„(e„ùKŽø{ zób4;cˆíéº>øã7eWÕçÊ`´m"Ë”¨‡ÔÆ óÞ<1|ÜL ’#ziC¢œ-sbœðšŒ‹‹s3ÉöŸÃòÌÉ…‰â¼zûˆW\­yö®öÓI¯æ–6÷FeÖ7gmé¡Û‚¹‘ýß­àäÑÙÌN®6J+Ñ©%“ ûÑï8»ªe2û¾¡ …½8˜Ûª"APýö șȯ†]Õ zœ"ÿiÿÈ²Š«|¬ãòœÅÒJR5Þ:æmmsÖ ³™5ùSô¸bü»Í|¿ÂnæaRlÝ òkøî=å\èÓ =ž*ÿmSkŸOð_ð ­B?#BÏm2ò%(Yí“ç듞žÂåJJA³M[ŽãjoI…åÔ >±I ú‰ïcG¸€HÔÁ[Y­×퀦v–Ò&Ú̱7Êœ}]ºA™Ö—çAË$6¨”¾æ4Ä žç˜ñ}ý˜z톉Ü7š&tx®åŽ]•Šj³¤8õåÇìyiT·%bÐ]ùB–'CêæÈ/¤ ’ßw½5üÔ‰ZZh¹t®ÛØ•œW|RŒ˜DØÂePÍÈT”~Ì%+µŠ¨qƒº-X‰å;žHŒoÉ(Ǥr·YÌZØ›öø»•´º¼ä—ð ²X EZÎçÁ \aÛª¹çf#Å\ÈŒÅ5;³ãœÈ3Wm á3ÂŽÉÚæOOóê­]¯™‰¾Ò³¬¥Ú[{‘‹Ám®UwmǤÂR Mß¹Ðèã3k|É÷àúÔ‹ó¢ïŒ‹Lü©ü.ïSÚ°Üÿ˜ÇtŽr.0b3öyi&MZª”Ì…LÎ+0bªÄDÖ^R%´Löê‚9•,À8ËA±—BÇéÛÍϘÕr{^þxjphжü˜æ‰Øã—hñ»Wpð6Œ~ϘØíÑSDü†&±£§1æEñ†úÐN*Òs V‡¹ÎÌbKryT,=œ‡8ñÊ=1sô8k7˜TÔIcÿ¸µ•áˆÉlTžÁYþü"æÿÕâÿÕèÏÁÿÿ þ?QCK ¾½ãç¿?°·@üqêM endstream endobj 62 0 obj 15683 endobj 58 0 obj 1711 endobj 59 0 obj 14642 endobj 60 0 obj 532 endobj 63 0 obj << /Type /FontDescriptor /Ascent 924 /CapHeight 821 /Descent -281 /Flags 32 /FontBBox [-199 -312 1031 955] /FontName /PEGSAL+NimbusRomNo9L-Regu /ItalicAngle 0 /StemV 85 /MaxWidth 1230 /StemH 30 /XHeight 616 /FontFile 61 0 R >> endobj 64 0 obj [ 333 0 0 0 0 0 0 333 333 0 0 250 333 250 278 0 500 500 0 500 0 0 500 0 500 278 278 0 0 0 0 0 722 0 0 0 611 556 722 0 333 0 0 611 889 722 722 556 0 0 556 611 0 0 944 722 0 0 333 0 333 0 0 0 444 500 444 500 444 333 500 500 278 0 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 444 333 333 0 0 0 0 0 0 0 0 556 ] endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PEGSAL+NimbusRomNo9L-Regu /FontDescriptor 63 0 R /Widths 64 0 R /FirstChar 33 /LastChar 222 /Encoding /MacRomanEncoding >> endobj 1 0 obj << /Producer (Mac OS X 10.5.8 Quartz PDFContext) /CreationDate (D:20090920233545Z00'00') /ModDate (D:20090920233545Z00'00') >> endobj xref 0 65 0000000000 65535 f 0000162193 00000 n 0000113571 00000 n 0000116235 00000 n 0000000022 00000 n 0000113549 00000 n 0000113833 00000 n 0000116199 00000 n 0000115248 00000 n 0000162013 00000 n 0000129880 00000 n 0000137445 00000 n 0000145189 00000 n 0000114070 00000 n 0000117595 00000 n 0000117492 00000 n 0000117388 00000 n 0000117284 00000 n 0000114118 00000 n 0000114169 00000 n 0000114219 00000 n 0000114270 00000 n 0000114316 00000 n 0000114370 00000 n 0000117054 00000 n 0000116826 00000 n 0000116596 00000 n 0000116368 00000 n 0000114420 00000 n 0000115228 00000 n 0000115284 00000 n 0000116179 00000 n 0000116318 00000 n 0000116577 00000 n 0000116807 00000 n 0000117035 00000 n 0000117265 00000 n 0000129329 00000 n 0000129350 00000 n 0000129372 00000 n 0000117700 00000 n 0000129307 00000 n 0000129392 00000 n 0000129636 00000 n 0000137116 00000 n 0000137136 00000 n 0000137157 00000 n 0000130061 00000 n 0000137095 00000 n 0000137177 00000 n 0000137415 00000 n 0000144720 00000 n 0000144740 00000 n 0000144761 00000 n 0000137613 00000 n 0000144699 00000 n 0000144781 00000 n 0000145019 00000 n 0000161187 00000 n 0000161208 00000 n 0000161230 00000 n 0000145358 00000 n 0000161165 00000 n 0000161250 00000 n 0000161493 00000 n trailer << /Size 65 /Root 32 0 R /Info 1 0 R /ID [ <0b177faf389b3ed854b859409e9c6d24> <0b177faf389b3ed854b859409e9c6d24> ] >> startxref 162335 %%EOF danieljprice-splash-4d1f09c/docs/figs/colourschemes.pdf000066400000000000000000001014571477365367100233300ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 5 0 obj <> stream xœ•½K®åʲeW?­8ÐÿŸºªeª ¨ A%² îkÑéf6æäŽÈ¸¸xxg5ÃÍhæ$ýG÷_ÿŸñßáþ_ÿÿÿûõÏÿø_÷ÿÿöÏüÙþýÿþÿý_¾ÿ÷ýÓ4ÿþ×ÿùŸežþ¦å³-ã¿WûkßÎûÏÿïþWùûúg:·¦£ÂY©¢TªÔ’(Öý3Ìç¿ó±Ÿu»ËY×Ï6L7™?K·fìVµ¿¾ÿ8õ÷÷×}ÿŒç©ŠmhVçc¿còmãg^oÑ>}Ž£‹”ݪï ùÏ‘ )i-sÊ.w ‰îßÚÕGI_°o“údŒ—‡’II哱Ë8ãþùFõÏ¥tò¥ì«:¦Ï¹µ·}†îº±[µ|æó¸IÕ%c·jýË ¦ÏE ‚f82RŠhmØ>{÷|[>Ó2ÑóH}2v1.å”1ªà–1Z¤_Ê®ÇÓ¹y?ß×¥Þ?ìVíý¢çÏE º38¨ß¿ÎÏÝE;ÆP¡è³1TM^¿1ªKc´ˆ¼£÷¨ñis‹‘0¥(>ŸÕŒÉ›‡ªÊXæù3û­õ0Qmß;EÝZÆÏt0Ã÷SÐ\Ðãús§Q¤ ³s]Êœ2^à÷i»zí|]_Ç÷>Œªeÿ&ÎT£Åey=Š;cz–Iîf°ËÃ÷sD[ý‡?5j=ÍNÖ²´s×ÄõPŸ³v¦ÏYïpýƨB,Ñ"ò’3/é)kBDü›ìQ-nç;{ûÖßÅ?©Œ=Oþ'ß8OùàS ñIüMXÜZ_¶4O†gúã¦<ÓÓóÃû‘nõ÷Û6Y7«McÍ<‡º”Quìï8=Œ¹j¹2Ößotfwýa·jë‘bY[T•Õ«ô7§=õtkŽÏú\ó÷‰Ú5_ÔªKCq' Nøûþµ½ÅõùµþfMËŸøüfùÊXÇcT!Æh±3F¿ßyX†ï[„)ý‚5›¡Æªz|ÉTUMUßà骇Ñâ÷ez˜Á†ª }š*áúM•V¾`þHÝèäI;®?+g HŸ3Á¸~c¢Úß53cYÏ÷'ó’žVMøõóðÊü\ÿtî-ÒoR#ÿç?ÿÛ¿ÿÏ?¿þþÝ—í¾Æï°Ïã¿ÿÃ÷õ< Ÿi\šúœög¬çø÷úÿù/ßÿm«¹áð³ëŸuºoHU9+‡pœ]/ÚÒý®EWü•cèÝ“êP:ûªö£wO†=²àìVíÑyÎn§³[µEw}Œ§ˆ3Qå@†3ZxN:£÷ãõÑ#ñ åè‘xØ­š{w"A·fS[øûþõì›ê*ߌÝçoއ±¬qs‚fcÄ`9ÖV ¾]Ùñ¹±ãÕIæß÷¯wîJÿ(”eÙ…æß×ËfSœíj«ˆõ{¿<5¯\q†+ª’ IIé³ËÐØD/&Ë®žÎr¶qÒ,Ç·¢ì­§ƒs†">Û­]þÍølû¾ìã {>ZÓ™è &¨Vº¡ u "cLü]=ñ‹ »/×Õþ¤ÃÕûq&ª|2;K;Cf3ûa ØFå Óo"·H·ú)»UG´žá~HÝ+_oÖ»…ƒU«ºdCÔ¬¯š±ƒµÈŒõ,¤ƒÈvNV»½ÍÆ}İDwп Ÿ%sÐÿ¬4¶äϚ`¢ªY caçëî–ø›É¾ï`KwC¼ Ž×}û &œ"eLxY«ˆ>Ö" ô9òP~gˆëÒ Q“A4Dk™‰2Ùè.2Ÿ¿þÜèèœušì¯¿kî|•Ÿý8µ¹sFsçøÖüM§+ 2ήöå®é:ëå¬TlÈ8»^>4Õð4ŠæýèS-EÎÃ$ç};ícUÚ¿·SW(ÍÒ3dèÖLŸáûÈø‚lÜ:»Um¸°œÁß÷¯ßÆðÔ Í¦¯³[uÆ@¥ì«úæ¯ÝBiŠàþ½OAíçm g·jk7Ù~NQ Asd?­9-æìVµÉ/ˆ¯’[1>/¬ýÈø>œ}n84]7,§õ„Sü³ÌW!–ôýÉ2ßÙåÐï,(®•.«H²–‡Œ]f]*ýñí¢ÌZ¿%ùvÜW=ìVµIà¥Rß¿ÎOÊnr„;ÊnÕú´‘﬿Bݪãqš"AÌìÃíJ¿ÕíÊË”1úƒö!h±Ö‡ a­Í¨ã‚žGÄÝd`á&¡È* ¬)buƒßÆP•E¿©nqÛì½Eœ¢=›ÍÊÔd*÷l};ã-YúΨÚr\Ê-n{ô¡l9ÅgÏ÷cË™$gx¾‹Jžï4hŒ „ïÆw„AsSUDkÈ1zŽ4çCåûÆØµ?D+q©¢ôsxWÐs° zNu?¢fýLV¾ï§'NIιê^Ïß9 –åó{óήz ¢Ê5©êo$ÌÅ;C =ǘZ0ßÏï/³]agTÕà3Úr†ÉYÝç0}ô¹øë»ßų×}Q)C­‚9E¨-ôÛXÕ†@4¦"Z«¬(¢×¨ïe޶\/z™_ÍÂEp¼=1qKŽç;c%XN¿DÍ:eë)\Z÷xíÙ«ùhŒwUq'”*jý>xsíA¼¼/ð†_gt=çÍ ‰&›¢Šhm+-Ê–µž­Š®Wä~ͨóT)c‚Ac¬›ðÝê]AJ!´„œ£×¨ñN8ÏYH,S“8ÇŽuÆüÖ`˜3Q­õ¦RF‹ßNÊë¦zêÁ1¼nÏc¨Æ]¿7Þý¿ÎXöwÿ¯TQ4ÆìÀwcˆ; ˆš ¨"ZCnŒÑs¦¹µƒÛdyzßnù[†y’§t›—<]´hãGDоš¹Ð¶)Ïxï+º5óãQM¨º5kKf¸øˆ”‰j¬gÆÞÙOŸ›+ž(Ž1e˜¿ÇŒõÆîï÷Ï­ÞáʪnÉêmß`‚ºMù†6FÕzú».-®ûÇ ®ý™òÜ8ß¿—ê º<`¿‰áÙG*¡TµQŒ«šM¯¡¢áòAƒ@*¢-äÄýÞt`Ú`1=@E‡¸sXºÆaø,’­óð’`È׉¦® æ #ƒÆ˜1ª”ñÚaÐãßUž+fB2ù·ÿÎ6ç÷Ï­žÃÊàñ8TÿØ®~sJÍ")*e•T„ìÒwc+ÅâµdÑß3„‰îõBƒ8Ùszœvy ýbž²¥‘¢Ù÷ýúç8|.=H ï‹­ù»õýûÂYGP‡Qÿ&æîx–p¤ÜÐõÏÝ~òA÷ƶ—jÓátg—;ÐDÓ3æ^ýž{îÓK^¢j* ™ÿPÐ:F7/{Y÷T®L«ŸsLÖÔº³[õ-a<ÿå ½3–UsçÎ.wá¹¾ÃVÜ} 6Ó ¯ñúP’1”Ÿ]/ûÏX¤\e×RæsŽY´Tå×BtgºW<ASË ÑZö ]ð±(;ãÕAµŒ}éÞ_ŒEj±ª3Z„Ê+Uµyñ 52„HÕܰ!höãÍýðhÖ|¶³[3ú{LUº^‘û]4ç^ǨRv«ö§Sæ„ ŽÃmEÌ/`Œ*„ÒìUJ„ÀgV€9'eOzÄ5´H¨æœêŽÕ¸†.]hEÔä)CÌMo;cþÍé¾8¼å¹}ÌP‹ÃõÜ®R†8fí¨¿‘¸«H¢\nLTBci©’þJJûƒt¾îýq{k“@Až‚¶Þ/*U/ú^„§Æ¡Óßjoh8U.ûÍÌ[ät¶•Å¿ž·õùzŸœì¿×i&ÈßµXÚXÌj –1,óÔævàA'Òd1vûy¾Û5§¶k:`[ÄÐõ²ÿˆžÏYkº¨È–Ÿå8»U[{Cr2ÅY+«XYšêðÙgTÕ|Š3ZÜ·hK9kÞ·¶ì—dÏÒYSõ¹Ä#âœ5ÕñÄFTÂnUÿ"E,*kª>ŸHï•5U›ÒH(£ŠQUF‹Ì²¦ºšlAMÓZ1œ„«üÄÄRå¢&©œ±vÕ$•3–u„YQ ]/Äõ*(.˜N)c@¥(a, N ºÜ‰Ô9=}ä,ùR÷JÓ«,ZÃΦsZ4Hç´0D÷ç¥ow¶ v|Êësåt΃”?© ë5£âŒæjrÆ™¨†xë:£Åùø¸Áù°PÎùZq†'Â9NjŞ¢!ÂÓ@¬)CU¢ß‚$∀2Q-¯'¢…33Êè;rÜ_9§ò%m –s*Îðªùv€¬ /¸ÿš'+EÙõ²®• Tq¹ëû%snG¼FCµõ®Ýú¬C©¢öÔÜ‹3VÎlé ‡Âh¯f&œ]ð³ûÎx…TEcF¡T5ïP·C©Â‡šwpÆk<·÷5ž[^ãñŒœüV¿dò×{°º™ÙüuV7skíÚë=XÝΦV7…ZTV7˜z¯¬b¯‘P&BT•ñ–f†”ñ–f¶#öÑ‚¯8›×Â`Œý¸”_Êû{Zßcÿ0Æ^TÂ{ZTÆØÓ{eŒýˆ·œ2ª¦9a´X3nÎèý´£&Œ‘˜ÎarƨŠJ3D‹Ê˜mz¯Œw-#¡ìzÕ%UÍ›ÖèeXÆwYßåòŸ‹ÖÁŸ8_¶zKõí&Îs{²Ûôê¶ž•tƒü]7ñ«Þî9gí'NÙO\×60 :‘. ±¯jß½Ic¥’^ ±ëåÃÓ3½?»›­ÏÒÚïßkolç°³®šd˜!j²Í,„¶âÞ%h¿ŸÏÒÁ#§øœÝª£uÊò}Œ¿ï_ÏñiÌC ¨i¶šÔ4m¸¾ÜhÓ:¼Z!TÔ;Z­œ9Þê þž±°YISÌO¤s‚!FFDÂZt§? c‚2tùPåé9ãÒ‰ª*Œ Êõ!™>ÄO&QÙojÃ1?mÏá ÑûËÍÑé,znƨBÏ­¿jνr”¯vÊŒ]øg¹¦ÌPÓÌOƒ\Jv¹êyŠ"œ,é‰:–óÀ"ŒA8×·Ás($©N1Z<ò3gLó±!9šê~’XQD¼éÎá}ÓCÞPã«sd ·&ƒ%¨iÚâéŒËÂDD¼©Äœ0¤©QDM%F­1˜Êp#KZZŠkÊ®—ÍI x[BÔsÎÏ-](]5c¢:ðFF‹Óà…`Pûª†ü³ô÷Ç6zíŠhi«¦1Q¯6CuÈ£ðüFQIz\s¨yM1‡š…Bu#>È*rîïtîYƒÚ+XEDx+³oi µý8E¼ÎÏmaTÕwbÎ`ï`³ŠˆwÙ±Ô³OÙõŠÝoã›øR%Œ5—•¡ÐwAL2£ Œ*FTì17‚è¹Õ—iá´otöznÐõê,Ã’ã{)Z‡ß)Ýšyx¦èê³;gM5=Íh½(kª×§wÎL5nR0–dÞª=–E=·‘‰ˆêÎâ>–β¦çWZüûB`·Õï©úÔ dô{ªöèÌ’W¶…ˆêžÂgl†®WÌ~ÇØ”*aU/Åž ¬ßê· Ö8F@™¨V¿ŸÍ^øv¨±í‘úþöú²ã£·ÈžSG©9bæ"EGÍoDÖÆaΧjKQ};¥„9«ÏØœ1kçö9,içö9$gÔñúiMYÅ^“àêû•J.põIÐsVFkh& ‚ßã8zM{®ÑoV†HªJ²B{‚˜[ø-èb@”]¯z£ªÑÚyË8-ﲦ|æþgª¹f‚R5Ÿž¿Rýz†¨t~¾ŒËm‹ Ý=à/Çén±j·Ä0ÝtE¾sQD9jÉØ×Ë{±æ+• À»^><ªiéÛ¦Åóñ˜Ú\ v;3Ô4m4êKªlìVÍm6AUÊšêÞ)Eí jš¹V{ÙXSµ¶Ç—ÔcÛXSm÷cn- ýÞf¸I³[µŒÏ`&F*5UË©„5U›Cƒ‚šæ™+®í 5Íó­Km+hˆš£Þ‘ÆhIQ¿™^AŒÀ1Øå?#¾³ú½³!uHXæ4·ðãßR/ò¯ˆ5¬vt†ºŠ$°ÎKíÆû‡*e¸aäÂÝ‹Œ ¢†¼®ç¸TŒ`+B9ðlLJª1lc—;Àªƒ’z…£O‚Pµ aR|Rv¹Ì1ÏÂ1®~Ì2¨žW[ûÎ9C–š0SDMM—)¢µeÇMXÜ Ø,O@ûýüØ8²¢véý«kŠ”õ(‡SÆŒÐke 6 LT¥2ZdV”Ñ{¦7*ÁzfY½ôõ|%/¿ Š¿2F·öZhiŒ1|kLT52kL,â-©ŒÞch6.1Gf³p=Õ&‘õ¿ÏA¿ÿn¿îÏ Aý\Ïìžæ ÷νsVw¶t3„;ë1ñŽ;ßÏÊ3Ÿ•-µà²(ý·Üã $‚X[iH~¾Ÿ£§?GyáÊ ’*ƒ=Ɇ2øŽÌ?oõÜb°¾ñ‰Œå`tÚǺ®åÇ4?Š”ÝªuyÖÓ`õ—±¦Ú¯¾ p]PÓý›ŸG7&ªIïmÖ{+–ñ‘0ÞGX!eŒ÷ÑÎÆ‹0ÜG;›ÐDÔ hÑÚ¶û};¹=· GÉ .‹ØÏ1Œ­A ĺHCÊX¯á¯ V4^¸2Q!„ÊhÙPFß™ÿþƪÁß,ýx7njÈ=U˜Ò¶ ã˜QÙ·€yÃj¦c¶/~2qòµ¢JŠ”UÔ˜² ¦z­¬WËÄ0I¼³…Ñ">—1Fïña‡1F+µŒ!¦ ʼгK¯•]¨Ë»žäõKÅÍd <îM—¢jÿÏD5þšØuïgM{Å`x8ÉîM€e8v}é‘P—¨E#­ õ9z?!ÂxλösþH kµ»2£4ï—qä‹”¨^$&V/’/Y>úévë+·1X)Šaÿh"BKÊ<‹Dp˜’àòpý&‚ýn‘2ÜÍbLž âµ2Ô1^¾ jDA´Æl(£çÌþó‚h™êÓ¼#T›H"üóŠæ0¤vž­gšÉ;YÎ’§ýuå&mÝEŒ- L³ßͱP¤Œa¤1eL ½VÆ`3Ê$%³÷‘Ë(YQFï+½¿îac[ï#åw‡VÓ;ùËÁó»«;øèùš£çS;h<@ÆÎÝ^ž? °Ÿ6À„ƒâÎ.wà­û3P¹QÔö¬aØ·<“RQÓôÓW¶:ÝÒXS=k•ö-+›3QM.Q[kžÜ©ˆ>¯9Äâìµ®y’¨¢¦ÙžsS¨!jšö WkÊnÕÒWÃoA]3N¼vùTFK̆2z¼ º^µá·5¤‡Ÿ*eMu>ƒÓ¬GD·æõQÏ•5U?ˆQP&ªÜÃ-®u~½±¦~ÈpCŒ×OCß¼ Fý´ßŸ-0êïLJ©3Ä]/ëÝïgm ÊŠ+I#)E˜””]/ë£cìߟLÃ3¨DîL¨bwž1·'pv±ôÍÍmú{|‰hˆ–¦ÜzÁž'Ç„‡®2<¹Ž)ûlΚªµÜM% 5N,*CfÄ{eÈ2ã H4/…Ü'’eôšÙϽ•·}'ò(€*JŸWÔMaô»Öú;£ªÓÑâ²Tf”Ñûä¯kŒA~”þƒ*V‹—ªÖ”W)UÔ´õ¨,+cM®•çÎxOÔÒsg¢ÊK‹ÅÈ|ÝË5~_~•*÷b[ë•Ñbe㌪c|{Œé}/=¿Ð6Ę[½”ñŽ>üv>ô^>üF>ô.¦e¬wðWk ¯\UŒ¢2ÚcF”Ñwf··5ò»ü*½>ÝÏ åTF‘Z¥î¬©úFB¢†·(Î-v†:pŸwlõ¡6áH g¢ê £Œöê{g¨u1= àzEî·ÑÜû7ÿT CþÊjx¬ ù•«W&*¾­„Ñ"r"ˆ^Kè›UM{YXª)éÛ•ýÚØ«Â]ªÜê‹­a¬9ÜnH4ûÇ«IH¯’k ÝkI}ŒîŒu¥†Û±®ˆJ£N‹Ê˜?z¯ŒqG‰föIÅ3Jff”Ñsf9êBlnV…׿f•œ3[ýÍŽ¨Ñ¯ZKîŒk1¹3QõŒUV¹·¯³òžó q5¯¥«jë«Õcë¬"Óîu«Æ¹ãÙl*Û0*žÍmcÞ¼£•ÕÁ¨]¸žÚVÊU5!àŒkNÀYÝ‹œpv½"øÛ¨îý[uª„UV‹ÊX'è½2f›‘PF£ªŒ™!eô^êD?¢$¶ô*²¾Z{Ëp ÙëŽCSôÍ…µVhÿÖáêÙ¥¬©ú)C¹ÜPµgyŒ‹3QÍu7*{C½]£Þ”ïQßà• Öfz¥LTðJ™Ø¼•Rß[”ŸÖAï+÷«fo›·RêÀ£ªÙ¢Æú’¶Xëè±2Ö`^½2QmÞJa$³ôãã7Væ$œdÍŒhŸ£Û;ñÜŽ8•*‚{Žè cæ8쫌µàÜlD3¿;HPŸ¤S9MSd<«»¯ /U à `kàS.¯c#——GÛ”ë£Øæ4ÀhͰœ<ª’ë{gH >pv½b÷Ûx>_UÂP­Ä¢2TPñ^*ã H4OA´ÆÌ(£ç?Õ—˜û)²ŒïX-Ù¤‹$*a¬UËP¯IeÌôŒæ¡2Ö™ù5ÜQ缆NjN ¥¯µ3Ö­é5¤ìzEð·QíõHT˜!ZTÆlÓ{e¬7Œ„2Q!ªÊÄ"2¤ŒÞ/¯ÁååÞ¥XºA´æ”*²±ÎïgÍ:û³f]1-Œª/Ta´¸±û!Œõ~›ñ"Æk,Õ¯{&Ï?‹é¤æ.§á´ùÍ 7›ÙÔÇd³™[Îf.k{ÏÂ…NdªÒØW5¯IOE©‘‰JE×Ë~MûóõAžÕþ%Ûk,ÕXSÍ}ü3¿™wv«bWÍŸT1p7í}uáì‚£¸3v«b/ËZ í¬©ú–•¢ÖœŸûá°¨¬©ö¾U*¼WÆ@Ô¦"ÑTsÐíÕÎè{­vÆ8Ô³ÎSQ c~hQsMr1Ê.¯HÝ­±/JŽQ†)wÿœJD„ ÄÂegRR)»^ôÀÇ’ç,«'Œ^ BuÐ’„IIðJÙõò@cçLó0ö-?ë5i¬©bet¬ƒ6Ô4[?é —Ã8ëªgùôT’ü=Oq0DKµVü{e}sú<é–§š»ô§"ò Ñ$¿—?ŠhIüvÁÃÚßÄY¿=Ÿ‹Í¯µÜöÝ©RÖTë³[-*cm¢÷ÊX3AÔ,^u­·Ìˆ2z™!ßýáÊQ׌f©rKÓuUÄ ×‚pg¢ª¦–1Úø«1Ö„uûxõ]·¨S=çk.ârÆz@•2Fö17ô\£Î(("ªŒ‘Aô\²uát{µ¹ìWÕ÷K-Uä¡ö`qÆ<×¹ŒÎD•û«8£EŒœ»àéÉç´0^ãŸUYz.êwFï1¾n¬T<~ÃYY”‘scu\·ï¬®ÑTÝbœVWªq«æD”UªÜõDF¯±¶2u&ªÕ³1Þ,c¼Æ‰:t¯ñϪÜuòl×iïåé¼x¶k÷óã—8ŸµW§I8ãæÊ{C¼>jºµØ(¥DµJ<'© êHsg¼¼mx>‚u…`Ý-uZ»³ ^®ª¨°zÄóD gõˆW•²zPªEeõÈUï•1 ÉMÅS­13Êèyeù×ÓmÕU¹ Ÿ>Þ—ïä/{î·ºoÍ[=÷={îÛÞîY¸Ð‰tÊ}Uëòîß+•ôË]/ÕЗ£.1¨¹ÏQaûZO1cwÏV–¬Ö4v—õlíEQÜc + ß«ÙaŒ÷jRƒAˆÖ¡/%>£Û·öÜîýÆtKXSŸúg]D$%í°'ìzy𨦾ڵÊê»óŠWÊpR‘”¯”]/$V÷7 {/«²8×›ÏXS}çß.7v«æ¡m“0Çg)Jšb|†!°jј¨ÆŠ”2X›j‘Ë¿S//·?.Ÿ] œR&*8¥ŒöÄ+aüœrŠIÑ­Ÿõ9÷Æñú4ÖT[û]DDOEPSõ7*“x¬¬ª¥\¼ jFA´†|JY#ÌÛôáSàù[×’ܹá1©X;jLT¹WŸ3Z\í‘s¬“$½¶¿pÆ´/ÙsV„¤S’!¤!¦aµÑ!Ïu¹`AÔ t‚h‡YP–Þ2™=¶¹þ5 Æ2Ê5÷;NQî¥\c¶Æ˜Ìý@ÅFÕQ‹¹ŒÑb/*ºàçQs ÆpeÙÕs5F×s{C¢‰ ÑÚ™[ã8ãåÕéUÎpyu{÷2IIrRD±;ë8½’Ü®k)‰êx%¹VÁféÓøjMt†8à¸`g¸Ä?‹²ðõ•æÎèüT‹öQ5³±'Œçå•êÎx‰óúJug¸DŠÂàzd æ=@……+ÛÂx…ëüƒÁjƒv²œï8,§Çaáë@ä˜4†ùMF{wVrÅãQŒà!+^+CÈAL B)ˆÖ˜eé3ÓÛ·zÞbV,Àñz$´—÷KÖ8ŠbsÙiòW}° …O‹½g:M½YÑZ.ãì‚—ódnÏ/löKïÇlV‘Ë‚g“°ªŠmddЪ¬ªâ—à-¬,«¢‰ˆzZÕ@UõZ.~Éf!P¬ƒþÞvt®W4”¥¯ëŠK\ïŠÖ‚ FND˜SÆŒÒke¬‚yé—Wö’—áXäñ@ý)QØ>6t{„ÑÞ·²2ªN¾•…Ñâ‰ÞŠ2FóüQïÆÌœè¶(CŽED”õ„ÆXÛèµ2„œÄ´ ”‚hYQ–>#½Qj…Û{o¯¼å)šøVìë¿&{+¶uPöV v±ðÕš‰fr…ZOojC¹7¤°ž0TqdkEXUE°ÅR&^+c¨åÅšWUðHhez½å™…æÚOé\§|è]‡=†ÄD-¯NR0Qñ¹'Œö– ½gaLê2˜ãË éœÙ¦†tŠˆ(C”fâ/†˜ž*CªxÑ‚¨AøÑò (}]kD<ïó-zr½ØÍ;{˸Ï9¦ðfNQ„nÛÒ§ =¿µùu(Û±`ý…ÖöNþrX½©WV?rXý^ë2Ëš¼NdÀÜØWuotàƒïÆJ%æÆ®—jj{@Íû=­}z1Ý×ÜcËYSMÏPñZ=-c·*6TU; üÞæáì» [ÝíÆº[“n+¡¨ižSS÷}‚9at}¯¶1QÕ½1ZÄnÆàûQ &EŒÂQ“TÆšê9­\UÂnUm.žö5M+¸fטº­ÖF£ªv^þÔ¾ƒÀ\@¯É 5Í3_ÏYc,©¦]/ûÝógEJŠíÇá“ ^”$Œ%Á'A×˾ĩæÚí¥“Ššf‘QgüÝ~]ŸCÂæZ%`¬©¶>RV ÈïùUˆ"ZšªÁ¹Ï}©dyÛw–¥;‚.ÆañÀ,ú{y#vÄ¢ ÞaŽÁXSõE¡Ó\O#e-ŸÏî¢RÖT}‡aZTVõG|„šÈÍK±Ðs!ˆ³ F°cP>Ë­qûŒPj"°»7†´yÎ"aÝ0Fï‰j=‚Ž-çáó†‡þ¬’ØÞz‡ÇD4¶fiô÷ü–Yì`t_Q<ï•×|8?ób(Øûé€1mºç6ÓÞ/5(Eqè8’ UÏÜ9žx‚ « ã °"蜼y„‰ªÆ„Ó«\™daæ…E(Ub¿ÇâØ ¶„áÚ0z©ˆ^/Óûږɯm>_¯‚Î`¯Î4Ĭ`´ÛØõŠÛïbÙ^¢R†ÇƒXTVñ]룠Œ*FTì17‚è9+BoÎÛ™×›Ÿ¯WT=î>æxC3M™¨†w}Ù²!;}Þ䩆ôcÙÆXÖ•JkUÊOZT†ÌÐwAóáãÍ›£Qe°‡ÌÐoɰí%D6YèµeF}ßvÀ˜C;O–¼:ï>Rþ%5MfLT¯73¦¢ðiÔªÙɧ×C#XUN2(ªŠ"Anµ¦,Ó&^“H¬qõÊD…H*ƒ5æDýFn#ÿóœõ¢çù¸Xó¹/óG—… ?˜jPDS5Z®ˆšq'€ Û+‚·+Û&ýŠrš Ê¥ª×Ž­ºjì'ÚäÂúÛÙ$ö{_eº¨®ÂPíñ-¿"Þ@ûò¾¶}ɆWÁ[MÁ`o;ðà&â¶­Þv½âö»XÆ}E•2VZZT†j@ß1ÃŒ‚2Q->DÀˆö™Aô\*BÇnâIîïÚ­¥_›„ãôj„axù?TÍuó†(¿YþIÔ÷8ª•´¬Ò¥¤oü¼ðÅD„Úy¤NöÄéLT¬yÂ`o=ÔØšïŸx°àQ—½ùØj“øô£¦U†hk1­í3j¶0QyåØü! £Ã÷·‚º¹Œ·1¯7øËÑá>b¦£ÃgŒÏã³õQ9„ã¾În7ÏÆOCîDÆ}]/Õ³‘r,¯¹Ï‘¹›”Î5v«–í[ë‹c·*÷ÕýA•£°IŽú0ÙXó+ö¿­&¤1QUÒXW=£·õr3ÖTÏkº%èÖ´…€<ªÑPÓ¬ÏÂp kª3òKsÊZDcÏÝzÆcÜ1bmŒª½ZîÆh#éÆšjÈUô]R ]Ýs"8Gí[â.=)»Ô¹jsÍeнjB”ÛðÖR@cOÄßü5‡¢…ˆ•z_«[é>h a‚êV:–Ùo¥Žp+©Hn%1§ŒÙ çÊj„@hW˜%dB½fR#õý.ŠrW¯¹ÝoJ°)pä,'ãfMõÖ;YÎ^3Çç‹|£ä~•Æ;;|:Ç9Z±ççìORˆr‡Õ OaU!9’© Q*¢5 Q«j{Nµ,EQU[Žb*BµU‘0T1§ •I‡¶‚ph«»Uë3£¨û”­ÑD³5òT¤¬îÿ\ĉ¿qïs!¨±º¯¹ T5µ,µß5€cZŠk «îW"*Bn9Îf¬jɸìõV¡"'ú…ˆ¥×¨6¥ìO ®ôTtyÈ~Å5Ï­µ)ªç–sÊp{‹çÊXÓA¢©@ kȈ2zÎð´!±¹bŽ-S•CŽ©ªqÉ_÷˜-˜ ‚A¿{Ïìä/Çoõ4ê8à4ä8à¼Þ [áÁdPÑW3ï¡Bc¥âðž³Ëh¢16DŒcvæ6xú/OÙ1Ô4cëWÖ;†nMìå÷ƒhëuqûîO}ׯG¤Œª}O^TØÛ²òÿáÐÏpéËÊ¿äÙ‡«8k*ßEzv<þU|UkèzÙD§Lß<ï'žÓ'e¼>)K˜”U^ º^H¤îNœ˜{@×ô™ôÔý´ëÃØÊ¨: ÄÐEóÇ.òN¦é•âg;¶r{™ÌŸþ{îs—+לÑPuV‰*Ǥœ‰Åñ3¹ÁÑ9e+ÚÙ…øO1"e¨ižÓÃ)izvÏ[ÊPèµ Æš×¯LTÛ«Þ"–Y8ò¢Œ¾/ú¸§)zeë{ižk¶¥]øgSÖH’¦úËv¹y­%ÊçPT¨b¹RÕ.t_Uß@¯Tï}ýœ±bæJCÔìÃÇÚ‡¸+cWº\Fíì‚—;„D¼:hzìŽÞ./Í‘÷º J•;Òmˆ¹0^]}·ëŒªÚÎ-Öù.Îx Ÿ;ò'Œ·píRç 7±ˆˆx+О2ÞVô]#Ï8(“ü ¦Êh‘ùQFï%×C_Ë3eë væ;½þ«ÈÉŽ\ «Ès>gy•ïjOYÅA}WV1år%g¢ÊÅÝÎhqDËM½Ÿ†Š¼2ÄaBÛM#*"aÌí)c¦é»²‹5qPv½ê‘ªbŸÁŠß¼¼Ëê›þ‡¢eögÍ—žCªÚ#°J´ãæé¢C‹9¶èÙÌ«OöwRý˜o_Àú:Aþ®gÓÔ‹ulÆìج{ÛQt"½c_Õ²¼ú?ŠR#}E×Ëþ#ê[·å4Ûü}”=“_sžÉ䬩¶þYEÎÅ8»½ÊÝ ~Pm}B H}âàì.kˆ³Bsµ’³¦zíî䬩–ÞwÊ©gTÕ4 3ZÜr©°³¦ŠsGsdÂÙ­Ÿ³Ù93ÖTýÈMQ kª˜Ä„Ee-CýLKz¯Œyd$”QŨ*£EfHYó¾Oö2ÛÊú5Žíßåö•¡Ø²¿²Q›8cýªíÿIY'ê„°ëåƒz_eÅUÓ/eŒ*ËR&eÁ/e×ˉWžp™¥ã̬…P q–gLEB´ÎqÄ}& Ñbÿؘ¨r.¶XvÒwt£Ò­Rå¦I1õcˆöjŸugT¡›hŒö¦íõTꌭË+€§ûõÆðtP•0<Êê“x¬ŒÑæÕ+“œ ’Êh9D¯‘ÝxSÄa_°ó ƒ.vñŸå§½Îšjíã$,KØå.hHQ^1ŠJUߊ½D¹]ûW[i…&*NŸ À*¹å¼”3Qñ¡(Ll¸ „]p±¶jwÆkƒ*#[µC•kjë>(UøPÇ—:ã5¢ûdLT¼F‹ç€Ç0ÞÂè"ã|æª g¼‘E%Œ·-*ãÍEï•1öŒ„2Q!ªÊh‘RFï%ÛK_;Ä%6¯…µÑ|Ä™›Ö;«Øsu„³Š½©„•÷jQYEB½WVQ•î²1ªÆ±²­ŒëXUgôÝDcŒD«êŒQ•0fˆ•1Ûô^Ù…ZÂH(»^uIUñéUE°¶Ü/Õ¼èËîoU¹™~‰–ÙÓX¢þ$ü¶8Ç´Ç>/¥‰ãRKTÇn–êõÕÃc7=ÝÁóÕA<¹ýË·é]äNþ²C|«ÇÙzÄSöˆïE½‡Ì6v"]c_Õ¶½ûÍÆJ%ý]cסGÕ·z© £mŠÊr…†³¦z†¾#Wh8»UKÌ4Qõ”U³8[|˜‹ö®1XdÛÙ˜¨ªnŒÑî7vUlÎaÓ`Ýàþ}ޱrC3gMÕ?¹•°©©w(BÐ~_sGÙôXâ-W¯LT9“§ˆöjŽN}Ʊ~ýO!¾­4Ä©¦PÓݦŒ9ß‚š&¶E¨ë$DR™ÔdE=Üíá÷5¤ïòs÷-ÂVl’P=côh:á·0–U“yŠ®—=»5-¸k½¤WÊXã¤,a, ^ º^èýýô ²àè5d¸ûïùÍ},d1Ä‹GŸÁUh磽}ªÇ›2VL­ãµQãè£RÕI߲쀤ò­nc¼Æ:ÞÉUhO£Å:vÊÙOë+gMµ½ZÝÆøð•0>ÈhQ«'½WÆØ3Ê$Cˆª2Zd†”Ñ{fû‰=¦JzéÒ6OÕP¯Oùwô‹ªå=±Ôc_GE™Od[XÕ{S «Ç›‘Šªv}Áîì`¼Â:(Ê™¨j¸Õ-¢l¬êó—lxq »^ñûmLûÉI¢V5B-*«Ú¥Þ+c® e¢BT•Ñ"3¤ŒÞWøõçt´Ø«alä/Ûð·ú°³’¦9Úðàr![çÎnGÏZú§·ô;‘Ö¹±ëåãêßäÞg£<—{Ë­±¯cMõ ïÝ3bGª„ݪ½­ÿ¤Ú¢Ÿ—*ÌO¤jÙÜâVsž}&¤Äø’þ‘Z~²j¨iä¬.²ó7êŸÕ2AE×Ëþ#zæ–XÒý)¦xÀëg)ʪxp½ìJódÜ,gÞ~¯âù­DýS£¡^ Špé˜ØPDM5–Á֘ϺÊÁj— áeQÒ-å8üóU¢ Ö+Š(cÁþ¦´ Q…¥lÆÒR)+Þb [^R®a«b¡Šï¾r|>ÉÆj* Q¦Hn.,3†œF#³V¬ûûÊÖ=®,ÉRRKX §¨iâ4‹³j!ÑõŠÙoãgYP%¬©ö¾#\Ù”ɧ×Ì+¯^™¨Iei+sÑSIyM¶]# h+b¶ö a¢Ê…{Š`­V a>Ñs2Öks̬ 6bÖÑ#2ÖTÏ×…|WÄšÁ )Ã-®‚"æDD»õ`ž,Òkó¡LT•Ai A¬¿é­äbéãñÙ<Ùßcû=cTÅ£5M èbÙ*£0Ö³s{ׯ³Þ`O½BIëúZÆX0odŒuDTÂQZT–Y¡çÌ,# Lò2°"‘u[š€òX³û4<0_ñTt™ÔP”–09B@Ç×ë·>"-‚¥„YGrd,%,ýœ, köRúþYµÚÌ ¢wA©âÔÓÚCè{ž?kH4óÇ]ZçhŸÅ÷®ÖΫssËÃ¥–Q«;àKj•±ºL%Œõ‰•e]¡çŒ6®_h*Ž‚ÊÎÉ–œä"ÐÑî˜öùP7ÒÏlÃgƒ² ›y|lò{M…9£­³š÷‚à1»¯‚xí'ûšjzb(*a¨Ò´'(ºíBò)"ˆ;o€£êŒnǯ?wõcl¡ºðFþr´á>Õp°#$¾.Åhô¶oáB'2Ú`ì«êߊÊX©8ŽàìzùðŒoôoÿb÷œ/x@8–XÎd¨i†§“{ˆº5OøQ³õúÝÇEœ†èPmþí¬©ú‡Ž¢ÖTdzíÝšø¨¯¶wÖU§öí5•ïn¨iúÆêu¨³¦Š-³Y笽ïbO•²¦š[ÎiPPÓôs—rCLqî—nˆš-OâpFkLŒ2øÍ bò WCŒ%4‚˜S†ün[Öq©'ƒW’Aj[mÇä õÉ aýgR•ñ^•0Ü•´Â2/ˆf¾{ÇÄÖ¥ò ÀðÕa³ÎXÊ9|^CÜŒb\ªO•”ßÎV {Qu¥a,…þ(»Ü¸1·åϱyÔ1ˆòÃÙñõÈÊM¡âú±¿”!jr*È­ÍžjÂêÖÀˆ›¡¦iCg žhÚï±Ó=%Âú-ÿœ SÊñZÃÍ(B©Œ™eôž Žj»äWéµ—~&&†¨òA‡Q,gt«¶ÄrFƒµ%–3ª¶Á$Û ¶¶jwF¿·Üû2/në[_¢dˆŒSõ¿î½økû»ýŸšB@„§Íy쨴ÂXÿkæØî¤c~]Óƒ¨*:‚hm÷[m—ûlÏõ]†.‰Óq;l Ðk)Í(cºw¿Áv­.¼`e¢Bè”ѳ Œ~3ë}F|E„›\õ<ä»áåmQ„àè[õŸxU.óÀ]W­iWCÔxøbÏúþ׺£n¨Á$ÂêVà6ñÎxAë«õR[¥Ëëôº¬u²ËZ¼±ˆÖ4·ˆ†…Í6¢KâõcüúîUµR3ÊªŠŠ¿‚X¯–Wû˜W„!TF{̆2úÎü?/œÚº¿J¯MÝ3%Šè×÷¬ÎÚÚ´Ë5ëŠìÙ^Š’k1g¨µ¾¡¬Ÿ˜ÜÖ¬ò-Û׿ISʘz­LÂ=¼\H‚P*£EfE½¯ÿúó0EÁðƒ‘¿)iêݶSŸÖ)Yö{”<@F@}5óòL1V*1v¹ϸLÿŽx_úö—Ü—Û«wQÓ,mÃð5W÷º]º¨§bfÝôûKb›óº­5ÕgRÆ«UÑ­ÛF&ÜÜ™¨jÄìÕîá†èùžŸß:»pÅu:¨³¦š\2ñ÷ˆ>L)jšç«-:m iÃå+¢¦©ˆÖcðÉUt½êÄoëIO7ED-·±==ê’²¦ŠíéQ™”eÕeU¨ßó݇¿icÏ׬¢¦Ù<§yÙ±Eû—<Ÿ¼Ý§sfuUÖT}CøÜíÝ”tx1‡¤…ôÁPJ\ýQ–ÁaARЧû¢vYóàɧLM™7$ñÅ÷TÝOc¸r¬s&ª<ÁÉ-ÖtÎðè8–ê®ã ›Ð9kª¾Û Š*«ù4ƒguèEÌ„2x‹º^ó¹Ú ^ùèíQ)I3F{ ˜¤fÛÀ¡LoìÎÕñêä¨äãs [ιßBÂz-ºsF[Çð®¨Çà~×öÎh±öÇs†· >+r–—'’çÁ“#—àê«p©¾ùhÅð³È,%Cß}æM(¬®í­ôh»àÀüºí1ŒY¤êd¸µÌúŠ–¡*cLU)ËW4)áå­«¿¢ƒÑñ\ÅdH4ƒ+±´ìþŠ®UW•€eñWt°ëµßF²]0Û+Z4ÛÇÍ ªçz®,k\^|üU¿Ì|E#nQ3  ~"ÝOÓ·–õrk¥P®$ð}GïRS¹¯öììH4ÞjËõfUòV³½Æ˜òm{߇cÊ·õ}OçðdäWDD%Í bRè¹² ø>jbóꟿ*„õ7-0Êà«$õyüç ³eGÏUœ0úX§Õ5Î즈¢þn¿®ÏÓ\ÑP–m¨/ëu*¨ZcÝ56Æèm€}Á~rÂ\]¢8Ka~«Ö9ûðÏ#QTÊê1‰ú ¡.+üÊpWŒËë LT¯Ö@0Z\^-‹`¸{pò³ë¿ßÆ´Ñ@QÕH1'u[?Ä}ÿ~vJy@—5M[guŸ•iTÔ4Ïþ÷AÓñž6v«Æó«\r›!g¢ª®¬1Z\jÜË|_ª-ªˆ1Xó ­¨ižUk¢!jš¶JBmÝš¾ÉÀ¾Ä§ƒ†nÍstõ7n¹‚ÙU˜ìÉ(mÑÉʈlõf0ÆlÕÒ6Ö|ÖxìkµÚõ+<^*aÍûöÙˆZTÖTÏNâ½2Fb«î¦1QeÛ^íÕð¿"z¾W‹Ô£P3 ŠOjˆ˜ZSÆ,ÃoA¼«pý‚®WýÉ*<œ®‰JÙE¼6ÌûcI{ÝT ×Ëzö³ʉ$Ñ%e¬R–0)«œt½<`£Üž‡?Áâ÷øcåÆXœåê¬r¾W„Š„¨á1§*a•6µG„ ž+kª~x £¬êO’ Tˆª9a¸+ÅseMµõÝexˆJjŠXT†:'Þ+c•b$”ýXñú-tÖu"Yk0$CZªžÒÚ3ÚnOÎçU Lƒ½¥–Õ*beÀ¬™±¦ZûéË5of¬©úêzQ k±êëôiQHç•12Q!¦Êh‘éQFï™éxÊÄ–ñUm·ZVkŒ1YfŒÞc¾ÌUµÛEÕˆ-'Ù«/“yŒÍº‹œÕ?0Æ„¨„ñ©Uó5ŠPOÏA\/DÏÃ.îÐ+˳ Á&°ñ~¨Ê]¯˜ý6޽î‹Jk-*c]¡óÊX A¢ñÊth­d:”Ñkf¿ß±û_–\;þ  0ÞŠŠýãò™EõÊæT"¼²±?·3¼²U%¬*“Ú#Bå§ß‚Páxý¹õ_Ä蚌Ql¶F[Dx[‹ÓÊð¶–ëW†Gœ¨”ám-•¡ÊÑwA¬Kˆ ÿN}ëÛ¯—&7CÿA`Ý^å¬Ù¨ý µF>³dQùj¿C¬˜I3Æú(*a¨bˆõ1}`=Ãu ¢ñKÍbo\q9"¸E›?þÙ¾£U(ŒEQEåLÛʪ”{@¾ ¾ RT/™l3&ªÍ_·µ­B^GºàåÈv¶°ºsµ(eõZº'÷×{°º¿¹ƒ³zyi°”ÕS b̧ãþ¼,L%¬žjQYÕÍ2Q!?Êh‘QUFÈu,ðÏ¿u é¹Çìœ"V¬e”: FUíÉç ö0C«ˆÕ“½ÆX±j?Ag¬2¢ÆpÒ¢2¦†Î+cÔe’›Ñ‡ÿÓ(éQFï‘çü6|ä1ƒ™KEŒûÊáaŒûºxK<ã.*aôœ•1 t^#º ŸÃšQHàmÑŽh 3“Æè9¦&1 ;Ú­ÊQQ cvhQòLçñNݼ_‚(Hâó¢½yÑ¿—a‹££ ÿ “§ÆšÊŠ,³´é`Š"‘t¦kŽã3êmwußBµT=bµ'ˆ!ˆ8ÊDuø H°²7ÃGšITKú tL W÷ßQEÙ«µÊÁïq¨ AÔŒãÇ^A‚­Ñ‡{ñÚFï%tÄ+ƒ&lÍ»_þ¼ãòÇ<Ê^/Æ0ˆ ^Ú¬¯E0ª¦Sª`°7í6÷ö8½Æê‚á9ÁÆðÌQ•0<¿Ä¢2< ÅyeŒ;ã L²3ûÀ&c¥3=Êè=3‘߆ôþ9Ѳ“^–°[µŽO]ÛðôUÖUG›Á®å|Æšjîßõ†1QÕJcb±6TÉ:QÞ÷ªD·±žÒ+e¢š^*x…¯zò†î^.cÆÚ¼l>~ŒµYTÂXhQëWÆzÊ8(Õêã·Œi–~øø-󞲞F$¶3G;9fß Æ‡©¨„U§ûK&DUr}¼^ƒ±ÖìÇçð'ó~|}žîkµÂ•ÁÞ>KŸ¦ëÖ>` HØõŠÞo#Ú둨„1;´¨Œ™¦óÊXke¢BL•Ñ"Ó£ŒÞW}øõçE+±J&W£(øËU3·x÷U3{®š9Ÿ6èDÄûªöã½¶ÆX©dMŒ±ëåãZú×¶1Y¾÷ÍÎ1¡®¨iâ;ÎúDÔXS=Ûoó“BcMµ¶1ª°` ÎÏ!ÛŠœŸ; ÖÇ0~,Ô‚%jžé¹ùã†Ë<ƽҡ¬©ú÷RcÝüƤ¬ó³yQg„Z<èAê§ÿVI±S<½RÆ ”²„IYå• ëåÆó‰<ªn?k@ªngL &Q5Õ”ÓªU–°ëåƒæ°TqÍ, §ŒRÉ9=jŒùÁT«1QU³Ù˜XÄÃEÙO×úêËXS}‚7—²‰~Æ6UÊš*>è„Ee¬7ô^cÏH(¢ªL,"CÊèý·UDNƒ&Á×}ÆðHS•0Þý˜Â4ÆlŸãëî ì¬#ubž3Q­ï:˜ß=fáø„Òkv€4v½â÷»˜FM¢JóC‹Ê˜kz¯Œõ†‘P&*DU-"?‚è;ëÃ|>µÅéËþ,>Á!†ð¬<§õõšï쪖 θv†rã8cÍ÷¾9UÊð¤‹ÊnÕg_Ã{eMµ>›i!‚šfï©Y˜xªçW‘,|™×—šõý]¨1Ü:ç2ãu.LT5‚bL,V+SSƒ-öŒáöºÉ¡w׃psQ#ÕS¬)CE§ß‚qF@™¨Meb™QFß‘ã¨9cr:ÓO4øŠ–~ºÞP‘"¢Ou*Ÿ3š«OF‰æýp©OF³l|2jŒžã“Ѽ¼üd4KU¯.qvžì¬^p¦V/¸/ÙP‹…ÕýÀSœÕ½Åãœñ<Ù Æ;°ÎHpÆ{°[pv½"ø»¨nuzy½p„±.Ó¢2Ö z¯ŒÙ>ßxDb럿1ªÊÊ¢fHYyouÂN¯.2³ÁÙóÕéBíò_¢œ*üU5¹•¢Í^õ"zž"±o1Eû«UGUT]Ì_cuÆL™1Q± £ÅÃ͛ܬû¢ÂxuTE b—ýhk`ß{CÿÕáØë½2-‰èzÙ×ëOQ8΂¾êOHNq)B-‡ï.a°†‰0E¢YðÜ{ÜÉì8Nxè=Ùq<õá²Üƒm“«æ ê¹T•0<Œ9%c uiœÙðFï1 dLT« ”Ôw®YöĆ•°zˇ®Æ®Wü~Ó籫*ex˜‰Ee¬2ô^«â H4ˆ¨2Úcv”ÑwÖ‡§·±ŒK ŽOd–Z´a ÷;§dŒUC>5Æ,®¯>#¦dzßBUʪ¿¡•UC½WVý „²êqDoÕ¯?mÇXzYùËáu¨kxýˆáõõ¾ÜpáÀ¹³¯j_ƒðÎJÅsgסÂsïß"å€ÇG l¬©ú×PµË•¢®û¾W'D`·êÙ÷ôKr•ˆ"hp,¦3Ø‹ÃØÀgœé ׃ß5Õú´E%¬©ž Ô¢°[uıòyH¼³[uÆêúˆ2Uû™)>Çx«çåŒõî7Æpõm±1½VS+bú0î`LTùúW$ÖNTNaô¼V+b æz·cšE%Œi¦="&yª†‹1¦/J5D Ž88Ÿ6+:æéÀâ-ýúûîèÞ“RjQбëe½»Ý7[¯²ž#.Ê¡ú›W%ecpGÐõ²¬)»ãIе7Æú¶×¢c¬K5” ˆ×GM[ \8ð|ËÚÖíc3(c¼¾£¦Ò5ÕÞ‡P–²ëåƒ:_ª¸Bñ««r—ªTÕƒ9_»ðŸqÐ:ÆÆªv~;³cÝSÊ*ª_2ã5$LTÕ1>ó,€|F©ã×Õ½n*auòÀwg¼F¬Š7FïëPEgTµwƒ1ZĪxc•¡/©ïp]¯þ6ªý»Q k5§1@‹Êò ¡Î ª:¨qPFcª ö˜Aô¼êï?7 {MESÏÈßµJ›zÜ­Uzf«tÞÛ+.t"íMc_Õ4¿Û®ÆJ%­Rcס§|öíçþJÿ’¶ v]DÔ41¯aCMÓ÷ŪÑ-¨iæ~Z],m5$šì :ƒµuRSë$þ®ù¢r†+_óðRCw¤‡á™Ë‚ÈXSõiDØ3ÖT1ýœ#úÎnÕØgÏælÎ8£jNu)Nr+Rç9£óûøv~Óù k¹¥¬©–~¹u<ž¡¦yŽR®söîÄü[¥UžŽÃ×=ŽÕiÎXJ·æìRÓâo•Wyx -~Rˆ0–Bo”]n\n€<×- ÇÙ`Q#!êWŠy`gqõ8¯L@ýž/G´Rǧ9«;ÝCuáL7C¸ƒD¤ w˜S†|ˆçÊj†@™¨He´ÈŒ(£÷HnV8ø­J¯ƒßzjbþ7o3Ì;£Suì›3š«cßœQÕ?@[uì›3ú]'ºõK‹CßP.%Oe齬ü;OøR‚×›Hˆð¤ÁÑoÎxÔ¡cÎò^ªÓËÔïÞÛhe÷m—»¬Îb3tY”~Ž[ÜOb¥)eL÷î·×®Õ…—¬LTœ2Úb”Ñof|zçÑá ÂcßZ&òL·0Cßz!é›×±o†*Ÿy움+ŒÖ÷¬ê÷Þlj~Yþ]Ÿfª›ÀDÂê6à±oÎxAë«ÉUu·×É.kä²´Eh%¿¨5„ð/h†º,Z?Çï©÷"TUJM)«ê)> b­Z^Í0^}õÕ¤c £pfB}Gîû«¦Ns«ÒëD° f‰"u¸˜³LmR& ~¬jìh«õ…ßzdH~¿fÉßø¬$bú)RÆ Òœ2&„ž+“PïäV’ Êh‘QFïyÜÛbô¡:ùFþr<âV÷ÃárÚu¥ÇTùPÖT}—±Ü‘Ù”´|^-k±ßCÔ7⪒–g–D|R†Ë“¢ˆ¤¤òIÐõ²/q:Ç>Ew ù‡¨_ï9æ@½³‹…Ÿ?<3œLó+}Ñb-ˆv†Ê{ŸtXíí —øgQŽ^ª1:¯1Qñγ}ÊPz~E㌗X‹}áEÔ·‹ƒŒŠlñeš!𣆍nv.ñâ¶fa Ôz”ßÊDµ¼Ã¹.NôÂõë›ú‚rÖw°ë»ßÆssɦ¿Ÿ­O(¦ˆp#‹×Ê^@5‡?¤É(™YQ¿Q"Úû÷z/zëõ¤D~ô^1½»? v½çŽñåÏ1~4ùè»cå>b!\$±eyB`¢hŠÉÍ a Ÿßöæè<_8O @Mñ:cí?y˜€±ö×jkgYûE²éïO-SD¬ôZR‚Ë'aB*ˆ$eI³¡,}þ9±±MV%q:¬=P£™Ã ­Ae¢ª™1c´Wûª9»àç¸6s}Ü?L,'jõÄšdÓߟ уM•!i¼xAÔ Œ‚h ùŸkÿ³Ö¨ŒAj¿ã<,CWü“e(ÚïÛÓ7dD—šÕ„§¢_ É¢M`ÁèO2Š¢’`Ã+!F0Œ‰êxWÕõðªºÞN vÁÓm’Û —HQ<ÖŒÃÖ÷¶Z+Êšê|Öx)»Uëðœo4×ËJPÓ<ÛÑàëgTaDÀìap!ïØr=¢G¯”1;tKUtK-Ò/e|Üì¹2Ò8f1–‘lúûsóŠ)">èµ2Ô)@4 ¥ ZcV”Á瀞¿~7Ü#;Ëæ£?üåXÏ­Nës¬ç˜|¦Î1öUmG[ž&*c¥’cסGÕÆ,úÚ»¤¾ùD­¨5Ô4m]Ç9Y+uM[69æî0Κjê}T\2QåÒ\g´ˆ©Gcð½Öæb ¦Å"0õ2â³åü½Àýû:™€öû3c•kˆ•ÜŠ­OëÔzkgT¡§žq‰/[‹äFÒ†šGýKCt®åu¡˜ú»ý:ڗ͆¨Y&S,SYÈ]”ùwû5ÎÙ­w¸±¦ê‡‰æ7Á†Zäú¯Ðjš¥÷MaMYSõóeËgf)¯€¿#n‚`±'iŠøæTÖTý,ßjøeâ¬Ûôu¯»€•¥NÌu–¥Ä,yþu½,ª«õïûÒA ”$ %¥/õ÷õ²¬1‰•ÃUj­/®ZUª¨Œg½ÁŒedê«[ŒÏ¹¾=:׌o\3÷u}ÈÜί e|¸ØP]ÿ—Ô£1ªF>ûFýt·HíýëÏ/Èx#oÇáþåÛù~nö½Ò÷EÕßÎÿåŸÿöDWendstream endobj 6 0 obj 20395 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 /Rotate 90>> endobj 1 0 obj <> endobj 7 0 obj <>endobj 33 0 obj <> endobj 34 0 obj <> endobj 32 0 obj <>/Length 218>>stream xœíÓA ÀõOþÿeâ Jme˜žì_\ž/í__þµeð¸ÿdª–¶Ñ“ÛPœD¬t¦([”òŒúÕ<—Oå• Çñ¶õ ù÷`ëŸ4äÒ—¼‡öB©'óã8²>x­w•€¿ð´ŽDD endstream endobj 31 0 obj <>/Length 425>>stream xœíÓAoœ0†á *õP5RòÿòǓܚœªVZ„1ÎŒ%ÛæÐcïÊ}¶Ç zôQdk½«r»òqë: *K£©‘dIÄÂRs ûú–×Vú^‡AûA‡Þ«õ÷}Ó-EK£¥ÛFóWسõŸëñ³†Nc\cÌ¡ŸCŸ¬ßj[s¼ªù·ß¼è%é4[•‹ÕY§äõ’Îlm§Ûî4ï‹ÛqÛJ¹,¹¤eµ~¹äTò¼ÚX½îÙ§©È"’}”\¯zLåë7¹{ï÷>¶pgùaŸÆ/2ùÿµ»z°a÷þ=ɯ‹—7y~•§>^Ú½Uö÷P³¿×#ø–ž[åÅVÚQ†QÆQk­9Úk–¦Ö-èüûzðÜÙ§+KWrÓ5>b­]ØB¨Õú­p41„óÔÞãý·ma;{žºyʵ?Ü>EÀàôZ˜ endstream endobj 30 0 obj <>/Length 300>>stream xœíÓKà EQ›d]H÷¿ºPj'$iúvpBžQZé¨ÜîRfÑù°Ú´áõtq{¹Úðbú!¬ªÕã¥æÔE²¨»Ãº.¶f>çpÛ=¿…# »®CØ‹Åni“ʬ2Ö2ê,Jnm¼f2YŽÄÉÈ¿ÏìOlôÇKmö÷èÒt+rŽ:>_"p¾uooª›ž+|+q¢Ò²ðÙâ6’½%òØ^X“ÙÞ»Z‹ïgÛ«Z÷ÛÌïÊúãûúzîù‹à žƒK< endstream endobj 29 0 obj <>/Length 244>>stream xœíÓË‚0ÐáQþÿw¢ò*¤èÒÅIš¦î °8Õ3"šˆ:ïãªæ=òa«”öå…z©%Ê£N÷Ïù-¥ù-¥ù¥–øáó¯?øtþï-ñý·a^ý¿ù:¯ók¿^ù“p¿»FìMݦ&uM—Ú4¦5¶Ê˜_ŠS%?m·æ÷O×üuËÛ+Jù ø/l)œ] endstream endobj 28 0 obj <>/Length 245>>stream xœíÓÁƒ ÐBæÿÿò2‡€n»ìô8ZJmŒ/EY)"O{¼‚åé|tÕçêzüÒ¼ŸçãTGý÷͇ùϧ9GN‘êžëcªýOùsÍœlõ)MÅ-9],ãù®f¬õýx‹ÙVóŒc\ÏÖú¿óï/ôȱ¥²—`ßk¼¯#ÞêÑAwq_Ëüܹ¥>ß½bH¶úù7? ðgOD¯JÏ endstream endobj 27 0 obj <>/Length 227>>stream xœíÓë ‚@FÑÓ÷à$*…Ð.Öôé¿%"£nå¬Zî[_Ê0ûź¬OŸÖGôoüÒ×ÒõeÊùvœ÷y=ÕãòÖk“÷ÛÍ/}×]¶>wû—üÑ?{õõtð >]ܧ¯õ@ÚÐ>Ðd=d=ö´4YY¤=í @Ö@Öi@û@õõ@ÚÐ>Ðd=d=ö´4Yè') endstream endobj 26 0 obj <>/Length 279>>stream xœíÓÝrƒ ÐEMÚ÷ÛtbSÀŸ*jÛË^†Ùù„Õˆ™“¢Œ®Î~ ÓŒýJ³{¼ŒË†¡¾+sȵŸCy|½ºewm«wOsͱÉ §ýSŽ1^ÏR·!ãâá»ÿ¯q )Æ÷1ÊüŒ)¼ÕǺ҄û#nq{”y_B÷f±ÖÜœ¿hêçšê—NËß•ºÝîyB\îFßÖ¶ÿ¬gWëû¤ßz¶¿;õ·‡º>Eé?¾äõYŽýó]À¿ð-Q endstream endobj 25 0 obj <>/Length 225>>stream xœíÓÑ ƒ0 ÐTôÿ?XS·±M·Ç= ã­h唨RÞ5M1ϱ,GíÇ«ÏηËn~°ü–$k¾;ÄQkÄvVm¢7ÜzÃõ“ÜÍò¿/IòSµÞ|Vm¢7¬M;Œ$™5Y>[és®? ýàÛ^d{ÔnÐxá×|;îKào<¸¦ endstream endobj 24 0 obj <>/Length 229>>stream xœíÓí ‚0àw¥÷»YéÚ}¡†ý‚9Œ}&ˆOÊã˜#æ)Ï´´¿– ý´óý»öÓ¾÷§±&®-—2Fݯ˩-_çþ‡N»mÞ¯ËCŒ‡˜ºÈ}äîž×yé÷­0?ZœÕ?NåÛDºætα)µÿ¶3¬—ËÑÐúC~æÔÆòRøàïÜf àÊ endstream endobj 23 0 obj <>/Length 261>>stream xœíÓÁŽ„ P‘ÿÿ¼ù芎YV`3Ç9¼Ä4PÛZ/Å+¶íx¶Rk‰ZjÔˆZ[æ8ÖûzÅÒñš0}5mìç—ÅÌ®±¶úÏ&Ÿñ¬'w×2«ÿäOË¿û,~çwþ89E¤3î{ì)r‹­þ8_™>æGò}hõy’_tí÷ü÷ç¦3ïW}ý]–‡Oüí:ë‡Mòb½ÉþËMžûL6¹‹[W7\ãH&àküñªZ endstream endobj 22 0 obj <>/Length 224>>stream xœíÓA‚0Ð_ÅÄC{sPd°…¸rñ’.f†Ò¤¿yå‘1I?¯a.²nû]»©³Þù¼dì’iÝÖk™d7ùÚ.“œØóÙæÜ±×Wå»$T¦¢´ªÞ>è2Þ“ÒŒó·xÿª=×~2%Z†F<•{ç\*K]‹³ý\›¯S˜Àßx^IA endstream endobj 21 0 obj <>/Length 215>>stream xœíÓÁ ‚@Ы’ýÿçša!¡YšL›rq`¾ÇUæ‚§º%9O§]Äú4[—[X¾-¼‡ÓïëÒ¶sá¶ݪðk‡Ô;Ïç1fµÙÿ˜ß|%ß,ÉWÀÑòp¸€ß¸ž¡·Q endstream endobj 20 0 obj <>/Length 233>>stream xœíÓA‚0ЩpÿkbŠŠ-XtÌ¢m~»á¿õ¦‹ÛÄËÉöv•ß½=ÿ6¿X—Ó}=oçåçuë·´¶GóC¹ ñœ1Îo·S|+°:™ó»W¾Ïr¥•/´ À¡B@~¡€Ž<Ô€ÌB@~¡€Ž<Ô€ÌB@~¡€Ž<Ô€ÌB@~¡€Ž<Ô€ÌB@~¡€Ž<Ô€ÌBðß®_` endstream endobj 19 0 obj <>/Length 296>>stream xœíÓM‚0 †á¯-òã1\xÿëÁèÔ6Óbaíâeb'‰Ã㔎§ôº:dkØÊQº[L'«ªÎÍ©ixkx©_ÔÏ–œ ³•KÞ¾çkò³§LÒqöW™„9Gg×wo›J.ý¢¼äãáP*—Šug/eû·|?]‡NqÍFi“\ ÏçiМçr€ÃÝu=ÀáîÍçm>~záÑÞ¹•²«øí|›eß÷ê&…q[G…©Zóç9.7§5kiïåœøf(t¡ endstream endobj 18 0 obj <>/Length 294>>stream xœíÓ[‚0…áƒt†¸^wí…D,—Ö!4ꣿiš3Ó$ä뤋t’ú²× Vój©†›ó»#“'%×hz”5ç<½–­£uyŸÞYµ?…™r“G ¾ÝŒð8ù²bСyVùu¡['ŽÔl6/Ï»oÙ–'Ôœûn¡´ò:w½_Mû²æ)<¥Û²®%¨„ØÌ÷µNîɆ~ÝÍ{RÞç¿3$÷>%Ïyþp©|ÁvíËæÌ‡ù“uþëL,Ûóø/¼ôS8 endstream endobj 17 0 obj <>/Length 293>>stream xœíÓ݃ †áÏHëìþïr?&s ÂêÆ¶Ó¼†4¥T“gPy\²·¨ã´Û—>íóéuuWMž”\³éVGÉ×Ó”ioisŽË3W«/¡§nr‹‰ïûϱ>w8b<},žTŸ!Tãï|y!^ºÜ;Gßs[¿Ðò\w S«×¹êy5§-_òÂ]º¬ã\Õ$ó¾6È=Ù4nÑ|ô)åXŽ3%÷1,%ϹòRR‰-Ù¢ŽÓnÏ—þ/­ÿgOœöûð7<áS8 endstream endobj 16 0 obj <>/Length 258>>stream xœíÓÝŽƒ Ðìû¿ðZ n¤Vuïöâ$„ ð9ñ龜H‘×QFÝöó{ÿãè:?Å4EyD™–ñX–k]¦uÙòkæ<_¢<#×Hm~.ýG=Šm½Ûlù;ámÿ‹nÇbô¿yÕñ~~‹šjä9ÊOŸó:—¹?oÞl›ÓÚNû˜ÿž¿Îó’?öù:ºí󵿃Ôÿ’óŸË‹ä6ÿ56ºÅùQþ €¿V endstream endobj 15 0 obj <>/Length 230>>stream xœíÓÑC0à_ðä{l+ ci§»ÛÅ'½8~§ ’¯‹xÄzþrŽS®¹8,²­®R¯TÌÑV;r”ýÚϹO_° 1§5Æ”ÃVßÞæÜoßrô·l¿Zë—çZI§ÎûŠëímŽ¶Ú‘£ùäœã[-½þ´§S}ŠÏym¥yº:ào¼§š· endstream endobj 14 0 obj <>/Length 235>>stream xœíÓA‚0@QfÀè¼ÿ‘”P@¬ÊB/iÈ@ ,^4M³³¾õƒ¾oïÏýòZ~´ô÷Ûõîëþs9¾0³ßÖ߆Z_>{ÑUWf7ôõÝ烟úõ©mý|ð]ü €+–ŽAe endstream endobj 13 0 obj <>/Length 232>>stream xœíÓÝ ƒ0 ÐÈêû?p½˜ÓÎ¥âå.Ž áK È"¢dçè@/9½ñ^¾7~—/Ëy•˜JÔõ=K~«ëxöÛzδÍ$ÿ ¤—ìùÛL˜Ÿ¬ÿª¥$;µ g¬Éõþïm®#ò½K¶üïªË˜æ]×w[DÖ¼)âq²>Ë_š‘&ào¼µ. endstream endobj 12 0 obj <>/Length 247>>stream xœíÓÑjƒ@ÐÑjóÿ¿«Ub4–[“¼òpಌ×1,Ó$ùJ¿O·œíšë}9mµ,ú]ѹ͔nJ?ßÏÛã¼ö§ÇÍ~··þ’Çäg-Lmòýפȗ“Nù6¯ O~™åjÖK'!OßþW¿ËÜïw,Cªå¡py»ÙOýIó{µá1dÏÃIáòvs,úÕ¾>À´B5µ endstream endobj 11 0 obj <>/Length 193>>stream xœíÓÑ ‚@EÑ3YÿÿÁYF ¢1ŽR=,áŽl¼°J2äœ\ò<Çgœ³¼¾Í¿è«nöÝôÉõuö³9Ëkµù¾o7Ûý)÷Æï¶WòA? Gõå¶²³ëÙÓW_Ôào<éäê¦ endstream endobj 10 0 obj <>/Length 362>>stream xœí“AjÄ@Ã’vÿÿæžZ–n,¶S9„0ÖÄÇq|~?§÷ãê#|9îäœ/¤JÏ endstream endobj 9 0 obj <>/Length 220>>stream xœíÓAƒ À¶÷¿r£Ö"T–]LBˆÀã&S’Ô¤\úô&»É&ÿ#Óäo3çáW¾Ü_lTt\&2×üäc?ÿ§¤ÔÔzÓ×mCguîZï3Q¹Éǵ«ï¶ìõôà¯öØÛóô½µ5ßL^2癤ŸYE’©²Ç0éf ð7^­ JÏ endstream endobj 8 0 obj <>/Length 211>>stream xœíÓ± Ã0AÙûàt À^¥tž×9çz;Ïý}߯OùûG~û—ü}ôR@ºoƒ^ H÷ `ÐKé¾ z) Ý7€A/¤û0襀tß½îÀ —Ò}ôR@ºoƒ^ H÷ `ÐKé¾ z) Ý7€A/¤û0襀tß½îÀ —Ò}ôR@ºoƒ^ H÷ `ÐKé¾ z) Ý7€A/¤û0襀tß½îÀ —Âýy>endobj xref 0 35 0000000000 65535 f 0000020736 00000 n 0000032541 00000 n 0000020667 00000 n 0000020501 00000 n 0000000015 00000 n 0000020480 00000 n 0000020784 00000 n 0000032131 00000 n 0000031712 00000 n 0000031150 00000 n 0000030757 00000 n 0000030310 00000 n 0000029878 00000 n 0000029443 00000 n 0000029013 00000 n 0000028555 00000 n 0000028062 00000 n 0000027568 00000 n 0000027072 00000 n 0000026639 00000 n 0000026224 00000 n 0000025800 00000 n 0000025339 00000 n 0000024910 00000 n 0000024485 00000 n 0000024006 00000 n 0000023579 00000 n 0000023134 00000 n 0000022690 00000 n 0000022190 00000 n 0000021565 00000 n 0000021147 00000 n 0000020825 00000 n 0000020855 00000 n trailer << /Size 35 /Root 1 0 R /Info 2 0 R /ID [<43125A067176AF0353B2C170E83B137E><43125A067176AF0353B2C170E83B137E>] >> startxref 32729 %%EOF danieljprice-splash-4d1f09c/docs/figs/colourschemes.ps000077500000000000000000036465031477365367100232150ustar00rootroot00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%For: dprice %%Title: PGPLOT PostScript plot %%Creator: PGPLOT [PSDRIV 6.6] %%CreationDate: 11-Mar-2009 12:44 %%BoundingBox: (atend) %%DocumentFonts: (atend) %%LanguageLevel: 1 %%Orientation: Landscape %%Pages: (atend) %%EndComments %%BeginProlog /L {moveto rlineto currentpoint stroke moveto} bind def /C {rlineto currentpoint stroke moveto} bind def /D {moveto 0 0 rlineto currentpoint stroke moveto} bind def /LW {5 mul setlinewidth} bind def /BP {newpath moveto} bind def /LP /rlineto load def /EP {rlineto closepath eofill} bind def /MB {gsave translate MFAC dup scale 1 setlinewidth 2 setlinecap 0 setlinejoin newpath} bind def /ME /grestore load def /CC {0 360 arc stroke} bind def /FC {0 360 arc fill} bind def /G {1024 div setgray} bind def /K {3 -1 roll 1024 div 3 -1 roll 1024 div 3 -1 roll 1024 div setrgbcolor} bind def % Uncomment next line to convert color to grey shades %/K {3 -1 roll 3413 div 3 -1 roll 1739 div 3 -1 roll 9309 div add add setgray} bind def %%EndProlog %%BeginSetup /#copies 1 def %%EndSetup 0 0 0 K %%Page: 1 1 %%BeginPageSetup /PGPLOT save def 0.072 0.072 scale 8149 250 translate 90 rotate 1 setlinejoin 1 setlinecap 1 LW 1 %%EndPageSetup %%PageBoundingBox: (atend) 0 0 0 K 1 LW 10375 0 62 7549 L 0 188 C -10375 0 C 0 -188 C 4 2 5098 7792 L 5 5 C 0 -35 C -1 -1 5130 7787 L 1 -2 C 2 2 C -2 1 C -1 -1 5130 7767 L 1 -2 C 2 2 C -2 1 C 0 -26 5191 7787 L -2 -5 C -2 -2 C -3 -2 C -5 0 C -3 2 C -4 4 5191 7782 L -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 0 -23 5204 7787 L 2 5 5204 7777 L 3 4 C 4 1 C 5 0 C 20 0 5224 7777 L 0 4 C -1 3 C -2 2 C -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 10 -23 5253 7787 L -10 -23 5273 7787 L -3 -7 C -4 -3 C -3 -2 C -2 0 C -2 4 5300 7782 L -5 1 C -5 0 C -5 -1 C -2 -4 C 2 -3 C 3 -2 C 9 -1 C 3 -2 C 2 -3 C 0 -2 C -2 -3 C -5 -2 C -5 0 C -5 2 C -2 3 C -3 4 5330 7782 L -4 1 C -5 0 C -3 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -23 5360 7787 L -3 4 5360 7782 L -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 0 -35 5374 7799 L 20 0 5386 7777 L 0 4 C -2 3 C -2 2 C -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C gsave newpath 62 7549 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -1.008E+03 ] {currentfile picstr readhexstring pop} false 3 colorimage 0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313 1414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323242424252525262626272727 2727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B 3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F 5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363 6464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373747474757575767676777777 7777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B 8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9F A0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3 B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8 C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDB DCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEF F0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303 0404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313141414151515161616171717 1717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B 2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F 4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353 5454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363646464656565666666676767 6767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B 7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F 9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3 A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8 B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCB CCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDF E0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3 F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303040404050505060606070707 0707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B 1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F 3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343 4444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353545454555555565656575757 5757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B 6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F 8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393 9494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8 A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBB BCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCF D0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3 E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8 F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B 0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F 2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333 3434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343444444454545464646474747 4747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B 5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F 7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383 8484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393949494959595969696989898 9898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABAB ACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBF C0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3 D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8 E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFB FCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F 1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323 2424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333343434353535363636373737 3737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B 4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F 6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373 7474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383848484858585868686888888 8888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B 9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAF B0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3 C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8 D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEB ECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF 0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313 1414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323242424252525262626272727 2727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B 3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F 5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363 6464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373747474757575767676777777 7777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B 8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9F A0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3 B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8 C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDB DCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEF F0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303 0404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313141414151515161616171717 1717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B 2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F 4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353 5454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363646464656565666666676767 6767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B 7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F 9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3 A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8 B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCB CCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDF E0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3 F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303040404050505060606070707 0707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B 1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F 3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343 4444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353545454555555565656575757 5757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B 6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F 8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393 9494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8 A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBB BCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCF D0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3 E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8 F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B 0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F 2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333 3434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343444444454545464646474747 4747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B 5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F 7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383 8484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393949494959595969696989898 9898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABAB ACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBF C0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3 D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8 E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFB FCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F 1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323 2424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333343434353535363636373737 3737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B 4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F 6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373 7474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383848484858585868686888888 8888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B 9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAF B0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3 C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8 D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEB ECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF 0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313 1414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323242424252525262626272727 2727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B 3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F 5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363 6464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373747474757575767676777777 7777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B 8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9F A0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3 B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8 C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDB DCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEF F0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303 0404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313141414151515161616171717 1717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B 2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F 4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353 5454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363646464656565666666676767 6767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B 7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F 9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3 A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8 B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCB CCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDF E0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3 F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303040404050505060606070707 0707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B 1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F 3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343 4444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353545454555555565656575757 5757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B 6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F 8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393 9494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8 A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBB BCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCF D0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3 E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8 F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B 0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F 2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333 3434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343444444454545464646474747 4747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B 5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F 7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383 8484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393949494959595969696989898 9898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABAB ACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBF C0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3 D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8 E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFB FCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F 1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323 2424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333343434353535363636373737 3737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B 4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F 6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373 7474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383848484858585868686888888 8888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B 9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAF B0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3 C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8 D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEB ECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF 0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313 1414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323242424252525262626272727 2727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B 3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F 5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363 6464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373747474757575767676777777 7777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B 8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9F A0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3 B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8 C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDB DCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEF F0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303 0404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313141414151515161616171717 1717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B 2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F 4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353 5454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363646464656565666666676767 6767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B 7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F 9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3 A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8 B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCB CCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDF E0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3 F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303040404050505060606070707 0707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B 1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F 3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343 4444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353545454555555565656575757 5757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B 6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F 8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393 9494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8 A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBB BCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCF D0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3 E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8 F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B 0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F 2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333 3434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343444444454545464646474747 4747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B 5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F 7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383 8484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393949494959595969696989898 9898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABAB ACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBF C0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3 D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8 E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFB FCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F 1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323 2424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333343434353535363636373737 3737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B 4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F 6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373 7474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383848484858585868686888888 8888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B 9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAF B0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3 C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8 D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEB ECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF 0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313 1414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323242424252525262626272727 2727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B 3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F 5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363 6464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373747474757575767676777777 7777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B 8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9F A0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3 B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8 C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDB DCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEF F0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303 0404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F101010111111121212131313141414151515161616171717 1717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B 2C2C2C2D2D2D2E2E2E2F2F2F3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F 4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353 5454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F606060616161626262636363646464656565666666676767 6767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B 7C7C7C7D7D7D7E7E7E7F7F7F8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F 9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3 A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8 B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCB CCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDF E0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3 F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF000000010101020202030303040404050505060606070707 0707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B 1C1C1C1D1D1D1E1E1E1F1F1F2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F 3030303131313232323333333434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343 4444444545454646464747474747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F505050515151525252535353545454555555565656575757 5757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B 6C6C6C6D6D6D6E6E6E6F6F6F7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F 8080808181818282828383838484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393 9494949595959696969898989898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8 A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBB BCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCF D0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3 E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8 F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B 0C0C0C0D0D0D0E0E0E0F0F0F1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F 2020202121212222222323232424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333 3434343535353636363737373737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F404040414141424242434343444444454545464646474747 4747474949494A4A4A4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B 5C5C5C5D5D5D5E5E5E5F5F5F6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F 7070707171717272727373737474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383 8484848585858686868888888888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F909090919191929292939393949494959595969696989898 9898989999999A9A9A9B9B9B9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABAB ACACACADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBF C0C0C0C1C1C1C2C2C2C3C3C3C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3 D4D4D4D5D5D5D6D6D6D8D8D8D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8 E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFB FCFCFCFDFDFDFEFEFEFFFFFF0000000101010202020303030404040505050606060707070707070909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F 1010101111111212121313131414141515151616161717171717171919191A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1F1F1F202020212121222222232323 2424242525252626262727272727272929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030313131323232333333343434353535363636373737 3737373939393A3A3A3B3B3B3C3C3C3D3D3D3E3E3E3F3F3F4040404141414242424343434444444545454646464747474747474949494A4A4A4B4B4B 4C4C4C4D4D4D4E4E4E4F4F4F5050505151515252525353535454545555555656565757575757575959595A5A5A5B5B5B5C5C5C5D5D5D5E5E5E5F5F5F 6060606161616262626363636464646565656666666767676767676969696A6A6A6B6B6B6C6C6C6D6D6D6E6E6E6F6F6F707070717171727272737373 7474747575757676767777777777777979797A7A7A7B7B7B7C7C7C7D7D7D7E7E7E7F7F7F808080818181828282838383848484858585868686888888 8888888989898A8A8A8B8B8B8C8C8C8D8D8D8E8E8E8F8F8F9090909191919292929393939494949595959696969898989898989999999A9A9A9B9B9B 9C9C9C9D9D9D9E9E9E9F9F9FA0A0A0A1A1A1A2A2A2A3A3A3A4A4A4A5A5A5A6A6A6A8A8A8A8A8A8A9A9A9AAAAAAABABABACACACADADADAEAEAEAFAFAF B0B0B0B1B1B1B2B2B2B3B3B3B4B4B4B5B5B5B6B6B6B8B8B8B8B8B8B9B9B9BABABABBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC0C0C0C1C1C1C2C2C2C3C3C3 C4C4C4C5C5C5C6C6C6C8C8C8C8C8C8C9C9C9CACACACBCBCBCCCCCCCDCDCDCECECECFCFCFD0D0D0D1D1D1D2D2D2D3D3D3D4D4D4D5D5D5D6D6D6D8D8D8 D8D8D8D9D9D9DADADADBDBDBDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E8E8E8E8E8E8E9E9E9EAEAEAEBEBEB ECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF grestore 10375 0 62 7237 L 0 188 C -10375 0 C 0 -188 C 0 2 5176 7479 L 1 3 C 2 2 C 3 1 C 7 0 C 3 -1 C 2 -2 C 2 -3 C 0 -4 C -2 -3 C -3 -5 C -17 -17 C 23 0 C -2 -1 5211 7475 L 2 -2 C 2 2 C -2 1 C -2 -1 5211 7455 L 2 -2 C 2 2 C -2 1 C 0 -23 5253 7475 L 2 5 5253 7465 L 3 4 C 3 1 C 5 0 C 20 0 5273 7465 L 0 4 C -2 3 C -1 2 C -4 1 C -5 0 C -3 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -35 5323 7487 L -3 4 5323 7470 L -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C gsave newpath 62 7237 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -9.667E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 0000000200000300000500000600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C0000 1D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000340000360000370000390000 3900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000500000520000530000550000 5601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100 7401007501007701007801007A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100 9101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100 AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200 CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900 E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00 FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625 FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71 FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0 FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF000000020000030000050000 0600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000 2200002300002500002700002800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E0000 3F00004100004200004400004500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B0100 5C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100740100750100770100780100 7A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100910100920100940100950100 9501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400 B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00 D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100 ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800 FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32 FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281 FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1 FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B0000 0B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000220000230000250000270000 2800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E00003F0000410000420000440000 4500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100 6301006401006601006701006701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E0100 7E01008001008101008301008501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A0100 9C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00 B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300 D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900 F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00 FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443 FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92 FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2 FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000 1100001200001400001600001700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D0000 2E00003000003100003300003400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A0000 4C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100630100640100660100670100 6701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100 8501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100 A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400 BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00 DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00 F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604 FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53 FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3 FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EE FFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000110000120000140000160000 1700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000 3400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000 5000005200005300005500005601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C0100 6D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100850100860100880100890100 8B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100 A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00 C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100 E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700 FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15 FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464 FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0 FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF 0000000200000300000500000600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C0000 1D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000340000360000370000390000 3900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000500000520000530000550000 5601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100 7401007501007701007801007A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100 9101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100 AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200 CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900 E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00 FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625 FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71 FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0 FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF000000020000030000050000 0600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000 2200002300002500002700002800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E0000 3F00004100004200004400004500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B0100 5C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100740100750100770100780100 7A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100910100920100940100950100 9501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400 B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00 D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100 ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800 FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32 FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281 FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1 FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B0000 0B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000220000230000250000270000 2800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E00003F0000410000420000440000 4500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100 6301006401006601006701006701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E0100 7E01008001008101008301008501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A0100 9C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00 B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300 D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900 F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00 FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443 FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92 FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2 FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000 1100001200001400001600001700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D0000 2E00003000003100003300003400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A0000 4C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100630100640100660100670100 6701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100 8501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100 A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400 BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00 DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00 F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604 FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53 FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3 FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EE FFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000110000120000140000160000 1700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000 3400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000 5000005200005300005500005601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C0100 6D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100850100860100880100890100 8B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100 A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00 C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100 E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700 FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15 FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464 FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0 FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF 0000000200000300000500000600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C0000 1D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000340000360000370000390000 3900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000500000520000530000550000 5601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100 7401007501007701007801007A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100 9101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100 AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200 CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900 E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00 FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625 FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71 FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0 FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF000000020000030000050000 0600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000 2200002300002500002700002800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E0000 3F00004100004200004400004500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B0100 5C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100740100750100770100780100 7A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100910100920100940100950100 9501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400 B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00 D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100 ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800 FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32 FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281 FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1 FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B0000 0B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000220000230000250000270000 2800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E00003F0000410000420000440000 4500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100 6301006401006601006701006701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E0100 7E01008001008101008301008501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A0100 9C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00 B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300 D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900 F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00 FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443 FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92 FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2 FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000 1100001200001400001600001700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D0000 2E00003000003100003300003400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A0000 4C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100630100640100660100670100 6701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100 8501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100 A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400 BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00 DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00 F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604 FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53 FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3 FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EE FFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000110000120000140000160000 1700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000 3400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000 5000005200005300005500005601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C0100 6D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100850100860100880100890100 8B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100 A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00 C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100 E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700 FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15 FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464 FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0 FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF 0000000200000300000500000600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C0000 1D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000340000360000370000390000 3900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000500000520000530000550000 5601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100 7401007501007701007801007A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100 9101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100 AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200 CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900 E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00 FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625 FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71 FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0 FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF000000020000030000050000 0600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000 2200002300002500002700002800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E0000 3F00004100004200004400004500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B0100 5C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100740100750100770100780100 7A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100910100920100940100950100 9501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400 B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00 D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100 ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800 FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32 FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281 FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1 FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B0000 0B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000220000230000250000270000 2800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E00003F0000410000420000440000 4500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100 6301006401006601006701006701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E0100 7E01008001008101008301008501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A0100 9C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00 B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300 D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900 F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00 FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443 FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92 FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2 FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000 1100001200001400001600001700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D0000 2E00003000003100003300003400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A0000 4C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100630100640100660100670100 6701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100 8501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100 A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400 BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00 DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00 F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604 FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53 FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3 FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EE FFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000110000120000140000160000 1700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000 3400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000 5000005200005300005500005601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C0100 6D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100850100860100880100890100 8B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100 A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00 C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100 E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700 FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15 FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464 FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0 FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF 0000000200000300000500000600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C0000 1D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000340000360000370000390000 3900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000500000520000530000550000 5601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100 7401007501007701007801007A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100 9101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100 AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200 CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900 E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00 FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625 FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71 FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0 FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF000000020000030000050000 0600000800000900000B00000B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000 2200002300002500002700002800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E0000 3F00004100004200004400004500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B0100 5C01005E01006001006101006301006401006601006701006701006901006A01006C01006D01006F0100700100720100740100750100770100780100 7A01007B01007D01007E01007E01008001008101008301008501008601008801008901008B01008C01008E01008F0100910100920100940100950100 9501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400 B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00 D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100 ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800 FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32 FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281 FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1 FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B0000 0B00000C00000E00000F00001100001200001400001600001700001900001A00001C00001D00001F0000200000220000220000230000250000270000 2800002A00002B00002D00002E00003000003100003300003400003600003700003900003900003B00003C00003E00003F0000410000420000440000 4500004700004800004A00004C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100 6301006401006601006701006701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E0100 7E01008001008101008301008501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A0100 9C01009D01009F0100A00100A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00 B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300 D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900 F15900F35B00F45D00F65F00F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00 FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443 FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92 FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2 FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000 1100001200001400001600001700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D0000 2E00003000003100003300003400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A0000 4C00004D00004F00005000005000005200005300005500005601005801005901005B01005C01005E0100600100610100630100640100660100670100 6701006901006A01006C01006D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100 8501008601008801008901008B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100 A20100A30100A50100A60100A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400 BF1600C01800C21A00C41C00C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00 DA3B00DC3D00DE3F00DF4100E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00 F86100F96300FB6500FC6700FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604 FF8808FF8A0CFF8C11FF8E15FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53 FFAE58FFB05CFFB260FFB464FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3 FFD3A3FFD5A7FFD7ABFFD9B0FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EE FFF9F2FFFBF7FFFDFBFFFFFF0000000200000300000500000600000800000900000B00000B00000C00000E00000F0000110000120000140000160000 1700001900001A00001C00001D00001F00002000002200002200002300002500002700002800002A00002B00002D00002E0000300000310000330000 3400003600003700003900003900003B00003C00003E00003F00004100004200004400004500004700004800004A00004C00004D00004F0000500000 5000005200005300005500005601005801005901005B01005C01005E01006001006101006301006401006601006701006701006901006A01006C0100 6D01006F01007001007201007401007501007701007801007A01007B01007D01007E01007E0100800100810100830100850100860100880100890100 8B01008C01008E01008F01009101009201009401009501009501009701009901009A01009C01009D01009F0100A00100A20100A30100A50100A60100 A80100A90100AB0100AD0100AD0100AE0100B00200B10400B30600B40800B60A00B70C00B90E00BA1000BC1200BD1400BF1600C01800C21A00C41C00 C41C00C51E00C72000C82200CA2400CB2600CD2800CE2B00D02D00D12F00D33100D43300D63500D73700D93900DA3B00DA3B00DC3D00DE3F00DF4100 E14300E24500E44700E54900E74B00E84D00EA4F00EB5100ED5300EE5500F05700F15900F15900F35B00F45D00F65F00F86100F96300FB6500FC6700 FE6900FF6B00FF6D00FF6F00FF7200FF7400FF7600FF7800FF7800FF7A00FF7C00FF7E00FF8000FF8200FF8400FF8604FF8808FF8A0CFF8C11FF8E15 FF9019FF921DFF9421FF9625FF9625FF982AFF9A2EFF9C32FF9E36FFA03AFFA23FFFA443FFA647FFA84BFFAA4FFFAC53FFAE58FFB05CFFB260FFB464 FFB464FFB668FFB86DFFBA71FFBC75FFBE79FFC07DFFC281FFC586FFC78AFFC98EFFCB92FFCD96FFCF9BFFD19FFFD3A3FFD3A3FFD5A7FFD7ABFFD9B0 FFDBB4FFDDB8FFDFBCFFE1C0FFE3C4FFE5C9FFE7CDFFE9D1FFEBD5FFEDD9FFEFDEFFF1E2FFF1E2FFF3E6FFF5EAFFF7EEFFF9F2FFFBF7FFFDFBFFFFFF grestore 10375 0 62 6926 L 0 187 C -10375 0 C 0 -187 C 18 0 5007 7175 L -10 -13 C 5 0 C 4 -2 C 1 -2 C 2 -5 C 0 -3 C -2 -5 C -3 -3 C -5 -2 C -5 0 C -5 2 C -2 1 C -2 4 C -1 -2 5040 7164 L 1 -2 C 2 2 C -2 2 C -1 -1 5040 7143 L 1 -2 C 2 2 C -2 1 C 0 -35 5082 7175 L 15 0 5082 7175 L 6 -1 C 1 -2 C 2 -3 C 0 -4 C -2 -3 C -1 -2 C -6 -2 C 15 0 5082 7158 L 6 -1 C 1 -2 C 2 -3 C 0 -5 C -2 -4 C -1 -1 C -6 -2 C -15 0 C 0 -24 5136 7164 L -3 4 5136 7158 L -4 2 C -5 0 C -3 -2 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -28 5151 7175 L 2 -5 C 3 -2 C 4 0 C 12 0 5146 7164 L 20 0 5168 7153 L 0 4 C -1 3 C -2 2 C -4 2 C -5 0 C -3 -2 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -24 5227 7164 L 2 5 5227 7153 L 3 4 C 3 2 C 5 0 C 20 0 5247 7153 L 0 4 C -2 3 C -1 2 C -4 2 C -5 0 C -3 -2 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -35 5297 7175 L -3 4 5297 7158 L -3 2 C -5 0 C -4 -2 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 30 0 5311 7155 L 10 -24 5351 7164 L -10 -24 5371 7164 L -3 -7 C -4 -3 C -3 -2 C -2 0 C 20 0 5380 7153 L 0 4 C -2 3 C -2 2 C -3 2 C -5 0 C -3 -2 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 0 -35 5412 7175 L 0 -35 5425 7175 L -3 -2 5445 7164 L -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 2 5 C 0 3 C -2 5 C -3 4 C -4 2 C -5 0 C 6 -24 5469 7164 L -7 -24 5482 7164 L 7 -24 5482 7164 L -7 -24 5496 7164 L gsave newpath 62 6925 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -9.250E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C00002F0000330000360000390000 3C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F0000720000750000 7500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000 B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000 ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800 FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600 FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000 FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00 FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1C FFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59 FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92 FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCF FFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF000000030000060000090000 0D00001000001300001600001600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F0000420000460000 4600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F0000 8200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000 BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000 FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500 FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000 FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00 FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00 FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29 FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62 FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9F FFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDC FFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D0000100000130000160000 1600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F0000 5200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B0000 8E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000 CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500 FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00 FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00 FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00 FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800 FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33 FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6F FFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFAC FFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9 FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C0000200000 2300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C0000 5F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E0000920000950000980000 9B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000 D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00 FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00 FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00 FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700 FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03 FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3F FFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7C FFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9 FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2 FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C0000 2F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F0000620000650000680000 6C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000 A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000 E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00 FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900 FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700 FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100 FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0F FFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4C FFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89 FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2 FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF 0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C00002F0000330000360000390000 3C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F0000720000750000 7500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000 B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000 ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800 FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600 FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000 FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00 FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1C FFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59 FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92 FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCF FFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF000000030000060000090000 0D00001000001300001600001600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F0000420000460000 4600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F0000 8200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000 BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000 FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500 FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000 FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00 FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00 FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29 FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62 FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9F FFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDC FFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D0000100000130000160000 1600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F0000 5200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B0000 8E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000 CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500 FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00 FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00 FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00 FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800 FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33 FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6F FFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFAC FFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9 FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C0000200000 2300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C0000 5F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E0000920000950000980000 9B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000 D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00 FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00 FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00 FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700 FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03 FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3F FFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7C FFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9 FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2 FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C0000 2F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F0000620000650000680000 6C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000 A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000 E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00 FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900 FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700 FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100 FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0F FFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4C FFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89 FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2 FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF 0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C00002F0000330000360000390000 3C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F0000720000750000 7500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000 B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000 ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800 FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600 FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000 FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00 FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1C FFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59 FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92 FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCF FFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF000000030000060000090000 0D00001000001300001600001600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F0000420000460000 4600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F0000 8200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000 BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000 FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500 FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000 FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00 FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00 FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29 FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62 FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9F FFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDC FFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D0000100000130000160000 1600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F0000 5200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B0000 8E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000 CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500 FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00 FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00 FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00 FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800 FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33 FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6F FFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFAC FFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9 FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C0000200000 2300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C0000 5F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E0000920000950000980000 9B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000 D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00 FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00 FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00 FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700 FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03 FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3F FFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7C FFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9 FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2 FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C0000 2F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F0000620000650000680000 6C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000 A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000 E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00 FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900 FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700 FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100 FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0F FFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4C FFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89 FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2 FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF 0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C00002F0000330000360000390000 3C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F0000720000750000 7500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000 B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000 ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800 FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600 FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000 FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00 FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1C FFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59 FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92 FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCF FFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF000000030000060000090000 0D00001000001300001600001600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F0000420000460000 4600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F0000 8200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000 BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000 FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500 FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000 FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00 FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00 FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29 FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62 FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9F FFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDC FFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D0000100000130000160000 1600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F0000 5200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B0000 8E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000 CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500 FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00 FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00 FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00 FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800 FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33 FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6F FFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFAC FFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9 FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C0000200000 2300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C0000 5F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E0000920000950000980000 9B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000 D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00 FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00 FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00 FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700 FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03 FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3F FFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7C FFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9 FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2 FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C0000 2F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F0000620000650000680000 6C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000 A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000 E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00 FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900 FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700 FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100 FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0F FFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4C FFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89 FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2 FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF 0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C00002F0000330000360000390000 3C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F0000720000750000 7500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000 B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000 ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800 FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600 FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000 FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00 FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1C FFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59 FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92 FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCF FFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF000000030000060000090000 0D00001000001300001600001600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F0000420000460000 4600004900004C00004F00005200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F0000 8200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000 BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000 FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500 FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000 FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00 FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00 FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29 FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62 FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9F FFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDC FFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D0000100000130000160000 1600001900001C00002000002300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F0000 5200005500005900005C00005F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B0000 8E00009200009500009800009B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000 CB0000CE0000D10000D40000D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500 FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00 FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00 FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00 FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800 FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33 FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6F FFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFAC FFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9 FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C0000200000 2300002600002900002C00002F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C0000 5F00006200006500006800006C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E0000920000950000980000 9B00009E0000A10000A50000A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000 D40000D70000DA0000DE0000E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00 FF1200FF1500FF1800FF1B00FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00 FF4F00FF5300FF5600FF5900FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00 FF8D00FF9000FF9300FF9700FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700 FFC700FFCB00FFCE00FFD100FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03 FFFF06FFFF09FFFF0CFFFF0FFFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3F FFFF43FFFF46FFFF49FFFF4CFFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7C FFFF7FFFFF82FFFF86FFFF89FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9 FFFFB9FFFFBCFFFFBFFFFFC2FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2 FFFFF5FFFFF9FFFFFCFFFFFF0000000300000600000900000D00001000001300001600001600001900001C00002000002300002600002900002C0000 2F00003300003600003900003C00003F00004200004600004600004900004C00004F00005200005500005900005C00005F0000620000650000680000 6C00006F00007200007500007500007800007B00007F00008200008500008800008B00008E00009200009500009800009B00009E0000A10000A50000 A50000A80000AB0000AE0000B10000B40000B80000BB0000BE0000C10000C40000C70000CB0000CE0000D10000D40000D40000D70000DA0000DE0000 E10000E40000E70000EA0000ED0000F10000F40000F70000FA0000FD0000FF0100FF0500FF0500FF0800FF0B00FF0E00FF1200FF1500FF1800FF1B00 FF1F00FF2200FF2500FF2800FF2C00FF2F00FF3200FF3500FF3500FF3900FF3C00FF3F00FF4200FF4600FF4900FF4C00FF4F00FF5300FF5600FF5900 FF5C00FF6000FF6300FF6600FF6600FF6900FF6D00FF7000FF7300FF7600FF7900FF7D00FF8000FF8300FF8600FF8A00FF8D00FF9000FF9300FF9700 FF9700FF9A00FF9D00FFA000FFA400FFA700FFAA00FFAD00FFB100FFB400FFB700FFBA00FFBE00FFC100FFC400FFC700FFC700FFCB00FFCE00FFD100 FFD400FFD800FFDB00FFDE00FFE100FFE400FFE800FFEB00FFEE00FFF100FFF500FFF800FFF800FFFB00FFFE00FFFF03FFFF06FFFF09FFFF0CFFFF0F FFFF13FFFF16FFFF19FFFF1CFFFF1FFFFF23FFFF26FFFF29FFFF29FFFF2CFFFF2FFFFF33FFFF36FFFF39FFFF3CFFFF3FFFFF43FFFF46FFFF49FFFF4C FFFF4FFFFF52FFFF56FFFF59FFFF59FFFF5CFFFF5FFFFF62FFFF66FFFF69FFFF6CFFFF6FFFFF72FFFF76FFFF79FFFF7CFFFF7FFFFF82FFFF86FFFF89 FFFF89FFFF8CFFFF8FFFFF92FFFF96FFFF99FFFF9CFFFF9FFFFFA2FFFFA6FFFFA9FFFFACFFFFAFFFFFB2FFFFB6FFFFB9FFFFB9FFFFBCFFFFBFFFFFC2 FFFFC5FFFFC9FFFFCCFFFFCFFFFFD2FFFFD5FFFFD9FFFFDCFFFFDFFFFFE2FFFFE5FFFFE9FFFFE9FFFFECFFFFEFFFFFF2FFFFF5FFFFF9FFFFFCFFFFFF grestore 10375 0 62 6614 L 0 187 C -10375 0 C 0 -187 C -17 -23 5176 6863 L 25 0 C 0 -35 5176 6863 L -2 -2 5196 6852 L 2 -2 C 1 2 C -1 2 C -2 -1 5196 6831 L 2 -2 C 1 2 C -1 1 C 0 -35 5238 6863 L 5 5 5238 6845 L 3 2 C 5 0 C 4 -2 C 1 -5 C 0 -17 C 20 0 5268 6841 L 0 4 C -2 3 C -1 2 C -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -6 C 0 -3 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -24 5318 6852 L -3 3 5318 6847 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -6 C 0 -3 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 0 -28 5333 6863 L 2 -5 C 4 -2 C 3 0 C 12 0 5328 6852 L gsave newpath 62 6613 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -8.833E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 0000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF 0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF 009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF 00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC2 00FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF71 00FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF20 00FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF00 31FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF00 82FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00 D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00 FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100 FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000 FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF 0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF 005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF 00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF 00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB1 00FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF60 00FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF13 00FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF00 42FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF00 93FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00 E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100 FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000 FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00 FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF 001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF 006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF 00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF1 00FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA0 00FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF53 00FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF02 02FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF00 53FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00 A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00 F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000 FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00 FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00 FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF 002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF 0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF 00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE0 00FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF93 00FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF42 00FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF00 13FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF00 60FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00 B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00 FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00 FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00 FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100 FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF 0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF 0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF 00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD3 00FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF82 00FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF31 00FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF00 20FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF00 71FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00 C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00 FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00 FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100 FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF0000 0000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF 0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF 009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF 00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC2 00FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF71 00FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF20 00FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF00 31FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF00 82FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00 D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00 FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100 FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000 FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF 0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF 005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF 00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF 00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB1 00FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF60 00FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF13 00FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF00 42FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF00 93FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00 E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100 FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000 FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00 FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF 001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF 006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF 00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF1 00FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA0 00FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF53 00FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF02 02FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF00 53FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00 A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00 F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000 FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00 FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00 FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF 002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF 0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF 00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE0 00FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF93 00FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF42 00FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF00 13FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF00 60FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00 B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00 FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00 FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00 FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100 FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF 0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF 0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF 00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD3 00FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF82 00FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF31 00FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF00 20FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF00 71FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00 C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00 FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00 FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100 FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF0000 0000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF 0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF 009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF 00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC2 00FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF71 00FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF20 00FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF00 31FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF00 82FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00 D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00 FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100 FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000 FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF 0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF 005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF 00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF 00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB1 00FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF60 00FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF13 00FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF00 42FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF00 93FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00 E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100 FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000 FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00 FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF 001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF 006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF 00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF1 00FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA0 00FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF53 00FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF02 02FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF00 53FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00 A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00 F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000 FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00 FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00 FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF 002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF 0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF 00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE0 00FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF93 00FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF42 00FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF00 13FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF00 60FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00 B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00 FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00 FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00 FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100 FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF 0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF 0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF 00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD3 00FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF82 00FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF31 00FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF00 20FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF00 71FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00 C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00 FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00 FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100 FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF0000 0000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF 0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF 009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF 00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC2 00FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF71 00FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF20 00FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF00 31FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF00 82FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00 D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00 FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100 FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000 FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF 0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF 005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF 00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF 00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB1 00FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF60 00FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF13 00FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF00 42FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF00 93FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00 E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100 FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000 FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00 FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF 001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF 006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF 00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF1 00FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA0 00FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF53 00FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF02 02FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF00 53FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00 A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00 F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000 FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00 FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00 FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF 002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF 0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF 00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE0 00FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF93 00FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF42 00FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF00 13FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF00 60FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00 B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00 FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00 FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00 FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100 FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF 0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF 0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF 00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD3 00FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF82 00FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF31 00FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF00 20FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF00 71FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00 C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00 FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00 FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100 FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF0000 0000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF 0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF 009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF 00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC2 00FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF71 00FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF20 00FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF00 31FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF00 82FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00 D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00 FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100 FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000 FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF 0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF 005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF 00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF 00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB1 00FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF60 00FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF13 00FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF00 42FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF00 93FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00 E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100 FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000 FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00 FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF 001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF 006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF 00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF1 00FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA0 00FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF53 00FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF02 02FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF00 53FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00 A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00 F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000 FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00 FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00 FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF 002FFF0033FF0037FF003CFF0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF 0080FF0084FF0089FF008DFF0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF 00D1FF00D5FF00DAFF00DEFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE0 00FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF93 00FF8F00FF8B00FF8600FF8200FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF42 00FF3E00FF3A00FF3500FF3100FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF00 13FF0017FF001CFF0020FF0020FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF00 60FF0064FF0069FF006DFF0071FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00 B1FF00B5FF00BAFF00BEFF00C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00 FFFC00FFF800FFF300FFEF00FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00 FFAB00FFA600FFA200FF9E00FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00 FF5E00FF5A00FF5500FF5100FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100 FF0D00FF0900FF0400FF00000000FF0004FF0009FF000DFF0011FF0015FF001AFF001EFF001EFF0022FF0026FF002BFF002FFF0033FF0037FF003CFF 0040FF0044FF0049FF004DFF0051FF0055FF005AFF005EFF005EFF0062FF0066FF006BFF006FFF0073FF0077FF007CFF0080FF0084FF0089FF008DFF 0091FF0095FF009AFF009EFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DEFF 00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F8FF00FCFF00FFFE00FFFA00FFF500FFF100FFED00FFE900FFE400FFE000FFE000FFDC00FFD800FFD3 00FFCF00FFCB00FFC600FFC200FFBE00FFBA00FFB500FFB100FFAD00FFA900FFA400FFA000FFA000FF9C00FF9800FF9300FF8F00FF8B00FF8600FF82 00FF7E00FF7A00FF7500FF7100FF6D00FF6900FF6400FF6000FF6000FF5C00FF5700FF5300FF4F00FF4B00FF4600FF4200FF3E00FF3A00FF3500FF31 00FF2D00FF2900FF2400FF2000FF2000FF1C00FF1700FF1300FF0F00FF0B00FF0600FF0202FF0006FF000BFF000FFF0013FF0017FF001CFF0020FF00 20FF0024FF0029FF002DFF0031FF0035FF003AFF003EFF0042FF0046FF004BFF004FFF0053FF0057FF005CFF0060FF0060FF0064FF0069FF006DFF00 71FF0075FF007AFF007EFF0082FF0086FF008BFF008FFF0093FF0098FF009CFF00A0FF00A0FF00A4FF00A9FF00ADFF00B1FF00B5FF00BAFF00BEFF00 C2FF00C6FF00CBFF00CFFF00D3FF00D8FF00DCFF00E0FF00E0FF00E4FF00E9FF00EDFF00F1FF00F5FF00FAFF00FEFF00FFFC00FFF800FFF300FFEF00 FFEB00FFE600FFE200FFDE00FFDE00FFDA00FFD500FFD100FFCD00FFC900FFC400FFC000FFBC00FFB800FFB300FFAF00FFAB00FFA600FFA200FF9E00 FF9E00FF9A00FF9500FF9100FF8D00FF8900FF8400FF8000FF7C00FF7700FF7300FF6F00FF6B00FF6600FF6200FF5E00FF5E00FF5A00FF5500FF5100 FF4D00FF4900FF4400FF4000FF3C00FF3700FF3300FF2F00FF2B00FF2600FF2200FF1E00FF1E00FF1A00FF1500FF1100FF0D00FF0900FF0400FF0000 grestore 10375 0 62 6302 L 0 187 C -10375 0 C 0 -187 C -17 0 5136 6551 L -1 -15 C 1 2 C 5 2 C 5 0 C 5 -2 C 4 -3 C 1 -5 C 0 -4 C -1 -5 C -4 -3 C -5 -2 C -5 0 C -5 2 C -1 1 C -2 4 C -2 -2 5153 6540 L 2 -2 C 2 2 C -2 2 C -2 -1 5153 6519 L 2 -2 C 2 2 C -2 1 C 0 -24 5195 6540 L 2 5 5195 6530 L 3 3 C 3 2 C 5 0 C 0 -24 5235 6540 L -3 3 5235 6535 L -3 2 C -6 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 6 0 C 3 2 C 3 3 C 2 -1 5247 6551 L 1 1 C -1 2 C -2 -2 C 0 -24 5249 6540 L 0 -24 5262 6540 L 5 5 5262 6533 L 3 2 C 6 0 C 3 -2 C 2 -5 C 0 -17 C 0 -35 5294 6551 L 3 3 5294 6535 L 4 2 C 5 0 C 3 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -3 -2 C -5 0 C -4 2 C -3 3 C -4 -2 5333 6540 L -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 2 5 C 0 4 C -2 5 C -3 3 C -3 2 C -5 0 C 7 -24 5356 6540 L -7 -24 5370 6540 L 6 -24 5370 6540 L -7 -24 5383 6540 L gsave newpath 62 6301 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -8.417E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E310053340057 37005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B2 4500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF 1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF 005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF 00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC7 00FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF67 00FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF02 04FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF00 70FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00 D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100 FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500 FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F 0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B 40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C0 3A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF 0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF 0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF 00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB7 00FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF52 00FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF00 1AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF00 81FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00 EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00 FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00 FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D140022 1400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B430070460075490079 4C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D2 3000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF 001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF 0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF 00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA2 00FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D 00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF00 2BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF00 98FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00 FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400 FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800 FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D0031 20003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D 57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E4 2600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF 002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF 00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF2 00FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D 00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF27 00FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF00 42FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00 AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900 FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00 FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700 FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F290044 2C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F 4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F7 1E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF 0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF 00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD 00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF77 00FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF17 00FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF00 59FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00 C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300 FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00 FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF0000 00000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E310053340057 37005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B2 4500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF 1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF 005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF 00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC7 00FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF67 00FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF02 04FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF00 70FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00 D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100 FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500 FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F 0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B 40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C0 3A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF 0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF 0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF 00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB7 00FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF52 00FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF00 1AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF00 81FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00 EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00 FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00 FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D140022 1400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B430070460075490079 4C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D2 3000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF 001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF 0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF 00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA2 00FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D 00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF00 2BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF00 98FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00 FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400 FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800 FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D0031 20003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D 57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E4 2600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF 002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF 00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF2 00FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D 00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF27 00FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF00 42FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00 AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900 FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00 FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700 FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F290044 2C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F 4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F7 1E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF 0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF 00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD 00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF77 00FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF17 00FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF00 59FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00 C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300 FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00 FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF0000 00000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E310053340057 37005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B2 4500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF 1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF 005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF 00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC7 00FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF67 00FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF02 04FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF00 70FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00 D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100 FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500 FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F 0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B 40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C0 3A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF 0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF 0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF 00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB7 00FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF52 00FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF00 1AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF00 81FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00 EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00 FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00 FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D140022 1400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B430070460075490079 4C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D2 3000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF 001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF 0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF 00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA2 00FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D 00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF00 2BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF00 98FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00 FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400 FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800 FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D0031 20003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D 57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E4 2600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF 002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF 00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF2 00FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D 00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF27 00FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF00 42FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00 AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900 FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00 FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700 FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F290044 2C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F 4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F7 1E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF 0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF 00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD 00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF77 00FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF17 00FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF00 59FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00 C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300 FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00 FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF0000 00000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E310053340057 37005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B2 4500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF 1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF 005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF 00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC7 00FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF67 00FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF02 04FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF00 70FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00 D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100 FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500 FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F 0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B 40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C0 3A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF 0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF 0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF 00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB7 00FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF52 00FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF00 1AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF00 81FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00 EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00 FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00 FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D140022 1400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B430070460075490079 4C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D2 3000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF 001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF 0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF 00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA2 00FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D 00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF00 2BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF00 98FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00 FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400 FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800 FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D0031 20003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D 57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E4 2600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF 002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF 00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF2 00FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D 00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF27 00FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF00 42FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00 AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900 FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00 FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700 FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F290044 2C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F 4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F7 1E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF 0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF 00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD 00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF77 00FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF17 00FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF00 59FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00 C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300 FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00 FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF0000 00000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E310053340057 37005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B2 4500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF 1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF 005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF 00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC7 00FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF67 00FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF02 04FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF00 70FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00 D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100 FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500 FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F 0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B 40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C0 3A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF 0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF 0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF 00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB7 00FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF52 00FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF00 1AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF00 81FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00 EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00 FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00 FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D140022 1400221700271A002C1D003120003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B430070460075490079 4C007E4F008351008854008D57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D2 3000D72D00DB2B00E02800E42600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF 001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF 0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF 00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA2 00FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D 00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF00 2BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF00 98FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00 FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400 FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800 FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D0031 20003523003A26003F2900442C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D 57009254009651009B4F009F4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E4 2600E92300EE2100F21E00F71E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF 002CFF0032FF0038FF003EFF0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF 00A0FF00A6FF00ACFF00B2FF00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF2 00FFED00FFE700FFE200FFDD00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D 00FF8700FF8200FF7D00FF7700FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF27 00FF2700FF2200FF1D00FF1700FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF00 42FF0048FF004EFF0053FF0059FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00 AEFF00B4FF00BAFF00BFFF00C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900 FFE400FFDE00FFD800FFD300FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00 FF7D00FF7700FF7200FF6C00FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700 FF1100FF0B00FF0600FF000000000003000506000A09000F0C00130F001811001D1400221400221700271A002C1D003120003523003A26003F290044 2C00492F004E31005334005737005C3A00613D006640006B40006B4300704600754900794C007E4F008351008854008D57009254009651009B4F009F 4C00A44A00A94700AD4500B24500B24200B63F00BB3D00C03A00C43800C93500CD3300D23000D72D00DB2B00E02800E42600E92300EE2100F21E00F7 1E00F71B00FB1900FF1400FF1000FF0C00FF0700FF0300FF0002FF0008FF000EFF0014FF001AFF0020FF0026FF002CFF002CFF0032FF0038FF003EFF 0045FF004BFF0051FF0057FF005DFF0063FF0069FF006FFF0075FF007BFF0082FF0088FF0088FF008EFF0094FF009AFF00A0FF00A6FF00ACFF00B2FF 00B8FF00BFFF00C5FF00CBFF00D1FF00D7FF00DDFF00E3FF00E3FF00E9FF00EFFF00F5FF00FBFF00FFFD00FFF700FFF200FFED00FFE700FFE200FFDD 00FFD700FFD200FFCD00FFC700FFC700FFC200FFBD00FFB700FFB200FFAD00FFA700FFA200FF9D00FF9700FF9200FF8D00FF8700FF8200FF7D00FF77 00FF7700FF7200FF6D00FF6700FF6200FF5D00FF5700FF5200FF4D00FF4700FF4200FF3D00FF3700FF3200FF2D00FF2700FF2700FF2200FF1D00FF17 00FF1200FF0D00FF0700FF0204FF0009FF000FFF0015FF001AFF0020FF0026FF002BFF002BFF0031FF0037FF003CFF0042FF0048FF004EFF0053FF00 59FF005FFF0064FF006AFF0070FF0075FF007BFF0081FF0081FF0086FF008CFF0092FF0098FF009DFF00A3FF00A9FF00AEFF00B4FF00BAFF00BFFF00 C5FF00CBFF00D0FF00D6FF00D6FF00DCFF00E1FF00E7FF00EDFF00F3FF00F8FF00FEFF00FFFA00FFF500FFEF00FFE900FFE400FFDE00FFD800FFD300 FFD300FFCD00FFC700FFC100FFBC00FFB600FFB000FFAB00FFA500FF9F00FF9A00FF9400FF8E00FF8900FF8300FF7D00FF7D00FF7700FF7200FF6C00 FF6600FF6100FF5B00FF5500FF5000FF4A00FF4400FF3F00FF3900FF3300FF2E00FF2800FF2800FF2200FF1C00FF1700FF1100FF0B00FF0600FF0000 grestore 10375 0 62 5990 L 0 187 C -10375 0 C 0 -187 C -2 4 5165 6234 L -5 1 C -3 0 C -5 -1 C -4 -5 C -1 -9 C 0 -8 C 1 -7 C 4 -3 C 5 -2 C 1 0 C 5 2 C 4 3 C 1 5 C 0 2 C -1 5 C -4 3 C -5 2 C -1 0 C -5 -2 C -4 -3 C -1 -5 C -2 -2 5180 6228 L 2 -2 C 1 2 C -1 2 C -2 -1 5180 6207 L 2 -2 C 1 2 C -1 1 C 0 -36 5222 6228 L 3 3 5222 6223 L 4 2 C 5 0 C 3 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -3 -2 C -5 0 C -4 2 C -3 3 C 0 -24 5254 6228 L 1 5 5254 6218 L 4 3 C 3 2 C 5 0 C 2 -1 5274 6239 L 1 1 C -1 2 C -2 -2 C 0 -24 5276 6228 L -2 3 5306 6223 L -5 2 C -5 0 C -5 -2 C -2 -3 C 2 -4 C 3 -1 C 9 -2 C 3 -2 C 2 -3 C 0 -2 C -2 -3 C -5 -2 C -5 0 C -5 2 C -2 3 C 0 -24 5318 6228 L 5 5 5318 6221 L 3 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 5 5 5336 6221 L 3 2 C 5 0 C 4 -2 C 1 -5 C 0 -17 C gsave newpath 62 5989 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -8.000E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 0000000400000800000C00001000001400001800001C00001C00002000002400002900002D00003100003500003900003D0000410000450000490000 4D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E0000920000960000 9600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000 E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00 C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C00 7490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD00 24DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D430 00CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F 007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD 002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E1 0000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C000097000093 00008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E000049000045000041 00003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C0000 1000001400001800001C00001C00002000002400002900002D00003100003500003900003D00004100004500004900004D0000510000550000590000 5900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000 A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000 F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00 B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00 679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA00 12EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C241 00BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F 006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE 001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D4 0000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A000086000082 00007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C000038000034000030 00002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C0000 1C00002000002400002900002D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D0000610000650000 6900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000 B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00 FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00 AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA00 55AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB03 00FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B151 00AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0 005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA 000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C2 0000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D000079000075000070 00006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E 00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C00001C0000200000240000290000 2D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D0000710000750000 7A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000 C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00 ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00 986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB00 43BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F213 00EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A062 00A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC 004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB 0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B1 0000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F 00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A000016000011 00000D0000090000040000000000000400000800000C00001000001400001800001C00001C00002000002400002900002D0000310000350000390000 3D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E0000820000860000 8A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000 D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00 DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00 867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC00 31D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E124 00E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E 008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD 003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F2 0000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A0 0000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B000056000052 00004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D000009000004000000 0000000400000800000C00001000001400001800001C00001C00002000002400002900002D00003100003500003900003D0000410000450000490000 4D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E0000920000960000 9600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000 E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00 C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C00 7490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD00 24DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D430 00CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F 007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD 002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E1 0000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C000097000093 00008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E000049000045000041 00003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C0000 1000001400001800001C00001C00002000002400002900002D00003100003500003900003D00004100004500004900004D0000510000550000590000 5900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000 A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000 F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00 B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00 679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA00 12EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C241 00BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F 006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE 001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D4 0000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A000086000082 00007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C000038000034000030 00002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C0000 1C00002000002400002900002D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D0000610000650000 6900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000 B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00 FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00 AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA00 55AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB03 00FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B151 00AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0 005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA 000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C2 0000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D000079000075000070 00006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E 00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C00001C0000200000240000290000 2D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D0000710000750000 7A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000 C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00 ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00 986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB00 43BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F213 00EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A062 00A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC 004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB 0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B1 0000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F 00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A000016000011 00000D0000090000040000000000000400000800000C00001000001400001800001C00001C00002000002400002900002D0000310000350000390000 3D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E0000820000860000 8A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000 D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00 DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00 867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC00 31D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E124 00E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E 008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD 003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F2 0000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A0 0000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B000056000052 00004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D000009000004000000 0000000400000800000C00001000001400001800001C00001C00002000002400002900002D00003100003500003900003D0000410000450000490000 4D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E0000920000960000 9600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000 E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00 C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C00 7490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD00 24DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D430 00CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F 007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD 002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E1 0000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C000097000093 00008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E000049000045000041 00003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C0000 1000001400001800001C00001C00002000002400002900002D00003100003500003900003D00004100004500004900004D0000510000550000590000 5900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000 A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000 F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00 B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00 679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA00 12EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C241 00BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F 006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE 001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D4 0000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A000086000082 00007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C000038000034000030 00002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C0000 1C00002000002400002900002D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D0000610000650000 6900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000 B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00 FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00 AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA00 55AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB03 00FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B151 00AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0 005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA 000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C2 0000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D000079000075000070 00006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E 00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C00001C0000200000240000290000 2D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D0000710000750000 7A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000 C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00 ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00 986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB00 43BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F213 00EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A062 00A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC 004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB 0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B1 0000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F 00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A000016000011 00000D0000090000040000000000000400000800000C00001000001400001800001C00001C00002000002400002900002D0000310000350000390000 3D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E0000820000860000 8A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000 D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00 DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00 867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC00 31D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E124 00E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E 008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD 003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F2 0000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A0 0000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B000056000052 00004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D000009000004000000 0000000400000800000C00001000001400001800001C00001C00002000002400002900002D00003100003500003900003D0000410000450000490000 4D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E0000920000960000 9600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000 E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00 C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C00 7490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD00 24DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D430 00CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F 007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD 002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E1 0000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C000097000093 00008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E000049000045000041 00003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C0000 1000001400001800001C00001C00002000002400002900002D00003100003500003900003D00004100004500004900004D0000510000550000590000 5900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000 A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000 F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00 B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00 679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA00 12EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C241 00BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F 006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE 001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D4 0000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A000086000082 00007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C000038000034000030 00002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C0000 1C00002000002400002900002D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D0000610000650000 6900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000 B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00 FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00 AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA00 55AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB03 00FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B151 00AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0 005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA 000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C2 0000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D000079000075000070 00006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E 00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C00001C0000200000240000290000 2D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D0000710000750000 7A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000 C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00 ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00 986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB00 43BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F213 00EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A062 00A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC 004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB 0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B1 0000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F 00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A000016000011 00000D0000090000040000000000000400000800000C00001000001400001800001C00001C00002000002400002900002D0000310000350000390000 3D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E0000820000860000 8A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000 D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00 DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00 867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC00 31D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E124 00E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E 008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD 003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F2 0000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A0 0000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B000056000052 00004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D000009000004000000 0000000400000800000C00001000001400001800001C00001C00002000002400002900002D00003100003500003900003D0000410000450000490000 4D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E0000920000960000 9600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000 E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00 C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C00 7490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD00 24DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D430 00CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F 007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD 002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E1 0000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C000097000093 00008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E000049000045000041 00003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C0000 1000001400001800001C00001C00002000002400002900002D00003100003500003900003D00004100004500004900004D0000510000550000590000 5900005D00006100006500006900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000 A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000 F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00 B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00 679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA00 12EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C241 00BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F 006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE 001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D4 0000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A000086000082 00007D00007900007500007000006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C000038000034000030 00002B00002700002300001E00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C0000 1C00002000002400002900002D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D0000610000650000 6900006D00007100007500007A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000 B60000BA0000BE0000C20000C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00 FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00 AA5D00A56100A165009C6A00986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA00 55AE0051B2004CB70048BB0043BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB03 00FF0700FB0B00F60F00F21300EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B151 00AD5600A95A00A45E00A06200A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0 005FA0005BA40056A80052AC004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA 000DEE0009F30004F70000FB0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C2 0000BE0000BA0000B50000B10000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D000079000075000070 00006C00006800006300005F00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E 00001E00001A00001600001100000D0000090000040000000000000400000800000C00001000001400001800001C00001C0000200000240000290000 2D00003100003500003900003D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D0000710000750000 7A00007E00008200008600008A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000 C60000CB0000CF0000D30000D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00 ED1D00E82100E42500DF2A00DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00 986E009372008F77008A7B00867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB00 43BF003FC3003AC80036CC0031D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F213 00EE1800E91C00E52000E12400E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A062 00A062009C6600976A00936E008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC 004EB00049B50045B90041BD003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB 0000FF0000FB0000F60000F20000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B1 0000AD0000A80000A40000A00000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F 00005F00005B00005600005200004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A000016000011 00000D0000090000040000000000000400000800000C00001000001400001800001C00001C00002000002400002900002D0000310000350000390000 3D00004100004500004900004D00005100005500005900005900005D00006100006500006900006D00007100007500007A00007E0000820000860000 8A00008E00009200009600009600009A00009E0000A20000A60000AA0000AE0000B20000B60000BA0000BE0000C20000C60000CB0000CF0000D30000 D30000D70000DB0000DF0000E30000E70000EB0000EF0000F30000F70400FB0800FE0C00FA1000F51400F11800ED1D00ED1D00E82100E42500DF2A00 DB2E00D63200D23600CD3B00C93F00C44300C04700BC4C00B75000B35400AE5900AA5D00AA5D00A56100A165009C6A00986E009372008F77008A7B00 867F008283007D8800798C007490007094006B9900679D00679D0062A1005EA60059AA0055AE0051B2004CB70048BB0043BF003FC3003AC80036CC00 31D0002DD50028D90024DD0024DD0020E1001BE60017EA0012EE000EF30009F70005FB0300FF0700FB0B00F60F00F21300EE1800E91C00E52000E124 00E12400DC2800D82C00D43000CF3400CB3900C73D00C24100BE4500BA4900B54D00B15100AD5600A95A00A45E00A06200A062009C6600976A00936E 008F72008A7700867B00827F007D8300798700758B00708F006C9400689800639C005FA0005FA0005BA40056A80052AC004EB00049B50045B90041BD 003DC10038C50034C90030CD002BD20027D60023DA001EDE001EDE001AE20016E60011EA000DEE0009F30004F70000FB0000FF0000FB0000F60000F2 0000EE0000E90000E50000E10000E10000DC0000D80000D40000CF0000CB0000C70000C20000BE0000BA0000B50000B10000AD0000A80000A40000A0 0000A000009C00009700009300008F00008A00008600008200007D00007900007500007000006C00006800006300005F00005F00005B000056000052 00004E00004900004500004100003C00003800003400003000002B00002700002300001E00001E00001A00001600001100000D000009000004000000 grestore 10375 0 62 5678 L 0 187 C -10375 0 C 0 -187 C -17 -35 5024 5927 L 24 0 5000 5927 L -2 -2 5037 5916 L 2 -2 C 2 2 C -2 2 C -2 -2 5037 5896 L 2 -2 C 2 2 C -2 2 C 0 -24 5079 5916 L 2 5 5079 5906 L 3 3 C 3 2 C 5 0 C 20 0 5099 5906 L 0 3 C -1 3 C -2 2 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 0 -35 5150 5927 L -4 3 5150 5911 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 4 3 C 30 0 5163 5907 L 0 -35 5207 5927 L 3 3 5207 5911 L 3 2 C 5 0 C 4 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -4 -2 C -5 0 C -3 2 C -3 3 C 0 -35 5239 5927 L 0 -17 5252 5916 L 2 -5 C 3 -2 C 5 0 C 3 2 C 5 5 C 0 -24 5270 5916 L 20 0 5282 5906 L 0 3 C -1 3 C -2 2 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 30 0 5314 5907 L 11 -24 5354 5916 L -10 -24 5375 5916 L -4 -7 C -3 -3 C -4 -2 C -1 0 C 20 0 5383 5906 L 0 3 C -1 3 C -2 2 C -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -35 5415 5927 L 0 -35 5428 5927 L -4 -2 5449 5916 L -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 2 5 C 0 4 C -2 5 C -3 3 C -3 2 C -5 0 C 7 -24 5472 5916 L -7 -24 5486 5916 L 6 -24 5486 5916 L -7 -24 5499 5916 L gsave newpath 62 5677 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -7.583E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325 DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E 7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74 113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D 50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C5 6464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE 7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD1 8C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7B A0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325 B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82C C8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75 DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2 F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A0306 4D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172E CD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54 642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D 40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A5 5454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE 6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF4 7C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF 9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369 A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813 B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38 CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85 E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2 F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E 87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34 B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D 4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F414181424283434385 44448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE 5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD4 6C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD 8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD 9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857 A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05 BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48 D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396 E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3 F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15 D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3D A1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D3365 38346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E 47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB4 5C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD 7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F1 8484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B 98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49 ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0C C0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359 D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6 E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEF FCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1D F4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B2141962243902345 8B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E 27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B94 4C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD 6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E5 7474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF 8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D 9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37 B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31C C4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869 D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2 ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF 0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325 DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E 7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74 113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D 50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C5 6464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE 7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD1 8C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7B A0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325 B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82C C8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75 DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2 F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A0306 4D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172E CD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54 642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D 40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A5 5454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE 6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF4 7C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF 9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369 A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813 B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38 CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85 E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2 F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E 87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34 B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D 4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F414181424283434385 44448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE 5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD4 6C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD 8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD 9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857 A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05 BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48 D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396 E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3 F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15 D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3D A1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D3365 38346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E 47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB4 5C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD 7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F1 8484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B 98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49 ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0C C0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359 D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6 E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEF FCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1D F4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B2141962243902345 8B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E 27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B94 4C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD 6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E5 7474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF 8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D 9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37 B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31C C4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869 D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2 ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF 0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325 DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E 7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74 113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D 50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C5 6464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE 7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD1 8C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7B A0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325 B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82C C8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75 DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2 F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A0306 4D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172E CD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54 642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D 40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A5 5454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE 6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF4 7C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF 9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369 A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813 B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38 CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85 E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2 F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E 87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34 B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D 4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F414181424283434385 44448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE 5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD4 6C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD 8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD 9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857 A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05 BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48 D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396 E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3 F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15 D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3D A1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D3365 38346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E 47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB4 5C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD 7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F1 8484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B 98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49 ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0C C0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359 D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6 E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEF FCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1D F4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B2141962243902345 8B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E 27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B94 4C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD 6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E5 7474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF 8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D 9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37 B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31C C4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869 D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2 ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF 0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325 DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E 7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74 113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D 50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C5 6464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE 7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD1 8C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7B A0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325 B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82C C8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75 DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2 F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A0306 4D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172E CD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54 642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D 40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A5 5454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE 6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF4 7C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF 9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369 A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813 B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38 CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85 E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2 F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E 87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34 B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D 4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F414181424283434385 44448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE 5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD4 6C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD 8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD 9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857 A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05 BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48 D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396 E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3 F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15 D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3D A1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D3365 38346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E 47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB4 5C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD 7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F1 8484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B 98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49 ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0C C0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359 D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6 E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEF FCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1D F4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B2141962243902345 8B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E 27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B94 4C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD 6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E5 7474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF 8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D 9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37 B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31C C4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869 D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2 ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF 0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325 DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E 7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74 113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D 50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C5 6464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE 7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD1 8C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7B A0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325 B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82C C8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75 DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2 F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A0306 4D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172E CD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54 642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D 40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A5 5454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE 6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF4 7C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF 9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369 A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813 B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38 CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85 E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2 F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E 87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34 B71C36B11D39AC1E3BA61F3DA1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D 4E305F4831614332633D336538346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F414181424283434385 44448845458A46468C47478E47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE 5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD4 6C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD 8080FF8181FA8282F68383F18484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD 9494A99595A49696A098989B98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857 A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05 BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48 D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396 E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3 F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15 D50C17E80D19FB0E1BF90F1DF4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3D A1203F9B21419622439023458B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D3365 38346832356A2C366C27376E27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E 47478E4949904A4A924B4B944C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB4 5C5CB65D5DB95E5EBB5F5FBD6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD 7070DF7171E17272E37373E57474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F1 8484ED8585E88686E48888DF8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B 98989B9999969A9A929B9B8D9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49 ACAC45ADAD40AEAE3CAFAF37B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0C C0C010C1C114C2C218C3C31CC4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359 D4D45DD5D561D6D665D8D869D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6 E8E8A6E9E9AAEAEAAEEBEBB2ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEF FCFCF3FDFDF7FEFEFBFFFFFF0000001301022702043A03064D040861050A74060C87070E87070E9B0910AE0A13C10B15D50C17E80D19FB0E1BF90F1D F4101FEE1121E91223E31325DE1428D8152AD3162CCD172ECD172EC71930C21A32BC1B34B71C36B11D39AC1E3BA61F3DA1203F9B2141962243902345 8B244885254A7F264C7A274E7A274E7429506F2A52692B54642C565E2D59592E5B532F5D4E305F4831614332633D336538346832356A2C366C27376E 27376E2139701C3A72163B74113C760B3D79063E7B003F7D40407F41418142428343438544448845458A46468C47478E47478E4949904A4A924B4B94 4C4C964D4D994E4E9B4F4F9D50509F5151A15252A35353A55454A85555AA5656AC5757AE5757AE5959B05A5AB25B5BB45C5CB65D5DB95E5EBB5F5FBD 6060BF6161C16262C36363C56464C86565CA6666CC6767CE6767CE6969D06A6AD26B6BD46C6CD76D6DD96E6EDB6F6FDD7070DF7171E17272E37373E5 7474E87575EA7676EC7777EE7777EE7979F07A7AF27B7BF47C7CF77D7DF97E7EFB7F7FFD8080FF8181FA8282F68383F18484ED8585E88686E48888DF 8888DF8989DB8A8AD68B8BD18C8CCD8D8DC88E8EC48F8FBF9090BB9191B69292B29393AD9494A99595A49696A098989B98989B9999969A9A929B9B8D 9C9C899D9D849E9E809F9F7BA0A077A1A172A2A26EA3A369A4A465A5A560A6A65BA8A857A8A857A9A952AAAA4EABAB49ACAC45ADAD40AEAE3CAFAF37 B0B033B1B12EB2B22AB3B325B4B420B5B51CB6B617B8B813B8B813B9B90EBABA0ABBBB05BCBC01BDBD03BEBE08BFBF0CC0C010C1C114C2C218C3C31C C4C420C5C524C6C628C8C82CC8C82CC9C930CACA34CBCB38CCCC3CCDCD40CECE44CFCF48D0D04CD1D151D2D255D3D359D4D45DD5D561D6D665D8D869 D8D869D9D96DDADA71DBDB75DCDC79DDDD7DDEDE81DFDF85E0E089E1E18DE2E291E3E396E4E49AE5E59EE6E6A2E8E8A6E8E8A6E9E9AAEAEAAEEBEBB2 ECECB6EDEDBAEEEEBEEFEFC2F0F0C6F1F1CAF2F2CEF3F3D2F4F4D6F5F5DAF6F6DFF8F8E3F8F8E3F9F9E7FAFAEBFBFBEFFCFCF3FDFDF7FEFEFBFFFFFF grestore 10375 0 62 5366 L 0 187 C -10375 0 C 0 -187 C -5 -1 5008 5615 L -1 -4 C 0 -3 C 1 -3 C 4 -2 C 6 -2 C 6 -1 C 3 -4 C 2 -3 C 0 -5 C -2 -3 C -2 -2 C -5 -2 C -7 0 C -5 2 C -1 2 C -2 3 C 0 5 C 2 3 C 3 4 C 5 1 C 7 2 C 3 2 C 2 3 C 0 3 C -2 4 C -5 1 C -7 0 C -2 -2 5037 5604 L 2 -2 C 2 2 C -2 2 C -2 -2 5037 5584 L 2 -2 C 2 2 C -2 2 C 0 -35 5079 5615 L 3 3 5079 5599 L 4 2 C 5 0 C 3 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -3 -2 C -5 0 C -4 2 C -3 3 C 0 -35 5111 5615 L 0 -17 5124 5604 L 2 -5 C 3 -2 C 5 0 C 4 2 C 5 5 C 0 -24 5143 5604 L 20 0 5155 5594 L 0 3 C -2 3 C -2 2 C -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -4 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 30 0 5187 5595 L 10 -24 5227 5604 L -10 -24 5247 5604 L -3 -7 C -4 -3 C -3 -2 C -2 0 C 21 0 5255 5594 L 0 3 C -2 3 C -2 2 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 4 3 C 0 -35 5287 5615 L 0 -35 5301 5615 L -3 -2 5321 5604 L -4 -3 C -2 -5 C 0 -4 C 2 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 1 5 C 0 4 C -1 5 C -4 3 C -3 2 C -5 0 C 7 -24 5344 5604 L -7 -24 5358 5604 L 7 -24 5358 5604 L -6 -24 5371 5604 L 30 0 5383 5595 L 0 -24 5427 5604 L 1 5 5427 5594 L 4 3 C 3 2 C 5 0 C 20 0 5447 5594 L 0 3 C -2 3 C -1 2 C -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -35 5497 5615 L -3 3 5497 5599 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C gsave newpath 62 5365 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -7.167E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC 0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF 001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF 006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF 00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA 09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA9 56FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5D A7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0C F7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00 FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900 FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00 FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000 C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C 00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD 0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF 002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF 007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF 00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE9 16FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C 67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4C B8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00 FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900 FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00 FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00 FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000 AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D 00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA 0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF 003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF 008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF 00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC 27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B 78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3B C9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900 FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00 FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00 FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000 F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000 A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA 0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB 0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF 004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF 009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF 00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB 38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A 89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2A D5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00 FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00 FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00 FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000 E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B0000960000910000 8D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB 0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF 000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF 005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF 00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF 00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA 49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF69 96FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1D E6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00 FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00 FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900 FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000 D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D0000880000830000830000 00008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC 0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF 001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF 006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF 00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA 09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA9 56FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5D A7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0C F7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00 FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900 FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00 FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000 C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C 00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD 0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF 002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF 007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF 00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE9 16FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C 67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4C B8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00 FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900 FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00 FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00 FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000 AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D 00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA 0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF 003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF 008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF 00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC 27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B 78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3B C9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900 FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00 FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00 FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000 F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000 A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA 0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB 0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF 004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF 009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF 00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB 38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A 89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2A D5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00 FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00 FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00 FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000 E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B0000960000910000 8D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB 0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF 000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF 005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF 00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF 00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA 49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF69 96FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1D E6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00 FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00 FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900 FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000 D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D0000880000830000830000 00008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC 0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF 001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF 006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF 00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA 09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA9 56FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5D A7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0C F7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00 FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900 FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00 FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000 C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C 00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD 0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF 002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF 007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF 00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE9 16FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C 67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4C B8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00 FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900 FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00 FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00 FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000 AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D 00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA 0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF 003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF 008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF 00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC 27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B 78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3B C9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900 FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00 FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00 FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000 F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000 A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA 0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB 0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF 004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF 009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF 00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB 38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A 89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2A D5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00 FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00 FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00 FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000 E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B0000960000910000 8D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB 0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF 000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF 005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF 00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF 00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA 49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF69 96FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1D E6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00 FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00 FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900 FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000 D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D0000880000830000830000 00008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC 0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF 001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF 006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF 00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA 09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA9 56FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5D A7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0C F7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00 FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900 FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00 FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000 C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C 00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD 0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF 002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF 007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF 00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE9 16FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C 67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4C B8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00 FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900 FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00 FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00 FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000 AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D 00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA 0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF 003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF 008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF 00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC 27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B 78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3B C9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900 FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00 FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00 FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000 F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000 A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA 0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB 0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF 004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF 009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF 00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB 38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A 89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2A D5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00 FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00 FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00 FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000 E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B0000960000910000 8D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB 0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF 000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF 005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF 00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF 00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA 49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF69 96FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1D E6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00 FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00 FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900 FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000 D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D0000880000830000830000 00008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC 0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF 001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF 006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF 00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA 09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA9 56FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5D A7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0C F7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00 FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900 FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00 FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000 C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C 00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD 0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF 002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF 007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF 00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE9 16FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C 67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4C B8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00 FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900 FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00 FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00 FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000 AE0000A90000A40000A00000A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D 00009D0000A10000A60000AA0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA 0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF 003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF 008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF 00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC 27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B 78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3B C9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900 FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00 FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00 FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000 F40000F00000EB0000E60000E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000 A000009B00009600009100008D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA 0000AE0000B20000B70000BB0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB 0000FF0001FF0005FF0009FF000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF 004DFF0051FF0056FF005AFF005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF 009AFF009EFF00A2FF00A6FF00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF 00EBFF00EFFF00F3FF00F7FF00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB 38FFC73CFFC341FFBE45FFBA49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A 89FF768DFF7291FF6E96FF6996FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2A D5FF2ADAFF25DEFF21E2FF1DE6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00 FFD800FFD300FFCF00FFCB00FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00 FF8700FF8300FF7E00FF7A00FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00 FF3600FF3200FF2E00FF2900FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000 E60000E20000DD0000D80000D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B0000960000910000 8D000088000083000083000000008300008300008800008C00009000009400009900009D00009D0000A10000A60000AA0000AE0000B20000B70000BB 0000BF0000C40000C80000CC0000D00000D50000D90000DD0000DD0000E20000E60000EA0000EE0000F30000F70000FB0000FF0001FF0005FF0009FF 000DFF0012FF0016FF001AFF001AFF001EFF0023FF0027FF002BFF002FFF0034FF0038FF003CFF0040FF0045FF0049FF004DFF0051FF0056FF005AFF 005AFF005EFF0062FF0067FF006BFF006FFF0073FF0078FF007CFF0080FF0084FF0089FF008DFF0091FF0095FF009AFF009AFF009EFF00A2FF00A6FF 00ABFF00AFFF00B3FF00B8FF00BCFF00C0FF00C4FF00C9FF00CDFF00D1FF00D5FF00DAFF00DAFF00DEFF00E2FF00E6FF00EBFF00EFFF00F3FF00F7FF 00FCFF00FFFF01FFFE05FFFA09FFF60EFFF112FFED16FFE916FFE91AFFE51FFFE023FFDC27FFD82BFFD430FFCF34FFCB38FFC73CFFC341FFBE45FFBA 49FFB64DFFB252FFAD56FFA956FFA95AFFA55EFFA163FF9C67FF986BFF946FFF9074FF8B78FF877CFF8380FF7F85FF7A89FF768DFF7291FF6E96FF69 96FF699AFF659EFF61A2FF5DA7FF58ABFF54AFFF50B3FF4CB8FF47BCFF43C0FF3FC4FF3BC9FF36CDFF32D1FF2ED5FF2AD5FF2ADAFF25DEFF21E2FF1D E6FF19EBFF14EFFF10F3FF0CF7FF08FCFF03FFFE00FFFA00FFF500FFF100FFED00FFE900FFE900FFE400FFE000FFDC00FFD800FFD300FFCF00FFCB00 FFC700FFC200FFBE00FFBA00FFB600FFB100FFAD00FFA900FFA900FFA500FFA000FF9C00FF9800FF9400FF8F00FF8B00FF8700FF8300FF7E00FF7A00 FF7600FF7200FF6D00FF6900FF6900FF6500FF6100FF5C00FF5800FF5400FF5000FF4B00FF4700FF4300FF3F00FF3A00FF3600FF3200FF2E00FF2900 FF2900FF2500FF2100FF1D00FF1800FF1400FF1000FF0C00FF0700FF0300FE0000F90000F40000F00000EB0000E60000E60000E20000DD0000D80000 D30000CF0000CA0000C50000C10000BC0000B70000B20000AE0000A90000A40000A00000A000009B00009600009100008D0000880000830000830000 grestore 10375 0 62 5054 L 0 187 C -10375 0 C 0 -187 C -2 -5 4987 5292 L -3 -4 C -5 -1 C -2 0 C -5 1 C -4 4 C -1 5 C 0 1 C 1 5 C 4 4 C 5 1 C 2 0 C 5 -1 C 3 -4 C 2 -6 C 0 -9 C -2 -8 C -3 -5 C -5 -2 C -4 0 C -5 2 C -2 3 C -2 -2 5002 5292 L 2 -2 C 1 2 C -1 2 C -2 -2 5002 5272 L 2 -2 C 1 2 C -1 2 C 0 -36 5044 5292 L 3 3 5044 5287 L 3 2 C 5 0 C 4 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -4 -2 C -5 0 C -3 2 C -3 3 C 0 -17 5076 5292 L 1 -5 C 4 -2 C 5 0 C 3 2 C 5 5 C 0 -24 5094 5292 L 0 -24 5108 5292 L 1 5 5108 5282 L 4 3 C 3 2 C 5 0 C 0 -36 5129 5292 L 4 3 5129 5287 L 3 2 C 5 0 C 4 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -4 -2 C -5 0 C -3 2 C -4 3 C 0 -35 5161 5303 L 20 0 5173 5282 L 0 3 C -1 3 C -2 2 C -3 2 C -6 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 6 0 C 3 2 C 3 3 C 30 0 5205 5283 L 0 -35 5249 5303 L 3 3 5249 5287 L 3 2 C 5 0 C 4 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -4 -2 C -5 0 C -3 2 C -3 3 C 0 -35 5281 5303 L 0 -17 5294 5292 L 2 -5 C 3 -2 C 5 0 C 3 2 C 5 5 C 0 -24 5312 5292 L 20 0 5324 5282 L 0 3 C -1 3 C -2 2 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 30 0 5356 5283 L 0 -27 5418 5292 L -1 -5 C -2 -2 C -3 -2 C -5 0 C -4 2 C -3 3 5418 5287 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 0 -24 5432 5292 L 1 5 5432 5282 L 4 3 C 3 2 C 5 0 C 20 0 5452 5282 L 0 3 C -2 3 C -1 2 C -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 20 0 5482 5282 L 0 3 C -1 3 C -2 2 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 0 -24 5514 5292 L 5 5 5514 5285 L 3 2 C 6 0 C 3 -2 C 2 -5 C 0 -17 C gsave newpath 62 5053 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -6.750E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E100020110022120024130026 14002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D 51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C 72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC 5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD 3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED 1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D5 0419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F97034193 03439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51 026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F 00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B900 00BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD00 00DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00000000010002020004030006 04000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F 17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E0067 62006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C0093 6B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B3 4A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D3 2C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F2 0B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C7 0422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85 034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A017246017443 01744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04 009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C000 00C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E500 00E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F 07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E0037 22003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F0073 74007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B0094690096670098660099 64009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA 4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D9 2500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F9 0501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9 042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B025377 02537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38 017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A300 00A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C800 00CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC00 00EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B0015 0C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F0043 34004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F0080 7D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A0 5F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF 3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF 1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE 050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB 0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D 025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B 018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB00 00AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D000 00D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F200 00F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E 10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D400050 4500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A0085780087 78008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A5 5800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C6 3700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E6 1700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E0 0511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1 033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F 02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D 018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B300 00B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D500 00D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00 00000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E100020110022120024130026 14002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D 51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C 72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC 5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD 3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED 1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D5 0419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F97034193 03439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51 026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F 00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B900 00BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD00 00DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00000000010002020004030006 04000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F 17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E0067 62006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C0093 6B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B3 4A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D3 2C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F2 0B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C7 0422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85 034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A017246017443 01744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04 009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C000 00C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E500 00E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F 07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E0037 22003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F0073 74007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B0094690096670098660099 64009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA 4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D9 2500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F9 0501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9 042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B025377 02537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38 017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A300 00A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C800 00CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC00 00EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B0015 0C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F0043 34004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F0080 7D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A0 5F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF 3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF 1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE 050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB 0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D 025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B 018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB00 00AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D000 00D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F200 00F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E 10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D400050 4500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A0085780087 78008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A5 5800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C6 3700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E6 1700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E0 0511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1 033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F 02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D 018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B300 00B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D500 00D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00 00000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E100020110022120024130026 14002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D 51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C 72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC 5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD 3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED 1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D5 0419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F97034193 03439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51 026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F 00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B900 00BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD00 00DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00000000010002020004030006 04000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F 17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E0067 62006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C0093 6B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B3 4A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D3 2C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F2 0B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C7 0422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85 034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A017246017443 01744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04 009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C000 00C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E500 00E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F 07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E0037 22003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F0073 74007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B0094690096670098660099 64009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA 4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D9 2500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F9 0501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9 042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B025377 02537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38 017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A300 00A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C800 00CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC00 00EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B0015 0C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F0043 34004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F0080 7D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A0 5F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF 3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF 1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE 050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB 0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D 025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B 018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB00 00AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D000 00D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F200 00F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E 10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D400050 4500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A0085780087 78008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A5 5800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C6 3700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E6 1700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E0 0511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1 033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F 02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D 018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B300 00B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D500 00D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00 00000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E100020110022120024130026 14002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D 51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C 72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC 5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD 3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED 1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D5 0419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F97034193 03439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51 026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F 00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B900 00BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD00 00DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00000000010002020004030006 04000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F 17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E0067 62006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C0093 6B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B3 4A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D3 2C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F2 0B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C7 0422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85 034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A017246017443 01744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04 009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C000 00C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E500 00E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F 07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E0037 22003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F0073 74007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B0094690096670098660099 64009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA 4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D9 2500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F9 0501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9 042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B025377 02537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38 017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A300 00A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C800 00CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC00 00EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B0015 0C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F0043 34004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F0080 7D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A0 5F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF 3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF 1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE 050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB 0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D 025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B 018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB00 00AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D000 00D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F200 00F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E 10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D400050 4500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A0085780087 78008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A5 5800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C6 3700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E6 1700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E0 0511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1 033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F 02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D 018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B300 00B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D500 00D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00 00000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E100020110022120024130026 14002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D 51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C 72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC 5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD 3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED 1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D5 0419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F97034193 03439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51 026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F 00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B900 00BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD00 00DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00000000010002020004030006 04000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F 17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E0067 62006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C0093 6B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B3 4A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D3 2C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F2 0B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C7 0422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85 034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A017246017443 01744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04 009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C000 00C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E500 00E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F 07000F0900110A00130B00150C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E0037 22003A27003D2B00402F004334004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F0073 74007778007A7C007D7F00807D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B0094690096670098660099 64009B62009D60009F5F00A05F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA 4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D9 2500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F9 0501F80503F50506F10508EE050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9 042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B025377 02537702557402577002596D025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38 017D35017F3101812E01832B018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A300 00A50000A70000A90000AB0000AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C800 00CA0000CC0000CE0000D00000D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC00 00EC0000EE0000F00000F20000F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B0015 0C00170D001A0E001C0F001E10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F0043 34004738004A3C004D4000504500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F0080 7D00827C00837A008578008778008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A0 5F00A05D00A25B00A45A00A55800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF 3E00C13D00C23B00C43900C63700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF 1E00E11C00E31A00E51900E61700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE 050AEA050CE7050EE30511E00511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB 0332AB0334A80336A50338A1033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D 025C69025E6602606202625F02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B 018527018824018A20018C1D018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB00 00AD0000AF0000B10000B30000B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D000 00D00000D20000D30000D50000D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F200 00F40000F60000F80000FA0000000001000202000403000604000905000B06000D07000F07000F0900110A00130B00150C00170D001A0E001C0F001E 10002011002212002413002614002915002B16002D17002F17002F1900311A00331E003722003A27003D2B00402F004334004738004A3C004D400050 4500534900574D005A51005D51005D5600605A00635E006762006A67006D6B00706F007374007778007A7C007D7F00807D00827C00837A0085780087 78008777008875008A73008C72008D70008F6E00916C00936B009469009667009866009964009B62009D60009F5F00A05F00A05D00A25B00A45A00A5 5800A75600A95400AB5300AC5100AE4F00B04E00B14C00B34A00B54900B64700B84500BA4500BA4300BC4200BD4000BF3E00C13D00C23B00C43900C6 3700C83600C93400CB3200CD3100CE2F00D02D00D22C00D32C00D32A00D52800D72600D92500DA2300DC2100DE2000DF1E00E11C00E31A00E51900E6 1700E81500EA1400EB1200ED1200ED1000EF0E00F10D00F20B00F40900F60800F70600F90501F80503F50506F10508EE050AEA050CE7050EE30511E0 0511E00413DC0415D90417D50419D2041CCE041ECB0420C70422C40424C00427BD0429B9042BB6042DB2042FAF0332AB0332AB0334A80336A50338A1 033A9E033D9A033F9703419303439003458C034889034A85034C82034E7E03507B02537702537702557402577002596D025C69025E6602606202625F 02645B026758026954026B51026D4D026F4A01724601744301744301763F01783C017A38017D35017F3101812E01832B018527018824018A20018C1D 018E1900901600931200950F00950F00970B009908009B04009E0100A00000A20000A30000A50000A70000A90000AB0000AD0000AF0000B10000B300 00B30000B50000B70000B90000BB0000BC0000BE0000C00000C20000C40000C60000C80000CA0000CC0000CE0000D00000D00000D20000D30000D500 00D70000D90000DB0000DD0000DF0000E10000E30000E50000E70000E90000EB0000EC0000EC0000EE0000F00000F20000F40000F60000F80000FA00 grestore 10375 0 62 4742 L 0 187 C -10375 0 C 0 -187 C 3 2 5106 4985 L 5 5 C 0 -36 C -6 -2 5145 4992 L -3 -5 C -2 -9 C 0 -5 C 2 -8 C 3 -5 C 6 -2 C 3 0 C 5 2 C 3 5 C 2 8 C 0 5 C -2 9 C -3 5 C -5 2 C -3 0 C -1 -2 5171 4980 L 1 -2 C 2 2 C -2 2 C -1 -2 5171 4960 L 1 -2 C 2 2 C -2 2 C 0 -27 5232 4980 L -2 -5 C -1 -2 C -4 -1 C -5 0 C -3 1 C -3 3 5232 4975 L -4 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -4 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -24 5264 4980 L -4 3 5264 4975 L -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -4 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 0 -24 5277 4980 L 5 5 5277 4973 L 4 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 5 5 5296 4973 L 3 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 0 -24 5328 4980 L 5 5 5328 4973 L 3 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 5 5 5346 4973 L 3 2 C 6 0 C 3 -2 C 2 -5 C 0 -17 C 0 -24 5396 4980 L -3 3 5396 4975 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C gsave newpath 62 4741 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -6.333E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E000064 00006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD 0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B000011 00001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A 00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE 0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C000021000027 00002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B 00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C000032000037 00003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A1 0000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E 00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B7 0000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E000064 00006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD 0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B000011 00001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A 00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE 0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C000021000027 00002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B 00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C000032000037 00003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A1 0000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E 00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B7 0000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E000064 00006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD 0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B000011 00001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A 00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE 0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C000021000027 00002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B 00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C000032000037 00003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A1 0000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E 00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B7 0000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E000064 00006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD 0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B000011 00001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A 00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE 0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C000021000027 00002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B 00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C000032000037 00003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A1 0000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E 00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B7 0000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E000064 00006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD 0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B000011 00001600001C00002100002700002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A 00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE 0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C000021000027 00002700002C00003200003700003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B 00009000009600009B0000A10000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C000032000037 00003D00004300004800004E00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A1 0000A60000AC0000B20000B70000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00000000000600000B00001100001600001C00002100002700002700002C00003200003700003D00004300004800004E 00005300005900005E00006400006900006F00007500007A00007A00008000008500008B00009000009600009B0000A10000A60000AC0000B20000B7 0000BD0000C20000C80000CD0000CD0000D30000D80000DE0000E40000E90000EF0000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF grestore 10375 0 62 4430 L 0 187 C -10375 0 C 0 -187 C 4 2 4957 4673 L 5 5 C 0 -36 C 3 2 4991 4673 L 5 5 C 0 -36 C -2 -2 5023 4668 L 2 -2 C 1 2 C -1 2 C -2 -2 5023 4648 L 2 -2 C 1 2 C -1 2 C 0 -27 5083 4668 L -1 -5 C -2 -2 C -4 -1 C -5 0 C -3 1 C -3 3 5083 4663 L -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -24 5115 4668 L -3 3 5115 4663 L -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -24 5129 4668 L 5 5 5129 4661 L 3 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 5 5 5147 4661 L 3 2 C 5 0 C 4 -2 C 2 -5 C 0 -17 C 0 -24 5179 4668 L 5 5 5179 4661 L 3 2 C 5 0 C 4 -2 C 1 -5 C 0 -17 C 5 5 5197 4661 L 4 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 0 -24 5248 4668 L -4 3 5248 4663 L -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -4 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 30 0 5261 4659 L 0 -24 5332 4668 L 5 5 5332 4661 L 3 2 C 5 0 C 4 -2 C 1 -5 C 0 -17 C -3 -2 5370 4668 L -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 2 5 C 0 4 C -2 5 C -3 3 C -4 2 C -5 0 C 0 -36 5423 4680 L 3 3 5423 4663 L 3 2 C 5 0 C 4 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -4 -2 C -5 0 C -3 2 C -3 3 C 0 -36 5454 4680 L 0 -24 5486 4668 L -3 3 5486 4663 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C -3 3 5518 4663 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 0 -36 5530 4680 L -17 -17 5547 4668 L 12 -14 5537 4658 L gsave newpath 62 4429 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -5.917E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF 0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E2 0000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF000080000082000085000087 00008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA 0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E9 0000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F000092 00009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C2 0000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A 00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC 0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A5 0000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D7 0000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF 0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E2 0000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF000080000082000085000087 00008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA 0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E9 0000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F000092 00009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C2 0000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A 00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC 0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A5 0000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D7 0000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF 0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E2 0000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF000080000082000085000087 00008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA 0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E9 0000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F000092 00009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C2 0000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A 00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC 0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A5 0000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D7 0000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF 0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E2 0000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF000080000082000085000087 00008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA 0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E9 0000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F000092 00009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C2 0000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A 00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC 0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A5 0000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D7 0000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF 00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF 0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E2 0000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB 3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E 5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000 BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300 FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433 FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301 FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70B C3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4B FFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8A FFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCB FFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF000080000082000085000087 00008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA 0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E9 0000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B4 5100AE5100A85100A251009D51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C640046 6900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000 CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400 FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948 FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300 EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118 D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56 FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97 FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9 FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F000092 00009200009500009700009A00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C2 0000C40000C70000CA0000CC0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F4 0500FA0900FE0F00F91400F31900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D 51009750009150008B50008650008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E 7A002E7F00298400238A001D8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000 E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00 FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346 FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300 D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522 E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63 FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5 FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7 FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A 00009D00009F0000A20000A50000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC 0000CF0000D20000D40000D70000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F3 1900ED1E00E72300E22800DC2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B500086 50008650008050007A5000754F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D 8F00179500119A000B9F0005A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000 FF0000FF0100FF0600FF0C00FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610F FF6615FF6B1AFF701FFF7524FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32D FFA32DFFA326FFA320FFA31AFFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300 B3A300ABA300A3A300A8A300ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30 FFFF33FFFF37FFFF3AFFFF3DFFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71 FFFF75FFFF78FFFF7CFFFF7FFFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3 FFFFB3FFFFB6FFFFBAFFFFBDFFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1 FFFFF5FFFFF8FFFFFCFFFFFF00008000008200008500008700008A00008D00008F00009200009200009500009700009A00009D00009F0000A20000A5 0000A70000AA0000AD0000AF0000B20000B40000B70000BA0000BA0000BC0000BF0000C20000C40000C70000CA0000CC0000CF0000D20000D40000D7 0000DA0000DC0000DF0000E20000E20000E40000E70000E90000EC0000EF0000F10000F40500FA0900FE0F00F91400F31900ED1E00E72300E22800DC 2800DC2D00D63200D03800CB3D00C54200BF4700B94C00B45100AE5100A85100A251009D51009750009150008B50008650008650008050007A500075 4F006F4F00694F00634F005E5400585900525F004C6400466900406F003A7400347A002E7A002E7F00298400238A001D8F00179500119A000B9F0005 A50000AA0000B00000B60000BB0000C10000C70000CC0000CC0000D20000D80000DD0000E30000E90000FF0000FF0000FF0000FF0100FF0600FF0C00 FF1200FF1800FF1D00FF2300FF2300FF2900FF2F00FF3400FF3A00FF4000FF4600FF4B00FF5100FF5605FF5B0AFF610FFF6615FF6B1AFF701FFF7524 FF7524FF7A29FF7F2EFF8433FF8939FF8F3EFF9443FF9948FF9E4DFFA352FFA34CFFA346FFA33FFFA339FFA333FFA32DFFA32DFFA326FFA320FFA31A FFA314FFA30DFFA307FFA301FFA300FFA300FDA300F5A300EDA300E4A300DCA300D4A300D4A300CCA300C4A300BCA300B3A300ABA300A3A300A8A300 ADA400B3AA04B8B107BEB70BC3BE0EC8C411CECB15D3D118D3D118D8D81CDEDE1FE3E522E9EB26EEF229F3F82DF9FF30FFFF33FFFF37FFFF3AFFFF3D FFFF41FFFF44FFFF48FFFF4BFFFF4BFFFF4FFFFF52FFFF56FFFF59FFFF5DFFFF60FFFF63FFFF67FFFF6AFFFF6EFFFF71FFFF75FFFF78FFFF7CFFFF7F FFFF7FFFFF83FFFF86FFFF8AFFFF8DFFFF90FFFF94FFFF97FFFF9BFFFF9EFFFFA2FFFFA5FFFFA9FFFFACFFFFB0FFFFB3FFFFB3FFFFB6FFFFBAFFFFBD FFFFC1FFFFC4FFFFC8FFFFCBFFFFCFFFFFD2FFFFD6FFFFD9FFFFDCFFFFE0FFFFE3FFFFE7FFFFE7FFFFEAFFFFEEFFFFF1FFFFF5FFFFF8FFFFFCFFFFFF grestore 10375 0 62 4118 L 0 187 C -10375 0 C 0 -187 C 3 2 4956 4361 L 5 5 C 0 -36 C 0 2 4986 4359 L 1 3 C 2 2 C 3 2 C 7 0 C 4 -2 C 1 -2 C 2 -3 C 0 -3 C -2 -4 C -3 -5 C -17 -17 C 24 0 C -2 -2 5021 4356 L 2 -1 C 2 1 C -2 2 C -2 -2 5021 4336 L 2 -2 C 2 2 C -2 2 C 0 -27 5082 4356 L -2 -5 C -2 -2 C -3 -1 C -5 0 C -4 1 C -4 3 5082 4351 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 4 3 C 0 -24 5095 4356 L 2 5 5095 4346 L 3 3 C 3 2 C 5 0 C 0 -24 5117 4356 L 5 5 5117 4349 L 3 2 C 5 0 C 4 -2 C 1 -5 C 0 -17 C 30 0 5149 4347 L 0 -24 5192 4356 L 2 5 5192 4346 L 3 3 C 4 2 C 5 0 C 20 0 5213 4346 L 0 3 C -2 4 C -2 1 C -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -4 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 0 -36 5263 4368 L -3 3 5263 4351 L -4 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -4 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 31 0 5276 4347 L 0 -36 5320 4368 L 3 3 5320 4351 L 4 2 C 5 0 C 3 -2 C 4 -3 C 1 -5 C 0 -4 C -1 -5 C -4 -3 C -3 -2 C -5 0 C -4 2 C -3 3 C 0 -36 5352 4368 L 0 -17 5365 4356 L 2 -5 C 3 -2 C 5 0 C 4 2 C 5 5 C 0 -24 5384 4356 L 20 0 5396 4346 L 0 3 C -2 4 C -2 1 C -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -4 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C 30 0 5428 4347 L 6 -24 5470 4356 L -7 -24 5483 4356 L 7 -24 5483 4356 L -6 -24 5496 4356 L 0 -36 5508 4368 L 5 5 5508 4349 L 4 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 0 -29 5542 4368 L 1 -5 C 4 -2 C 3 0 C 12 0 5537 4356 L gsave newpath 62 4117 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -5.500E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD00 00B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C300 45C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000 BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007 F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031 EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005B DC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082 CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000AC BF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6 B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FD A300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF 9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FF D59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00 005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D300 00D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B000 5FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700 D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010 F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003A E8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061 D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008B CB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5 BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DF AE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FF A100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FF A120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FF E3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00 005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F000 00F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C00729600 7890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00 F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019 F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040 E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006A D6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094 C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BE B900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5 AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF 9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FF AF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FF EED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700 006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F300 19EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D00 9276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300 FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001F F00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049 E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073 D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009D C5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4 B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EE A800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF 9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFF B95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FF FBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700 009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC00 32D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300 A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001 FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028 ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052 DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007C D1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3 C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CD B300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7 A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF 9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FF C77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF 000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD00 00B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C300 45C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000 BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007 F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031 EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005B DC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082 CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000AC BF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6 B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FD A300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF 9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FF D59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00 005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D300 00D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B000 5FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700 D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010 F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003A E8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061 D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008B CB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5 BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DF AE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FF A100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FF A120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FF E3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00 005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F000 00F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C00729600 7890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00 F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019 F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040 E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006A D6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094 C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BE B900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5 AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF 9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FF AF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FF EED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700 006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F300 19EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D00 9276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300 FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001F F00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049 E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073 D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009D C5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4 B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EE A800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF 9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFF B95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FF FBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700 009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC00 32D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300 A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001 FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028 ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052 DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007C D1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3 C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CD B300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7 A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF 9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FF C77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF 000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD00 00B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C300 45C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000 BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007 F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031 EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005B DC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082 CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000AC BF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6 B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FD A300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF 9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FF D59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00 005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D300 00D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B000 5FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700 D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010 F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003A E8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061 D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008B CB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5 BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DF AE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FF A100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FF A120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FF E3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00 005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F000 00F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C00729600 7890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00 F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019 F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040 E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006A D6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094 C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BE B900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5 AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF 9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FF AF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FF EED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700 006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F300 19EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D00 9276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300 FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001F F00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049 E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073 D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009D C5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4 B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EE A800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF 9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFF B95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FF FBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700 009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC00 32D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300 A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001 FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028 ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052 DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007C D1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3 C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CD B300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7 A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF 9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FF C77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF 000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD00 00B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C300 45C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000 BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007 F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031 EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005B DC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082 CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000AC BF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6 B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FD A300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF 9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FF D59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00 005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D300 00D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B000 5FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700 D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010 F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003A E8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061 D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008B CB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5 BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DF AE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FF A100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FF A120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FF E3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00 005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F000 00F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C00729600 7890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00 F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019 F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040 E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006A D6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094 C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BE B900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5 AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF 9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FF AF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FF EED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700 006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F300 19EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D00 9276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300 FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001F F00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049 E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073 D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009D C5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4 B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EE A800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF 9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFF B95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FF FBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700 009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC00 32D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300 A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001 FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028 ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052 DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007C D1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3 C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CD B300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7 A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF 9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FF C77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF 000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD00 00B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C300 45C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000 BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007 F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031 EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005B DC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082 CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000AC BF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6 B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FD A300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF 9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FF D59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00 005000005400005800005C00005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D300 00D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B000 5FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700 D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010 F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003A E8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061 D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008B CB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5 BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DF AE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FF A100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FF A120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FF E3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00 005C00006000006300006700006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F000 00F90005FA000BF60012F30019EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C00729600 7890007F89008583008B7D009276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00 F11700F41000F70900FB0300FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019 F40019F3001BF2001DF1001FF00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040 E50043E40045E30047E30049E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006A D6006CD5006FD50071D40073D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094 C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BE B900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5 AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF 9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FF AF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FF EED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700 006B00007300007D00008700009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F300 19EF001FE90025E2002CDC0032D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D00 9276009870009E6A00A56300A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300 FB0300FC0000FC0000FC0001FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001F F00022F00024EF0026EE0028ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049 E2004BE1004EE00050DF0052DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073 D30075D20077D1007AD1007CD1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009D C5009DC4009FC400A1C300A3C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4 B600C7B600C9B500CBB400CDB300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EE A800F0A700F3A600F5A500F7A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF 9A00FF9900FF9800FF9700FF9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFF B95BFFBD63FFC06BFFC474FFC77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FF FBFBFFFDFDFFFEFEFFFFFFFF000000002600004800004C00005000005400005800005C00005C00006000006300006700006B00007300007D00008700 009000009A0000A30000AD0000B60000C00000C90000D30000D30000DD0000E60000F00000F90005FA000BF60012F30019EF001FE90025E2002CDC00 32D60039CF003FC90045C30045C3004CBC0052B60058B0005FA90065A3006B9C007296007890007F89008583008B7D009276009870009E6A00A56300 A56300AB5D00B25600B85000BE4A00C54300CB3D00D13700D83000DE2A00E42400EB1D00F11700F41000F70900FB0300FB0300FC0000FC0000FC0001 FC0001FB0003FB0005FA0007F90009F8000CF7000EF70010F60012F50014F40017F40019F40019F3001BF2001DF1001FF00022F00024EF0026EE0028 ED002AED002DEC002FEB0031EA0033EA0035E90038E8003AE8003AE7003CE6003EE60040E50043E40045E30047E30049E2004BE1004EE00050DF0052 DF0054DE0056DD0059DC005BDC005BDC005DDB005FDA0061D90064D80066D80068D7006AD6006CD5006FD50071D40073D30075D20077D1007AD1007C D1007CD0007ECF0080CE0082CE0085CD0087CC0089CB008BCB008DCA0090C90092C80094C70096C70098C6009BC5009DC5009DC4009FC400A1C300A3 C200A6C100A8C000AAC000ACBF00AEBE00B1BD00B3BD00B5BC00B7BB00B9BA00BCB900BEB900BEB900C0B800C2B700C4B600C7B600C9B500CBB400CD B300CFB200D2B200D4B100D6B000D8AF00DAAF00DDAE00DFAE00DFAD00E1AC00E3AC00E5AB00E8AA00EAA900ECA800EEA800F0A700F3A600F5A500F7 A500F9A400FBA400FCA300FDA300FDA300FFA200FFA200FFA100FFA000FF9F00FF9E00FF9D00FF9D00FF9C00FF9B00FF9A00FF9900FF9800FF9700FF 9700FF9700FF9600FF9500FF9400FF9606FF9A0FFF9D17FFA120FFA428FFA830FFAB39FFAF41FFB24AFFB652FFB95BFFB95BFFBD63FFC06BFFC474FF C77CFFCB85FFCE8DFFD296FFD59EFFD9A6FFDCAFFFE0B7FFE3C0FFE7C8FFEAD1FFEED9FFEED9FFF1E2FFF5EAFFF8F2FFFBFBFFFDFDFFFEFEFFFFFFFF grestore 10375 0 62 3806 L 0 187 C -10375 0 C 0 -187 C 3 2 4961 4049 L 5 5 C 0 -36 C 19 0 4992 4056 L -10 -14 C 5 0 C 3 -1 C 2 -2 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -5 -2 C -5 0 C -6 2 C -1 2 C -2 3 C -2 -2 5026 4044 L 2 -1 C 2 1 C -2 2 C -2 -2 5026 4024 L 2 -2 C 2 2 C -2 2 C 0 -36 5068 4056 L 3 3 5068 4039 L 4 2 C 5 0 C 3 -2 C 4 -3 C 1 -5 C 0 -4 C -1 -5 C -4 -3 C -3 -2 C -5 0 C -4 2 C -3 3 C 0 -36 5100 4056 L 0 -36 5113 4056 L -17 -17 5130 4044 L 12 -14 5120 4034 L 30 0 5142 4036 L 0 -36 5186 4056 L 3 3 5186 4039 L 3 2 C 5 0 C 4 -2 C 3 -3 C 2 -5 C 0 -4 C -2 -5 C -3 -3 C -4 -2 C -5 0 C -3 2 C -3 3 C 0 -36 5218 4056 L 0 -17 5231 4044 L 2 -5 C 3 -2 C 5 0 C 3 2 C 6 5 C 0 -24 5250 4044 L 30 0 5263 4036 L -3 3 5325 4039 L -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 11 -24 5333 4044 L -10 -24 5354 4044 L -4 -6 C -3 -4 C -4 -1 C -1 0 C 0 -24 5382 4044 L -3 3 5382 4039 L -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 0 -24 5396 4044 L 5 5 5396 4037 L 3 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 30 0 5428 4036 L 10 -24 5468 4044 L -10 -24 5488 4044 L -3 -6 C -4 -4 C -3 -1 C -2 0 C 21 0 5496 4034 L 0 3 C -2 4 C -2 1 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -4 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 4 3 C 0 -36 5528 4056 L 0 -36 5542 4056 L gsave newpath 62 3805 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -5.083E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A 00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D000070000073000077 00007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B0 0000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED 0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF 002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF 0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF 00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF 00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE3 1FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA6 59FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D 96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30 D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A 00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D000040000043000046 00004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D000080 00008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD 0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA 0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF 0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF 0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF 00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF 00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD6 29FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D 66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60 A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23 DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D000010000013000016 00001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D000050 00005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D 00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA 0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF 0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF 0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF 0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF 00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF 00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC 36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF90 72FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53 AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16 E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D000020 00002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D 00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A 00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D7 0000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF 0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF 0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF 008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF 00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC 06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC0 43FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF83 7FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46 B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0D F5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D 00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A 00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A7 0000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E0 0000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF 0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF 005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF 0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF 00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF0 13FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB3 4FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF76 89FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3D C5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF00 00000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A 00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D000070000073000077 00007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B0 0000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED 0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF 002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF 0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF 00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF 00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE3 1FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA6 59FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D 96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30 D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A 00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D000040000043000046 00004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D000080 00008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD 0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA 0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF 0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF 0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF 00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF 00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD6 29FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D 66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60 A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23 DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D000010000013000016 00001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D000050 00005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D 00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA 0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF 0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF 0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF 0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF 00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF 00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC 36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF90 72FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53 AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16 E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D000020 00002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D 00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A 00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D7 0000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF 0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF 0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF 008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF 00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC 06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC0 43FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF83 7FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46 B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0D F5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D 00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A 00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A7 0000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E0 0000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF 0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF 005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF 0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF 00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF0 13FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB3 4FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF76 89FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3D C5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF00 00000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A 00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D000070000073000077 00007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B0 0000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED 0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF 002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF 0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF 00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF 00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE3 1FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA6 59FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D 96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30 D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A 00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D000040000043000046 00004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D000080 00008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD 0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA 0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF 0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF 0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF 00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF 00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD6 29FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D 66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60 A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23 DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D000010000013000016 00001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D000050 00005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D 00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA 0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF 0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF 0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF 0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF 00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF 00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC 36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF90 72FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53 AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16 E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D000020 00002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D 00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A 00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D7 0000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF 0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF 0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF 008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF 00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC 06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC0 43FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF83 7FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46 B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0D F5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D 00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A 00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A7 0000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E0 0000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF 0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF 005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF 0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF 00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF0 13FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB3 4FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF76 89FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3D C5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF00 00000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A 00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D000070000073000077 00007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B0 0000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED 0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF 002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF 0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF 00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF 00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE3 1FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA6 59FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D 96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30 D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A 00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D000040000043000046 00004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D000080 00008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD 0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA 0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF 0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF 0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF 00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF 00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD6 29FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D 66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60 A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23 DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D000010000013000016 00001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D000050 00005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D 00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA 0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF 0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF 0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF 0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF 00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF 00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC 36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF90 72FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53 AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16 E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D000020 00002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D 00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A 00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D7 0000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF 0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF 0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF 008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF 00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC 06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC0 43FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF83 7FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46 B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0D F5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D 00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A 00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A7 0000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E0 0000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF 0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF 005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF 0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF 00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF0 13FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB3 4FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF76 89FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3D C5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF00 00000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A 00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D000070000073000077 00007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B0 0000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED 0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF 002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF 0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF 00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF 00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE3 1FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA6 59FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D 96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30 D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A 00000D00001000001300001600001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D000040000043000046 00004600004A00004D00005000005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D000080 00008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD 0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA 0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF 0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF 0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF 00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF 00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD6 29FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D 66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60 A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23 DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D000010000013000016 00001600001A00001D00002000002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D000050 00005300005700005A00005D00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D 00009000009300009700009A00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA 0000CD0000D00000D30000D70000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF 0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF 0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF 0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF 00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF 00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC 36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF90 72FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53 AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16 E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D000020 00002300002600002A00002D00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D 00006000006300006700006A00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A 00009D0000A00000A30000A70000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D7 0000D70000DA0000DD0000E00000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF 0015FF0018FF001BFF001EFF0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF 0051FF0055FF0058FF005BFF005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF 008EFF0092FF0095FF0098FF0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF 00C8FF00CBFF00CEFF00D2FF00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC 06FFF909FFF60CFFF30FFFF013FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC0 43FFBC46FFB949FFB64CFFB34FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF83 7FFF8082FF7D86FF7989FF7689FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46 B9FF46BCFF43BFFF40C2FF3DC5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0D F5FF0AF9FF06FCFF03FFFF0000000000000300000600000A00000D00001000001300001600001600001A00001D00002000002300002600002A00002D 00003000003300003600003A00003D00004000004300004600004600004A00004D00005000005300005700005A00005D00006000006300006700006A 00006D00007000007300007700007700007A00007D00008000008300008700008A00008D00009000009300009700009A00009D0000A00000A30000A7 0000A70000AA0000AD0000B00000B30000B70000BA0000BD0000C00000C30000C70000CA0000CD0000D00000D30000D70000D70000DA0000DD0000E0 0000E30000E70000EA0000ED0000F00000F40000F70000FA0000FD0001FF0005FF0008FF0008FF000BFF000EFF0011FF0015FF0018FF001BFF001EFF 0021FF0025FF0028FF002BFF002EFF0031FF0035FF0038FF0038FF003BFF003EFF0041FF0045FF0048FF004BFF004EFF0051FF0055FF0058FF005BFF 005EFF0061FF0065FF0068FF0068FF006BFF006EFF0071FF0075FF0078FF007BFF007EFF0081FF0085FF0088FF008BFF008EFF0092FF0095FF0098FF 0098FF009BFF009EFF00A2FF00A5FF00A8FF00ABFF00AEFF00B2FF00B5FF00B8FF00BBFF00BEFF00C2FF00C5FF00C8FF00C8FF00CBFF00CEFF00D2FF 00D5FF00D8FF00DBFF00DEFF00E2FF00E5FF00E8FF00EBFF00EEFF00F2FF00F5FF00F8FF00F8FF00FBFF00FEFF03FFFC06FFF909FFF60CFFF30FFFF0 13FFEC16FFE919FFE61CFFE31FFFE023FFDC26FFD929FFD629FFD62CFFD32FFFD033FFCC36FFC939FFC63CFFC33FFFC043FFBC46FFB949FFB64CFFB3 4FFFB052FFAD56FFA959FFA659FFA65CFFA35FFFA062FF9D66FF9969FF966CFF936FFF9072FF8D76FF8979FF867CFF837FFF8082FF7D86FF7989FF76 89FF768CFF738FFF7092FF6D96FF6999FF669CFF639FFF60A2FF5DA6FF59A9FF56ACFF53AFFF50B2FF4DB6FF49B9FF46B9FF46BCFF43BFFF40C2FF3D C5FF3AC9FF36CCFF33CFFF30D2FF2DD5FF2AD9FF26DCFF23DFFF20E2FF1DE5FF1AE9FF16E9FF16ECFF13EFFF10F2FF0DF5FF0AF9FF06FCFF03FFFF00 grestore 10375 0 62 3494 L 0 187 C -10375 0 C 0 -187 C 4 2 5077 3737 L 5 5 C 0 -36 C -17 -24 5123 3744 L 25 0 C 0 -36 5123 3744 L -2 -2 5143 3732 L 2 -1 C 2 1 C -2 2 C -2 -2 5143 3712 L 2 -2 C 2 2 C -2 2 C 0 -24 5185 3732 L 2 5 5185 3722 L 3 3 C 3 2 C 5 0 C 0 -24 5225 3732 L -3 3 5225 3727 L -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -6 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C 2 -2 5237 3744 L 1 2 C -1 1 C -2 -1 C 0 -24 5239 3732 L 0 -24 5252 3732 L 5 5 5252 3725 L 3 2 C 5 0 C 4 -2 C 1 -5 C 0 -17 C 0 -36 5284 3744 L 3 3 5284 3727 L 4 2 C 5 0 C 3 -2 C 3 -3 C 2 -5 C 0 -3 C -2 -6 C -3 -3 C -3 -2 C -5 0 C -4 2 C -3 3 C -4 -2 5323 3732 L -3 -3 C -2 -5 C 0 -3 C 2 -6 C 3 -3 C 4 -2 C 5 0 C 3 2 C 3 3 C 2 6 C 0 3 C -2 5 C -3 3 C -3 2 C -5 0 C 7 -24 5346 3732 L -7 -24 5360 3732 L 6 -24 5360 3732 L -7 -24 5373 3732 L 0 -36 5412 3744 L 0 -36 5425 3744 L gsave newpath 62 3493 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -4.667E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage FF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00 FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00 FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF00 80FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF00 00FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D 00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD 00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF 007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF 0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF 3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF 6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FF A200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FF D800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500 FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600 FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00 E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF00 64FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF17 00FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF98 00FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF 00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF 0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF 1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF 4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF 7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FF AE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FF E300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000 FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00 FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00 CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF00 49FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF32 00FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD 00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF 00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF 0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF 1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF 4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF 8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FF B900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FF EB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400 FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600 FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00 B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF00 35FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF47 00FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC8 00FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF 00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF 0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF 2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF 5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF 8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FF C100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FF F700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000 FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200 FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF00 9BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF00 19FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF62 00FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE3 00FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF 0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF 0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF 3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF 6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF 9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FF CD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FF FF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00 FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00 FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF00 80FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF00 00FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D 00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD 00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF 007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF 0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF 3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF 6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FF A200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FF D800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500 FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600 FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00 E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF00 64FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF17 00FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF98 00FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF 00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF 0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF 1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF 4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF 7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FF AE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FF E300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000 FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00 FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00 CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF00 49FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF32 00FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD 00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF 00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF 0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF 1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF 4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF 8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FF B900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FF EB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400 FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600 FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00 B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF00 35FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF47 00FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC8 00FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF 00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF 0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF 2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF 5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF 8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FF C100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FF F700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000 FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200 FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF00 9BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF00 19FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF62 00FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE3 00FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF 0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF 0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF 3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF 6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF 9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FF CD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FF FF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00 FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00 FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF00 80FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF00 00FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D 00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD 00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF 007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF 0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF 3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF 6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FF A200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FF D800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500 FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600 FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00 E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF00 64FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF17 00FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF98 00FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF 00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF 0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF 1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF 4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF 7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FF AE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FF E300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000 FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00 FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00 CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF00 49FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF32 00FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD 00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF 00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF 0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF 1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF 4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF 8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FF B900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FF EB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400 FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600 FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00 B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF00 35FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF47 00FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC8 00FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF 00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF 0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF 2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF 5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF 8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FF C100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FF F700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000 FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200 FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF00 9BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF00 19FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF62 00FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE3 00FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF 0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF 0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF 3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF 6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF 9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FF CD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FF FF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00 FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00 FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF00 80FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF00 00FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D 00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD 00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF 007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF 0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF 3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF 6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FF A200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FF D800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500 FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600 FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00 E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF00 64FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF17 00FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF98 00FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF 00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF 0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF 1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF 4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF 7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FF AE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FF E300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000 FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00 FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00 CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF00 49FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF32 00FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD 00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF 00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF 0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF 1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF 4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF 8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FF B900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FF EB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400 FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600 FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00 B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF00 35FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF47 00FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC8 00FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF 00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF 0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF 2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF 5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF 8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FF C100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FF F700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000 FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200 FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF00 9BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF00 19FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF62 00FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE3 00FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF 0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF 0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF 3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF 6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF 9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FF CD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FF FF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00 FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00 FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF00 80FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF00 00FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D 00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD 00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF 007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF 0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF 3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF 6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FF A200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FF D800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500 FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600 FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00 E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF00 64FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF17 00FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF98 00FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF 00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF 0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF 1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF 4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF 7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FF AE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FF E300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000 FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00 FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00 CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF00 49FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF32 00FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD 00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF 00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF 0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF 1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF 4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF 8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FF B900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FF EB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400 FF4B00FF5200FF5900FF6000FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600 FFCD00FFD400FFDB00FFE200FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00 B0FF00A9FF00A2FF009BFF009BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF00 35FF002EFF0027FF0020FF0019FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF47 00FF4E00FF5400FF5B00FF6200FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC8 00FFCF00FFD600FFDD00FFE300FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF 00ADFF00A6FF009FFF0098FF0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF 0032FF002BFF0024FF001DFF0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF 2400FF2700FF2A00FF2D00FF3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF 5A00FF5C00FF5F00FF6200FF6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF 8F00FF9200FF9400FF9700FF9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FF C100FFC400FFC700FFCA00FFCD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FF F700FFF900FFFC00FFFF00FFFF0000FF0700FF0E00FF1500FF1B00FF2200FF2900FF3000FF3000FF3700FF3E00FF4400FF4B00FF5200FF5900FF6000 FF6700FF6D00FF7400FF7B00FF8200FF8900FF9000FF9600FF9600FF9D00FFA400FFAB00FFB200FFB900FFBF00FFC600FFCD00FFD400FFDB00FFE200 FFE800FFEF00FFF600FFFC00FFFC00FBFF00F4FF00EDFF00E6FF00DFFF00D9FF00D2FF00CBFF00C4FF00BDFF00B6FF00B0FF00A9FF00A2FF009BFF00 9BFF0094FF008DFF0087FF0080FF0079FF0072FF006BFF0064FF005EFF0057FF0050FF0049FF0042FF003BFF0035FF0035FF002EFF0027FF0020FF00 19FF0012FF000CFF0005FF0000FF0300FF0A00FF1000FF1700FF1E00FF2500FF2C00FF3200FF3200FF3900FF4000FF4700FF4E00FF5400FF5B00FF62 00FF6900FF7000FF7600FF7D00FF8400FF8B00FF9200FF9800FF9800FF9F00FFA600FFAD00FFB400FFBB00FFC100FFC800FFCF00FFD600FFDD00FFE3 00FFEA00FFF100FFF800FDFD00FDFD00F8FF00F1FF00EAFF00E3FF00DDFF00D6FF00CFFF00C8FF00C1FF00BAFF00B4FF00ADFF00A6FF009FFF0098FF 0098FF0091FF008BFF0084FF007DFF0076FF006FFF0068FF0062FF005BFF0054FF004DFF0046FF003FFF0039FF0032FF0032FF002BFF0024FF001DFF 0016FF0010FF0009FF0002FF0600FF0800FF0B00FF0E00FF1100FF1400FF1600FF1900FF1900FF1C00FF1F00FF2200FF2400FF2700FF2A00FF2D00FF 3000FF3200FF3500FF3800FF3B00FF3E00FF4000FF4300FF4300FF4600FF4900FF4C00FF4E00FF5100FF5400FF5700FF5A00FF5C00FF5F00FF6200FF 6500FF6800FF6A00FF6D00FF6D00FF7000FF7300FF7600FF7800FF7B00FF7E00FF8100FF8400FF8600FF8900FF8C00FF8F00FF9200FF9400FF9700FF 9700FF9A00FF9D00FFA000FFA200FFA500FFA800FFAB00FFAE00FFB100FFB300FFB600FFB900FFBC00FFBF00FFC100FFC100FFC400FFC700FFCA00FF CD00FFCF00FFD200FFD500FFD800FFDB00FFDD00FFE000FFE300FFE600FFE900FFEB00FFEB00FFEE00FFF100FFF400FFF700FFF900FFFC00FFFF00FF grestore 10375 0 62 3182 L 0 187 C -10375 0 C 0 -187 C 3 2 5071 3425 L 5 5 C 0 -36 C -16 0 5119 3432 L -2 -15 C 2 1 C 5 2 C 5 0 C 5 -2 C 3 -3 C 2 -5 C 0 -3 C -2 -5 C -3 -4 C -5 -2 C -5 0 C -5 2 C -2 2 C -2 3 C -2 -2 5136 3420 L 2 -1 C 2 1 C -2 2 C -2 -2 5136 3400 L 2 -2 C 2 2 C -2 2 C 0 -24 5178 3420 L 2 5 5178 3410 L 3 3 C 4 2 C 5 0 C 0 -24 5218 3420 L -3 3 5218 3415 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -2 C 5 0 C 3 2 C 3 4 C 2 -2 5230 3432 L 2 2 C -2 1 C -2 -1 C 0 -24 5232 3420 L 0 -24 5245 3420 L 5 5 5245 3413 L 4 2 C 5 0 C 3 -2 C 2 -5 C 0 -17 C 0 -36 5277 3432 L 4 3 5277 3415 L 3 2 C 5 0 C 3 -2 C 4 -3 C 1 -5 C 0 -3 C -1 -5 C -4 -4 C -3 -2 C -5 0 C -3 2 C -4 4 C -4 -2 5316 3420 L -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -2 C 5 0 C 3 2 C 4 4 C 1 5 C 0 3 C -1 5 C -4 3 C -3 2 C -5 0 C 7 -24 5339 3420 L -7 -24 5353 3420 L 7 -24 5353 3420 L -6 -24 5366 3420 L 0 -36 5405 3432 L 0 -36 5418 3432 L 0 -36 5432 3432 L gsave newpath 62 3181 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -4.250E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 7C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF 2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF 0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF 008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF 00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF 00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF65 01FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F 01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF00 52FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00 ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900 FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300 FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800 FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF 6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF 1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF 0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF 00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF 00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC 00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF56 01FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF00 0DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF00 65FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00 BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00 FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000 FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500 FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF 5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF 0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF 0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF 00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF4 00FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E 00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF43 01FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF00 1DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF00 73FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00 CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800 FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00 FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200 FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF 4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF 000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF 006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF 00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE5 00FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B 00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF30 01FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF00 2BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF00 87FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00 E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500 FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00 FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400 FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF 3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF 0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF 0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF 00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED2 00FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF78 01FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D 01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF00 3EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF00 9AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00 F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100 FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00 FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF0500 7C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF 2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF 0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF 008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF 00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF 00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF65 01FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F 01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF00 52FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00 ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900 FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300 FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800 FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF 6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF 1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF 0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF 00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF 00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC 00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF56 01FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF00 0DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF00 65FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00 BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00 FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000 FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500 FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF 5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF 0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF 0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF 00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF4 00FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E 00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF43 01FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF00 1DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF00 73FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00 CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800 FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00 FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200 FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF 4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF 000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF 006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF 00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE5 00FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B 00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF30 01FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF00 2BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF00 87FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00 E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500 FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00 FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400 FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF 3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF 0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF 0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF 00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED2 00FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF78 01FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D 01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF00 3EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF00 9AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00 F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100 FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00 FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF0500 7C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF 2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF 0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF 008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF 00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF 00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF65 01FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F 01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF00 52FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00 ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900 FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300 FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800 FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF 6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF 1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF 0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF 00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF 00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC 00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF56 01FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF00 0DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF00 65FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00 BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00 FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000 FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500 FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF 5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF 0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF 0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF 00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF4 00FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E 00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF43 01FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF00 1DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF00 73FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00 CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800 FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00 FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200 FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF 4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF 000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF 006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF 00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE5 00FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B 00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF30 01FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF00 2BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF00 87FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00 E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500 FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00 FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400 FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF 3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF 0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF 0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF 00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED2 00FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF78 01FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D 01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF00 3EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF00 9AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00 F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100 FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00 FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF0500 7C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF 2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF 0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF 008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF 00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF 00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF65 01FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F 01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF00 52FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00 ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900 FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300 FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800 FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF 6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF 1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF 0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF 00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF 00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC 00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF56 01FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF00 0DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF00 65FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00 BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00 FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000 FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500 FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF 5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF 0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF 0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF 00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF4 00FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E 00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF43 01FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF00 1DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF00 73FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00 CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800 FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00 FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200 FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF 4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF 000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF 006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF 00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE5 00FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B 00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF30 01FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF00 2BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF00 87FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00 E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500 FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00 FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400 FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF 3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF 0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF 0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF 00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED2 00FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF78 01FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D 01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF00 3EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF00 9AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00 F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100 FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00 FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF0500 7C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF 2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF 0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF 008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF 00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF 00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF65 01FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F 01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF00 52FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00 ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900 FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300 FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800 FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF 6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF 1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF 0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF 00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF 00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC 00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF56 01FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF00 0DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF00 65FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00 BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00 FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000 FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500 FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF 5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF 0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF 0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF 00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF4 00FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E 00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF43 01FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF00 1DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF00 73FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00 CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800 FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00 FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200 FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF 4C00FF4700FF4200FF3E00FF3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF 000FFF0014FF0019FF001EFF0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF 006BFF0070FF0074FF0079FF0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF 00C1FF00C6FF00CBFF00D0FF00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE5 00FEE000FEDC00FED700FED200FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B 00FE8601FE8101FF7C01FF7801FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF30 01FF2B01FF2701FF2201FF1D01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF00 2BFF0030FF0035FF003AFF003EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF00 87FF008CFF0090FF0095FF009AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00 E3FF00E7FF00ECFF00F1FF00F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500 FFC000FFBB00FFB600FFB100FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00 FF6A00FF6500FF6000FF5B00FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400 FF0F00FF0A00FF0500FF05007C00FF7C00FF7700FF7200FF6D00FF6900FF6400FF5F00FF5F00FF5A00FF5600FF5100FF4C00FF4700FF4200FF3E00FF 3900FF3400FF2F00FF2B00FF2600FF2100FF1C00FF1800FF1800FF1300FF0E00FF0900FF0400FF0102FF0006FF000AFF000FFF0014FF0019FF001EFF 0023FF0027FF002CFF0031FF0031FF0036FF003BFF003FFF0044FF0049FF004EFF0053FF0057FF005CFF0061FF0066FF006BFF0070FF0074FF0079FF 0079FF007EFF0083FF0088FF008CFF0091FF0096FF009BFF00A0FF00A5FF00A9FF00AEFF00B3FF00B8FF00BDFF00C1FF00C1FF00C6FF00CBFF00D0FF 00D5FF00D9FF00DEFF00E3FF00E8FF00EDFF00F2FF00F6FF00FBFF00FEFD00FEF800FEF400FEF400FEEF00FEEA00FEE500FEE000FEDC00FED700FED2 00FECD00FEC900FEC400FEBF00FEBA00FEB600FEB100FEAC00FEAC00FEA700FEA300FE9E00FE9900FE9400FE8F00FE8B00FE8601FE8101FF7C01FF78 01FF7301FF6E01FF6901FF6501FF6501FF6001FF5B01FF5601FF5201FF4D01FF4801FF4301FF3F01FF3A01FF3501FF3001FF2B01FF2701FF2201FF1D 01FF1D01FF1801FF1401FF0F01FF0A01FF0501FF0105FF000DFF000EFF0013FF0018FF001DFF0021FF0026FF002BFF002BFF0030FF0035FF003AFF00 3EFF0043FF0048FF004DFF0052FF0057FF005BFF0060FF0065FF006AFF006FFF0073FF0073FF0078FF007DFF0082FF0087FF008CFF0090FF0095FF00 9AFF009FFF00A4FF00A9FF00ADFF00B2FF00B7FF00BCFF00BCFF00C1FF00C6FF00CAFF00CFFF00D4FF00D9FF00DEFF00E3FF00E7FF00ECFF00F1FF00 F6FF00FBFF00FEFD00FFF900FFF900FFF400FFF000FFEB00FFE600FFE100FFDC00FFD800FFD300FFCE00FFC900FFC500FFC000FFBB00FFB600FFB100 FFB100FFAD00FFA800FFA300FF9E00FF9A00FF9500FF9000FF8B00FF8600FF8200FF7D00FF7800FF7300FF6F00FF6A00FF6A00FF6500FF6000FF5B00 FF5700FF5200FF4D00FF4800FF4300FF3F00FF3A00FF3500FF3000FF2C00FF2700FF2200FF2200FF1D00FF1800FF1400FF0F00FF0A00FF0500FF0500 grestore 10375 0 62 2870 L 0 187 C -10375 0 C 0 -187 C 3 2 5143 3113 L 5 5 C 0 -35 C -1 3 5193 3115 L -5 2 C -4 0 C -5 -2 C -3 -5 C -2 -8 C 0 -9 C 2 -6 C 3 -4 C 5 -1 C 2 0 C 5 1 C 3 4 C 2 5 C 0 1 C -2 5 C -3 4 C -5 1 C -2 0 C -5 -1 C -3 -4 C -2 -5 C -1 -2 5208 3108 L 1 -1 C 2 1 C -2 2 C -1 -2 5208 3088 L 1 -1 C 2 1 C -2 2 C 0 -35 5250 3120 L 5 5 5250 3101 L 4 2 C 5 0 C 3 -2 C 2 -5 C 0 -16 C 0 -23 5301 3108 L -4 3 5301 3103 L -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C -19 -23 5331 3108 L 19 0 5312 3108 L 19 0 5312 3085 L 20 0 5341 3098 L 0 3 C -1 4 C -2 1 C -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 3 -1 C 5 0 C 4 1 C 3 4 C gsave newpath 62 2870 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -3.833E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEB D9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7 B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C3 8B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF 6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B 3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86 152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973 182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F 40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B 69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A36 8F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423 B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0F DFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FC F9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7 D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3 AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF 827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB 5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A394999364798344696 3446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B83 0C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F 21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B 494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F6546 6F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E33 9780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991F BF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40B E8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7 F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3 CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CF A294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB 7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6 545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E4193 2C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F 04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B 29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F5056 4F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943 776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842F A0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1B C8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06 EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3 EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDF C2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB 9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B6 7473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A3 4C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F 243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B 09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A66 2F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F5056515155535254565453 5855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F 80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2B A88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516 CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03 F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EF E1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DB B9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6 938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB3 6B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F 43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B 1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576 102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F63 3840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F 605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B 88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26 AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913 D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300 FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEB D9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7 B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C3 8B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF 6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B 3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86 152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973 182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F 40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B 69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A36 8F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423 B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0F DFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FC F9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7 D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3 AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF 827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB 5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A394999364798344696 3446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B83 0C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F 21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B 494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F6546 6F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E33 9780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991F BF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40B E8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7 F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3 CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CF A294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB 7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6 545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E4193 2C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F 04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B 29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F5056 4F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943 776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842F A0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1B C8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06 EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3 EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDF C2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB 9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B6 7473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A3 4C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F 243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B 09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A66 2F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F5056515155535254565453 5855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F 80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2B A88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516 CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03 F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EF E1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DB B9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6 938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB3 6B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F 43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B 1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576 102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F63 3840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F 605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B 88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26 AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913 D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300 FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEB D9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7 B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C3 8B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF 6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B 3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86 152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973 182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F 40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B 69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A36 8F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423 B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0F DFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FC F9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7 D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3 AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF 827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB 5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A394999364798344696 3446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B83 0C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F 21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B 494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F6546 6F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E33 9780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991F BF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40B E8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7 F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3 CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CF A294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB 7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6 545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E4193 2C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F 04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B 29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F5056 4F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943 776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842F A0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1B C8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06 EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3 EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDF C2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB 9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B6 7473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A3 4C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F 243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B 09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A66 2F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F5056515155535254565453 5855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F 80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2B A88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516 CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03 F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EF E1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DB B9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6 938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB3 6B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F 43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B 1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576 102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F63 3840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F 605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B 88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26 AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913 D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300 FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEB D9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7 B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C3 8B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF 6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B 3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86 152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973 182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F 40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B 69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A36 8F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423 B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0F DFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FC F9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7 D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3 AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF 827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB 5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A394999364798344696 3446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B83 0C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F 21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B 494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F6546 6F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E33 9780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991F BF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40B E8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7 F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3 CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CF A294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB 7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6 545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E4193 2C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F 04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B 29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F5056 4F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943 776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842F A0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1B C8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06 EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3 EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDF C2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB 9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B6 7473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A3 4C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F 243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B 09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A66 2F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F5056515155535254565453 5855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F 80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2B A88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516 CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03 F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EF E1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DB B9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6 938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB3 6B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F 43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B 1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576 102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F63 3840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F 605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B 88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26 AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913 D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300 FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEB D9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7 B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C3 8B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF 6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B 3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86 152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973 182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F 40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B 69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A36 8F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423 B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0F DFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FC F9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7 D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3 AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF 827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB 5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A394999364798344696 3446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B83 0C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F 21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B 494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F6546 6F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E33 9780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991F BF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40B E8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7 F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3 CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CF A294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB 7A78BA7876B97675B87473B67473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6 545CA6525BA55059A44E58A34C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E4193 2C40922A3E91283D90263B8F243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F 04237E05227D06207C071F7B09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B 29366A2B37692D39682F3A662F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F5056 4F50565151555352545654535855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943 776B427A6C417C6D407E6F3F80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842F A0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1B C8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06 EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3 EAC7F2E8C6F1E6C4F0E3C3EFE1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDF C2ABDEC0A9DDBDA8DCBBA6DBB9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB 9A8ECA978DC9958BC8938AC6938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B6 7473B67272B56F70B46D6FB36B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A3 4C56A24955A14753A045529F43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F 243A8E21388D1F378C1D358B1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B 09217A0B22790E2478102576102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A66 2F3A66323C65343D64363F633840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F5056515155535254565453 5855525A57515C58505E5A4F605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F 80703E82723D84733C86743B88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2B A88B2AAA8D29AC8E28AE8F26AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516 CEA516D0A615D2A814D5A913D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03 F7C002F9C201FBC300FBC300FFD5FFFFD5FEFFD5FEFCD3FCF9D2FAF6D0F9F4CFF8F2CDF7F2CDF7F0CCF5EECAF4ECC9F3EAC7F2E8C6F1E6C4F0E3C3EF E1C1EEDFC0EDDDBEECDBBDEBD9BBEAD7BAE9D5B8E8D3B7E7D3B7E7D0B5E5CEB4E4CCB2E3CAB1E2C8AFE1C6AEE0C4ACDFC2ABDEC0A9DDBDA8DCBBA6DB B9A5DAB7A3D9B5A2D8B3A0D7B3A0D7B19FD5AF9DD4AD9CD3AA9AD2A899D1A697D0A496CFA294CEA093CD9E91CC9C90CB9A8ECA978DC9958BC8938AC6 938AC69188C58F87C48D85C38B84C28982C18781C0857FBF827EBE807CBD7E7BBC7C79BB7A78BA7876B97675B87473B67473B67272B56F70B46D6FB3 6B6DB2696CB1676AB06568AF6367AE6165AD5F64AC5C62AB5A61AA585FA9565EA8545CA6545CA6525BA55059A44E58A34C56A24955A14753A045529F 43509E414F9D3F4D9C3D4C9B3B4A9A3949993647983446963446963244953043942E41932C40922A3E91283D90263B8F243A8E21388D1F378C1D358B 1B348A193289173188152F86152F86132E85112C840E2B830C29820A288108268006257F04237E05227D06207C071F7B09217A0B22790E2478102576 102576122675142874162973182B721A2C711C2E701E2F6F21306E23326D25336C27356B29366A2B37692D39682F3A662F3A66323C65343D64363F63 3840623A41613C43603E445F40465E42475D45485C474A5B494B5A4B4D594D4E584F50564F50565151555352545654535855525A57515C58505E5A4F 605B4E625C4D645E4C665F4B69614A6B62496D63486F65466F6546716645736844756943776B427A6C417C6D407E6F3F80703E82723D84733C86743B 88763A8A77398D79388F7A368F7A36917C35937D34957E339780329981319B83309E842FA0862EA2872DA4882CA68A2BA88B2AAA8D29AC8E28AE8F26 AE8F26B19125B39224B59423B79522B99721BB9820BD991FBF9B1EC19C1DC49E1CC69F1BC8A01ACAA219CCA318CEA516CEA516D0A615D2A814D5A913 D7AA12D9AC11DBAD10DDAF0FDFB00EE1B20DE3B30CE5B40BE8B60AEAB809ECB908EEBA06EEBA06F0BC05F2BD04F4BF03F7C002F9C201FBC300FBC300 grestore 10375 0 62 2558 L 0 187 C -10375 0 C 0 -187 C 3 2 5064 2801 L 5 5 C 0 -35 C -17 -35 5116 2808 L 24 0 5092 2808 L -1 -2 5129 2796 L 1 -1 C 2 1 C -2 2 C -1 -2 5129 2776 L 1 -1 C 2 1 C -2 2 C 0 -35 5171 2808 L 5 5 5171 2789 L 4 2 C 5 0 C 3 -2 C 2 -5 C 0 -16 C 0 -17 5203 2796 L 2 -5 C 3 -1 C 5 0 C 4 1 C 5 5 C 0 -23 5222 2796 L 20 0 5234 2786 L 0 3 C -2 4 C -2 1 C -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C -1 3 5282 2791 L -5 2 C -6 0 C -5 -2 C -1 -3 C 1 -3 C 4 -2 C 8 -2 C 4 -1 C 1 -4 C 0 -1 C -1 -4 C -5 -1 C -6 0 C -5 1 C -1 4 C 0 -23 5312 2796 L -3 3 5312 2791 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 3 4 C 0 -29 5328 2808 L 1 -5 C 4 -1 C 3 0 C 11 0 5323 2796 L 10 -23 5343 2796 L -10 -23 5363 2796 L 0 -23 5391 2796 L -3 3 5391 2791 L -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 3 4 C 0 -35 5405 2808 L 0 2 5418 2799 L 2 3 C 2 2 C 3 2 C 7 0 C 3 -2 C 2 -2 C 1 -3 C 0 -3 C -1 -4 C -4 -5 C -16 -16 C 23 0 C gsave newpath 62 2558 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -3.417E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFD EBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFE D8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFE C3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFE AFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF 9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF 88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB 73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A 60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D 72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39 BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25 FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11 FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFD FBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFD E8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFE D3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFE BFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFE ABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF 98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF 83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA 6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF79 5CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF49 7EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35 CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521 FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620D FF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFD F8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFD E3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFE CFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFE BBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFE A8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF 93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF 7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB9 6BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF68 58FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF45 8FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31 E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1D FFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808 FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFD F3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFD DFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFE CBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFE B8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFE A3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF 8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF9 7BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA8 68FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C 54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41 A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2D F1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518 FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305 FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFD EFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFE DBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFE C8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFE B3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE 9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF 8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE8 78FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B 64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF51 61FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3D B1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28 FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315 FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02 FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFD EBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFE D8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFE C3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFE AFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF 9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF 88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB 73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A 60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D 72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39 BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25 FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11 FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFD FBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFD E8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFE D3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFE BFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFE ABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF 98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF 83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA 6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF79 5CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF49 7EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35 CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521 FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620D FF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFD F8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFD E3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFE CFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFE BBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFE A8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF 93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF 7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB9 6BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF68 58FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF45 8FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31 E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1D FFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808 FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFD F3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFD DFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFE CBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFE B8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFE A3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF 8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF9 7BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA8 68FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C 54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41 A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2D F1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518 FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305 FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFD EFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFE DBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFE C8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFE B3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE 9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF 8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE8 78FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B 64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF51 61FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3D B1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28 FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315 FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02 FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFD EBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFE D8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFE C3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFE AFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF 9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF 88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB 73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A 60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D 72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39 BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25 FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11 FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFD FBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFD E8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFE D3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFE BFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFE ABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF 98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF 83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA 6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF79 5CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF49 7EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35 CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521 FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620D FF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFD F8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFD E3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFE CFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFE BBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFE A8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF 93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF 7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB9 6BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF68 58FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF45 8FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31 E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1D FFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808 FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFD F3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFD DFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFE CBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFE B8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFE A3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF 8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF9 7BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA8 68FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C 54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41 A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2D F1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518 FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305 FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFD EFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFE DBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFE C8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFE B3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE 9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF 8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE8 78FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B 64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF51 61FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3D B1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28 FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315 FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02 FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFD EBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFE D8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFE C3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFE AFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF 9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF 88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB 73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A 60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D 72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39 BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25 FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11 FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFD FBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFD E8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFE D3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFE BFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFE ABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF 98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF 83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA 6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF79 5CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF49 7EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35 CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521 FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620D FF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFD F8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFD E3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFE CFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFE BBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFE A8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF 93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF 7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB9 6BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF68 58FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF45 8FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31 E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1D FFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808 FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFD F3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFD DFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFE CBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFE B8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFE A3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF 8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF9 7BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA8 68FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C 54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41 A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2D F1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518 FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305 FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFD EFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFE DBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFE C8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFE B3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE 9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF 8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE8 78FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B 64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF51 61FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3D B1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28 FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315 FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02 FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFD EBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFE D8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFE C3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFE AFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF 9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF 88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB 73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A 60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D 72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39 BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25 FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11 FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFD FBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFD E8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFE D3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFE BFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFE ABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF 98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF 83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA 6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF79 5CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF49 7EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35 CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521 FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620D FF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFD F8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFD E3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFE CFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFE BBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFE A8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF 93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF 7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB9 6BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF68 58FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF45 8FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31 E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1D FFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808 FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFD F3FDFDF2FDFDF1FDFDF0FDFDEFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFD DFFDFDDEFDFDDDFDFDDCFDFEDBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFE CBFDFECAFDFEC9FDFEC8FDFEC8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFE B8FDFEB6FDFEB5FDFEB4FDFEB3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFE A3FDFEA2FDFEA1FDFEA0FDFE9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF 8FFDFF8EFDFF8DFDFF8CFDFF8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF9 7BFFF57AFFF179FFEC78FFE878FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA8 68FFA867FFA466FFA065FF9B64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C 54FF5756FF5458FF525CFF5161FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41 A0FF40A5FF3FA9FF3EADFF3DB1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2D F1FF2CF6FF2BFAFF2AFDFD28FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518 FFA518FF9F17FF9916FF9315FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305 FF2C04FF2403FF1D02FF1D02FFFDFDFEFDFDFDFDFDFCFDFDFBFDFDFAFDFDF9FDFDF8FDFDF8FDFDF6FDFDF5FDFDF4FDFDF3FDFDF2FDFDF1FDFDF0FDFD EFFDFDEEFDFDEDFDFDECFDFDEBFDFDEAFDFDE9FDFDE8FDFDE8FDFDE6FDFDE5FDFDE4FDFDE3FDFDE2FDFDE1FDFDE0FDFDDFFDFDDEFDFDDDFDFDDCFDFE DBFDFEDAFDFED9FDFED8FDFED8FDFED6FDFED5FDFED4FDFED3FDFED2FDFED1FDFED0FDFECFFDFECEFDFECDFDFECCFDFECBFDFECAFDFEC9FDFEC8FDFE C8FDFEC6FDFEC5FDFEC4FDFEC3FDFEC2FDFEC1FDFEC0FDFEBFFDFEBEFDFEBDFDFEBCFDFEBBFDFEBAFDFEB9FDFEB8FDFEB8FDFEB6FDFEB5FDFEB4FDFE B3FDFEB2FDFEB1FDFEB0FDFEAFFDFEAEFDFEADFDFEACFDFEABFDFEAAFDFEA9FDFEA8FDFEA8FDFEA6FDFEA5FDFEA4FDFEA3FDFEA2FDFEA1FDFEA0FDFE 9FFDFE9EFDFE9DFDFF9CFDFF9BFDFF9AFDFF99FDFF98FDFF98FDFF96FDFF95FDFF94FDFF93FDFF92FDFF91FDFF90FDFF8FFDFF8EFDFF8DFDFF8CFDFF 8BFDFF8AFDFF89FDFF88FDFF88FDFF86FDFF85FDFF84FDFF83FDFF82FDFF81FDFF80FDFF7FFDFF7EFDFF7DFEFC7CFFF97BFFF57AFFF179FFEC78FFE8 78FFE877FFE476FFE074FFDB73FFD772FFD371FFCF70FFCA6FFFC66EFFC26DFFBE6CFFB96BFFB56AFFB169FFAD68FFA868FFA867FFA466FFA065FF9B 64FF9763FF9362FF8F61FF8A60FF865FFF825EFF7E5DFF795CFF755AFF7159FF6D58FF6858FF6857FF6456FF6055FF5C54FF5756FF5458FF525CFF51 61FF5065FF4F69FF4E6DFF4D72FF4C76FF4B7AFF4A7EFF497EFF4983FF4787FF468BFF458FFF4494FF4398FF429CFF41A0FF40A5FF3FA9FF3EADFF3D B1FF3CB6FF3BBAFF3ABEFF39BEFF39C3FF37C7FF36CBFF35CFFF34D4FF33D8FF32DCFF31E0FF30E5FF2FE9FF2EEDFF2DF1FF2CF6FF2BFAFF2AFDFD28 FDFD28FEF927FFF326FFED25FFE724FFE123FFDB22FFD521FFCF20FFC91FFFC31EFFBD1DFFB71CFFB11BFFAB1AFFA518FFA518FF9F17FF9916FF9315 FF8D14FF8613FF8012FF7A11FF7410FF6E0FFF680EFF620DFF5C0CFF560BFF4F0AFF4808FF4808FF4107FF3A06FF3305FF2C04FF2403FF1D02FF1D02 grestore 10375 0 62 2246 L 0 187 C -10375 0 C 0 -187 C 3 2 5087 2489 L 5 5 C 0 -35 C -6 -2 5124 2496 L -1 -3 C 0 -4 C 1 -3 C 4 -2 C 7 -1 C 5 -2 C 3 -3 C 2 -4 C 0 -5 C -2 -3 C -2 -2 C -5 -1 C -6 0 C -6 1 C -1 2 C -2 3 C 0 5 C 2 4 C 3 3 C 5 2 C 7 1 C 3 2 C 2 3 C 0 4 C -2 3 C -5 2 C -6 0 C -2 -2 5152 2484 L 2 -1 C 2 1 C -2 2 C -2 -2 5152 2464 L 2 -1 C 2 1 C -2 2 C 0 -35 5194 2496 L 3 3 5194 2479 L 4 2 C 5 0 C 3 -2 C 4 -3 C 1 -5 C 0 -3 C -1 -5 C -4 -4 C -3 -1 C -5 0 C -4 1 C -3 4 C 0 -35 5226 2496 L 0 -17 5239 2484 L 2 -5 C 3 -1 C 6 0 C 3 1 C 5 5 C 0 -23 5258 2484 L 20 0 5270 2474 L 0 3 C -2 4 C -2 1 C -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C 30 0 5302 2476 L 0 -23 5345 2484 L 2 5 5345 2474 L 3 3 C 4 2 C 5 0 C 21 0 5365 2474 L 0 3 C -2 4 C -2 1 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 4 4 C 0 -35 5416 2496 L -4 3 5416 2479 L -3 2 C -5 0 C -3 -2 C -4 -3 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C gsave newpath 62 2246 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -3.000E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545 004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B 009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED 00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF 00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF 006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF 001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF 3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF 8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FF D400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0 FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091 FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003E FF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303 000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757 005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A8 00ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF 00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF 00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF 005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF 000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF 4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF 9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FF E100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3 FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080 FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002C FF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313 001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464 006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB 00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF 00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF 00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF 004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF 0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF 5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FF A000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FF F200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1 FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006E FF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001B FF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020 002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777 007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD 00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF 00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF 008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF 003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF 1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF 5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FF B100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FF FF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0 FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005C FF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000D FF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232 003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989 008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF 00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF 00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF 007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF 002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF 1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF 7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FF C200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2 FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009E FF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004F FF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000 000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545 004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B 009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED 00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF 00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF 006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF 001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF 3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF 8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FF D400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0 FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091 FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003E FF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303 000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757 005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A8 00ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF 00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF 00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF 005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF 000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF 4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF 9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FF E100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3 FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080 FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002C FF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313 001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464 006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB 00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF 00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF 00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF 004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF 0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF 5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FF A000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FF F200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1 FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006E FF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001B FF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020 002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777 007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD 00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF 00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF 008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF 003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF 1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF 5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FF B100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FF FF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0 FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005C FF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000D FF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232 003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989 008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF 00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF 00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF 007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF 002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF 1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF 7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FF C200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2 FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009E FF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004F FF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000 000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545 004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B 009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED 00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF 00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF 006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF 001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF 3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF 8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FF D400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0 FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091 FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003E FF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303 000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757 005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A8 00ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF 00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF 00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF 005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF 000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF 4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF 9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FF E100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3 FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080 FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002C FF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313 001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464 006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB 00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF 00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF 00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF 004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF 0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF 5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FF A000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FF F200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1 FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006E FF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001B FF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020 002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777 007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD 00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF 00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF 008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF 003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF 1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF 5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FF B100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FF FF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0 FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005C FF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000D FF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232 003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989 008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF 00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF 00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF 007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF 002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF 1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF 7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FF C200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2 FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009E FF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004F FF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000 000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545 004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B 009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED 00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF 00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF 006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF 001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF 3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF 8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FF D400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0 FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091 FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003E FF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303 000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757 005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A8 00ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF 00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF 00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF 005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF 000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF 4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF 9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FF E100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3 FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080 FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002C FF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313 001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464 006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB 00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF 00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF 00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF 004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF 0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF 5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FF A000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FF F200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1 FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006E FF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001B FF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020 002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777 007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD 00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF 00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF 008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF 003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF 1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF 5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FF B100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FF FF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0 FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005C FF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000D FF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232 003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989 008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF 00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF 00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF 007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF 002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF 1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF 7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FF C200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2 FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009E FF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004F FF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000 000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545 004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B 009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED 00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF 00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF 006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF 001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF 3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF 8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FF D400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0 FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091 FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003E FF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303 000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757 005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A8 00ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF 00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF 00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF 005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF 000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF 4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF 9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FF E100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3 FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080 FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002C FF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313 001313001717001C1C002020002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464 006969006D6D007272007777007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB 00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF 00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF 00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF 004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF 0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF 5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FF A000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FF F200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1 FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006E FF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001B FF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020 002525002929002E2E003232003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777 007B7B008080008484008989008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD 00D1D100D6D600DADA00DFDF00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF 00E1FF00DCFF00D8FF00D4FF00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF 008FFF008AFF0086FF0082FF007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF 003DFF0038FF0034FF0030FF002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF 1100FF1600FF1A00FF1E00FF1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF 5F00FF6300FF6800FF6C00FF7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FF B100FFB600FFBA00FFBE00FFC200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FF FF00FDFF00FBFF00F6FF00F2FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0 FF00ACFF00A7FF00A3FF009EFF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005C FF005CFF0058FF0054FF004FFF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000D FF0009FF0005FF0000FF0000000000000101000202000303000505000909000E0E001313001313001717001C1C002020002525002929002E2E003232 003737003B3B004040004545004949004E4E005252005757005757005B5B006060006464006969006D6D007272007777007B7B008080008484008989 008D8D009292009696009B9B009B9B009F9F00A4A400A8A800ADAD00B2B200B6B600BBBB00BFBF00C4C400C8C800CDCD00D1D100D6D600DADA00DFDF 00DFDF00E4E400E8E800EDED00F1F100F6F600FAFA00FFFF00FDFF00FBFF00F6FF00F2FF00EEFF00E9FF00E5FF00E1FF00E1FF00DCFF00D8FF00D4FF 00CFFF00CBFF00C7FF00C3FF00BEFF00BAFF00B6FF00B1FF00ADFF00A9FF00A4FF00A0FF00A0FF009CFF0097FF0093FF008FFF008AFF0086FF0082FF 007DFF0079FF0075FF0070FF006CFF0068FF0063FF005FFF005FFF005BFF0057FF0052FF004EFF004AFF0045FF0041FF003DFF0038FF0034FF0030FF 002BFF0027FF0023FF001EFF001EFF001AFF0016FF0011FF000DFF0009FF0004FF0000FF0200FF0400FF0900FF0D00FF1100FF1600FF1A00FF1E00FF 1E00FF2300FF2700FF2B00FF3000FF3400FF3800FF3D00FF4100FF4500FF4900FF4E00FF5200FF5600FF5B00FF5F00FF5F00FF6300FF6800FF6C00FF 7000FF7500FF7900FF7D00FF8200FF8600FF8A00FF8F00FF9300FF9700FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB600FFBA00FFBE00FF C200FFC700FFCB00FFCF00FFD400FFD800FFDC00FFE100FFE100FFE500FFE900FFEE00FFF200FFF600FFFB00FFFF00FFFF00FDFF00FBFF00F6FF00F2 FF00EDFF00E9FF00E5FF00E0FF00E0FF00DCFF00D7FF00D3FF00CFFF00CAFF00C6FF00C1FF00BDFF00B9FF00B4FF00B0FF00ACFF00A7FF00A3FF009E FF009EFF009AFF0096FF0091FF008DFF0088FF0084FF0080FF007BFF0077FF0072FF006EFF006AFF0065FF0061FF005CFF005CFF0058FF0054FF004F FF004BFF0046FF0042FF003EFF0039FF0035FF0031FF002CFF0028FF0023FF001FFF001BFF001BFF0016FF0012FF000DFF0009FF0005FF0000FF0000 grestore 10375 0 62 1934 L 0 187 C -10375 0 C 0 -187 C 3 2 4958 2177 L 5 5 C 0 -35 C -1 -5 5008 2172 L -4 -3 C -5 -2 C -1 0 C -5 2 C -4 3 C -1 5 C 0 2 C 1 5 C 4 3 C 5 2 C 1 0 C 5 -2 C 4 -3 C 1 -7 C 0 -8 C -1 -9 C -4 -5 C -5 -1 C -3 0 C -5 1 C -2 4 C -2 -2 5024 2172 L 2 -1 C 1 1 C -1 2 C -2 -2 5024 2152 L 2 -1 C 1 1 C -1 2 C 0 -35 5066 2184 L 3 3 5066 2167 L 3 2 C 5 0 C 4 -2 C 3 -3 C 2 -5 C 0 -3 C -2 -5 C -3 -4 C -4 -1 C -5 0 C -3 1 C -3 4 C 0 -35 5097 2184 L 0 -17 5111 2172 L 2 -5 C 3 -1 C 5 0 C 3 1 C 5 5 C 0 -23 5129 2172 L 20 0 5141 2162 L 0 3 C -1 4 C -2 1 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 3 4 C 30 0 5173 2164 L 0 -27 5235 2172 L -1 -5 C -2 -1 C -3 -2 C -6 0 C -3 2 C -3 3 5235 2167 L -3 2 C -6 0 C -3 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 3 -1 C 6 0 C 3 1 C 3 4 C 0 -23 5249 2172 L 1 5 5249 2162 L 4 3 C 3 2 C 5 0 C 0 -23 5270 2172 L 6 5 5270 2165 L 3 2 C 5 0 C 3 -2 C 2 -5 C 0 -16 C 31 0 5302 2164 L 0 -23 5346 2172 L 2 5 5346 2162 L 3 3 C 3 2 C 6 0 C 20 0 5366 2162 L 0 3 C -1 4 C -2 1 C -3 2 C -5 0 C -4 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 3 4 C 0 -35 5417 2184 L -4 3 5417 2167 L -3 2 C -5 0 C -3 -2 C -4 -3 C -2 -5 C 0 -3 C 2 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C 30 0 5430 2164 L 10 -23 5470 2172 L -11 -23 5491 2172 L -3 -7 C -3 -3 C -4 -2 C -1 0 C 20 0 5499 2162 L 0 3 C -2 4 C -1 1 C -4 2 C -5 0 C -3 -2 C -3 -3 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 3 -1 C 5 0 C 4 1 C 3 4 C 0 -35 5531 2184 L 0 -35 5544 2184 L gsave newpath 62 1934 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -2.583E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F000021000023000026000028 00002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852 001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364 005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F64009264 00966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028 009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900 387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100 B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200 D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100 DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00 E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00 EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00 F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00000000000002000004000007 00000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031 00003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E57002259 00255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164 006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A 00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B 008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100 586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700 C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00 D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00 DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700 E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500 F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400 FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F 00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031000031000033000035000037 00003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62 003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64 007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D 00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10 008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C00686900706700 7864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700 CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600 D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200 DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100 E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00 F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00 FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F000012000014000016 00001800001B00001D00001F00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040 000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64 003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64 007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D009349009346009343 00923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03 018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D00835700885000 8D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100 CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00 D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00 E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00 EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900 F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500 FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F 00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49 000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964 004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564 008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C009239009135 00913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400 218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D3500 9D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800 CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700 D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600 E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400 EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000 F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00 00000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F000021000023000026000028 00002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852 001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364 005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F64009264 00966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028 009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900 387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100 B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200 D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100 DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00 E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00 EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00 F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00000000000002000004000007 00000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031 00003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E57002259 00255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164 006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A 00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B 008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100 586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700 C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00 D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00 DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700 E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500 F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400 FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F 00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031000031000033000035000037 00003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62 003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64 007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D 00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10 008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C00686900706700 7864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700 CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600 D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200 DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100 E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00 F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00 FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F000012000014000016 00001800001B00001D00001F00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040 000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64 003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64 007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D009349009346009343 00923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03 018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D00835700885000 8D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100 CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00 D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00 E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00 EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900 F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500 FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F 00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49 000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964 004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564 008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C009239009135 00913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400 218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D3500 9D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800 CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700 D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600 E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400 EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000 F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00 00000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F000021000023000026000028 00002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852 001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364 005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F64009264 00966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028 009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900 387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100 B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200 D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100 DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00 E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00 EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00 F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00000000000002000004000007 00000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031 00003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E57002259 00255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164 006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A 00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B 008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100 586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700 C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00 D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00 DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700 E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500 F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400 FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F 00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031000031000033000035000037 00003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62 003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64 007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D 00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10 008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C00686900706700 7864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700 CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600 D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200 DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100 E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00 F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00 FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F000012000014000016 00001800001B00001D00001F00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040 000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64 003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64 007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D009349009346009343 00923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03 018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D00835700885000 8D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100 CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00 D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00 E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00 EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900 F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500 FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F 00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49 000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964 004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564 008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C009239009135 00913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400 218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D3500 9D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800 CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700 D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600 E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400 EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000 F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00 00000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F000021000023000026000028 00002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852 001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364 005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F64009264 00966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028 009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900 387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100 B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200 D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100 DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00 E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00 EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00 F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00000000000002000004000007 00000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031 00003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E57002259 00255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164 006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A 00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B 008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100 586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700 C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00 D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00 DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700 E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500 F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400 FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F 00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031000031000033000035000037 00003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62 003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64 007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D 00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10 008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C00686900706700 7864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700 CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600 D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200 DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100 E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00 F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00 FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F000012000014000016 00001800001B00001D00001F00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040 000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64 003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64 007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D009349009346009343 00923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03 018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D00835700885000 8D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100 CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00 D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00 E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00 EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900 F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500 FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F 00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49 000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964 004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564 008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C009239009135 00913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400 218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D3500 9D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800 CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700 D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600 E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400 EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000 F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00 00000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F000021000023000026000028 00002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852 001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364 005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F64009264 00966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028 009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900 387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100 B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200 D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100 DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00 E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00 EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00 F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00000000000002000004000007 00000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031 00003100003300003500003700003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E57002259 00255B00285D002C60002F62003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164 006464006764006B64006E64007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A 00955700945300945000944D00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B 008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100 586F00606C006869007067007864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700 C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00 D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00 DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700 E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500 F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400 FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F 00000F00001200001400001600001800001B00001D00001F00002100002300002600002800002A00002C00002E000031000031000033000035000037 00003900003C00003E000040000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62 003264003664003964003C64003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64 007164007564007864007B64007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D 00944D00934900934600934300923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10 008D0D008D0A008D06008C03018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C00686900706700 7864007E5D008357008850008D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700 CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600 D43600D43800D53B00D53D00D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200 DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100 E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00 F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00 FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F000012000014000016 00001800001B00001D00001F00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040 000042000445000747000A49000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64 003F64004364004664004964004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64 007B64007F64008264008564008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D009349009346009343 00923F00923C00923900913500913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03 018C00098900118600198400218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D00835700885000 8D4900934300983C009D35009D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100 CC1100CC1400CD1600CD1800CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00 D64000D64200D74500D74700D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00 E06E00E07100E17300E17600E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00 EA9D00EA9F00EBA200EBA400EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900 F3C900F4CB00F4CE00F5D000F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500 FDF800FEFA00FEFD00FFFF0000000000000200000400000700000900000B00000D00000F00000F00001200001400001600001800001B00001D00001F 00002100002300002600002800002A00002C00002E00003100003100003300003500003700003900003C00003E000040000042000445000747000A49 000E4B00114E001450001852001852001B54001E5700225900255B00285D002C60002F62003264003664003964003C64003F64004364004664004964 004964004D64005064005364005764005A64005D64006164006464006764006B64006E64007164007564007864007B64007B64007F64008264008564 008964008C64008F6400926400966400966100955D00955A00955700945300945000944D00944D00934900934600934300923F00923C009239009135 00913200912F00902B009028009025008F21008F1E008F1B008F1B008E17008E14008E10008D0D008D0A008D06008C03018C00098900118600198400 218100297E00307C00387900387900407700487400507100586F00606C006869007067007864007E5D008357008850008D4900934300983C009D3500 9D3500A32F00A82800AD2100B31B00B81400BD0E00C20700C80000C80200C90500C90700CA0A00CB0C00CB0F00CC1100CC1100CC1400CD1600CD1800 CE1B00CE1D00CF2000CF2200D02500D02700D12A00D12C00D22F00D23100D33300D43600D43600D43800D53B00D53D00D64000D64200D74500D74700 D84900D84C00D94E00D95100DA5300DA5600DB5800DC5B00DC5B00DC5D00DD6000DD6200DE6400DE6700DF6900DF6C00E06E00E07100E17300E17600 E27800E27B00E37D00E37F00E37F00E48200E58400E58700E68900E68C00E78E00E79100E89300E89600E99800E99A00EA9D00EA9F00EBA200EBA400 EBA400ECA700ECA900EDAC00EEAE00EEB100EFB300EFB500F0B800F0BA00F1BD00F1BF00F2C200F2C400F3C700F3C900F3C900F4CB00F4CE00F5D000 F5D300F6D500F7D800F7DA00F8DD00F8DF00F9E200F9E400FAE600FAE900FBEB00FBEE00FBEE00FCF000FCF300FDF500FDF800FEFA00FEFD00FFFF00 grestore 10375 0 62 1622 L 0 187 C -10375 0 C 0 -187 C 0 1 4940 1864 L 1 4 C 2 1 C 3 2 C 7 0 C 3 -2 C 2 -1 C 2 -4 C 0 -3 C -2 -3 C -3 -6 C -17 -16 C 23 0 C -5 -2 4982 1872 L -4 -5 C -2 -8 C 0 -5 C 2 -9 C 4 -5 C 5 -1 C 3 0 C 5 1 C 3 5 C 2 9 C 0 5 C -2 8 C -3 5 C -5 2 C -3 0 C -1 -1 5008 1860 L 1 -2 C 2 2 C -2 1 C -1 -2 5008 1840 L 1 -1 C 2 1 C -2 2 C 0 -35 5050 1872 L 16 0 5050 1872 L 5 -2 C 1 -1 C 2 -4 C 0 -3 C -2 -3 C -1 -2 C -5 -2 C 16 0 5050 1855 L 5 -2 C 1 -1 C 2 -4 C 0 -5 C -2 -3 C -1 -2 C -5 -1 C -16 0 C 0 -23 5104 1860 L -3 4 5104 1855 L -4 1 C -5 0 C -3 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 3 -1 C 5 0 C 4 1 C 3 4 C 0 -29 5119 1872 L 2 -5 C 3 -1 C 4 0 C 12 0 5114 1860 L 20 0 5136 1850 L 0 3 C -1 4 C -2 2 C -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 3 4 C 0 -35 5195 1872 L 15 0 5195 1872 L 5 -2 C 2 -1 C 1 -4 C 0 -3 C -1 -3 C -2 -2 C -5 -2 C 15 0 5195 1855 L 5 -2 C 2 -1 C 1 -4 C 0 -5 C -1 -3 C -2 -2 C -5 -1 C -15 0 C 0 -35 5230 1872 L 15 0 5230 1872 L 5 -2 C 2 -1 C 2 -4 C 0 -3 C -2 -3 C -2 -2 C -5 -2 C -15 0 C 12 -18 5242 1855 L 14 -17 5260 1872 L 0 -18 C -13 -17 5287 1872 L -1 4 5339 1855 L -5 1 C -5 0 C -5 -1 C -2 -4 C 2 -3 C 3 -2 C 8 -2 C 4 -1 C 1 -4 C 0 -1 C -1 -4 C -5 -1 C -5 0 C -5 1 C -2 4 C 0 -23 5370 1860 L -4 4 5370 1855 L -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 4 4 C -4 -1 5390 1860 L -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 4 4 C 1 5 C 0 3 C -1 5 C -4 4 C -3 1 C -5 0 C 2 -2 5413 1872 L 2 2 C -2 2 C -2 -2 C 0 -23 5415 1860 L 0 -23 5428 1860 L 5 6 5428 1853 L 4 1 C 5 0 C 3 -1 C 2 -6 C 0 -16 C 5 6 5447 1853 L 3 1 C 5 0 C 4 -1 C 1 -6 C 0 -16 C 0 -23 5497 1860 L -3 4 5497 1855 L -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 3 4 C 0 -27 5529 1860 L -1 -5 C -2 -1 C -4 -2 C -5 0 C -3 2 C -3 4 5529 1855 L -4 1 C -5 0 C -3 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 3 -1 C 5 0 C 4 1 C 3 4 C 20 0 5541 1850 L 0 3 C -2 4 C -1 2 C -4 1 C -5 0 C -3 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 3 -1 C 5 0 C 4 1 C 3 4 C gsave newpath 62 1622 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -2.167E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D 00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E 00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB 0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C2 4100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E0071 92006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020 DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00 FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00 FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00 FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21 FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6E FFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBF FFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D 00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E 00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB 0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC 0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B1 5200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F0060 9F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013 F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00 FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00 FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000 FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2E FFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7F FFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0 FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E 00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B 00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC 0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F1 1200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A0 5F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053 B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002 FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00 FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000 FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00 FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3F FFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90 FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1 FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B 00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C 00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD 0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E0 1F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C0093 70008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042 C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00 FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000 FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00 FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00 FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50 FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1 FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEE FFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C 00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D 00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE 0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D3 3000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D0082 81007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031 D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000 FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00 FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00 FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10 FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61 FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAE FFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF 00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D 00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E 00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB 0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C2 4100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E0071 92006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020 DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00 FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00 FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00 FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21 FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6E FFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBF FFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D 00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E 00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB 0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC 0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B1 5200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F0060 9F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013 F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00 FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00 FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000 FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2E FFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7F FFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0 FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E 00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B 00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC 0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F1 1200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A0 5F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053 B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002 FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00 FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000 FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00 FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3F FFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90 FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1 FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B 00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C 00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD 0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E0 1F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C0093 70008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042 C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00 FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000 FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00 FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00 FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50 FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1 FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEE FFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C 00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D 00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE 0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D3 3000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D0082 81007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031 D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000 FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00 FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00 FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10 FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61 FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAE FFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF 00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D 00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E 00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB 0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C2 4100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E0071 92006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020 DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00 FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00 FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00 FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21 FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6E FFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBF FFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D 00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E 00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB 0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC 0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B1 5200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F0060 9F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013 F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00 FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00 FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000 FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2E FFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7F FFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0 FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E 00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B 00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC 0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F1 1200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A0 5F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053 B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002 FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00 FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000 FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00 FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3F FFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90 FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1 FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B 00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C 00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD 0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E0 1F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C0093 70008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042 C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00 FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000 FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00 FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00 FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50 FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1 FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEE FFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C 00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D 00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE 0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D3 3000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D0082 81007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031 D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000 FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00 FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00 FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10 FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61 FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAE FFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF 00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D 00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E 00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB 0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C2 4100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E0071 92006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020 DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00 FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00 FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00 FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21 FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6E FFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBF FFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D 00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E 00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB 0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC 0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B1 5200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F0060 9F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013 F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00 FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00 FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000 FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2E FFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7F FFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0 FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E 00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B 00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC 0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F1 1200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A0 5F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053 B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002 FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00 FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000 FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00 FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3F FFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90 FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1 FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B 00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C 00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD 0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E0 1F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C0093 70008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042 C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00 FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000 FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00 FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00 FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50 FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1 FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEE FFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C 00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D 00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE 0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D3 3000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D0082 81007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031 D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000 FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00 FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00 FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10 FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61 FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAE FFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF 00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D 00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E 00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB 0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C2 4100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E0071 92006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020 DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00 FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00 FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00 FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21 FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6E FFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBF FFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D 00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E 00005E00006200006600006B00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB 0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC 0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B1 5200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F0060 9F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013 F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00 FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00 FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000 FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2E FFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7F FFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0 FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E 00001E00002200002600002B00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B 00006F00007300007700007C00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC 0000C00000C40000C90000CD0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F1 1200ED1600E91B00E41F00E01F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A0 5F00A063009C6700986C009370008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053 B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002 FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00 FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000 FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00 FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3F FFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90 FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1 FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B 00002F00003300003700003C00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C 00008000008400008900008D00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD 0000D10000D50000DA0000DE0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E0 1F00E02300DC2700D82C00D33000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C0093 70008F74008B7900867D008281007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042 C1003EC5003ACA0035CE0031D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00 FF1300FF1700FF1C00FF2000FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000 FF6000FF6400FF6900FF6D00FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00 FFB100FFB500FFBA00FFBE00FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00 FFFF03FFFF07FFFF0CFFFF10FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50 FFFF54FFFF59FFFF5DFFFF61FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1 FFFFA1FFFFA5FFFFAAFFFFAEFFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEE FFFFF2FFFFF6FFFFFBFFFFFF00000000000400000900000D00001100001500001A00001E00001E00002200002600002B00002F00003300003700003C 00004000004400004900004D00005100005500005A00005E00005E00006200006600006B00006F00007300007700007C00008000008400008900008D 00009100009500009A00009E00009E0000A20000A60000AB0000AF0000B30000B80000BC0000C00000C40000C90000CD0000D10000D50000DA0000DE 0000DE0000E20000E60000EB0000EF0000F30000F80000FC0100FE0500FA0A00F50E00F11200ED1600E91B00E41F00E01F00E02300DC2700D82C00D3 3000CF3400CB3900C63D00C24100BE4500BA4A00B54E00B15200AD5600A95B00A45F00A05F00A063009C6700986C009370008F74008B7900867D0082 81007E85007A8A00758E007192006D9600699B00649F00609F0060A3005CA80057AC0053B0004FB4004BB90046BD0042C1003EC5003ACA0035CE0031 D2002DD60029DB0024DF0020DF0020E3001CE80017EC0013F0000FF4000BF90006FD0002FF0200FF0600FF0B00FF0F00FF1300FF1700FF1C00FF2000 FF2000FF2400FF2900FF2D00FF3100FF3500FF3A00FF3E00FF4200FF4600FF4B00FF4F00FF5300FF5700FF5C00FF6000FF6000FF6400FF6900FF6D00 FF7100FF7500FF7A00FF7E00FF8200FF8600FF8B00FF8F00FF9300FF9800FF9C00FFA000FFA000FFA400FFA900FFAD00FFB100FFB500FFBA00FFBE00 FFC200FFC600FFCB00FFCF00FFD300FFD800FFDC00FFE000FFE000FFE400FFE900FFED00FFF100FFF500FFFA00FFFE00FFFF03FFFF07FFFF0CFFFF10 FFFF14FFFF19FFFF1DFFFF21FFFF21FFFF25FFFF2AFFFF2EFFFF32FFFF36FFFF3BFFFF3FFFFF43FFFF47FFFF4CFFFF50FFFF54FFFF59FFFF5DFFFF61 FFFF61FFFF65FFFF6AFFFF6EFFFF72FFFF76FFFF7BFFFF7FFFFF83FFFF88FFFF8CFFFF90FFFF94FFFF99FFFF9DFFFFA1FFFFA1FFFFA5FFFFAAFFFFAE FFFFB2FFFFB6FFFFBBFFFFBFFFFFC3FFFFC8FFFFCCFFFFD0FFFFD4FFFFD9FFFFDDFFFFE1FFFFE1FFFFE5FFFFEAFFFFEEFFFFF2FFFFF6FFFFFBFFFFFF grestore 10375 0 62 1310 L 0 187 C -10375 0 C 0 -187 C 0 1 4985 1552 L 2 4 C 1 1 C 4 2 C 6 0 C 4 -2 C 1 -1 C 2 -4 C 0 -3 C -2 -3 C -3 -5 C -17 -17 C 24 0 C 3 2 5022 1553 L 5 5 C 0 -35 C -2 -1 5054 1548 L 2 -2 C 1 2 C -1 1 C -2 -2 5054 1528 L 2 -1 C 1 1 C -1 2 C 2 -2 5094 1560 L 1 2 C -1 2 C -2 -2 C 0 -23 5096 1548 L -4 4 5128 1543 L -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C 20 0 5138 1538 L 0 4 C -2 3 C -1 2 C -4 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 4 1 C 3 4 C -3 -4 5208 1567 L -3 -5 C -4 -6 C -1 -9 C 0 -7 C 1 -8 C 4 -7 C 3 -5 C 3 -3 C 0 -35 5220 1560 L 3 4 5220 1543 L 4 1 C 5 0 C 3 -1 C 4 -4 C 1 -5 C 0 -3 C -1 -5 C -4 -4 C -3 -1 C -5 0 C -4 1 C -3 4 C 0 -35 5252 1560 L 0 -17 5265 1548 L 2 -5 C 3 -1 C 6 0 C 3 1 C 5 5 C 0 -23 5284 1548 L 20 0 5296 1538 L 0 4 C -2 3 C -2 2 C -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C 30 0 5328 1540 L 6 -23 5370 1548 L -7 -23 5383 1548 L 7 -23 5383 1548 L -6 -23 5396 1548 L 0 -35 5408 1560 L 5 5 5408 1542 L 4 1 C 5 0 C 3 -1 C 2 -5 C 0 -17 C 2 -2 5438 1560 L 2 2 C -2 2 C -2 -2 C 0 -23 5440 1548 L 0 -29 5455 1560 L 2 -5 C 3 -1 C 4 0 C 12 0 5450 1548 L 20 0 5472 1538 L 0 4 C -1 3 C -2 2 C -3 1 C -6 0 C -3 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 3 -1 C 6 0 C 3 1 C 3 4 C 4 -4 5502 1567 L 3 -5 C 3 -6 C 2 -9 C 0 -7 C -2 -8 C -3 -7 C -3 -5 C -4 -3 C gsave newpath 62 1310 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -1.750E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage 00000000000100000300000400000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A 00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030000031000033000034000036 00003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050 00005100005200005400005500005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B 00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587 000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A2 0026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC 0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D8 0067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F3 0088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF 1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF 70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FF C3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF000000000001000003000004 00000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020 00002000002100002300002400002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A 00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050000051000052000054000055 00005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071 00007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C 000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6 002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2 004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD 006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9 008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF 30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF 82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFF D4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A 00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020000020000021000023000024 00002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040 00004100004300004400004500004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B 00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071000072000074000075000077 00007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191 001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC 0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C8 0054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E3 0073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD 0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF 41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF 93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FF E1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E 00001000001100001300001400001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A 00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040000041000043000044000045 00004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061 00006100006200006400006500006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B 00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897 001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2 003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE 0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8 007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF 009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF 52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FF A0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FF F2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E000010000011000013000014 00001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030 00003100003300003400003600003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B 00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061000061000062000064000065 00006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081 000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C 00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B8 0040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD2 0060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED 0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF 11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF 5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFF B1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF 00000000000100000300000400000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A 00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030000031000033000034000036 00003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050 00005100005200005400005500005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B 00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587 000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A2 0026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC 0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D8 0067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F3 0088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF 1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF 70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FF C3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF000000000001000003000004 00000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020 00002000002100002300002400002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A 00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050000051000052000054000055 00005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071 00007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C 000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6 002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2 004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD 006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9 008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF 30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF 82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFF D4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A 00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020000020000021000023000024 00002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040 00004100004300004400004500004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B 00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071000072000074000075000077 00007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191 001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC 0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C8 0054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E3 0073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD 0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF 41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF 93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FF E1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E 00001000001100001300001400001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A 00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040000041000043000044000045 00004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061 00006100006200006400006500006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B 00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897 001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2 003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE 0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8 007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF 009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF 52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FF A0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FF F2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E000010000011000013000014 00001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030 00003100003300003400003600003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B 00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061000061000062000064000065 00006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081 000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C 00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B8 0040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD2 0060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED 0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF 11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF 5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFF B1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF 00000000000100000300000400000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A 00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030000031000033000034000036 00003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050 00005100005200005400005500005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B 00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587 000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A2 0026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC 0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D8 0067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F3 0088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF 1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF 70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FF C3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF000000000001000003000004 00000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020 00002000002100002300002400002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A 00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050000051000052000054000055 00005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071 00007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C 000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6 002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2 004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD 006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9 008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF 30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF 82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFF D4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A 00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020000020000021000023000024 00002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040 00004100004300004400004500004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B 00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071000072000074000075000077 00007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191 001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC 0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C8 0054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E3 0073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD 0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF 41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF 93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FF E1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E 00001000001100001300001400001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A 00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040000041000043000044000045 00004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061 00006100006200006400006500006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B 00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897 001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2 003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE 0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8 007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF 009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF 52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FF A0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FF F2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E000010000011000013000014 00001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030 00003100003300003400003600003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B 00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061000061000062000064000065 00006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081 000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C 00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B8 0040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD2 0060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED 0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF 11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF 5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFF B1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF 00000000000100000300000400000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A 00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030000031000033000034000036 00003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050 00005100005200005400005500005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B 00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587 000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A2 0026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC 0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D8 0067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F3 0088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF 1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF 70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FF C3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF000000000001000003000004 00000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020 00002000002100002300002400002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A 00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050000051000052000054000055 00005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071 00007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C 000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6 002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2 004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD 006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9 008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF 30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF 82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFF D4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A 00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020000020000021000023000024 00002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040 00004100004300004400004500004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B 00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071000072000074000075000077 00007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191 001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC 0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C8 0054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E3 0073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD 0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF 41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF 93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FF E1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E 00001000001100001300001400001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A 00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040000041000043000044000045 00004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061 00006100006200006400006500006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B 00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897 001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2 003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE 0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8 007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF 009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF 52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FF A0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FF F2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E000010000011000013000014 00001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030 00003100003300003400003600003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B 00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061000061000062000064000065 00006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081 000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C 00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B8 0040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD2 0060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED 0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF 11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF 5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFF B1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF 00000000000100000300000400000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A 00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030000031000033000034000036 00003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050 00005100005200005400005500005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B 00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587 000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A2 0026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC 0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D8 0067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F3 0088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF 1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF 70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FF C3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF000000000001000003000004 00000600000700000900000A00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020 00002000002100002300002400002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A 00003B00003D00003E00004000004100004300004400004500004700004800004A00004B00004B00004D00004E000050000051000052000054000055 00005700005800005A00005B00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071 00007200007400007500007700007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C 000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6 002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2 004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD 006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9 008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF 30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF 82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFF D4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A 00000A00000C00000D00000E00001000001100001300001400001600001700001900001A00001B00001D00001E000020000020000021000023000024 00002600002700002900002A00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040 00004100004300004400004500004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B 00005D00005E00006000006100006100006200006400006500006700006800006A00006B00006D00006E00006F000071000072000074000075000077 00007700007800007A00007B00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191 001392001594001795001897001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC 0034AE0035AF0037B10039B2003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C8 0054C90056CB0058CC0059CE0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E3 0073E30075E50077E60078E8007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD 0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF 41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF 93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FF E1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E 00001000001100001300001400001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A 00002B00002D00002E00003000003100003300003400003600003600003700003800003A00003B00003D00003E000040000041000043000044000045 00004700004800004A00004B00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061 00006100006200006400006500006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B 00007C00007E00007F000081000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897 001A98001C99001D9B001F9C00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2 003BB3003CB5003EB60040B80040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE 0059CE005BCF005DD0005FD20060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8 007AE9007CEB007DEC007FED0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF 009AFF049CFF099DFF0D9FFF11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF 52BBFF57BCFF5BBEFF5FC0FF5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FF A0D9FFA4DBFFA9DDFFADDEFFB1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FF F2FAFFF6FCFFFBFDFFFFFFFF00000000000100000300000400000600000700000900000A00000A00000C00000D00000E000010000011000013000014 00001600001700001900001A00001B00001D00001E00002000002000002100002300002400002600002700002900002A00002B00002D00002E000030 00003100003300003400003600003600003700003800003A00003B00003D00003E00004000004100004300004400004500004700004800004A00004B 00004B00004D00004E00005000005100005200005400005500005700005800005A00005B00005D00005E000060000061000061000062000064000065 00006700006800006A00006B00006D00006E00006F00007100007200007400007500007700007700007800007A00007B00007C00007E00007F000081 000082000284000485000587000788000989000B8B000C8C000C8C000E8E00108F001191001392001594001795001897001A98001C99001D9B001F9C 00219E00239F0024A10026A20026A20028A40029A5002BA6002DA8002FA90030AB0032AC0034AE0035AF0037B10039B2003BB3003CB5003EB60040B8 0040B80041B90043BB0045BC0047BE0048BF004AC1004CC2004DC3004FC50051C60053C80054C90056CB0058CC0059CE0059CE005BCF005DD0005FD2 0060D30062D50064D60065D80067D90069DB006BDC006CDD006EDF0070E00071E20073E30073E30075E50077E60078E8007AE9007CEB007DEC007FED 0081EF0083F00084F20086F30088F50089F6008BF8008DF9008DF9008FFA0090FC0092FD0094FF0095FF0097FF0098FF009AFF049CFF099DFF0D9FFF 11A1FF16A3FF1AA4FF1EA6FF1EA6FF23A8FF27A9FF2BABFF30ADFF34AFFF38B0FF3DB2FF41B4FF45B5FF4AB7FF4EB9FF52BBFF57BCFF5BBEFF5FC0FF 5FC0FF63C1FF68C3FF6CC5FF70C7FF75C8FF79CAFF7DCCFF82CDFF86CFFF8AD1FF8FD3FF93D4FF97D6FF9CD8FFA0D9FFA0D9FFA4DBFFA9DDFFADDEFF B1E0FFB6E2FFBAE4FFBEE5FFC3E7FFC7E9FFCBEAFFCFECFFD4EEFFD8F0FFDCF1FFE1F3FFE1F3FFE5F5FFE9F6FFEEF8FFF2FAFFF6FCFFFBFDFFFFFFFF grestore 10375 0 62 998 L 0 187 C -10375 0 C 0 -187 C 0 1 5158 1240 L 2 4 C 1 1 C 4 2 C 6 0 C 4 -2 C 1 -1 C 2 -4 C 0 -3 C -2 -3 C -3 -5 C -17 -17 C 24 0 C 0 1 5192 1240 L 1 4 C 2 1 C 3 2 C 7 0 C 3 -2 C 2 -1 C 2 -4 C 0 -3 C -2 -3 C -3 -5 C -17 -17 C 23 0 C -2 -1 5227 1236 L 2 -2 C 2 2 C -2 1 C -2 -2 5227 1216 L 2 -1 C 2 1 C -2 2 C -3 0 5279 1248 L -4 -2 C -2 -5 C 0 -28 C 12 0 5265 1236 L 2 -2 5287 1248 L 2 2 C -2 2 C -2 -2 C 0 -23 5289 1236 L 0 -23 5302 1236 L 2 5 5302 1226 L 3 4 C 4 1 C 5 0 C 20 0 5323 1226 L 0 4 C -2 3 C -2 2 C -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C gsave newpath 62 998 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -1.333E+02 ] {currentfile picstr readhexstring pop} false 3 colorimage FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000 FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00 FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00 FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700 FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500 FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300 FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00 FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00 FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA00 97B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C00 1D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D428642488948 4D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AA AFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800 FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600 FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200 FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000 FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00 FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00 FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800 FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500 FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300 FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A900 82A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000 015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C 629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BF C4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00 FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00 FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900 FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600 FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400 FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000 FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00 FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00 FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600 E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D00 6799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F 146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A371 76A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4 D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400 FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100 FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00 FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00 FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900 FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600 FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400 FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200 FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00 CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D00 4C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E237223 2875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B186 86B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3 E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00 FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700 FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500 FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100 FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00 FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00 FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00 FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600 FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00 B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C00 3178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38 387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB95 9BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8 FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000 FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00 FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00 FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700 FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500 FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300 FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00 FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00 FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA00 97B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C00 1D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D428642488948 4D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AA AFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800 FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600 FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200 FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000 FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00 FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00 FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800 FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500 FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300 FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A900 82A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000 015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C 629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BF C4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00 FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00 FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900 FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600 FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400 FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000 FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00 FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00 FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600 E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D00 6799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F 146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A371 76A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4 D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400 FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100 FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00 FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00 FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900 FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600 FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400 FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200 FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00 CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D00 4C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E237223 2875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B186 86B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3 E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00 FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700 FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500 FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100 FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00 FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00 FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00 FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600 FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00 B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C00 3178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38 387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB95 9BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8 FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000 FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00 FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00 FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700 FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500 FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300 FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00 FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00 FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA00 97B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C00 1D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D428642488948 4D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AA AFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800 FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600 FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200 FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000 FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00 FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00 FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800 FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500 FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300 FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A900 82A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000 015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C 629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BF C4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00 FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00 FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900 FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600 FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400 FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000 FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00 FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00 FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600 E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D00 6799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F 146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A371 76A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4 D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400 FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100 FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00 FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00 FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900 FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600 FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400 FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200 FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00 CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D00 4C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E237223 2875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B186 86B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3 E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00 FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700 FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500 FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100 FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00 FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00 FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00 FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600 FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00 B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C00 3178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38 387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB95 9BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8 FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000 FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00 FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00 FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700 FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500 FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300 FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00 FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00 FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA00 97B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C00 1D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D428642488948 4D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AA AFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800 FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600 FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200 FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000 FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00 FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00 FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800 FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500 FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300 FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A900 82A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000 015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C 629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BF C4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00 FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00 FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900 FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600 FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400 FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000 FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00 FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00 FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600 E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D00 6799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F 146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A371 76A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4 D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400 FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100 FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00 FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00 FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900 FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600 FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400 FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200 FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00 CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D00 4C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E237223 2875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B186 86B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3 E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00 FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700 FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500 FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100 FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00 FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00 FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00 FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600 FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00 B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C00 3178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38 387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB95 9BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8 FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000 FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00 FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00 FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700 FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500 FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300 FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00 FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00 FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA00 97B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C00 1D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D428642488948 4D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AA AFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800 FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600 FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200 FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000 FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00 FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00 FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800 FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500 FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300 FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A900 82A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000 015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C 629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BF C4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00 FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00 FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900 FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600 FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400 FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000 FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00 FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00 FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600 E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D00 6799006195005A9100538D004C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F 146814196B191E6E1E2372232875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A371 76A7767CAA7C81AD8186B18686B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4 D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400 FF1500FF1700FF1800FF1A00FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100 FF3300FF3400FF3600FF3700FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00 FF5000FF5200FF5300FF5500FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00 FF6D00FF6E00FF7000FF7100FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900 FF8A00FF8C00FF8D00FF8F00FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600 FFA800FFA900FFAB00FFAD00FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400 FFC600FFC700FFC900FFCA00FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200 FFE200FFE300FFE500FFE600FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00 CDD600C6D200C0CE00B9CA00B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D00 4C89004585003F8100387C003178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E237223 2875282E782E337C33387F38387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B186 86B1868BB48B90B79095BB959BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3 E9F0E9EEF3EEF3F7F3F8FAF8FF0000FF0300FF0500FF0800FF0A00FF0C00FF0D00FF0F00FF0F00FF1000FF1200FF1400FF1500FF1700FF1800FF1A00 FF1B00FF1D00FF1E00FF2000FF2100FF2300FF2500FF2600FF2600FF2800FF2900FF2B00FF2C00FF2E00FF3000FF3100FF3300FF3400FF3600FF3700 FF3900FF3A00FF3C00FF3E00FF3E00FF3F00FF4100FF4200FF4400FF4500FF4700FF4900FF4A00FF4C00FF4D00FF4F00FF5000FF5200FF5300FF5500 FF5500FF5700FF5800FF5A00FF5B00FF5D00FF5E00FF6000FF6200FF6300FF6500FF6600FF6800FF6900FF6B00FF6D00FF6D00FF6E00FF7000FF7100 FF7300FF7400FF7600FF7700FF7900FF7B00FF7C00FF7E00FF7F00FF8100FF8200FF8400FF8400FF8600FF8700FF8900FF8A00FF8C00FF8D00FF8F00 FF9000FF9200FF9400FF9500FF9700FF9800FF9A00FF9B00FF9B00FF9D00FF9F00FFA000FFA200FFA300FFA500FFA600FFA800FFA900FFAB00FFAD00 FFAE00FFB000FFB100FFB300FFB300FFB400FFB600FFB800FFB900FFBB00FFBC00FFBE00FFBF00FFC100FFC300FFC400FFC600FFC700FFC900FFCA00 FFCA00FFCC00FFCD00FFCF00FFD100FFD200FFD400FFD500FFD700FFD800FFDA00FFDC00FFDD00FFDF00FFE000FFE200FFE200FFE300FFE500FFE600 FFE800FFEA00FFEB00FFED00FFEE00FFF000FFF100FFF300FDF300F6EF00EFEB00E8E600E8E600E2E200DBDE00D4DA00CDD600C6D200C0CE00B9CA00 B2C600ABC200A4BE009EBA0097B60090B10089AD0082A90082A9007CA50075A1006E9D006799006195005A9100538D004C89004585003F8100387C00 3178002A74002370001D6C001D6C001668000F6400086000015C00045E040961090F640F146814196B191E6E1E2372232875282E782E337C33387F38 387F383D823D4286424889484D8C4D5290525793575C965C629A62679D676CA06C71A37176A7767CAA7C81AD8186B18686B1868BB48B90B79095BB95 9BBE9BA0C1A0A5C5A5AAC8AAAFCBAFB5CFB5BAD2BABFD5BFC4D9C4C9DCC9CFDFCFD4E3D4D4E3D4D9E6D9DEE9DEE3EDE3E9F0E9EEF3EEF3F7F3F8FAF8 grestore 10375 0 62 686 L 0 187 C -10375 0 C 0 -187 C 0 1 5083 928 L 2 4 C 2 1 C 3 2 C 7 0 C 3 -2 C 2 -1 C 1 -4 C 0 -3 C -1 -3 C -4 -5 C -16 -17 C 23 0 C 19 0 5118 936 L -10 -13 C 5 0 C 3 -2 C 2 -2 C 2 -5 C 0 -3 C -2 -5 C -3 -4 C -5 -1 C -5 0 C -6 1 C -1 2 C -2 4 C -2 -1 5152 924 L 2 -2 C 2 2 C -2 1 C -2 -2 5152 904 L 2 -1 C 2 1 C -2 2 C 0 -35 5194 936 L 3 4 5194 919 L 4 1 C 5 0 C 3 -1 C 4 -4 C 1 -5 C 0 -3 C -1 -5 C -4 -4 C -3 -1 C -5 0 C -4 1 C -3 4 C 0 -35 5226 936 L 0 -16 5239 924 L 2 -6 C 3 -1 C 6 0 C 3 1 C 5 6 C 0 -23 5258 924 L 20 0 5270 914 L 0 4 C -2 3 C -2 2 C -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C 30 0 5302 916 L 0 -23 5345 924 L 2 5 5345 914 L 3 4 C 4 1 C 5 0 C 21 0 5365 914 L 0 4 C -2 3 C -2 2 C -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -4 C 4 -1 C 5 0 C 3 1 C 4 4 C 0 -35 5416 936 L -4 4 5416 919 L -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -4 C 3 -1 C 5 0 C 3 1 C 4 4 C gsave newpath 62 686 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -9.167E+01 ] {currentfile picstr readhexstring pop} false 3 colorimage 00102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73 002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B4 0147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C 116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F8347208544218741 22883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA127 50A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB827 8EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926 CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18 E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541F F05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528 FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231A FD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100B FD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C001230001334001538 00163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F003183 00318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB 054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70 156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35 258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA627 5AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB27 9CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24 D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015 E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22 F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225 FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17 FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08 FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48 001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E 003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E 08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D167069177266177463 18756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C289428 2894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA27 68AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027 AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21 D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717 E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824 F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22 FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14 FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805 FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F53 00205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E 003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A92 0B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B57 1B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827 349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE27 76AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527 B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1E D89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219 EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027 F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1F FD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711 FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503 FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F002563 00266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE 0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E6185 0E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E 1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27 429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B327 84B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927 C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1B DC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1C ED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392A FC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261C FD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140E FD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE0100 00102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73 002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B4 0147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C 116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F8347208544218741 22883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA127 50A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB827 8EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926 CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18 E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541F F05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528 FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231A FD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100B FD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C001230001334001538 00163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F003183 00318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB 054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70 156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35 258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA627 5AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB27 9CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24 D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015 E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22 F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225 FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17 FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08 FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48 001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E 003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E 08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D167069177266177463 18756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C289428 2894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA27 68AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027 AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21 D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717 E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824 F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22 FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14 FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805 FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F53 00205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E 003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A92 0B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B57 1B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827 349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE27 76AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527 B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1E D89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219 EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027 F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1F FD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711 FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503 FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F002563 00266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE 0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E6185 0E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E 1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27 429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B327 84B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927 C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1B DC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1C ED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392A FC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261C FD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140E FD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE0100 00102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73 002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B4 0147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C 116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F8347208544218741 22883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA127 50A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB827 8EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926 CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18 E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541F F05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528 FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231A FD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100B FD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C001230001334001538 00163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F003183 00318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB 054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70 156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35 258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA627 5AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB27 9CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24 D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015 E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22 F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225 FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17 FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08 FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48 001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E 003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E 08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D167069177266177463 18756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C289428 2894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA27 68AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027 AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21 D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717 E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824 F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22 FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14 FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805 FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F53 00205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E 003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A92 0B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B57 1B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827 349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE27 76AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527 B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1E D89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219 EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027 F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1F FD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711 FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503 FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F002563 00266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE 0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E6185 0E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E 1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27 429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B327 84B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927 C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1B DC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1C ED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392A FC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261C FD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140E FD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE0100 00102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73 002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B4 0147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C 116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F8347208544218741 22883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA127 50A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB827 8EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926 CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18 E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541F F05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528 FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231A FD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100B FD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C001230001334001538 00163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F003183 00318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB 054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70 156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35 258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA627 5AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB27 9CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24 D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015 E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22 F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225 FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17 FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08 FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48 001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E 003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E 08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D167069177266177463 18756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C289428 2894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA27 68AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027 AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21 D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717 E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824 F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22 FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14 FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805 FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F53 00205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E 003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A92 0B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B57 1B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827 349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE27 76AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527 B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1E D89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219 EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027 F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1F FD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711 FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503 FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F002563 00266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE 0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E6185 0E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E 1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27 429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B327 84B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927 C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1B DC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1C ED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392A FC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261C FD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140E FD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE0100 00102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73 002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B4 0147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C 116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F8347208544218741 22883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA127 50A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB827 8EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926 CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18 E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541F F05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528 FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231A FD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100B FD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C001230001334001538 00163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F003183 00318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB 054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70 156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35 258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA627 5AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB27 9CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24 D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015 E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22 F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225 FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17 FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08 FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48 001A48001C4C001D4F001F5300205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E 003792003896003A9A003B9E003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E 08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D167069177266177463 18756019775D1A795A1B7B571B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C289428 2894282A96272D9727319827349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA27 68AB276CAC276FAD2773AE2776AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027 AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21 D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717 E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824 F64625F74425F74226F84027F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22 FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14 FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805 FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F53 00205700225B00235F00256300266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E 003DA2003EA60040AA0041AE0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A92 0B5C8F0C5E8C0D5F880E61850E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B57 1B7B571C7C541D7E511D804E1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827 349927389A273B9B273F9D27429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE27 76AF2779B1277DB22780B32784B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527 B8C627BBC727BFC827C2C927C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1E D89A1ED9971DDA931CDB8F1BDC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219 EA601AEB5E1BEB5D1BEC5B1CED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027 F93F27FA3D28FB3B29FB392AFC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1F FD291EFD281EFD271DFD261CFD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711 FD1711FD1610FD150FFD140EFD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503 FE0402FE0302FE0201FE010000102C00123000133400153800163C001840001944001A48001A48001C4C001D4F001F5300205700225B00235F002563 00266700286B00296F002B73002C77002E7B002F7F00318300318300328700348A00358E003792003896003A9A003B9E003DA2003EA60040AA0041AE 0043B20044B60046B70147B40147B40249B1034BAE044DAB054EA70550A40652A107539E08559B0957980A59950B5A920B5C8F0C5E8C0D5F880E6185 0E61850F638210647F11667C116879126A76136B73146D70156F6D16706917726617746318756019775D1A795A1B7B571B7B571C7C541D7E511D804E 1E814A1F834720854421874122883E238A3B238C38248D35258F3226912F27922C2894282894282A96272D9727319827349927389A273B9B273F9D27 429E27469F2749A0274CA12750A22753A42757A5275AA6275AA6275EA72761A82765AA2768AB276CAC276FAD2773AE2776AF2779B1277DB22780B327 84B42787B5278BB6278EB8278EB82792B92795BA2799BB279CBC279FBE27A3BF27A6C027AAC127ADC227B1C327B4C527B8C627BBC727BFC827C2C927 C2C927C5CA27C9CC27CBC926CCC526CDC125CEBE24CFBA24D0B623D1B222D2AE21D3AA21D4A620D5A21FD69E1ED89A1ED89A1ED9971DDA931CDB8F1B DC8B1BDD871ADE8319DF7F18E07B18E17717E27316E37015E46C15E56B16E66917E76717E76717E76518E86419E96219EA601AEB5E1BEB5D1BEC5B1C ED591DEE571EEF561EEF541FF05220F15020F24F21F34D22F34D22F34B22F44923F54824F64625F74425F74226F84027F93F27FA3D28FB3B29FB392A FC382AFC3729FC3628FC3528FC3528FC3427FC3326FC3225FC3125FC3024FC2F23FC2E22FC2D22FC2C21FC2B20FC2A1FFD291EFD281EFD271DFD261C FD261CFD251BFD241BFD231AFD2219FD2118FD2018FD1F17FD1E16FD1D15FD1C15FD1B14FD1A13FD1912FD1812FD1711FD1711FD1610FD150FFD140E FD130EFD120DFD110CFD100BFD0F0BFD0E0AFE0D09FE0C08FE0B08FE0A07FE0906FE0805FE0805FE0705FE0604FE0503FE0402FE0302FE0201FE0100 grestore 10375 0 62 374 L 0 188 C -10375 0 C 0 -188 C 0 1 5075 616 L 1 4 C 2 1 C 4 2 C 6 0 C 4 -2 C 1 -1 C 2 -4 C 0 -3 C -2 -3 C -3 -5 C -17 -17 C 24 0 C -17 -23 5124 624 L 25 0 C 0 -35 5124 624 L -2 -1 5144 612 L 2 -2 C 1 2 C -1 1 C -2 -1 5144 592 L 2 -2 C 1 2 C -1 1 C 0 -23 5186 612 L 5 5 5186 606 L 3 1 C 5 0 C 3 -1 C 2 -5 C 0 -17 C 5 5 5204 606 L 4 1 C 5 0 C 3 -1 C 2 -5 C 0 -17 C 21 0 5234 602 L 0 4 C -2 3 C -2 2 C -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 4 3 C 0 -23 5266 612 L 5 5 5266 606 L 4 1 C 5 0 C 3 -1 C 2 -5 C 0 -17 C 0 -23 5317 612 L -4 4 5317 607 L -3 1 C -5 0 C -3 -1 C -4 -4 C -1 -5 C 0 -3 C 1 -5 C 4 -3 C 3 -2 C 5 0 C 3 2 C 4 3 C -4 4 5349 607 L -3 1 C -5 0 C -4 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 4 -2 C 5 0 C 3 2 C 4 3 C 1 -2 5359 624 L 2 2 C -2 2 C -1 -2 C 0 -23 5360 612 L 0 -23 5374 612 L 5 5 5374 606 L 3 1 C 5 0 C 4 -1 C 1 -5 C 0 -17 C 0 -27 5424 612 L -1 -5 C -2 -1 C -4 -2 C -5 0 C -3 2 C -3 4 5424 607 L -4 1 C -5 0 C -3 -1 C -3 -4 C -2 -5 C 0 -3 C 2 -5 C 3 -3 C 3 -2 C 5 0 C 4 2 C 3 3 C gsave newpath 62 374 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -5.000E+01 ] {currentfile picstr readhexstring pop} false 3 colorimage 6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000 FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460B E8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722 E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407 B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C7915287614237212 2372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100 002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA 0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E 0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A0299 7A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3 B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DC DFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C0000 8400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802 EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0F F15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27 DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B 99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F 14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857 007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661 00005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D 0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A1 9202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BB BF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4 E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E0000 9E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03 DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014 ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02C E2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E 76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08 094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B5 00C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051 02005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A0059230062 2C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059B A00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4 C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2ED EDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000 BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805 C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419 E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1C EEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C9711 5392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801 013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE9 00DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051020051030051040051040050 05005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B470184 4D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4 A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CD CE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3 F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000 E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707 D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881E E6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0C FBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03 D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115 317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00 002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D9 00B9D400ADCC00A0C30093BA0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F 08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F 6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30AC AF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3 D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC 6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000 FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460B E8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722 E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407 B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C7915287614237212 2372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100 002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA 0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E 0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A0299 7A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3 B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DC DFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C0000 8400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802 EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0F F15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27 DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B 99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F 14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857 007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661 00005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D 0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A1 9202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BB BF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4 E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E0000 9E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03 DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014 ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02C E2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E 76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08 094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B5 00C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051 02005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A0059230062 2C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059B A00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4 C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2ED EDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000 BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805 C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419 E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1C EEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C9711 5392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801 013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE9 00DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051020051030051040051040050 05005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B470184 4D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4 A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CD CE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3 F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000 E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707 D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881E E6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0C FBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03 D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115 317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00 002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D9 00B9D400ADCC00A0C30093BA0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F 08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F 6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30AC AF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3 D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC 6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000 FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460B E8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722 E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407 B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C7915287614237212 2372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100 002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA 0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E 0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A0299 7A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3 B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DC DFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C0000 8400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802 EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0F F15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27 DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B 99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F 14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857 007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661 00005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D 0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A1 9202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BB BF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4 E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E0000 9E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03 DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014 ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02C E2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E 76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08 094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B5 00C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051 02005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A0059230062 2C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059B A00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4 C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2ED EDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000 BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805 C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419 E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1C EEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C9711 5392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801 013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE9 00DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051020051030051040051040050 05005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B470184 4D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4 A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CD CE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3 F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000 E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707 D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881E E6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0C FBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03 D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115 317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00 002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D9 00B9D400ADCC00A0C30093BA0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F 08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F 6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30AC AF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3 D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC 6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000 FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460B E8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722 E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407 B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C7915287614237212 2372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100 002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA 0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E 0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A0299 7A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3 B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DC DFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C0000 8400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802 EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0F F15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27 DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B 99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F 14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857 007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661 00005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D 0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A1 9202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BB BF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4 E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E0000 9E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03 DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014 ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02C E2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E 76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08 094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B5 00C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051 02005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A0059230062 2C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059B A00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4 C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2ED EDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000 BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805 C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419 E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1C EEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C9711 5392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801 013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE9 00DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051020051030051040051040050 05005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B470184 4D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4 A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CD CE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3 F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000 E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707 D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881E E6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0C FBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03 D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115 317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00 002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D9 00B9D400ADCC00A0C30093BA0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F 08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F 6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30AC AF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3 D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC 6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000 FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460B E8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722 E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407 B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C7915287614237212 2372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100 002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA 0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E 0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A0299 7A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3 B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DC DFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C0000 8400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802 EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0F F15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27 DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B 99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F 14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857 007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661 00005201005202005102005102005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D 0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A1 9202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BB BF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4 E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E0000 9E0000A60000AE0000B70000BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03 DC1103D81304D31504CE1805C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014 ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02C E2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E 76A80F6DA210649D115C97115392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08 094906064304033D02013801013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B5 00C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051 02005103005104005104005005005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A0059230062 2C016A3501733E017B4701844D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059B A00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4 C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2ED EDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000 BF0000C70000D00000D80000E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805 C91A05C51C06C32006CA2707D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419 E9791AE87E1BE7831DE6881EE6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1C EEDA1CF1E117F5E811F8EF0CFBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 F9FB01F0F602E8F003DFEB03D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C9711 5392124A8C13418714398115317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801 013401013101012E01002B00002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE9 00DBE900D2E300CADE00C2D900B9D400ADCC00A0C30093BA0075A500568F003678001661000052010052020051020051020051030051040051040050 05005006005006005007004F08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B470184 4D01875401895A018C61018F6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4 A820A6AA25A8AD2BAAAF30ACAF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CD CE81CDD087CFD28CD1D491D3D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3 F6E8F5F8EDF8FAF3FAFCF8FC6300006B00007400007C00008400008D00009500009E00009E0000A60000AE0000B70000BF0000C70000D00000D80000 E10000E90000F10000FA0000FD0100F90301F40501EF0802EF0802EA0A02E60C02E10F03DC1103D81304D31504CE1805C91A05C51C06C32006CA2707 D22F08D93709E13E0AE8460BE8460BEF4D0DF3500EF24F0FF15110F05611EF5B12EE6014ED6515EC6A16EB6F18EA7419E9791AE87E1BE7831DE6881E E6881EE58D1FE49221E39722E29D23E1A225E0A726DFAC27DEB128DDB62ADCBB2BDCC02CE2C62AE8CC27EBD321EEDA1CEEDA1CF1E117F5E811F8EF0C FBF706FEFE01FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00F9FB01F0F602E8F003DFEB03 D6E504CDDF05C5DA06BCD407B3CF08AAC909A2C40A99BE0B99BE0B90B90C87B30D7FAE0E76A80F6DA210649D115C97115392124A8C13418714398115 317C162C79152876142372122372121F6F111A6C1017670F14610D115B0B0F55090C4F08094906064304033D02013801013401013101012E01002B00 002B00002700002400002100002E11004229005540006857007C6F008F8600A39D00B6B500C9CC00DDE400E3EE00DBE900DBE900D2E300CADE00C2D9 00B9D400ADCC00A0C30093BA0075A500568F00367800166100005201005202005102005102005103005104005104005005005006005006005007004F 08004F08004F09004F0A004E0B004E0B004E0C004D0D004D0D004D1100511A00592300622C016A3501733E017B4701844D01875401895A018C61018F 6701916D02947402977A02997A029981029C87029F8D02A19202A097019C9C00999E059BA00A9DA2109FA415A1A61AA4A820A6AA25A8AD2BAAAF30AC AF30ACB135AEB33BB0B540B3B746B5B94BB7BB50B9BD56BBBF5BBDC161C0C466C2C66CC4C871C6CA76C8CC7CCACE81CDCE81CDD087CFD28CD1D491D3 D697D5D89CD7DBA2D9DDA7DCDFACDEE1B2E0E3B7E2E5BDE4E7C2E6E9C7E9EBCDEBEDD2EDEDD2EDEFD8EFF1DDF1F4E2F3F6E8F5F8EDF8FAF3FAFCF8FC grestore 10375 0 62 62 L 0 188 C -10375 0 C 0 -188 C 0 1 5180 304 L 1 4 C 2 1 C 4 2 C 6 0 C 4 -2 C 1 -1 C 2 -4 C 0 -3 C -2 -3 C -3 -5 C -17 -17 C 24 0 C -17 0 5232 312 L -2 -15 C 2 2 C 5 1 C 5 0 C 5 -1 C 4 -4 C 1 -5 C 0 -3 C -1 -5 C -4 -3 C -5 -2 C -5 0 C -5 2 C -2 1 C -1 4 C -2 -1 5249 300 L 2 -2 C 1 2 C -1 1 C -2 -1 5249 280 L 2 -2 C 1 2 C -1 1 C 0 -23 5291 300 L 1 5 5291 290 L 4 4 C 3 1 C 5 0 C 0 -28 5314 312 L 2 -5 C 3 -2 C 4 0 C 12 0 5309 300 L gsave newpath 62 62 moveto 10374 0 rlineto 0 187 rlineto -10374 0 rlineto closepath clip /picstr 256 string def 256 25 8 [ 2.468E-02 -0.000E+00 -0.000E+00 1.336E-01 -1.540E+00 -8.333E+00 ] {currentfile picstr readhexstring pop} false 3 colorimage 3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000540000550000570000590000 5B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C0000 7C00007E00007F00008100008300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D0000 9F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000 C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000 E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00 FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700 FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823 FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64 FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9C FFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7 FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3 FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E0000 3F00004100004300004500004500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000 6000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000 8300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000 A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000 C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000 EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00 FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700 FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431 FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71 FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9E FFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAA FFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5 FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F0000410000430000450000 4500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000600000620000640000660000 6800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000830000850000870000890000 8A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000 AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000 CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000 F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00 FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700 FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3E FFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37B FFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1 FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFAC FFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8 FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A0000 4C00004E00005000005200005400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D0000 6F00007100007300007400007600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000 9200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000 B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000 D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000 F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00 FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840B FF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849 FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89 FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3 FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAF FFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBA FFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000 5400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F0000710000730000740000 7600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000920000940000950000970000 9700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000 BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000 DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000 FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00 FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16 FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356 FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96 FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6 FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0 FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC 3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000540000550000570000590000 5B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C0000 7C00007E00007F00008100008300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D0000 9F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000 C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000 E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00 FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700 FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823 FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64 FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9C FFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7 FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3 FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E0000 3F00004100004300004500004500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000 6000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000 8300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000 A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000 C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000 EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00 FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700 FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431 FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71 FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9E FFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAA FFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5 FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F0000410000430000450000 4500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000600000620000640000660000 6800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000830000850000870000890000 8A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000 AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000 CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000 F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00 FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700 FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3E FFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37B FFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1 FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFAC FFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8 FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A0000 4C00004E00005000005200005400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D0000 6F00007100007300007400007600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000 9200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000 B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000 D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000 F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00 FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840B FF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849 FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89 FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3 FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAF FFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBA FFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000 5400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F0000710000730000740000 7600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000920000940000950000970000 9700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000 BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000 DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000 FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00 FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16 FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356 FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96 FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6 FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0 FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC 3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000540000550000570000590000 5B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C0000 7C00007E00007F00008100008300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D0000 9F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000 C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000 E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00 FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700 FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823 FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64 FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9C FFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7 FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3 FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E0000 3F00004100004300004500004500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000 6000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000 8300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000 A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000 C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000 EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00 FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700 FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431 FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71 FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9E FFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAA FFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5 FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F0000410000430000450000 4500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000600000620000640000660000 6800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000830000850000870000890000 8A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000 AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000 CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000 F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00 FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700 FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3E FFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37B FFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1 FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFAC FFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8 FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A0000 4C00004E00005000005200005400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D0000 6F00007100007300007400007600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000 9200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000 B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000 D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000 F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00 FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840B FF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849 FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89 FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3 FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAF FFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBA FFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000 5400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F0000710000730000740000 7600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000920000940000950000970000 9700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000 BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000 DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000 FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00 FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16 FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356 FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96 FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6 FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0 FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC 3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000540000550000570000590000 5B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C0000 7C00007E00007F00008100008300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D0000 9F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000 C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000 E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00 FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700 FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823 FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64 FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9C FFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7 FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3 FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E0000 3F00004100004300004500004500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000 6000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000 8300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000 A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000 C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000 EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00 FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700 FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431 FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71 FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9E FFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAA FFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5 FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F0000410000430000450000 4500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000600000620000640000660000 6800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000830000850000870000890000 8A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000 AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000 CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000 F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00 FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700 FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3E FFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37B FFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1 FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFAC FFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8 FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A0000 4C00004E00005000005200005400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D0000 6F00007100007300007400007600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000 9200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000 B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000 D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000 F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00 FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840B FF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849 FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89 FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3 FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAF FFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBA FFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000 5400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F0000710000730000740000 7600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000920000940000950000970000 9700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000 BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000 DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000 FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00 FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16 FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356 FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96 FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6 FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0 FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC 3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000540000550000570000590000 5B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C0000 7C00007E00007F00008100008300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D0000 9F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000 C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000 E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00 FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700 FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823 FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64 FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9C FFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7 FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3 FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E0000 3F00004100004300004500004500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000 6000006200006400006600006800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000 8300008500008700008900008A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000 A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000 C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000 EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00 FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700 FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431 FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71 FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9E FFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAA FFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5 FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F0000410000430000450000 4500004700004900004A00004C00004E00005000005200005400005500005700005900005B00005D00005F0000600000600000620000640000660000 6800006900006B00006D00006F00007100007300007400007600007800007A00007C00007C00007E00007F0000810000830000850000870000890000 8A00008C00008E00009000009200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000 AD0000AF0000B10000B30000B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000 CE0000D00000D20000D40000D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000 F10000F30000F40000F60000F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00 FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700 FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3E FFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37B FFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1 FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFAC FFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8 FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A0000 4C00004E00005000005200005400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D0000 6F00007100007300007400007600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000 9200009400009500009700009700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000 B30000B40000B60000B80000BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000 D50000D70000D90000DB0000DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000 F80000FA0000FC0000FE0000FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00 FF3E00FF4200FF4600FF4A00FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840B FF840BFF870FFF8912FF8C16FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849 FFBB4CFFBE4FFFC053FFC356FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89 FFF28CFFF590FFF793FFFA96FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3 FFFFA4FFFFA4FFFFA5FFFFA6FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAF FFFFAFFFFFAFFFFFB0FFFFB0FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBA FFFFBAFFFFBBFFFFBBFFFFBC3800003A00003C00003E00003F00004100004300004500004500004700004900004A00004C00004E0000500000520000 5400005500005700005900005B00005D00005F00006000006000006200006400006600006800006900006B00006D00006F0000710000730000740000 7600007800007A00007C00007C00007E00007F00008100008300008500008700008900008A00008C00008E0000900000920000940000950000970000 9700009900009B00009D00009F0000A00000A20000A40000A60000A80000AA0000AB0000AD0000AF0000B10000B30000B30000B40000B60000B80000 BA0000BC0000BE0000BF0000C10000C30000C50000C70000C90000CA0000CC0000CE0000CE0000D00000D20000D40000D50000D70000D90000DB0000 DD0000DF0000E00000E20000E40000E60000E80000EA0000EA0000EB0000ED0000EF0000F10000F30000F40000F60000F80000FA0000FC0000FE0000 FF0100FF0500FF0900FF0D00FF0D00FF1100FF1500FF1A00FF1E00FF2200FF2600FF2A00FF2E00FF3200FF3600FF3A00FF3E00FF4200FF4600FF4A00 FF4A00FF4F00FF5300FF5700FF5B00FF5F00FF6300FF6700FF6B00FF6F00FF7300FF7700FF7B01FF7E05FF8108FF840BFF840BFF870FFF8912FF8C16 FF8F19FF921CFF9520FF9823FF9B27FF9E2AFFA12DFFA431FFA634FFA938FFAC3BFFAF3EFFAF3EFFB242FFB545FFB849FFBB4CFFBE4FFFC053FFC356 FFC659FFC95DFFCC60FFCF64FFD267FFD56AFFD86EFFDB71FFDB71FFDD75FFE078FFE37BFFE67FFFE982FFEC86FFEF89FFF28CFFF590FFF793FFFA96 FFFD99FFFF9BFFFF9CFFFF9CFFFF9CFFFF9DFFFF9EFFFF9EFFFF9FFFFF9FFFFFA0FFFFA1FFFFA1FFFFA2FFFFA2FFFFA3FFFFA4FFFFA4FFFFA5FFFFA6 FFFFA6FFFFA6FFFFA7FFFFA7FFFFA8FFFFA9FFFFA9FFFFAAFFFFAAFFFFABFFFFACFFFFACFFFFADFFFFADFFFFAEFFFFAFFFFFAFFFFFAFFFFFB0FFFFB0 FFFFB1FFFFB2FFFFB2FFFFB3FFFFB3FFFFB4FFFFB5FFFFB5FFFFB6FFFFB6FFFFB7FFFFB8FFFFB8FFFFB8FFFFB9FFFFBAFFFFBAFFFFBBFFFFBBFFFFBC grestore PGPLOT restore showpage %%PageTrailer %%PageBoundingBox: 24 22 583 770 %%Trailer %%BoundingBox: 24 22 583 770 %%DocumentFonts: %%Pages: 1 %%EOF danieljprice-splash-4d1f09c/docs/figs/default-mode.png000066400000000000000000002616201477365367100230350ustar00rootroot00000000000000‰PNG  IHDR X'bKGDÿÿÿ ½§“ IDATxœì½y´eEu?¾ëÞ7÷ë)Ý 6‹Á™œZE„  C¤TâB%‚ ËâøMĘhBDpüÑYB"tá‡,@D@TÂÒ(Ø|»iè~ïõ{÷ÖïۧاvU]Ã9÷¼÷ÎgÝu×¹çìÚ{W¡>çSuÎRJhРAƒ 4h­~'РAƒ 4h0×Ь 4hРAƒÄhVƒ 4hРAb4«Aƒ 4hÐ 1‚Õ Aƒ 4h ÁjРAƒ 4HŒ†`5hРAƒ $FC°4hРAƒ £!X 4hРAƒ‰1Ðï*ÂI'tß}÷õ;‹ 4hÐ ÖøÇüÇ}÷Ý÷³ŸýìäädB·Gyä[ßúÖ„ëùB°®¿þú§Ÿzª%D°‡Ž”-áÁˆ®”"…[­|GJS_#·ÛjÜ:üü·×,m„yîÚsÝ­û`îJ %´­ÛmGÊßüæ7ûî»ïÅ_<66¶lÙ²$Azè¡vÚ©!Xs "þxñY€!€“þáß³”hy#À0ÀhŠ„ÄilIäcÀ0ÀXÞ­ïÙOíÿ/ÀpÜÞ1»Mx‰z``<ËïS¼Æë†J©9ŒÌ\¹õ*UôËRï2ìÖ–C@Èõƒ(ÛTCÏíb{#ð lùL>ÛTx`Àž­qmaþ`@`QvÜò; 6´ýÛBlh¥s«¼lh¡k‚oqžy·Iò~@X®·€Mèç§Îüä_žqFŠ˜°hÉÒ$~ú…ññq¦åÁ|Í5×ô–çÁ* aì *iô7\Ú<)a¥­ZqËÔÂôS’Mñ¼°$8’¦´™gS¿êXWPb˜bØp²±«’PênE•õrUí 0ÄE 5Ç¥XµjÕé§ŸÞn·ÝfSSSkÖ¬Q?‚ß«@IÇiõ}F­Ø•æ¶ï,!2\©àÆ–]Ÿª¹Òö4|:bKÀØz³âL1V­2Ž5æÜi‘°Uc®‡¥îYzaô'º‰Ò™Ý8äC;ì0Žå£>ª–‚ˆT—žvÜ“œ¶4Êy@t €À#•†x·}Ç )Ûøãaœa>µRÔmàF02Ý4=F;’÷.Z¢ü—×Õ¸MÒVÆã6x¿'§bå]Á”Û„G`ðeÜCÛ$EW+ÖJ ÁXµjU€eóšo¤½šŒ —ÆÂP·n,ñ±è“Ð-ôõÞzÀh i,Kç­·  ¨´½ï88ÇI0gÙÎ^·ñ³¨œl$úhH~!À‚އñüéÊÿxÄYæÐ› KM*Ÿ~ÝdŸÙŒ-[¶Üÿý×\sM§Ó€'žxâcû˜Íx¿ýöSË‚åò:/ô%‡ø™ìi!û4â3€RF‘)% ã§T8µYŠ &ý”7÷+ÌsãhiÇ ¼ÑS NzZ5 ÀQG588øÚ×¾ö†n8çœsvÚi§›nº‰S°!X/ â‰œŽ  íãQÛ KåXInËž«[e8f5Geó™JÅl¯…oþeÓÊ´íYó½ãwΦœä^çV)Àã?þÀ!¤”W^yåßøFfÁfˆpj}„«ú÷ uh¨òIâ*-lVyˆª@59)@÷uy» fm+AйÏoƺ5Kßóé{tAvÒ|f38à€gŸ}„Çü#<ÒûYˆ†`q10˜Ú'ÿ¤ªëé×g¸ï‰Æ-S»J¢SÉ]•Ý÷dÅq C'¤B-_Ƭ˜O;|žP}¼ã‚Ki %a˜?C·§`%ùÌf\rÉ%k×®ššêý|ÛÛÞvÑEq Σ!Âô µÁüEs@¥Î‡yÕÿ2T[à‹H’fŒtbé¨É.®C¾Ï:TƒTƒ>i‡º*Šr*ãa¯4Rµªãøkê€RƨŸÈ]ßëË”‡.Às6ÓÙ??= ÆÆÆÞýîwã5G}´fó›ßüæ¯x…¶r,H}¼âL’[6p€ÏeË›0N½¥â|1¯Ë¢¯GÝZœOä«ÅêF³’p,Õ>Õ‹ ÆCÅý¾SÇdpwÙY >Çòí\d¾gìlÍY5ïÁ2 ÛíÞ|óÍ<òÈä䤔¤”×^{í7Þ¨YÎ#‚Õ&÷Ç »š]p\^mö|ϾE¼ ,ËU:4þ÷μ=ÆÂúãBc{#˜ÖÐÛ€ $±úЭÝ$9žK}ŸsLÅÎ{õRã9J°‹à裾öÚkW®\98¸mÞP·Û}òÉ'©å<"XuÀìbW¾9”1 §Ñ‚„㪥¶p 'L‰ºªC×kVé´ÌƒqúõЙªEðŸqü;hV;º²¡ÏÔ9·`¸vºl–×_ý]wݵÏ>ûà•ßúÖ·¨å¼&X2lÕ°Sœ(¼¦xKeŒò^!Ñ÷‰©ÇÔ­+2 xô§cŒ8˜Ó^^’ð¼àyB^ùÔg·ú/Îv[¾ôÝ!%t¬9´o<ðÀ=öØC[IgeAó!~â© ªZqº‰à]Ï$^e€Sý˜ÝMÛÄ᪶«nwY³ ¦¦kþ*Ç€ûî»ï¢‹.ZаbÅŠóÎ;ZÎë!B#Òî»â>ôQ±³L›p€7™_®Ï9¦?sÛЭa Ã6ЖîQ<Û¦€éçn玠aÍs"ÒÁÖòò¡ §ƒ-ŸøÁ©ò†·J8 Ï­,ŸÄ´f– §vÚ‰'žxØa‡ !`rròÒK/¥– Á*ÕôÜ5a„}ABI#¹Ï`a¯(ovÁM¶ªvúPÚÁoO&±óªŽ1Ÿ´;×Hã0bf€ËpM­ìl$p5 Ý,vÜqÇ‹.º¨G­^þò—SËfˆÐ€Y×ë¤B*Nvˆ* /Hò³Ê Uû„¥£°ÖpŒ5ì‹©Õ{˜¡9A#Ï ŠY{L8_ý•ﶤëOÀXyy¡ËÜÑ ›è3wpÖYg]ýõÚʇzˆZ6 VY¨ìê6O—:„.Dßs Ðcl£‡üa¯€#Ç-&ám^†£…~Œ5ª õôͤèNÕ®¸»c<×DÇ2¶mªÜ:mÓAB7ÝS„sk×®ýÉO~‚%+)åý÷ßÿÔSOi– Á*}ïh½ÐP«$K/ù$0}µd’’÷[\w]³Û@óà YØÀöØ×ˆa =¢uìÒ‘ míx-ª$šÕwH€ç¦Z£¦vêlX†ì7´º-€1bF¥Ê¹<Îú¿,£££»îºë®»îªÖt:ÇœZ6Ë€šwä}Äô¡-]ºtåÊ•xåwÞI-›9XéQ͵2Õô¾¾¥Ì¾k8M§¾z^ ¹Q}vÀXÍ=·#%f¶tNžm“-J,^ô¥¼aN ÷cÀyj+50Áp2 000 °  0™7˜Êw¨3[Ñßü LðtDª:ÌdºÏÜÁ+^ñŠ›nºéé§Ÿîý¼þúëׯ_ÀPˆ`éˆîöè^®|ƒ&‚©<ˆ¢ëïlÁ¬N>-;”³—§»ÐBp­2úŸòŽ>DzY2ëÉÒ8›ò"¥qßõVb½j0¯{I€iD§`P;ÐèDßT Ù¼‹âÌ3Ï\½zõm·ÝÖûyÐA}ô£}ðÁ©e3D˜}¿¢•á­_ç|ä(?Je¥J…­¹˜s˜¨7HÚþ}1-79BÈ¢•îCºŒ‘âòN¢jNÏ Mt¶t´³ ƒdÍ@f,¶Œe¤ª%ä 䳓÷3ðÀÀB€6@àÙ,ÉŒrM,̞ē’m*}4ïÁ2áw¿ûÝÃ?üÒ—¾´÷shhèè£>õÔSåRhV5ì8!Ýä‰êƒ 2®×èX‰f=4…’HJøÒ¦¼ÙèLÆc¬¶•?å<9ú>Å'>´LBÛ#[†Àf€Í¦R#‹òiL,Ê–gÚd<¨m¢ÌLa`kV¼Wd`(^Ùˆdf-Éç_ æÚè^¼æ5¯Q쪇?üáwß}7µlV2”q÷ÙW5ïû5Ï7*ox´z‡FTy]´u¢Æº:@m©‡€FÓF—l“ßÁq^Ѭò†Acöšæm”Ì[Ǧ†P÷9 0NŠ ´¶,S)Œ€g¦³o0˜1¶!€¡ll±7£ §Wºˆ%%tSMrŸ;˜œœ¼çž{öÙgŸÞÏ;î¸ãÜsÏÝ{ゥeC°Ò ¶}ðì¢V޶‘é¡T3&‚Y ÂJª)´|ËrýQ(8ùV'øÉ*iVZ)ÈË[LtwÙøz©ùO-çÄä^ .À’¯¶ŒZŽ–E›žÈBÐw````+À(Š¥ÐΞI\Pé‰Ö¼¦Á€Ï}îsGyäÌÌÌŽ;îøè£ÞyçÛm·Ý%—\B-‚•5dWõáUÁB‘ãa®ô…Z%W/RMþ5l%/Ø„«’êåÖ·J Á7("”¼B¿3W›¢5S[²å^†Ï eÓª{6ì£ØœÆÙèÝ8ÀÀ€Ù3ŒU ™ƒeÂ’%Knºé¦5kÖ¬]»vÅŠ«W¯^½zõâÅ‹©eC°j„ù©Zõ¦ˆŸ§3ƒ¸»ö˜âñ°M™ªæ5ü¶M2Ë'ÒƒW (-ÿE©f÷ûú‰9l˜mL#¸ç`õ Æ šA ¦žXBªÙ›hµÌØ ð¼}¶VozûÀÀ&€ÉlÆXùsì_n‚ñŸÿùŸo}ë[‡†¶='ÚjµŽ8âˆ#Ž8Â]ª!X/ Ôy<¥ú +^µ ‘¼ï)Ì$Œ•ò;˜°¦ Ê g’xüX¤ ‘þ9Ñ+qJîôbæQ¥òPp(TM!_0«Vhƒ-@@tŠæ`MdÓ¡zó’:ÙàBo½êV{9Ì<°È®N €aB›$šÕ'¦2b7˜÷Sò~l¬mX»ví¾ð…vØáðÃ?ôÐC·Ûn;N©†`mCÅì*IÕ÷"û3ésYÔŠGš¹ ‚ÊÍQ8žÓÃ4£BTüåžÇmÜÅüöç×.~FŽByJOI|΋^ćž¥D c ày€MÙlt Ú ð ·’ €åNÏ€)€cPo$£k=LÌ€©ŒÀõ^RÚÎŒ+B3D˜á¼ó΀Ç{ìºë®{ÿûß?11qðÁ~øá{íµ—£TC°ÑwrÓ÷âChS×+¦VP843Å„‰„óóÊ8„èzΚäp¨_‘®‚áð“£8öKy¡«ËNq„GY†Œª…ÌÛ¬@?;öùïÔ V†ó?ÐÿVІ`åñâ¿øôÓO?ýôÓŸþùn¸ák_ûÚ¯~õ«8àðÃ?è ƒFFôã¨y“û6ø>¯9Ce$Y6yˆ’žÜ.lç€ ™D°0tÅ/–äShÀùÌ àlYéU‹ÈŠË¢ýžªIJÒhKò3ëà80†ØÍ2ešÄQú 2Ñgna||ü¨£Žúö·¿}çwöÞêþ¶·½š5 Vuˆ²ÐŒ#Ý9̘’•p)̹PCò’ÍD¾ˆ/´œùAc"V£fQW¾žqÛ†Eœ?«x` 0Vyhšÿ"4ãûßÿþ—¿üåÏ|æ3¿úÕ¯`bbâu¯{ÝÎ;ï¼ß~û}ö³Ÿ™ÙöŸI‚µ 5¹é/ Õ¤]}ãT3öa„ŒðŸð`ãÐÊ 9ŸWcÆëˆÆ‘ÑÃX¯[&Ÿ曕¤f)Ïñ,æð®Fœsµ­¬†‹F“ïMš9X&Ü~ûík×®}æ™gvÜqÇc=ö{ßûÞsÏ=·nݺƒ>xhhèÈ#ü—ù—~ðƒ0?,þ}*-´²Re8©˜}|B¥*J›¶)Fâ8¡Þf b:þ€³ÞæÁw«Í>Þ&©ªÀñÏ<ªãá¨Q5p‹¬‘N K•£2Êìo¦ã?sßøÆ7}ôÑ_üâ×]wÝ}÷ÝwÛm·ýñ€Þ[²^÷º×ýÓ?ýSÏr¬€M›žEÏÙÎyôýâR’ÿ¾_Lˆé¹9ø]2µä¬©9 ö­Nä-“›l%Ì¡»)˜V‰$§¤Ê!@/ l"t6fŸçu§ºÝ4Ÿ9„W¾ò•;ï¼soù™gž¹çž{&&&^˜wÕj=ðÀ½åy4D(†²å€j÷å35—ÀdWp¼Èåݧ–qiæ«,…ïήÉ( =H*K¬Úk\ §ÇIÕ‚S$¡Oê°&»£Êý^^½j˜²›ý)u†9ø`<6mÚô‘|ä%/yÉc=öƒüàíoûwܱbÅŠÍ›7/X°àg?ûÙøø¶ÿþžG V`4ûØþ‘À†xÁ¼_¨æä(oCk0ÞúÞ(Kô1n ËÓ«Óg7¾a°û$™|¡ÿ†}Û',´q=] l,2º-hƒê‘DHK¾ç¬êsÂ$€ì‚ì¤ùÌ!|ñ‹_Üyçÿíßþí–[nùìg?{å•WŽŽŽ~æ3Ÿùüç? 'üñøÀz–óHÁ FØžêôˆ±Œ¢ “ ]Ï‘ðr)Pù>x_6øZQ*Wiýà–döø'=´„Ó[ð«l>É0ݺ ò…+ʱÂÀ'Ž^¯Âª|a/&DßO|[çæØïìLúÞ–µÃàààYguÖYg©5_úÒ—@Jùíoûõ¯ý_üÅ_ôÖÏ#+ õ¹0E¢â÷[zÁ}ï^xCå(™_Ù/xÉNÅ"RÕˆWG" Ræàj^rN¡Žq!$.·§xa&|¸ß ‘P9‹ÈçS†ó*‘DÇò —\Ýöaóš€ïÿû…6Bˆ“O>yÉ’%­Ö6fÕ(X. eœö±j"V€æE£³ ¥ŽË¤õÀ´/cn2§”úض·Úp¢{…fFô-eûY(¬Hpζ°±û§;Ïøvö:B|=;©òR«ÛK }É/WþWá‹FÏ9çœ'žxâÜsÏ­ Z‘¸æšk˜– ÁÊ!ùYW“ó¤JvÓ-–r÷©ÌŽË\Ý™„E”ŠE/LÕ2¥vl‚,x•u­=ÓŸe#ù±]Ï U À á•Lu™÷ž"LòqbóæÍ_ÿú×wÛm·øÃ/yÉKößÿ;ï¼³š*à¯þê¯Þóž÷üýßÿ=~§¨Íá,@/•….ãFŸ_¶¤j&ïª!bJ°}ÂÆè»tÎgˆ0FÝ¡öŽ×„ŠÔ·OZ’Žw–‚¥’§” ©sïú€ªo1GDa9ÞÊNÒé¿[Íÿ4ÿ×ý×äää{ÞóžO~ò“ÓÓÓÇsÌ!‡òßÿýßõœä~à 7¼ìe/»ýöÛ/¼ðÂgžyæ€8ꨣV¬XA-«\T)%÷P »*¤>‘’XaÙäÕä” ßvójj÷°šñãZ„*j̃'FnŸ^)qôTeÃÉÄ]åZi6Á˜íµpçy’O’Xå5TÙzX3C”·1?Hþ‚ßûu7íÛAM:v¼–¬Ò‘M›2Ë»²™ûƲ6„=¯à(¥ö•ý ªÔVk$¨h’{·Û€ÁÁÁÞÏ=öØc||ü‘G© t|ðÁÝwßýöÛo¿ì²Ë~ðƒ žvÚi'Ÿ|òÆ?ùÉO.^¼ø _øÂøø84«ET)X#Ie_=·K1XAÔ¬¨‚z©•ÌÁ4'ñ/ÓR±ŒJ˜–ËèD9Ø+C­þý í‰9¢é›C ùP)uºÿó½µßÿÏ»é¦v«uÛ?ÿ]ÿíÿ÷ÿ»ìê[Þ&·N;bí¶Ûnðä“O.[¶¬·fÑ¢Eõ€“N:ibbâþûïßk¯½.ºè¢N8aÁ‚½Mo{ÛÛÎ<óÌãŽ;nÍš5Ьš#øúX¥Š–œU)†%|Á© ÇŒL'‡C3p¿Ó‹;ÀݼFFüªO£Y½x¼`ÓG¶!T© Ô]UbåòE{¼l%ÝÔ¨l­X²Àh÷þv#Ö[Þò–eË–Ý|óÍ{î¹'LOO¯_¿~ÕªUA‰—Ž{î¹ç˜cŽùÆ7¾ñ¦7½‰n}øá‡þóŸ÷–‚õê3´‰j*¥¤ÜÂÞ“ðºYñ$‰’$@ÈwÀÆâñêWª×üh¼ÄK;Œ| Êq˜œH¹.™ëë|Àð9VÝ^C˜eSÌV«uÌ;öþË?›y³‰`¾j÷ÃWíN×À÷z¯#ÖÈÈÈE]ôµ¯}í#ùÈÀÀÀš5kÞúÖ·éKpÅWsÌ1¶­ÿøÇ{“É !X 5<k˜RƒŠçŸº‡Ì| Öi³©\œAŸH‘˜ÒÍ„ÿU¥Fãò:àäž½Æ-¶QB¨}:ja<2û#J ÝŠ^4ºzõj!Ä>ðí·ß~ãÆW\qE5qðö·¿][óÀ¼øÅ/î xàj}C°Ò Œ¹Õ£¼9LeÏŽê—hç @ÉǪ˜ãƒñÚŒ;ÓÀ n"8®›¯¤RÑld‘3K,­†:ë¤)Œ°ü™¥4³Â]SMKVLéBQ]‚'œp‚Ò~êŒOúÓßúÖ·ðš—½ìe'tÒ•W^©Y6  ÞºbR*¯:ågE"X âF1Cª)i#òÍì;Âô!¾Û€ÁS7ÓòåLÞ–¤ÊàsnQGX,™¥"E²ê‰W-À{ û<ÁsÏ=wá…NLLÜ}÷ÝŸÿüç[­–¢ÕjÀƒ>øÓŸþ”iV”ñ¤ze¥Êö_£‹…?øì*’èÄHVnçÉÎ9ƒ’fDaŸ´Í}5­È$g»¬…‘vNUaËØNÉ9Óž,TûgÏ5ÇÂ… >úè÷¾÷½ëÖ­Ã#˜Bˆ%K–\xá…´HC°f7â¯8ýíwc.X% Sòµ¢àL¢ø†sP·Y ƒQ–^r…†øN4øÀNÒ…Ûˆu¡Næ¥ÜÔ‡mT™I¼<æXfÅ%@B‚U“ƒ% ¯~õ«o¹å–þð‡þð‡9ö Á ³ßŠ5¨scjT|n³2¤Û¦¯z9 Û:g óËa”Ôý^«T,‡:çÌ–3váÌ‚ao1p믎–é ³I•ILòÕ“ÎN/(ÜÁ IDAT'l£`å°lÙ2#»Ú²eËØØ˜¶r¾ÿUŽí–d9‡u5}¤`Wœoi,[ˆ°i­üä™¶°+ ™VDä?³å¥JYt2ÚÆzå5ò˜´mæŠ+ÿÚÑà§jlØRE‡gc&©œ'Að1SßS»÷a’Ï\Çe—]FWÎk‚XKÓÏÂ+~Â|ª‰¢_— _:âàOF' ûÝÂÐ^̯>×è*ÙU¡¥—:hlÒòØ­‘ms(¸›EÙ,cP†Cܢ‰ûÑÑà»k ¯'wñ0ƒRê‹þ‹°þ8ðÀÿò/ÿ:ή»î:žÇððpo«†y4D8ðl¶< kyåÀëú^+çSême©Ì¦Ð ^K¢‡Qû’Î胣FîŽs>liÐ7&x5Ör”â c•m[aë1£ÓNÛøýEd]ÊkŠø†é0² ]€MÏd'Â÷ÜÁÁÜû?Ÿv»}Ì1Ç,X°`ûí·W[§§§¯ºê*Zj,0”-§ªvá S°Ÿþ",Ÿ øR„mŠt"2½3òV# §ð•ü …eq,Á¼O‚P‡”‡“˜÷Ã,‹¹x¶ 5kX#WcFìúÂûÞ2ô¬÷š7”ïlÍm,i.ÌìÃ_ÿõ_«åSN9e‡vÁûï¿?-5V`4[NÒmÌF”ÇúË®JØ}¯S¾AS œó¾!¼¸Ó'ÿ§¶Þë,Kø6ŠB•1ž¸¨²œ‚"¢ã»ÀؼÌú¨*•}‰¦þ9w1Ø8ÅÐíYó -3°±ÌxF#XÍkLX¾|ù–-[ºÝîØØØ¯ýëK.¹dÇwüÄ'>A-ç㬠¨@À|­€o[ oab*[ŸVrt«žÀ®øP*Wä$?å-¦²š½¶4™šœV‚œãt ØKaj7þýCð>âü4æë•í¯˜é ŒLy" ·½k4þ3‡°|ùòo|ã6lxôÑGßøÆ7þÇüÇþð‡³Î:‹ZÎ#«‡ÈZ ïTˆ”Óª TC¯(ñÚ{Ij‡ïí¦W^õ-ì¶#…I’ÃÆ\me‘Çó †cÙfA ²Æí–Î*c¦&ƒÅ#ì<±øÎ«i`žJ×”:i,‡„óÓgï¸ÁÇ?þñ:ôÐC…?ûÙ϶ß~ûo~ó›Ôr~¬T‡85ˆ‘ªA@ ÷`Sn¡¯i$aWn%Yù‚sÐÎjh„Ó>7ÙJ•s †®±M]w3­ÂYY”7;&¹‡]¾8©ÖÌÉÆR6ûTß AÚ¡™änÀ²eËફ®úÉO~rÙe—õf»ßsÏ=Ôr>–ŠY'V¢ìñ¯Âè6ð§Ä0!‡Ûä>5ÜôsFªh Ïâ—ªÃI<â3ú :ìXjK8¯ò@µ%¼µTTºyMƒ +W®|Õ«^õçþç§œrÊ©§žú»ßýî3ŸùL£`Õ ÍÈ`@ßá†TxYµb¢ÜÂßv–ŸÆqLǦñÐc¦&3|” [qjFÇçÒX!s€Õ×­‚Ÿ/ ä…°–h&¹›ñþ÷¿ÿÈ#ܼyó;ìÃÃÃ'tÒI'D-«üŸÊî·æ!»Òš×ÝÚn996Ç/Îßïò '˜Rå·Â² ¦ˆtçrü ~öàx @’O*òáÛkkEŒËî(cð:Ári° ÝZg¡&¨å{¯nHò™SX¼xq]ÀÎ;ïüÊW¾ò7¿ù 5k,J½T€š³+#Yé¯Oßë©oÂI0,h•r³¡Rµ†o¯Vê¬,‚E)ªä-f|„K¡á|Õ©B•ˆßÎ1ay¨XV,BógÏ<ðÀgŸ}öC=411Ñ[#¥\·nÝÌÌŒfÙ,3.¾}¹j;™Iì'Ì3?nLΩr(σ—‘ô€,¼è{úòàõüÛ‰òîÎØ‹2fÀ…õ~‘l `Ž¿`«i9׈c5C„&rÈ!+W®<þøã‡†¶½¼|zzúꫯ¦– Á2 ðjÙ‘Ô‡„ÙP»âÄ –s°cÐ-í>U¢ãn©PX‹*ûŽ˜a#|^ ¾Ë*“ÓP)‹ÿta¡ÿT½xÃ0Ix‡SA)lÿ’<÷½?{n@ð£ýh§vÂkŽ=öXjÖÌÁÒC›RõèñÅ#Ïö„ÞÜ®â[£pªŠ3oh¸$ã_ÚÌ\¯Â rZ ¦•¼¼«àìbl L+µMŒ3±"ge1÷ˆ×Žsð©N®°sª²Œƒ’.Å5©`…iÐiŠÁŸ¹ƒóÏ?ÿöÛo×V>óÌ3Ô²Q°r(›¾ÌOv•„”á! Š1há3\¾Q8#ñ•-å³2pÆ㡵€{`ÎKV¤nËS³°sG’L‘ÃWôTÁø#$ìé6Ûú9Õ'§FØþò/Õ p×]w­Y³æòË/Wk¤”÷Þ{ïºuë4ˆ`y#à‚[™¨É “]yù G¼ü$¿å K•J5a(A+ép¢Ý¿»£¥¥€IL@çÄ¡¼ù8\êܧ‚)–1fYß¡«þ¡¤6ÑÜÖ¥å›9X&lذa|||`àúÔét¦§§©eC°^€×”Á­FµŠD=””9G pËÙ m À |þí°©€(K²@ƒj\$,+·¼à>0Œ]N –“×x2¥¬àîЗ<ÑLè4&iÚÄLñÌÞ‹<UYŸ½Ù,N9å”=÷ÜsÉ’%xå­·ÞJ-›9XÛPR—V»ŠGBvEgcô ˧${h[ò|N:°õÓ¾p¬Â³n6„´,Áo:c;»ùnCê-¦sU™ØE7­tœYÚzwûËra/³€Ã;œX©’™EçøÕZ6ïÁ¢xó›ßüØcýð‡?€­[·^|ñÅëÖ­[µjµl€çiÆï«Ô®ÒÆ …±]èˆ5q÷Ia>mN4o©@çŽ2çQ8ª)Š ø°&|IÚS;˜5•æGý8Ž4ãì_É«nŽà­·—•q¬HÜyV‘yWB·›æ3‡pÕUWí·ß~_ûÚ×`hhèä“OþøÇ?þë_ÿšZ6«.'˜/®Ðw¸ïY}ýô¥R©‚â.V[iûisbCd§ëNÌk0E‚°»‘Bî•„|$›ö#-²–¶Æ˜˜£p)7Ùµe膰T³°TZ„Ý«ÔáúÖoÿ’Ü û ù/BÎ;ï¼oûÛûì³OïçèèèÉ'ŸüÑ~”ZÎ÷9Xå ÕÈ6up2[jê忤ˆL·%Í¢uü,´ïÁ8 D˜lYÖ<0Óˆ‡`·'ÍSäa›ÑS5ÁN@­Žú ’X̬y/s‰'Ñæc5`3² ²SMJ³»ï¾ûêÕ«xàµæüãwÞI-ç/ÁªÛ ï›OyìŠ[œÄ¦2'³ë ƒòŽ%ß^È\Ý3ÇàïM‡¥‘tò©QžÞÃéË)Ír»µ=:@s(̇zP¨þ4äÔø¬â„yŽK~‹Ÿùsáäb»í¶ÃÏ þö·¿=묳vÙej9O Vî"QFeËH^þ™]&çêVåÎrÄ¢¢Ó›±Ö:-¦ÜE]õñH¶‘[¶neNyvGãa£¹UM¤¹ `-\Å¢*x%`<¬ ð“}¿,—€æ)BN?ýôãŽ;îÉ'Ÿ<óÌ3ï»ï¾µk×ŽŽŽ~÷»ß¥–óh– γsz3Çf<ˆJ*%,‚–4é[˜l 34&C§%5v¤akÌ2@s6_$£=¶‰ Ó²ÃÓX o ÍèÞûFÏ ^Elù0 ¨ùŒr‰rï=XI>s»îºë÷¾÷½SN9eÓ¦M/zÑ‹þöoÿö‘G9ðÀ©åüR°æÀ©˜¤ ‘Zߘ¯G nNìjF „(,ãý: å%¨à(n?6ùZ—éÕ8ñ .eÓŠd¾"ÌÄÒ^p8µóU†z¤q—9\¹ sˆA¼_%I€¾'Wù2d£`™144ôÁ~ðƒü`ïç=÷Üóàƒ¾ùÍoÖÌæÁªåÝÿ•$\UVÖËgd›¯ˆ‘¤Ò!0]¥e9,±€"1}¿[õÑ`“IŒk8›hD£ÃŸÄ%…¾“À¼nKpP-HŽE¹¿G/‰f•DV(„·pJñivïäw¼ãO=õTïííBí{ݺuïz×»‚U.êÏ®‚Ï"ñ¯/ì ªQÄTMJ”å¨12ß#ÜxvËZ“¾mZŽÑ-§ÓÒæ’‡&š­­‰TÐÖº“D‚‚ b]ذÀ6¨ÌZ3 KáºUº?ØsÏ=_õªW-[¶ î¸ã!Ä~ûí×n·{[o¹å–åË—ÓR ÁJ€°>¬/Ô*`p°¼ºÔvó*[ê¾`òW¦%¶Ñ¢äQk)ÜGtT+žïÚ:]›1Ÿc1CÛæ¼·¦+Äuç¨Y6ûH2Æ †ÜÁw”i¨é6ÿE˜áÄOÜ{ï½{zÕ§>õ©/ùËxëäääûÞ÷>Zª!XýAMØU ¾ãG9ø&¬E¡ ¥M¶]Ïl» ó/f0ñÎ6¼èØZn‘C~O«Š¡Ye³¥š[JKFα¹ Æk_ûZµ,‰ª7==ýÓŸþ”–šGO–„º <6W…|Ù9pà0EJ…°dåN5ÉÅ®°5„=½·‚aCùhëm!ŒÕ7§^4a[AãzGGhIÌh­©7™}”“0â‚ùÛÇ’ÑÒ±†_–´ž¨gÎ}¹߆æ)B6mÚôýï¿›ýÿÏoûÛc=v¾¿k`c¶<0–Âg=OH ÁÐøÚqT™È{/ãrf•ƒù%Ÿ7øÂ¡š€³­ƒÅÄåÑ´¢°îœ9B[ÞXÓÂqÃ*µã3 ¶Ì ý=ÎÄ5Ž”E´˜æ >µ+ÛGÚùž9—¦",Ÿ.À³Ù2)>׸Q|éK_zßûÞwÚi§í¼óÎ6lxüñÇ—.]zÝu×QËyD°ÀP¶œ¤ÚÁÝ*§`yÔ­ìŠÉW‚mÒ–usm¸ÇÝY2·a›“Aé¿Ïö¥Aî"²l„êÈ9¥ÜŒÓa@ƒj.º#asÈìó4’ê€Ìô!ÇL­š^3ÆŒÔÊÑ\Lê_º|ŸÖ¥29Ü3v¦ð¶f– K–,ù÷ÿ÷[o½õæ›o~úé§wÛm·N8aÉ’%Ôr¬6À(ô[vŠìü"•‰°ºÌ‰wˆD!u˜ïs  2aÓW¸,çP)$‚¢ÈLS͉È(›i0RÜû—eÃ`kI*eÒG­ %ˆ¶ F?^b¡Ñ‰ÑCáÙQ±Ò®ïº”1ø¬l{_,È–g4‚Ðå{ð½eÒ¹c Ó‰ìèhq>¾êQ+xw$Ï?yÁ·œXæY–/Ó(XQh–7bˆK¤€D×''4œ¸#Ró£fÑkl…Ÿ‰8×V¯@n>êð ObÊc‚é…°Ÿ8ŠHá5Æl“È–ÆÑd£ SÎy{ ¡6|JÄ<° Ó¨˜ÄÄp,ßs¹&—ÊâoÒ¬ZµQUhV½`¼¹w’ =ÇóÔ™> ÁܶВ,qÊÐ)·(²±©SFñÉÍ®4Êc0‡pó°0i‡Â-QcâX­š¶Ábß©W…<£nzÏü¿ÓЬ9÷`Åh^ÓP#¨SB tÛ×¢„X–ío¬…£eà´új›8 hÆ©Òöu’°Å ¹á{—àÖ jC™è3wpþùçß~ûíÚÊgžy†Z6 – ñçsyy×—‹oÙ~ÂüÓ±'ãz_ç¶ÞÑÍ2¢“è€=gw’óÛpP°¤ ¤Fœ‹7' %JyíYµ’“ü”’ìßÂYDFN) {§°:åõ±ÌøÞJïƒYG4š§M¸ë®»Ö¬Ysùå—«5RÊ{ï½wݺušeC°f *fW…·ӯ——F•Ð÷bªu`šRÈ®ŒvåæOÍÃM옰ui”i)c·ÓÖ²"£g‘Ý€;ª#íU(LÏŽZÐü9YÚØè¬W]J"ÆCÚv,ñs`ð¾!2);– Í,6lØ0>>>0ð}êt:ÓÓÓÔrÞ,æE¿VJL!˜¢ˆ—¥%Õ«Ðm|ï^’êf‘u,¨‚9–Wh  óø œÑ˜R.wV"o‰WÒ5½SÆH&°â¥MÏ‶ mLÉV„N £Å©(HÙ¡mg¹gPùrǪ(B`Ä0Ž•6w‘H²ÎÊDJÐs§œrÊž{î©ýùà­·ÞJ-çÁòºŸ®2\°Ÿ¾hÎÕ°+NÏÇg19Ó[ö`?^ž½4*/Úä&a¶5…ã}ƺH²@‹Ø$¯Öf²C‡£€ÓR’ŸtÙëÄL®ño¥0G´mÕ–:–e9’¸8ö¯£H©L[56IÈhÉ5’ÍR¼ùÍo¦+W¬XAWÎ#‚¼+ÎlaW¾6·M¾«µ›'¹GŽ"ýsäêb»Âº…cq –¦òÍͨKEŽÙº[‡[‘ÏÖÈŠÂPØAj‚–4m…üzwzÌE£zD˜B^åº0%/#WóÊÛq/Þ\¶€ i9K‰«yMƒ Ýn÷æ›o~ä‘G&''¥” ¥¼öÚko¼ñFÍr~¬B”w®€¡äøñ•Ç}Áéžù¥$J›ÈMD"‘JÊgÇààFަ°16·C°72…‘úÐÞ ¯îÊÑOCžîðA =D‰Qµ²…P~| ÝÚž-=­l€ˆE£#ÿá-†8Ê–-PÑpPù‚¥U¼!X}ôÑ×^{íÊ•+{kºÝî“O>I-‚µ UjN„àtÞ%….£lü 2%‡Ðå°7r,Úaós3ª‘⧸m8Ï8<л¸GÀ*&%î‚L5ËHžCðw­šmkÍQ(ÑùÞj–1ìXM‘h,®¿þú»îºkŸ}öÁ+¿õ­oQˆ`¥DM8D ©EX’nnÁwƆEðVݶÕV—}Î!qi(œLc4¶…Ãf…zŒmÌÈ&žq2ô‚{ôn¦•Ô§‘ :ܺQH J…‘×2w„ñ¨ˆÉ¡>#LàYªK·¿ôŸÇ{h+>úhjÙ¼h Ñ[ŸÓwB¾'°°WıÞ&˜:BÆŠ7ŽDaòŽZS'ÔØ¦BÙ\AÞC@SÛ MÇq¥£¬ÌnÏÆeN GP&|».áóӲí;Æ–§á‚a¬‹ãÈŒ‰œg•ö´wŒi£Á:à¥Lö™C¸à‚ .¼ðÂëׯÿÊW¾B-gÁzä‘Gºéþ~2¦Jë„ú,\ã(•üpvP(¾½c}pYß–WO»L­gÖš’0­3ÚØ–9A11òU*,âgü‰}2|#ápåXƒaã=-€V¶F[À½ƒ"ÁáXÆ£ÈHéÆ@Vr ÈB¡eô‘֔缜$å¶wÆæî»ï¾‹.ºh)Š+Î;ïõ©ÿøÇ?ýéOGFFî½÷ÞvÚIÙô˜ã/ùK/‚e»WóPH/ÊRY†ôŽoŒe‰„ÒWÌmn›ø ¾b•ǘ vkÓ´RAÄ“-©øÂqúÚ8ÀÔ„0ù•š7#ÑÂ94ß–)(Ôllš¢…âdeLƒ¦Wé#ÑñbxæÉ¹–Ì;ŒŽŽîºë®˜lt:ÇœZ΂uÆgÀóÏ?ÿéOú’K.ùêW¿zöÙg?ýôÓ/zÑ‹”ÍÈÈüþ÷¿÷u9â^*¼F@‚“)µ…dÈˉWƒøO_E'LÁê!˜yظ[f°ý{eé@»óSÆQBl>mDÁ _éËQe›ÿ0•È!U“Áá‚AI• Mäæ…LP·¥Â*§.uТRæÐLr7áCúÐÒ¥KW®\‰WÞyçÔr¬ÆÇÇ/¾øâÿýßÿ½êª«Î>ûìééév»­¶ €¬ðeýeW³œþ˜sÁ²W+ëÌ’9¡)Ýá,÷P×á;¦oIVíÝù¸£KÍ¢ ÃwŸÊ|-˜ÜN#`©ˆ]‰¼[lFï(Y±¥êSx£é1©99$º0‡sò¼†`°ûî»kk6mÚd¤³†`õð|àä“O€åË—oÙ²E­Ÿœœ€í¶Û®o™…ÂÁ¼vKê[$9‰qÈgW©Òæ ê­ ]Qúèf¥I††©™Ï\ƒ‘á‰ìã°q,Ûüs¦…ñà•’lu$Y›xõ$|ÍI« °tÈQêPçT@œ_ðQá5dl£ƒŽ ©Ÿ¾ p‡–ÍíjÇ¥„toœ38ðÀµ5O>ùä;ÞñŽ×½îuÚúYF°–.]Ú›nµ×^{Ýpà jýÓO? ûï¿¿£ì4ÀF˦ñ|CôW=ê»vÅé ×»•'ßLŒN‚‡Š8›Â,9<ÉxGî(®õII®¿^M'Ð5x¥[@b 'üÄŒ¬ËH³lâq]©A2ŽsM7Ò¸ÎA}—ÑËYuaksT%S4r,ìÁætÐÛßþöý×í™]sÍ5çœs »~„ IDATŽÛÕÀ˜åÓ—VHÈ®B Ïp|²bS_øSFêÆ® q*¦hÄÅQ7]üx¨c/ˆìO]Zíì»-ãe]TÑ>ÝìC7IûzcÝÕc¸­|òÂTZ\k"㙂³’$7£¨£ý4 ÂÔ¼ÔçÒaäÜ6nž8¶KŠï¥¦¿è/½c–7X@>£š]ªÿÉ™[,McW°Ç{üÝßýµ¬»‚µxñâ»îºk¿ýö{ßûÞ·Ë.»\~ùå ,èmºòÊ+Ï8㌳Î:Kqøá‡ÿ˺¶è#»r#’uÅs£òØU!ópÛLdqØkÝ'dz{  ¨=ítq”pØÃ+»dMá\IÃAb¤iY‰:6º¦6tçCe3°´˜¶•] ´¬&{°·¹;gcA÷ág<º A™ÅiqœÏð[)¡™‚eÀÙgŸnݺõÆo\²d µ¬;ÁÚgŸ}~øa㦥K—~ç;ßI‘ÓÕ•¡‚ÔüÜt¡ðôÐC9– ÁzýbW1qÓæÌôæ®B|J¶ûþ›læJ[ñ©3œ¸…Œ*ÆÀø“&ÆáUÆv°±B:Ť˜RtÉ&\/ÇÁ„0—Ò¤#UYãP Ñ› Ò”‡s·µrès4y(jJ4#!ì¶•íÔKÂr„½ãÑ_ŽÅDT’Í$wŒìjbbbtTŸÃV÷Iîs ýÕ®p·Ê´ák/ò½ GD¡œ ¸aeÞ­/lik$H-“P…ƒ2 f|ãyëFš%íÈtóËÆ‰ê`26Fé¡k §Åµ% ¦²6 ×ÚøÑæÈÓCN[0& ¦:í5vbËMkê- ¶ô0lŒœ¨ŸÚ‚Ñ ì¡9çußùMÌÅg6 ™äÎ…qÂR£`y#øtªùyhSbÜfËT¨òZx[o3®¨4¢Å²õÊÆ54´ OÌÙHž¦Qq2›±;aá,èV¹¨QܦeMIÒøŠqY‹.‘7I‚aÛ/´"¶p½eÜ;‹=ÆÜ ð×sœÔAï))ÎÁÀ,e;7iÙàáãG¦{Vßw~öÞ{ïÇ{̶µÛí>÷Üs§vš¶¾!XÛPsöS[0o1ûÒ¼ µ"7­t׎#\ÒY&õ“c0W )‰áP©Ã'U8l<‰™íém¥ŒL w„2Ÿ-is8cÎÂ^HÃ:¨¡-7GÎnxQ ¼û´NYGJF?Òr¨srò‰g I®‡UÖfˆ0ÃA4<±aÛec0fefüþ9˜Éî $´#ì?´?⛘˜¸òÊ+ñ‹_,Z´è oxÃa‡¶ï¾ûÒR Á A{H{ΧòææŽ•L­ÈØÇkŒ}†Ã†]Ë$…s¥¶•_)»R-¬H•¦Z©äµ²’p,Í¿C£ nOÛ‰cl 7Ó5zÃ{Šr#ȯr€©‚F*FƒjÔŠ6‘›]3Ñ ±cÆfn™ÇÈ8m(ìÚm'¯»`rÆPX©$9­QŠ÷Ì”9qëuºÝ/þ|ñ¿¶ýüÎ{àý¯õ úÆoÂcÙ·[sg¨ñ÷¿ÿýøÛßþvtttùòå^xáþûïõÕW/[¶L³œï+˜©ÔGÇ*D!Åq¯,›ºoôˡӻØ~:®w…´@ó`³)T‰4^…å+ZÊ&MÑõt™)bñÛS«¹ ífk|L\„=%!³9äCäKű4‹!”0ïR°½z}ƒqÚ» ¡Ý´’ ÊhÝ”«P Ãf…‰ tlD^"l)Šp8 d'-br´Z­íïÙ}ÛÏ=·÷Žô¯GÁ–ì?¥ßsÕÜyeÁ'>ñ‰}÷Ý÷òË/?à€ Óé¬Y³æœsÎù‡øÍr^¬øóãÁÝË $b Ä¤ÿ´×®˜lâ™Í“Wñû•ZO+ïYSV\ŠšÙX‹Që²I;Zž¶emVÐJ5Ž#³i´ƒs†Ú Ö–$IɉÌûw«S'k™ö]*œõnÙ̱‰ÒAN]ܬ¢¼»_™œŽ}ª-¢*Æo[TD¼bü?/C«<}óÎ/,·g‹ ÁÃW\¡–ÛíöŸýÙŸÝsÏ=Ôlþ¬¾ïîjØU?¨ Æ+ Sâl ¸ÿ.Œb,e,+È[D#lWjŨŒ’•ºŒº V¡påP_ŒèÅU<&)²Jý\@ÚDëŒ5²}Œ á8_¨7J’—år÷Ç…l TÚzœž°DôêÅ9EXp›ùfR*9ƒBE†Në·&?«ñÒ—¾T[#¥|衇¨åü%XIPx%rl ¸Í*‰]ù"¸¸VÐxª§j–xvåæ BVÈÕ8òŒ­`ËÄ]¨Jª´A%‡LE¯ÂšÆD…ùÜÔû9[dœ©Šc«ÍÊøéš8›·Pʲe…7 ‹Êx8á¨BÑÙnÞ -ÇÒÊRPjèö¯ˆ “œ¥EØí\pbs‡ÊÌ‘j¤Äúõëüã~øáív{ffæg?ûÙ\°råJj9O V_›:€_qoóP«‹®°‡Bbäí.kTÀ¢‹Øîª±„åcq`QFeS°´­ZÏÔ§múi”©E i8Z^{‘¯ r¨VÚ^.¯U,qµX…öj=¿Y¶Û¡‡i±dfC9–È·äWjé¥í1 É«˜FRwí|)l*0+å{Ù7’c¬xÔY«sn°ÑwÇÌô¦îÙaÆ×ºø{#\iÂ8eNF‚d½1[\üW†ä? qb-ÓݹÖÁSŽ¥õ²6B`ÌÓ(ójI¤, !¾Ô(=Ò´@Æ­˜cµH'¥ÔÖ»¡¢ØîCJDL”!Dñ&1v;)¼,ôà¸G*̪°`5»²NçÊ+¯<øàƒ:ê(¸þúë7lذ|ùrj9wžœdb–òRÓæ8çóãÕ?9âU1ŽcuŒ4˸lŒnÔTŒÔÁ8ô¦RÂ\AÑ:(ΟTVie,j````Àxþ³` ```±.AD,aoºYĵ³5­ öÜ"2[azª`‹4~‹ð]Û=Wj›Ñ½`<ëE>:‚̼‹°S\³qŸ_¸qb3z6T1®'©B<û)Ì6ÕuÕ;UÎYÇ?3çÎ<óÌÕ«WßvÛm½ŸtÐG?úÑ|ZÎ/«bvåÇO¦ K‡½Í‰,2à‡ˆ´L&Çr¯tt9F•Âñ—&6 •Òä¿!esߣãˆH¬ÈZˆ?µPAmÁQAu§nkR%íH´†ú±I…{‹Išs•õƒ«¦¥aŒ(ÉÖ^Ûâ±B͸ЧÈç&M-yÿ2_GÛr!èíÓÒço܃qX)&JòLÛŠ¨xeY-0ç¸Qüîw¿{øá‡Õ³„CCCG}ô©§žª(—Âü"XU"]¨)ìÁÖ øú±Ù KW§Y2/+¶þßÜ{]Ý8Î(ä©XŠ &¨)ʱpÛë(Õ¤Fýµ¢ƒ€Æ|Ô²ƒ2jéÙ¸‚Æ®ŒwÂ6W4z§ŒEÞ‘¬h?%jÔq£®œÇ ©=òidaÏò–¯8ö@s0Âq&rÀ9I#ùAI Ì-³.’]|TJx‚eÂk^óíM øÃî¾ûnjÙ¬Z#-»*›«Ñ) œ²”ˆ.;Ä'ÇÊšåPb0Ôk¢ðK ßò –[lÀ¯TPbÕ@~Š•ñ¿¢µL´ˆÆ 1OÝyƒÈ×±ÇNºÙ²­¾F‚.óéV œX+¿ž†vL¦|ÈøQÆ8´­é܇œ‘ÂÒöIJ×p6ú«šE’”üÏëŽÈ˜j„!@K¾ ø—D¿Ð Á"˜œœ¼çž{öÙgŸÞÏ;î¸ãÜsÏÝ{ゥeC°¼Q™¤T¶VHê‰j¥ýô­8Ÿ™ìÊXPaA MÂѺyÁÒ$«µ²=«hó)M[53ªµhj f ‚”RlçI×B¶ÜíLi–̯w€’3µ¦•϶€ª¬@ùkYj J;h-ÀrœùVZÄ0q»¥Í™‰LjKíKÊ'!ÓºGCs­Vëˆ#Ž8âˆ#Üfóš`iw0 µ«ä &¡½ÛØF8ÅÓŠ^%1K‡Ôd‹N‹ÐŽŸ–*$š+õtž@¡ ]5m†vÉ4„bomôò<(²èØ ¥(‡³I/ÚJ,âºkË…½¸mw(ãÞkþºyŽÕÉ·¡1„0Í ²‘3\ ÊÕ0¿é‰j¸îêÆ´iïZ,Åo°äC󑦖gv—a½ª/ãÁù·â|L=h&ñWòäI6„ga^¬z"-Ã(U ö_6‹* ¤]øf¶lZˆÈcmI˜ºNQ©£Pµj‘·- æ'Za=FãI4U­ ßóQqÂÝ]Ñ.Ó¸^å`Ü š„3MÕêf4«÷¦ÖÃNh_(ɲ4í,£”ÕE–]ÓžRáÍ26/N@Ø·baiXAZ’ÓUðôTâÜZ`^(ó9;(?äöÁ>ùM]´#¤ ·Z¥>Û0Ö4À†ly`̧,ŸÄßñ$ŸpTì­P' €#=[ÇÌôcÜä `v¥±Ê'lË{någY )Ëö®K·Ù%R1 ý+æÅ½r¡à!P«*š5“)[xÌNKÀÝ»SŽ%HPeÙÊ[v-ââô-V…0RÈ—h¨%X~âÄ4ÝHÏw ð!ckør»àè¾ žÒ¬$ik·sÐr¶{¸<Ì#‚%³eß9 ¦²LÎ*¼“^³_cãa´¯Âp_vlÚ î˜m¯¹ÒèîmLøÍ Út+üF+-1£ÿBá L½/Þd$µšv¢mûO[PB­Ç›ðK(f2¦¥½òÞ&¥82Q)ÍÒ¾[ÈÛÑ*(våûÏo”])`V¤±+‘ßü>;Õ­MÉaÀô3ÓbFoCÙr` o 8" Ì#‚5°€¬LH‰â¯;iFÙ|¥¿d±îžnÒV:Ø•ãf”²Úça…I{J° U+Èû¤o´j‘™ì šN†×sP¨4àlMµ5`oê¯ì½@uˆiÑ<…¥‰Œ?µTµ5껓}Ûä"Q4PH·*nÛlzìÐXåòNs#£¥šÓ/Üôn–"¬.`aVpF#X â0–†ÙÅfª m»=­ v‘!Œ÷îFŸÆ:º‹SD}Ú€;<í/ípGù·h–Œt§ª<·Mc‚-$\PÇ¿FktJk ߘFn„÷ˆÊà] Q"Ú©âSév½9þ]€i€67ÄílÛÝ6J-Pí9x *«KšZåÜ2M{w'flc;ht¥ñئ÷$Æ»”°®ÝÈ¥|‰‚/'Ã0<%!¦­Ê†¹â²–¹ÎÌ_‚ÅÁœ!auƒ»”çÙvÝŒÏÄÝ ö€ÿ'X{'‚¦Tå+Û%ó'ãÛØµ÷>隃@àá"²Õj‰£t‰â‚è&#Àÿ-(Ðä²Zˆìo{ƒ†ÓÙ,xú-•-,·t³]¬ÕEµžÌBwPÝÙcµ©›wNáîõŒ:–‘º%Š‘ ÛÒ0ÞŸØÊ–Á`¸­lL†|Õ £&Æ|.§J®&•¬ó”`UÌœ8áÊN)Øy(¹+£j¢õÖÔØ›0=ŸæMä –ÈH"ViË›pÕÎkW¸Ô§-Šcñ÷å2O†´¾Y’f¡[GµQ=ùiæÊ›ƒÃo¯P4«›ç=-²;lÝ'悤ª"ŠüN±ÑÈ¿ËTzîÅÌ(Ç¢ý:Þj£Y¶"jî€ÐP·Õ ¤ˆ^nû×]¼ú†j€ùH°˜D*P1»2º ®2Ÿ¨œðÉ©›æÖØ3¹9¶.–.cd¤VT¦¢ìвÊ®»j¡çEÞ§‘cëBûcÜùÙv´b ˜B©Ÿ¾«1!¼òûHæím ³+@ÎEþÓÌZl&1ì䛫W©–s¿¨ªuòO†JH Ò[¶MÈ!ÝwZƒ›‹r,ÍžZò‘–QW4ÿ²™Ä,"+øŒHž¶Á›Ì  <1 üî¶$–Ž›`ÇYê[5/*Y§Œáˆšÿ¶Ò¸’²«VÞžvŸ’luûTìjýC³ÈçßsÒ%>µwÒ´iYÌ®ð;6!ÏŸ4¢&òyâ´©sAÌp³àbE”xQû6úÌä_è¦?ÔØ°vuQ8V‚iÞL¶ÕÍGm ÔÄå°•–-ìž)‰´9ç¯7n5R=>àXÎ"ÕC-6^†°1¿Vr2Äqè 7|'¥¢²39!»bzÐ߸\¸R¹²… ¤+U.žÆn£VF·Š ´òoÈdM$Ã#PÆÿVË…T’Ò2m¥4mÂ2‰$ ÊRk­âZæÒd† –Ž0ÁURE´×d¨&οÐAæîÊùdþE£"_Gã«e;Ä-U)i.#0yÕüиß#"ïÄB³dÄ–:e$^ap{æv¥Â7Ȝ͇VbÖb~,Ê ;n©¿¦k.”IFÝݹQϰ¹b®î6¼®0½"˜Zi£uÊ¿Q±ùT¡•æç³·IO¬~vUhÙ7I’0X:<KåyB‰û`™ŸfDý Yõ5ÝHäö¾;Èϸ‚ü¾ÀïOÇT¬}O´ò/‚WÍ%ÉG%L –ŽTƒ_†_H†ùP‹ÒÀá:øì³Ý<УÝqBÙ¨¹›òSk.­x@çî{Î:Z•If%Ñ’²û‹¾÷Gs ÁŠç†ÒÚÍ^ †S ~M o4ù>½Œmp_=i‡™êÌp'*Ñ‚MûÑ ¶µD“®´×‡Òâõˆø ÅìJ³Ô˜NŒØÙ`ì†E^g²™QW’ñS58Vk‘RE°¾¨&laš¦g05A‹V_“v$JS:È?ã)ÐÃŒ¸•$*U()s [!ÿ8¡Í,@Â1êO…¹/ ¹[À±Òs\ßqðú 4+‘+´ëª!*ÈŠBc2NØw­j6ÞÇ1cŒ^*úž€/"÷…~UlV‚¥£ æT 3Fa†Ȱ£Ø4 (:ÿcÙ¸ÆhìHÑ•ש])6ƒâ@Fº)LÚÕ@¦p@þ[+„mÊÈcŒ¶ÄTÜÊÃh“Z·£ÒÚ¡Eºa‰ØN©‹&‹¬ûïfn•¤µªÊÙÈoŒ½µ²Äÿ!ØEqež2j ·-øÓº7¼Uªj6½¶ò:–È-Ĩ%im Â•ͧFæ˜äÉxÈ9àÈÁF­øçc¼ü_Ï“×Âæ0U ÁŠBC°tò†: j8Vn % ôÖ9IfŒf´pXÒ‚´óP!}­‘Ì ¿ …ÀËŠ²´óìªMB`àë©öÊšýëCê ”©¿ßQ -Qž”ciPÜEéCX€Áÿ²Üɶ*ÊÕÉZX"â%å’ˆ¬È|ã«fÑšÐVü^PÈ*ˆ©ž@íHm(aÛ³~8h+ÿS5¸Ì¸Õ±:ÄØX\%a…‚¬^XQÓ2î§I†ÁÆ›“ƒé¿úÞ!¬âe7W‚U:|©O˜C/3އ€ ‰Tá _H}|ac¢¾ÎiÕ0µÂãe@”!Ê¥Œ´FùÔ^Ç0ˆT,ÁÞi™à×Ch•ö^Ð^÷ÿ:fý[_Q(õ-Põµ§í0™À™ãfÑè”D:–šKÞÍe*B &µ 2ŽâØø§DÍ«òì"²¨H6ëí”N椅<»Ç •OÌtñ{bÛÙuY­é#P»1‚òHL³p¥Œgnd÷쨸/ø\!’UpŠk­jc·6?e‹X¶kB`P ÒøÎ´<4«¨€]•ê! „ïéÌJc(ÿ"D¸ÂN´ oGå³+M»RAIœàL´)V”`I¤?an×BÓê5*Ù2‘*‘ü‚üd•mo+UÑ$"[D°d¶Ðͦ~cZÐÉÓ8—Â*ˆqwˆü§ƒ,»ùš Ôbx‚¼ö\!8ߪ1BEÅ«Kv F6º¥!p£Ñâ– 4ÂëD³åOo™ß‰¾à7Æ"ôžAÛZJÕLrDC°BÀ¿ Ø®ƒiYN›ãrï ·_ædc$¾¦ŽM# ZOoäUÆë•‘]  Ú€»mÊ«ð¤f\‘6Š;„Þ¶…§[©’´«skª IDAT75HÁ…’$c$U€þ°÷Q[;h’V—4; vÓnÂ1É3¶ž2ÀtJMKWƒ¤ø§šË…W4vÌ%&óžµ[ïHPÕ™É36e†ùåB`6¬|‡Ò´ß5dcEx½0E·å`Ë*€B)Ì.«¯Ý?„Õ®!X1hVâR˜zßÉ´Œ4«Ü-æØ$ó]— [ ãÒXêƒRvEïk1WÓ¼©YíT»2’E[_¥¶jìJ{XLdäIB<ẅ2ÑÆMlǤAUª›Ù¨ x,¬ƒG7Óºä–;ÇšFRÖLþ•TÝ<'Ãm ™<I»úàÙW2_kÅŠ÷jçÝvQYãžÒv¢ª)~áVÏù ¦«öïš*b –Ž–ž ¾4K’‚ÆRÔ‰$ûB5¸, ZŒô.¡·´EÊ ž ÂЬá> “ëX̸L0Óãs>¦U (kdW¾ÐÈÐMÙ]0ºme½)fW"OM˜y9³+N 27Œ>8´6,(ò ˜eB¾5h˨*ßD¨qºˆ9á™XD’¦¦fзúKfL¤”ø×AY(ƨ4°*£ØL' (•k #ˆ2¿ã´§1Ç4BŸ"¿¯ÇêÕh&ߘʆάwÔç ò9h§˜—*ƹb`q…yH;B7•Ä!4 ï ʤ;©8V3D‰†`é(‰ô¡]ïÜHb–¶vÑXe/'©(/0½h‘ŽPš>€°¥æV Ï©·‰âéäÆ :ä+ZÑXIV=R5‚¨Uªh•{ mt(þyÆ µ.®JiI*® „+Å·$@ìñª­ÓSåê¢R]äJ ÆÄŒÇÖßh¢  &ÕXæRêåD:ÒÑ@mÇuIÓµ†Ènu*2ï“aÙkš#÷{3r¶RowøðelZ¬€‚K@æu£0nC°bЬ %/–éCSlÞb`ô„0#&%Q´Lýõ”jh\Š,H‹¨$"ÛŒpt®® IjgØGÐgQ:<µOf§½>ä7) ¤ ˆ‚€iw¨]˜»4á]“²´g g¦¶LLLfÉ+N†÷±Zdï8ÚY0°(Ø%ò{S“·Ôz­'¦äG颽6”mš¶LÆ2:t\µŒüÒhoÌÙqŸy¿d#¾LbTÈuæaðâvÞ \¾‚净ΞnòåX^슩*P™BŠ·°T€N¦yvwBLW”]a3ô'Ÿ ˜ôPvee£Y!yÚwÏϵê©V£#h=èÍ¢˜UÐc¸…)~ƒ›®5 †[ ¿DJ Ï`¾ +TŸÍhÖ$Àf€)4z8CžXÄËÚ:‹CÇG,c‚˜Ø TÁQTkЩÙ"@4¶ƒ6ELš¶Ðÿ©7Gˆ,ôt~VfZÓ &&&&¶¢ÿõë¢1>úº ãÎ’ˆîh[£•}«hçí¯lÀRD”Z£}¬=òc…Ø ˜ü³²Œ 4e]Ô³íѨ2Ÿ€1 ?m®âQsrV=š!Â4+=ÂzôHrSèŠéÜ‘=ÑR%ìvåEï´{wG ™_ƒ…+êVÑ>4.¤zbõZ<õŠ*6Цà@ÝR¬`^5’='^¥Šãé>ùÄó„ÚèUã­ìÕ -ä¿$/H43]ãm€8–š †' ô,á4zwà À‚l ðy€-›&¶æçÎK”Œj4Å ±ö†sÖòÇP ‚Ÿ4l¡ƒR4Í!ö)óRVq¬¡|Ât_kTØ&{¸)ä«I÷ç” »rÓÄ$— ¾S¨>F÷­{3É= Á*wuZY¾q}Î|i6‚rˆRh£;îâ¶V²±.,Ì@¾[2~ÜQ‰jb{‹°+aé#ÕVÌ®0ÁRPsw†FF3v2hŸ0Û€|-p½p“ª÷jj,–Ž¢Bþ,À±´‡ì°Aµ¼zÚq½£k¸ @JØÚÙ&k)±j `!ÀÀsÙGM„‡LmR$ hn–‚ÄÄ£„˜9‰|qÈbKÜ&ÔJœŒ*"²Ñ…øŸ •¥¢Yœ«Ý­tYÙ¸é0 E,ºÉX »­ìz辡 çzîM˜ÂÓi‚yD°¦6dËÃcÄ ‰cÔ6ÂnøÞœ çÏ`È|à6H˜€­?pó/.šÿ–…4`N£‡~ ¶ó R¦B=h9(%£ƒ¢ãžXMfE“Ùq<§ WŠÖ >â­üJ­‡k‘TtòEð¤‰+x p8Ó±†F;0"`h†‡ALo…él•ЀãK6lx.›¯¯nÆk»ˆÖ`ªr3R ãþêæù«ÌïºOµ¾YÍ‹ïA±ØÞ^î %wÑ—¥J›#fê¶“Ë«oNu…±Ñ)[2ØÒMƒ·Ö ñT² °1[¦~R)X³¨Ib,0”-·M[“„0Â}lq(?=>á+^7È¢NÂÁ8mûEë~ …%ʨŒ1ç ìÊøØ -gá©EªT+sÛcWcÙ°ài%™ï¡=¸§±75Õ ò¯SW/D4JšªÜF hæžÛhŠ=ä´FÊj7*axFg`¤ Cƒ0: ] [§`z:FÆ,Xðl¦f©ÁzµU—N¸·6’*Åh%š‰…‡PÕV™µ0 XZ5µˆÚƒx2–bøÍX6½,G” $PÅ1ô¢x§SÒl˶ª5'=^é…Õ¥¼ƒÙr7/‹6C„‘˜Gk`AhÙ0 Š ›ÌSÒrËW¾NbÌ0%bÚc¡&Ÿ2_ÄH¹lñ¤"üöæîu Ò^‰ÔBS¡Õ£‚£Ù˜ æA‹e¤S3‹šÎ¦wó¯Pï¢W®wiÐ4U5ÿ½•å©&WiD÷ñ­¼&4˜}l–0"a´ #3°`FF`lH Ó[aj fºÐÍë…þ°`KVLtŒÚžq¿h$¬›q&Å®Ô@!6P¥4^«€‰ˆ6P(Pˆv6P¨ŽÕVF‚HHzäÓþ[Û`·,Zš3·K.bу0ˆür5M½0[î=‹Ñ¬Ì#‚5oQ{³).‚l HÆa†ûl•‰0}04^"ó+±ÎG ¡.üØ ÍY²8„zgZ)2Ê¢ÑF²IWmÔÍK¤¨>¾‹xRý Í za:þÀR­ºyž‡}*V[CÑ,܃H”Ò^dˆ¬(¦E¥¬Ù‘°`Æ:°  ÀØ8ŒŒÂäl‚™î S¸¬ø#À¦LÊR¤g& ¤Ä¡i´ ³"°ˆXÚü6ÛA%ÈNïf•ئ8þw Ì®´X4y,VA~™B#dÆSO8:F) -c.¤bnòÇýb‚À8K™J•¯„e9mí^3ìÚêÔVœïÓ&\R›4 _p´Z»Çb9@S¯/»(ÕJBzˆ] £©WˆèPŠH‹šÎxÕVôÿ3je)ÔEdžDkºÇêíîNöG:3¨¬:x´3ÑxdÒ³U+(LéÑõph™1i_ƒjô![h ç'ŧ“WG6 V‚Åó/ RyóeWaÄ(ù ÈICšjg,HÕµÂИ]a„ýi Õh4bñ†Â}¤Ieøíä§&Ú¿ ¶QYÌÏð‹Ñ•4µ‘ªi¤cáùÔÆZk‘Ÿ|e›,ùÖÆ£œCHÐRé×ÛSƒÙËÜ'6léÂæ)X8 ‡at ,‚Á)Ø:0$aT¢.< ð{€ç¦³ÔÉ39M¢ÃíI¼¿4Ž¢8–ª²æ“îtűEÆÞ{k³ØÊ3Z-·ˆ…—5Cý2L.ƒoJYE’!_þQ6÷ò"š|¤O;á¬yIÔ‚•¥JP|ÿÁW4¯(Žâœ3ˆ“¤ÃF˜ÌìŠèà®EäûB#µ‹€]iƒƒpAAŠXLÄ·0«!z3É= Áb¡2íª$Ä$i»þúFé׵̗ù‰ü‡šI²LýkF;¯]µìþUqü- qQ$C=0ˆÇ[¨Wú“š¥®dª­è{:ãUF½ ò´³ùä%)‹Y¬È²íýûš›…ºTd ?Ø#XS™”µ`BÂÄ lyþd/‚±…08 Ó“Ðí€X6ã3°hžèž˜F»¦•¥!È’˜A¶ÐîùzA~=–²ðëlÇæ7˜f©B%^vLGˆÆð¸ˆ•áÜ;…ŸFý9˜öNyÎô Á*FÅÊØ©srpÜLט—R1ãÏT•r\€(µÂ,rÇ…L¢¿ž •väÐ,­ïT¯¹Âƒƒê£Ø•še¥ T“«¦2Õj:{Bp© *V—$#òÔ S¥Ç&Õ Gìùéqˆ^ÂmÄ#µ·<àÑÃÁl¬p ``` ` Àd¦7ÃÔ$,^ Áè˜Ú“[ Õ‚¡a…›`džx`+âCj~= ‡õ4tó¯IÓo*™¨wCÙõ…-ÓÉv@Oª—ci¯Uá´ãGsnÌA;8:“¶Þ¡s½ÆË…ót‹$}$"¥^¢ùÍ¢µ¶)Aº×N4«Ä¯ýp\•—§¯ò”0_²eÛ¤ñ!iZé®ÔJ#tAsØÎhJÆÞKEÑØjTŸ¡ìe6˜uÑ#[Ñ€à¡V2¯ZAþÛvÖº=Îqb¼w§Ý'VÎÔ´îéŒ] eÐB|«USéX[35k+À”„‰˜ÚÒEK`h@ÀÔèv`hvXcÏÂè°t)ŒŒA«“[@vap¶ßl†± ðè4ü_€)ôhÞS4; ììPYµläX-rDÑêk³ÝÕ˜¯š‹6ˆžôìæíÕð´…m w x“ u‡¼}¡ÛBš¥9”¦o mî ©†ŠU ß[åfV$æ;ÁŠG w)U%ÖPžFR}¯_ZþÔÊ}!Öî×q\Èë:Ú‚Û'ÃÒþ.È·Æ®ðOAÔµ F%zä­ƒ^¾ T+õ ­3.$޶NT’…ð˜2[ÓE;Q©/Úp¤Ìóªîàç5]PµF'[3É]ê©S]ؼ¶¬‡?Y‹ÃÈèv 3C#°b{[ ×Áo'ài€‰ŒÜ¨n ™Ï\ä_+ÑWõ«Àô8!=U%úVÔJ½µA< –èÐyWFhŒ /P)‰¥arCddþñ*îµ5u#d¾ÉÔ-ÿ¹†`¹p±à£ éÓUy+ ®íö—O×Dþg 4QòÝe<øÛF>T?ÚFÚ­ˆ±JàQ›Ô nìP=m§´«â3H¿ÙšI2ÚLvw(ƒÔº[ÚÑb:Ò»¸t³¦è"·˜ÛuÑšnþÏ ÍÞA$OÀjg£„ÿ?{odIR ~wÉ=+³¶®®¥»z£««»é¦z£hľHÐbL0OB’$Óô“ø¡ÅôGÈd³'„I?dhÃ$43Œ½‡ñO ÒºEÓkuíUY•Y¹Þ¼ûðùž'ü¸{xÄ]2«ó»–á~üøz>ÿÜãܪ’EÒèíÂРЪ ÝÂÔ4Ê£Z x>ff19‰±WñÓ .~|‚ƒRAÚÝNˆqmHZL@(Ñi+'LV´O ÍK¾<Á¯ ™DèTõ¸¸ƒópªFLqû#x÷$¡¾‚'0„]]ÈŽX½E&/å.@?ŽË4u¹Ó1Yµ™Â[ôðOBå;-`nž;{Å#RÂÀO:~ååAÅÅ ]rÒ<å-Iâ/ ÒeAºŸ½ÿäŽ+ùA%Q¶"YJÔ¿z¬ éIë%rF(E«")í”pJ¾ 'ÿ¥wÂä…´|ê¼%¿ˆ, ­lí/&¯)Ðl`w»wa| ž‡vÍ*¦vãøy ÿ¾„9Z²4h¡)k¦ZÆH)Ãü[ …¯´IN&)-„nÆ¢g¡Q‹6!-‰¥íæ&ê‘ *.«t9Ð9Ä¡pÉ\eÃ%Âîd笠+8qÔÓCH§ß[t•ªÊ޽´”˜é׬80è¡þŒÞ±+÷­¢°J©†I×¥EW%­|‚Þ<‚3„ît«&Y¤`E[J™jRkÑ.{ùéCÄJäØˆ(¼ÜtO %Õ( _Å×4AªFnN ƒUŒ#F(×FÛ$év€`³LLÁóЬ£¸Ž]{qÛ](½ˆg.ãB°‘Ù‚®m Nìì1³<²2ˆ¸Ò}’­PD$ýE Lb,A6,v ¾Ì‘gâà{oåÆv­À`^¯¸%»l[Xâe)|!ÀêJv.Àê‰ €spB2¹w+ ˜ãäŠö_‹xf`Äq7La­ SE£ût…äÕC™ ¡ÓSJ.Ty1K„äk€ôŒ«VrÓ%6L¬•%S æy1˜(Ä_÷›Æc##k4FW‘Ux²oohÅH 1Õ$÷KÑNK`¤%….>F%$1Y‘(‘÷eY!ÚëØbza€F…"víű;áûðæp!@•,ʨÑ/B†q­‰¤=Ê5'–äÏÔºè™Y…Þ£˜>$öH cyɧ.¢DÉ1JdŠâ% 3SĬI¼ÆÄ’¯ Þ$uB9« –Q\Zaî¶7`Z+Uø$¯¯ìT—qKê÷(ô’$’LÚ|À’›¾-– æü”£³(P“{®)ŒèÄë_äWôc/49yÁÙ˜DqXt½´8 ìöÀxüõÃÑø …0ÚQ¬Kñ÷••ÅÊye¯Ãùù¹‰Ê'ìE9²©Á2@@¨ Úè7­;@;DPEbz<µ <Ó»qì ð/à|uòFE«ÊÚ¥`EJ¯).¡ –dø(*BR­2yŒVX>áíBR¼ÆMB! EXx8­ÎTl—6³Ó< þ¨K\Ñ+ܶŸo¸DØ –^z/L;õPÜg´©âz,RnâJj \› ÷ð6&ÍT›—„Y 0âp'!”|9ÎOžž% ¦+hô¤«6Á4 ™ÁW´†I$A÷¥E´Ù°8 ìf€q`ÌÃÌ,FG¶Q_Cµ‰*°T°qQ-¡k‚A(] ¤œY@¢.¥NÐ#Uq˜E÷Ôo„ué)ЍWàû˜Ù‡cwA„/`.Üx¯¦"(1LTæ*ž®Æ·ù•E½I/¢"õâ‘ † ÒlÀ€MÉ„´‘›ÕÿºÀ#SÄÔX9ìé“%¯ X"0X]ÉŽX›lCtÅMÊÁówŸ/wtÕoQh¤öƒ¡”¨ƒ×ÒWZý\5)r„’¾ò˜Û“è*$`E¾'H¡Uf?ˆÃ“§*H¼ÙÈ¥ÀCÀuÀ‘qìÂÄ8FÊ(—í&–.cµŽåËÀ PòÏ8 ä.+¹L C‚(Q$wÊû1b9Xte›¼ÄUB†m Ñ@Ð<ŒO¡¾ŽB³pû=€‡g.`.Ø„ƒ þ–4’¤£$"äH…3ˆ~r×”R_ Kç‘k "é«ò5CZ2^2nªÐ"•¦jç\¡¨Ù£hãrdÙ˜b&1Ñ`ýð,¹uöƘ!ƒÕì8€w¾­°‘»1©L»VúÚ}w!Ìz ì(¤ -ÁEáD}JÑ•–¾òIàT=ÊÉaÒf¹Hn§Ÿä芧"}¶—ôÙ~Œ]¼áMû€cÀÓ¸ñìÝÑ24k¨WÑXǕ˸ÒÀå®,Õx°C>, ‚cäRG6§SÀÁ¡ˆƒÉ*ð“ "KÜ&ɤ"\ò ¾ ÚðVàa!à±çZÜy?ÂáE\ µÚõAÔiµÒö£ %ÔÝR–/$Նɟ–Ä2¡"SÛPÊÐcò±>Ž7ÝrÀ§ :‹´ü ˜z+W…‘;Yv"À²ËÕ‚®²ÚébLʹëÊ¡Ä]ƒÇ.•[4s_ʼn%9Z¥ÒW¦ÙKB+_—„);‚D—èJ²JŠÛ¦Ð•Aºô&’Ù¡©H‘L´Š vGã“8v ŽÞˆÉi*‹XœÃÒe,­b­•WÚXX*Àz¼ Œ³GÊ’œÄR’õáEä“kZ#J\¾²FyŠ5¥=Ťa Ø ›–0ÀóQ]Ey{®Å=!øï/%H#E-5O‚Mx4§Ú&Á&Áî(¥As8¡BLbº’±@+K'â˜/Õ»[º°b•)M4+–ÊÁ“9Š=JŸ@oäîó‰ÀÁêJvÀÚÎÜU¦¤·r°ÒXFóÔ0]¦« ;ºÒ"-/þëë~ 9‘j s”,´u’Ç\)ž^kª¼ …\&=Àë»oƱ;0s¸4:)JµÎâyœ=…sgq¡Šù6–TâVõx»‚®¨ÁŽP”ò÷ ?Yþ¾xÉjò’ ¤èÙZ à “…&Cúm*ð ð<ø>Ê£˜9ˆ{EðüûåM°Ägʇ$ a+èÖ'É”¿GγHuj2nãKŸ,ãw”´èBd>ÑÖ—ÜÐÀýµìPI{³Ø@{P¿Åªð†K„ÝÉÎXÛS\ÆŠ;'”U•6.¿ÙóáÌ„{P¥.›´ÙÕc*ªGÂŃl]j“ãÚL£øß0FSr%ZWš÷ððÃ8tϵÓ­]YŸï\zE\|gq¡Km\XÖã]VÍäéV¯H ’âU û ¥ôèF{K¢š;?Æ#›»…fX•(ÿ&°߇_Àê"Ʀ±ë0î}íÿ†p!qÂä†}Š“fSt%âz¡+ž¼”h\möµÑ'«“,d ¦•¦‚d½˜ðbOª·4~÷MCzi©›0¬ÉiXÀ]›Ý˜«L®ú l¥ Ö¦l@s5JnN+u¦bÑïž4‡VÔ©Pß&ÍSF:Ös.oj-§û·¢›aü—Žþ!9M´C6] jhS÷Øß(Ñ à p_o{Þ|çÔnQ¬Ÿ]?Uá™Î¹Óât—X±¬ NöÔÓ-_3I…—'/åÕE¹§†—‘V'Er²RBBPQ’ÏKVz£Ÿà7%ÀóP*£4ŽÝ¯+ß':ío‡Áâ&$3.˜%!iÒ¶€™­´L¡ oR¬F1–DròL,Ižè×b,™®‚chƒáO‘ Ég&¼ýwéµ-ÀÅŽ¢8Ps7Æ24)JLóSøm+Ã=w)C€µÒ%’s$~ú$|ŽÞ¤3a)´`H;î ‡ÐŽÅŠÿ6-*áyŠ^2м¯ø?‰ ó~vîiö9ácÀ>à~à‰Çqø¡;§(®ütå§+g~Ô8u6|µ‚¹bÊj=úŸî„-¸(tˆ[µ •Ú‰\ࣀÕ3W¢*ÉÝliµ Mdô‚D0MxË…"FƱg¦½ÿžÝ÷uªíï4‚å ¼KÏG¥JÂØ~Z…8E€$$¯µ y2ÒeÖ`r«;}Ù‚6$•’’t퇊He [ºÑœÏ˜ÔlÚ“ëë°ÜVD`°º’!ÀÚö„ž¨Ê„¢RSìUî¸3Ëuù–¸}BoŠ{ÖNâµ×&=–%BG{|Xú?ú—îûi“wôÂ$]$uÒ Åez@f{·>€›Þrl÷Ç Í3­—Ÿ}ù__|%xuçÛXVâcä«¶¦pŒâ%@—)í\_Úê*K^Èf5…ÐR b¤Å÷? ²ÀÇ ÐNUmÂ_C±ˆ‘1L̈Éiqðáƒo…ÿu] IDATh\n·V6N ‹^2ðH®©%"™_¥íQ¸©ô SËô’jŒBˆv˜IžÁN^t´(”; Sj\‘×u¯|w_¡†ÇÚjOÀÓ`lîV† Vw2XÀ`ÑU7¢Ot‘"–$´¼ˆ= ½]›—Üñˆ|pçc¢¢Ÿ'ÄçôvŒ¥à*A+FI]î{É0ô­:Š:äÇQŽ)kH¸° ¸xçëqç·î¹ýX©°æ]ü·sO_yñ‡—Äé&.Ëñ‚à:#Ì”}ôÒB ºÒ–­Öó Ÿ\Hè#0•iCC “P,HÂAY)´ýø Š‚@¡Žâ*Š%”GQÚµ:vû¡£ï¸¡^=Õü·jØH©EK€B(Ap°<"+da´Äî)©fNbÉ|S#1]$ð§¦NmÁÒumr3O˜KŒßw,d“Ø£ðœöi®h™þ ¡Ñ–Ë`õLrôŸ ¥«Qq›E2,”ÌY„2Or«x!‰±À †V*¤‚ äÄü/téGqê` Á‹)àðøn<úÞɃ>4²g—ò‡óÏΟü×êó—“U\X–€UB\iß¼SÊŠ ¶œí¢uE”êðb$!‹ÅO²\ü-<éÔ)ìw+C¹ôVˆ?;³q˜¾€¿ŽBåQŒ »Ï”Ýì½Íµ+§Ö_ì4Ä&T)¢š8.b³%þ£\‹D¥ÈÌR)·ºƒ} “ -1.–®— eÑ»;vóTŒ•Uƒ½l¹È¶tµ`—Lvê'BBÛ>ú)çÎ;~üx¥RtÂ}!À’S«¾ÊÕŽ¨RIrSM“㬒ʮiù¯Çœ‚LyBü§}mPÑCi*i• nU°q_0î*LrWT6¿ˆm+3À]Àÿ~ê†k •W—ÿëÒ™¬¾p:8QÁ¹ó„µª‘1S/Îé+mqåvBœêPЪÌZH Ÿ¿?(5RÇ É9ñyi€¢@y å2Êc˜8U)^³i ÏEHtJfK¬ :{ÊJ¸t«;‡t¼äŽ´kÜžºil±+×Â>GK²6Ô~IH<£¦ÿ6Ÿ_ùÊW<8Ð$û);`y@)¾ÞAÙînUFóžÏÆ„y ç7MÁìD޼¯ü´ÆÈ -¥AUñ}W¾ƒZîÞä6mA\£ñ•CÃÚ<Š$Ô+3ÀÝÀ{ÅÍï¸òÈlaþ…Kÿcþ•ï7_𧏠p¸£«Nò§- eÝÀ„‡\D œê)‹@kS©&0V‰®ç"Y¤2V'ÆXÅøWÆ€ÑFV0¾€™s•Òõ'½×½õÚ¦ —`–0¦ð ´Ò’Fv…ŠÊ`q˜Åq®\ i†;Ë€,ò­åZ=ŠU£À~àñ]xìÝÅÃ=Vò–êÏüèôÓË/¾¼²‚s!.aãUÁu N`\‡°eZüäèØLXÐôÈž&-ý«G®9‚Ñê—^„žÝ E-^¦”e  P\Ã舘€¡t-y^nÈè*²Ú&–K$kD/å‚¢H"$THV?©¡€:!±ÊÀXˆñeL_Ä왕ÒÁç¼É£÷¼ÿõï\]^y¡¾°ÝdBPÒIRúñG•|)È›>É—¼Ö’X‚4Ñ«Jå‡dÒ¦Z†)Æ(s­_Ï×yit°ÔsHO`MõlÑgDÀzúé§9rèС!ÀJfñ¬ÿZnZî÷\¶jÖèR8&±ð( Ã+:í“BªÜK®Âp$ÅO^SX ˜Ç ØkƒÊ2’×ò}4ÄŒË4pð¾GqË'Ƕqþì«?Xñ'áóK8b¸£«zòi€  ’ŽSÉ]7ƒ°BЏG¡õ(’åO–rÀý+¢7“èDJT³Æje Œ#Àhó˜9–¼42=ƒÃÎþÌ»n;][ýÏ„U€ œV2 ôm-ÊÛ|"Yׂ»—Ì…QÖâ³Ææ%‹‹ÏjhExÖzQžæÙ™ú;p©Ý9Õ€|20tµ…Hn` V»ÝþË¿üË¿ú«¿Db”°)¶ pé&°»ª¬h‰°ÏtSçÙÚ§Ü é¢8¨â ež.ÊI|%1Ô¥.é+åè)©‡ûEiX´,¸xxO<‚#w T¬¯>Û8ûlðü«âÄ:Î ÌËÀ2P‰OaPN„W¬² XíwášµíºG”Å¡w$zP"šªD$‡Rž>9µ¡ Œ+c˘¹ˆ½+#ûNblOáà7}èîÅÓKµç*¡Ød’è{—4Ý0æÏ ,$X{Њ’å\©ïs7©¢Å(ï§v7•¡E\:ojB™îlgq7uKò ñ¯«úG>ð‹ºèÏVðCÃé ЖƒÏþóŸúÔ§|_»ªËŽXÛ ÷l•1=”n²5n*£>U €¢îÎO°ø6NV™¶·s×î%ÑÝ|-CJ“BF_)Ÿ[Q‹X[´#{ ¸xÛ<øfì;а‚ó/'ŸÅ«‹8ÙÂy`¸/ 6ȱìÔ+#ù—çËr‡KVbÃ䪹{¶PY>+Y D²º²)¤ ù¥/})›ÑÛLv.Àz ô-&Áe8¶(qI(kQH&9)KAZ0 [ÔcùL9tåÀ÷iQ,…$o­WÊâ dô º*“À­À»ïÄ]oÄÌ.Ôæ1w¯>+8âl¼,¸4È'¢EÉ{VxÔ½¤² &8K…¾Œ)‹N%Óãǯz$.HtXr•p X^ÅüYÌ\Ó.NôǦ1¾wâÑ÷¼þÂúúÿyª³¸IC*ŸÁÖÚýhE+uA S´Ñ¬Q~ÎgmRÑ–*ÒyI¤Å1¢‚8í¤½Ï%+lê&Œ]¶3Ë*¦¼ø~á?^‡_Ò)@¿tø+ñ+†3îý6vê«_ýj£Ñˆ®Ÿ~úéO|âÏ<óÌôô´%ÊU!;`m•dB ƒä„ìJ(=à.9VR!š}pÔ®ð¦Š# ‘¢(/y€… PÜ'uŠ|%NÙØn:”A¢+ù·ìîÞý&ÜúŒ±r_Á‰“8¹†3sÀ¥øÑ:9A”sC ¤ÊÀ¼Ž½R3Âd±#y-CJZQ¬)YÃ6Y(,Å«„£Àj€¥%,^ÀØdmdäÆöàÚû÷¿í¾›O¬®ý`)hnœõ Q¬OÒ•ô’|±'ç';+‰v„!£ðQ¾K`ž®éf­A–RîŽtèõÛÎmΓqج£GÊëóçÏ8vìØ î³ Ö¶žQ& ªû´,¾ÍÄ+¤Â2w“¸³LÕæé•é´xK:0ÎQ‰¢.ž´§ ýå®9JÔt.ƒÂ‡E×åø³ÍxŽÞ 4på.œÀ‰s8]ÃY‹É³´.e¥”ÕÀÄD.*Drÿ¸ÐqE"¹ IX& [1‰5Ôâ…µ5\¹€ñIì],—Ÿ…_(î;zì{VÏ-5OAÄå‘­H6 Á޵GaÉ m‰ØN™e A›k˜Œå%5k;oÕÊ¿"Ù°‘4Þ>áá¢ðaý“yý@[‚®®:T÷Z’ °zh¶IZùÄN˜°Z÷ìšVCV’L«AQø5 ÆRnRûý¤%QÅ Ò­Wt˹¢AÁXÑÙ³ÀƒÞó®» a 'qáNÏáÕ:ÎsÀ<°Ôb+$b—0«1Õ{KhE‡XøÉ:’šCBÑ âïÄ @(ÅHk²ƒéELÏc|:(Œ],|øåÑ[ï¾åÁµåÕËÍ¥cñ11)XF¤¯Kû•æ‘ZZQË#3-â1¹am÷7õ\“a©!92¶ˆK9Àœ#»ž«ŽôÑàÞ1XîjÞþö·‹Ÿß7Ù¡«{/î(}MÅQy÷MÕEƒÖíheŸ÷V´ìÌL€ò—Fáï *ì”’ŠÇRvk!é8)‰ÄËIY¨¢–PÚÌÖnàAï}?ŽÜ„æ2.ŸÂ¥S8}§8 Ì À*PñŠ•}?{>@ÓØÛ@&ïKCʈa’¼á!åOab(ÆŠÄ'޾¸5UÁôLÌ <Ö-÷F¦päÍûŸxã¿»öôR£  4“ ™¶ù¢ŸOª8dÁdið‚4^AW IÐm’÷2±M.œ“"9>Iè¡(‰rûÁ¬zìéæ“LÑ»L.wtA*ç5&;`¡w4L7º”^ÁDEé:‡1 SÇîÜY£ÇcÔ6îê¸KàÑå¾r‰Å¡Ð I|C“ º¢ÞQª¢n²¯ >¼÷]8ò:41÷2ο‚³Ë8ÛÆYà"p%殢-í])/¥8ÉZË ²‹Âc)Ø×KjSÖï(F¡÷[@lÆZvXZÄä.ŒO¡4Ñ)NœÁ®#Åëßðºw\»°T}u  ™ÜçN—%7&\÷ˆå .ç”öÓìˆd¦øZ¶H&¡-RwlÄ5h+(uºe—¬ÓL»Ieð¨Ãb¡€0ÍK†â ¯µc'² ðe’‚';±‹‰åVþ5Ñ-.‰fâ oæÎšÝ¸qOT&ao^òÝ~®Ùcér&¯)´¢G"ÑýZù@ ØÜ¼ï=8òzt*¸ô ν„S‹8£«hßU•pWAØ)onÃÔµ°55º)$-vAÖaùñ «ç%cÉS3"ÚŒÁ°,¯ci+WÐXA¸RÁâ íÑ7ÿO7=vìÀnLÀh’¦¢–Ktå%Ÿ* ºf)X•02Gr·;m´™e"íW¦4.-5$¯_À]zÛ¶íHT+ŽÅ’)Ñ¡lÙé‹J¿[p¦>ÖC—Cè<¾b™ÈæÈ¸e°æ,ø‰ß1Tñ…ŒÅ÷` âàAü·`)ªd¢ºšÞ|ð \'‚5\zg_Ä©eœp ¸@vµKî* É™œt>ÉTk¼²ì>Þ\<º‚ M „Õó“á)ü ÌjDûÜU•e¬\ÆÚ":+Ë—°ò*öÛ÷Á^ÇÁÙÆ1`„ùéň¹ïëR•vÎ`ú:È(óè%W MÅ›iŠe鶦Gv¼hŠz{5ŠZa÷xhÀÒ'k£·{òÛ™2XÛTºi[ÈÆeÓÊ”Å×ò`Ú1Z%9Æ’×ZV€jð“#»Å9YLtòmOò´¤0ùZuôMûèE¶ ààg7ÜQÃâiœ}g—p&À¹ø(ÑÕxe°EŽc0ÑWŠ©9˜]Ϥ}šµùås °V€¦‚x$Ï… ’¿`µb€UÖ€JkËXYÀÚt+¸ô*‹·‹s/áôœ p˜–5²ï*0¬ :JޱÑD“hCÚ5Xø°Ú±‹j•ŸHjM/úÈÐÄÆK‚U`M`y+ X_AsI„ §°ð<ÊScozë‘×_»o|`•É"Ò–|°ÀG3ÈëNÁ‹€å;”Rª˜@y1Uœç¦ö,í}{*.²}x¬ícÉPÜe°òHj[ï¾3l‡îÔ«‰‡–^B£Õœ8šü“‰ã7}ÃR‹6uJP̤õñÊšH*Ò€wÇëÞ[*¶—Ï_Áé‹8×ÂpX*ñ¦+å°«ÁÏ'KÉ3\+J8ìÐ&gÚ*e®}sìi@¬F °Öµ6V—QYÂú2:Ku\|ës¸þ¡£o9räì&cKjê¾JÒ“…äB!’µf©A^¿ZŒ%}6åzRg>ôœZkÚXù¤Ãf—óFm–OèäLQ@„½ùíL¬Mqìœ@W.bÝOà2ù`wÍœàéRajB&UöY¸â˹ažîÇÃ(ѹó3¡«(ŒreöoÙƒ7<¾k|ªº~®9w§ÎàtâîÖãÏà˜ÐUÿÄ…O²èpK=©Â9ÉT)ˆD‚cyD™ÜíÞŒ‹Ö:PYÇêT–Ñ©@,žÁÊiìºnäž·¸íš=ã˜Fbå‘c·¬"©nmùÐÜQÖÊ”/S±h›«¶Üù sûÑvm‡¢vjõhÚ¥¯CnOºÌÖN˜sga¸«K¬M|èy¯³S5öð™ŒQrœ/9—T,úíqí4˜iÁ0ôKª‰^€» 8u¾éJ ],ÓÀýÀ[žÀîƒAã|kîEqæNUqAà °ÔÞL¾0Èߘë^´Óå§UeOÈ$–ŒØ±5tÐJyßc·‘«M~Ñ*atšh-Äú:jTWй¼€‹?FР}èðá}˜ÆãUB…£òÈñZZŒEç vFD )dçHQ®$aŸ(Z»(áQz5+èëðn@´×=—~)¬îd°®VémÊ4ØÇwSàT?Ê)ŸL¢L—í.–.¸(Ñ¥ÓµüùÉRË@DI„ Wiß” åÉ–Àë€w½ï˜ [˧‚ ¯àLs‹À ° Tã]ímBÆ€üuèkJ) îžMtûx‘Ä ÐÑWk0ò½„NŒ®j„ĪVQ]ÅÚ"óðÂOQ¹ˆw>ü¡ÇîÃ$0”Ùk¡Ñu!¹Ï,€)`5+H¾hvxËì¦ßåÇ&qtÄö¢°'½U¾ž¦Ûfß¿ÒJn¬Mqi ½í.óžLq•>ì8ü)Á´#u>{,‰Ò;Ý”¼2Õ¦:µqÁþÕ.¦Xp÷yô¯Ï ÖD™Ð7ÿMG3ÐÅÁƒÀ»îÁu÷.6ÛË'ÛN`nsáÆQ¢•x¹ŠnlW0–ûxšZÚZ˜]™hÁ®SqÁî›MàO*§KËù 8L¾N†U‹÷¼×Ú¨×Ш¢^Apå4®<×½éº{\CÎÄ*‘æ!bÃ"ž²4UAHJfy낹®-PØ^#´%Sºk­Ùœ*©Ve’¾By“ôÁô 9ŽêC«¬ 2xf—ní– 7Šޤ'œJ¦ä8¯£5†c,åç›}÷vÛ)úNåc8%`x`·=zp´´¶v¶vù´8?‡¹öwµ¦;M´Ëí÷Æ¡§’“"©ž²K?ÊSt…é‘?Y5 2It¥0X§6TP]Åú*:WÖqù%4W°÷öñ7¾éš£33ñ™Xe ”ü> G¬‚Ás˜¥Í‹‰”¥eeÁ:ZH; Qz†&ý&ÛL)Úû‹iâ”OCOÌè‰ôà ÷`u); `ma-»w§îÝÌ–HÖ¤µ¨— XRç¸'U”å!E›vêÏÃS¨xn¾2(ï( Ñsn}7f†µsK¯ˆK§1_Ûxgp5ÞzÕŽw)TY¯š½bØQòƒúKÅÿÉTÊÀ.àM»qøÞk Í•¥Sí…s˜¯o¢«ª]Ù³fɾ¶¨yî¨k×fÐ>æˆ\×fî©Ô—å© r<-’d@voÈ÷ 먮`}Á¹³xù¿b}»ŽŽÜÿ®]‡ù(eÝÇý仄4 ¢Ròž©º½Õy¬fiB.½XnÚ†A¯3áf^S–ŽŸz§¯’c>Ù[É4”¹ë¬nd'¬×uŽäR£t“Çy¡û¸}ÄcB‘ÔL9‚?þ“" ™" ÛùÉ¢ÒÅFKEcÀMÀ›ÇÔžöÚ™æå“âò*B,ËÀ:PK¢«TïÅ‘6Lªd%–²J蜄»WËAˆä›`%ÌÏk¨’7 kÔëX_Æú¥vçäÓXz¸õ}‡ï»iï,JìD†¨êKIàE1– £dYKLò;"y‡ªÒ"H®_)·£ËÔÎцLí6nsœ…º—U?Ju§žAËXm`%þÕú ?k7p2údƒ…¸Ko;ªI›…ЦîžU Wdùþ ädDÁØÁ`–ÖKy1º*3À›®Ç5ÇÖk‹§Û sXlo¾6¡«ymо·]‘^UœânµUVmŽi¥†7‰©!™ÊÐB­c5ã±êñ{…k먬`õ ÚgOàä·Q½ŒÙ›öÞpïþbtRC™`,ÄÍFYä¸ÇÓi^ã‚EäeeJÍj5˜TeÇ©Q”§8¥ RKŠW‹ðŒdÊ‹½`C`)þ­²˜C«ÙAË‹ßÐ)eÏvÏ‘ºöp¹é‡žËUÑw2ybÓ¨M&©–ÇR`“ˆÐOÂiŒ1àFà®7a|tmùtsá ®Ô°(°¬[ä –]²V™âã§kJÂ*Y~4 í#­ZK,L6ƒ¯&’K„!Ùê.ÖPic½‚ÚêsÍà¥ÿ†µó(”K·¾e×á#cÅ—JIŒå‘*IK¦-Cú· $ÎÂjQ‹¥ºû1«Ì*ÝÌBócŠ•š».óžiž™IJñ¯˜¼ß+t5X¯})“ñoÔ&w3Ø>íÇnIŸæp¹³ßÃñÂ>ú8zhЇ¤³Q&ÄÜ!™`–üQÊŠžzÅ©ÒW7cïÍ{üµæ•ÓÁ¥y,t6¾‡³ÎNlçé‘ìã IDATÇŠZ¤OmÕ%ÝTÄ^Qîˆ#ó‰ JºúmÇÇ44Èé£Õ:*ËX_DçÜs¸üïh­ãÈCûn;2=½yÞ•Ò®äa ~²9i-¡Ù öÔ¤JKÍZz¥ª‚i31¾Úˆ±tm»(Öº“p=—í9ö©ø7Á#ó ù~;RvÀr”í•°ÍŒq—žŒS¹±—²Æ¡î¡©?°ÌÔ]ƒÂZÉ;‚Œ3‚ ;"v®Ñ‡q®n¿ cÁòù`þ,ëXŠÏe¨Ç'¶w²×Þ“ÅaeÿÄž;­ ]Â/÷’”•( åXUùk¡^Cu íË qê_±~ »oÙËî=Ó›{­è>wyBGAwXƒ§ûqñØgªa(I:‹0)̆”0ÚÀ9ªIK°Ù“ÎRËÞ9–É ¥›Þw•º•«Q†«¿Ò'F×..ÖvÊ+×ÅeNé>&j5Û Ð”S{rŽ…“º˜â’ e­(•¥Ø)5GËFÓÀ½±û†)¿R[º,-a5ÀZ|.C3ùIKu+FfXMuç¨G‰Î©®–#Î]™Œé!­EkM›Dt‡¢[y,V„±ä'tj@£‰ú:ªËè,œAsÅÑÒõ&w R>ô(,….ra×´yQþåK{!£p…yd庩&Nã)jù5Å£X ª6­Ü²å°,‡ —»‘bz&ݳ&=”nÔr¨ä¨Í½/¤¢1GL.Ü'ñù·â–<ݘë1%ÊSQñÒk¡KÝK¢+n9µ?òµ£Àaà `üš©õ—š gq¥ErêU3ùÁAeµ±O¢-@%@7bg§«n¯ÊL³°6CõkY4Ü¡+z©°%v¯¡¾ŽzÁê¥R» {ŽŽï+Õ‹í ,’UŒwÃð -U@Û¹b?¿©dÁK*Ï:˜]§Ë‚c}y¬‚ú$xqO·—ØhGb¬Ç` `š20Im±]6i—Ò°'aÇIŠ?³»ØTIåº,öhÉN/yÉw»|¦Jñja)/rôéÅôÕSØsãîBsåÊÙöâ–;X›ÉÅAåD墇¾AQË-×þÀBvi·!w69V–  ,áš¶T;t´ÿêѯƒfÍ:Â+'ÑX†8p÷®£&Æ76Zù¬Ü déPi“¨¤½àYà-G»eb§L¢ÆäKÜj{’µm"YÛ¿ûd{È`u#; `½fºSé>ïî´!óÁ5KÇLU¨xA ðDj®2›2H§†’XR •‚„hôh{û~à¾7bâšéÚÅ`á´¸Rßxs°FÐUtö2-žñ¢èÉ`,<¿r?Õ0mæÔ¼¦8j¬ ‚äÇsän÷:Po QG¸TÇ…çP_Ä¡go:<1±±ãŠof§³ k¥ŠI»CÅcJ´¢fp=öG.¨E¢=ýÚ:ÉyoÕê1)OeÚ®j±ÔfzÖDï~;R†K„ÛWz8Õ³ÿ‹ž1Ž^3kîL¬Oj,7¦ŒÎ¦„8+£Äõtƒ,"’£+?^¼ØlW!\X:ÛZ¼Œ¥Vãs”ÅÁ ¹D˜Z9„‚Q¡»o¾y•Ñ;",·ð’4=5™* ="‚MÊq Z@ƃ˜Äj“Sj@£VUŒ]x®P[ÀÞÛ&®+OMmœÑ lr—Á˜„®„yÞ)¦ç¹öȵTžµÛziµé±ÆÃ-é‰tßœz¥dûH·ýëµT—Å`åÇ Y15ÝíÆ][ºXnÕÛnÛeqYç ìJ¨óS¸+åÌ P‹^ÜÜ}'&íKáê%±ÜØ<õJÒWF‰õu tQnŸ%›¨,â!«(Å›¯pL(Á,J‹®6å‘ mÔ«¨¯#X<æ€ÂuwïÝ_ö7î."fñD-íP‹5ÖMyªåçL%¦hrÉ=¦Y":–Cªòþðý“¬SÍ|2<«K¬éw×êSó«åŽ¡O eíHç2±æÎ[‹¯µëW4gr©d9EWôt†ïA¹\Y»ÔY8‹ÅÖ}Õ4|ѹ'xÂ%/¦›&"‹iq°Õ}ã…РƲ›¤¤Eß%l““±êõª«è,œFsŽ<4}äÈäÈæ§)ä“ •´´ˆc#-¿¨m$é‚hiUœ{Š¥ËQï.Õšµêµ§‡[ŸÄ‚‰‡²…b\"œœœtTñÄO|ík_ë‘=Cq•.;|ŽqgK†˜é:2gvâ„»Õ¬ €ÓÔ½Io*¹Š20 ß‹é£7úù¥‹¥u¬ ãûÊ]ñb·W„…òá ‡˜v=ùÄùYXÁêÚ4i]( …M² «¾Ž`iµU„¾qòðÁ‘Ñ¢®¦Ízù1 Z%ãjù'ÞVM˜ÉÓÕ”Gª,)Q´OáY°‹I¹ý¬MÎQ6o@ÜLÉìXò©'bX?üð§>õ©B¡`ßl6¿þõ¯÷Úª­‘Ü v— ]샑ILv æ”´Mr´‡×‚!>÷øàé~~ÒÓмÓS„g¢¹ýøø«ÝÀwa|ïlçôüÒ9±ÚR âííÊjc—9uêR²ƒä¿^’žAÒ R\\go…ëôX¦L-ærVÈAvÈñG k@­v¢àÊI4W0¶groylt“¾¢Þ×½]Hí1áEáÑ¥]EÔÖEVœ­µÓ=ÓHÈ•äå“¶>µÒK*0¬nİÞùÎw¾ç=ïqQqêÔ©ÞÙsõÉ6dù•b¬|â¨MŒßt7¬È¥$Da–—ôÁŠÇU¥ Ä#Ç_í½u¢à­-Îu–æ±ÒÙø*N+í«8.9ê‰?°T%9üäp>ñÖ Åý+—ÕBf§—%ƒ¹…3UôQèÜ´(´êÍXÍh…7D£ŽváÊœßZÇØžÉYŒn|§H '$èJ»‡ÃÄTqÆ‹óR ƒ¥h@2°60Çd›&Ý‹ :ogÙ&楘1d°ºƒå¨Â=äv–-IýNºçÌœK”¬èÇli]‹V¿i–Ÿi¸àS|ª‡z/>“æ?mêòëΓÀ­û0víaoõòÒ¹æR•䛃¦½íœ`èɘL{IêÅTS~¼Í¨¬(–5NÛä ê¸Ë‡®6ùMj¹!Yû ƒÕ!oÖ›¨¯cz}Ùï4v—Ëc¾P±*ÒF‹QšAóB/8¨R2›Z•žaO=Ìç}\)d{e fg…#¼nD«$ßõê“«Òèí"ÆMî÷ÝwŸ%ÚÚÚÚ~ð—CÉ*ÝŒ5Ž#i,>ÆEL{>Iµ„ÓE‚yAû¸aúSaþ+Ø‹„^|üÕ^àø›*·ÛËÅr{ó£Ît–bùàG?SŠôm8¥ôèÛ”!yäÇè @ ê·ù¤Â[2Ëa³–A´‡×¢.-hVêWXò Э6:-ˆÊZë01S(Êï:GÑ•“l•ÂtGNZúŠ>5æaލmçÊ=ÛÑã>sgËìcÂÎÀµ2{†ov)Nç`=öØcÊ‹/¾ýíoàzoщi¾žo.pÌv»IîOyI¦–mÿæµ.fP¦õ7Ú;œO’ ô4SÆ#ÀžP¯,œk_YD%ØXí˜Áì|Q…6ÛBñ“h€”KO%¸¤–—6Áaa’ ã„,_² §R˜ž´¸Aiä º’/6N€N ¢¶†  “J£“¾WóÄŽŒ²¦¼<(×[~$/ …dtmëåÐ{¦âMŸž¡¬,b© w„d׿…Ñû!½2)•á۱ب'â°Î;÷ðÃ{Þf#_[[»þúëûfÕÕ$=²¤²Ç¤sðb‡2ŽLáíÓn¾x¡$mšß+÷ùË-‘æQB/Òà0 Ü´c×ôÖVæOµjX#ôU¤¯€®k„fÁ'4Œü…qYÉ_HöZ…ÀаªÉC;—6-C?™}d)A€‚B\rjQ«Ôˆä±Úñ*a´Zh·¶ë;0u¨06o>òaMú¬=ÛçÐ…×ö}ª,E‘ ܘæ"yÁíï^,éÚƒu#ÊH2HqÌoêù´3qšÀú¾ðŽw¼ƒÞùÖ·¾õÌ3ÏôǤ­ûè™u p’®:Êj[‰åxÌ‘¤Žì¦áÉB_!VNùzSaq809þjpÃÍCý|gé‚XioœÎÐNnlGò¯b‰]Ü8wt%Y«AB]E"ƒ °äÙå“@LÄŒR†`Å ö¯cyMqÚX&ýÚ¸QN#K~š°ÕFÐÚu„m˜½¹4½»PxáF‚}6GæÝ×½*A ¬­RÊæFH¥›¾ï¥¹yK/K•¾ºg „õѶ ù0Ö¶ÊÂkOœUЀ;î¸ãOþäOú`ÏÖHjL+ìÇ ¯–§N—µ’uíÀ’¨¼sêÝÌbÿ¤M—ŠÂZ…f·Mg®®9‚R°°v¹½ZEMl¼<Ø!ÛÛ)|é¡(Eš ]Ñϼ¶:&â b¾Jî$C׋iž*P  ”HfÔ;«¦ž-…š² v†¾KØ! Vñ&ÂößYصß÷Õ~$ÿå ¯<¿ZP¥lärÉ/Xºwj­B÷.Ù+áÕ”/zO„—@¿H¿²¬#æøíHqb°~ÿ÷ŸþÛjµ¾õ­oÍÌÌôǤAKÏ w…Ú‰oª#Ï”D÷bA =dø³b\-ŸaÓ3M9àPh*…Aá q7ì%ÃK€RÆCEŒ_3æuš•%±ÚÞø®s+ùaÓ¡‹¤ÎÔh=rÔ8’È/HW¥˜z ’ ³,A°×P|  ´>PêZ’7ʵ]´$X½+•Ný7Kó"Ð È6¬N„±‚‚6DˆÑ™ÒäH¡47-7±P (eEÃÐýä_6Ã[¯Ð-JòÀT²ˆ«ÚÃæ ¯z8<L4ïàýé='€õgög×_½Üƒåûþu×]÷Å/~±Ÿ†¥ËÊÊÊSO=uà 7\¸pá¾ûîûÕ_ýÕþ¥Õ®ÒN÷Þ›#•î‹ËoyMÍÁÿ ÝêMâ1¶‰Æ`E«c‡ <=Šz{m>\ïl «V]qFg«†>i¼O¨5j¡g­ÀÐ’x…—a3À2Ù•…ç+h Àu/¯˜XÄtQ¨üÂ$‰Õ:ˆf ÕËè4Póübbÿ¾G¾H(’…F1%ÏÓ¼ˆ–’…üóÈn9i€Òìs“4]tÞÂ+=k×È>SŒä€€`=‘‡Â¥éÅ Në«_ýê»ßýnz§V«ùþÇð#ùÈ»ßýî§žzJqÿý÷ïÛ·ïƒüàÖš´Ý¤¯S(ú'_°áÒ®Mþ´x‹3.æ),½CÙ)mr"†ÓNRaÄñL£Tl׿ÃÕ+¨v6é«0‰`d`×v'ayš ¤zä+P5rOz¦HàW'i&k˜^¥åØ4šÛ‡f­s Ã5;úTKx>õWx‘txZ¢î³Àž(zõÊb¸VG]l.J¹$•(9â”F&qtŠEG@Е̲|ª +n¼¤jГɓ´J@8 ÜLÆ ØAm³×)ϲé_S•ñÀ–tI—"­@@tBÔ–Ði( PÜ,Bü3um;ôÉ#åë:~2;B×na-=ž“g&ð7ÈÑÉ=!{Šö§|ÆÕ¥X&¨™&„vm]Êð¬.Å `}ç;ß¹÷Þ{ggg'c9zôè÷¾÷½~g‘þç>räÈÞ½{£ïºë®gžyæÄ‰™” ¹kÇJSÒÂ<¶FL㬣ýöXù‚åh,ùl>µÌS©^qÊÅ‹G‹h#À>`d¼Z°¾ˆjGý´³V‰ÖŒTªÏÒÅÁð­Wòóˆ ]qƒé ¢åfyñA£#@ð€6P:À,p˜@ÊD1ÌsÈ`&ɪAiE"ùÛÜ’Õh­FtRÃÈŠÅÍ\€”¡eJ`Ê/ÅU~R§œÆ„:…¬[ºƒvúaÒ)tar‹òÚ“è~D5µ:Ïp?‡¸ÄêŸkЗÛ`u!NK„üÇüË¿üËcccßÿþ÷yäßøÆ7~ï÷~¯Ï¶Ùä™gž9räˆü÷àÁƒž}öÙ›o¾ÙQƒcpwZÚÀÝ´«^±è9ÒEZÒ¹m³QªBO7ÆqéÉHªâƒQHe—ßlÄ1œ“4Àþ”FÑ^GeõÎÆî«€øfR˜[jÆOµ ð`u!NK„'Ožüæ7¿yþüùGyäÓŸþôúúú7¿ùÍø‡è·qi·Û…Âæž×b±@ôl[<¥»\EµL2;‡dÑ“: çcÚµ.$5°0ØLmPf«J0žºÝ0Ê`íšA¡ƒú*ÖÖQ Õí튑†ã3•˜c Kæ)êr”¾RDAJ®åþ­hÜ&ë€×oþ—Y|ê~iŸ<Š÷Œã~à.à°|àÝE¼ÞÃ,< ù0–¥DÆ@°BHÙ"ì@4«Z¼‰‘B© S÷I!+ØTANÚ;2;`÷-öç˜SñˆÊuobÇ&ÝM¢.Õš)¡a\†‘©t%Ã=X݉ƒõáøøÀ¯ýÚ¯ýéŸþéßýÝßMMMxüñÇûl›MöîÝ[«Õä¿FÀþýû·Î¢ é-‰Õ¶Z¢¨r|ùüÉ„Æ2ÝW˜âöd”:¿ÅÃh£PôF¿‹<LNÁï VA½³ùmaÀXvkóI*áƒÛÉÍU&K8f•(ÍW÷ûÛ÷¿7<ôÈdåÅÚË UŒOãè^¬U0Õ.¨ë@à.³À…øD©?wS#MÑS•›HJªETlÀ®xßZiÄ÷ >$ÙPA^ðÈB!’ ŒºdŠº6Qa×SysµdÓ2âÁòo¾¡ÉÓÕ—c¥÷‰ôºŠfÎ9D`çb£žˆÀzüñÇçççGFF|îsŸ{ÿûß?77÷| Ï¶Ùä®»îúÆ7¾!ÿŸŸpÿý÷[¢´eãiÇ‚èQwêî镸«í÷à’ƒªIF©ƒáëZÉ1––ñ’ýör™œtÑÑQ´›hVÑ 7>÷7)ÆÛóè8vq9ÔÚ!cBŒi"E"Ç_&€Yàð‹oÅ­øÕkÆÏüûW^úæË«'*(tp´€{Ç0)p먮a—W°ØÁšÀ=³8UÅbkã|,?¹jF¹ÆTáHEô+Ë.N±AiïÑ6¬ª´ 0Rô‹>Z´a(ë€&ôæ±Æ©e¹¤%Jf¹Ù©â¶ø£ÔA&uláIt¡2ÅÍš¥4`®ß¾ÊÐa75-|“O=#®øÇüÇ'Ÿ|RþmrŠä±Ç£!ÿöoÿöcûXl³É‡>ô¡/|á kkkÓÓÓ^xá…Ûo¿ýÆo´Dñ’¹ÍJÉ\3•>!°TÑ:ƒLÑÓ©Si ‘t9BçÕä…GÎ# ä“Ö úñÎî™FËÚhÔÐ76ßH¯lB*üŽ)dO0–\Úk‘w¹Ö­hÈh÷UöÇ_z_éÿøgõ§¿ó§ÿÌþÉâÉZ°À(p{zx¤Š£‡phÓS¹ˆå&öàö~ ¬'SÉDõYrJ­¥èÊQ¿ÒZ82+P(Âk¯!h@؉v»ËB. ¬åˆd©zº0ÊI Ša.bŠf-”§Ó€L$·ÁÓÝtŒ›;i± hYSÌ—Ç.ÅäøévCé^Œ+â„\¤[ËSå­o}ëÛÞö¶/}éKŸüä'|ík_ûÃ?üC{”h/­”¬.?‡p’ã*•¬öwÉu9BõDxS«v{D;mã¢Á®‡*é”ô Öôå˜,™ gÜ ¿4“w† V7bXŸýìgÿå_þE~Ç$µZ- ÃOúÓ½6,]¾üå/?õÔS¿û»¿ëyÞ{ßûÞøÃŽ{åMî–K>&©K ½OÂÉ›|Ñ#±”Œer¬Mf¡s,fóy9çè¿  ‘ %BR*—þ¯ŒOB„hÔQ« èϾâYvŸÊ»@(“HÇÛÞ1ÐWB—uä2³Ñ¢»€€ã¿úù±7ÿÏŸûÿü•Ÿ®^ê$Þ›— L/â!Àó0³×Âú ŽÅëNâôª€ €Ï7”›c6eíp8ëÎ…h{‡¬Pð}ˆBø^¤ÝA $àŽÊ‡ž1«ÍŽú+¹àÛ°háhaŽ¢“{´Dk¼Vìc‚eªV “‰S®û4¯Û^2\"ìNŒëCú£ŠãÇ÷Șl2;;û×ý×}MÂâ™òÍÞäS÷©Ûv`¿(8à7íQ´Â±÷ôi&Ñú{K=šÐ˜¼à¹æI˜®MFF€hí½ÝD«‰@$>e®¥ì(Š»RšÎjÈ ?þi?zÃó¥MNꉶo¸3·½¾ýÏøo?üÑBK&;À2ðJ€CÀM»!BLÍ ¶Š]»á_@cF ñ‘N]®nh дiÛ°`½À|~ ðb•Mt‚ÍdÅÈʸœ™£˜^iž¡©ˆ$d§‹Ûiñ~29K!À¡ýg-vÏ„¢i%SàžÐi™’s ãb’>LnÐ=€õçþ烴c`’¯d o™]¹£“¢ÕÖspÆsá˜ Ø ¸´Lmz VרOÜHªA›´’#%¼LšH”f(£cð"›,ŽHªR,‡aÐÌá^N™ÂKKƒJ@±€FÍ:‚0°8£ %µôzUõ^lªi÷Uª H†f½õajïâ<‚Æ&† ‰ó.Ä/ŒP¯bbÓ×Á+¡¶„™f€+€ ë­–Ý÷v =f-t @Á7¦¶§Ànºj\ŠEx <¿„x;ývŸ\ÔÚ Öž)¨ò“„“²Î(›‡J š4ÍLlŸŽÇ%}-X¡W‰Ú‡šÔ;}’¾$4d°º“°ÐgŒe™ÙhÓí9‰•C²b£Ü2˜œš&Ö&É4â æ]$¢òˆ'ãÌ’³бJ€ï! Ðj¢n2 T Õ–šÊYÄ‘wñã"Ó‰\&F$úm¼%W™C§q烸åY¼|eC³,+yàû80Ìø˜Çø>Œ”±¶€åKè4!âMî%Rþp.i!§¯@êKA'ZŽÇR˜Ô˜è†RÞ0±ÅqA 0Q$Q,…wôS9Êœ£+ŸµŠœL#5›æÎ”GeR¡^¹…'g]yêW©l·,ô’ÁÚ‘ât’ûP1 7–ah`6ôCsžÙÑ…w“‹ÔÉ• ŽGI×]dtÅcÑY>·„¦Ký 14´Ñn¢-Œ‰EÐæHJo§é…ì냜 ’þ>’PÂgÿo¬\Øõ³¿rë‘of€±ø‡q`˜v‡ë€Ã{1»E^*.Ìcµ‰Nl^ô}èîgŠÊìÈÒ&(àðÈÊ`(à0½¥1a!6˜vòäw…L)aNVy,E‰MQšåqDÎZ IDATb=¢Ù"Âpm ¦•L£¶wØ“Ðêïí(:„"CQd°¶µô»Çv?¾8‹ZÇO‡òþ‰e¥ƒš«« Þ—z#OÆ1ÉQm¼º/Ðn#h#ê UbÁUî7ÝEîI÷²/BÇ”HŽª¬¯~ïJu¡éÝöž÷¼éàCÓ¸¸˜¦I`¸8ÜÜ5‰Ã1{¥\:Ê"Î5QFz¹86)S¢Èg÷S3 ƒ¿§ §”Ëð'g±ë0JãhVD«…0It%í¤Jkôɽ–ö‡É R@Æsgj„R´˜Œg_{Ç"ŠyÚtÝ•§bb%.R¥¯ƒ[O²åqø©œîÄ `}ík_ë·ÛS2-4ôDUé²+,‹rmçK ›ïr%ÊÍL¥E\b:ôs#M!A|âoL躌xÄQ7L}9©Ì<žAŸà*Ÿüh¡Ë޶SkÑñÙ‚Ò&-%–:’ ­´s ÛÄ­w±¶*#C€Õ•81ë¿õ[¿õ7ó7=öØG>ò‘k¯½¶ß6m+±8J˜¬­ÈE¹VRc lÚIîŒt];j»Ô‚¼„ÎÇðù=–ê€=„ZykÌ÷@¨9Ò"B­oSRQlpŸ'PÍ% €ÄÁ§Ž¢Ô¦ä®Âø¢¼ÚÂ¥ø“=¥WKüú úàGqáè×ç/_Æ\¡À 0;‚£×aÔÇîÝŸBeç^ÀÅË8ÕÆE m_‹÷±5 ²±—†)³ô¾òy=¼¥¥¢|É'EßCqæŒí†_ÀÊ©ÎÚJ1ü’Ÿz4}+IIBù)IÛA  ¦·4;R›#iÔ¥h§@Ú0&œçnÏNEDzˆväj™ÀúÆ7¾qÓM7}ï{ßûÜç>·¸¸øÆ7¾ñç~îçöíÛ×oã®"Im„¦ØqÊØWñ¬ÿ:>âÒ%êÊ$. iù3$ëŽB"%°â³µ“~Å3ѧWù1ET‚Úmᦣ|†…3€It‰±¤â-A–/ö¸-‡0>€` 8 |û¿œ˜ þòúÅ—J÷}tß/ÿÉ[ý§öÉŸœ¾S]ÁôöD£‚Ñq„ΟÀÜY,_Á\g€E ˆx³Ôv\n.Gai¡‰B_i×35iª?Ó#eŒM 0:Ñ€¥Wê K­Öæ)¬>Ð!£Tg½äB­RïZPn'ᨅ ³E“IŠp4£moJïs¦Ya=²7TÞ£»&›»„(Ý÷¾¡l•8¬[n¹ÀÃ?üðÃ///?õÔSŸüä'ßúÖ·~ô£ýð‡?} p(ýÔ}`&U\|O_­åÊ-=¬¾“:¹WnJ'r¡à!>éOl™tà%,ÅýkÁ–’wJÈå¬g‰dŽò´rõ*Ú€UêÀàkØóÍ+#Á¾æÔË¥ÝåéÝ ì=>yG1˜?…++#ÆWN6—Ïu.Ââ2.ÕQ qxXЉ«hu •D!.vzÄ6zq–Cgp©hð’dBE`d¥  T„€ÀÒ‰ÆâR« A^Øl l~5HzY:D’ðvW`b˜lÀZã‘lÆHÎ4”ìx$—L%&t÷MOé¿vnϽ­öpPzíšn&WC#Àzþùç?þ½ï}ï‹_üâ?ýÓ?•J¥_ÿõ_ÿÄ'>±²²òÛ¿ýÛ»víúƒ?øƒÉÉÉ~ÛºMdû`‹ô„=ⲪÕRA. Ùu" kèMLáuìx‹ëQQïI˜tBŠ ”9L‰~~H]82-eÃr {_LKªisj§h0¤ÞqÛ}e¯>Ê´ã‹u`øþêß®ßþÜs{öÃ+–ÆËŲß\­¶+¢<Ù¨,„ç.`µ‚sæ€Uà°o½PšÉ>Ú žGÚ8e.ø§•ìh3ÎÁÜQ•ßœ‚7¹ ¥1¬œÆÂÙúb³ÕÚ4)Z?mJ^iB¼gÑæ¡” ÿ|$Çë¼¹ò|™ò ]YñÆ™ÅòÈè÷d¦±}dk3òÚ(í'€õ‹¿ø‹õzý¹çž»ë®»>ÿùÏìc›˜˜ˆ=þøãŸþô§?úÑ~ýë_ï§[&[ §´©;šÄ?}¤Uhq}•|pÐËKO–aKèŠK)FÁ<5,Ô»bs«ÝB±ˆ0Üxê³$$W!Ïá¤tµ©ØfÅ<™b1‰µí¢Ø 7`(5ààÕUÌWqÃŒ 1Qh„‚šk~Ðî ÒÆ‚Àph«@ð€u 4â]ó–Ïöióë±’”7E®}ýÚY„—÷A®-  ,cÀl|Üh ´v|”ht†Vh­ˆÿ#i¦fÖceK!Fl]euJ*ò¢ L3Ó(íÞ™QšDm!hÔš!Âx‡» [Ê‚¤ ÚŠÖæHyR5^)‰4d© Qz_Ø¢D)´T±7B;kå(ý${EÈõ)–{Ù%«8, ºðØcõÆ–×´l-ñ£*Ê£¬âh°c0;¾tíÜÚ„r…:›TJOÁX2EîNä/:m‚ÎæÓBòk'œ™ wRób¢"” ªYX2›Z v‘B³1XQîª@T"°}ý:ÆXÑ»ˆT ¨Õø¹æ(X›ò«°J &y]iÔx~y*©Ðj*»F11ÂìAL\ƒvkçÛëõvóñw~¦?ÅÓ^2-ÝTx8Ž™øÌ†·a­tƒÅµ†¥†äÕ„^ØÐ+ÉmInŒØs‘ŸJ>ÙYß"Ì*ýÆ=Y“öÒH1Ms@½üÍ*Ülw—ªÇ"t~O¥Œ‚ u)z(ä’aB €·qNEWÔIû÷(>U0;µ°ÒžAù¯OhÈtz;WË®¼nÇÑ~¬P:1êñ§ÃQE¯×É3¢ÀòhÇ‘&tåÇ~:°îåRÚ­z¡Û/ï“ÚŒÖgf02ojÊã¸òæ~X_m47«» 4Ȭ0™–’M¥ ð XH›ð¶­Ec&˜eªYEÜÞ†sà ÚËv2è+÷¶sб2XW“ô•ë2…^¥(ÝmŸ²À]`¾Ñ™›GG|0©£QÛB Õ@g7wCÈ6,¹«?IY¬µØFÃ(Ôw¸#×Çgì"µI†¦LÀ\ÄKE(!ˆóK‰% ;´†™`‡ ”g¢èÊý{‹Ê¿ €¦« Ì{fQžAÑGc gÿ;.œX¿Üi46OĈV3¹>Hóeb­”ee•Aå4/eJ dÄÔžiºJDÅ‚ºRç„Ê¿cej9¦”ù2EÉòrcÊ܆Ò?Ùq+ßJGîðýSØW°eOÈ’®X$ÇeS$§æ\R‡*eô7qôÚâK¨m&.вY|–ï± =~ •:m„!T/aùLs­±^A»½² Ôã X4òIÉ?_TÞQÉì+“Ú¶•·$JBŠÍö"U†)R”gª¦k«dKì´”O—èy(;`YÚ»çÈ È†ä´I£‹Ô=ÃuÖ¸RøªØýLTßÝaµPëK@þ*CÈÂs«$’è­ø$r?>£\òX-²îÕ˅JS(© ‚Wö×kó’©¿HK¸=FìÄ…øxˆhɬŒ^Hâr§@•›Ü€$ÑU&@ï ]½H¸\¦ÝÓ˜žEqÏu˜¹«g°¾Ø¨ˆZ"‚[1À¢öhY%š/Þ0ç‘vÃñW‚ •+XÁ*%I±tÓ K¡É(Šh;¸é‘¢M¹c1c0à`A†b’°,b=· qÉtø´2«(hÃ=énИâM“ã|"‘Ê9RÄûj‡xéb%Œ0Q/Ô«E®nã{s  >FÃÄa ‰ïÊ"…Íâ0ZÁ^vœ­vÀÑ}¿ ÊƒxÓº/ŒÒcÀ„n»·Bº(]ƒÂå8?ŽKÑUo§é4õ ú ˜™Äè>x{¢<…µ³¨®ÖVPonì9 ãƒ'6+p æ $›²ÅI”汈=[’³ÜtÞ`ì³,š‹N]‚-%ï[‚™r$Ú;‡±2X‹cë&º]úÑsò9WË`ê®ÐD&)ª´¤‘ËœX0Çc7Ìd¹àbI±ª t:ð‹ð<Œ ± K¬b¼5G¾ÏÏQI?5ÆE$bëáwS½È§ˆaAâ­î4­k/¹œÇëË# œ,@–3×n)=Yô0*y¾è$°˜BéàaïÚ;Ñ\ÅÊiÔ•E4jÛd}0ÐÑW CFó(¯iÒÏ‚)/ZÂŒçqmZ»”ªûÌ-E™’ TêG*ÛôlK®F¬í(ƒaÎIÎÑ¡Ù=JªpŽ‹ ùlðÌNEA {æN¤/ °ùœ0‚ ˜UÚ1Æj'¥.„.û|Ä·û8lŠú$&Ð)ÉB¹½ V2ƒ¬‰ÄR GrW¦ýûÝ-º 3À¾iì¹åG1}–^Âò‰Nµ¹¾Œv3qüU+Þ€¥`,$3â2(Kò¨Ģe+’zè5ŸÑk{»rïzY½TåÝ ƒ¬˜©{Œµ=qŒ½~‡’*C€em‡ ú@*ƒÉO4’n’Vܳ2±îRøbtZÒ9Ñ)5÷a º2Ñ$òl‚v€1Å Ê!F‘ø[{ÅäI a ª¢¤ékùJ8‚Ѳ\Ôl0Yx²óO&Ñ–‰)€b^¨Ã &†ß×B«¢Íî>µI+ÉÉj’ä°Ø3ƒ‰ƒðgg¶±ô *‹õÕ°ZC(àGûðâ/äfÒ‘’X ÓƒÓ”¶Ê9HŽAeáXÖIiÝig2&*ˤÍôÈ”´Ix³GÃAôxIåÀj…B (0nœ´Ùˆ4/&÷$É— åÙ Ú’Ô6 TRܤ 7»‘ôÓv#ùSí¿Úˆü_‰98-”*våÐK”Á¦€Y`vJ×ìõf¯ÃêY,¼€ÕjuæF¬ y€»ü)´“òS6`ñS)þPÐ'Åd&*‹Öb,zÇ^¼"™º]xwËzºGHŽ2±tŽ÷]’î7þ Ãð¿ßÿýpwF ÿ;°_·ÂžSÆWì €Õ&•=Œw¡ªWÜOn%Ú¡gð“î2Gù¢‹,ÑåÈEq|¤„ñ¦iºáÙçÓˆÐU¼ «\‚_ÄH£åä6,~jƒÜ‰åÖ‡Û¦…‰J}qø(j‘¥¢ÜQDÒÍÿÿì½I¬-ÉU÷ûÏÜÍ9ç¶ÕÝê\·zv•‹7ð>xïC²'¢‘%KH $`R,ÁĘa<{`[ `êA–°žÌÇö'cì¯ìêÛ[uë¶§ÛMÆ䉨•k­ˆŒŒÌÜ{Ÿ{réè(wfÄŠ‘Müò±cKe…EË2ªqªF£*,p¨ÓÆ›Zà:a"V©-•òÕ]Û¸p¶îy§ïÆkßÂ¥—нâÆeUêP›€¥ýò 2¦YˆêVéu—7¥:ú¿iK†/•xò]1×FÚ¡­ÛRb¼E6l\ó¸½ xÀnŸn^…û€Óvûål£$‹Ù ¬ŒÔ–Í/I¦®Ëg«‰'œkí"9…¡´ŒêǦfl·§ 0¦:¤Ûý8͆„ûèqÀ!°X¢(ç˜fØ2GÓ°FöKø”«Ü(¡\Ò]¥LÉ|¨¦ÌÄ!7+ܫ骡!‹Š¦©=¡’®º2Sm4& QùêNàî»pö¡|tá^Ü|¯þWöf»¸þ.f0ÀÂÒÕŒ–úPT÷°B©VWùÊ—Ë5”P)_±«uo2fšL}™éÖšB[ӌΒ/}0_¦Ýݵ¹ž±|"•–çùO?ß"ª_'Ûÿ>Ö­mcàltâÕ\ }SZK« / gñÞ|‡ÒèJÍÒè!hü݉OeQÉBiŸä:¶9°(`€ÑÓ)¶±EVuw"í}Gvƒ®8š{@PZLÆmaóÑ'+N¨ü ù Oœ!¦]©2K@áƒàN€SÀíÀ=À}wcûžÛ²íÓxù¾ôjqÓì]Çþ `‰ÌÊWtwJWF4ý˜‹ÁÁB8¡¡ªtEÛ Z•éKBí OSæX½¿Þ·Ajê]ÓáûjÌ+J|Ñ9éçÀaz\ƒq;A€5X‚%# Ê(ñ&a%íÙ#™Ôí~TptihK—¿¢ á¼ôgŒ Î,1c<ÅÖ[Ë£/Nª«a•¿HÈ Š).$ÙCÓ€©©(“·è#kå‰ò“ïAŸU0?´;4ökù%cÍf‘Ó“%¦À–¬‰] «ì¿\᤬Òܪ•,rYM5rsÖ°d)á~Ô'VQ)ËçDvÃyã­é{?ªh•kòÕàì#·ççï›Ï¼yeqd¸òv÷ŽÝv-`±øéÅrm³â*+ÖjÓÛi½˜‚eÕѧ,¹ßmzQÅKY™v14ÊÅöÇø $<%¼52v×'»«¥ €´i’ý7Ý¿zkImû°¬7¥1ÈwëFoÕ4K`§Jf™§×¡üÄ”’Ú÷þ2A9 3fÀ 8\`k,{oÅÑ1¬ Y!É-e¬¤Aù/e©BŽL&GQ|OQêÑFEÄH:†R\fûݶöU)_ݼïíûîÃá•Ã×Þ2û‹|„ë—qå2f³£ÕèòW íšqç4'ô/#³Úþ%¾(œ¡zUí ÉĆl+õº’)å‹SÌWÀa ž4SoÒ4oí±¬ÖÒ.ìÕ7³°6ˆfÖh¾FP…%¦7D6`<6µÚG@<‡ež§¿{Ñgªý“ª¨XP~\ØÎµü¥”Åãò“ Ã-‡.ˆefåÕ®ŽžL;_²e¤ªaHÿÿNヘ4' GcL^¥ª²å62‚V%]vòÕ½8{1Ïo¿€w^[¼{m<†®¾½XZùjß®€µ `”iÿUùÊ7ܼWÍ+kßêÖhM¥Žö×€”Ü6Ù6<¼Áz²°ZY$44e‹˜§<&H6c©ºNšsÚ»Kh‹ïÚÃa4•»±G¹tHAÇG$ŒÀLUÁ*7ŠùÆ`œajøáX[©A]¶[~t}­ONSC‘ÙôZ/l ·ÃZŒUY¥gª]M€à}hÎ̓1K·þä–4ë5ž®´zÕ­oˆA"TrÙ z£Œ4º!™R~3ˈ΀u]Ëìî'‡Ë±—ز Ó NϰgÞûÙœ‰ýå_§è:Z9 Õë'ó\Nt-S×—S®C {[ã­Çd5JWnc lÛ¹í÷܃ÛÉFwÝ+o/®^O‘åxçu\½†Cs$_íUà9ƒª]Á^ET¾ÊˆÆþ\–À…ª ]nO Ž&4µ–×^ÚÕ™+ó<ú©‘Ñ"âEhi`µ±°ZYäóbF¯ÖÔ¹¯[ªÝé“Xb† To2ìNRœ¯+b¹d‰b.žŒHK;gn¿Kxjé£1¶æØ1ضÓt\²B<ÐAŠv«ºj2•²¤1ímdG'Zâ^­Ñ3Ý×y´¹âéÊéIåÜö#ùjŠ.âÔƒ÷dÅÞì­+˜-G[¸òÞz {ïÉWäûƒj̹(Qξ’ÓÛ!:W•± Q¼ÂŒh çMÝÓæø|úކóÆFøáÐ(c–VVrï0(X-í¤Vø©±–7éäBÛÜEñcîpS}”û¸§öh¼Ñ+ n¤H!þÑ]kÕ>Ì=Ð)]Q¦:D8³"ÄbÉY†QŽiq4 kjÿ¢õ !ì`SF~£ÐˆrÕêSŽ,,:8zXV+»Qæ )¡ÏĶªâ0â)·3ÀÀ}Àƒ÷ã®Ç1¹pÁ\~§¸²7šÀ¼ù"®\ÁÒ`FèÊ2vϪÅÑE¶@.3*_1TòEîÇkS½DYÅÙõ¦êU¾ #ð`é¯Ë _Àñ§zXWcxçž;é€5XSkú$O“öÖùŽ”ŠÔRXG˜i -Ž& â–[d|ŒªÕá[££¶–Ø1G?¢2#?L]•n¦TQ-1#š«£¶;e27JxË›D+Ôp;32ïÊV¹4ÃýÀƒçðè8óÁ'³å̓7//ŠñY¼û&Þz{‡˜ûvù«KWê¯23©Œ~,Í1º,úU+",U¾Ê<×?ÛS{ÓÑ+¿ÍcòQ51½gÛx«-¨i‚F¥¯ø=g ³66V+[¥ÊU[V‘tå¹óærÙ[8ì¶K#wÆáܲ>L¦d}•²ÉÈS~éVÀ²bÆ84X,0ÚB>ÂvŽ% <D²’µ¦]5™ž‘>“=(ª½»lÞcaM©½öËÈ ]9Š:v€Û€{3<ö0îxêÜèÌøà…kïÎ&ÌöñÚsx÷ æ‡ÀMûýÁyŒXA’«Øé(Äúï¦ZßLûCõmA¾9Ðì´%ÈŒñ–ð•pH¦ÜÀ·…¦ ™¾'·ƒ5²°BÖÕ óRزÐ^BêC¦Š1ʾBÃì%óÑͨý„h–Œ¤ñ1Y©cûÀN©F̱½ñf‰3C~Q§Ú•²e»Mu;«¶6c,|¨*ˆB“‘Çcjm0‹^3w]m瀻ÇÀŧ°óà=æÒÛ‡¯_G|„·^įco†°kÿfV,HAîL©tE¹ÇTç¶û~"‰å¢•*–¡zéJ£×¹ºÁŠ–Ôèóp(·T¨L­éka'iŽu‹­ÝN4`­÷m&@-›ù¦6*&Õ¿® ÊGsøIM‡TÔ÷õ¬: Š.”Ò Æ³Ó‘“%œ³Eȩ́ ,ç•‘ ŠPlî ñé:f?-½¨žZÓ²¸‰e¬qµŽM%Àͱ¦WÃ2*_`¹…¯>‡Ç ·ýØ=y¾¿ûæ•åÁbç4n\ÆKÏáÊõ£µ¯Üoã¸_æ\~Ì«¼rŽA L•¯P½˜3Üá¹hA²È=µ®’-ÌsµÖH|¥mÕ¡mì]³±w;¹€yÃÊ›#%¤o“«Öacp3ìÇË¥@Pûñ `a—‚t„¨¾Ks}SŒ\)…ýÕ}û²90Ÿcº…Ñ;9Ì.–‹÷ºCá¡üO¿VFEÚ…Ó\L~ƒ¨ì—ã&¤Ä´NÞó]™ìõÀˆ.–",ï)嫇p×§£;Î.Þ¼¼¼v8ÝÂ|†Wþ.]ÂáòèïÚÁAº:S: )ÕkÆI‰ 2>^\TJ_ôJ†=ä{Ó`/ ìîºb} IDATª“ÿÕæeŠ`à‰Ê(ÊwÛ¶¹ãI+¡”À+ÜFÝ8ÝŠaƒùìäV<[Ô>”k- b6JǪ ¦=Þ1.Q‹H~õåuý™ï±Ò¯¨:MOiO5é¶D"÷³t§€ààÛ;ƒS0{0 >çÆ ¶ëÍÄ´eö1!ÈÅd*“dö;Œ »X£ãh ·C'_•¿Šs¸ù$²}¹-u¾˜£µ°êÐnÞ‹Ú]IW2°øPöEBJTLrT—Ym‰V‡V¹âè°œ*I:ÀÖÖÑ* “-œ60( ŒøA_c - »xUVeA&_eÕZ¸Ö ”6"1šÇ-i”®JÀšÚeEïž|wøîñCÀ[ß37oä9®\‹?À;W03Xûö˃ô› Tom)n¹ÁA XjÀêäk‰šýÕ6ïcX8 'G7á²Ü„bì¸Äy ØX^ë[:j.í¹-&{-µôZ:<ýGBYñžºÑ·@”ú ^’º¢çËõOK›Þ}—p¿Ä¬%¦{ØÞAžc<ÅxŠ|„l¦¨Ð•›Òî e+O²±…Iáé¨\œ¹%dTwk›T`¹uÎ÷OÜžÂÖÀá;¸úúx²|÷ ^úÞz K,€ƒêÜv*Ññ;ºä¿Ûã.?¹:ƒm&²ÀH*gT']½Ô©÷i:VØa£'ƆX»FØ(;¹€Õ7?1ëJÄòYû‡ZSÀ+>Yí{-óÉD,µ\ª¯_©­‹¨rÒ»°×q–Æ ˆO¹DûØvÆåÏ<1ck£1œ:c°ØÃÒTf—hµ$"–›ßCgù”YèT­ÒØp!m+—eb×D]ÏŽ§Ö¤VÄø&³ Šºuî>pžüqÜö“Oç[S¼ü=\¿¾{/¯¿½ÅÑWÊÙu‡D»¢±² ¸<'gpIä+jÒ'±èÃt/v%KíŠ2VÂÙOx• •ïõ M)ÇÝ"ëÒ¨Ê'S±îÐN(`E*7µÉÚ`SdÞÕ“Sš6¨‘ÜzñѺìôÑO³×U£‚(É©š*УÒmQ¥Ãr™ï©ýîÞ–Ád£1&[È2ŒFØÞÆ™9æ³#!„:YúYÚP•Óè¤ø‘ˆ‡Î|‡õ³Ä{?׳ z[Ó6<¦bý=œ °œnŸâ©'p÷O?:~ìÃxó?qõÒî¥âGÿ‰W^Åîâ¨õÜààŒH€™3§À¾??]1ÝHrUiîbh:½¡•Oƒ(‘•¾¯}À$ah•xÔô]¢Qú¦ NìÖ»g7ÜN(`Eª/‘”ãª+ë© FXHïk±xÎóù¯íd§âÉìêNÚWQz“ìh´ý• B!GYé4†°Üê-`²Ää“)ÆSM0âÔ S™ê>²ßM+%-c{w:'ÌU“ö®.°+5¸y?môƒ 4ŸdÛV”®N·w—òÕCxßOݶõÌÿ,på­Åîâõçðò‹¸qpÄ@åÊ¢7qô{G°FÖ9GƒqEÓÕ7äÒ ,~YyÑÆp’ï‚o¤gøîw…l °Ô2Œ ¬³˜¨63òãb'°Ž‘©hž­ $³nŒö¬zfZT¤Å¼1»6ñ5ޝDÙá9Ï…@(5M^íð$ÌÑØ` ¦d¬R4—³Ë1ÞÇ©YŽ|„ÑÓ¶G"VÙç•sƒæöùyf·H’K¼¬ŠUT#¡X\#`Û®ÑUz^ú/¹cm™ø+ÛÖ}m°\õêQàÉ{ñøÿ5=óÓÿwvö.üðë¸zùí—ðÒpm÷€í7÷«ß¤ÚUNÚÜTcÈÉMá†}åÊ¢Yõ:Ì´ŠÀú1qò5Ü*f5zÉ”E7½„Ø‹PSËZ{ˆ±0]—»¦Ñ¥2˜´°BÖ9´wØær—ÏÁ¦ÂR8Aä(€‹Á‰Oˆò1J&žû™'Køy>êt Üó]B×MÒ”™èöŒ8® åÏæÐN}Œ &{å˜l!ÏçØÚÆbËâ=Ÿûk†ã*ªfvVõ’„YHbæd­Òèڶ9°Ed¦Š# ÈœŒNä–_|xòv<ýÜù±Ýó8^ù^ýÁÍ7/}ï\ÆaqôÐ=àùUT±)«Šˆ)—þIºR¿9(3Êšº{„‰—>?,¢ú‘^ÕÔ³Z Ë¥šZ\{[û庖j U¯™˜Œƒì$V·Ø´.‹¤im8O>Û4fL$ñ"¶Õ÷Ô°”Eûz”¬Î¦2•S°äQö^Ëöv˜oìZÀÊ|‰Ñ.ÎfÈGÈ2Œ'˜Ž±œõ”åÔø±ýq X%Ð/d~ F…QG~c;F¶¨òå1Ò±hE?:ºÙ þ[À)ª]ÂO<{>zq|ÏøÑÿk^üîÁÛû/ý^{» ÌíÒü{ö›ƒ r:PÅ))©ò[—Á·VH^ÊIFÌm—úJàN¤vr¢¥·˜§´°“‹î0emúÚD¢pSi­qkt…›l'°Ú“µ ¿FU•¥µw#!$MûªÀ ´!½ªÛ£¹œ PáFfƪ;L²¢= ý_§-evM¬‘±Ž:ûò]œ:…ÑyŽÉË%Š%r;)~Ú,ô÷òÊ¥æU D]cB®UXºÊl<Û¶ân‹|ëö>¥Œ’Uµ«SvVû£ÀS§ðá§ñÀÇÎM.>€7~0á…ŵƒ7^À‹/àêþÑL¸™]nÃÑUF¾[Z–RjZ­P½–¤|EG† j§·ûÔ CþØ¡NŒaVüÿ‹îÖjq*!A WB-| 7ü¾Þp;‰€UZ·˜UkmD£H Ü~>ÈHˆDÞ1Üø¬ö¤H,W­V»òyöùd}ÍËúżúxbi˜C·§¤œphwŽ,3es`ÛÛ0ck Ù ã%戫ö `ì® ýéj\ˆ2Ë…ì— +bm†üì4ÈÿHT]‹ù®(4L¾íêþR»ÚÂÿüØÎöcfWßœ¿òúìÊá;¯âG?À¥k80G$Tþì`¹h;V3Î.!Ÿò +TÓ« ×­ÛjJÙPFû«md¹‘fýqUL¹fo/†É7´–ÝþÚs´™wôq±“ Xµ¶áÒT#óÝHêX{—6º]i–Z…<æ‹qÏ£äns–‘ž ¨öv,6#2‚ôaî‡ÿö,'•¤5šÓ &[1FK,—˜,11d^<Ù(—ŸÛ…L,f-l‰™­…›'”UÕµÌêX ` Ø&Óäg$cË>`½ÆÐ„.×~;ð>àQàñ |ÿ$N=vo¶uùú¥bwöîxî¿ñÚÛ¸¹<šî6³KÅ–tEC0«ÊHô«99I°°çnQ2¶¯ ÌñÈW†$fš”¯T©)`i/r1ž;±5–’&G©‡z­Å `µ´XsàªÝ.hñhjmž5D¨úiÄFÝ“|C€H¨7ˆº„+åS\Â*í´ »DK™*~èJJY…í‰Ý„wªm˜Ι£oæ9F#äKŒ–Èg™#ÉêÀ.+0¦vþ»@Ü·n—šˆe,¸—$lL« 3aܨ‡rX¾rÛL»šZíª¤«Œñ¡ÇðøGqæÁ­üÆ»æú^¶˜ß¸‚ç€W.awùXº*¬7X!Jžk©<rý¨S¯XðªjåŒz«• X›ÐôF»tèm~°Hà£u!uk]=ÕÛ[\ëÔá`ÎN`edqEömòZïƒ6Œx¦¯Øú¦¨,øQšëŒk»À0]Q‡´ƒgÏz™1Lj.CzÁBÄRÒyZÒm âÙÎì— ßó³Dq€­1F#d#L&Àã &sŒ˜,ÖÐÚ²+ÂïÛYðc{ O®‡vÈEç -l•—vÒ÷YÒ¶ŽÉhŸºáOj (ô;ƒKW弫ná'žÀ£ÿcëìƒ[æÚáìÆõqfönâGßÅËo`wy$/ÍíààœhWYUC¢C®´tzñ¸” mô‡q ®·ÌïGêOìî`àöÓ…<|§RºÊ´£êGé6Àp]ÁV×dOž;që“Ш¹ž±à ke'°Æ¶WØ@S%€%s’5Ð~%;Tqb§O“!:ÙÇÔÒžŒÁh PFº 7$ÐLµo£Î—vhïFÕÏh‰Ü Ï‘å0ž`º…ñÆ Lç˜G"–[‡ý•1Ä»ú%íJeUù-'Ë_Ímà´¨K!t,évõ¦žMŸü“ÛyWg€;û÷Oîà™à‘ÿ±sæ‘óÅ»»oϳÂܸ‰ç¾‹¾ˆkó£UæöçºKÝÑ=X Á#ŠJ '”½ï©tÅ )ðÒøîBbߤϕÌdJTʶ­}MÍ"|Æ\0i•ñlwâüX[œ³Ûs;îïì6H‡v‚Ëg«W’J‹ìË›ÊBÝ–c?áRTävÆ[€XϿĮ H´÷ʪ‡èQYJ <—ÑÉr`ì9äÈglŽ|ŒéY†| ŒÆ˜.1;ÀøÛKlGP5µÓ¹Ævõ÷Ãé¿$·¤–›öî~ßp ì·Ù4™ ×PLkY×3:ÜÔ \5"_“< Ü ¼x?ðÌíøè3¸ï§ïÛ~à6¼óöÁë{³ÝâÆ¼øž×çGhå¾C°$ 2Ì'¡™éO¨J8K2õJ~mVG2¢3v2¬wiX4c¡]ÉNR#d‡b@§ó &ÒáÚaB¾ç´dÁøù^e×Þ&ÇÚÀÒÍT7¥µ!5¯*|äÑ7 vB]̃ԊbÂû g4þB3q6c^Ð}r—Ólèê‘̱hìÌR.¡––]Xÿ [`4Ãh„| ÅY†|„|„Ñ£sŒçÈçï {T«d¯YŒT6íîèjfÑn·ÐvîW¾°‹š2ܰ j–ŠVåŸkŸà,pxð8ðÌøÈÇð¾Ÿydrñ\~yÿ«×—o¿Š^Â+ïâæâhäÔ N…õ–‘.ÚT*rUA¼ÑôòÂ)j‡ ’wgÑ›H½&k-ðiÄa!ms¬+=¬¿Äƒ­ËÀòZ‡OÀ›©v`«·Ï5õÐVc,’€…_ ©7àºî‡ †tx.S5¨ú¥ÆLK‘ÂáMP™ò<ƒ1GÚrƒ¬\íý&¦sŒöbdÞ“¯èÿrPÌéX¥•0"_m3"Ë¢p ¸ÃÎôºJºü‚`­Vu‘KáÄm0½''?ƒs¸ xxxæ|ðøðá‡&÷\ÀµWŠ7ߨ}{ñò÷ñ«xc»P¥CÚÊ Ws²›DEÁˆFË´+FW¹V æ B|bヲ­ä‹ûsû™“Ú;=þi _-|só¶·Õ”Rkj+ lP°ZÚX!ëV=Š|±[„‹hOHÌC ÖòáÎL>_Tuн¸«>³j2›ïA¦Êݘìê(„Q‹F¢aFŠp¼Â¢:*Ý`9CQ`kŠñf£1² Y†ÑÛÛ0òùc¹õK§DÖšÚ¯–VX¢ÊÉÓÈ"—›Ð½dÀàºBÕ‰é埯Ñhã zÅR¸a” ò±öIšÄ¦H®êÛØ‹MŒuäz9ÆWz{°>á6V”5ŸÅxhÃ"iÖÞgWQùütx‡3x’jVÓ² 0ÜïÏdVvé± ­+2"vÔõÜ®{pHÀna›åŽg l˜Î0ÍÇ* ÌY†±ýµgºÁØ~ÁpL-Qí[–¢Óê3ûÈ™å€Â2€ÓÀ)`l[Àu»Ô\ÓQÔ³ VŸY¦ ´Ô®r—;Ààà~àqàÇïÄ3Oà}?qæìŒNmáà2®\;xcïµÿZþŸàÅ·qmq„¹#Ò29ÝtúÛN9‰]än ÒÂN“_Ø,…qWÕÈm|©ùòª§ƒærM>5¾7%u×%Æ’YD}#K õixM‹lÃm¬XënÖXZJOå¦I\joêóÆÓ¾Üç?PP Ëg‰3R–ÛãþœC:>³"–|WfZïÂ~¡Ìñ ]`¸8_`Z-…5@±€10€1G?\èÈÉ­Jºeç­»aÁA‡Ùï†Õròû†{@akjÿn7m²6c¬€¾R{ʇW¹øÝ7ßnÇŸ˜âCâýOâÎÞ5¹ç|6šãê;æÝk—ž›ÿè»xñu¼µ‹}s¤]å–5G¶`OÊžªE±qRwÆ™v5³ëÁ6”„cQhÜ rÔ—7ò,$¼#±ðn ;Fu ÈW£]•rkÛX ¬ útË.µ(éÄ'¨´·ö®/»¾7cÚU0è¡/ÙáRñH\3DLÊÈz} ŒÅÒdÕ4tÃéj5é@äÒä9Æ*—¸ÜnvÊE°fGÌÀX§ÆN놥 §f¹…IGÀnUz1–Nr²ÖÃŒðĸض°uÓrü:e; ¤ ™ö?#\5&Ó­Î÷Ç€'/âOâ®§nß¹ï¶Ñt‰Ýw͵ýË/¾ü]óÂxãn,*c¦ÛJ…=­n@ðPã+´ s«w‚œAº(,V#·Á0½*€GË@®R™Q:Q/ã¦(¢ö¼gqׯ*ûõF“„\«·^c`­Èºb—>.wF MãŒLÏ(ÁC#c•MÀ,—«äž¢Úù1ËTE,xÊ•¢“yŠjb:DXþBË.p¸8 l™÷4º@i%s,íFéljXS2Ê-tY[Ü·ÓÞ,€À8S–lYk×.”E婬@;#á~TŠU]MìWî{‚÷?vx ÷ýäù³O\ŸáÆ[æ­«—tøâ™—ßÂëWqm~4Ä™ÛZ— cÀØ1PúwX]”Õ.¯IéŠiWñ#ƒÔ•‹!#R¾R¯pãמIÐÀjI.,¡bdL®WÓ²œÏøÄM“µÉ[›l¬66VÇVYH¢CUi]Æ ]µLmqFx6Õ§§T¤XvšÌWVfYÇÑë½\‹:‘ee¢Ý ÍŽ/÷/¬(²Ün·•R–-nl§X9åƒ"¬quñ÷C"®¸JåVÅ)=Ï ê™‘ ÀYàš’µo1kéÁ,ÖÆ¡Fe!¡û¡ër@°œÉ~/pxô{=Ûž~ÿôÞ{³ÅÕåk¯_þþ•—ÿkñ›xã*n,pH¾8v€à”œY0:¨ Wóê´3žk|c¿ 0#-Ì>VÍ`16R¿?¨úQ³3ê XÚJw6êË{%ƒ4Æ x£ÊZë0°žú¶“XMj‡“²'뤔NÔþ4?µñÓ—ÔøØÔ÷oCz;š ÕО;áMg:³ÞKŠXŒ±“ù‚Aµû‘Ë:%•c…7€kÀyà¬E«™Å¬œVnºê:$cj[À¾eˆòÏTA¡œ²lO[võÎRZÛµÄ6#˜ÅP€õµFœ}ºA%+ØÈVª©,÷æààá³xô<ôÜöÁû·¸;-‹×^|ó¿Þ}éï½pɼyט‘š–ò^9½lÇj~K;éiWKAW9 5¯ž÷Û Ð»–è¶ûO¯võÂ!Ýð‘D^õ »Õ;+°§ˆñÙU¹m§j +F"•õ‹·“X}@©>DN ùD)hû›ò¨Ô“Â~â=ƒhNÔ¿*k1Wò¨ëŸØÌO°¤! ¢¢¤ûFaA芮êyh¥¬ëÀyà²jqYu§Ô®àyú­Ñ\Ê®¿@劌A!Œ"ël|U¦9ÔpY{Òo·í[Aë,p ØæV š,˜˜÷P`l¥©R šZ~: ‹<Í­”•[U¬,ñÌמÛZo[ì!-:iFÜ2Œ3UÕÊ-1!z•ûäi»ºÕ…1î¾ ÷݇{߇s÷cçŒG¸úü—¿ã¥×_~»¸¼=sô{‚™­øÄ:Üvt5Â8,°oÞ¬½êÔ«‚!]¹Ó½“®–~Á ÄIV½`|äí£%T¯F•®Øà |ÁhùâפÚ÷ý™¿Ž+°Ú›}£L½,‹·“X뵘GRv„5¡[Zü™ÿ£šu˜%‹í÷1V£˜ce¶£ÍÔ2ªNPÝÉö0‚,U+ù A—ØÉ×ûÀp8ìXµiË–‰GÖ¡óæ&iMlJ7s(#ƒ•eú±•Ç蔬rjWae¡‰ýYå²Êù¼ú'—2w@9"‚ÙùÛ¶‚ÓYàüîÀ=wãÞ‡pî"¶Î`÷¼øÿáõ7ðæ•ý7ßÅå9öì—sVå°æ6°=Ât 8\â¦ÁUລÕ-Nw=d„ØÜŰÐèJ塬ê'’§³‚\9º¢nÃòUÓUÊiµï?›@êׯ:qvÒmsÅ“îXml¬¾L>kÖ"¬§xT™GZmÑ>' 0Ä‹•"µ(Á¾J+bɾ6#8RC\;ÐnÊŽnÂ;[@‹f,ÿè·Þö-f•]~IeÞQµvc…c»±mg¾—)KÉÊØ2 d¥´ ‹¹;™VËÈltê‚ ºÑº*s²ÚÕÔ:9=™S8îºwݳ¸ö:^y/¿·®áê>ö‹#6r§fl—þ*Õ¯òïÔ¦cdÀr޽%®¸ \³ÂÕŒ¹¨RŽs›“ÿ®R‡‚®|_”c#T/lù.ᓯhvTcY<¨zˆzøîÙ¦ÈÕ7¥ùÏÕ-¬lTo2˜j' °ú@ŠÎ_†’mÓ®©E‚T<™<ÁeÇÀÔ,5c¼¹ôŽŸØ/çPkID9ël²ê¡œtÆçø&salaç­§`˒Ж%•QU}Éìù±£} :‡vÆí¤GvÐÐXEÊ­çN—t_Ú”ŽEÊYê[¶¾9iŸ1!!÷[ŠÛV0g0ck ;§1™àæ5¼{ ï.ðö.]ÇÕÅ{ða›Ë}Yr‹|ßðܶíï9îïáúW ÞnÿqÈXÆe'ÚÕ«° µ»õ®h# Ci€åsè>º,êÄö„G™z©ÆˆªÖáÊ,ù~_—Õ*…[{ð'ÇN`ubR—Ú‹|Ì©cd§kš·?(¤°âþXq+,_™j^º§ ¸â‡Û IDATäe,ŸFƒñÙ’ÈW ‰ *´>$ “–HqÚ N‡doL#÷»:yõ‡¢ÝD('ÉPrͬ·¥e87hh„†Wn¸‰ó#Ò8#28!×™•Ðö€ÌŠ9L̰È0/p0Ãâ½åR)/:en ì8áj„-lo!c1ÃÞ®ÎpÅà*pCW‘î ‰ÇqanÏw5«¶€¼À$NÑ…ÔËÃ'b©QMX.‹E°Ì“ƈ´¹¤jÅÒ«7 »°ÕRl£žá>“uW­sº:³±6Ö`Š5µ&sEij]ü[rÀ!íAFêgá8]B ¢íÞh*QOÝÃú$7”F'c©S¹a5•û5ÃSv%‚IuÆÕ„LxšÌr ͸º9Ut`Ó—xTX)knÑ„ž7”fˆÀãæ³;mlëKµŸ£ æ–€Y1«)%F'È;´:œáô6vvËöoâú ï.q¸j¿í8ò[Aª)…+c!l.¦´«ßòs'ˆycÌŠj^ Fµt%Ë5`‚p¾ g›¶Zr¢o+¶píbr5=Zš¯Íûk„ c0j`õhjïÞŸ`Ó¹5Å,Ÿ“öŠyE‹D1ÖdÕ4ð‹XñÑ2?…ÖAšêFaS.‰ˆ%cȪÎÕ4®ŽQ³¨9'®k_’Õ˜ÊÉï{v=‚-ÂU[vý§)=ÌìD+Ø%à§Õts·—„ɶ-ÆÚåŠj­ `Týíä’FV¥+ñÈh¿ÖGA4•â&vT±üåœócœÞ©S˜LQ,±7qu+×ì·ÕJ9Br§›ñPfƒ\Vס`r‘<Ñ?Õœ“‚Ħ‚5½Š ‘KG^<¾»U¾tÛ[§ŽL¼J ób›ÒÛT¼§,ƒ9k°Ž-+}ƒ >K~Ñ—°rU‹f÷¹•Ù ¬¢ OŒíœÞ£¢‹ b'ë]܈[îIIõ3—Å `íÛ•ŸvìÌq·Öè”üMˆÿÜR‹[ŒjNV3§³¿ÚîØáÈr)…®îù&£!_ X’æeç1¯VÖqDvß²áË:žáÔNŸÂdŠ<Çì×wqõW \±håfèS¡_ldç΋EU»š RO±5Tÿ3^Qÿ¨O†V¨†QhÌ糦·^V–mŒ¶-sp²JH¦º–¹Ú{Piõ6Öª-ð™ l])d+SÚd}cŠŽÏñí饟¦t(ΉXrM,ÎŒò™û“Œì8i´Ì[AÒH?¨Êl }­[úrÏêX[Vš¢¤åKcSàÝ7gVyr…–k"Œˆ€ä–ÙtæšË±Ô¢ZGF'®ròç,·"ÜØþáp*Ãζ§G3Ù³‹nìâÊ!./8Z¹ïHúèœò©6æ¼*éÉõ˜IºbŒÅÎ#-Α¨ôÆ0‹A‹„]f1 Ÿ`xëÖ°öL¶.«%ïÁÂ6V¶2F¡Ö’ÏÖbF c UvŠq Ò «où¬Dõi¢’$$ª¢Ú½Q~rÝdARª~ õv,<Úéºéóy0=õébXXÌ¢KLÑ•¦d²9ížYê¢jÖÜ.ˆàdÀ®ƒåhŒŽ¾±öY’á¹¢Š)”Eh09ù! ·év†S[GsØÇŒF(–˜Ï±¿‡k3\žã]sô‹Ô³ê÷"Ù€ª§‰ž)71kAêžtEý¨ÒäÛÍ9ôtz®éí  Á6ÚnÉ¥ll» ;逕€#í ¦‘‡u“ˆ^óRÄɪµVÉMŠ0äÁm´&•²ÛßÈ\qêd,)'¸Ñ=÷í9Uáp¹èG–Ø)X¹h(Z뜔î|:pSà§dˆpB0Ëý¹éM#û1'åþ‚x^€§V*“¿ŠCU–ÂêXËê­#;%ËꖛߦLƘN0Ê0Ê1Ê0ÝÂhŒ|„Å{¸±‡s\Y¡Õ®€OÛÄ ; L^*¸EGÙòî”~$ß³?)_AËÎ Â'„#þÔ [ª©oê§rA”«†á‹MÞ@ÏmyôŒ¼Àkd'°dçÚ†Ö!­‹±ú¶´–gã ZGN{ ¶ÁŠS‡úa}]iNúlÆXùC€ìJåNYe)ŒI' íãkA0kR†5&€åV“¢{èô¬¥%¶F⺠„[ÝÀ!f‰§NÁš‘–Ì-N•ϯ1°5Åd„É[LÆ‘e0Œ€b cp°‡Ù!v¸¶À» \nØuSgÕ¼L\ZL¸¢A:–rk»³UÚQýOý za´+wš(!IH’è22áʈ¨²ê6<- ‹«5Z©{bü$ä­µZÆ ÜŒ‘¹šmãy°M°X>S»Õ6Xîû7„™X­kŸ§>Sœ§9T­Ö3{,ªŒåJ4â9)b1oNüpDå& uŒ%—>R9OnÓd¥7-IÍ¥ö¬åÆ’`ÐÜÕ´úCºVÖ¡M0"‡Üšîûw…•‹Js_pÙ¾6˜#Ë`2fEåÄM€éÓ1ò1Æ#L·1ž`< ` 3ÌgX.p°ÄÌàfëKÜ0¸a%«Yu’žJhwD&Îï‚à#ýåœÚ1¸íŠuÅh‰YU£¹|¢ZV½â…+'ÄåѲYbn±6ÖˆŸº-ºoë5¼ ¯û†Û ¬pÍnOS"AçWR2Em~uN™LPa&eÅFŒðÌR²×w–K¾¸×VÁøÓƒ(1ÉÎ8Œª5L ‘±AÛ) ‰yV-«. ÏŒvÉK[n|.+5ÖÆé ­Qµ¬’fÜw)©L,ƒN€Ü`LÇÈÆ09ŒÁr S̹Y9ÛÇüY†¢Àbe¥Áaƒû®›£Ÿ»ÞË©/m<´˜Ê3Î`…þ"!e5 C*HºòÍ™c0Ä.`ç¹uû mÀsåûØ Rk¶Zøk2Kî):ìb¹ '.€ëž”¾‹d°H;A€²ð£ïYo}3ÐZK-Ôþ;ð`M‹6À.¾ž)ò†g)©*„°0d¹µo½Yõ¿L@§ºKÊl0ôûtl 0‰ªr9·TÇb’FVMæB’¥$BÇXT¦rKº4Æbƒ‰Ì§û2ýË%L ¦sŒ3Œ3ä€10°0XnV¹°0˜›£ÁÍ=«T/-Ò¢%sdäŒÈsJ㤪UQõlªÉH( ]I£®(ÛÉÓÄܺìðËø¨Zà6©…ª¦| ÞY¬öFîÃV@'ÉEЧ½1™ó°ÚØ ¬1pvÝ1$[#‚éÎèËhSÆòqL —Û)Æßí¾wbÙ¡2ÚÌÇ(JVí]/®J ¨:t ³¬êRÍòmS8 ]»Ã,ZSf'¤«E8Àr`A§·—ÿçÕ¢iM«£Št=ÊX%,Hõ0«xom7É}I€iY¼7 jfÓú€ˆUnÄ“J[^6©º§  ÉÃc‚ô¼K®b+i±–§§@Ž ª/!îAÂ6"¯ê¤öÑácÙªm».KŽAÍùš×_ÅÛ@ûh€œôŒ ;Ùq°NìÖê-ü¨2iXú>4-É=)g nf¾ÇJdÀ´›DU¨p}=®â‹vCuîG Ý•±@f&ùd*žïÃ#×»à]F‡_>)˱š!«ÏÄd,7ÃÝíŸ 5Ëa–«]FŠ.ÃpóÍ˰gö§ ©à7'º”[zjf%­¥¦*©­¶-=êœ8±ŠÎd— 1øze´bÌ~+ÌjGÕ[F2UdEØàxóQ)Ó·½É¦^HzBvXå„– <7XSkÍîåS¬'ú‰´Zd $¨ ^&ˆÇ—Fœ ‚2¦ÚEIŸñÏš…¹rH§–˜“Ž“.Îé:cµO5bH^›ŒS¦Ì=oºAk᭜ֈŽñ‘ÑC XTÊrK·Ó0dÊk7[Ëý"ӍР¤$Û'üžãÅ­qEË2µ¨úú—“£4êAýc&9Õå•#ƒ,0·'þÖ“H r£¥Œ4Ú,mºù˜¼‘¢T¼Ã˜ô •ê ÔiÀjc`…¬ 1¬‘„š(mª“ÜŒ¬ókJ<>‡ ÝO&JqeI…£VIrÉdgI Ù7û$-«¥K̲¨½£ [´s5ç¾êøö¸ÖsC£*6åÕ㪲5&ɤ®“‹Ös“ÊÝëô;€.ÄsÙ¼²Ñ\;È+¤¨BUä˜ õ™“ *2±³Fc¦1PŒSé*u¡Á«Œå µöPísÀwÁ¨°v¾Ë"­C>èÂÖås°^m¬[Ðb€i½>cž­>þ¨M“’IN’‘¤bÄ6êµj0†0ˆH#¹ÍX±¤ŒmT2‰}Ô -7'”‰%cÑ$lZ.iR6áŒ"¶•Wÿ«Ã… ‘»¡I¦T±VehÅjMO™z²â¨p¥´ù âD«’ €]N´‘]ÉÓí1®*âZ€ ßPêõïc©°Éº‹wÛSÊö–VVàU'Í"yq º66Ö:m*WÀ|ÏÖÚŸ¤Ï’ Âa´7Úãú Mu|Wá« ,"¸jÅ)eDÊBõ?Gm¥@ÇÉþû"q{F$$õ)/iLÒ’c,ú»ÂJó ‰úh‰¶ƒ*¦ê‡Ñ­ 4L²biX“B8— jW¬1YÌL'£má–æò •vb„Jc¬ÏiÚI²F)×åp°ÕØXÝ[<ôÄ >;‰D¾‰ú|úÞàcX!òÅ+`†ôÇ®³¤*Q€9h¨µa-™C9Óˆõ¯lá©ëø Dîâ)D2 pl•,µiIŸNëVœj<9Ù–ñÈÓ‘UO¢lBÀ± ¦ô(ªZQ`|MeMÙø™ç¢ed èŠ6õ Q÷§š¼­Âiϵ)ÔJÕæíÐÚ?%6Ù: ¯öí±[.?6VÈzRPâM2JOLÖ“ÑN. +Òh·SåF-Cõʆt¦ƒU€uÔŠ».PíiÑ ŒåÒ°/BD({ÍLûÖ$­¾Ëˆð™ÔŠPݖߎdú(${TáG%z!£i(W¹ÓAg¬Ujs©-#ã‡ç—(åYùhÛÉ}Ä&+2æZ ܼt;À 2õ" ÜSª“öÖ9ö…kº:v+ÙX›n D¥¾ï¶/´°S=×r˜Œ$ðX¬}Õf}c,ZŠ Oz A{Swˆ~£ÕÞWú1U ÕA´Ìs®™C*DѺ³J±uäU“”ÆŽBø—õ2ÚQ Xyõ£ŒŠn0Àb (íѹb¤$NáPƒÚø²Ð~­ZëAÖ’® ­ ò —°Î,¹ñl¨øåóc $2q¯tÕ‰ua' i`…,nŽ© ‡îQS†M“úœoêäžv¬OA"#ú-Ù¯×ÆÀ\±ÎÆËý†Nv(;ÏèÓCéGFåÂ`“‘†BuIRIZ Öt®•–$JŒAe»´•Šž´‚igÚ൥OhY<òd#Ð.ÉFÎt%GU¨FB÷Èz¡.l·Ÿµ•ІÇ×äE¥¾`¨¹Ú—Û«…‹ð]BƒEÚXÝ[#,K`¸>°¯߬:èÒÐiÑ2XÏ Òå°7~I™M@®ç.DOÉ~Úm”;vãj€-çAvŠ:Q Ì\¨uÆúTÙ€Fk=ˆ£°Zšó“‹Œn#ž £mÓf×´Q9S­³0T©Ú•j¦»¢+™½vÛˆ<€P¾CµP8Úè.‹LÞg«yôÕZ Þue`µ±°Öo^§Ã,Mmõ™>Þ¤zÄÊ¥/¦Tža˜%C5Ĺú°óeéG©ù Ah v¸pü1MÖõª>!jiý¢$-ç–þÖ Í>›òháÉBÃXVý3äe&xÞéþÅEMŒjƒdÚǬªD^ÖÎò™< ˆc„+9«]&þÓ¾f¡/'Ì¡Lì|& R£÷Õ6¶˜hÃ/kÿ«Ç·²­ò}¥§Û)Ùmàz“uiìáÎzÚCÒW¡Êj÷I‹«m)#±~шYAe·rúRÌå’gÇwê©ó\+ËewáÑ¥ X^ê3ð»Å²v¾&bÆ$%É4È¥&äÄÿÂ`­ÇêÂÚÄ÷ýPYŠñ¬V¥^º™qµ5$÷Äc8hNØ]òQ¦¢zô¸˜¬fdƒ/ºjtûÔÞ\a»råÊoÿöoßyç?üð_ÿõ_÷^·•ØX^Ûp’ˆ·®îÕFwK­©¤‚ªµ§I°@ä>Ì‚§‡SéÇW"ªu¡3Q.<žÝc1ba—¾dYªIÈÅÇ¡½E¶Œ¯¹TÒ2Ú!ɲ*.<Уò“g_…ˆš²f”ŒâóƸ*0´§Þ,>ºRO}Ì£6¸j¾;TnÈŒòfìð©i²¸p‘¯.Ìáæ[m«¬OúÓ>úè¾ð…§žzêþè¾øÅ/vPÃuÛ0Dè5“Ú7Í¥ÞºµN:ç¿Fõ5jƒ1¤Kð¥4¢|½c|„ñV&¦èþr´hÕÔí—~3•Gä×¥÷Yu8"Éh¿[keb7ë« &÷ç56挤—õ¢µ“ñ+4O7h4{VM ý³s¤ž/ß¡¬ú_’–vÀ(]1áJ–å›ËU;ïJV¡vø¾ó5š©^¥¾ÄMM}“Ö² „gEÓ=l5pYJWÁ„ý|ë[ßúìg?û©O} À'?ùɧžzêþá>ûÙÏvTøÚlP°:¶4º’˜ßásªs+--ªÚ'µ/W<4Äï—¯Y>@ö©Ò¿O¤¡Å©¥³5!k!c¿WH¥¬øŠ«Xà4¶Ìº,ÚˆACÆ72{V-š…!csÛò,¨õ’5b1³ ¶“"B %]+Éæ ”ÎL=ér=FWòbpÜÀ¨¯­ÂÆšTbk "r[¶ª/KŒ©Hû§™¼ O mZ­‹ÅoüÆo”Û“Éäç~îç®^½ºÞ:±“¥`Þ¹;,¢‘ÿ\è}×:^¢¨MÙ´õÒJ ä…x¦g~µÆ;$5±O\¡ß(tCN¦*ªÑðX‡:"%Ê|­ ýIÐa5‚hy |2‰ê9« çe‰ÕÒeYŒfbÐJ"©lðÂfOçü©å¢Ú°Œq%‚Dš ›>!É;EM¬æ ï‰<ê» ›&^=dtXb£FH¶„ë*Í~ög¶R®1O?ýôJJî×N`•ÖáËÏüC¿})=¥_Bj‰YÞ÷þêèÇT•¤@<4 eY#c9£kTÕ””@¶éoBÓ‡¯zµ»yõ#«]¡=Ǧ´Äwz§„Ï‘šžÓm´\L51Ä—PŶY.æUulXš+Býehš ŸÒbNŠz…«íÏÚŠF®’k ¿«Rª 2íÔ··¦Ü¶zž“–Ã0Ô˜o|ã_ùÊWV^r÷vËY˜9ºÅ‘>ø¦)ÀÕÆÖY6ÍÓ2MOtȺmÚy”ý–ï—õ õI‘¯•*c1ªS‹i-ì+c#2%K$|ÁÈŽ<¯"ÄGæÜG¨¶3DšÈ«WÝ|¤* Ð=RÅQ%+š,þ¦vW,f²ˆLsâ²S?MuȰ醤+ºã§6e£¨zJßÆÕ pd•Ä£Þé}Û?þã?þüÏÿüG>ò‘•—ܽhÀêÛZª¸ôñÝŸÅ”»F3¢wiÉpê¹0¢ï‡X´ÓAƒSJ²êÕdßé|ÖN´—³éBuâ3•ÃÊTÇr%JΦn{ 'Ã…¾Ò©&\¡ºSZ¦UVmY–¯ôgÕæ‚haN±”4vk þÿ2Y"ãª]É3Â…Eu¡¯uAbeøÞGµy!âoIxrk÷ûRúèD½l:Œgó­iÌË¢øwàßµCðûÚþoßòxË ßP6)q¹ü“?ù“¿û»¿›N§ñqn² €µf‹ï•}–€JOæS)Ô,Rop¬;T55o­) ÑË€.nN—V¢–‰~Îõ¸#û?×bfÚƒTbTâ ¼R3 4‚ŒX¡d¨žµwô£”®?…÷Ó •#Õ€)£;ÆBµÊ…ʨ“ºR/*™FÖEVÊx¢Á#AD|SN ç¢ÎÛ3ÐI¦+yž?<ªò'€»=Þ¾–×/Yðñø‡xáÂ…òãsÏ=÷þ÷¿?.Ø µ“X-Q×^|µ¢N{ÛÆŠwh‚øö±I}¨6–ØTGëärS,»O€Qý«ÅQÈ`…,±d #è„"šÌ’EÇ2½\‹ÅLË¥ÿiu@ä´@E¹¤ö¬ðBFkªõ‚_—’pL82““±xIçåöÒ†W—oðàŒÕB¾o2±ŠBµ†ÿó@wfZÕ•l|&ÿäÕdb\EëUÛ·òWT ÕÖÈ´â¡êJ:D]þñÏçó•µR«ÞØ+W¤ñYdYµoҒߥjÉÉ—«i£²t»²×WKwœSè€Eè·åÕhæ«,Ó«œŽe„¾Åt…òÿ’àN®}»Åæ8’iWávv`¬`Æ @²´^V%*V„#Î…/£tËèJu«â{ ¸Ó!éJæ…V `™æhåcèFhÅ J-Z$ÓÎ{mqÉÉ|¼Û“¥ñ\‡­ÞUš `!•™VSVËô »QeÔâ˜üÀ"¡qÀ?ëäÒ,™ƒiÏj,pÈIQ¬ÙwJtˆ,…¡¨í©>dªì{˜$Ï‹zuÑ4Z^•´|Ý6ªçEâKg,eÌ=BQÃÁ·©ýc…²r3O´ çË7Ôè3õ®©=ãªXnÿ&[›ðºöVëd“Am°4;A€µ®Ùí)°ãIV«@ø¨bCŒõÓn§/fš, J¤ç„> ¶tͦ1Ï»Œô4ªL•?d>9D’‡ŠÈê|,•û(‹vÃv…Õºòº®…—içÔ׋ûª,áÀw}úÎK&Gî§^È\¥î4Õÿôª0šÂ¤6—,0õ?±=`ñwZ„u_™µ§%ßÉmäy0¥× ຿ M¨þñµXˆ6 ˜¨u[ Q‹´"КJHÖÞLuéÖ¯Ki„>Ü™–Ñ>>´¢ @~¬ÕÁ¾\Œ$2W´tª¬dâû‰Tîò9ô©>j•!ª&ëOÅÕ«H¥ºÀ’{"/0ºaª…&\©æãªZáÊ·à;õ>ªnËBå6«T\kc`éÖèªê•œÒœÇÇ_ VMJáÚë^1¥42SEh+­£:5JµÈ²TR,Do‹®1¼$)HJ•!¤¨dçd,¨©‰%€RÞT_²jŸívªƒÊmµÆÐ5µ,—^–H?JE0µvn}K‰Â_…ÚÚ…›”VD¥+#’Õú ”Þo5uÕfIê IDAT¸ÄP»øÍØmí ?X­ €$aD2÷´ä•^a®ÉÀ"Gdbô*öp_Yãû¤&:VH¥5¯/™˜â„[zhIú¿é¹å$+‹u™î?.”ëfɼ,xi¬' ÕQϬô¦ „>ÿ²Õd-XÈÙëTUòhº¡†Íö;Ï˺µIe¡rgÚåçìð5cjÊMë­Õ‹'Æ:$ÅøkH)qÓNÙñ²°ŽÕRˆ³NØ«W†£ÌI`f‘}ž©–â3™@íÔeY¥IË;<Êa*“™jJšEF+7$ceâÚ²„ÛvßRTI+¬^PŸ4òLT*Ó"ïÃbä‰>º O°˜ˆÅ„+£Íg¯m–Ú«4|ˆùa×  «;ÆOL½šú çjsFæ?›í胮ki`›ª õa«'º'&"úÂ0–…^7Ã&áU2–+T2–Ï'e,5žHòÜÏ:Ž¡=–!¹Œ¾tÛ†81vÄÐHæ|PR"õ/kšÖ,}àô©í,ùIE+TÿËð²êU©biP-+òÛ‚ §†Y@¸’t®rÑ6 jÝS7,ëÕ_ßîôêjÅÎYA~µ±°º±HpéCajêsÅŒÅ, ‚Ä¿¹fžþÆ÷ì{Ûk4ª¢:d”S+ö¸\ª¾å+HÊ]î+ô}µÕ>R]ÙAÂVF”-ýè<Ó*ø˜‰µŒñÔÎhéeYô£Z G“¦zˆ<\¥ž•¨$`åžγôõdT§:a¥rU Ü@¾+W`µ±¥åí0ŒžJìÏŽEk`¥[¯¤.+žçÚßÉÕT{ÊdÏjH_bÓ&¢é¥ö ÎyWK§í>SìëêŠj•±¨fFÙBõψ„U¹MW:e8SÌ¡¬]Ft²L›¡Ïbóq§;šiËÔþ©~œeÁÿ•ä ×ò¾ùì> W×-‰¼1tå3Ú쨞ÙdKx?L0ÙÇÔV¼û‹´°€¢Ò*™¬Ã‚|a„–À礫Qµ“Nµ/”aµ€Ž€ªÚîŠ!&5I$ôÇ|T·î‹‡…H#ûZÊ@åßÒnÐ%æéª¨ž#5*4k¹“QÍB×S` Åö„ß2QR²¾*]©Ë\…Oºz¡úJ‰¼ªUºJèG}YÑLW÷#¬ŸFìµ þˆdõ%ÖÒÀºL}Hùg™D“xJ~bÆgìD…¢½T›×b©sR&så2ö…8§*SJ ¤K<ÄÿºŽ4ŸˆÅ–™¬¦JWj–˜brÅXLöÈ"ýX[ßU¸šh6Öª-žTÖÆC‡¯Œá׸ä×ë°F ¦¶.‘­Ý”±T ¡2R+d3ò_GÅ5‡åœ÷œD¢2D@ÃP„1¥ ª ±‡¦”ÐFO±KÏ(Õ°Õ=ê~é'pvÂPåvJùÊìÎ…:&è£+yIûÐ*@õ©žn7›ZB®þºíõâÔqÄ‘ä7ÌÁjm¬Î¬rJ³>Ê•ú•UPŠìhÖQ0M¡* ¾Ð>–iÔµ7U‡µŒ¥GÝRÆr]é¨úíBŸÛœd ++´'v®( 9ó!W<¨zžj7gM FU¤äN–‘ÆlTQËL¤Eâû(é* ªÔW‹øÄÉ–ìª%;Öº ì¹,ð(,ÆÀ:6fªï•±Ž±Œ?‚* K\—– >8½Ì©MQ»Î{ lÃ1”aûYFtóêÏàPîh V#™^E¹_5C²„ÁÈ×}†i˜šƒO¯òí¤å:ÔV§[1$eÛÒ¡ïcÌ•Ï4*¶ˆÆQÆ$èðéÔ­Và9ÍU£§/eäuÞa$ƒÅÛX·ˆ…UŸÕÛj0FÍêü¡/q‡=žä×úX2`×ËÒ uÔLf—½5´)Y3¢èÿ’FUØbï¯ Âæoç'ðd ¨J½>ÿ,{ }hÅpÖh•ª4êÒ5;»>%ÛÅ“vûtÕ['# î6n×ná׌,x³´,÷صÕFÙXG–«ÌÕ­ÅÇ »ó´ŒÎƒe>'ì)ßmªbŒ/˜˜£ò©$‹eaõŠ`ᱞžªS¹ýïq|““¼N†anŸÀVkÈ•¢rg|aÿt[ŽýÅÈW,TZœ‘H è|1ï åB„Îï<ÙVÜgwKW-A¹?kÃXµ·Õ`i6Öq²M 3Ø0’ïç¦ïĪB{Ü6mOWS»ùcÏ´{6䣊|éÓ|ŠjOŸW‡ 3 #÷ì7x'$u¶áãTŸùô3¶ØéûègIËTõ?|<-I“’5Vª £Ã´ö™Ð´¬˜‡Ìz  Mé‘yã‹èäiÆŠ« €u\ö4É Ó¹Õy‘Ùm«h’`f§Ò[ä-ڨʰÈü @É…”Û5ßåü°L¤g2 û/Ë ?âÓNq£†iE ‘‡ÂÔ¥¢•ñ«Vêr©´.`‘û²$7d–€CÜ„³(à-¦vñYÓ6ž[úÉnÆn[l°žìøÖóÏ?ÿðÃçy^Ÿt%f’ºÌ–ö± .üò/ÿòúbllµe{ÿ¨{Cmm¨WxWúˆ¡¶ËQ¥,Ú‹›ê6ª52Õ SÍâënÃ#5eÞÂrUN~RPˆG- •öÖª¾ÅÊ…?ÌbðF(õ¨óCk*W^ÿž`$,öÔR‹c´«n-¼bäÉär}÷…†{ÂÎ×kkQK³cXÿöoÿö3?ó3ŸùÌgèÎo~ó›_ÿú׿üå/Ȳì7ó7ÿüÏÿ¼WÀr7[‡×÷fÞÀ«´–Ħ‚H8W›BYéöì(“²òê¢ ÒCàÝÑDTY½\iO\T§±Úäw °”ÊÐj@"õcSº‚¨cYÙÈÈ¥dÅ *pšÔ6Œ©ˆÔ´¸@Ã\%•ª´gN¸ ñ4ÓÔs¼Õ†`—@½noáu›v¬Ö6e&SÀ>ÿùÏÿñÿñÓO?ý—ù—‡‡‡åÎþç¾xñâ]wÝU~|æ™g¾ýíoÿð‡?\_˜GÖær\½¾²v3Õ.*Ð]©‰ŠèÊâC¥½²û[Úï©üÁþØÎ\m6 i ,ìÿ¹Ý.ÿ(R¨E»ìû‰ê¶/M.ÜæUϲ\–K-ÂW¨6Ó´\­—Õ‘-“`êi lמDyS¤Ý)”¾›¨;+ÁÚÄ@9~âPL¨ ÕI81YÔ+-íïdÚ1¬Ÿú©ŸúÌg>óꫯ~îsŸûÄ'>qppàÛßþöÅ‹]šûï¿Àw¾ó6­ì]ª[‹”m:±F®º½¯Â4S›†¥ïõÉw_•® `|ÐöÀî£Òªñ,I,ü˜ÅÂx¦¨À~›è†šÅÇLlOOi{R^´¢gPí6¤òD·Ã'.”ÙÉé̺ºì©‡â{ÙF,ÀÁ°Õ²”¼…;±Íጦí<VšÀzöÙg¿øÅ/¾òÊ+¿÷{¿÷Ío~ó¯þê¯\ºtéôéÓ.Íöö6€7Þx£¿0ÒƒF–ö‚Øæ±•öªÔkúZ£§ Þyü‰kó8PK¡ügHM{nêAÅ)&±PV𕈄ÆC£r`Aÿ|ʪc…¡Ê‡A™Hé#­°pÕˆ´\#Höõ¡•Šªà)¬ZÕžAÊÊòÜÑñx À˜ ºÒÒà]}ÞuR««ÛbŽÂ¸hhùãá[ÔE °I…-¼ÕŽ…d,LHÈ– [ª¶Ä´(ŠIÒ § sž`ØY`uôy*æâ2;ä>ªû}gJ^çì?»øéuÕÈV#?Ô² /ž^c‹qÞí+÷u`‚—\Âß ´¬¯~õ«g¬ýÁü;ú[¿õ[¯½ö€»îºkooÏí/Ç ï¾ûîärÑ}rì®Ô¦'ܶIšNÙT-`’ÉRt᪎Ť ™ Íeì3BÎñ2‡Å¯JGÉB—ohO½ÔqU[ŠÚÉJѵ|ÕQ¬@Õ(HùÞÁX´>m,à!p¨ýÅ©ר:™Øèʺr¸ö®ZÚÆ}‹ðñ¿ýío—ÛçÏŸgGo¿ýörºÕ3Ï<óµ¯}Íí¿té€}ìcÏ àšçЙž"ùõїˤB@'ÞJ/³4ÊHÌÚS:÷UÓw(lýÁ·[ÁÁ=†"´95@ª±‘”㘎êr²‡¡´˜UµÆg™Æšt[žJ©ú±³\œÌ+™¿ÕZÈô1 â3«û€ªd“y×ÞM†¨ ¯¶Í“+¸NzµF…ÒKzXÄ9\ûI?Ö¶q€uæÌ™ÇÜwô;ßùίþê¯ø•_ù•¿ýÛ¿½~ýú¹sçü÷ÿ÷SO=õ裆ûôº–=hd/˜ÖÁ·³ëûIƦ¦0ÒãRQ;9–Ë×…3kÔF¶Kã~SÙ1›\eDÂQIm’ï!KùµD¥n£º_ú÷U„ѳzˆzói9 MäÌg#cp@}Õ|µc{ä¶üØÈu´ Rï·S½cJiÿÔjÓzµ‰Û'h™žeÌ=½á€SÝÚÆ 2û×ý×O}êSßÿþ÷¼þúë_ÿú×?÷¹ÏøøÇ?þ‰O|â‹_üb™ìŸþéŸþìÏþ,ìj œÕþΣp΋¿.cRJ9}e/‘n»}vÓC›v‡7 )á)Yþ±áB6h¨âKV7|æ,ypDå#—ÚÔx6°¨Àùf¡…ÁHÍ(ÇûÔ0ÔYVj¡ñ'T¶v-tJ®8õ¯ö ue÷QWdhŸÚRZV¶Â^¥µoÇÓžê ºÁÞ³S°˜?þ?þã?>úÑ~úÓŸ~衇¾ô¥/¹/~å+_yöÙgÿôOÿ4˲_ú¥_úµ_ûµõ†oµ D‡¡¡ø± 悌‘:d^™XÝã'Æy²Q¢|ƒÏ«ý½{ËL&$ê?Ò˜À`<û©gšU¤p雜¬N2ù±8˜ØÓyÇÙh0ó_B²ƒWëÎØ¦6ãÒF¯!­¾¾+(1­ˆ |ã=^¶é€õáØ·|èí·ßþ÷ÿ÷í‹Ø@æè$$Öß2ÖFOlÚz†YiJ7îF% ³ ù.šÑª/6¦Á„ûr_)Œä¢ZH„2ML¯¯–Üh'1V«?Å`VŒH#‰Ð‡’mžvám”…¯½HÊL+.ÁUûfìJì6K'yÛtÀZ%(%Ì:'˜n©hËhÝ@št!÷d²gŸ&áÛ)÷wòdCW”±j«À¬Úr›šÄµPvT%ÉgðTÀ¢åFÊ31Öˆ“d‚F#_ª€­Xk×E|1ød¼ZÿžSéáXÐÕf1˜ÏÀâ¶ ,RZ2… ®g꤂ò)YûLoô`mI-ªº“‰tëó­[õu ¾`¤îè:Ú̪Y¾3È”-£5š´d>ÏÒ«K-¹”ê`³]Ƙ {Å©À¡ZYNuÂNÄ&[¥p0_‚Fç=Á?D›$—‰×ÉvÉcrË~[isl,ÅÖËXòÙç£ä8U|édP2²¯M.«vØ( ~”~:lÕSu&º“~ÁÐm¸ùLM;Ù4¯ïhmØá´F1‚¨zzЇ¥¦¦{©Kô*Õý˜<0Ý>µä÷¢Úwžn/€öWWç­Ý­“®šk¬664ƒY‡½r£|O¥„ÇÚ*Ä(jÉOÈ·ÿ‡Æ €æ¼RIË\e™¥ YÇ¡4Ê‹4xgáâÔ4™Ø0žêGxJwÃi_¸‡–Cx"“ÉÆñê"dª$ÈGh€å£1x>®Æ:ç³p5;¯ò&´a£rWFW²eÀjc`äÁ·!ƒƒÎÚŒj­fF‚©Uˆ£˜Ÿj$ù4•(2›ì¡}' Ãa–ûËÄrY‘±Ñk³¢Šgâ6¬Ùè– ƒNxìO=×j µ\ºT¬ò<Q×’aŒ–´Wk‘×§jñWNØs¯±€Ëf>„[ €udíE‹F’;ø6¸Ð2ª[XóPû$¨„FKf‚ð fd)Òc¬‚LÆŠ_ÊAÒ• 6ªGký×Ú_x$=·ÍÚ“j~2;Ë%öHÉÑ’K#U«pÕX[ɦ‹Ñ„èNõÓRA(œWºjùj“½[ºjùˆèÃWÅ`i6V¬±§˜/MX¤lƒ:bh[Wçs• Z´ÉÉ´¿ ôýÝžz#(Š™e,ŠYÁÉO4N#¶U$•×|¤‚RÛë<>Ædß§j [,q¼@¨jN>x V`;\´Dd_„˜„×6tU{´[ºê0Ôžle…ÞôÀjc`½gÉïèÌIŒ…$·+М’ëÛ_CŠk p‘Å[¸;”ò’‡¨^’yæf5º (!© ©Öä~Õdä}X8ÂFñK•1¬©ÿc+`Éz•4ù¦™>Ájá¯[ºjƒV”Øèh|šö¹jã« €¥X'¤ÕÞä0GK3Ú3´½çµ±˜1»È²"_è¿o´h5iup³4÷ì:hèþà熦N#x"¦Ñ"­Ã—‡¦$ÈÒ4*n`›Z©dºŠì¿»ínKëû©ØùmÕÞa·!õDW«É2X#+d>¸ wÉ‘ÀQ›Ìn2‡Òn¹•a¥ |ˆkŸ…EßNv¢Y0«îZÉEŸ¢ú»„áåIéHbØj/ø°F ²bL³„%êD­{¤Ï@`Ðêî©ZÉÌ[ Ó'K>T³¬uëk·¦°ÞÒCë:Ûgi“½W­k€°66Ö{ÆPÆY˜ÉX—»9 @–ÖU;H T¯“þš=€žŒ± ò?'üDIËG$²ƒHDŒ0jë.«3XKE’ÜÖˆ± $]ä(ßùZkK†îÏÂO¹Ko$Ôu[\Ó{—ž²wkfÃâ9v6Ö{ÖíS¬+Æ*->°Fµ8^4æ¬Q} ç, ¦t‰Ķ®Œi rÃý5ÃŒZ†PW8r•«|T@ƒTDZÓ”F«—#¹x%¬ö̪ $e*öQÿ3W1}XPhcµo€,F+m_Š/ãÚY!­ú¦lÅ6VÅâ¯×µhE‘]{ 6v¨g°\ÌOÍ)!o#ñ/œ8@ i–,nÅŒ©e¢wwxAçf9A«³Ì7Ø'?pÆT<^‹òú2ÆhØa+Xr#PÙp;D^‘ƒ¿ÉÖ7 ¨—SÅu›½ïWÞÀpmìdÖ*µ‡žDuº³Û*ÄImö6E#ÚOS+à<ÆUËÑQ|¦Ž †e9—¦ìeKÌb3´X›ÇsyÓ€ãSF^Œ„2•„ úÊ5ZÃÒmWù>Êíö–À"]ÉBi¹ºUª:÷¼âÆi“±W3›Øq±“XÔÖ"A©V«¯¤eì6— Æ×¥¥‘DÞõ ‚²"MÏT@‘ $N0ßy1DµrŒ• Ì P´ZS…Ì'Aõws©ò[¼LNì¬Vv hTª@)&I"l*ˆÆœ‚¾{Ͱxs; õá¹³©“ÊØÉ鋌kc'°Ð…&Qûë›á|1Òq®KLî„äúú85‘OöÈB}Ì*wF²By.–¶TÌ’²–ê-MÍJèüÚœ£örŦB©šª'(ÌLa…,&Ôøìm,Þa ŒHºJ°Õ<è|\â+½ö>mö€DÇËN4`­À"A¡9Í'3´±^_zÖ«)ÎT@]kÙñ³Žjõ€˜'¸©‚”1ŒÔ´Vl Ñú¸S|Ûñz´CçáñÖ+Qù ’ƒý¡U'®ÖØz벘çÏfF~\l¬VÏ«´ÔB¥¯°c5e¦ÆZ –ÑÍ£ }Eí~Ô‚j;0ÖÒ‰*®?`9:üõ7˜+­«íÓTÂZTžÂTŒˆµá–mWðW«Ä§JHÖyöµ_á¶5á±¶“XëUM:±µ [¼5 OJD‘“Nb$œÏ>˜¨-E*[*EÅÏ¡ñùŒˆérŒÆR*`1)´Q#Èý4Ï•ï”!¢XâE¥©`±íH€hªÜt+*È«Bms_«&W}‹vëµ®‚ߨF¼6oTœÇÎN:`µ·MF´>FôÔçi 4$3V‡¹dÝ¡`Ù—t"€,²RRú’\²tV³|Å©C{aêjÙ8jkGêL>Æ ämJNa‹OèÐÔ·ˆø¼ñb^Zë¡ÃÖ¨ufú„H6Z6-ž[ÆÀÚBê#Œ–ûFH„ºôÉŒµ!'È™‰c…H?j‡$»½ðð_²ÑM:ŠC„À/T“©a˲ ‚÷iŠ´)d³D Qrñ4x â=«¦V$`œSxNŠïLuEŠ‘’^KÏñéc.ȰùÙFNÚgi™1Ù­é­Ðb`mmIÔ’MªX­5ReÉi¬ófZK›ÓÁôž>Ìçhúè”­ÆÂ`äzAI0áhÕ6ô ŸÕh  œ,ÖyKĤ,"ë¨jZð3–OÓ ‡&!J`1øévI ½^ó‘õ­U­ºUkÚxcï!iÔŽŸ6 £Ÿžls"¹åíÖ¸n·'ÀÎÊèÚãË ÌWh —•‡XŸV‹Ú¼´+)6ÈíÚÉH¨ÅPKdA-ÇYdíäad´>’f –^­Ô 0]õÔµ·VÃZæteýÑUË'Ù:9ÒCÜô•ï-ƒ5²Xr»±i¤ ¬ËÔ–isŸGê:>(ЭªÉZ uÉÌêÛŽ´Ìÿh£Ú’*qÕJV4 ;ÈkDq¾¨àÇßø‰Y†Æœ¬¾Tb>ƪfiªY¶/º©…«ŸE\«‘òUšu+†Å»ò½È5dñ·1_Ýs‚ ‰ü˜Ú ¬1pÆteôSÛÝ&G²JQJe¬N°&Ù|rW›¹_l0"O«1 °‘ì#k»´! 5ª€+²T:”Ì‘}ÀS#ÛðÞ(æZ8,ø5-+Þúpµ2q®+Í©eÀá÷.×3.€Y5׆_Òn'°b, nú µ+ŠÌÕ2Ù)Æ¿ÞÕZËWü°%0V²Û¦)é¡€ðÌò²ìá Bñ–µb²£:@¢F½{|Êä–i¤®ukMûÚZQ³©ÈwkXçÏ¢˜\ÉœÔ] Ö« €Õõ­5òŸ€YmºÉFæ«HäàTŒÿÒZ&;‘BK›±Â¦å¢Z¢/AOåÂÏiÞ ÚKÛëÈfÆŒí¶)z•­Ô²¬®ø&­1ãUáÕˆg])g{› kÕ¶™s°ÂwQ·d ½ùt‹Õ£I{lvv`;`µÃ4µ£Ì1su%ˆ4•óÂC–*3<³þ©ÛªÕÞ.†–®T ¸ Ïfó]0Mc7lSV‹ÏO'ñÙ}3C£©Ýª2 ¶´°[Awž0ë¹[‹™Êš\hm#‡–ZÆÐ!ŸÅŸ5ãa,Xjl1ckú°¨æ;ïµï÷‰EÕ~â­§½ir(¹·´4]U°¥bc+#€–%Ëá Öa›ôñêurl¬ãa÷—1ÌÁF»ºíªÞ­æÆÁ3Zc&h* ÅòÐ@ÓžkbHo*a«åÆ“,ºlÚÓ?aL\ýØ(o‚‡“ci㆛9^1ØÊl,Ýz±Vcd¤¦Öaܨû\ÙtõNLUSL95-"²Rñ3íÚÄ¡áÝÎ 4Ôæ¼£§½B$XZõ4vÖRB[TÓy³Sè,ÁÀêÌâ;ï÷ñ}ˆ^‘£í§ª0'i:VíÌë˜~·eVf>Èh„ËtAl…A*@ešÀø`xT1Òúà¦Ö!k¶ñÜÕBºJ.]½Ú›FÒn¶qN­«o~˜óÚÙXk°´ç»ËÛU–´9 “ZÖ.;u4P+yì IDATKLìvÌ·‘7b¶›‹)(¾¯Š©NdÙ^« ‡‰]Ý}¸U=KËDqµ_ÅH+´[¦qÖá¨^™£Ã‘n–``ym52C‡À´‚¢qlo×@ŸÝáY–žOök4«‘¼ÄŠë¼ Ì³¶öïÓ¬;OCɦaÄt±ÝÞ¸->€NX!òÒêvಥÏÒÂv#Fì£v-=‡-ò¾^ MÞò6V—¶®¡Ÿ^­«·ä®b裑#Ñ'\tK†x®âliaÓ„÷àÎ'È«4|ŒwÞ´©#kƒNžÖë8ZŒµá×Hu³©ÛMs²ösÔÒ†!–6VǶ™º—/}¼ŸäzõÑmY™ZÓ=$Ï_n3ñy5”áš6/ÍŸ%^òiÙ—7eˆF2O2 4õÓÇ[SËÁÖž¬öÂhy"ZÚ†àKàÔlH„ÇÔÀ Yò Z£q™ÕØ-©®õa²¡Xo¦“x¦a{z…žcí&eÅ”O/hŸEʇÎç&(¾1â®ü·qØaÑý¥elù”FûcŽn¬Ó°‹ €u\-˜|êˆôèµÆúª„©å,e†"á á tì¨ôS~tÌÁBMž’S´šÒ— fÊËÎ^H Ÿš¦"e»ä/Ç%ˆUɶ®±©ÔÒg·QãÚ"Ò 8-ÔÚ\LTO>qƘäãy`§aÑoKâ­aî[ÁÀª±ˆXɶb6Jn j~Pr‰ZnÚœªðs60Û7æY샞>¾øãÓÉÂñ4Jo’»½¹TvŒi™½6êSÝÙ‰„V¼/}ØÚÇÖ(ûʺÖ,zTk-:_SŸ^? ÎMQ\®Ûc`»aéo3çm¬Á:´Íd¬–Q­é°óQTXäÿÿÛ;¿P;ªëïs£mª—ú‡¤±Š«>ÔXRhR(¥õO´"A_ú b¼R.%R¤‚зF$}‘>i¡Z(õ¥-‘&þ‹P¨J"m-iý—h¢&M~ùw3¿‡ÓœÎ={ÏÚk­ýgÎ|?ˆœ3wÏÚköž™ýµÖœØá¢Nt ·yÑGºþåßÓ~²WëºÞš1ôél!†*)ñ‰ŒËg2;Ë1Öxõã ½ÒÿTò黣™%K.0f…ÀàªÚç332wz Vf\aa¬ˆý*¥yʾáEÉlºÂ?v$#JÀ)4WèOÞñ’M®åAR&ïÚ.Õ¼è]ÐÙ6èLìÙ”ã|&ÓŒ‹76Aç!åܦ3Ę aX‹½Þð$#¼Äë…± #ŠÃn?ad-Ò“í:׿Öì!QyŠŸìXc=Q:Û‡ôxæÈmŠHêlÃÐm¼ë:ˆ”Ki¨`øÆÇ¡¹TD ÚËÿ®C¤<šV6¶^Íb'¡c®f‘$°ì»ƒ0ˆ¢µcâ¼› Zq¬dݱiÜÙ;o[A5ãõs2RÐÑ“` …`Ñb*¡!«VMiqJI}TcBÞÌ`(§Y(t!•F]Ù‡ u>«¨+¹`@Ë&ͲMÔXtƒC.›Â ›Öe5hˆìÈ“<0I<|ʽ¦ÓO_É)J"Òµ]8Ýô„Qè¹õ”hlìÝHÐÏÞ4}Ñí¸®âY¡›”£u«áíª® °$ Z`%ƒ~/è,÷ñtŠPTé®|tk.aÄ#SiÆ1Œ¡¡,C^ÿ\è“-ÄåÄå¶íX§©¨Pf¤1&B÷Òˆ9•ˇ’sO–ê¢@é˾¢% ‰±oQ#D=ŸV†.°’= c$—«w•LŸJÈmbÍ$WØ*ݱ¶P™EïË(Ý.[gAeØxD’Ëþhñç-$o‰>»¤$ïÄ /Éì™í”2ŠYlJ§þ¿öèÌ …whS< ºÀCLQ©\ók‰²çY#À«´µmf9.â*Þ©Œ;ý:mBãÿꆮÇõŽ"ÉÎ W\³í剼ÚNVmÛåR;ôl¡Œ^«çËÆ:¢r&«N.‰áR„B °RÃ*¢3oå©þñø#‘8­« e/Ý2Û Ý9vÊÏ•¼«73µu7­ÉǠWûµnë±’(¶\+'S&‚jÑj3(Œ¤è;|•‘2½B °þK Q㸺ēq <²†®;ý ]·CªÄ~U¨/ó¼dwÆeO%5J×VË®DÕ#l$˜êJÝ¥½|AÅ:6p °þ%Y“ ’ÔÀÌP_PÓ¨Ìz/Œ×âl#öWZËv¦²".®f­_“ÞGøývê× Å>2…&—ƒvd÷ȳIüj ÔU$ËÅu/€ÀÊ=ä@ô4ÖõFwôb#ºŸ+4㪎7P ËÙØ1ì÷ø‚zßJ9kôeŸ1¢J6)+èµgŒ¨EÜ7ìÛ³¬ÇC±}Èc+g@kÁ˜É¿ ~ºãß­,3QXY·x-Sì6A=Ž‘¼Déjãý#W_ÒŸ!<éÎhrÔ«F’Xä@¤³((¿–‘¢‚d‰û-m.tq=œ4æÐ©Ï¶\žî1‰Í€–¡e¦¦ž åOTÙúÆSªÜÚoŒµYn³3Å(ôz…°± #á¯Ô‘¿”Ðêaƒ^\e®±m‘$p埋xÄßž—²Ï¸³/†‘Ö °„·„Œzr©ö‘ ¬%ÆÌšõ"ˆeÚ®s]û¼½‚ §ìAI —Ac-ÿ<*E9cƒ¡¬(HD ¥à©×oöñŽ%ÏU Æê4’‹Î¼aÞÒC›Ó}7WQTÄ6Šû–0). WWòä¬n k%Ì~ÀŠ…âBÛ“Ï)Éø‚dlèË“‘!QÔ§OSÞ´Ý´B)S#nd´‘ïDìÄ«\]XU¾ºr °"ÂÓ"ôåÙÕ¬ó~'€ÉØ6‰áÄq¬ ­ýú—Ï /ˆñ"ïôkû­·ØÓš¾îŠX¦æÙK¡ÙŒk¶Vø§@uÕ£N!Ú$@`•Hl¥…¢ÜþB*FxÔQq)!ÏP¹j×µv„JBP2à•÷«ëO’ÁÉî)†ÐÊ*{GbK^T’AâîèÖÊ\ï ÏTRp=(èj€À¢’x]/¡”'=…u¨¸ÑÒX¶® ÂxF¬öìä#ñfíiF©PŒ„­9Zs÷¡>Ħ²>¤ìTØF¾K]Äv û!L+XåB¼ã’ZÒ2UN®Ðè…úBãXþ-Q±Ó[¶¤h„ˆˆ#•‰´ ÙLv º=Ò £ë’—ÿì¾ÅVWÙ°× H`-sðÔçÓYš¤ÓŒ!I鉮Æ2q!ÍØÚ½°£½e»? 抜uŽÀß…éYÎ ;‘vá!éhЧÞOÊ3!ª•1‡‘"2 ejëD y(-ü•X†›oÒ•/¼(N!¡,­¡°SfBk#XÔ’þÓ}gr¼Z‡”þd¨$\ÚRåuy›ô”éÛyÏ<öúH³3 µÄ˜Ùý&´Dê"{EÑdÃÒ°7[+„bü\Èô¶JX®ué ­6åºWRÊ›\É)EŸ#-KŒZ%­j8KJÎ>KÕ[9˹º'*Éb†Wå éÀ*­üy7—Æò¬¸eC¥?dW†k¤wNÚÄ.KR!}”«}ÕÕ †'A%neNh9a›,ç’ H Àj)¢%èÅ{ÜñÜCÓ‡صeƒ2þžªßšIr¶+œ(UM}$êÊѯe©SO'ˆZÅxÛ£ú«®²w=@`¥#Í©"AÒÔ¼×ñܯÕ5V 󛊰³Ù1ÈFãH   z¬Ùaº?Š?¢†%Y—Œ¡8D°„@`ùÈ"5 GeqµG¯ói¸|UG>J 5OŠ/úiÙdg$T¥Ô}kõ³²>L1Z« £ÅŸ…RX«ÜM…¢œéÀjÒxæK ±ˆÝ,\0°5–ÑNÆ«:bi*c˜•Œ^²ET¨ÆTÊ¡lFµ}\Pcø<9EÙAÁþ¢{j `Ó1¤¹€ÀêÆ³–3ªV¡ ŽpM ÑäC§K±÷‘‰$]´R’eö{1›u:Ëõ‚ìÓÖDûåˆ!ê]Ë5`µˆN¦^ÄŸÔ$Þú•+T¯U"/%ýU·Iæ%ý5XÈUoŒEXÝã­¯<³­éÔÖ÷-†¸2Ñ„} ‚%˘òΡ^$ UÊŒZË/‚öŠ”í*öÒy̨CC0îyŸQ‹Îå<#uÍãšå¯«}¤„`–}]$b%è«§Ùç¾E¥õÞÇ®AîܱðØÌ¿Ÿ‘ªšÒd0'(&¼\¦¢Þþ(ÆÙrÙ¶l©º4þZµ}fàörvØFÒ »™Ð=Ý£‹aMñJ$>.&ƒwhå\)}K{¥g„jx½H25¼àÛµzñì˜ V—RÏíã׃FÖg{I/uFÖ‡¼j£w]·lú¦fÕiM\ M Û”R„B °pÝ¿zjŠJ°JR+ЋYP÷“(³‚Þ«¨VùÝ—þnu¬SYÇ5¤Š¹ÈÖÁ鬮#ÚToŸ`U.sá/\]1n°eŽs_€ÀR äÕ=£oöOÚ´"IN%+xW4Þ™|”ÜÏ5ÝÕ 0§<-hÿØ Ã‚ëO¶}¿)b-› ,䵯Nšœ`!ÃRZât¥C‚,U+­É”ÒÔ^¼š³ÄË$‰?©È ¡NñÀ£ž¥lEÕÚ¾Zü„£Rª¨ê+;} \ *'ȸ. ñ¼§@`•{Ñ+Q(ONéUWh¦©|eâÄŠÔ'¨q>èj£F…–$«kôŽ:ÆU¬X—cÛÔ… cXÎNúã*?^J+˜dI7Þ•éòWL£òZY5OÛ%n²¤A‰•F±;¥ôhKI¹î‚á±æÏ'U•ñÚ}Ôv~F]\=Ú4U:ÇîqÊæ„Å¡uE/g™/ú1ÒXÉ^*ô»aÈÅg<ã*»«Ôah¹H° *êKI‚’ÄóÒJã:H+›©9,@`)/ %ß¼JpÏïƒÿ¯Yà*]RÔX…”2eÆ[5ã©“©¼OÁAMÁ!ÈxàŠ'ÊË<–¾Åĵ„ç1 ñaÜîyþÚÚ>»&«C¯ë*Ás^ZvLëÏD¾³xÉä*I”#î){Ô%M.8Mصw@` ™Éí@RÒ•õ¡µ ï¸B÷JóV`HÅûí±QíÿñFIñ¥„žúàG9|ÿ%6e˜˜Á ,E<÷÷”Â…ø¢¾ÇÕN#‘‡gVeµ«¯ßZEÝIÆPXÃv€.’ÀБä‡@Ž÷—ØCQ¸ºÊx&´ÞH…Ò*¨ p1 µ`ÌN}>ݘ¥»ÿǘÏó™ÅKÐXi:*Jc-jÌgŒ9ÃêË®Ü">y—s—(锹ãBG»³b©3çÏökH÷sš1³Þ½´îø*ÂZ<ð˜U_Ø<•šŒ"Î ™1æL¦ST WWÙ :ØÃÆŒj+`eÌa–ÐÉ€–ŽÁ‡Tpù {›võ"©ò˜í¤s¯ãÆ,±úrùÆ¡ 3±ý†5[¹÷|>Þõú¤‹Ê„JT‹Qºxµª=œ°®2] ­ê¨œ'É-‘"2 µÄûdÜw:5Všˆ§–¢áÔû ¶Š ;­Iÿ™Œ ö¶É~ÉÂ/¶´,ûÅz‚µ$(Á#ŽU‡Rè–—PÇŠ=EÔÏŠQ-¹`ÌÁÅÂÆc@«Áä^œà.–±ÜÞâz°ÎûôŸÝ ªÀ•Ò>:;/éǧuÆ'ø 5"‰­Þ‘@l%ŽcE¢(ÇØ®Ýv´ ßl§x€ãl†ö;X ªB  zÔí0ÌRÚ/„„—éŒÍVÑfD×`}$–+kÊüc[œÖ±ju¦á­g„ƒF>Ò™ §õ(ˆÞެeÀ¿*D½b›åºñ.Ò Æ,Ó9i­Ê±ØfUh5[”®~-°´œñŒ9²Ø”Êõó©1ÿ§a§Áþ6³òG“O,³%k¬sˆ¥_=+ÓȘk/atšjµÜÊ¿f=ÅL”ôc+•@§U)š¶l»lÌ ; þÝ–O¡üçgÿb³#ëOjfÙgo*csˆÐ,Ô«ƒ³ þS«WäÐâòsáð,Oiá9?­ 7E¨‹?èêú«k9e¨²oÄþ£¨wÑ€—Uz åèB ²w$þ(WTêþ§œâv{ ûÈú–Ö—é'p«ºMÆó6ýÒ8ØÅ؃|LØK +ç.[¸,kݦyj²Ñ¦õs¨PbØäѪ¨2ÞÎR#q§Œ]$OlOt'È/p'gHãƒb§ºå”ì[¯ÁXåb@«2æ„ÌÂI¯…Î;¾ëww„f]øÍzð÷xÒ˜ãŽfĈHkhaá”Ù güxÌJ›=¦d­^,¯hv‚m–-£HäV³ûúïõ’AðŸr’±õ<œ¤™ •D³ATµ‹·³e ³A=¶šU äȽm5kÄë‹ËlŒ±5oãVVÕeÞ€Ö AÕȘ£ÆÕñ%…Ù#‹«»`¶|³ 0Íì ˜5æDœ[‰ £šý4ŽYuÝÕlgÅçÌŒf‰öÉ“e¾—Ñ@tå_þò—½{÷æö(šo~ó›gŸ}ö›o¾¹°@•³›+Vœ{Ëg( ø™0ÍìÚµk˜¡i€ë ªÁ ¢ªª—^ziݺu“-Ÿ|òÉüüüÅ_üþûï¯Y³æŽ;îðo¹xì±Çîºë®ñço}ë[Ï?ÿ¼Á4&¨/àúê XŲÕ /¼°qãÆC‡ýõ¯lüÁ~pÝu×ÍÏÏWUµvíÚåË—ÿûß÷l¹Ø²eËO<1þüµ¯}müÓT8˜ ¾€ë«`+‚ ,æàÁƒo¿ýöm·Ý¶jÕªÉÆíÛ·F£}ûö¿nÞ¼ù«_ýªg;ÈÅ‹/¾øÐC56bš Ôp}õ¬b…€¬&³³³]tÑyçWßøôÓO_xá…Ë–-]½zõŽ;þñ¸¶§vœâÑGݸqãW¾ò•M›6=úßwÒ1M…ƒ ê ¸¾zV±B€À"±cÇŽ /¼pòõüóÏ7Æìܹӵ=½‡`Ì׿þõÛo¿ý½÷Þ»ï¾û®¾úê#GŽ÷ôeó,Ôp}õ¬béÀ"±wïÞ3Ïzà 7<õÔSÆ=}Ùü‹Áõ \_}«Xz†.°žzê©ÙSÌÍ͹š-[¶ìðáÓ¯ãÀø¾ð×ö˜.ƒÿ៾þð‡ï¿ÿ¾qO_JWLPÁõÕ/°Š¥gè?Ópýõ×ïØ±cüù¬³Îr5[½zõ–-[&_ÇÿêÎÚµk]Ûc¹ 㟾sÎ9g\O€i*LPÁõÕ/°Š¥gè¬ÙÙÙKO±|ùrW³›nºi×®]}ýõ×W­Zõ¥/}ɵ=…ë kúvîÜyóÍ7÷ô¥v8Àõ\_ý«Xz†.°\,,,Ô“ÐW]uÕÕW_ýøã¿þîw¿{ðÁ=ÛAž}öÙ[o½õ7Þ0ÆìÞ½{ëÖ­÷ÝwŸÁ4&¨àúêXŲƒì¹É±cǶlÙò“ŸüäŸÿüç/ùË«®ºjük"û÷Ÿ?ÿüóG£ÑÊ•+ï¼óÎq{×vžW_}õ–[nùàƒn»í¶•+WÎÍÍ}þóŸÿ ÓT8˜ òÁõÕ°Š€2H(  €2XÊ@`177wÁ<òÈ#¿ùÍo‚v|ùå—7oÞ¼~ýúÙÙÙH¾€.Cÿ%w@JÖ­[çù7©\¬Y³fÍš5—]vÙöíÛcxê ‚HÇh4bï[ÿ'i p °”ÀHùûßÿþo|c4ýþ÷¿óÍ7Ï9çœÇ{¬s¯gŸ}öž{îyøá‡×¯_ÿ /cþð‡?,]ºô§?ý©1fË–-—\rÞ0cÁIDATÉ·¿ýíØÎ@ Pƒrùå—?ñÄW\qÅ;ï¼sôèÑŸÿüçwÜq‡—#GŽÜxã¿ýío¯½öÚ¥K—ÎÏÏ¿òÊ+×]wÝÊ•+Ç ¾÷½ï­[·îí·ßŽï>èPàÒK/ݸqãƒ>xÍ5×üêW¿êlÿÙÏ~ö®»îúò—¿lŒùÜç>·k×®ñöz‘–¤` ò‚!@‡ûï¿ÿôÓO_±bEF£M›6}øá‡›7oþóŸÿ|üøñ@2 °:ìÙ³gÙ²e<òÈ믿Niÿãÿø×¿þõ~ô£+¯¼2¶o¤:<ðÀúÓŸÖ¯_?77·uëVãçž{îá‡>xð`#Ü533sìØ±˜n@ Á(ðä“O^yå•Ë–-ûÅ/~±mÛ¶'Ÿ|Òß~Ïž=Ƙ§Ÿ~zïÞ½Ï<ó̱cÇvïÞ}øðá‹.ºhëÖ­{÷îݶmÛk¯½¶{÷î$9Ð å™gž™››[³f1æ¼óÎ;ûì³ï½÷Þ?þñž]n¼ñÆï|ç;6lxàî¿ÿþ³Î:ëî»ïž™™ùÙÏ~vàÀU«V½úê«·ÜrË5×\CL8@Q EòÝï~÷£>¾ä’Köïßß¹Ëgœ±mÛ¶É×}ûö?¬]»ö­·ÞŠá$¤,@:>ÌÞ÷èÑ£Šž@TÁ$âòË/ÿ׿þµiÓ¦/~ñ‹·ß~;}Ç—_~yûöíûÛß®½öÚxî€"£ªªrû0U E  €2XÊ@`(  €2XÊ@`(  €2XÊü?ºc%k2úÉIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/hollywood-mode.png000066400000000000000000004443631477365367100234400ustar00rootroot00000000000000‰PNG  IHDRÐ@JbKGDÿÿÿ ½§“ IDATxœì½{°vÍUØû¼oâ4ÁP'‡ªf€"ktP™a Â0`É-­’@Á$QB´†$–•„"E¢Å%1r 1‘p‹2k˜0`TÔT0…naM ü޳燳íÝëÒ«W¯î^½Ÿý«S§öÙO÷ºuï½×¯Wïç,ïzç;ßò?ʱ(úœ0‚yð×Ñœh‡s°:c‰.¨3øpŽHðà*P±yrÃJŸk'Ô8C]Š3bs¡~¼Šî¨çôhû„O¸ÿ–Ÿø‰Ïyò“uý= ]=wÛAíf‹ø¸%À®&ƒÕ­½ür=ó:OEÈ£V¬ÙXÀù†žo§ËJ/'ñkS­#K¡fz vR.ÄaÐêm£f…«D“2¦hJ\,̪mUx¸îFa‚nÁ>D*µdQzãê3(¶™ÿ‰T£ñ¼þõ÷+u;|RN©ãv²ßšŽëÝïÖÞ¹ŠÞC«†ÌC¨Ôyuѳm<²/ÄŸÓyŠ¢È ´1µFc¢±3êm£$,ž8p–±ßþ̪]M•J µy½;ÒЯì7‹éF¡ŠŸÐ¡æYޮꞸÓ#?Ù˜¡%ëþ¸~¢cFö++c4}&¡Ë${´*^_pûìßls[ù ocí^®¼è¹8ðÀêë‹A¥@·}ŽLŸ˜.8µø,—bÆpõ·ÙI”LÌXéG]‹ËÇIè *Kè£öµº§ç»*&૬LT†m¢7„íd‡êáLæöÈF áá’;¯æâÀõÒÝùI2õmAñþËÔþv†‡Û‹-Î pWTN !óï: ¿¶f0wXÛ|×Iô ê7»uÍúÊvÒúLAt†ey2ßëœçq ¬ƒÛ˰GâÀ曓Ï ;¼Y6opއÊá8 p?8ÏlÔÛ®lm6(àÙl϶ñðl9SE4‘Ü:ºx  ;“‡ 1àÊ3¼CÒ`ÉL³Ú!?<€ °U‘ݾ˨“s€á÷™ó2ÉéVXÆjñ øÜV¢[LFßàÏÈù=ÄÂŒ[¼-$C5ŠN&?c†ù£O+™?m …C¾ h…á[y7Tš¡ë^ïþðYt¢b‡S'ÑsbFŸV  ð!áðî“`l-¢©Þ¬p'u˜R¸5ø0¬~øb,d›•JvÂ{³5Ï~s`Îô+\}L8p½Ž0 v5Ùº—w‡ÄÁUð7x³êxB§ø`öì‹“Eî±Zf¤ýž'U%\¹Öí^Ôáå¥á¨¤¾æ. ¬ýú‡pݰ®63®´¡ò)3Ü}ÿÎ0LÉRïÁ®tõ5Ø:ǘ9jœà­1|oÒÁõ„s§œ›§@‹·M¿Ô^Ú º„¯Ò­ÇâÀèùæð4Ξ·a`)ux·“¾NyÞˆú£èmênW„+ÌçB£è´Zo->¯Òn°Ê‡?ÉÎ9s.‡Þ!„Nu`¤TdO:Á–Ä'Ù<¤U'Ô€aœè[ˆxEÚø±Äýýj1WM¼à…‰wùD‹»ŠÉa~8°Oè\ð[>Ø.h¨_Uõ3¹{Ž©çùs²ß¹ ¾uf¡V2á—KOúž|ÀVfôbFLô¦-ø±DŽ,©Ë¶©7@ÒÆV¨hÀÙ‹ÿjH‚) ¸Õ³æäÀY(¦k>Óˆ!(ÚjèjNŸ;Ÿƒ?u¢t›!ùìê-¬yˤ3Úܭ˶rhjÕÆ\‹«‡ig${(6Tn]°ã©ã¬ç<‰q јÅG*ÁE?î «1¦?`6h¡Tñl0Ë4›5<‡—Ù¡8¶A­‹Ù”Û§¾|ÓàE8†ÃdÚOTâ o3¹W2¬É.&À³ó‰nè?U\ ”îžS‹Ÿ+IÌ¡& ²¤ÓE½4pònóð*™“ší­§Ä1vª 1ïõU ¹§>¿º›‘eøL˜ ÛÁ=§Ê†éjƒaå/|H·ÛâëŸý:Ñ>×dæ­=L1DþÝfüÆu´ óÚ§"tC †Ì;£¾î¨…%•PØàùn`²ßÁÕéæ×N‡)7|VŸ80.—N€ãôÑó}ê„OŒš3®¦«Kº¡Òesö¿5†'žÃIŽÐZªY·h[MoõW|óé™b‘®ŽTz‡—r¹œþ‘|;´‡ Üʆá¾Lƒ~ ¸ž8ƒlIÔ9R\³ðļ0h³%¹2‹¾1ÛB1Z°_[É­eöšêÔ@]$ïóÍIÙ3 ™rË¡:áW¼š¢b @Ø’ ˆ¢–%Tª@QÙ¿Û,½žüD#˜_/WµúzPt«I–#gœ ¿M€æC-¾·ýDgx¬/EoQå¡+Y)í9âØÓÞz¯DLj¶ˆw+±vøv_]ßx¤p¦̵ðÕàÒø·‚Z š ÊW²¥`$Ùʆc¼_ÐaD(='CÓ=V³ÏQtõÍ>@÷CßœŒZn×­=ŸŽY«çîh+E›™½…ÝàAcf™í}€>)%ô•‘¦n¬~>Â[dlê©^¿6Ô螉F©O²Ë¢k„Ôs6ÉjQÿõ¾\t, 6™~(œ«·ÃäðÀkÕDþþXö+ùhvøwMg¡¿ôyت ²"æÞÔykMÙ¤sÇJôÙ) f¹•êÛõ…ëžÈ–…kR™v8K'Šf¡Z%¤>kœ_{j´ #üF.[&âSpEà¦8Æv€q˜)Ä@ù€˜4Õ;bÒÑœtÔímÈCíw.½ëþ¹'¤ÿeçWUÂT:—ö£’†Ê ´ Ú}B% ®4li㚇¬Ñp%Vò½\æz‡| ÙðÑÌb,îŸsÀ:ÏÆkõM5Îs¦k†¢ÐqŽ&?‘òíAæ}ðÓæzWâÏõî¸ÅØÕ{Ñt\½‚«FQ‰ ž7¯«£*ÔãØîM?t›·ÜÂUk[ý”Fûúy lP›T¹cÜ6Cõ·Mx¦ÑZR Y’è? ^Ñ'LЃŸ³Ç-fÙæ7Îà1$y*EÏ-ÌàÕ9=µSâ°Z{ WOð©Ü6+{PÕ˾MŸY§P$dø /Ꙥ«zE·lÔxˆ@·0äÀ¯ô®ÄüÙOÿôzó›ÿã{ßû/Þö¶ÿý9Ϲߨû>ìÃ~þÝïþè'ù™Ÿó9ßù½ßûÂoø†×½á Ïzîs©¾'.h£ÎQ!ܺµÔwÒ]Ð¥hçc‡Âï@¸²Ðj®ªïRÑô …Ì3VGçåV +f’ͷ˾Yö…OÊ ¥½ŠF§h¡ÎC!àÐðç³Ò\·G2ytq8¼ ëaÐmvÕ(ú¨Ç?þgßúÖHÁ—|É—?ëYßÿº×ýèüÈç}ñÿõ¿ù7?ä÷ý¾¿ö_ÍxÙ+^ñ¿ûwÇ}?÷ó?ÿy/zÑÿøßx÷»õ¨Gýðÿøúðÿ²/ù­áÇG§-Ð× ·w½«e¿¡™/G ƒnìwH<½ ¢{œÂÂú U[¨Ùg›UÍô]öÇh)=ST$‘7æã€~C2SŠ—˜á¼ÚC9•,yXÕ ;[Tƒù1=A¡CØçj¸<ØÀàw=úѯúžïyÄ#!iüУõ??ùÉâc?öÏ}îóžóœOyÂ~íWõ/=ãùÀLZ>åéOÿ­ßú­]߇ú[/yÉ÷þƒðï~wáýïÿ7¿ìe_ðÔ§~Ò'²Îrç5A[| œ×Ì~Á[ˆÚãÍ$ÿ¨ŒXe²‹îÊ8îHNÌÑß#¹/r\é…°´(ï좷Å„Q”záçÖš]×ðcª+˜DfTl=ŒiZzè¡W¾æ5äþQaû'>éI/zþóßÿ¾÷]þüåw½ë»_óšeYþðù#q³Ç>îqOú”OyÍw|G|ò?ù“?èƒ?øçÞþöíÌ?~ÃBOyúÓË ÿmxܦ8+À×…+g¿s'F»ÕýXE·^ýáÊÎzöۿ߸&:ôLÈMJÁ[uå\xÒP©,Ñï¢. -ænj¨TÑáa•ÖƒŸ“çÁñðy_üÅìc>&„ð÷^ûÚ—çw>ôÐCôÁLýüŽßñ;þÙÿð¿zË[b ¿ò®w…þã/üÂvfY–¼øÅÏ}æ3]èÃ?<„ððÃogÞõÎwÞÞÞ~Â'}4ìÓ?ã3~á7~ãÿ[ׯyÞó>øC>$„ðûØ×¿éMÿèŸü“ÿæ÷üžþyú—}Ù›ÿõ¿~ÜþÃßòíßþKï}ï“?ë³>â#?òe/ùWþÕ¿ú½o|ã{ÖõÑyŒY˜Æ¡!¾ò‹Ù¡ûŠíR'²¥>#Õ™ýöùR('°MæšN†>ß.¾¹0û o_ën á¶[á„DˆñšïˆÚ°€“B ùŠÚQrt]uxK ïxB!”:9—v[f4é[ƒá)PðaÄßýÆoüÑöÏBŸ÷™Ÿù´Ïû¼/üÒ/}û¯ü õó¹_ðPÂG=þñÿøðW~ù—·3éÏøÞïú®_~×»’–—Ïÿíc»yðàÁûþóþ=ôAPì|ÿ÷¿ø/!üÌOýÔ¯þʯ„Þñó?ÿk¿ú«ÏzÆ3Þýë¿þ„û¸§<íiÿ˜ùª¯þêŸø±û¥_üÅeYþîw~ç÷¼öµ/yá ?óÓ>íû^÷ºG>ò‘ó+®­W”ý£…SuÈçñ¥Kü߀–f߇"ÉNÆqÞp&HŒoG`’Ñ?AA(ôk±àÖB*1cÝÿ©Õ§–îVÉôR]£›v=¶Ñ¡Èp¶H[ã—œ«ûŒÞ õЬëBøGß÷}o{ë[©6oý·ÿ69óû>ôC?åOþÉÿéS>e;óù‘OøØýËOy ìþ¯Þò–|ê§}ÚÿñÕ_½|èQzÇÏÿ<ªî•ßüÍÏüš¯ù²¯úªïÝëBð;ç‡üÞßûïþÍ¿ !¼éoü„Oú¤ÇÌÇ|׫_ýýÓúŠoüÆÂË_õª'>éIÿôMo !ü—¼äâÑìhE€§ÎÃŽ‡s8ZàØ ®N–¢Û±ßà Õð_õí¶RЙý¢çý;âáÓŒG6òÙ‚üºoÆ´ÉÀ|¶á—-·†O«(4šùn#ÀLÔÖXµ–Qa÷<Üp¡‹¿øŽwüâ;Þ!ïõ—¾ô¯|ñ¿ýgöòçÍÍÍó^ô¢/ÚÓ–ýù2Ÿá?ü‡W½ò•_ô´§ýå/ÿòoùÛû1ø_ñ¬gÝ¿ÿÂi!þÓ{ßûÊoú¦¯ükí‰OzÒ¿ùÍÿËŸÿóß÷º×mŸ¾ÿýï!ü¿?÷sÛ™ÿó~à9_ûµý„'|ísžóão~³Ü Ï8ß6ƒd_Ù”ãÊø šŽNý®œüM·:{»6+-ép·‰W z†®r묶µ÷"ù~&!3Öü0y×—''¨¼I£òrÏC AYÛ¡àYWwu+LçÑtwÃV,;÷úª¯þêzÃþñþàvæÏ|æ÷¼öµÿù?ý§‡zèQ=ôÈG<"„ðÈG>ò¡‡Z–%„ðìg<ã^üâ¿ò•_ù–·¾õÅ/{Ù|Ç;Bozã)þñ¾á7ó7ŸñÌg†>ã³?ûuÿï3^<ý ¿ðïû·ÿ¹ÏüÌÿç§ú¹ÏþEãì8·@ÛÀç\PïA=Ìýê¨ÖÔw¸„«BÍCŒÐ>ì·’rGOó ªðÛz—oV>Œ?_£Voå­D¶rÞB£Z×"ž¡RfÚØŽ~·@é.´ÅØûÿƒã*ôíííåà ¿ôK_ô²—Q;üiOûöW¼ârü¿ýÅ¿ø¾÷½ïÕßú­qƒ?÷YŸõñO|bÒë‡üÇCŸôÑýï~æg~ó7óo<ûÙãÙϾ|ôw_ýê÷¾ç=¯}Õ«(ïzç;_óßñO}êŸô¤÷¿ï}—·ˆ!¶Àþ¥/ú¢o}ùË_ôÒ—>û¹Ïýw¿ûoý×3^O“À[fãÍžã¡g„;èª/Eúj¤ÉóR‘^ë"Öm뻫4B²½V!PrbÙP4ì`@§Dv—hÏR?ÓØÛ5EYY°ˆ¶¹À$Dõ.mqÁS(Œ¦ÁÞpûàÁÍÍͲ,ëº ßþÔOû´ßÿaöÒ¿xûè¿ÿøÿ¹·¿ý˾äKýèGo'Ÿô'þÄ×¾ð…ù ¿ðí?û³Û?ÚfæÇ?ñ‰ÿë_ø õ+¾â½ïycÞK_üâ/xêS¿ã»¿û¯<õ©L³%„g|ÕW½è/ø±ýÑÿñ?ñÿþÉŸüSúOŸøªá3Ý©±Ê§G׌F#b"v¢Ù’5UHbÑfØo»i€&‹V "†¯±*âÅ8@QW fL+óÝ5q~ÿ3œ«Â×5›¾# _:éV6¬Ü·lkgO®hõ]ërÞ>Ð5\N|Á;é—–eùsŸõYïú¥_z÷¯ÿú¼éM|ûOüäO~Á×}Ýw¿æ5Ïzîs/gý˜Ç<öq{Êç|NR¡ý½ú¡!„óÓ?ýÓ?ù“‰ýý¿ÿ[_ûÚWÛ·}3]p¾àß¿ímoxýë?î>áŸüÐÅç/_òüðÛ™§<íißôÒ—¾ç=ïù­ßú­Ÿ{ûÛâÇ~Œ—<šàc§ÇöîD³ïA½†zo …Á¾óÉaá·E¾›¯áà ûg7L7çÛARz-Å$y3/VÂÛa[-òÆ+a¾p tÜU|„w-W6;Dçø8ŽoÅ+>ã³?û¾å[¾þoý­—}Ý×ñÿØÿãßõ?ðèÇ<ækžÿüøüÓ?ÿóåÿ‡OýÔ½ô¥ßöŠW\þÑQoü‡ÿðß¿ím<ØÎ|ÞSžò¿è‹BÏñ‹ÿÎK^r!íð±ý‘þÏ¿ëÕ¯Ëò3?õS/yá å&¹Åò†×¿þsžüdc¡¶âÜÀ¿_ׯmä0|–w@ӒžõhÁ³/7)•wØv˜(2$üp*¥…Ù©ØáK§7ù”®n6XMÙÕaz¾)ר9÷Uo·î`§7JLªÙMÀêâåMr8 ~&@gKZ«óXˆÏêSÿÑýï~÷ßû–oy×;ß)ìõòW½ê…Ï{Þ¿ÛÛ„í=G ¯}ýëí+À³¤ ¥ðï×É~[£C=¡‘Øúýk˜-vÞöd¿KtP_n•4ξn'”‰6k]€Š+x~¶7o¥ùÖŒZ©é`¹šûéà³Äºj¯8‡uª¯Å¨gW²dx!ðCÖa»oŸ9S³[çJàùâ}Õ+_YÚå#>ò#×£-g¿Ãù°γÛºÍñ0¤Ž7\¸UNìanÔs3ác¬†+Ìn¤>¶ë‡URa¢—ÝÝZ”ŸøáºŒè™ÄùVÕ¦|µQöÏäâLÚŸ‡h8‚®î6M/5¬ÃZž\¦d¿}»°»š`rø±Ä SxÄÏ–?õgþÌ7}Û·ý»Ÿù™Ç>îqOùÜÏ-•ìß}!Œ ððLâ q²_ããs‡s­±€­ïà-¨¯!C^r ²àwV†W]6ïÃr)OKÏÃOåzKûÆ]ZL~¾^­Cq%–tKÑ*¯Êä’'.˜zicm#ÿœê£@-#þú¯ýÚº®ô£>ê¯?ûÙÿú_þËÞfuä»*, ðt¹òàÝ QÊ£e C€(} «É˜­d“+Ý|g НbRû™ëåS¡£¢ª«{÷AéFGEþÚº,œ]mé³™³žö·ã3n 5óÒ!·!5DÓ vŸ]܇#’;ÕOþ‹ñßý?P#Íy)ó’‡õ¹Zó¤ªVƸrª*œˆýšÃƒ©•6ðߺd¨½IV}D5Õ‹VâXH{„EÑú ÀïáJѲ÷|T)?ŒN•æjBÞ”K ÿ94 f{°áÄÔ¸ò)´:3®·™f¾Ìj²/ÚÏ *fà(øÌw}Z•…³=ØpÍ8@üàB=Î °&^T‚úe§ãV ²[ÝÚÁy™ýÀ[©k 0™$tFÆvx±º{—¢—í:<Â-´÷¼‰éRfó6Z.–k1aÂÔ"SmnTˆf¿…BøÌw%Ïw‡–ó&éæ¹y¹ÞaÜNœèù´·!Ào÷‘}+¬g=ÇÛIvzØP7­nøÄn€EFª=J2+Ú l¯è•@^E§Ö¼¬T˜ ¹ÿ  …lÐmŽÍæÊ 8Èê’–‹ÑóYu•©9³ÍžA·ýÀÔnµ^jë‡BŽç§'cžsËMPz³.&=¿—î|Ù¸5ŽáþYî„v5%¼q ‡÷}o! LŠRížÛ5%ºäT­”Ô¡(ŠÕ"sAG•mGÙ3¬“†2jž[J ãu ‡!©StiúM? ½Ý6:¹šS£E$=4Ç›{ÇóèÚpàpÅ+\üe0Á_ˆ:À‰ËÃÍÈnÓ`>MˆPg_ä4LØRwaªÛKø[‘ŠJj*G¥ ª¬ÚÂùÚG=ŠjÝqû"Öèê“£áÎa¹RævTSOæKèsú+/›C´v{%ÎAt…CG‘GxxÎê®âãÊ+4­ð8‘Ötà9+ !a¿Ùf ”>œ¨×#ÈÓôl›ÒzlM¥4CnÛˆC˜ß¯``[¼W/œŸÕ•ßQ¹?9±D¾+aàwÀ}Ô§ý‘ŒŸ”½]  =-5²õô;÷'Þ®GnFpd,ב A£À^áxùqy¸%¨BöëKôc"J!V§š®«Õ -œE‘¹"9Q4—iÞwê÷¸ÍO&ºåfM­ÙÐa¸z>QÐNÌW£YÊÆÏ-ÐRÔìî;Ñg„ëá'†Ã-)e¿Ã æÁyJE…ê7]56éxlXmh4/ª U}[ù¿†W1ϧ®Ÿ´ÃD¼¬©¶ûÕuð̉Æ÷ظڸxm@€{~×Ë(œì÷pŽÚuâÀ…ßz¨ËþC$$<¶û=$j¦×ÚxT¾0þÔUœ|©Øðà'¨¡ÁÔ%æÍGsx¸ˆb8çÀÃé÷q†(¸ ‚†³|âD½6ªÑh™éV¯(8á½üÿ¹©Iá·¨qB6Z+íþ ÉøSÉÓ—'i-°ÇV2Xý§¥Ò¡”ð[ÆëvuWoS·2Z6È1—µøÛ¹®DÌ'²ËˆLK&M|ì4úH¥c”RÃN0|Wsœ£SÏŒÎ×iBäÔ;––Ím…+a •”´¸ºÞ¢PÉ{i¼šÃSŸ KëYB[dCÌáÛ¹åð™8º­™»?©)kr4¤pepàW|{¸·\l0«’Y)<ò„CŽT fa¿g¸jzVóœ¦^ÄõSƒBKdV*M­dù@§e›ù 8cù.8 53&:ÔôC×/ Ë›@¦H›•Ð9O*½T³Ñ–t‡+&N¸5¡Sj'hÇkÀoš‹°ë‰féÚeÑü-Cct_÷`¹z-¼q;¹ 1‹GÌCº~c)ưY†¬)¨ÕAÉ^G·,ʰ… æª¼|çáIߥåîûY \ÀßXsCƒëE ë·:Õ©%–oÈv—¼li;1²Y üHMƒM0ª`Ø“·»en9°[¸Zî9<:Ĺ(Áè|E$ö¿\ä‰óÚ§U†XK‹C¢u’jަ‹hÇð=·0§¾+qœ<¹ù°˜/ *ȉš‡´XM0×Nu”—°&BÓ• u/ëæ•ü_E¢Vs»v~e`›Ñ2ÒN| Î1…(zBÚáïâK°úW³ðSîh ªh Ûb§c¿C0×LhÍ ´Øò§hÉô2q³ûE·žÎ2ýàSܪ|ê–Jk¶éL*u –—³½FÝ?mÇ«4CíVÓs[<¬áÀò9s$Þu$_âjcȯ”QpA€/ð“îx°¡¨IÓíÉ=`fŽsÖTjó(wîé !JoD'ÁÑè°_«Dp8LøÕÔpn|;VàM¦«@7¼ô¹RŠ´t(óšl Ž)G;ö››,›µšrÂ2>:‘Lª‘&]l×µ©u‡ Ö’]S(Ú=Á””O”–°o Î"pk8 N‹Æ›³À†=áŠúöA¾ŽX„J<©×Ð/;™Ý) íü2áWE-»½ÇÞ‡Ø_Ôë3ýZGR¸ ¶´6ËŒÏwþÆ]µÆ\’ÂZ´Dòõ‹( V‹•?úíèù"X­§(”N÷ú¨- ‹À‡G·M"-ÕÅ «ç |Tàk&E:Ì{w›×r[¬àà‚!Á±U:Q%YÃy;°$Þí@ØXM„aq°>e>¦pµ%ñ±’‘n¢Š8p¨{ɶêI]„uñaöuw^醫;·¼sç3 î{çüQ£–€ qa^&9¯åõf¯¹ÇÕ¼Á¹À-ûUK0_K6GvûŒ¹Ìú^EEK…ü,Ñï!°j'yŸ%ÞòÚo˜Qˆç_‘]Ù7œlÞÉCQ¤b\ZV›Aqà £òN+ì–zQk=ÌêäèS$¯G·O]flÈ6n䵡Ó;ÀÙgÉb^²¤°|RO!²w¨ÎÃj¨ë0ì·~ДË­‹± mËD{`¿æBk’ß4 8ÎRÖ"ï$)»a>ÇÜ.k4q¡h ‹è}ì$)š1 “D‘øXôs2LžÑ-Dü‚ã WÐ`«zÚ5ãŒ@7œqž •ãµF4¦ô±gRBd$×·©ï"ﻀƒ 8Oåz\ŸýÒ&Ù¹:[07[¿SÚ"éÌ–Ó»í˜=ë`¦¥‡KžÂtÁW|ràÃàLõ}BI€3–Ã9/Œã¡Û˜:/ÿ:™ØÝJ©•bÕªÕó­”K8„ÉzA»É÷Q£ºø/IJ>¥$g‹qÓp›º6ÁÓcÛµ}£æMõ!BVµme[ÃJ«|€º¥‚³ÔÛTZèßÁq€¨Ž²_C€ÕÉÖìƒÔsqàΪ1üGÒ¿… Úìd7l)àîY$¯qVÞFœÜ…²i¡R¾™pÇ2ZÖ®×^ ”êèÆKâB¥›hñŸz]‹y«]¡{`âÔÈ©kÎ%8°wÈቴÎó¹ïà‘àèÿŸpÛ*ÓÁ?ÚV=ȬG7«†4›è´@–‚65¦æëˆ*¡– Ütíó: 9†Ögõ§&]Öµ¬¬ŠS)lv·0¥NÁ“לÌ"i:4*÷Y1FŽg"±Ííý¤ZŒàÀYq(QCÓ•'Nžsbƒÿ"°“’‹O”|œÀÜÚJyN=ŠTŸ0ýÙ¯ZÑÀIkÎ}Þ EÑ;ä sã‰J4«±¤§LHYk$4ÉÐ;É=Añ} : aF„Šš”Wb¸k )î,7„¬–¢å¼Ê¯x8Q öÏÖNØâîã¡Å¾ÇÙ%xVW'›ì n×—Ò´dÊ¿ë m(â¨FJŽL@ GÂÂ׺Ï1jöÍZm:`êÿÌUZ" Î‰¯B])q5Ô.Ÿ95sLF£Ös2è8p-Cd¢ZNø‡²Ìp`þû<‚ìÓ~ ©s|¯ƺrÏd;u-´C̲()1²O}X¸gÕ|‘mO=Rm]…QQ)Š— Ûó³Ñú°Ž··c8Ùè¡(ÚË«˜‚l!7t®BQ•˜âÎãªj}WUÛlñÆÁöi½Š¦2Ðú-ÐÉí šÛBnÜ NÌž,Ip öëÍ ]ðþ\t,ûm Q÷­‡!ïµ­ J†ÎQOÕšŠt‹ì§Hõ Ž·O×ý\c£.”ÛéY8¡÷jHÖYLRÞ«"H0.w‹†ó5—΀òK¾švm¨zXÇ3ÜfÒ1Nö{<ø‰ÆQ¹(XÖhúZéðø0´Mîøp/¬ )®u|Î.]„y3jÊΉظޫ+-YÇz+õ~jh ŠCfYèìµ}ÙáÚÁ±¡#`×@ÛL”ì0rÌþ† øèÃd3FåÆB?pRÝò¯Bc¬’Áp¿±IDñ‘:g%Vu(ù2r²~µX˜`”Ɖ‹ðµR øº±dË\rÒ*A±­b »TVÂùîBá5/뺛Cmj³·’ï¨xVzá–Ã0Hîü®ñaòüª'®÷ß S¢2&gH[àŒ*9ƒjZežM1çå™D#öËjò² “f L¤Ö}&×yNÂ-Á„LCƒ™án‘ì2Uh…(ÝK¹•ì7Û¬ÛĶÚLž•#Y€Ë ©\øh„«btÞ¾W|·îw6ìz ð‰'û•£›³¶ŠœHë9Ó–»ßýß~lŠRê ›u ˆ$-í’_gÖí ¶‚"òVp–ÑÙ¸¾g$i‘íRÃ)-¶Ñó™§J@q×Rœ• âmÃsv­Äó¦VÛIÌ[~f‰ =ÇåJ ð1n+†8$û5/VLýLrÂ~[ë¥RœúÞ⦬ ó¶ŸÖ—X©„K‹‹t¢+T˜µÇÍ:TûWÌ(ÜB¬9ä´*le‡§ïc Ps`ªoŒž~Qf_C¸½'» ²+c®×H€\ŠNÌÍ’àÀ¯&ù‡³MlU#Ãrâ@ðlSÑQáTQáTmp©% Óö0X+­íYÎ’ÊYye8+Óê{h²rLž¹Ã3f+x9ÂJr©Fÿ˜ÂH!ಲ7ü"ŠÑÓWŽ'èfÛÕà#ÝSL  ÈÆèF[ËìïH‹¨Z¦nßpÓAMY¸Vµ\sâ}ø{‘ðíÜ"(æ$T×4Gi‘(wË«ŠZå-©•¯Ñè8p‘9¼…±Î÷lÛ ?è3{à±ÉÊáS¥"œÔWÔßίäõìk.vø„1,”)’9]e2Û«¨[[òYÀÐ-aø„d@WpœÕ.8Îú I¸ŠjËÙÅy¨½ÍUôö‹Ž©«î¼÷ÁV…«Hú‡«pEà ÌëJ€Oö;;ÎúÇ!ÙïÀ‰§ãx‹Šx×ÓZ«uj‰'®Ëé(½°Y»×1„±ßׂʯDòED¼ðdI¢3{é¶9+*ë¦mR¾ZáÌ^£oU8¿„,¸ç6Þp†Ë'Z˵löÆÜ†Û3dkOŒÝ?\Y"víJ3œx¡C½ñæ[‚­6!Kú¢¢–\ƒä£Ò« Ï„Q,L_é[µÖi—Oªdôy"Úš [½ü©ØÎì ²¯(—Ó÷©Y‡íl/ ÅØ¸ÒÞzIqÞÙx`4½¿Ý´‹`¢ÎáQš!MÀ¥½ÁòK±æ•Q5 _'Sw´QŠîêå¡FëJL¶ Ù/ª‚7€¢I>oæ“s Ö»ŸÒ^•X؉Ñzè‹äKk Ñ. ÂíèVê$¨TTiö¨Û‹d¹°Ræê;¢Âdu¸ÃsyRôts–6º¡uªÏå1¦µ÷¬êLpCêyoϯÉí–IWj/]O¥²yù—ôJ̘wægëTa¡²àÛ’ò{QØåÇ~ãk¬”º@Ðíßü†çšé-Ñ•…¢K·¢£H²‘¾ð\ób†^ËÉg»©Î¬m§½Jüðé+#4G¯C9½²P,Ç叟FÓºœ°o;¯;¬îY¡¿©¥Ë|¶ªk.±Ò;¿)ÀáWÓÍ2i¯ ¯5L¦÷µ¼ì'ûm[›K¯®õР1ÃJãHkᆅ»ÒŽLÁA  ªÄ—­ûIÊ2|¥È'loq^ÅÔ`³}ù6r™hÇd¼jÒzªä;0³n€ðùÛÿ¡¦Þ{Ü3æYÜÍ êGÐ'«7ǨC'î Qops|àtV)¢á-h˜³ß »º¬žÊ®b>ª|í*(vEêš1DÂP»PrÑœ÷6¦ £9M• \Ä;™"ÿ¥î ×kÐÇÁŽ7ª{AÃ*«[hÁ_²1žž][™+Ý€Z>ÜÊÔd(UZÔìI§Jk ŸucqmîŸàNž˜ýv€dûßUÝ8Ìa^wj×±ï•4ÖÍ1“Šn;ÖƒÊï%”Œi³ì˜T!‚Ñõ.¹±;uVÙìªtœ)“24ؾ’ë„”v¯!ù¥€½Z°¬)dÖ f Òú‡aܼ¨/pbÕ¨Éïí¢kжß=ðN±xºOù±„Ç,v&èl6“g;  “€È»{ˆ[ ÌIf©@öÛëþ¡ÿ)|g=•SMô#*{ëhƒÄ€Ä–i)”V‰mbÙŸ\Ê}\ˆñ¥Ž³VÉU[ ”k±Ý,€F{ „“YÝו—ÀBÏö¦zc: ôî:Leƒßû a¸g=˜Û<ØÐM]þlèRcâúŒºïX©‘"ÿàc2jêv¦¤l²ýiÅÊbÔ,ÞgÓëe? -’ÆE63üp¢eû$¤ÙfÉIf¤ÐMÂÃÁ2¯x×lt»(šÏYQæesjLKûš¤¬ÐÕ¯ñ qÓ¶TxU…G9Î:pSôû?Àíà$FáÙ¶™zυé¡£F[]ˆ*â™èŽY ¦® ]ͧ¨2–•¯«ë–ñУ-Š’Ãë¶]šÊ©T‡N¼xd+ ª¼I ýç5oaV1¢õµtɵÜn>@4ݸîd>H 7õØÔ‰éЪÜíö|³ðl[‚‰L½ÀÖà#m5ééKemÄš¦&VeXyuÝíu¡N6X}5]" ®òHú* ¨^ÂŽI—¸Ÿ}•‘úVªF¨,´i b]I –D„1‘隷ã•ê­Ñe._(°ôê¦˯©3ÓC¥z8¬êí ™ЄŸì×­aÇ€Û, ½Lì‘|ÕÇùêSåv¾þpóßñÃT笼.}»²¨£ŽVe“ÅìN¶sÇǨ¨Ö°âo†tºHTÑ”C%÷Y0Aö}d7$,rþc²Â%Wן^NDhûOZ*8ÌÓ|–`ž(Bý°* 0úŒï™cùÉ¡ýãH±râ‹É’m ¨Å^Õ¢oCý†=sáj™£V´6϶œEia*K5‹þ å|{ãl®Ê•‰5Ãç¢Ð÷Ø) ÉNÐ"hæ0œ«~8ðð™PiÓ½þ®HÉ”¬ónø ¸…Id *ÀŸÕ ü[˜`ƒ]Ù¹tO¯Ô˜a»6r_øÑYrÏ?+ö‹–æJe:™œ’¬¥f±¦òkcjÐhŸ<¹ÇL¥Ú¶Å|Ù·ñ67(XÕ—¨¹§Þ£^”|Ç€ä0Ç-ÝÅ…¼\£Ñg0%ð`v‹à7½Ï´ Ö'® <ðÙéÿ±íÍBµ=£6ÂQðV2­ékëK3 ÷ŽE)3·¥Ó ´îÅ?¹ Ú™“í,/]nXd„ß¶¨uÁŠäÕQ]†fT»b„Y  ‰G³yVÃ[®_ÊUB¯ðªu ¿(ŽŠÖ{J§ÇÔ•ù<þ$[œ÷šRÔD ½äÞñ²ß$Õ-sCvÛZÕ{Õ½êCM]Ôå¨c=õÝúß‘PÙiPd+”îÚ4XX^ݺÔ0»@}³ÚªŒŒÊ4k˜1£Ë7ŠmÊKµgêïfØ^¿ôöí†)ŒŒ1ÁÁû¿AZî~¦€;ÍÙoö£vhD]ü Öô\SèPK¤n’ˆ¹yêÙ%Ü%h{W”ïI²]‚2j'…"•7‡üM9µ|¨¢Ïý_>·‡ÜÃKW@t2MÄV"Ë~³÷¢á.È¡xLœ´‚Ù]â'\MË ¦3xW€{ŽÄ\£îÇÚRKâÕY?7©v0d Q~æ‰-¼å@­õZù»­ï¶ ˆ’–.ùR« R¤·´½ÿ»eeõ }ÙíìàwÅ _¾•o'©ü‚®v/+ªµi~Šÿ l«ñðÓF@õ)ý™ÁÁ Ž=LžéʪÓ<ʰ‡‰ëN"£6cà—ÊtÖh(p^öÛ'ª–RÍåëx”IíQX¾èðzU¢«Ýe"ç!³ðU9Ð,S1=¨Ž+8àå0¨ ~QÚGMòìÕ*ßöLw»‚\“73…ßHã¤F¦áÙfŸ¶ÝUÚßWârµ|BˆQ%¯‰4ŽT-´{¸L¼ݣƙB–ö$É«yQh糆Q©J³Ü*)–b‹v™¢æö]Ô¯(ËÁl2 5”©àϰK–âÆÍÐ ËÅòxÊK͵bÙZ7{%v¶[Y»’\¼Vº†€ÞÁBx|xiµ4…k=Ø`…¥ÍÐ l±-m,l-±ª…ÊÕQs£Ñ´ -Çn-y9 ÍË…E?øæž=/LÉÅú’ÀÙÃ+j+&!*G½p™T ˜ˆQ_auCà+œVë>òŽã¯p17üv÷üF› 1QÚß÷peØðûü‰zX ¢´Üm»ºTfA‡ Í>Ôbë“ËFPHžýâZˆcøgO8¿úl_hD-)}SÔ0b2Ö:ãiñ¢,:½WpÌ÷Ú Ü‹¾.çºè^´%o@iØ—À—CQ—…{ìuû,`GT)¨ˆRÍ… œáê‡lß[pöÜc8zNéë¹|D¸ÏÜ=¯ÞدO½~¨oÏòoi0þHqC÷s;RYÁ=tŸZi@]€ž‡?°ï©* »t* gŽßw¥XbÒ^±,¢¦Ðê œhÞéø€„3òQ3$Ò( ¿FºášwÏhó‰£ß}²_Ã-w^€’7Ü«f‹KæEuQšýò^ëÔ at¥srQŒb¿ tå¯5:•)BÕE;Š7”n—- >l¯¸ÿÔ¬ Ôð=¹‘Ô¾SX7 c†¼Äzm8I]ŒfÎÒ.'‰âƒÔW5½¨Íc× Ïì½~'ž!¼M*qì ¥…¢ò—»ßÂ÷<û”d³pb†°Ž· ÐŽ¶î02QÌïÎ…-…E*µSŒ=TÑbe?ÏëöSŒ»dnËßʦ4Êk‰ðæýæ-yYÉ<¤Ð‚¬–.…ô)Þf'v´¸km˜´.D©wã1Ü€Cb0ö–?•BbÓYë™@JÐâõ¹ý'˜7öë„)Š*­A-Íêâs6qi±¾¼AÊ?¹]lsá¶¹©â5T[@R”%®ßùyŽ21]e˜N£›ƒ‚¦Ê90u†R!\ ªœ±í&a‘d3(!yH‘¶ñ?6é*]<*ºóÔl` ÿ6Z˜!ÀíÖ–€“ýzF½åN|W³¬vh'<+Y¡Úœ7ZLj[þ©þ_¹‘%T X°?“¸-Õ,º4oøt¢´ékÔ.jk7³„± }é’bŠêøÌp 1@ýŠ2ßQ½ÿÜ £Ç®Ðçżvëu»£Öò|zAa.kë1 ì„WTŠýzކgÛ|ÂË õÕ‰`Á‚¡õå†ÖíEöóé,Ë•ØÐ¿„·—ÖÕ…ØHµyŠ ›Lú%ÿ( ªŒ‰w2¸° µ³@M´]Œ ÔBá§|¯lÁ¶”‰A!Ý(eý*C,§u]= <¼dþFwmL¦ºp oÚÅvÚÙ›ƒS™<¿mm˜N~SLm|%f¬ýv`¿¼4™¶…Ž›õ™ÉMËÎ L¶&våBP0”=ÃP Iö#\K­_ +ŠI‹ÜDÙ5o„üiNñÛø¾.(trL”ú—"v­rEu:xXOŒEöR2ŸxvRÎrŽš!QÄ3É)]ý5~fš)21L&L}›z´£÷5…”Y ñQÁÁÔèvwEëfT½ªŽZ5µ-œÕŒç°ôBoþÙ…ÌVj9$^3å\Ø2i#¬Ë—'šVçÂIÀzÝ#p°!8’/j Âý6YÑ“ _xºû,jXÆ~ap0-®wjøî‚ωQ/mêÍL¹²}`þpÊV©^ò2¾äÎð–,EÌ~´ˆo}•œ¼R`Qù7æÇ¥Û.(c(±(]Œ€åo®¦»O§€çYqԻ’¢Åaòm¢+¾bÇh?ÃqA)w¥–Þ’“ A‚ä'‘Ìœ„@ ž…6,üÆŽ¬9—Q«JÕ1á ä=¥HB¤®JÁ.’¹„j¡.1ôSøL,ÝÑT.ôg#\éÈØR¤·;ç faò>‰:| ø´“‚‹ÿ|=p~ÇT˜gëQMÆ?5<³ßáz+yÕ·‘ýÃ1ÔŸ@±¬ äº(AâŸÜÙš§Ä…ü°ˆÚ1}ycЂp`Oª›Ú‘£…E(å‡ÛŸ°;@ª~^½@³Ó¬©((,ìÿD§¢ÉCS'úÒt]oø¢!…!üy ÒîßB9ü܉yæYÍp¿pì!{;¬âéj\†3Ü€ ‡d¿-蓺£‚b™G’à‡œ˜…’Ò¢švJP/üba–S¡çMFMÂuáyªö¨fæhßd¸+ôpYgá’µò# ÖXwÎw€ç@ÓÜ]-™²êH×gŒQäÐûõI‹P_ºD7×õ„UÕ+`U¸ÎÓ;N+U—†E^ãeFœ*ßQ6È7aÆ¿ù–Ôy¾š0cxZ¿…{¦*1Ãd©%™{0òòâXܬˆ&qèú,÷]0pgµ«Rj Ìç¨Í‹áׂbÕØÿ40·°íh?—ýD8ƒ°K×ù•©ÃáÇúØÔ×êuÞj—DÍ0µ¸fKë` ¤‘(oቨ„W'ä*K;u<øëW¢n»µ…d½@¡ºž¯¹ѧ¬`³ÌZ€¢°,„ÿ4Z‡JÃ옘7V팟:,1Æ:¢+Š8¼z#LÏ„ó¬OI£€‰þ—¢«ÅÚ¦èà¦<Å×É©‡ÂÂÒ4([´Y¢ƒ­ ŸK–$AS/OH €ê‹7kʲz^¶ò¸Q.샹Ôìv!xJL SÓLŽW„ò+ŠR«KhœùQC åÀa­ÜÕÌó^ÃdÝ'q=+–æøî0>Mr þMµ]_káìý0[¢æ®"VSTqåH)_>Ùo¨c¿Þ ^¼¯¼®ÕŒ¿‰a+q^RâÞ ˜Ù®ˆ’ݘ] NQuW¡–ÀÆJÈ— jtC8#_I5{w¢æLVrÖ6IØy¶\Ÿ±ÁQƒ¼zJìçÇ šÒà¬jçqkda|Ë*ZJs®RÏ£pΛW€gÌSyÆ£8Ò*ÿŽb¿0„°Í¥Kcym0nPt/eDŠ]!jêÛ ÄI1X¥„¶h‡i\ ¹ƒLtÎðHBM1%б£1½Ù^– IDAT¨ò¦yFbK K±²!‚È^ã ˆá&\Žš8‘«€r×z“ëü:QO0¯Š¤¹Šü‰#¡!v›^Ÿ8ÒдãÀ³D©ç1U;b`Â~ ÕÉ¡ãcYi Ø^º€Kˆ•H—%ÅUEùj‚°˜­ßB0…Mª¸ÇÛFÍ:¦Z+/–â¦H{ ˜å$¦K\F…±ÞýF9°-}eüJ„6X gD i•rfg2¶˜ïrø-u'f‡ùå|¾<=z&Ö×ó(5 »"ÿ«d¼1T¾r¤‡«ÂH*Ud‡{µxZÈ=ÝJâ‘`ZÂŽuº¸•R\¹žp¢'“E´Ÿ— ?ò+”ÊÆmPE:òÆ£hÏsü)z·}ù.rH(¬ý––" †²Ür?¨,ƒÃ M'Ͱ¸mt/ÝcÚçœ9q"‹Vø0Éî‘àsP|Z5˜8ä™Ìruk˜g'hB¯ NCÊÑA»!¹²†ÀdG„ß1Î#tù*ƒ‚»J -U1^‰YÇ dŠ´YKb{`›,YŠ‘¥|Yd»0UJ`éªJ<—ø™iÎ$³+BÂÌ@8© ëÀ¨‘3Z@ç¿ç0VÁqV€¯'ÏœüHu«éŸ³f™’U 6ã³ÏJI@fQŠ€zÔsnPÄ5i @A`Ci•,«…âTTq2‘ТxËwQ°ßä`ÍI$ õ=h:4rºŽoQI±Ž…h¶“.•u9ݨ‚«9*C³´M¢Ñ–Š!^ÄÑmH¤©A Y‡êŒ,]×™wDï·¶Nœp…ûÁ4wôÌ5‚7×Nö»aø®]c –úY:Ä…W¿zFO¾„ÁðX”î* (ê+_9¢øaÜeŸ.Ú­È1Ä’ÕØ$a%9.£¡]¨rYb*e<4/>Ô‚Ö-ß9<êf’Íþ™8d¢êP»«—Ã,ÐtÃuu$ü0d/ñ½w ¸ªrâ„ç;ÀSb8±q“h´©úá>WZçÐM+Tr4%!·‹•±­ ûª»ÈÅ*âV´ýmƒîINþTÄ ’m†Ü¢Ú©îIáW¢¨æ „¸ÊÌf$PkYά®™ ãCÅŸâÞ® ØA]“Ö¸zž3‡Áaü6ö\Có?Á‘[âÇfW¶9¤¾º—£œ@hŒ¼`(„0¥n+sþ¬ÎN†Ì ¦ìI¤º£O%ž]+Fß|ºò|¾HµÍXØRXid>&§A3(’LÙ³‚¹„ŠMzA“¨“EWÇ †@ÎáÒ†œ^ÊG°r?y;$²*\×ïø­Ôâ$¼†0|^4 Nç˜oˆO$ø¯à“ûÇÈ› ÞØ¯!õË:(¢rÜ1>½ë霹jXý£óL’?Ù¾ +Ù\gžLRzQn#¡^5•UêOHæW¼oyÙ7‹eÂhdÝDÏ dr`Ú*¤¬º+FFŽI/’]ë‘WÈÛºÃ׉³Œ}¨Œ]P$¸†Öz¾T@Ÿàp=kˆÙEÕ¿R!j¼œøŠ«¼úøúE`tlP^-"½òÆ vÉpÒž¯mJ,Ì~j~%-ê AW ˜ú-#\Â~aõ8€^õEEùö]9Kä;P3-p= TÈAÿ¤Œ1dŒ} ™ÕmЭWj»Þ!Wê'È“27?ƒb(! ÿ#u½X·(ÛÃ9ŒI*½¨|~CQ0\xMâxH”¦§r E}åÃ!o)Ÿl<ÞŒ´ÈõšG=OYÈhGY.Ú’¡ÊþŽrÑBCÀ܇\‹×é.JÛâÆíÖ¿àŠv(ÑפKŠº â–rà@‡6€ÍZdðVrLè™N1¦}M0[¯wÂI}H§A5ftK\yGëY°’?ÅCù“R W)—Õ ®wŠJŇÔn‹Ú'Oeõ•hÃ0ÖP²¢ÆYE†WA(¼6å0¨(>cøH«¤Ð”©²ÇйRÀËD¢¦OyBC ,oòr„}!é…µ_9a`È¡ÄêS¡ ó7˜^M‰¨$‰^¦##^,Ý–¡ÇVhu÷[“EI+ª¨55vn9Û±óÐyÐb˜`“'zOLAX[è w 4WµVjV Ÿ*1<c²jžs• „mj„ W7•¿ÖÓz>ô_câ#|ó¼WÂfåÌYwÇàlS%.›Ã^rž“%NB®N®……>FZÒEâE™Bòº¿!‘3a•ef|F{ÑÖ‰$† êN©@ ÝÂÆº6rïZhæ¾akUOóYäÁ©R42»~IwÒxšÀ×èQ,¢Å Na€ÈwRU¶Q@}­ºŠp)z¯‹pk⠛馓ܗÓy¥¬uåЪ{)ï•H`Λ/Á8'EQŠ¡¡rx-”Þ» )~%!„¥ËJŒCá`cØ2ñޢļÁ If˜í þ¤H5c@¶á­{°¥|4Õ) ãšÐæ.œd%[£H‘¡UÓñé ¾*LÜŽÅŽ«ãØ3ým‡±ôÛºZºüÁVÓ ¥òû×Êú£È4¹WKS(+Prixc¿xâTЉ&SaãÛ34uY"Ê7 éebE ¡Ì€ÝQPEÌ×G„OùJnÙrcÔŒÊÙÎüƒb¿Ô X….X KrnÉ#+ªØ«…Ë»Ë/¨Ð—0‡ÙØà5×÷êq%Ñ»7! *Àóÿõ°šýÞ&CS{<8[¹àÁ[H<2ÌYçÅýNNBfBu§NB±P3¼ÒDKͲ“gg·’¢ÄUˆÒHÕ)†VÄx¥¨*%ÚZ€E'ƺÿ(ñ«žDQÁ×m&Üܩ܋÷ÍÎ.4gEmPO€x©‚×[#_Ò¬Vt¬º®ÑÙ†'Nü6>ÓÁQðù¢]@Cà±x°g¬ õô£´•¾¥Ûò/…¢ðJøIQ„%¥]x" I,ü&µ_ªÎ)ÙK±#ªpjCv½Ò(½ë(±D8cR7ÖQ´¶g³rÁtLN6‚ºzÏÇ¡f\†pàz9™Hž|òÿ&¸ª—*‰vyO Ñ3¼xp'†7{t0' ¶è@\uÕHTB¶q%7îÒÅªÚÆwÌF^˜IÖøÚr(B€ÁüÜ€Œ‚ª(Â-»”P,£:.Š2†%ÉÓD¬!N°=ºï 9Ií ÎzJ-Å8»j $–Ý@Õf)fK™*‰ž‚"BjДóÌK¨ZŒ] ˜›áįÃà:ãéëK°œ@˜U¢i2í0SïŒGMuº™MÐÍQIàyÖs8œ })²9½$õçÅ¢c™vÖ6!.…¼v$dthIv¡EeÁ³…åîw–ÏÀ«»H{Qcû¥˜m,“¢ÁLµVçxØ ,qöKÙœP}ô=“XŪ0U¸ÜÀXØó¦ï,Ÿ78<Žê׉n¨"À“f„Mø²YÅ‘ ËÒúC—¢™£L4ÂT7Gj 뺆8êežEQÝ»¾Ö§àÆ¥ ²™ºùÖÁ$– 2yÚVZÛ2´úZè#¤^°K²Ôr9NM$\4Ëå(]#àKîx'³À!¹<åDׄ6œØ•‹)³8ÞÂÎY|Ÿ&Áœk8ôøª’Ź8°ÐTÙê'8‡a¿Œ:‰%ºŸ[4b¿ê¨¢,N±CD˜ÔÊÍ(m_šl Ù¯d:I ¼P¤²Ù È™d"ÝAŠªFi­¤„ˆnÁXic Ì“ˆZG°¥ú’fEcaÛ@‰¡–‹!jŒÔ…Ðd°P á±Pxah_tèVä]FåÉ¥ŠÎI«uçÐsY[„Êåƒ1þkÆ´9¬ÔN‘4o[¥³?K7¶#,à0ÍÒZx¾ô˜EM2lÂñàPW²Ä€Ú£%å•&T ð!…Êde³çʵìz £wÙÿÉQs`xÏd&uæ@Y(1Û¶2F¹ÿ=6;j¨I’KI‘^ûg†×‰+ê)Sz…^U论L-ض>vxþy 1Ýl¨a¿†Âʾ5 < · Läk¡8°Õ²Ce…,—! òš°Î)éŽJƒ%Ü Í.eVèGË^#õœ¢ªÙ¥…(;¬ *g~BºbSãß”R9K”´§|©ÌQk;ä (=êž"ë켆ìîÄ«Y:|¶KàßBŸ¸j¼ázfÏÕÖ~ýWï+Ѻ®XßW"A" Ÿ\¡Ðù–Ò¨òV$DÈ{€¬ê/* eJ–o¨ú[R7¦È*Cq™z2/DØ>F¦´Øâ6SD¦¸—4@+~|³óE–{WÖ~¦Z_ãUWÅÑfÌèÛ–£å/pè`(³†hµ&iד!7Å\Ú9lc¨$ÀüsŽ_Ÿ>Ñ5•ÃÇ®Ôtûõ‘7¾.jXÚÎT·!†ú*SïVÒ©ÓµdØ œý.…W"$½+Ñ5 =CÕÀ)d›Q x> iPd‰¤öKÍ4^f¸·ºtì,VÛfüÌ¡¯pzd§A%…ãÙ;3y¨â?œBhäã{KŸªrÍÃøa¶QµLÐ WÎùn.öz†I_–glþ‰‡þ}a`)²ž¶E½|˜++dŽq?óÍ[ õº þÞ]Z÷c” ƒVDJ ·)Rd^)YŠ+šð©gSĉAb–4†XÂE…ñÉž©¬ÚñB¬®ÓšÚ&z§UÜ~Ñ ¯Ä®`4z™Vd/ga¹®B»±§Ô„•®Ê•¾!ÐËëIýOtÆ9¯¬`x‘Önî\~9!Éä˜wLy÷K“°±¥ÅÒBÙ¼£ÆCÂ.ê%—Êr¡)h-õ‘°úQL0¨öºØ¢%/ õåuÅ'aþXû圿òº†àIޤ¯d)®¢òq–{åw*jéža§dõ$Ö‚.—$ª}†±‡ÿ¨Ì‚4ø©ÚÓá ÓÜ€áAqÓ07`¢p]Poót.;‡Õ,²yxe¡ñ}ÿDg\ÏPNç)“½Í‹RöÛ(¥Kày™)[ùá}ædBü(XäóȨ/Íñ¤Eò`J¨>£WΟy]uœ²mÒ(4#ÑKy´ÒS– ;•ÔæQÒ`½µ3þ‡èL`ÏH°‚ËêMlË–â)cv&P¸èºk½ Á íH£åƒ¦(U1#k½4ÿ#nb¡Ù—`ñO/owÃ\™¿’¡ô€YB-7Ƽ䥀"“¦º¨©¯Y©Qä#¬É”j_èƒøOÃÛcéã-[Ü'ëÐ5Êë Õ‹1ƒ!Å|n™4æÙ ¯:Yò êóÐH”ìÉ ?dÔÙ˜ý.Xc! Nl@Û3 à§pJ¨ëÒB$Z(Q°Y;Ûê3צJå¾·ƒúqâÄpÔ_ª–ßÍlz91 ²µµnh¤ËÕlœ…ýÖ (õç?²‰N²ûÍö5/­Ô,a0ôm à¥,LlôŒÏû©ã5¢¾YL=ûb!Ð6ɲKB—ý A 0ªh-Ôž &dwhš/ †Ž&ͼìòì£!„ŽkeWU$%ÜD&ÓXÂØy™ðŒp¶”²5ÝÄ«TZÚ夠€á VŠ:§“Oÿ¤ì}ù8žGü¸æÄ’QÕ~'î Qi­„Ø‚©Ôre3xF”®e»'¥.ÔÙeÍlwž/Uî Eù!jX|)nÂ~)¢ËGuûM?!uY0wPSã“(¡ºü¾gx@^$ütã~ü(KX(úʇãRwì³Ípâ¡ã•}¬ K ò»P`ÝLFÇg^‡øª8°ÏA™VƒX/¤Ñtr{ wCMÎÿ\ÃŒÜÑØÓÍfoÁi„,¯4£ÚTª0lY)¦§†«Èõ,Ê@–%×N­P„-+!)[òJHaÅo7²DQßÒ¡„EѤ`+d,a?ñß`*–ýÉø7Ô$DÍ•"T”?ÉjË"¼`¿Qƒá\¥âOK+!tЪUÄ«GAxi˜C"ß܆>c18UªFWÁÚ©;q`4'À£jhæ8*ûÕ¥Åíà*8íÐÇÍn¤±uÇvŽ0ªzáPÄäÍ(‚Ç¿nÃ$ŠÄn¿QŒvÜþäç jÏ ~oê`3Ø%¡µY‘HXT¾˜-êRóDȵ¨¼V^ó„fPæ%'Q & $¬8;K%…ñ¢´>ÛxÙO0Pc!Q!¼Å’Øè†@Ñkjf8³hºñÄ\ø¼£gøz1×íc…H‘Â8È3ÚRuíVµà3ÉÛà2Aæ…‰é(MvdiŸa•è§ W\ÀÉEІ·'g%ÄIÎdà`'„r¨`R#…ÖR¡6ØÒEa¥—BÑäd"¹`Ͳ¬^8.T0%«*‹læ k"+ý'/- ´¯íÝÊ/µv"rx\¯·hv™¨«¯Z÷‡·¬Ãzàé–j Ú%ÊCPÏ&Åa™õ)¬‚ -± LqÉ\‹.1âÏP…¾D̪Ót¡È*–¢ë ø3`ç!É BⱂÐ/ Ô;øg Š´¨|ô<êÕRB;=`…W²Â#ŽÕrF&D‰aI4(j J®îdµÈ°LAh•mEúÊÑšŽâÀjœsCˆ3PYœૃ9û­\³/ÒåV¸-r)55jµ/ Ò%h+¹…4!£(Êåì— ~‘ƒE…FrÑdN¬EY.E€QÕ1Κ$çç|ߤ슦›ª^v‰Yʵ’Ð฽¤<™? ªzí@wøZ.@~ þˆùh¯knàè Y"Éáyʉ%V`¬ (zi/sß 'ƒ ¦ãÉ êíwê*¾¨‡¦>@øð< ×À~)Ø’½n·ézÒ®–f±ëÑh^Á&ÏHáÐ c¨ Ô¸‚ö¶3¢£’^ÉïeoêBPÂuc"ÛóœŸT–\Å'c:G+¥ŒIdR†…ýt’”…L,OQjºbSŽ·²$þ3aì+°Sq9 y{VH‹; ų¸Hà+QíÖ¼RÞŸä'7#uo„þ R¬ÚÛÐ ºŸà< oÇiXee@‚š§¸CöknŸÉÕ ¡=cÙ>£ª± ÉvÔ•QPÖf娧\ý*µðS†Q7š¨’ªT©´‘Ûä6@»'&1Ü`¿ãó‰wIÕ”¯ÑAZ›eÅI3”!'ºP9 v?¼^àŠ „óSêb cO Ÿ‡´9€ÁÍ. 0gt÷5ЋŽâÀË>ì­Aݘ(1SE®´%3 šNŽ7Še>«ù5;9Ô#¥îèmhN\pà À~»‘RŸì× úøX_Ißâ —„L®}R*Ä*²Õñ¯¿™P Ç¥yg|@•[‹æ^Lt“ãý€;+(<¢–PÆÜb'Ñ‚prL±îä$_kEÅ*x¶CIcDÖ»`Æò—ý§”UÌTLJ² ÐÛZVc€„¬R¢²uK†Õó‹`H·ŠDñò‚zF*uãœÙ(ÍKrZ¬w8Oêú,ñ„™gÅtPŒ©æŸ SãšÙï‰+DÌj$ G–¢d]¬¤»õì—A6DºÄ‚¯&òãß àOFW|°äxK¶$‹~š<³‘Ù\†e¶¼Ì­ÊL Ë…'ÕÌÐ'mV0UJ@EØ»†š·íã3ê²'Œ§nUHs^ZÜ–wQ&Uý¶ƒÃ×)r˜QË­jô”t’]ÈÑg}Ζ)`@€ë‹N>qö[ ɺûµ­ƒ£^_nƒ5×£¼/•(—vÉö2Ú…\™ªVZD}åŸÊÃ… ”?l!¡¾guQd›ghÌŸL k-(cþÿ„’ã“™„2WbJ J)S…ÌÅŽ!¿¥”2Ò=ÑG[¢Î¼â—]”WtšJqih€mª]ŸNè²ÿJÎPO9˜µ!Ø€owQ[ÕŽD1’Ç2·óÆIG`tÁS˜‹'ƒýÖ«î°Ò9µ| t´p:Æ‘(‚P“²Ô4X@”!'ëòõa)5ùˆYXtwÙ[•äîÑåÍÐÑ`´äÿ¦ˆ U{„Œhã· éeª P ¤:‰j „k% mçJ'n麂!Ä}%Ë»ü‚BéÅžU‡¶—S\EBϬð—•1&$D1u뙤Úòš¥dAd.Rwr`˜g_5Ó{THzÏw€ƒýž8ƒï¥c¤XGæè:9ê9Æ“½`Qa .°0ñ‡Å«¸Wr?¢$,à'ìaÇD8JŒ…5®,NÖ²ë ^‘ðÆ$b<©^ˆ7–Q.¢Xñ£Ì³¦e&–ÉJ.%6Ì\B­eäÀ8ðŽPòkrA]a“é¨ËMã^EÐ;€Ð*~V:h»îP„9ISR?…fGé%pÇCg)†×­bhÉkg87¯=}Ñé:R´uhÊf]³> fBrø­è<H&Õ1OÎÃâUVT¶ž–…0MT‡\7!À¨X”iSÔw;ÉÐr”Ç^óŒ7)½R•Cy…–šüTu%”Æ—ET CÎrh$ze-û/ôÐÌ<4PB œœ iÔª j|©Á¶€fS Ô-±tUBgÕ(\sNR9 ׺CÂÏUÙg8<äD=®3þj¯+iÓ˜Jú³¢`bÊd«õ(½ÝW²_‰üÍÙœçí)e¿KÔÝ7$ë¼÷.´v†î&Í®›œ\°ö [ ´_ /ÒeIÜ À¥ÉX–˜ÁOž)™cÔµ[›Šr~yG ²Zâq—” aˆ˜+”_á?Ê^5Ây…ràæ•BŽ!†?¾§NýÕC#éX³üt \3œE+t½ p»üÕ<8ØÓ®¦z‚Îhí²$ßEOê¨ïv H»…Z²tB AÙ#LSäŸfݬ‰ä`hþ"Š‹òÞ˜ÁWn%%$1ûf¨}‰¨©H­Œd™d\J]öKX(cšóÏý…½äPñ„ü?¶Š?Ã~á§TýT¨jáLXÁÈ&’y « Â^‰u¢_C§;<Ëê× I¸êàR#‹ Ÿ`Ç€:Œ‡çÀÓyG=’xGDø0Ó½<Äʃ ó.‡×Kk “gª®A©êÒöÙÔY§%›ˆÔKØšQkF­[_ôI¿ì?e²ª™ˆJxoáFL}ÑcŠë¢íaˤ²"PzƒR/(?;“™%ô|r¼ˆ§åfÞ²÷7áN æ ~ÂÛg§ Ó>ìm¦„/X )g©%›€ÍÿìE2F•LiA¼(€JëWÎ19˜Q)–ô)ž¡Å±c{$ïø{]žŸlê„9šN*CáVYÈÔ0d¿:Xe IªÊˆmá—0E†V¡¹l Ú N¡«”aPîC–{9¸¡åS¬5ì—"À°oÒ ²_ª /“â½üp a} òËñMt Ÿý1÷CÃ˜È„Ó ŠíÉfN f…,MÂR™·ey¯t‹€æÆHÖ­–Ü(0ÂÑã"!¥P¬•ÄçÑŦ>ÌÿH”‚÷îðîŸjŽeð12øíàm†˜Û£c_=Ã2d:³âÒQˆÛ§1ú IDAT£F¬íJ¥X û…í™^9I÷¤fE=K˜4¯!Ç?ü›eʶ|ƒ“ƒŠEI#zŒŠŠVÑó1FW7’éÌ´8Ðr†ó¥NØe¿×üÖì·‘RŠ”¢9ô Rmµ–RN¢Y¿´$Y¹àÛËÝäë¥‰Ìøg;7<Çe@¨ˆ'À”mŒ ¨ÌØèHˆÎ£´6>¸Ù÷Jš…hër,?ì9Il ¿.pù}¯ôx¡,—b€$ƽֽ;pB&Ô”ºŠ)c“(@iŒptýhk ¸!èr‰$ÔÉŸB Ì%̳GZÈ4£Ö8ÚÁ[<¯„ü´Æì1TÜ=¦B€³Š't˜—ý¥#³ðpÞNµ|±È 5+tEƬw\E8*ï’D<{R-„‚°q¶ÖÇÿPœ–¢µ+ÈV)Þ+ŠBªénüsCŸ¿àf/3þ õB#“ìu|Ýÿ„ˆ ÃxÂàd§:ó©${†Ë° ‡£ôʒД$K¸ßú:áÀ±Ò@œ(J:Yk˜=d½B¨fþ³Ü“£žè tUñH pMZ9)f¡+ôôÅUÜ\#AerZº¬–Lu4÷”Øô•õB§½”¸Ê¥ñ™^hê~*I©c^‘ð?N$,€­¡Ì þ¦ÌcʃheràËÁæEìÎÍÝÏÆu!˜pèx cBþ¤{Â~ãƒ[RH¡cüÜ  :ôñGL.µE†b¿ +DbªYã)žÌ‡HÇ-¡ãò¾Y½ÐÓ$à(Û¯ÄIá<ãz2†sjG€‡¤•'® ›+GE7ö[ ~í¯ûEɪÎ;´WRa£Ú£–0[ NXnBã6°x Ë•q.¾i^¢’Þ˜¥£\7f¼7 Yì;5… Ù±¼‘ü´\0—×n$9NMž•þ³f%Æ ²_^>´VxMA†ÉdD('Ï2|u*UÚQrmò“Þšw›[ÊSú{á6h(²ÖÎåÎ Ï—m)òÿé0®ö$W¾BÌŸ–×[ÕÇ/[--læ)D|…m­©²c–WKÔ ÙZ¶¬tùî †b©ƒD/z=“Ÿ0“„ÀxãJ/õ¹q"Ú#œ-¨× æEA™P\ô‡¡ !ŠObžp£ãžü¹°ìMâù¤â"‚yƒ“¾èÒ€âVÐ"g.èd•‰.¸”Ú“µ®w0ˆ—œúa8úXåÐñYøœ± ä °-N~x \É ÌM5óÆÄ©$ZyË’@æ#”¬ ¥I8­$€Ù{2ET ãФ˜BêËÈD90,iÆÐ@yú;¶ó&„{{¢{彨û±(q…œ<`^ ìmkû^ÐÂÍ’ä'€8£cËÐýhÁ©•ìk–ða(–1;n‰öZƒ¨…ˆ²X Iåw9Ø’7•Pš¹JºHÖbZdÌ•X¡Š5QA]AõO˜C±‚y<0—OzŒš”!Àݰ…‡ {:¸ Z;ct’;§…aü3U˜YÁÕKÉ0…RZÔ e8L®Œž—$Uò´o?ñ× £b)6K‘^ªepØ{Ø]Í÷îoü;fȉ@”bñ\ˆª&-´G+1»¦Í†‚â–q4²³Š¢ø<Ú˜7 ¶ŒYtÉ × :Û,ÐúÉ1Ì©$N-`žÈ9s2±W0g¡ÏýßáS¦(ª­iFŸäß'Y:q%Ø`æIc‡7ÃàÚ~,Q@m|kZNÝ„L(­$´_"„©n©¡¨ü@®…V«²ìÒ]Šñ½VLÀ!ÇNL‚ä0>Ÿ%K‰®X¿(Ù/jm¬w‹Ò 5êNr&ñ4a¿¨_<ÛDc ×xQ”,$7Tְߦ٧dZ.DÀºê…¨Q¤—YÎèlIS˜'ÿn9p)f±óD jÔ-ÐæìE´†Cât<8Œpk“º,‡|‰]˜hÖ ›oUfœhwŠ*0B†=£Fê*z l,1¦¾Ëþ|Àrå„Å 0oaç˜ß€oB€©ÿßC-D KÚ'FnäÎ Ôß8P(oLÈŒ>5Ì̇“„Y Î¬{¯ùe‘­cB†/gnizÍ€ÞÁ;R܆º_-„¨ ÍŽ¡iFQÊ=¨ù,dò5  d ®³Ö¹˜ˆXž8ÑÍ¿ËmÖîÖ0:¸s°ˆÙ¢ipºE¾T‘Â0>™ë¹ˆ HC+5òÀÈÈé+s^â2Ê-ù]üQ™ ÃYf ipr~Áþ„±%÷"ö{ðÞ%úHˆ=EÉyl-šk.Àet”©“¨êÛ¨q¼c%Û’ìŸ_¯‰Í@é4 €–(¦HÅI“âÿ焲2ÊB”ÜRkkäBÒ%̱/5\Zm΂¹xÑf|Ë,÷c„$—§|Šf¡æxÔjN©Æ"¨Ç_MÀœÉÒ¿ú0‹wŒm °[ÊÔÚ°¦K¶=q /t(òÝáˆËï¿Þ,oá0­â¤0šåËÁ7†L9ÊgR1”£2/B`ù4–O‘ÆäOÈ~!f, {¨bï½ýVç¸#eÆ ÿD‹Š0]FE¡Úo@˘V݆pïNoü¢6±.f†¬àwbê%‡Z•H(=ÃZÑëtóê‚-Jë~˜‘`ÝÏŠd¥.l] ›V™¢úF —Q$¢_мËÞÙ—»Í áŒ'IÞd®®ûŸ[p†¡ë‰¢dU‚òˆšT eM$Êß6Ò¸ñþ˨å6$'K¹ßJº.Cù0ŒE7]^!dÅüå¹=j¼ÄJÆK Deé:^Úv²/=Ãrr`·¸F|âÄ,¨y×/«›£óg¤ñÑÐe?<XÊ«Rrá ÁÊÆ$¡vËÞH}!ŸŒ%Çü¶”'•–øwÌlÑ­Î÷0Þ€ãhh%þŒ[&²‰J§7j±`ápÇÍ’=Ò w·à<Å[’PǪáGh!à,‚ì1– ¯ ê°º–´îÏÇ-©uÄ8ÄPu²Ž°`½ „ù1´mS”F¥ïíóêjÖNlhºCŠ.bÇ …dMóÀhE€Ý†Ò­a®p¼( =R;>œ.2Büߵͣ—%¥ñ™„Õ´3#æ ¦zÁÂ>g•‡¥s”ü„ÜìPö ™mÀ0j edBbáÿï½ív†æ¡„†"þ^DÆ/wÇKtþfÿ)‹®’ÄÎB@2 ç|-ööîg{¤Ñ=™=Ø2!+6[’!ŠÛ-P%$D”á´è™ì5ÈNꊃâÖ›„2#)ÕÔ£dmÐ)ŠN³xÎ$Ô‘a˱@]ŠO’Ê$5™xд±æ‹|ws“Uð„¯Ñ…*sN": ñu]„ÃŒ—=vK¢:vlu ˜Pt‰L˜µdчý oôcIi üON+ñ|&,êI‹Î1È(¨«&áiñqÂ~Q6©ïögBŠ’ùUßÛoxF¿Þ¥¾ÐNh4#æ„°Y|r¡íÏÛýù°ïKñº„Ñ%6CS—H/ÅN·67w†­wxc Ã_ 7yöÀ§ü yÅ 6k/çã/÷*½|b: SqCm¦N†È…dž@wIÎH(= &¶ÂîBZ‹žDóäàÀY.fE`kÚ›äœCú´­³UnÇèÀéY6àÆøÀ¡<€ ÄÔ*º¹IäðÔ±¥#â*ÿveL~u wB)&€ÐÂëú¬>˜LÎŽFÔ´¾×‘PÏK…pj¾þc%PŠbò·„uæ1À'ñÉOòÞoØÛ“^”j,‡„*¡ÜhÉe¿Ð5¨U ƒPгÅôc uòO‰b×à™ÛÈå€-X$ZÐó·ô Æ-Ã^ׂ߾Uû6„‡C¸‰x&úíS‰Þx¾ñÒ&ê‹?êÎööòƾ62Œ¶5K< „a‰ñjP*¢‹ž‰-I 1¬õ}2æ½ñq\ jAjTâ>œ3ØàYšs½ÃgÂ5@aKÜ-'.Bg“FàzpÃØl©RKýdK€zzÊèâ}ž‰q¢NbC¢eËe!ïÝ~bù1ïÝ(LY"§6¥7 ê{ýSßäßD8Ãxƒþ@ƒdF-@<ƒJ[@¨.M¹ÀI&¼ë>8‰"H ¶6ÛÖèíÝà‡£ã˜ù„ý1Š„Ò'4õ 5%saÝKûÁ…Ìg“p¾ò:i(E½[ö-ÃÞBJ&”,‡¤1ªŽâØŒtb0Kü™"TRè þp”‡=™ÕIäÔ˜+t™ªÀY¶„Ï;ï•@|Ýx£|š^¶ Ê';Œ¯+Î ©pQL¸ˆë&¬,ù4þ3n 3ø¨ï a $½É1eÀ†„Û„ˆÜ&ÿÑ÷>±çZ²Dǔބ¢I'“pA® £„2áXβ7;ì0Úþ}ò'³Z±ìÛ„È€m¬o#&üàîüƒ¨œÄ rxÔZ*‘Š ^ˆ®ûðÞÛ³ÙuÏl“îp}!`1‡a‰›¡›³ Q¤Æh£€"¹Š™;€ðþ™9TÜ@†?ã$!qâíÔG:ÔØ)¹:äÈJ0ç]rÙ–³pB+;ûëÙ¶,ŠŒ?8îyþÌPc^Ë£4°Gˆã]zP‹ôJRX‰ L›{¦¢OÈúÖh#ñF„’+ʦÖýOˆ’cÆž„lßåßíOÈ‘(²½îãÛ$©g2 èº@ñg¸n, Z»}„$&¿D;¡‘“ û/ Žç!ºk:fãa¿Ùx‰êÀñÿNºÃ9ÀÛ)Ï×aØcÛÜy”ìÓ^0Q7QØáäIF uAN³46æc²ÒJ™(Û˜kÓ–˜uÆÀgh«³^S$b³Ú[ ¥s"Çc^ËÛáÚbrpÜGâ-Ð:D ù:“ä½Ü²_†¶µ“£4]+RÇKVWxö‹’%¦ÂÃËÔÅG=o÷rÿ¥PØó„ø7$ÀèïXQlÉVÑk¿7Ñ—]ÅÛž*¾Ù³bn4­ ¢aI–*¶5…x(`Tc’ƒò¨¸Ù { õZ"úšpûÄ øŸ‡cà‹ÓkdL,ê&zÿ6¦ÁI5 EøO±7û8$×ÚfdÌÃþ»»$Nmª F¹$³WÜ þ‘ L|P²¤¾×ñHŒ¤ø|©^†ë07cV7Š$ÌåõýmÖi4´ÓÕüôcIg`ÛÔv \›¿¥ðŸëd¿5ZàÃÕ|Ñ¡†þIäW —(¦ÂèI”E—‚'èbÁ²ÿì7A¼õ4!À›ý¢JcêKý£#Þ˜•H!Ä%>Š|. V‰w[›ø£¨Û¤Ýí1K¤QŒ:ì#ézŒ˜"®¥ ÀòÍÂ,ßDmá{!<¼§Á+h‡Æ®&lã3ð}ã¤Ëå`›¢Ž MlÕu‡ƒCH}c9”µf¿êËh_À´_-6Ab-4>ÜáYµŽ axùfW;FNæ§Fáü?À'Â?¯;Q„ì-[X¦ÐIà ;Ýîa¹#`ÄIÒ7Ûžj)aõÂ0§‡Ô7~ÃvKsc a¢¤Òäw–úJ ¿(ñ¦¼NX Ê~Wì8€ÑDÕ%q¸ˆ}8¤ØZÞ€^ aí ,ħÐÝ ârWÿLº£Ç!"Ò7‘aËݨ=Œýß`tÚ£³"¹²àÂ$qû°o¶Ñà˜'Ø$Ä‘G Ë^} ÓCï ðÖA¦ÅŸ! óéŠÍØ‹çÀEà;R÷ák€p¤úãJâß8°FáÜ]…±ÔËD{#ºEF¡Hg[;<xùsÔÏíRÁ~+µHt éq š1E$²«ý¢T“¡»(ûåÕŒýÞÞøölz!]LбƒT2Àص°_Ø”nuÝåîä-Pú ú4q!ìÛSkôëŠ$$®è&,1¶ðf¼9 ËÅÛ$ w;Õ/®Ý»«Ǧ&_ÁG çO¾Iý«ÃÇ‹5Ûl¹½£åÉ¿JŠu-ØÉìW_}1{Œ5Æ5|hIÒ=9Œ™¸™Lx8Í`žj2,l_4(Tx=ÂIvËM0$£ð³†âÇC Ì‹TŸø„=ŽÇ~Káð™dh%ª§Ë}د܆>Mð¢˜j&ü2–„ 'Ÿ:›‡º’’ï#èqö’Wl§+Ň7’K2áÉËÞ#ØÎ­Ž ‰Öºo™öDxLWàfé°g³áŽÝ‚Z/À÷„î. ýŽìùvÌ~ニ®!ü—èÅà¹p!ôK¿¶?ö¢•œ˜½±ßÛè_Fo?¸sÏ„à@$„5u!š%ÆÇƒ¸€èÉ 5Ÿ¡ xw„b)«$ÚM6œäE¢0Cnœ'C@<ðQbHrFñ%?äsì4ÈWÇâ$À'HP C²_EGásÚOæ ÖQzùm]‘Ó(:êT”v‰ @¡³28RŠ‹ÀEQjiíJŸG5&êú¥ßûѶç@ƒþ ͈•BcPã7×’mÉñ ¬¦‡® l|8¦vaß )o½â– ‡dÞÝM‚°ì¿@+¾ìgBìû67Ö}H·ïǺœ¹}Mô¢„Ò'8"œÃÞÚÜî9ð}UxˆÚ 1I„=±*éˆRß@»ÿ‰ŽoÜl™§pÒ79òØ€ j*ß7¶¶QêÌ¥–KÚ_‹ÆÐ9¿rež+cKì'•¿ µ=~üÕ1U‰L·èÉ~ƒ–þe{ù™BA` ï•¢¡Yc‘ÞÊö¨ÙTªŠž”´ ´³Ëþ@7—b-5@ OL“`áe¥²öÄ’cÞ›|ÕóMô…Ï|&ê$ª7§P~;˜Hƒ_n·\öæ%Œ4f‰kÔeÙ‡.©è01b]Ðñe?£âøÜDãO—½„p×8~p,ûèQòiL;o¢ÍÞË] ·oŠÞäÜ¿V`Õfÿ‚%ŸqXîíC Cƒº©– _ û?“9a¨Dµä’—ç ©VÜOzæèØ Æ¿Þçy…vfÏ“ÇðB sßÇS>šgX WÔ¥ÙÇe¾ÞÞìÑá^\ IìZ+b´Ã”¹EfUØ/M’:'ºSt³ñºÿÍÀö¨Òø­úÞß=ЉÊdšÿFÉ|ü;ÙJ Ûo*(÷Q.ÉjüQü¶*ÅNÛ„ÕÇ à”ÞþŒ¿¡*DÚaÄ(ùÞbÿ+YYˆ/«›»·pc3Ö;ržPúت$˜YïÂ>D›qx‰¾­zëýE­ÊbÓ»kc%P£©Ë ©‡uöÎã#Ñ•È)²YÁN³ëÉy“,|!rt Cðæ‹)p¼`Ê=2#ÀÞ²ù¦ö8qÖŠ©f§‹\r‡ÈŒ ¾Ã… ÐÎk¸PÀü’²¶Ñ /ªQ™d‘ÉÏß7V|Å•1'|OÈ~ðgüÏ~/Œ÷~DƒcrmH¾Ñ÷4H¨O/xB ©J/!ÅMÜß>ÚÌ["_öûÆê’މÒ5’O1ä¸e¢};s LÚlŸãÛ˜gÌ~7cn±hSHñvÿçæãVÁÞÀ‰ÈÓ#K¶Œ™K,t*RŠÕ1–ìägÖä€×H¬}„Z˜›pe:WU*‘½]£÷Š-ïK¶Â³7¾s§g¸žÓý±pÎ~]1Øv–´¬?¢™TS$épßGSm*ÿæÉÔ ´$µìö»î-LueÇ7ûŸ{{|Ã~ÃÞ€…Þl–uAÌ‚n÷òWŒ[.û Ã'^0±ÛùåŽOn>Æ,zkyCD;–œhƒ@Í TeçÆuC„ÞD¾,ûõ޾ÝK@ç\‰ˆ-©ÔÍ~!ŽüöµX± ßÙ€Ff›®·à#Ô d"™Ø ÏÄÍâ6Ô§¥Ø$”Þ~™er9Ä'a›@ß.’Èè˜?ÚRîl£G€[ŽÔȰκ u zzt¼è•â˜x.v᯳_XQèþó³ùçÅÖ|Ê´—$vÌÍÍ8kå ’%ì7i34‰ hû…þI…=- Ñ1JƒQ³cŽt½â{oÿÞï²ÿ?7[b IÑ „Çlm;Ã8àí£øK¡¶ŸX8Êã3·À ˆ„ÜÞ‹ì¹½ãrÌànfÄŽC~¸¹¼DL>ùèx±™‘˜ çÉfCRõMpä<Ø7X±Ý"Àx…Èë™qßBº9ÿGëMÔÃ@r”n‡f¦=¼T .+¬Äq½p¼Ð{ްãº?ƒáÀrø¤@êxà-,¦±­§ã6)ÆFR®ýhx8G:ŽÌJx¼€\`KS/ȆZÍ~ëQ$ Ms™”p†å¢ça¦°3P;JÛâêŸýÆÇ ù„¿QbuÌW^Áoë]ïXMbLâZ¢"q9váv/ð‚[ ­øAw¶?·3õJ>MèÜæÊ«“8¤[ˇŒ%CªŸàŒKü'Ô“´uoaÒ1ö"þO¼ë;1ÇŽƒ³…hû~¬„8ñåî‡èK¡ÃÀåî_oBÞ—ý%Z¨\Šê‚^€ÂçÊ'‹òHôž@iad»£³%¶•‰®>­2‡D#¼iSÞu0^®Å-‹«Yéð·=‘@8ÓE€[_$N.B‡è™áÁn@Œ…ºj4¶C¥REw IDATa&z¼‡ÊY½„åRÈÞ»™u@ö‹2í˜ôB–K1p¨=a¿ð5 ¡Ü‰; ã]ˆ\Å~ Øøä²ÿ½ã3+cÜà6²0±% aÏcÖ;]n"b¿`o÷Ž c„²èø$t-ÜiRô{Ë“@-wåÙ82軸‰1p‡½/ñÿ[à¸ã=ÀÃ㥈dN2CÆ\Â1ƒE¯2´;5L•Xï}žÔ”åèêÀ@ðY²•yý¹½gE£ç 9Çè`Ì43,\ãl‡á7Ó«Å#ßȵá‹ zºÐT—pu ÈyãlKuʘ0Fô½_È cÒm Èpˆ„Ãÿô{?ªÇÄÌ“qaaßʼIràÄ5’"ãw`›€à˜²¢x4Æ&-wÆo ó6"ºÙN˜ê¯{_–HfØk {Q4ØLZö7I¬컣ãuίQ@Öè+²(ÆHã­×MDƒ×ˆßn;íïG60ïÇl®Äz!'G@ã™ Ÿíx ¡ê ŠJ K3ÇR+;:Õ†Œ1+Ši`ø˜¶ò¨R?iÕ2=¸vÂ< hvªÜ`,':¢Šhn†D ßFM&aG´²a¾ÆÌ34y› È«`š‹&¦1‹[÷'cÃ³ßøÒÅøÝT3ÿj‰µÅ¥X[û˜ynLu?[LnA@’ÒúFAã)±}µUls¼FzCÀäûœ·9™D#fãPB+o¼¼¸úPšJ&ÄUž"kJÚa—ùqiè¨ ð“$«¢'Nu³`"Gâ.Ï`Ègg –œà obðºo“È wvn&mD}‰ØoLçîÝ1ÛídLç’ÿäÿGÜ%¢¯ËÞæ8ÿ宪¼ý¹½ œ Dz¯xÇr#WÛVä„nÅ&ÁµŒ8-ˆ•nC)qˆz%ßÔjÙo~N†`óèð(6lÙ»™xÇuõu¿,’ }ÿ£8 Kì „„9ÄËË>¤TËíϸYÉMF.\mú?@Û$ò[ä<¼ÉíŽ \ˆºM†ÁE¥¨Æs-18Á\As²Ú²í àƒq¤ 乸NåÝhœp”y±^t,â“#a*_j†ü#IŠò*Šž ÞÐTÊxÑ”©3ܨï#ö¬’PÉùËqLo÷ŸÆ6'”5DéËïûwÖ†»oK Ѧâ˜ôÞg–;î󴘑Þî#ïŽæÅßìGá¢úAäÚm„Û»Rð#ög‡ŒK¬ÉT‰c²ÜÅF;ìé:5sâO—;36÷“˜l-“—„·6¢+øn-h!jILàBuÁ6î´¥àØþD;“ü-U·ý¹b¿‹´ó b+Ï:ük&¼ ‚‰Ã\|#³ÊSé×(N>õpè ËyN$¸ð ø¨p{mŸ—ŸðÑs˜ê„+ñ+È¢*S(ÅGŠ fÒP*#grh†ún’ž°‚Hò”꺉ª¾ñK¿ðëãî+} 6šS—ø‹ Œnm_|!ê÷AÕ÷Òe#À‡_ïðö%X›ä‡Áh…Èžø]Ü@h7§¶úçå;ŠÜýŽ ¤I¹òöîÌÆ„ïEç“UHΓlxÝ»óçd&Ä—}›øK˜ã¡¿g–ý¨% ?ù2ghCbOBÿöÞ$FšäÊóû{l¹}{-],.]U,²XÅ¥Š;Åæ>Ímš½ŽšÝjA3 Ã`:ÒYÐAÐy `N $H¦G·†Z-hzˆž&›Ks­úö-¿Ì/óË=7ü³Çgï™Y˜{¸GxdæC àáanö왹ûûÙ37‡{8Ó°ïó¼!D‰¤³¾ÚhêÖkjø’M=P4G¾¸(¥_²D2o] ™Ì’²l&‘Ël袗yºsʪlÉy–ÕhVK$g°ÊMHͼ.j®Ð³‰y­ªu«”I”¹éº=Ï­¬E•R ¶«i^ŒSp—;‘qÅâw8ã+Ž©}¡p74ˆ\ôË|î1æ@eܺ‹‚Bæ¢5å3ŸÅ_tW€B}¦î± 0Ó†á±q›’ î0êÓíBU(2çáMR˜Ð½Ç wÌðŒ¦O,%ŽÌ&έ¶ôÑ%r%û¯¾_hPþ¼™(_Û9c)ùl¾83Ü"¼ZyÑÑ[}Óüy`ÑPÆ3`(AD¸ê®®/ÞÖ)%)=ïèF© ŸÃTî-%§l^#~¦§³}\ê­Q©;û)“…ô…÷ÉÅJ |Zûëi­W\Òoœs³Ù³H«šO‹÷ö¹dzª&!_3Ñ,)ôú+âæ†ä ª¬%è×[\$|d|)½•%è—žûåA?ørð–Ò™ó‰x8ÖøTåÝŽU¯o5ì³H5ÜEª‹Ã{,Ãê’1¢ã;yÌ“´ê±,‚¥-íç˜éXâÞF¼”>·agú‹ y§üýºÜPêJQTgÐÖCÀ€Zµ ̤\±ÓVLäÅyA”:†^ šw$b`ný0°ñ™(sûYözI9‹c*ŒVï5_ð¼fà,l.£vÎGJ]liObVé©¥Ö³d˜öÔ•ùŒ‡ó–H ‰±…*-‹Ì ÀmÈÕ«FU[ŽOK!é¦ šå¨æZYßwuY u颎§)íá?Öë5Bí$bñ:jš~űü[oÀ—RüÌTY:öKÌ)ª_¶â\D¼—„ò…bü)_"Þ>Û ø¡ØoO À"_ê¹ëâ.72mgî+‚Œ}Nxà.v•YŽå?épŠëŽž ÖN€0vxl-O0œ³C&‰BiÛ¸Ìi\$õtÛ‰Š ‹Zy1ÌÔ³ñÞ"Ý·Ÿ•ÀÒ\´Ýe{`©•nô2^¾ÆU‡¡/Åas Ëpô™q&Vÿ‘ý™»ÏýýKdì_ÅgL€±MÓe9phcK0ý'îC³"¦-š,ä0ÕܼŠêHd½Œ©‘»i¼£¼·ón‚Iñb$>ž2Ÿ„U×Ý›Ò{Îj­„}BYe¬²ºÄ©ž«·\!³xÀ)LÉ<4¢QJŸýëX-«j\ xÔˆúõÖ¢¿¨i«.–#>Æ9—•ÒÜŠhNÎB…4J¿eg)kFв¤šžx#ÍBf¡ßȱÜb¥Ì5û(@)™½¬xYøçŒ'ŽÞÉaLokGœo„èרÎ/„—Âc¿bá+Uâðˆè5‹ øìZ­(Þ»  î"¾Û`É {p®&E÷˜2`ðOm”³Àâœ4ºÏ­t3.Ò­&¹ÅZÎù mìþ±ýÐöˆÑï„JÓ¤Áôë<| g/œx S ïQ<ô1Sp$ã7™ŽHO-s£îEõ3Ûgt7ãµÐ?9z‹öª*÷fëýÉ72• µã0ïÕ9tHhX!C‰ëBÊZ$Ñj30$6Ê<‹ÒõæÖ(‹êS6wËJ n!¶P¥yJû«¿¤gcí㈚IÀö”mÇÈ`2•~§Ýô¸ìTÎòoÊ!¡Ÿ)9Ïhu™²6G\^¨QÛBŽÄ‚~yà·§Ð7Tk¯‡Mµð»¼ôK‡ÐÜÚ‹÷öXÈw…©×eŠ'~ùÑp#·¼ Zšh¹«¸Žc<Äç÷f¬ˆÌÒTëä68\ü©u¡EpذgƒO,ì#›ÿ˜-ÅWæú羌s?kÃÐ;“rf7°Æ“y;ï™ÛK…Jp¡îãÁ]Ö²”aèuPÙ†˜h‰_¯ÄùË«¿Vxó¬ë¦8ä1cþ¢›Õ[PKð`vRr˜¥²m°R)iIËÎ"‰UHtu*Xcž6lO{¥p Ykþî~«¤µzÎÞ³›¨Zâ°î,j¤p©÷Ì/ÅÀ•é·i§d[*+X¢”jÅé£jïB¨^úÕÖËÔ'”?wåÅvHJÀ¡N°xé)ÒYWJlPé¹OUâ>o–bÑö¡9ÏÅ·ü@ÂZ{s›9Vѱ´hÍçTçŒ~…V¼Ö‚ߠáC'šy¹‰øY“)­ôcÉÆÍDd¥»1=¡¹{¨oôX˜ÔÓ9{­pšH­# 4LBíˆÎvê!Iô_gtsSoƒ]JªA¾Èáô™e¹¤ýæm aF¤ Öüà¹ÉÂ=ÝJíu¯+Ã…÷æEI-LdàYŠžZD½¹%Ê¢¾òQYôçÔˆ©*Kœ~u˸%ò íÊGŠë°¯xî—ð"“a{8ásµ¹YBö!Ì. ØÀMx^±pÞQj ¦ÒK[A-¯•YîksàÍ›~Â’å,\QЈ)3±iº–c»Ì`—ª{Žwbiv‚Ã=»’–Ví´ç ¬Ú€ðÐ8fç1R°—6ÁGÈBDãMÏCÙš$9ˆ…¯À Õ³½]—·¦wä‚?ýÛqkMvækPÃU2î´iRªŠ•È¥#}Å!S%½)@¥¯{fÚžÐÎxÎ¥D9žø,x)g¡Ž ”9›·T_.Yøù¸¬|.uIÛ†Ú¦Ïìâû¯ eAkR{ê‚ê”rEø¥!)U#Áb?mGèW-ˆ%…a¼úˆÉÆâ¥GcB¡ŽVñlI+úd D¹ãž©— lìw`QЯPó=œÍS 3b§H2¯©±A5=š+ˆ¬^<–kT ’4Ê0aáw>óܰ¹Íü3±qéXr`ÝÒï8N€`h)zÂ8ÌÚE`g¦ÚTïô«©‰ÈÏXÁ64· çU=š7qHÄBМùù‚XE&c·8Mì¼.‰ž\ {IÛ»‡òŒ_)µHæZFïç?#‰¹L5ãŒNóÂ}îÓ‡1çÒ¨ÐU¢Q_ålvË¥àæúÁ‰bª´_ÃYdkÒ™ûIqw­išÄ.+)€u,Jª)9*t—Ò>he',‘~êrñ=ð铱e ºzúÕ`àÍVT„+£?poÿ[ìjť߾¥_©Ü>`ø“ÆÛIº[÷ ;pl'è°åš¹IsõÜ/]¾˜3„éõ?pgk‹`{U¶ ô3[Ÿ‰»tnëR–‹CFÀ1pZ >vÙê2Ý8 S-Ä”i°mÑè§À{Ñÿ­2•H†ê°â¨i¼|È3' ånsÃڿˆ3r·Žp·½4.tˆì°´W2ßáâßÔr¥MÌ$D¹3–[ã}³–¬*gRöÀÐÇÔŸ¿§±Ø‘…eç·¸õR¼¬²y¶D«äRpsR­ŸÍM«[Ü83Þ€­Zbæ5¶~ænÌ~†‡<¹t…çà$ED~”’PúPV‰Epg.^ýåe`1?‰¦Á†jg6EÓ/ôW̆ÛÍ´Ó&4çZåì§à *¢g»ZaQßw®ŒÍn&¢uÅzH†¥gD;*?0³!Ó.ƒ7^–±À, §ã‚4­bÕaÕƒôÐ5±}ß~Õ_5è½ Ý ƒLdNž>LO çvq¬ÂtÀ8ö€¾%aZ’*·eQt\¤ÏYMÅ9›ި¥ÑxÕô!ú•¹«dS›j¨Ö¢áÁØî[Êœú†^kÂZ‡r潋Æ>D½"—ܲ0Ì#†âçrʵkÑÄaàg×{ÇŒ\UÚ -Té 2ð¹œKY9॑6“yD¦ªÝt½J!b]™§S\ !׈å¥Èg!%êr§3’`vön—’D·§1Êô3³N¼ O:6BÜkTÊJT–^ø* ·—7[=@@Ø@PÀ¼â4õw`ÁoXucÑ`¸•ê›)›¥ˆ80Üø'_{‰VQæs˜E´Y Æ0N>ö—nêOPÁÀ^Ž‹˜°ÁÀ —£Ÿ¡ßÇz.F'˜L04Èí#ÁEq}`lkÀpìûÀØsÊÍ:òw›+¯YÈ ®”sÆ ¢mo_åêi@òžPdyþW—5åĖصA~£fM FEëZs-ú$ò^µé¿âÕ‹.µƒÐ9VUÚ[!ÑW™cÕRâÂûXÜté.åÒÉÇM–€Ok'ˆHsU^¸1®À,R™ÊJe•â¥K),¯–²Úå,ÎQM\ý«åé=$Ž‚CÀœZ-‚£0~5úzA×ËZ^…Áè«Ã&?Ó®¹BxnÚD„¹KÄNTY üÒ„çU`Àì`ذià1.îÂÝž¸êÁÅò ƒáméý=J áÔ=°Ü»ôì´gža‡5÷éMb˜‰»‡ï³dÅ6-’<¶BB¾‰­‚0,Ù­ØîÙºPu_ùƒ¾FM¨ön»tì|Ýž;?|Õ`pŒ°¾‚Ný¬nÀä qrLÌÓÃW€U` Ø6€]`Ç>$vµR¬ißF_Ž")§¦© ódªæÎÛF¡Þ—Bæ)F\oÕ"C–3æÌ%}ª¬ o¯…(pÀm—VŒ©ïÖ5‡zµÊtuIíNLû­TVÃj5↠¹ ¡=M_d¾Q//‡ S{ÑóÒ¢gòA ÝC‹c½,—¹¹eî²XqÉB§``>˜"öÒuÇm}°ÒjÖg´5"zꊤ£¦>6ò¯7·øMÄËÀÞd³;ÙñÃ瀵䦩ýŽÜNªi¡Jee¾S¼èùÍ,¯œG€ýÒnƒMH ëUªÅçOYMH„aª>㙚pÚ“OÄ5÷¶KƒÉ‰Û`;½…êXVÇ¥)M¿! ¹ÇQ™ÓÊRøtk"@zÓOñÉX NàŸMMŸ‰èÙŽñŽ,sîÕ%ƒi.vŠÂì¢îÜb|23X›ògzûvi«¾;;šž|î°—*ñè->EDwtaÀÀ1ph°¾‹ X»€•5\¸‚ÉÇ89†™ Ï‘uÐϱ\4¸ l›À®ÍD¬ –©QCá¡b´Æ=´µÍ8g¯eÊ\› lñFC3âaà¢Oò%Á´hºKq% ;Ð+b¿ ^]Dz¡é’’X ~æV­^—zvÄm§—ßœP× @z>-4ï<¥ÑÎÙ´»ØÎ³£!Ià–Ðàœeáµ^j›/£ò)->ÏzyËjú6ÙD⸈ÐÇÂ/¾¡°ŒøwªJ]@(&Êò¢¯ û"š%h#Ø!®è¸`ÀqåEž¡bªÅB{nsÀ¸ÇJ!ÊÊ-Ã}HÕ¸Ýû9dÐËW9ñ^M³Dn\y¾~’QHo\³ ›d>Žê°& ±€5GÀ]Œ¿@ˆ,†,üÛÆ@1 >cm°v+«¸p«#îat‚|‚nÝ }ƒuóôñàwX!cCüÁÝIÔ’¡N’©ý¹êœpÒY„¬^Ëk¡ŽÇ3Sè©wÑÈBu>œŸ’üD¨pÓc%p÷ÔE2qÉ|íâïåÑÛÖÆ÷sFN˜1‡Y¤–û”°IÓ’®s(åÂoÍ I¼ŽDIñ:j)e!™¹çà˜,œ—TâFk­I[E¿5J«º±W“g¦gÊ*å¯DI¡_~û‘)>\€…«Í1Cl M¦–âE_/{¹W”e\2ÉÙ±PÅõ|áßž%ÃâŠcÕ†ö'-ÝL1Þ#Þ1›=aŠyÉ\op“V^Ǹý…ÅŒ›ŽŽR<œ?'ܵ3ŸÉtE]¶ìVÇ¾è¨ Œе+c­'À°œŒ°¾µ6.au—0âä“1L†¬“cÐÁÆ×&¸ôíSÁ{¸îòÈ3/\;²¢Te¸{àîç{8¾òÓ!Þáyž@„‘au鲉зÕxκqC¢A×KÎ!žz.ë4¢Ä©WB/£FÈ<¤Uæ6}ège å°X<ž*KÍí-”¶ÕkF}â½ú\j”Vp«t!m/¢tj IDATÖ­²¤æj›ÚsÖ§=Õ/¥IÙÓ3Åó+uˆ7=ý¿ FrÎÔ·øW#å©QMè)4=öË•÷úîzá*FÃÑ·Ëè—fÿr_–¯GÅö#w£àÞ!ƒ^þ ¯Q¸›»$„ë‚oyMs׿šo½¢ã5rÇVDÌ çCü}K<†ÜaÌ×&ãáCàÂùc˜ü)¯®ã裌NÐí¡ÛÃê:²=tǸܶcöÂgÆ’77Ü> léH\ømx“E ŒJ  ¨§ÑC=Ö´„€VÔ¾ýźjÞ‘&­Lœ]ãRÖ}OÑÄ ½lÛ¸($ó¼ù.‹MJÉé«Qä¬?—eñºžq9ÅÖha[·MŸz%>rßœxCµ´~åL¼GMÍ*R\YM"q*ÊŠ»õâ£K0þAØ-:g.5‰×‰•ŸM¸5E]¼*ñ»Û€iadšô õ¸)Ñï˜EäÆ,ÌKß ùŠwùˆaÆÌgX¸‰½ÆÏÜdÞÆõZI7˜¶´"ñÐB,–S3MØ‹…é5¶¼5iq¬bãX!žàpWNpéú¬_Äh€“ŒÉ‘O°¶Uƒ ¸0Ám` 8°+cñÓœ«1f;uŸÌYÇ#BW ãÛ#z‘8;:.j?Ò:³qµ2Ìþ93 X)Í ™SÝñ”+FæÛA¾·kU–ЈCDâC` ‘H¹‰*E |v2¯ uY²ÂàBhØ(’~vû'Êì¹5ÑEghXìPÅ¢JŸs¹©<hI,ât³Ê¤Q.cë,Vç³f±ºH2t`ÙL"éC¥QÙPšCâ%LL»‹UD(ö+H, Ü§ž(«çnôX„3sƒ‡|éÅEƽc˽|«œ iÅMÇÕÖ¬+œøø¿P5…J@?3ßN±ÍŸƒXª¹«…uUÛíý5bä|œØ8ð:pŒ0aý"6.cí«OãÀ“1 ÖÐ_ÅÚ1ÖŸà6pxRe©›dVgÃfJsËg¾:RgK¿Pï…Z MØ™·])ùóÌ´â_¯{¦ç¾D¡&ðW\¼èrSÏÓ³Dx |.…œz;7Ý—kÀÙkžæ2¯÷ØkÕ¨”rã{âYÍhÆJ´™¹ÿzýxá^ëÛFüFByêå—Ä²ÏÆ§ mk14ÃJÉÜ黥ìºó{éXJâ‹6Oس¾c6çyÄâÃbu+¸Ú>„L†mGltˆ :F¾ »Ùôf±d7áóùÒ¹]‹¾'v±èâñé“!.naxŒK×°~ƒUâøã&c V0¸Œþ ú00¸mxd[ŠÖOîØþ„µ õ–P¿¢Ôaà3²>e¦š”š[3$O±^—±Ÿ9ëº=w<ÅÛRbOü$%à7®‰â'ÐYg¨%4òÂK‰€ñT©æ¶Î‚ñ•‹Hq²K)°¤P]Mf©ì¹•ªÉ95!å¦@7Ú)9Ï¿œ…"-9Ÿk×AxZ$Å9Nϼ F®K´í­]5ãdzòúÜéåf'8’> ÿ«YNÔÝW»€Û踱DÂ'qHH4–s­¨ ÊŸso‡…»öžDë*enÔ7wg;ëØ/Ö—ãwñûæÒQºvÞS[ Ù“×Ïò…Û™¯opÝ8f–'s»8¾wâkÁ.#RMË`dçEO€`£0æ&£§ÑàþY†£=ŒGý>«x×û°ñk¸ <ŽìHDÇ¥GúLÜ…²æR1þ"°ìØ\b”IyÑ™Û^F)ÀÌì|5,‘F,˜ÂB°Ò½Çê=¶Âé×[´—´ã2‹¿ûÐO¡XB5åçl$e5Yî.¤Ü²7Ó¥CÜv^h•Zâ3ÏAæÖ"¥Ÿ]Ù+K›[´Íºiè|nI«¥Ô®2¿%š.=ÿ^[Ë–ÆBL}—)Ce´Nwò4?DDÐoYË&‰™Ï\¾-T¥sÔ4¶ã"D×.p¥˜°€Ç³â/.3âåÌ׸ÊÝ|„¡àîÕá3i#Î:¤uXbáèsÎÙžŽ›ê§¶3©3öéºMÙS{(LóxÉ’CûLï¸êqt—pñ*kèöprˆ£}dz+èvñì»±¾‡•{¸l‡¬¥¼ö¡æÐÓ†yuøÇøò ¡8ŠÏÊ § Sè#†?¨™Œ;Ü W„æ.DWÙ+ƒue¹Vð-DÊÉ´&‰)§J5w6R÷jÒBÈi§¤ªÐx.§FæÓÁ*.‚U;§Èé.îÈÒYl± ÏXzedx<-oÁtì¯pé䙋R¼ÔWM"úâ[P(yêw5ýò¿À.Ô^ç8cPªŸû…«@°ƒ(W¼üư‰¸™zƘ£-bl\´0ê‰_"^6bcÎWÚ2¡H‘†“¢²9K£«œ±½äfØO~HG=ÛÌ·½œ¦Õ£<©Öõ†¤ k\²³aS” Â,ª9²¶=Nö0:ÁÅ«XYGÆ Ë0:XÝÀÕ5¬n`ãW¸ap؆LçŽÛ2÷mI¢Fód%®!ä; z‰WéÂ;œKîBvmP]LÔ gv¿ö”B˜*ôÉTÝBg·ZHrêÕÏËÛqÝÄ¿!ΟªùÙ±óဳ#g§W/PfZºýó¹i®½ÎBO¨±ÃGòY %—úŒžJ°ÕDÊ­B)Úö§N¬‘̨¿ôדÊê¸D*X®T]8pò}etyÀ™?¼JDA蛳Àïˆ~‡,ê›3~ó†| ë&à[@"ºñ'=Úæ\Dð¯gâzrb×ì$l+¶Á,Æg;wØÓÂ]Àcfÿž]%«Ç2[ÛKdÇC>À3מ.‹•çÈ& 1<ÆÊ.^Åkoââ;èíâ°ÇFŒÍ?sUåí ·Q´Pÿá§¶n©ŒÍ¾î(ëéEÑ^ÉmÛñÓFsz¬ãé1 ®¡>ûDó‰ÃõžÄ¬ªIÄò‘!ƒZd*ý–Íd±²DÄRJÏR^ÁìðޤÄÓ×Rh Ûny±Zd2ëk–Úc>krè7]“ºtÖîþ,Ò´%§æßÐò±ÊJ\½º”×ù4}îd¾W1Íuš~Sb&ܡ︟L¥Ä4³‹?JOÇÕ%òU| Ú1C\z{-§ßÜ®ÞÅ&j‡,Ì`ÛŸùòÉÜCøÂË=‹ñßR½ýrUù|ïÜ­¾·•õ@7;ÙsÂ~òpΞ î0 ˆ¥÷íºÐGÀ±]äy äÛ¸xˆ —1XE·LJÈsôW°q/+¿BçîO€Ìæf”‘‹q jš¹É<óVKïç$Fmèd¢?À9‹±‹…âøü'=¥Þñ„¶™ÏzâŽc|ßDƒG=Ó¢v‘ñ‚椉²ÚÉQí‘RÆñž¼3æ9Oi­bK$MŸP5¼x> ¥Ð–{óbÁ$îÐ{¡×Kƒ!<ã0æ}µR‘¦ç>®IÔ!Ö»šCû¡iºÆ¥G/fªŸè=^+y%³|KÛÅâÕïù‰YõºLCâÛbJðXMÛÎ}˜jNÖ@|2f¢Ž;SºgcÅ„Ü;½¼Ç–ÅšXË€“c Opùl\Bw“1&cìÀ…Ëxåcèÿƒ¸ì'®y·Ÿ° ÑÍämž7BÆú’ .ïªf:71BÜa–¤‘>N1Q9GÀ˜§^>W@¨¤í E{/©ËÑŒø¬}ièp~bz³ Ýj‘²þw£Îz™ÇëåÇI‘Z4ôÞ^ÏGæ/-±y£jÔÀ˜¯ß.ç2)uHÄÅ!ª®du ÑQx®&)—Åúüôr ”« µW@§ØÉzÉV§P/R§_ûõ2pd0^0¯B×Ë‹…Š€'ÅG6IQß!ÃcÁ¡Z¦’®BækJ^5^ýŽ]¦+úÀ °b‰‘;÷¶ÇXÎçó´Ç\È#[šŠlXyÔtìc`ý¦§X3Ë·„Ööp±§gŸî1NΙñŸâŸÙ‚ɱvY†ñ ÆC C€ WðÊG°ºŽþßáà1ÙA G“n¦5GÎfP‹·Óz—ƒ1Ïn¿â:OùfFŠç–±yD]„ôµxne½¢!9.æÛà¿z…ÃUº’q3Š“º.KßßZk{eª‰–Â¥_.›7-m>åg‘æêU7-ówåÏ”Tê;RÖ«9!§Âí,vn› ©qH«m£cSqWü¬ÖO¼ÌÏÍ[\œ6ùÆT­8šzÑW¤ÉÂ!ã^C8cwÙC§"sþÜï„eBK^åjç±û‚_^}Z°JÔ]ß;uèIE9wìÎÜÖ¥àÞU`XêyÚ.°fÀÈ:±kšÝMu$ऺ Ý­)a 8O|v êÐ2BÎ…žÎ-Åu-ÓG`ðÓùçãm\:ÁÅkè e˜Œ±¿ƒN®à}B·‡Îñ+`‡õ3»a¸(Õ¨Ÿ‚{u;ì(ݸ‘¡+‘'¦˜a¦ã¨ë3Hè0â½1ó¥ÇŠí²Ü˜˜,r‰®æTP5’U…Bg/·‚4]b«ð¦‚&³(ßžŠŸËB¤¡Î¿Ü*ïyy%t“3j{ž¯‘ŽÊÞ¡Ó%î3%R­èR9×UDåæÐsæP÷R2µ¸}Ñá¡W„~õi›2œ_|sÇÝ»ö˜& x¡Ükçe,s>óÙ°ïÛ™»Ó}i†3Í¿¥8¤xÑ‘®²Ö* \Ö27=ÿI‡³¬Àà°j·H³t ` à-U=´yò°á{wîØê@Û{Âyl+Nœ³§ ij®à@ÝIÀæBó27>ÿ—Ø[ =L\º†nù£!öwàò³xÏ` òá:°ckAÌó/Ì>aÚæLCý„­¾ôi¯(³¼ W×½Ô‹ ÞlsöS3pÆF h’¹ãv-Ñ'ã¹x¡=’,S…ôôQABuÔ—‘RJ*«ì!K$‹åá†JŸê£.‹,£ÎgP–€ç,§˜·ÏɲP:;ÑÕ’[ºÚŠHÈÊ»,¢=°ÔX©†Ææ–g¤ L}àbLœrC¼ØIÀšü ¶¡•„ÏyÕôKÜ›Ùož9`°H#¡Å„-v5qßñ«§›zÍ¢¡—›T>OOñÞuèÉÞ à2p ¸ ¬+@ ¬K¶´xòpÌZÚJÕÚÐëЖUèC Guíž¾5Ÿ6L3ŠyÌ–*H‘dÁö…î¥çi-nsî©€0 Fä‡0\¸Š•5LÆ8>2d\¼‚—^G¯Îßàm`×B>!½˜»NÏ!‹6âߢ:ÆW/¸C™kXo?I¡>bÚÌe`ãvuÐS²²+ÌmÂÅ«sh ª.©pSÀŸ¹­“®dœÛÓÕH—ÐÈÈ,yžq™j®%r~Z+ç}²¬´€ç|VœŸ„…”⽺¤ýÆO¼ˆ·¿"iztóºL‡ô©<øüʾ¸¨Wß§X¬5cuä^< .TKÈMˆ d/¤Ñ0ȳcû9 ¸å…Ú"™(”“¿Wô_b¤ jŠ5ÎçÊ ß8B$e$ÍŒä\V– ?æ¦mâ EC9ŸKei•yR¦6nââ8OXjh9ËrÖ®Z}JL–~1òzTõV¡‰0Kžä“Mdê£ÅË{†9f{×¥Äc¿S#s}}îß{*‡kú%ž0î1î%À >ôBxÈiÖÈ×ââ–)â®}`¸< ¼x¾xâ7C¯ƒÕu¬¬ãâUdŽp¸ƒ'8ȱ {Àp c»dÅ i 1¼–PS·¬ahêåOúÉ'“kž‡»Í¡.g#Æ20lÑ´=as°3»ç©Gpá º=íc°‚‹×ðòGprˆÑÏp 8`“À3Vœ±Ao®¿èÀÎ&67qì;À!°Œ#[ ùZp²ú‚=§J@¨×‹Êƒ @A:,CÞš^³Ä\è{WS1=ÛØ‡{ ×­¬ù“-X¿ˆN'GØÝB·‡ËÏâõÏ¢¿ŠÞpØcÜ8±ùsÉYé|f!†µ¦æ[ÑIŠ'>;hñ^14|B±:= LT¬³ûñflnon`íÈ‹(%"Û WKî<Ÿ‹Š†Z8Ttå<º}4-e‡Hj”j%.£‘ÏeÎÒ\g®€—ô’qúÄëmÏîµ7-M÷Ÿ¦«³XåçÐXSݽG¸AÕ”¬Þ)Y¥ŒTïtM2wC#\D —$ œ±LiÉÐËTü‰ßŽûoÎò¤Xå„ÅÓh泞ö ÷¡_nBáÌÝÏK/„¸kŸæÝ®ï^Þu ï~¯¢7Àê:ŒÁñò žlcoobw-F¿Cûf£¡ ö"ö€cÅüöìhWM]&F#^Îx]†Ä°vÝ ²›n/:J€7Æ•¨˜ç6¶ktû ÚÏ º;È:0.`ðdÝ>.?‹×>‰ñ£¿€}kê´4õšëCÛ\[Ã:5±€ÞŒéϤž@NšÎiÜ«ƒ÷×Úì‘Sì@ý¯&F±'.Ü’u¹’ÚŒúg¨ÜP‡Œè&Fâ’hœÄËæ, 5h5IÑ–oÏŸ—]–×hKªöÂ¥æp] 3Oôj´7MPgù$iO+ŸÊq"/ýz÷ÏS"¦ž~goGAž|?§_^¢÷Ñ$° …§."À^2÷[Цæèœ_iÿÞ¨™À#¶ØÕ˜í焦S„“ùÊ(~vì ÖKÀ À«ÀË«øÐ§qõy\y.žàpÛ÷ñd»8ØÅÁ!v žÛÀ`ß>ë{ìNä&XâÓ¶iu+ž Ã¶V5ÕkaB¸1 lR»µ7C!œ àZ˜pΈ:w[F1&¤á“M\~ke8x‚ný.?‹7>dø7?qtÎíÃÆ¼«ˆÇhaS6fÁÛQt*^Až­Þe/ƒqúå¦ë¸f¶G‰© ºMõ\ŸÌ·‘Ì›æÓ§ÔµKd+vFt‹¤ñb°×ne¥à©ùD®Ì‰9¤¨êQº5Ϭ³ç½ œË¹x¥þ)еø…ç²p™Ú M4SJç9­Ý#R¯SSå&à_Ã[JÊ”ýSµÀ‰ðdêgÈ÷®ñÏ› ÊÇåŸPàQ52E÷Ž›-X>ºîÑå/øáÌW„Öu'ƒhÊ'œËØ­u|xx x#Ã>‚÷ Þ¬?…ÚGwðð¶ïaë>v'ض‹ZíÙÙÎ'l‘ç¡`°¹¾´.‘fn8ne;n¥2fÌÒµ±™€-©­±£2§<;V+®¼ _c„C9dÛ096.#Ÿàpݺ}\|¯'07ðس­Ï8èZ¸Õ$ÔäìÍ»gQ=PÂÓóa/ýŠ¿2V}2)óæãðùغ¨ÒC"N%®U$}zþ¤‰ 8ϼ8¸Fþ@u) ]«I£$i¤ôØÊ9D2¬Üô-´a\–NáöHëž>5¾þRË¢ZálÒo5lK”R.K£þ QHK†É4?Wˆl$ÚБ“[܃Ñ%£RÆÎþzX¨JÚŠ¢37ó®Ê‡ë&êHOÀNØ”Zzô7w)‘W?cü[(©z=`<<|xë7ñÊGðÂk@·ÑÈ<Àƒ›xx›·qwÛÀ6ðØÒï1ƒ^Îí|agͨÆÖ—V´âVê0µ‘õ¶íx°4St*pnÑš$Á(TdR|øãÁÆm£œ¥éæèî¡Ó…109:ô¬bí]øÔבÿ¾ë×fåç.+ZЩa¶ò2¼¶OĆðe=6a«S¸'ì,£s‡÷XÚ£/ úìãu‡ï§>°šœâñ‹ŠTq’V£\ø:^h©”^©ÐašºðlöLRr˜zcš¥¬z›~yåt×®i©€[âÔ–’98ýó”H]¯ž§É…´ªFsV¦Uuç2ãy×Üi›ˆ²B¦%grbn'¾¡óŒ¸ò™*B|:¾ás»ásÜ#YqïŸþtÍ$û¡EžÇl›3$ÜÚyY.CróÂ*Ö:À ð ð"ð&ð™Oá/ï~ýul]Ç6ßínâî;¸÷ÍÓG|)ð;Žì]#7®;q¡‘C¦ød.‹ªéöÍÜq ø¬í3#—ÌW4Ü *áºF>Þ4T£{üõ©Œ`#ë ÛÃÉŸ`+WПümÿï0[Øt»™q™¡l¨‰Áôáñž_F%«T[Ë„>[ ‹¦…k¬ÕW-~ÊëdZ¥PJñ—W¼€q7BÕ¯ñb›î‡T«QíšTðšBÍW*ϺŽj"“ºP¼F©¥‹¶­R ”–4q£:ÔÀµô¼zê§Œ#2µOWóþÏe±²,-"º_CçÝÔl ÕÉf×6s¿C Í}k¾ß+”Ò˜ª?tÔTgZàGGe µ@1?¶Ø9v˜~E P9C mt,ž­—€ÏŸø,^û ðê[èo`ï6~yýáuÜý%ÝÅÇxl²¥­€#àÄFzsõSX‡^¹ï«y~ªa)YÇKÞŽâ…@ÆÖ—~æ*7°È„b¼{Æö´MOw٢ʜ䩸"ÆÀ¬]øõÃÀ—^Âêk«¿õ{Çãÿ Ã'¿žNK‚:f®žPNuXú̵<·-¢ûù¿S‘7tî¾ÐXÍ‚6n†ÞóÝ« ¬¯l^…#wyaX„Uò*Æ{c)ˆÕq©æõêûK-ïñç,-–BjQ&1‡¶¹@­jˆs Ië¦@/JN'âkäî8{þm“ùè\™©š+´BYÚŠ³˜6u°¼BA3žÎõ†;øvØà¢éWü+6"E @ Í|æòÆ©¼¨©õ7nË ÑFοü¿y¸âƒ aOn þ¶XØe®.ïÞ>ûq|ä—¿‚Õ«¸ûopëû[oãÖÏñÎñÐà° ØÏ¡}ï陳G|Ńʼâ€óæóš”s,„»ã†mé@ŽŽ¼D¾-´-RvYž|R·—ùâXp#· 6c` Y†|‚^»°~½ÕãÕ×/~þ;{“ŽŸýÚ€¼dnP]62iË#À`ÑWaþ´3˜B"@±Ãš†0£þÌ È߇äíÉÆý ÅÉ$Ƶ¿8U5íkä• _÷Û(O½iõBÇV£…ÙÃ;hRYÚàFNm—y²Y¤¬ÙïÑ5ú çÒNiº£žð¯åìœN¡Áï6K5õæP©9@ãÊm47oæ)žG©ê{ш~z åߨ#4.ÂeL¤ßL}:ÌA-¥›\Qt޼ñ”¹ i4‡–ðØÝòѹÇ_HGùÖœð»@Ø^> |î |ü€7¾ /bë§ø«þðøå÷qûî÷€m`ß.puÂ>#—{[;Â!^An MYÞæKì„Ä]9«¯Q­±âëc! a,G=îrÍüqoåO¡qŒl ë—Ðí!ËÐà… À¥‹ŸÞøÌÑý£?ÇÄÀ°A‘>Í\sñAw3 m‹¦炦D»< ui1¢‘»vFÈÜ*„8Ð Éüv¬/D^ú'`œ«unz[§©æ$¤³V¨EBR¯g<ç§…ÖÅ®ódàˆsÈaáÕ<—©ºΡíjàZ®í¡¯6ŒáU–jÊ'Ò´Y–×ì³HåZ·§£NU#¢j¦6âÙ¦`s¼ x‚¸Uº@W;ݼ r‹ueCÕç$èW`0Ç$ákžtñoǧ¿ >ÁèÓ1Uã‚Ke ­¼f@è«Ào¾ðA|êëÀ¾«¯bçüìÏwÿzçÿoÿ·€Mà°g_hT¬íÌWäâøjnÔôKÆÑT•ƒn8øvЄӝ°okÊ?ôˆ¬(ÅøfD ÊÍÙ:^Z®R׆߻#tÐí¡ÓÁ“m¬ÝÅåË÷ñÂGŸýÚêgö¯ÿ_3öè±—?sÅàf.º™P˜'­à=éÀò›-ïö€F©AEè‰ë‚Ká6PH8ŠCéìeÅÌ÷ØB¹ IDAT¯7™7Aüj6;2éÃ5ôÂ5f¤ÄпYrZ½ù YKdn ¬ j³•Ú04P»Ì™*K‰wøonR€Û܃g—ö EiHùe4HÛˆ=‘ñN¥ÔÞ-u†)EÌž ‘§z“|;‚FzJHGÐohåg°mŽ‘ú'¥4ê@žž+IÀK¿€iö,ŸëËë"ÌØQŠeì¯â½¾WŸ¿†¯~O| ¿ùmáÆÿe~ð£_ü ~ú=Üãðرž÷íœg1%[¯ŠÌyžï£^F ¡C¢wÜÓ8wƒ¨` ÞaxLR3Ñ>µ˜? ¬']k ¤ùÀ=êuÇètÑëc°Š'°~ýË[x×'ßûûO½=üKg-4nà$,&,PA|ø&c±k¾B¼×~˜·{·²îØå¬ét ©‘ùJÔi„èž"œá§JäªUÙOƒwJ[LÍ9žÉà ÞÕn[‰7£²î~½xP#ìMíÌÕzïì²( m gz}ΖèÖ9Ÿí—ù3pÅÕ«üÙ´R2;ýžKe™ÿEœ;RÜ9Ö÷uÁ`‰E†Ú9óR®®i¨îš~óŸé’WSP4W˜@‹çL|;Q—ðSlh«­ ìã¾_¾ñ]\ùæ'ñÒocïÞþ \ÿÙ½â§ßÃ;›¸mÑwÇ>ë» û:_£=6¬"TY°¿8LÕIø!ˆîqrÐÆߢQtÁÍ*¤çÄ>ÂÚµúæ> dÀØî$%‹>vlãðÐ/Ô8°ÕÁÊ:ž¿vÞ…>ñêwîíl~†Ì ¶S/š0%‰áI[>ùêÖe DM¹þúóÞ72Çoú9±êéÁ&Ê„7«n^ºîçü_ïõG ïú/Då2;º¤è)·rγ,\ƒWK÷Jí7¾Ê–=ªò8ÂüåÔ bû}Î…Ûù€ƒ2O®½ ùüŒrµMÉdéÚ1$e£S÷{Ó”2WJ)é’âî0N­Æ*¸wˆ›È‹æ>tœCäYy}t~¬XìGÁ$~s5ù™Ç(3U#Ú&ôí+À»€7o} ¯ÿƒÞüÐéãÁ÷ñƒ¿¸÷C¼ýCܾ…ëÀ`ˆ|‹Ïpl§àŽmæ¹Kb‚íÅ …·±8PM½Ç‡pôVÊ|-EÛ|vzÎZîPTŠè‡`9ˆ˜ªX¨Œh“#:À‰»"”:@ïƒ5âñC Vqåâ_ãÒ{ðÆw?õGÿýö?ÃÁ.ÝÉçpG"2¥*éCU£º‹Gy¥ˆäE>SÛ‚ÛŠoëOÆ8W-È›/sÍ.® `ÇŠS5s¿u‚ô¦×tž2£&‘zE†¼™„nˆètܵÏeIeªÒ†Ó¿ :´€[{±˜~´¶úí‘ÊLRûøë$eà¹=}&E“ZèUtêÍ E´‡Z¶RÞðŽ—¦¼¥‹Üâ}CP®†a®‰Ð!䣃E½2å£k”`ƒ¯~ã\}8*ÀÝÕ)øj\^¾yïßCöéÏ Û¿ÄÍÿg÷ãë?ÁÛ?¯ €]à p ÇìÕ¾Æ}}«Æ¼P3Å[ ©Ý‰âmea|ÚàÆá ×±¶2ŒÇà®V%*Òq›¦ë®‚ ÎüE‰= ksèôwÐí¡ÓÃî#\¼…îso㥯á·þã/ÜùoŸüOí?FlôkÒq;‡@®ƒàmÃ,°_\de¾4/š¡2áÛâRÁ`-Æmq] ü ß­¡7·Ú%~K)4ž&Ý×3pҤ׺ r*eÙç0"-éx­à³,KÑYÏ¥ÊwG}Tíܨ%]Ûº*•ž›v.ë’ôZsÌKÉÁ«3ÇE¯¯7Ž÷piãKÑ„—â…^ÍÀ8 6DŒûWÆÒ‡(‘@—¸w¬ÐWTs 0¦ ºëÀsÀgo/ýÁ»ðêï`÷~þ/&?½ÿöñËïãÖ!î-`ÇÒï˜é)–P‚ªš0Z–´ÄIÆ›CŠÿ$Æ ¼l9+ÚÙ‰VìÐqÓ‹Ià!¶§B©=]kŒþúìbgÏÜû!žýÞû…õßÿî'®ÿ/{ÿ ÇvÙmas>:sû^î?Q=_Èšôäyz8ÅàüS”ž» œù‚æ=‡£¯Ð¡ìm"~åᙤ÷ÕH&S¥Âý1>Q E”bàyÊ©^iy-*ØùÔ4WªZ£#e I>SÌ6ÏÁeu®]š0‚†jÒªÖ©¬Œ÷ÔHGîjÊRçcYD笡‘ïyrü[©àêŸ`>b(í‹{«£³5Šif^#0ÀÐÚôNŠx×uу íúö‰ß÷_»ˆoþ#àK€‹/âî÷ðÓïÝû1~ù\¿ƒ»À&ðxlé—–¹ºqi±Ü1¯‹`{¸i‰ôêRÞ;0ò08q¦m>l!–þæ(Hß4qºkŸæÍHÃ÷†!>Ñ}è΂îÚiêƒô¬aÏl»×ñ®Oá½_xåO¿¿uïçÇ¿x:<¡‘Õ¨á‰ÌÝß_9Ó-b=ø4ó%ÈÜþÀ ê¸MÖµ‘󜙗 ߺn„$NÑé¥Ì.ÞA„Z8ñ_ Â¸ÆTiO_»&§›ôΠÌß·Ô~Åõ¨ÅG€[s–¥¨û’4$Lqn=¯„.” õ·zóJ¦ahC3^(/’…J ѯX•'”ƒQ ¼Ù kbä€ÁW½¢Õ})1Oµ]°“c[¸üð à›_À«ô,>ð»8ÞÅÛ±÷ÿþêúñË¿Å-ƒûÀ°ÍÞñ{ÄBÖó±02§ßKÌxË÷©è¿ât©mŽmÔ‚†ýä+9 æé;v2s¦ Ž¬0)ý,Èy=`¬#»¬b;›¸òð‡¸ú¼øi|ö?ýôŸüãÇÿ †»¿fZªÎˆMÞæÜ›¹Ã4œä‹^J0ÃvÑ#^ñžÜ\œ‡kX~öy8…Ù2•˜šÒ«­>Ö[JÈËŠ÷Z1UR,_£½D¾ø¹Yö¶› F® ueOPá¨ö´li>ƒÞüRxäóÉy‰¤v#´ÇªíÑDHH±©N[búj¥Çÿª\®ñy™:)ÙFö{Ñ‹rÖ œ©—g쨸è<…oÍ?`45q8™p5V긵ëÀKÀW»øöˆÁçÞÂû¾„›ÿ ¿úþÍïáíḠ<ÛO±Ôó‰ú’Âz%j¯yCûoáSI#2ðfjï±<1IáÄ›ûºD!b6»VÒXûpZ¦tùQc»“n€#`·`éÝ- V±÷Wî㹟ã™×páE|ý¿xë‡ÿåæ¿À¡}*¬iƬ¦Ñ ;iQ´®=V×KXR›W÷1”À³2¶Ö¶-è7s³Õê-¬…þüüõv­°qsó«‘{êå´š«+>»¯Ü4i̇dR$]“&R’ÌÁ-1øŒ27^ˆ´ÖM—ÜPm›½h³,W•›n£ö[cn&bI-Y-—Äï%•Íâ’æÆS#9OŰxž^úåôÈ…fê¯LíäÞ³X$v'Ø”¥×oN¢`—ÐßXᓟs—3½¶ê° ÍlzÀ:ðnàÀ׿Œ—¿µ‚÷}»7qãç~‚Ÿý5~y€{À{â÷ТïˆÑ¯aú÷ã•·êÏ +Ð"ÔÀËÀ|d$glIØû—6E]` í›ûö{ôv°²Ž —qåÎWˆÕ«èðá?ûèŸüß÷®wŸÎ¦îØe˜þ¹Û™ICª X»ns á#Û"`qógàÈcÀð)¹žˆkH(±.Ψ²H`|¥Ï(ºâ&°ÑBY nm6K-ÒDíe4ïÙ½DÍ7ÕåXj9àS% uÊåêëíѶ¬&õjgÈËjŽ~³°æM·l¦\Ûˆˆ¨W<[ø˜okÕ›RgK9kÊÕ/þ ©*Àžš€XšÒxqn(l¢¾)ôj”™ª ÁÃKÀ‹ÀW3|í»¸òÖ+—qç¯òwö~þ׸ùSÜx‚ëÀ6°ìO,ýÓžùJÔ…PøZ„ò„5*´HeIïKñ",c€;j '}lñȘævÂÒg€i¬pbé÷Øúk±³‰½m\Üú)ÖŸE§‹gÞÀWÿë/ýâ?òßad‹æÍ4 œDÆ}#TECë¡¥Lý –ƒWôÐa#™ï£[9GS®H\„•fôþãðÔœçÉ¢ ZŠ®å 0k¨Ä–FdQð©ÏÜ¥ÂH¿øL­W«*ž ÀíŠS ç˜Úœ´ÇíÑd>RK}ãNgÙ|tVSýÈÌõõáZDžâQ£ÈOWdC”åu¸ánÄÕÚúÒûl8!ðHÏÐûè¯xï‘0…Q;ÁŠ^.¯_~ŸýÖ_FC<|øø6Þù1nþnܱë]íÀp`ß(KϦæ¯ñ5G}ko¤n ‘z0n¯ ˆ®··pxx Fž”Cng#YĘ^Ú\̂ØxŒÇqñ]9.ßBÿ—ðo®þÞ¿ÿÖ/þÇ'é4_bš~f¶8Zì*g%vY‹çnÝE]ô ·†¶-åÌU:è·kÉÜÌu¯ãšGr‹c*Tˆd⽈…ö”òæ3Wx²²™WH?©Ýhg5ÏåôIÙ¡·å’óð¹L‘…÷þô3°9Uëº ÌÁ˜^w­‰"æ#ÊJ?ÄË·Ü·ÐfôzÂÕ8—.¸O¥DWôŠ5Ÿ³dƒˆp±XÅ'óÍ#¥ŸV¸þ…Ï2ì%Ì&^ZžÞ¾ñi¼þyàùöòû¸÷ÞÆõ[¸Ü6`ØŽØÌgñŠ#À¥Œ¬ë›.!,‰då=y§â÷XÝ^Ôr·9toc‚$y Y¾4ÜP0ð„½©ˆS àñC\¼†+ÏáÒÅwÐ[Ãú³¸ø">ø{¯þéÿ÷àÆÛ'·žN„6v!袬++³%òŸÅ ¯”¶†î "°Ø!¼Öp¿ùà‘>ãMÚéÅ`qµ1áš ÉTíxÊR·”“"Ø*sÝ2a5…OÁpÀbåÜ&éRÖPSÓ·Íòç^ü,>÷ŸýÖŸý“Šñ1 °¦Þ\eØÄf¸gŠajxXTJl‡¬v¸q[G|„>\ o»TpÇ -—½Ž…¬¡>¥N•9ÐÈÂgá÷âsáÒ6k³œú®{Àó“F;Ss™Ÿøœ*µX`ÆLOi¯¦T‡jÄÚ”BSÒÄÓOý7¤Xµ™ŠD¨(gïG°JD(=\úå…zæ%¶³Wþ ø„:D¼€‡+YL”½¼øj_ú#\y Âìàá-<¸…›‡ÛCÜ6‡À.°o|Yô¸±_Í'^ W“æÜ©t8ŸÚóu‘K­`Çj5øbNüõT€Á(‘:aîÙPð pìmcû>.?ƒ++ÀÖÏÐ[Ãê5üÆ›øÊ?ùâvø??íQ¬›ÅMìê¨¼Ž¤[hø)óÕ—wQañÓ¸;y£aqR¹Âª´?2>UïEU·2mgî·V@keÔ_^NÇËÊ Zö@~žðë•Úy~ö ëUéP—Tfö¿œp’Ì~[j†lŽ—Ú,5JÜõÚö¬¼a¢xþ³W!1‡ôRª©DGEŽõx¡Ÿú‰Gi52åpÃM"öÌ—!q…æFŽ 4åuì#ÏNzÀàƒÀ—®àËÿƒCoáÁ-lÞÆ­Ÿã¾Ámà° lûÀ!pœ°ÀïÄeu£ôÑÕ¤%wôÄž,˜Müe,¹‰yΡñ‚Ì>g›³49K–Ù^Á˜¦@«Àþ{±³‰Á*Ö³=¬¼Á¬]ų¯_úú§ßøù÷öÿíÓüWØ5®¬áMLož°Zóõ«3¶‡{ð 1zG²ô‡˜¯ ÕX™*Å ¨_#"ØXЯÌ5ߟ.¡N•"¡Cj?³ªAZKNðöȹA–]Õ‚íì9ç<'ñÙÖ%sÀÈæ8Eê%ŸÓ-m³C)Ï#Ï‘N¡¾²’èb–-Âëƒ9p$ a°fo/¸†ž<;Jü2/çm9pòµ¯4‹"z )b¿—ßù >ý;À`O6qÿÜÀ]û®£M`ØžÀ0d.y«7æìÒÐ=Ôjñâ4öx3 áñdÎZÄ‹`€‡|r¶Û4û*à`8Ž€c`o îbeƒUôVî ;@wϽ÷óÿó½­{8¹÷´¸ {©•·ƒ©Á ¥—*ÑÜì}„xÏÙÌE}^}ã*÷mÀ`’_ÐBhÊÕ€Ûvñ!-­­®W¨ YnñK}©ó¥¯Ö.³«Ñh•´ÄÚ­’¦mršl¾¼9à¹J£Ü´ÔÎÀ§k—Tí©hW6Ф3ŸÑ2ÞÌk¤ßº$s?…x,fñ›Š@_á{K‡/ú¤³åN9‡ áßs0ö.û _‹gêcƒàðQà[oâc_6€Çxt›·±yîâ–ö¼å¾é÷„-yå?‡è·U·í’!)73¾>@MC‡älCcKÌ­Í'BçŒ<Ç–EO€#;úØ.œ`û±²†k+@ÿd]ÀàÙ×ñÖäóÿëã?Ç 0N€0´ƒÆíùºkôÛueâ"Â2ú’¨Ï mð\u{oYY 8D¼úz˜âX‡ÒÄ;¡.«v— $S+•r.óA‡ÄCj‘Ú j;Õ¨L«êuú¤ ó.u“¥p£Wº¹]F["g­¾^9ÅX`Õê*ºÆ.ò/…$†2f4©ý¼¾Tbæñ w»µ»Lœ~ùNþo¦þ5Ê Ô¯-¥ôè-„/½òj %µz¥¬W€¿ó9¼öe`€ñ=<~€‡·ððîoâ.ž>÷»Íb¿'68ã·wCÛ¶¬ÔxׯÐ'5‡TÃðM~Ôè¿t&ÅgŠèØ;ÓÄàU`XßÅÎ&V×±²Š>п…Þ V.ãòK×¾öê+¿úåÞ÷1V€5»˜ÖH);;¶Ü.›¹õõâ+I“2– gOS¤—O{O%4)€JÍ—Ò…ا@TJ¿Jï{Þ5ö‡4LÄ×ø?RWó•ÊpöRšS£UE$J{4©,Ë®["ÀmfÂ&«·¾s³^››©9ÝJeÛ„éyV6Â,2‚˜šmµ`‚77Ò’"³·”ËhSh,$cñŸ^Ê;yÑ=‰u>P Ì5)6ÄšÏúC^…EqÅÌçkÀG€?ü2^þ{ÀÇ·ñè6ï`w77ñ¸lí‚χî‚ÏV¨ÛjDßz¥–Ë…¦ˆ¸÷/}‰geu¢N•Ô16ØÁŸ÷ÞÖcl<ÁÞkèö±Ú9Aö6±ñ<Þø“~û¿Úº‡ã«,†LeÕWI7Nž›Ý͇iŒêØB¼'¯¸^~çJÑáù¿…èç§*ßÖjS¯ÆÞË mß~Dµ ˆ‚f<ûxkê¬"L¹+…Jôr{{FÐBRVÉSÀcõʹAê’Öš±3=‰•öÔAÜçÎen2gú-[\]bL?j!#¡B#Cø¥òñî÷fï×)SÄ›¸^;{ùSüž·p§ú‹îÍTšˆz:‚ØÜ݆ﵺzr©®•ÂW.h\> üî§ñòWNîâÑÜ»ŽûïàæC<ÄÓÉÏØû~ý†>P†m‰¤ôØL5h…<§žk¼Éx›Šˆ:?9!ër ¡yéôNà"nûÀ`Øyˆ½mícxsaç:öî`í¾òŸ¼ù%<ÛÁ° ¬ëÀ*Ðu åtÍû×®¿Õu{ +jáí?^÷ƒŸÈd1®\3†.Z~lÊe!TÄ4ºjÞN5õF ±3”>å®xgWÖtñrÓí_êÆTJâ4-í¹>Ÿ>9³¶\=Úž*¡ L½ÎÎ(ÍåljͼÞÜš–FU ZWõœ[ëÄψ Á„IæÊRc×Y•æˆDŠÊz<‰þ_<ÿÌìŠà“¦_¾?sýÅÜPq_\¼ì׺ŸP&³d²\^~÷“xýïf nàÞ;xü÷q×N{~È–¼:qßx$Vç án{nÿ)Tÿ+^—ÄîÇÏ£z5ñ-Q3ïÅšRô>^ ÀZ+zøØ.ˆu ƒGXYG½Ö×€•xô<÷Q¼ûsWÿøÆë·þÅÁ¿~ö_ú@×f¨«L¯Ã̇xøÛ¼hö²q×µjªç–?}h.aÒPq<[ÃBB¨P^ë™’#/:ŸteRò][JeR—>éÅ5'‰#MWvnöœ¿´¿^‘³ø\H"Wà6KâaYY®.5‡+]«ò™*Ú!^ˆ47Üf©fy£~ÎÂ0‘`‹.(¥”,êêy‹X¼·.þ—7M¼Ü”ž&‚Q`¥hkëd¤¡xßoΘ‡Ó}ˆºöSÄ~_¾óQ¼ñ <ÂýëØ¼Gwpo÷€ûÀ#` Øöìs¿C÷Ñ_Bqã‹E •ê’jgt¨ÊFŠôhB51ªõjSïÄrØ4½9cýD|ø‹²è3´kY =`8ØÃÞ6÷p´¼`âýûØü¼þǯ}/\ÃîVê‚ÝÓa±_Þ #ä)LÁ­-,êfÞ3‡óü;®n¡N‚À¿šÏuÇÐ?CºpE$ýüŠÆ¥ˆ·7FŒ3ÕeeáE)™ƒïqÝ›ÊÔ Úph°·ƒÝG8ØÅþ.pnbçmìÝÁóÅwþé[_ÅU`XVX8t"t‹•¨ l¥/^ûÐ_¡*{ÍÕqò* +Õ”z@(œ‚¾‘“È›ùÔ|B†5.3R«7Ãå•¶yz³\Î¬ÌØˆúð¸t¦$r±âµ€ë:sôÅ÷¬5Ëë»Kd›mRûM=~ªlŠFïp¥X¢””ªoŠ‚îB‡—mJû#Ü+”ñºÚÜEö:ô¼\ãNa¥ôEcWmʜ؃X¥\^¾õ>|ê÷€‹lMžlaó6îþ NðÀ®ùLýÙÀïÈG¿9¦^ük¿;DzN¼GÅ;[¼ÅSIÀþvq´ì䨻‹w0:Â{¿ðÌ·?þþ×q‘jn3ØOc‡Zú._JQ#Ø”ºŸx»MÄ\•µõtÑâ¯K“‚—S%¥‚:[ýWKä’9$2N1»4Êlz­õ£–‚Û äìÝc±µ(«ÿÜ´ ¹^߬-œ>î8™Ck5zåm'ò•­r;k’…_Uç¬ÀTß=]fÁrñ3g5‹Db#ñ^Œ9k²åWöí=œvzƒc!ן£/Ÿ­¡âèÍ7= ¬/¿}Ÿÿàù+ØÌ·oâÞulÞÆæÙ‚Ïûö¹ß±/ö«nS›ÛDÎ(¥È³ì¿!¸½¬B" ¬_.UhæN0ÎÝyòD¿|5¬¡Ý8,ÚÚàÉ6vaO0ÞÞÄý¿ÁÖO±z ÿÇû"žëcF¶p ßÅÕeo`Чþ—Û'>: Nþ\€n žOÀ¿ã#8BÊâ\¦6Ó‡ö×åx$‚1O6K¹MÜ7C—Ð9Ë|J_x5+ÈÔF_®êÌYª§Ññ¦B¦*&h s vÎMN2µH½fœÑ&sèúµK5g¢¹"•©ý¤å÷ƒ¹Y2î˜bš&ÂQö2›pLõ°¥†Þ© ¬'¼ˆ+Ôã $ÖÖA`áÓgìǰ¼|9Ã×ÿà=ïÆÎÎÞ&¶ïáþuÜÞ~:à为 IDATóyx <±¯;:±añ"^Á-ï¥\¼ ¹HÏ3rl)F ÅùxOfTéºÏðu¡y¸ áãbQèC<Ááœáä8voàÉ- ÷ñÂ[½Ï}æ•â °a#À„µTÇŽ]ð™w<þú%žª!D½4hu÷®|wW©£² Q·n.ÞFŒwþ”‹•÷b2UB)ã™xõ© |Rï½~Ƴx¹D_ ÎeªÔe¥ôëF{¤ÚîŒ2K9nÔ¸K7Œ4‡f«Q–q@¡.Û6ÝFÍå_oÎSãZŠ+ÛÓfq÷ÅFCâåº2‘=:OLs^C ,þ 1§‰+îtr‡>wß6šÿ¬}zÚîÚeŸ¯Ÿ¾ùgÀÞ‹'w†°}›wpï[Àc—~‡,öŸq=ÿ‹[©[xbÊZ:sä4Ÿš¿£ñ>ã-†EBåê”¶-ivÇÀ°·ƒ½Ç8|‚ýŒ÷Ý»¸ó¯qøÞ…×ÿøÃ¿…çÖ°\ÖícÀ]‹¸Ôùc·=¶úZèH`ñŽæx åý× ÆPË\Mí ºWg¾ºh!ü:aþ²Ï{9šýbÞI8˜*‘‹¥v‹UÓªF5–Èùo³4mÆæòŸ?Oµ1¼XIo€%=]—Tí9ËÎÃÄäºÊš±¸ea R’UH—¸W¤½Éè<µÇÉÁ[´v©¹¿9Šã1ŠÖJ#wÕ«Ì}õ =¼\> |û¸ð©q÷ßÁý¸sãéÌçGÀ®}5αK¿ÞCF+%SÛ4ôáiô6|‰½E¤H)ºˆ[#1+1Ä QÖ;@ç/ó ð‰ß~bøîá`LJ6¼wOn£¿?ƒ|ä=À0°«auY7+xâv’bêA¥Ñ¯çƒ)ÂhéÄ¡ÚA™‹[ê§>ÍCgºîí™J£³JièŠ/~טgY©Ñ^;/íO½7Û,»5¦ÞÍ’sÓ2Ïóå€g’…Ü?f—²:ÏÒ#[8²»,R¶™Bé›h‚*K?6åÙG㇧ë?5eÜ=­œgÄ»2îOád‡bñR<"ü‚¥¢ß[öùàÆ{¾¶Š|Œ›÷ÜÄÖ}<¸‰;€Çö]GE0päÆ~C“Ng—ÐËÔ!¡8×;€•.³Ÿ‰ÆÝæeÂ8ýN|óŸÇv-ècËÀ'öÍÀGû8ÜÇñ!Žaö€G?Ńïc¸g^ÇÇþáǾˆÖpÁ> ÜuKì0•À:!WÏ[;„Ï”P—Õ4ÊtÚ SÃ×…ÄÈÜRBÜ^—Tp£K¥/u--{ìŒr:\—9Ô¢ £ee~{E/#}¤HåžPörQ€O«Å ™Ûx:®­S¥%äy„4jð©™W6uÓC‰ù§ÐïŒR©ôˆUÖÍšš^»¡Æ÷oH¼"D÷èl…ûN;½Þ¿HB_øªæ]i94åj£ø«ï®ÏŸ¾þ÷}ßÞ»MlÞÁ£c<vmìw_M~¦0é&Œ_áüŠ·TœFàÚ6bê&ÎßÊ•Ÿ&!,^Ýø¿…húE “"ü[D}‹Ï¡mýàøÇØŒý] w€ƒÝwàÅÏâ£ÿèÏâJëÀ°¬²¥°ŒUƒ^zD{º.ˆÂES/ ‡B )ûõÀSG¹\)}†Ÿeºs¦ðaDB>µˆx†³ôÿ¸d^×yWá\ Œ™ÏM³ÆâJ•Õ~^ ÷[WÑgÊ/%¥úÞéà¶IË/ Z*+Ü’š–Ucnj×~ ›Ã5QÇ9¬ LޏnM4ºˆz…žÞÛ¿à^ ^gÚË«qåC ÐþŽÊ6¢O®6ôGh(qEðíð!àÛ¼ñŒîaëÜÀîc<¶'À}l ±Y²<àÌõ„Ïh‰¢¡]ï =xâÌźƒõB¸þèyéÞ£ø6C¡'mØb_|xŒ£L&`x ìncû8ÚÆ`Ïlðɾû•§o¦å  o†/d•Ù]µ^´·RÚbY =üÏS ñö øÆS´PuB’¹)k‘H³"Ú±õhZHRúçÔ4 æÔÚ-Pê½×7á9´ÁJ§UÎé7.é}ï€-çgl«$~÷]"‰ô«ö3ð,'Å|Ún*p¦HJzÍÛÿÃhìñÊ3׉é/>Á„p?4Š¡WιqƦh½÷èk¯áÙ/<ƒÑn=zt[÷ðð6¶ÌÓŸ÷ìäç¡;ùy¢J‡»1‹¤xð:åÔ3ÂÛ"䜘 ^–WÛG…¸è>,^‰$öèŽ$޳g€Gv t.ž>†Ç8²Ocxð?€ç>Œüî+oâ°f#ÀÅDèbªsÆTÊØ<üž] šÛMhk|­–F3°°’ï•! §àœÐ3tLíH)´lÛiî~:e"ÿΘy9Ä•ŸƒÔ2 QAÚéQŸ—ò,Hs7w.§€Ûv¶MŸ†¤Þ ÇŒ·ÕRÇÖÞ@•3<]eªƒ˜îñ§¤ 9mS‹(›y)ñòyÜ2!'X@xÈ·ö~xÎeCþ½›‰*ðÙ¤EÌ­< |øÔ—Þ‹û7¶nbû>¶ïck‚-û¥E€C/=då˜Q¦rc]g¥·C  ì¬šš?¼,f¢žš‡'¬SiÒ‰ÇôÄ/pÙ)ÐÅ므'»8>Àñöwp²<ø|6žÇ»?÷Ìg/½ø"6€ oùV¤Cöæç¡eàýïc4ÄÉðè>þðiv×^ÅkðÊGqѾ ©oC»ð•Ë{f¦8™WÇ«vܼ:©á+®‡NO¾íM£…Ói\ÉÐ!’^\Xjaà )‘ÖÕòŸšóÔ|*3Õ,׫&nè!™ÑËJWµiwnáîâÂ8!¥¸m#:K$禫K„ƒ2UºîĽ‡¹Éœ1¬ºLZ!¡U(‚„Êã&ñÁ… <B¦Är½iR\gã&Ófá`‰»¦Ùvíä篼ŒËŸ/N®Ÿ<¼…Í;xôÛ–~÷غG£iË>k&¯«óO…ý†Dã•§:ß™ú©Û7ýXª¸HVÞþ UåéCF ÐñÈ}ÒÓcœáäû;ÀpýÿÄÎ;ðì‡ñ›_y÷çðìe¬ëÀ:0Pá_*ˆ¿=–¾P} Kæ…d±ûÆqBá‘)‘¹8gy‘*$ž,¥(RV¨KL=0”¬Âåš7ÖÔdSeêxSY8äœ(¥l2ËEò¬1Û²Ô÷œ&j‘óð¹Ä¤Âi6Ÿ+H0VYs™EªÝËg¤ÍtÅy=¼¸Ÿç%ŸHn´­ýlý/}:*½Wr 3 º‚œ"R9×V~¾¼ |î€õgqïÎÃ[غ‡­»Ø1xì»6ö{ä>÷ë]€ZÛªvúMiÍB"Ã(eGX;i\™¬+%Su‹äE_}T ‹çéIà¡ýyœíãhÃcì=ýwþ º}\y¯~í½ĺ}úwÅ> \-ÖEï¹Ï‡jJ§C|`KwHþ84n0jZ¸6¦W¸j .+é L=0’21[ÑÏ#™W«lÊiXãM¼ Ê­PV«òl•”ê“‹R ”œ» ³K9^¬Åëõθ,µÇwËJ© ÛsÃXÔ•}n#éa.Â_­  qˆÎ$qØæ†0’å½Ö‰¿tÔ(DéÞ"è$2Ö;§^òÔ+BÃͧc風XÞ|ñ Ào¾ˆ‡?Ú¿…ÍÛØÛÆî[xºöÕ‘]ù™b¿bÙgã³XbÇ‹ÛYX#ò¯HÏS ¬$ÂpJ²RC6ÞÎããàÿzG—¼e™ð_¢P~ˆè]´ ôÄï1pÀž /ÖE;ØÃðG{8ÜlãÖ_b| /|ïûâËÁÕÎSôåg.=ò¡™®oÀÈ[ÁÀ&Pq€§Ñÿês\7‡×Œ‘47ÊTÂlNŒú™Š ¿½z¯<$e¹TPlž2c·)UÇ¥vJÏeei"ÀS=Ëø!õ&® ççv½w–EùªÚrFiƒUÓc³grmáÛïÝ#Í©P Ï2õMû3÷:νjš³õŒK›”,ôºWoÝ3»ìsX®Ÿêàý¿ ¬^ÆýÑÃ[xü;±ìÚµ¯Žì+G¾µ¯à ¶'»Kßßmåÿgï]cmÙ²»¾_­µöóìó¼÷œûî¾Ý}»ÛîÛînÓ66nC;‚ŒÀ`!D°‚ (Š"IBP¤D ˆ|2% $ˆDØ„‡cG„Æî†t»Æýp÷}ß{žûì×zW>ÔªyFÍ1ç¬YµV­}Ö_K[kך5æ˜c>jüǨšåŒŒÄˆ  áäuv„/é#:hbUDDIg×Xü|^”£ÏÕ›$ðPŒŠLR.N^02}oþ ßûg{WùÔÛÿÑ×ï¼Ì.$b¬¾àÀiþ¤q’Î~qï+ýâb¹Ç›ë¦9 ¥ËKÎ-¸tá„ —vwÕKLxN9#)5D-éÄVМv ˸Ü×hc¼Ž Â¥4×*§ÆÆ` —²ã·¨„®]B$šëø–‡Öç—ÏŸ«ää9Q)uVéWgêOûv¥®ª•IH£]OŸglý”?>v*u–Ø©m¸ F‚æÞ؃kð øÂ‚ç?ÅÃïæât±4o|•oý³1À³ßϧÿ½?Æ~|ÙOùöszEBÞ/>Œk6ùb n©9³UÆÙ¡šW'3â—\ 1ó½6,Ûúj¤X 4¦ã;X>!‘ÂÃ¥Ž a'ÖnZ—mâÄR^’ðŽ½Žc3p®tʲP×hüâ¾X nhœ˜«¦N J–V×Kå/õÙÔÕGÒµµˆÏI­¡‰v'ê$’õñµH{ü¦@Z¼Ùúît‹åÖ}؇ÛðÃÏñì^az1ùÎèý7¸÷6ÆÜ‡ð8'ÀæÏ™"ÀasÕ »Î¸@¥AŠÈ(†U&\2-+¬WƒÖü*FÃÈòËÕÇÏqY—cÎ}°²›äÏÏóøgÇÌîÂ;¿Ê»_^zí÷¿úCܰŸß?7ãÀ½üÖèÝüEÁñ$°lE’Ï©žÇ ºENÓ9Xrâ×äÒK€¯ãê9ÇUWKgsj_ *q`]W+¤=b•[´X^m{¿*à®™8 O×TÝD\&Æ´¥ãíq^×X;ÊÁmµ30ñОœV L-š8ÎlV,FˆtCSõ¯d¶òÄTtœ)C‘úš#òDKž WáSð㮽̿õþ÷¸ÿ.Oy'ðNòGÇeÛ>ã÷hK)b%8­ÝV¬´7¯£`V·Æ C?çØÖQžHbu®á½3ñ>¤1\äƒ_ä·COR&#fSÎsúÞû ßþÅ…Ð;ŸáÇþø }B€ûùÀžçÚšYÜ/¾þ×ÊKrî Bé • á¾uÀŠ.Ii[ µV–@_/8##•Ö¨Äó=|0|¢À…®*.U¸:ë諆õ¥Âs¶6j¨´ ³¯x _ :;\+aÅ=µà-ÚEé »siyˆ'„—Kml¥—ti ëéÄû¯òxXrâ)#=Z˃×I?¶²80Eo>->œécY‰ æßÂøáïcð©¸x0z‹‡ïs|qç³õèïÌUµ®7¦J»² VƇK+Òa YÞwzmÍÃÄÆ§Ã\uŸ¯‹%žŸÎh𠜞pò€ágÇpw›¿Âû_]ˆþøxí³\˳»»âa`£°‰ãô=7MqNL_´% mœ˜Yš³(Û¡ŒÅ‡[\iãC>­¬Z|l¹¥éÐå¥F×î#9ãíjÕÊZ·vC=%¸çê›°ÁØg¬óm©vßÎÿecÅn¥ºOõµóÌvQÊ—ç÷„땈÷wri¥Ä³—©ágž½ö–tBFr‹±8Õ0w>g; Á'ávxïîoòø§gã|ï«QNofjçg'µ‹A[Ô4¦^'ÛÔ”©juNÒe ”/­¥b*r–)MÓYTPÞ]?/@ºÈߊ´Ø:exÎù ç'œ¼oä[aþ·n~G{Ov 7[aY¨÷\ãï;3qäD ø«Óºã|ÆÑ“=гF%ÇiùÚ“¢êZoŒE4¨J•­(@ŒÌxtÿB‰®q§uÑøíà ~uÍÎÂZŒK€×8Õ+U}i–¤F׿yLĽEiëBLB u±ÍˆdÕH>WºÓ/P8²vËÖZÕ»øH¯ÅZ%ûu¾ 8-zòWëu»Ö‹LS)µZ‡à;p^„ý ½×nr~÷ìî¾Å½wÏýžä_]ä{M‹7ZØo+c»”›UE˜²úJ†D¸á>§ª”3,û²¨Ç˜3Ô⤋òßyñmÀ£|œŒá†#FçŒGœ?†»3¾÷K¤)ÀÑ |ú>û";y8f ¶Â’Ug¿fO\·Q˜#¥¬µ”m:džÓJ7x[ÇcÊ„5´ÊÄFž[µ|©ÝZOi›¯ ™DgÝ•0.åW‰•õò†'65Üz7\²~ÝÂÂ*ûW3æXãø\Ò¥Èrˆ«žëCŒ¨pš%²"§4JéŠÓ'èR[JúǀǙøÝtMN,¤[) ðÇá3_„½ëèUµÕ2×d$X)8ß÷T™+U÷JdxîÀg^ƒç{LÎÎÞàøÞâéß“üæç¡zåïܯŒD½N jtœóHXZ“l›®1<8Kµ­bð‰²†“/V¢Ïu&±%6éß¡Ù: œ33:çìî½Ë÷~i!ñÅyþU®%‹$p_ü5.N"nN–ÔW{'‰ÅóÝ*iÁ4Ð×q¾êâ»IiK¬¯¤¯-5ÂRhòFíz#C“²ü*Ñzuá@ÀÆ¡Í/9ÜbyØÈ pUç£¹ä§ ›»bnQаpõJQoØò©*æ<1ÔoâSúàô5‰³€ô’„>w9 ƒñÂõòŠú__RÑÚû*»éô | >ý;àð6ï>xŸÓGœ¦Oö¾Ч§bû«µÖ w6¡|éÒéš$«¨45–wŽ‘F™aøe¿óa®]/ìðœ½Éì¡'vŠvvY€É&X禊˶ëÀ“Å´euÖßÈ.ö-,º‘h׊xV1çYK|EÎu`è¬[Õe§·aw¬·iËK]î¾H¬± å¸kóvÙÆºã© ºÖÝ-b£›©|äèm+œoù¯UYÄ2°¼Úë9—¾˜B$·Ñî¸E½¬›9}”L&Z­_¥JÎ×Y 1Bzâæçx>ó‡ŸÚ#éÞâÑ]N.ý5oµ±Øï¬È~-²´^”†Y«Ž´˜î~8áü©”EÄÃ9z}MpòÀþº-ÖŽÐÓü¦è‹üöóSÎO¹8e6Ço.Îܿɋ?üì‹ìçÄnXrʘÝÚ®[š­V¢ÚÂ=vÚÄyÄšYV]ú,§é¬Ó}“×W‹òtßO‘O–ø©TZos¶¿ö•gÅX¬­‹iC9+ó(6ÚE\.ßÔØ¤ pé…¼­îi±›;8b.YP*²9\ÚÖ>6Ö«@%¿<àŠ•žÒ°j§4‹@úÜèøºœäVŸh±'ݵ„8Õ6ë¾ôõõ-šÒMwZ —Ó‰Cx>÷ðÌ'Ÿßçø‡<†Çâ­¿c±ÿsꪴR¿4ìÄÒŸ|öwZ^äYV¬ay}&r•†¥NT–žh†Õ³N5R1f"8b žæ_ÆC¦cFœŸÂÉ›L.‚n}âÚ3Ožîçjdÿ¦âß¾È[7BãéAçOñQ†˜˜N` ѵÇwGm—ɹz4Aä°iŽÚ¸a¨¨ºïŒ¦Ã*QO‡ÍÕ|‹Õ „w§óV¼0­œlQŠu-Í«¯´;Ó0 ߬©”ò œUj«@اižLð¹¡ÎD\i-šA9¿[_4×L8 žÜ(-nFeʤA.=ý{>uÄÑÇa:âÓûïr|c8Û>&ãÜqZ÷Ti® œ 4MÒâëÕ–Çe7«pmgÝúש‰*àÌOZc`–óÞqqC¬ìýÀ£ãó“Üÿ7¼û« )úâí—¹"Þ~$Ix/(¥9õí °³Q2î¦gziÏ&E,úŸ&NÝœßêùÆ@<§î@R)¼²‰Øh—²y§lJ·.CÏåµ}•ƒj£°^}XîcS–¡F—‡k uÐúØhââ;ð³ÃÕãÀ¾ôKÕ*J3œš'8 (“¨¤®Rjb2oò,Mƒµ>æèx9KÿÞù¾s÷»Ü}‹ÇÃÅöW&ý;)n|åSµIÌ¢J)®ZÈ#¾(ƒ“ù„ªðÁÙÅ­S__-øÿ•‘_u’aëcí=Í¿ãüŽèÅ›31¾€C>øêBÜ'úÚKìõ™í¯L/Ïr•ä­ÑUMd¡pµÎiy›Óñ¯zH<£«T½ÉásK)wŒððdñaë1vkq>·ïl®„¾Ë·†–®›²X´K«ªVÝJ™xQí¶Ô8¦ÍÙoÃŒA˜µj.Q[“p™Èi^Õ© øU)Š<+àvS,¦=ÔD•,MÜ9Õ–µgÁ'žÿAHç|09¾Ëé#ºö¾²v~v~|•¶y D L“ÃãSXñ#¿VÕ%+‰ œèMÝXgIy÷õð0¿ NÓ “ “1³ÇðÆ//„>ˇ_½qgAnb§+³O›äƆ™û¦Œ³œ1‘@‡êi‹ê½G.û:ì¢5Dµ+,Í3Šœç:{ܧaaÔ©Z˲QµmUq9ÐÄP]0KtØBã²à-.=.ÍRRº¦¯·¥58gRV TBU5¤´J¼¥’"¼áR_YŒä½¾T’t‘}õ˜T|qº¶Ù'µ¶Ô6¼¢»ð|úGàΫ\Ü{ü>Þãäbqó³a¿Sñl§$<¥¾õ²QiØX™ºðhq&ô¬#Îê–1ñ8¾ bˆ´5ùB6ú,“žæ÷ÌÏò[ 7EÏ]0ºàâ~›ÉùBʇ¾øÌ ìæÔ·/^ ŒÛÖs¿‘„³t…ñÅVô¹ññGçqsºE¡õ_§œpð¥ÆØ[êäµ">³›_«˜êµ}‹Õ`•½³¤Š¶£Ë‰5^ú¹”¸-ƒnÇëS‚øŽÞ‰ ‘S¬-¬ßšÑYr"]C«L¼Ó¬OË$"Ù’¿øêõùޏøÆ¼ø¯N÷Y¼y÷ï5ø0|ò‡àÊî?:¾ÇÙãEî×zôWnnäËëVøÐâ…³yèÄy–¦¾è2 kC†9–wÐYÍJA1Yr.6¾š‰ïC¦ O_0ÂÙû<üÎâ´OýÑg_bOÔkˆnöÅÜ-û 9¤žq:¦‡@ò3AóÁÀB ª°Ø0E¬”ï­Ì­ÔRdÛÂ]÷—¿Ø #XX/Å’Ø\. kïš¼vý6ñÛÞÔXoµÞ#1͉©4 §’Îírà»J8«v¦¶jWbqiI†Þ¹ù"™°/með<?ð ¼´Çðáì!?àøþâíGæÕ5Ö{4õ¥¨ÏÚW*Ën¨ÃÐÙEßW.òÑ IDAT[Gtc¥ñët«¼Ót¾À‡Ü zšoœ6ÎGÔL'Œ‡œŸÂ÷¹ÿÅ™ý}·_âjžÈýöÄ`6­è_ƒ¤gAZ,/{ÊÙ.Ÿ}tTKóU„Vš<ËïóÊ2:ze¾¨²ÖܪkÙËl©üæËBéÚâ n 6HÕh”\;ZœG›Þ×]Ðÿf€é†e·èV¹V­«Å±Ún3nñ²Q)k” 4,ª9jWáÌ`”žhqN„'š¨Û85Z§kRç£y:[˜ 1¯1¯ÿ}¾ÿ·Ã Ÿçñ[ÇwyôæœÁ™ºù¹4å[ ­öÒŸ"§C$õµ˜U)n •ŒßX'=‹$Ì©ú®9°uÁxÈhÈèîñ„÷úýç8·^‡dÀˇpòs8ïnz¿R±V(q$|UÄøÇæ_­ª¤ †ŸX¯Û VƵÎá2Nž†ÒÖŠ•8X`^èŠ žæ|x”'ÏSƌΙŒàÑo=9ç•Ϫ–1zåËe»,îXjœÐþpAÏîð\vư(jëÔÓ*©¿ËòBî M2}gà-.ÅgIs°# ûhÅPñ×Ê #j¬ö—–7±òÓ9:»ßêîkX৬ÆêË@8 óUÑÖ¬•Š|¼EóõKä¥ÔéÐWUÏTêüש‰v”-z™º6  ;Ð’^· ×á¯Ã Ÿd>ž>äÁ»œŤ§â¡_³Ç¯Uu©Vƒ˜`MÀKNuRܾøb}œ;3IÉ«YýR×Çüƒ$Oû†Si×Þ+?æåÀÃ|7¬á9Àt¾óDÄíO^{²4j¦jwhëWÔ‘ðR`¾; h8¬&á¸J%ÃB| hëE[–1IW|\}-KE½YqÃ7ÅÎÝ׳S4rsqi píÜý¡_Ý´m‡¶‚z.NäYbáõ:òûp5P©-Ý¹ÌøQ¾Q$™p`xøê*­7|zdd'^xL±µ“ð†Ðúw­9MôÙôÞ±°AÍÙ=kà²ÝÝö»qœ­õQÞVðlƒ,Yƒ7Æs¹5¢RWêÜH ddK­’1ž\¼ØJÖöùÁh§$’òé$L [eÙÇʼùä[|ç€)“±ßA¾ÿóÇ>;G ßçñƒÅ«Fâõ¿zû+Äß¾²öŠïf°,f=ù¬ï þñ/~1c¿Àõ7~æg~fàÚ7+QGÂ[gUEZÔ\~qf­s2uűäÌ‹œ‹ ð“[ ¦$=¸8çøÅi»GƒÅíåæI`9ú‚ ËŽ36ÔOb[t.qÎGŠeuœ³ÒÚÑ®Ò_câwãUÇ› ,U£IÕKE×Ü•Re6h^‹ªKíÍÂ7¨¿6å`ìÔ ßâc#-2¤¡Ôû©„x¿dyXF]•Lº¼ªcèwUáæD§ïh9Úô¥Ô_¬ò2Ñ$p’aC’Íg.h2³—}À>\ƒW®¾ IÂ[o=|ŸG9gñåàŒ§E̺/äMƧäN=5Þ,:g̘¸::Él&…÷f³]˜äd¿8c@Ö‘R †5Hdï;©š®(--?-þ‹j‚„3q ´Œ#˜‡çSFÙãæ§o!‡Ï3HHÓþlEdHvŸÖÊi ½&Hl )Óúžøuˆ©Ô©žváäqçš ËW |àÒ?\ÒŸn•†wdá@±€‰Z)ß–]éºÚE«õ®±RÆ‰Ž«×2À:BÜ$ÅOm!ë‚3F¾,‰ ]¬ft0ºTÚ‰µuÖÞsís×É9Ã*9Â]gu¤XßÊì#'XJšòrû¥ìÂMøÈ§áÖMNÞ9{—{ïðÎò ŠÆÅÍŸÓbþÓâÀ«\ú^&²ÜºYÚ*û̼)¸Ü³zƒrÇ£ž£Yõ¬p<¾Å•T&%ZG@²ÕŠp£Úm²%™?Ì™ªä“¥E§Ê镯ˆJ‹ß4[§˜ðDßœ½oòfÙýÏwàÕ×áêKÜûÿ¼ÏÃ÷9És¿ÖÛ´p§XƒhUEsê›;ÈMž$W‘÷9Ë|#Å(@–<~ϾðSø߸råWþþß?¾wo7ßè8;e–§ÐMe^3NX©ªUÓâX’ãÁ7Æ¿†usþ*+2ÅL]òhóré9ŒGLÇÙoÓ'²öa˜qæLÂ\ì}•æ!Œ´Økä=’UBÐh¨Ÿúv¶ W]¾HSØ>¾*J×Ì0+Óµ; Wš>Έ^UJÜb¦@L™Îúl¥!’Îj¾E<¶Ø:¶x èà8¾”Q¨øF-Jµ‹d…ª®˜ŠtÊþN©“?º¤ts!yë'ŸÏª33IQŸ|KÃÜRáyû8°““¹ìéÊx®¿“3̼ÇÉä û5·=KB¸âEOûñõ˜±¶•7ìWïkmlÞ™L©L Ãáÿú·ÿv{° \)ŒDaI€­Ê#z éînŠ<«4æåTÞ|Ìnj2<@’=üøÉi7>¶wðõþ$ r2Ü+¦Q÷¨[³Û²­V¸§Èz}ÐÓ*-v_Ï.¢¤ÖÄi4'ÀŠªZ…UO¸Sß÷†H•õšˆ £´ÉKÅj(îº×-¿4èZWnü&X²f)ÂŽàò8@ü¦£õF­¦ãâ/´ÖÁz:tdúø”/mTmý›w™Ïµ 8s± ÷š&á–“mQ í¾›ƒÖöKiñ_IìubJÊ7ì÷¼ô\Ó÷.îqò󜳋÷¬Î\LÛ‡J½3¬&1{_[ÔW¾¤GnvÝ÷-'"ui¬Ñ¿i#8ƒ ˜Â.ìCOd€¥q «½V ¤e­„Ä3,¢b„›èɬø1–œ›FY⮿Ò,T2­Œ=ùxî{†‡6Q”™pRdÅ©ê2-ÐI}qIÅ_ybiÿúªðX¯×LÉVb^N!UW‰µ„Þ.œñÐëê¯×›ŽŽ¸j— å8q}¶¨nŽà¥öæv¨ïy¬ mÍîp"’HM,i·›²ê<ž%ÜGëˆó¬ð)>måwÍy4¬&h"*›)©¯ö_‹?€]¸/½7Ÿáââø>§œÃEþôïDm\äût’ÏX»=[»ÏDL!³Röø.Åר#[™Cù¦Ÿ1œÁvà 옔a'ûmß0–u%®Â>Q„¤5P¥Ígñž­”ùŒÙ Îï=ñ v Ù?y‚ÅKåcÕ>/ßúWݤ8H4Öpœ!ŒzŸXUx‹þžoAF¹-TÕp9ŠYç×…æ+mâù·­åÝÄ¥ï²í-ÐËBZ\5"cÞ][:7UÍØÄìõÎ ŸUu$Ô9š­eÏÚ¾¶xxÀ­$¡Ô ›‘=h-)’¾úb™Vt@vqê))kéåͶL‡p^øô÷qqÊéñ“wÿΊtÅp_dÁr#Þ Æ§qÍM¶–œ‚Êæ˜ffVíçìÅ =6[[]“ä÷<“o½×aN`\9‘Å´@gzãóf2…¥Ïš½Fó%Æ-ÖµÈü•¡ &|»ÇÁ˜9ãä§é“¯äªšô.)ÕÓ.¤“â½Ê>6WI]Ã~³k¼•ø5§S<]¾–6“³3€gàE8È3ŸÒ¶V½}~R§ÚJ¡¯_Ήo:8IW¤·'ã&œw›Ï`6a6…‹œ¾·(úìëûW@lÖÍ×oèÛ¥_meÍ8\ÿꃦƒœ¨Ô;>èü®ç ‹©¢EøXºó`Õ aÕb•.L1!†ª\dÕ5°úÐÀ¶6\/6þàŽ£ê‚¸Œù°FG³vs:ëk,ã‚W£ùm©áËK´‹ÎŽÉV³f½EV}Ùç¿át“Uåùt9.ëU=’´È\™!ZÙýÏÏ}®B:»8áäaáægÉ~õ ¨ÄÐJ=þ†+O"š¬úÕ¸/ÞZDž¢œ SK}´ALd¡—g§â¬ôà%¸‰ šÎé¶$EJLÝ®M „úH ,OL]7Bgàùœt÷/Îévöžx6¦¬£õ^.+LãlŽœ•ÖMìGÍþÕ» V†ÈA[Ïržø5 §^—™J}kš®ÎWK[|2~UYÆ…©6u¯Wøò¡õ°Âa,ÕÚêÊÂ-ÐOù4»”(íÓ@”º,[¾F=ö¸J%—TW[­¨´BÜýÓÊxu˜sVJnÔ¶ªåé:ßX¼ÅIc,/Ü—”3G 1“ŠiOTVší€µ‡pó ö8;>yÀÉFù-©ÿC¿5Ѐ›pûeØ9䜳cÎÏ7ëN‹ ºá÷±b'©ðÁ©¡…ÜÛ°—¾Hÿ"ȘÅ~E’g®¼ŸV›â®Zy䯨íåÉä,â½i¯Àëp$ôÑÕ…O•U 'hÿªòQ¦› ˜ažG[Æpqšš0|¸øùðöîþá&6‘…o¢ÞDM B’rÐâºÎVKõXMEu¾³œV 8tg…¯5áqÒºw¡{$PL_×Çü¤ · ßR¹qèT:¥L«WuƒŒÓ‹ëoG˜Ò«Çeêúªmñùm•ªóIhrér§¶Ð¢ïÒ0~ßDŽA©Û]É©r Ô¿Ö³aé)i\×ûY«Œådö•b¢²läìÁ³pã MqzÌ0ußü\ƒ›p ¾Ÿ}‘ßùŸ¿À|ÊÞ5~êNÿâÞÿ?}‹ã{ü³_ämø4| ^†Á·áGà‡áå/^êç:†PmO4fm‘½ ï”l‘LëW“žCš’,æŒØ¬j÷Ênò¸—"’mšÎMó~éåï£rÎ\£K¹a¸)æüèæ ‹ X:7fµ¯Ñûa™>Î_ Ëà9zm(ªk(]?7—©-]FŒ›÷E{s# pë‹Q§HBm,» iñË%°X+¨4xºc´ǼOT ‘«T‹óÜJr¤KC’«ÊG¹°Üˆït«u’¾Z¾¦ä :4 …È»d­êpÕ(å'yú÷®& váŒÉˆÑÅbÿçY‘û(„Õv‹.Æ*ò Z#Û`јyñ‘fßØÓŠép†¤II.?c¿/‹ðYø‰ïãóûo°{ ÿËýÚß¿{ü¿ðáïã•ÏÂ+WFg?ð6¯>ä­79ƒSèÁ›p>€¾ßtíMD_”ÂÅpÁ¢š2.3b棑cžÍ]0˶ºº¸ÏlD`°?è?N¦‹}°úB¥¹à½–Xç,„ÉäìÓ4Û„™¬ÍŸ¥X=Bœ­N\#0}°ê)|DV]Š&—Ÿ2ñç. «(µLëQ*§ð..è`ÐeÂ:¬`l¯ÝlÎFàe`Ó9p P µ¯Ž›‚vÛ’,Á>õvª,¿³žsÙ¢€üpà<~¥®Ú#–ïK„’_E›¿د7Zo²E”—N¿qÍÍ“«ÙýÏW®Ñï3qqÆtb¿û×b¿Î¼VRËÔUQÉ6ì7ÛŠ9õo|eNAu} Cð¬¢]¸ð*üdÂùùÿˆŸükÀßJ’¿oÁC¸'oñü?æû8ûÿ}n=Ï‹ãŲÿ+\ÌÁKðð|&á·¥¼ ÙPó¼:IÀJ£ ‘ÐÑù=¿"ú½* ×ãW[²ƒýiFj'g qå9€þ^’<ÑÊ ãÝâ-Ð’©Rœ²u:$$%[%­#ÎVû¨µnu ¬)k? cb¥+aêúÞM·X"þrSéø Ð­;½ÜM6ÒWi‚ΚÝ÷J¼îbySz½dE”·Ø4äiÍ+ª|L†geH”/ë,Sz¤‰‘HÅ_ß¹–[¬½gí²ËŸ´¯ùäùÉbayµ“oséåϯÀÕgØÙ#M™Œ_<¹ó¶œÔÑ÷käO•äè‰Øþ*ïòÉLDwøèŠ,<È÷=€#x>?äWþ~ò¯MÿLòÅ$ùÏà×àMøóé/}åñã߸ÿ÷ýÙ?û ðÛþ&ÿÓ?âËÿ„~çOóã¿——oq /ÂÜKù]°SL¦%b«­Àðh‚¤øW~PÆñôwgdÊ·‹[ý»0€‹‡L‡‹B£ã¬ü·ÕÊ·>IàÃ#z}ff†çOÞlµ"U¦Žñ•Ãýå+Ó ñâß™ºmUC¦%Ãq–žˆ&dYôëp~üéÿãOñ…?Ïš|þ¿ã+ðÆð~ê§þÜŸûsW¯^½uëÖ_úËù3?ò#ïÂÿÿýc~áÿâ7¾ÄtÂ'ˆßû ŸMx ¾ W{¼–<Ÿ[œnšn9aY&Lƒ5'DINE7õò—$/~èÁÞuú»‹¢óY’Fo’§÷{âé_kðžXÖ-u® : ¿8Yn)œ­†O¬sN9ÅV‚ojË‘K_|]«Y ªb^â*õÊ8pGú+݉°l4ºlF7î²Æ+ƲM±)‹B[ë×2ÚÛ)®1hÝ©kL€:FêÉ‘ÂÇ+Á">â…„ú 8/:·S “+3ÿ9Î[U3X¼×¼¹göaïé„ñóSF“'7T[ËJáNnCDÿ_Ÿ)"]dK¥DlѾù9-þ- •&ùëgûù¿;pWágþ]øƒ“³÷ú¯ð&Œs:÷©O}JJø¾×_?ƒ‡ðeø&¼ñ¤ììqë9^xeñ,ñ­çx-ë±Ñ´iE»Ë‚spúP)”ììVùo*Z” )ÓI^t°¿(zrfnFÜܾ[¼9\êNÕÊ#ýåÜÑÁtg0"0†«Îwsº3^æ«1fVú*’BœçÌÕ•ÖS §ac•ù‚ƒr¸ IDATÖcäu¡’Jëµÿ†ö~=tp¨¬ö3À–ÏÑ)»tJ™î Þ,Í ØDÂ’ºoÙ*5‘Ÿ¶ÔêNÆÕ Ò€N®jJ$¦ö¶:ÔBâò­/(2`ši(Áܵ-MN‹:h·»—¿«vï`A€'ÃgKóªu£¥3qž¥6ˆÏò–p]R:â> †ä§Å'™Hƒ’¥%{9Þ…váøé#®ý·ÿ'ð ·Ÿÿ\ˆ¿ü—ÿÒÈ™Íf¿ú«¿j¤}fpëרÝçµÏ±wÈÃ÷9ñè.Ÿ/Á;ŸÊÆÅÇêÁ9&­:ªÙ–#6;(·sëÃ`—Ý}˜@:'é/JO˜MI‹/ñ2÷„ÏòM¤¥’²ê°‰dx()~œ…þrˆö„¡œetó4'Õô¡´»S×_+à™|–,µp%è P,l^çñÒ¿Ýæ”©„e{ M–‘à–›¢ç2°W3Þ [*z¦nçâûÔŽ€K†äUÖ¾^õš@»wUOY–mó@3›X R‚¢Iw$e>“Oˆ^K­ëY^2^Í*uIIµG‹(`É‘§B˜1·]è e:f:Y­™x0ÅŠ|žºôãµ5|ä¿ œ674ÆÜ¥</þaá1f±ÁB®Ãg~'|ä÷ó‚YQ½úOÿéÏþìÏ~ãßøÚ×¾ö§þäŸüõ¯}­8ƒ3x¾sÊ~ŠóÇ\œ²{À}øÜO°ïÃz°#^çÓs½¡§ ñ—"Õ×MönÁ±#ygQ|1UÒ£—ÝŸÎÙ½ 03d<[ë‰7[ÚZ½fæNÆkakbÎ]!'JÕ³:%f…©=¡š_8"×𪗉˜@@¤òáT²O÷›³……ÏÐp ¯Etjr•ï[º Ã2Ðм«Œó-©®MïÙÈLÑêÑ)Ã:9+À‰:BÑY¬AÈcÔÖb-Ÿ5u• ŸåãV Kž›¸^ç#)‡Eõe¢ }؇Á@Òg>B ¿N¬é†;Û+‹%KžAINAæÃÛzùF.&/[=ƒ\ƒgàÅÏðå¿~ÆâÜìï_ý¹Ÿû«?÷sÙ‰†tÍò[y{ð/~žÏ~‘oþkn¿ÌÉ1G×ùF¾Ö¦ùSÙ½"ñkz+cZt®¾…"UÃra™„Ù vŽ^ »ïùüÞlT0~OìÂ=Ëí“;N:©èë-Жn¥œSÞM{YCÏô†KS"ª.M¦¢¼(— •f¨OBCD†)+­$«áùÎz[’·^M¿u;Ô©¬²#œ 49w5ÝÆ DD…†»`Çua}Öd¡\*Òà¿]À¹e|,YceŒkˆìš´øq(=ÐÁ§†åþ. :ËÚ¤9–k¦yÒ)0mKórÙ¯†8õóÏÀìœ2º`2ZÜbjˆ–EwQ=ë$Õ>b¦³[¥pòÿ<+n°¶IN³ù£Ô×€OþÀ×þ'ă»=qŠ•lÌ <†»púÞøŸÿÝìðÑ×ùöWynÂu˜‹Ç‰œ&+ƒ“Õ'jÌHö¨ï!/˜Îã‰úk ÌrÝýIóôÉX£ãÉèIaë¹Ü™zÌ»ÆðK\}”(mµüÚdÃgó˜så¿¥ XQgP£Ò Üb1K ç÷Ò³ÖKiÖRi»ìw‹u!Òçlµ‰síê6cè5òœÕ`» m(ª¦D–QËÓŒÀÄiÝhÖ"^;™Îíh#ë“¿¤Åû0ôX ”-C€3²±·K’022Ø· [À—2rRD'ªö`¥«¬á0}Á#o~+™¨æò7ÐNà®?ð'>øÚØÏ5q~LÜ€WáãpϾÌÝ·ùÕÄáU¼ËÃ÷¹·ó*Òü©ãKÓ˜c‚”a ‘º¤…Ù‘Ö0LS%¹ÔcNó’ ©è H?ãQ½i 0Ÿ1-Ò¿š–”Á.íÜ¥ÎqC€“¢ÃÃÆ±Z}drˇ@vÏó7ÿÀü'?·aO¼¨v ¶ÝÞ…AÎc³§•úð£=;|òó\½ÁáU¾{Ÿ$Ḁq~Eïç'î_éܺ׬ô/þ1)‘ª/¥%­Ý¥÷°“k¯,~OÇ‹4¯Õ/s¥°sé°Îr΋¤X §ŽûŒP³ÓkBâ²³á`Y€7–ªg­oKBx Œ9^U·-‰½ôèN·2qb.µiòÚÙG]'À7ߺc–Ö¯R—¬/–í|·›ú¨€þõšVuÔÅä%b˜g@ }%¨ŠÈ$Uªþ––*¥â;ê»óÄR>fìf\d_®Iûô“qrûTœÞÏ·€N猇LFLÇ…)%EÇoUïµhƒó§¶`†œÜüyšoÕÊ´•UýûpS8þŸŸøâýÛà<·²G¬sîº ‡ùÝÑ7à:Ü€øÜŸóõÎûopçC¼ñ ®À»Ç‹ýŸØÏäo®êûYPLCJ’-M«l£íü®‹™&yfjŽôØÙ‡Ã;\}qqÎø4MŸÌˆ¤˜Ÿç}=+ —#ТljHÈËòú…aÖ„J…A,‹IÓ¸Š%J”%$rM«Ÿ&‘§H8•ìˆãƒ5ªZûŠÙMZîRÇð%€¾ˆ#þmËt åtŸ2t?%XÆ@i>JýõV°®IÒ$ói™%¥¾×ˆÈp{CZ>¨ýxå®$3pÅ-å½¥ñ×€•œšøs&¬ô¹ÎƒM§­§+5 ÏÊO'L'$=Ò4Oç.¾!ºÖ¥:&fQ‰‡G ³:CZä[sg °&TÆti¾ÙÕ9œÂ»ß\œò‡ÿ~;¼‡p× »)úvá Âmø|>7à#Ïpp•ÑÇw y˜oétæ|¯/¶õÒíª175ËBXR6¹4vSÖ¸Mò`°ÃÎ.ÜbïÆ¢Ð蘢½<».Çjx‹f¼H‹%ôcÀR¸H9'6]LÁÉ-&¯OO«ü37#á\db„·{•\¥³Ñ}ï¿Vã´tÇ5êŽ&N\Ê1¶Jtšo{׉՘es¢ªñWŠ‹á­ ’ UI”¦+1Òªf?œ$0¦Šc,Õªô,Í{ÍY>§™â)Î4Qâ’ “RZ¢Šõò¿;»Ã3ÆCfÓÂnÉz£éø8‘„¯X ¤RêIûhyO±ßªp&¬ˆƒ´Ìæp¾ýUø‡? ìü‰ÿò?üI>‡Á+p nÀ>\‡çà6\‡gá¼'pÿ>7nóÚgyû;|å{Àp/'φØgOO‹›Z×^4¿’?ùB91pržÀ\0}—ì²®¾ÄÑ ‹r÷§“B€C²Ó™?( +ÕªWEì[‹ôAßÀ–sÊb¶¾^º¬9­óÜp@Љ˜I30â™pÃ+ìRœæÓ͇­o¶¹Ø^ó4Œ±ò× eÐÑýecSFÉ¥„óò³¤YýÐêBÕíbÅííÖÜ5÷‰-Xi}/õH|µX.¬¯¤t|åßTôE|$¢.+mEQŽL[-Üýó9Ó ãóü=«©«±>6N°™iñK¸X%hl̼¸'pU”Z>Ío»ÍR²'p¿ñ?þÁWùÒ_áwýW/Þýõ?s÷ïüÒ¯ñ-xÎò·þÞ‚ë0…[ð8„O\ãö+Ý`:â7þßü€}¸¿ ß…œBöò{§÷á¤ø–f¢í¬¡;ÑbÅ:á–_)ÅknHÞIØÍÒåGÏsx{qÎýoŒ‡Oz·ð&b—l#PfDÕšxSîDZœY ;çKR|¯X)¹¥8åZᜧµaqòðÔÖÎT¨8Ø¢ÂN9]vñ·ìw‹ØŽHd†Š%ÀO./j—àÕ–¶ c¶HÀ*‰ÒåÃ+ÎåH–Ñ(_G:Èâ~–ÖztC÷{@1ʆ/ de`,ö[Z]OôåÓL¥ºÒ×7bûÐë“@¯G’0M™‹êœÛá:Åjh&VåF"S#Ë‘&/þ­$9ƒEBÌ#  La ïÀ½ÿý—Ÿý±Å`Ÿü3Ÿüá¿svÂÕÃm؇Ї·áã°=xÆðÂG™N8}ÈxÈé1`¾™³Ü$ç½{@þB`4-)þÕ8õßü¬í`!fzÊ%Mò»š{°wW÷¸ò½Ü™9y'{ R’k8È-ŸQßIò˜ïÞOŠOÎì»oO¬ ÔÃÛMVsÁ·fºuz̨¨º~–ŠdÈ•~iËRד%¡ž­|h˵åTµµØ_×õ]À¥7Z¶¸m ðeFëDźÐ^JvWŠø¥!&ZcÃŽH‹ÒšcmÔ§‡u©ØÇÒ­b’”&‹) Ù¯”ã¬×k…œN³Î!=ñ¯9"oø4µôôzOL)f¿ºQÖ©yØï/ý©´¼Q2{‚t®ZÝVrLþkˆÖNà=¸¿ô÷ø=;'7†ÿ1Ï}º÷ûÿôõÿÆG^ç_ÿòñg3^[ )~™“Ü|Ž‹®?Ëûoð½w™ÀŒ`ç°›o=É»c ç0ÌÛÕ«ø„³Õƒò“ºŽ[OƒG*<=5–¸»;~‰Ý«‹xø­ñpHòØÍŽØç,“åÍ̧Ý;d° {טO™Oéïð½_âý7?XzùK¤2Š>ÎC3ÁØ­§¥¼ÑÄŠ1%EûÈbR¬nų¬y-E9 °›Sç&pÒàðø¾XÒøºµ‚ "N‘ØÄuP窴F¬×%À[¬ÖE]l‹ä¬°9ÑŠV-RÁnŠ"nHD’|Ÿ„´ÊÀ[ý¶H¬¯ŠÀR. ’ÏÏ“BJc]’ÜóÎ`Ý mI°ˆhR|Y‹tvÍNQsHú}æ}fGë¬7ÁQ‰ë`L|-@†KÇ€õ¯lo"xѤW9C0¦¢ì×ìFëÌà öà{ðë)ϾE¯ÇÅ/~pëù¦c®?ÇKŸä¥/Àû Oy÷»Œ‡Ü‡—_ãëÿœ‹!S&ÂxÞ“ë+ïÄ!Œ‹¯ù‘ªÆ4V3Þž:b ôQßH»Ž[CÈü;€Ý}ö¯ÀîUz’à½Å£‹Ë5¹â$a–2ÉŸž ©kjÈ#½¢AdÏÊŽvÁаXÄ>qÁiÀð€×SÌGæu3 ö×2–Óp„˜E¬VÌÕ·¸Ø›ªè"î&#ZºßÞåi¸Þ¶×¨}]KL»†jË­‰Ò°ÆJ§û¸tiú"¦R'NÄ­•T¢ÍñÚZ^¬3ÿf¤é›TSÏÎæ'ò7ëÌçiJÒ§ŸÐK ~6âùL‹ ;}Ío“¢N΃³JŠéß¹2Wë+R&p΂¸fÙÈ8‚oÂô]>ò./\a°ÇÁ½ã ö¹q‡‹S;œ>âƒ7™Áƒ”!Ìà܃|A ãüÍISxc5>u33”’âÇ*#¹¢•óÔ’­ŽöÙJ]Šƒjñö#ØÃ«ì_ƒ[\{eñ ð{_Ÿpúˆ4/¿°@ºxxª¬a"2Ήƒ jø´•åµ4«¤\°¹æÏõ†e½K•U—³+­VD*¾z&.ãÇœøT¡ž)Z±Þ¶ZÁÖŒk·C ðzñ4ÓÑR4¹ûvÐà•ZŸ±Í›¿:û½ƒ'áZ‘=èó×25£sÂÓByPóÕ‹p”¿êY&]‹á6YáÙ”ñˆÉˆtÎ,AKœrd~ÌÜ…k>¥üÖ²g¿!-ªdQކ“ZÆD¬æÈ-|³O/§¬÷ó«Æ0>ã茛¤)G7xï{œ?æ›÷@ ó‡{gðîÂÃŽózûpgð8¿í9üŒ«š§9¹Å{Èç"ácOi±Òyjº,£¾ý|§ëØ; Ùƒþ.ƒ}€ó»ŒO‡ç Ïo]6‰Ù¹ØkæÚ÷;)°ð¤“6é[‘º>ºíaãX_äY‘kQänËlQ|ÅÖèC—jÞļmuM|ÄaI¨WŲÛeXiË;‚XÜqgw£± ¸TbYIxÕÂÄ’[ÁÚéwëµ×è´¼“>I¿Ru«“#ɪ”¨#•ÔC9¯iñKŒ<…}ù%]LHÅA‹{[ÜuQuÊ|FšBúÄõOŠ’-•œÇµŸ*ê!æôDì€Õüþg§| CH²ÖÍ` g0†9 `§p n_°½÷˜ÁÉý[»›³ßsx .àÞ„p £üÎê!Üt+-¾ÜØIÆ|Š}gàTbÌXûUR¸&ˆUKRLïÁ!\Í^uåyvŽîÿ&¿=¾`:ƒ<¾Ð‡4g¿“œ¨ÏUt@*0/Ö›-“}ïyŒ“ºLáks"È#¾ÉnõÅu)ÌÃc ŒD^õà”S¯v* iÒðî v“ŠÊ°AÌ­ãzn%/1¶à¶ü|Wà9Hỹé.`˜ßÛ| ÇùÆÎYlB†9ÓKsŽØ’* m+͸ÌSK ö G‘¥@vÿóAÂÑ ¸z›k¯ðÌ'Ž¿ËðÑ|Î$-l`žࡸW8À|¬H¥Œ¹}ÀºÉߢ»>kX„Y²Ö0qµ,&u³ÊHMj‡$|µ‡WÂuµNÒ–*Ç‚sµ Gsš ÅVÔU‰¹­‹ãµ[¯3ö׊ØvenuUl ð¬Ñõ_ñX†ÌeD­ÖNºÖ‹ÈæûŠÕ |ŸJ9°&H‰ÿßzˆæÉÎñ 8N$EïSæˆ|þt€.:b3¿§Š™þÕÊX„Ô¥ÀlÆtB*6Ö¼×z°QÌÐΙë×Hø¬àš¹õÕ;Z÷Bt8Æ4všçŸ§p C8‡+pá>€}8‚œçŒw 0€ìÂ.Œòç©Î,ÉIžç4ʄǧ¥¡ì;Ëå%û»n'.Ex…±è®¥I¶Ù\=âÊ58zžg>ÉîÀÉÛŽGŒ …ÝÜDi¾ÿóH$}Ñ_ßi2l¾§®L»|¦J ®s­ÚSq®¯×(–±è½ÕÀ@gÅ/ã‘W®H,Ï}_‹äæWÃÄ߉ Q[ÔÓL±–áýn±^tŽ?Í\(—1êëúzÑ¢…cDU✑?5¯+õÿTõ «‰™†Ó/l®‰ö,Ãa‹OúJ:©WŒÎκHÔä2¾¯$3©PÌ"B†ßÎ`>e6e°C:g>/p]‹¢X$Áj&TòK4£¦Íá‘ÕI %i1¨=æ­ñ)銱ƒáÿÓœÅ!øXöÌê1œÁr³æO ›ÛŒ÷à<¯åNsšmnÜS]l4ôÑ'§¡zâ¯D;ëÛÈ+uM ŒQú§€ümOWorxn|Œ½ü%Àgï3¾_,Ì•ÀN~Š|ÒL)œŠHqjX£×XÀÒ*U÷‡ï®÷­$¦ãôÔ@)#ÏÒóÂ)¹„¯ ¾Šôär›p±îcI”µElÙom´>7nx·ˆ.4¼sx]X;¥ÜZk-î-*\)NÜV½Ý1x€×Å#²psZ©ºª¨×ä‹©ó”Týkù¾VíšiÄèã¼ìiž¯y©/u“O±èŸn”õ]ו¨­­R˜¦ÌgLa6}R]/Ï©jÊ”¨½¯(r]µÖÙi«° î>[•ŽÕp7VH+‘zêMüetx4'º— O§5ºÙêíà”莳]˯Œ×­ ÝœæžM»HÕ…9\¬I«¯ºH’Ðz½,aqonÏ&tÝIùˆn¦3ÍR[Ÿû¥ø“d5rØËO¸}é ¤xКSW—÷»Î`:až³£a?O[»ãöÄ=º¶î2µ¢zš—ú¥¬@³;§q– ‹!8ð\ÄÌ_sÖ\œ;P¦3§éù²#4ãµ>&i?Ë?Mد´¥%ïÞC¸ W®spG/°{•þ¾ËÅùdÄÉ£Å-âòHÜË&È=À:8 %?Æøúㄞ€ºqIHÔ =ƒ´L=âœwaªìÓŠˆ1³åËC[¶u‰.t\tØtTâö¾ËåÊ ðFó·-X&£ ‹]œZ‰¤,Izœ9€¶ôl½±1)ŽÒb¥¹ ‚š”Öèt‚%¡MƒÕ¥êŸÛ¡)q*ÒƒòÜ€­§ÅN³í /Ø=`6c>‡|S¢q#ô ˜=£ØAN~5WvHŠgiÞ˜Ôê÷D<ÉéÜ$,uXZ1ŸÚÙ÷y1ÛÏNòW%н™Ál"­Ä•Ìi(g_82Òf¹’•žûYURW7ÉÎ2ßû°Gpí G7èÁrócL‡Üÿ¦c}°x8 ÇLÄëuÎ?ÀTu¤Àz¦]šH?ìl E§­22ÌQJžÃVuÒÎÈ.ÃÕ#øÿ-=î”ïû¢Ëެ+P£#-õ¡•®i#­Òh˨«#Þœý¶%5è\x‹Ö±öÛÉáÀaø4¬¤|ÃfߨÿïÈI IDATEsIi+èˆø*Ò¢'柉G²Eê«Ï½Ö¤(\…9èsÙM1IƒµüT IüÙ0C<09À”é˜^þ€Ý)»Å—Ód|x¿é'{ Øâ R¸1oO1g,»9 ;Í’è‰|f˜?ǰë0R×àñ…<$ó1ûTË7Kõ‹tWë–¨á "H•x:¥'¦*÷‹ßÔªNI©›uósöÀù!Ü2éßg¯ðì÷sø,w¿ÎÙû¤Œ†œŸ<¹u?Œó½¯ô{›, vf;FÞ5ÎMÅuO9é¥äÀ‘œ“¢é¬`õQ¢Ú« ès[Y·Õhp$K¯zƒÐŠÂËku[’7‘ývߪ+C÷ýêHl ð¦âÒ A —¬]áæÔkìòL” ZR[B@r$4gÐÇ…ëUgN)-ÐJ !² ‹Íj줋iÑN…ÃmunR®ÔTärÉs€HÓÅ›=öç‹ÜoOÜqàŒ ÄNr/èž²†l †“ÎIU#aÚ2+Ú°aF"LQd™Tµ…bŸseï=Ê¢Ö;™)öW¯Øãö’¨UÌ=õµr›-:ÁIñ»¥¥ä\…ëpýŽnÀ­×Ø=b÷ˆwÉ9cNr1]à¦0„±JÿÊûŸõ$²zÇ¢âòÞDHKÁ¶h!<`´…5ßÖ}g~Š„/œä¬(ËsåÎж䴥F%TªÑWx-š7DwtÞö»[]&½sxõÆmî×v›Õ´ŽhÛÖèHs|p.—N\£!NϬ9t&OÊ1Ò)ˆªU‡/E‘éD“uPò^óÑI!Í!MvQžn‘“žx xgwQ`võÝ™ëÅH†ôZØÜülÕUÊK4ØYeÒ¾2—í^tÜÁ´þNó—'ÏŠÔ× mF‘)o}×Ô7q’Ї~­¬iCìi¦TÒäÀùþÏ×®\gïÜü8Ï}Žã7¸ÿ› 2æÑLĉ3‰°LÔƒ¼iqFX;`™÷?YÖ“tÚâÀ¨õSŠòqWŠ#?l:=8רháI^E)6P/Ma<¸# °³Øhûl´ò>øÕÁÆvŽ_2tœ…ÑÁñzÉv&Öš‘xí¸¶}J-ý©FöF–i1Qæ«ÂW‹Õvéè§Â}·þ:¥¥9%›å.~öÞ™4%…ìÁìÂ(QÍ4ÿk1yÉ2˜­°œXk«-Óbâ®§Ô‹”€s°F ERõkvëø\à¤xŸm@a‹â¦âßFp9ý²ßJ¨«’ëµÒ»pnÀ­Û\½ Ï=ǵWؽÊ[ÿœGßf<Ÿñø“¼ü<ÏýŽû ìà%mâû7-šÑ˜k®²Ê¾á*9p*¨uUóZô¯‘S¦Tr=„‡k˜·8[›Ÿ¾$8—ßå ï²Ø-ª¢yG<…]YB€Wìþ®ÝÛnKmβÉÉZ&C» ‹ ÿÚŠ&+#Ë«¨EÉËÐ0R½&­(¥Á1\: ¡Ô…MÄ—T},zceåY‰(cHŠ·¶Z|Ìä¸Ìß)LF vì$LGôÒEvn7¿M:É>3WàDÜm=iºÈ¦îä8{HXî´ì¼ :ÂeeÒÀONn¬‹YÐÆ!›M°&)Ó ³ƒ;ö`'¿ùÙ<«ÙûB[ûYï¶IŠTÕøíiâä´¦Qòô°;ÝSÖ÷RÆbIs)"O À¼áy–wñ¬zî·d[TÊJ´öa?{û\½ÂÑ ¸³Çµ—éïñþWxô[Œ™>æô³Ô®£üõ¿ò.e+v–ÇjªF ¨r²ÌÁÆ5­ôðv²èð°´ åŒ 9Ï*…[UTë¼7†ÿ¯å2×ñ+ld÷ùVËà :bIU´.öôæê"À[tKM_¬WŽ`Ùkk¤kig'™i ñ¢ª^V} “zµ· Ž?E »n_ ÔëŒq8nÔA͵Œ÷œXßM.—<÷›¤É˜~ 鱓?¼“¿¿§Ÿo‹ÕÏï4F¥õ4õµh°k#8;=-š¦C­@Ü©‰¯jݹ¾AR•ÌËð‡d¿K¢¾1Ò¬®OÄØÛéßëÏpã\{…ë¯r~7~…ÓL&œ<\¼|Kn5ÏËà.KfG#Ó¨Jq¥‚`[¤Z·Ñù«+iQ¥,•‚)x&Wm„ן†¨½t·‹˜ñßJ“cfjVò1:…-û]1.ŸÏ¿%À—•&[§fæÚ•i¨ÀÚ׋Ǫ}™:ç‘ðqüL†êCÚÉKðâ«Ý™¢Ñeô¯aGY«‘OwRe#6Umw¦§¬4—É¡eVÎæÌç$=ú}vú‹» y*ؤѬ$°¹§Ô¢Á=—–z¸jÃÔ¦«ä˜Ö›M¾î° 8)±3>¢›àcÚ¥ŠÍ^vÖWXçraqàìéß+pnÁ­ç¹ò"Üü(×_彯ðÁ·²Ç|Ïóè.@ŒÒ,ý;)6PrTp1Ï"{áx|W7Ö—ñY>0òµÝŒ´Ò#¾sKOi M&Q¼_PI*¡Æ5½Òb¾lÔ¸oÑ.*-Ñ+>ÄDIº gUlŸÞb)h¸žJw¤6RUcçµÛ>·‰än"õ;gñMEïkfXC™ðYš9Ô|Í#9Ðvãyû^+ÿïêtN”Íåã ›»d§)óI¤GÀÎlñ pÆ„G"ñ+鮼–[/6›c¡€¡">«Jc󓟤3¢¬þ*ŒD L=éԯ•:Ìó¿ûj²ÞÆÌM猖ãDN³ùóA¾ÿó37¹õ<ܾɕç¸÷u¾õóÜc6e:áâ”ÑÅB”yúw$öÖÍÔ¼—üW‹Ë0,f¦áÌuCA @cÕ«{AOL½”ù.‘ºksà&˯<ËR©êzè,ÒîRF“©]ŠJdéòáò5j©-ZÆð¾ÜØàME%úp"ë!,ª­ŠšËiH¢¶¨Šå±úVÄú„Te¿1”&p5Ònw œ Ë)—}Û_i8ÏEl•œŠ¶Ì㎽>IB¯ÇÞ˜aºH÷ó- wsú1ÈýûŒÒdм7Éÿµ bQ8 ´ÎI$©H„ÌV\iFçñ1yŸ’Ì[¢JaÑ{‹æéO ™¨…[ê“iH¯üž¢#¸Ï­çyæØ¿ÁÞ ¾ýyãáãôz$ Ç÷™Mo·šÃŒ‹þZ[L%Å·^‡¯–b¦™Ö€6tÒ`çÀt3ŠaÁ:=žG¢Òò›F|—GÂeˆ `9OYOØ2¶äSeçx·j]#pC;kK€75ø@ë4؉-ü|¨áýÔ¾ÔYé5 Ìc„XËti¢Oº¶ú\ÉjŒ×UÊÖ´aMŒaÇ.Æzš›÷”š°¦ùÞBÓ;»ôz¤ {{ìí» û`錖áÀ’éé1 )¢Eƒeùh*Ÿ1cªö1kœXe OpÖ«æ¬Ë‘_4‰„ÏtIQf ˜ù"?räìÀ~žþ}vŸç>DÿC}žûAÒ9ßùÒÉ=æsz}FÜ{›ñlÁxGp.^€$ßQd¾'bÃgÝœÔ?\­b3Á«u“uüʼnȄ/ƒø^®¶Âu-1-Ь(°¬áÒ¹”Ô`βð–èfXž6”P…Q[íJשíàŒÇ–?u¨tá\ÚR2†-U [ÕÍuX†Ì†5:ùOL5zÖrhêyER«Ò¬‹óâä£.N}tÊÎòã%Y2î¾$§¢áÒF”ñïÍV·ÍØOIf3úƒïä¯DåyàiNfR‘+“éß^1L‘™XìWë_u¥yÕý¶7À¨7fôhÏàk¯öøKéõ¯¦Áë‚–šïä›?_‡[ðÌ‹<óÜù4×^á»ÿdügéØÙåÑ]?X¼kC¸€óüè¹jc¢0°†–ŒÝJ¬7¾š»ú…|¤*JUY†œ:[B½Ÿ¨áFi¨BþOncøp@ÕÒÕwpÙ4Àg‡Vê]ý¬ÜR&vmR5”4K­þ` 5Ð!ÜMûÆ\‡|'Æ„~«Šm¾«u$ºÙS]Ös5ì÷iƒžtzŠ9y~úêÌ·„s‰87>bI“JZ:¤ª]‘ÂS5÷ I6‹“;è3± ô†ppû‹; ýü.èŒOŠx.ž¶.íæÖhë)ÊpC|p’dM25'YœWŠîK)7¨ÄIµÄ¬]ÎK ®ƒ†ñZŸ8€ëpžI¸ó û/ÃÑ \ÜãÍ_“$ v]p÷mÆ“Åà™ä¹ß±ØK¾K*f1aó“s#èž8}.&‚Þ?Ì7´ô8L6?¡¾û8°%Õp*èq+Ì®‘¸‘“>}d¯ "i“Yà\¥uaŸJÇÃúÔ(Ü|\v”a‹Ž\¤ÂØÜ1Ð!ÜA8ײeŒÈªb[ÑaI£¶-5”Ób7ÕÓ$|Êe¨-’øÕ6š<·êÈ7®aZE‡Dœ¨:ÿµürçwé€ú"Y–ÂÚ/—5ZtÅò€{yó’ØŒ]ìÃxÂ`—$a6¥×cÆÎó§7åg–ÓàT$xMâW~œQ‰D™Ýr‘µÌ)Ƥr×+Ë&žj‚xGS׈kDêéc¾ãÓ®0õµ˜gRL´š§³·=/¼Âí—àÖ³<Ã{ÿjø6³){ôúßåÁ{ŒÓÅåXî[>s%i1¬ŒåÊ”o¯8H e5ÂùدEw­ãš¸JÛ†W€Hh&ìüWdž◸Ғ5ƪü>=0GbÐðl­“¸ƒóÜÑÄ[8Ѻe.©/¥Ëº%ÀŽ @5.Ú«Ó7ex­RÉŽ„VvJäéN×Mž¸^ø4w×cŒcÛ&TÙ)J²Ç°5ø ENC™ŸÒâ“=QÆøaÙ_óx­æ¦L"vŸÒµ9òm±Yn-Û º×'é3HØ=ytsP|ËQ_°_sÿs*ÊVÌ‹µ[NpâúU!Ë=5åçb[ìžbÅñ¸Ò,sÆ)jŸÒDÃÖ=ï@€õ“uDÆ&ägûp®åøÎ+\}n¾F:çߘŒHö™M¹ÿç3æŸQž6÷íë9kj·‚A‰K%¹˜„­áØz|j†¯M¤9péÊã4i¸£Ĭö ™åÔpêcô±ßÊTýµÆ,®Šµ_Ž5œ6©Mè`ëšãr4ªõx.›CRâ"À—¯µNTò{j<È&|õêÕ³IiXº (mZóH|ë-m+3`ŠÅާÓñUû”ñ^4q9vbæ{ZtjKã×µ¤!V¶´¸Êeù<ÿ›ª{-×Üí©¸­4»z>g°0Obwa,n„) ‘ä¼W×¥™|*tlMÙOˆ¶Ìskô!_ÓScd–¡p™Uzr:ÜsŠE8ûâÕGW²WÁígyæyxî€kâî×g÷ISv÷ÙÙåø.÷Þf˜.ÆöEžþˆ°pÅPäŒ#“âÀðWß«•œÍ”µãá½Î؇ŒÑèÂ-"²û,“úhpéà¬Ê~-î½<Ï-\u$jè¶ ˆ*¶[Ñfa½mÔsª#žªD7µª’ ð%k­5§Á,ÁÖÚœYêÚ]Ïw÷)©÷€|Ÿc-ÿµ\F˵µŠiQºFmÌÔ¯‰¥CŒ[–Ë;eêã–î¤mNÛ:%[šX-¯=U÷|.€œÂ>½ÀNÂ~ÊXìâ›ÝÈšØÏqýü_í+Ïrú¡99®Í±|ðƒ,b“1®é ——v—²sI%Õ4¼W~ÏÌ^Î~oÁ³ðü‡¹ù\•ù„ï}uÀb°ÆLÉޔ߽¥[dˆ­™ÖÇ. é.è°D.ˆ•RIN7ÎÇ-+¡^JÄé\jÒëdËi± ú»EY¥{-ò— 3QÚZGA€çâaà!ìÌØ›Ñë“ÎÙÙãpÄ8å"ÏOa ’{;E.ÑÏ¿›°œ-ò…3(ö¯u–ë=LY1󊦙«w–„JŽ~Ç¡CB¥:'þO6Höà®f;?ÛÜùÉK=ŽžçÁoòˆé”+ôö¸ÿ&¼ÅEºxÐw˜?<òäf%鵂;½ü ¼%^óXI€õsÅzˆúx/Eõ4_µ,i™×úI²AKš·èÕÉú —æVJÑ„å†áÓ?P~¸ ŽÄÚ)Óí")®*­ˆj—fȵû&ˆ-.-־ЯqÊëŽWºÞuJ×Þ–µŸd+ °ªE›­Ÿ5J9ŒJ~›%ÍÊçhÏ^—ö\IÐßÍüÿÙ{³^É‘$ßïïdDœ%³²öêÚ²ª²«ºª—ée4¹iF®èAÒgÓ‹ôôô  ‚ `Fš¥ï™^§»–®®¥»ö¬ÌH_’Ó–6jÒíÚ—&ÝãéÐïÉÛEõ3ÁXäÕ.kîàYoÄ¢bD–Ç$c&¥5»¼Ü¶µcÀ‚…fX),Ê,ÝCå=<šü\°Ç€¿Yh·†)` ê e‰¢¾ÂÚf:«õ_EßÖ‚mÌXp6Ó´gÝ2¾Ù9CæÖ©m6ø¢\Fµ½è„u4²¯ ”QßZ9U@_ãÓïÌ-õð,ðÜxáðúj÷ôïÜΛ\,¼IöÀoö` ƒpWL®¶JOÐWz„%6œcªØMz4$H8&yÑàÌ`ŽZL† ™JZ˜#AÍýžæC4é^‡ïËErç’ã¥àé?LÖZnTÍæF€oŽGÆ/ÃìÑðÄFX{CdW%í½.Ú%³‘ý™"oW1ÉŸ9}hž˜§ç½pÝÏæ¸È÷èð…6ÆúÑ-ZM—Ø+`,*TKØe‰¢ÀWŸf,z˜¿"¸ôŠJöSü¥ãrú#\M½yÞ¡7lÉ¥ò¦ÎƒjÝ=jø Ö”ñ#ÀS¶öÕSÀsÀK¯ã¹{À‹?ÅjŽ÷¾º<Ǥi= |ü.žaåÚá%pÁ¸b+?Sa¹å–Àq7ømz„•ÿI _¬È$D­zªv t× âÄlCÄþÄÕ)¦S¦íìW6º`nÉ’|Uk›Í8e°à>:§G¹áÅ^6¸õo¯nöˆ¯ÙžÁk¼/ô»«3yKù\œ~³Éù•Väïcm¤G§o ü£©C@b;HÈàO-Á4?$è“´ÏMÒ¥–Eºj6óyå0¸Yk¬–0˜³GÀ päbzGn"ôŒ-ŽU² Ï|jté³náwÖ ™ÈxÊiwx£P,ö{Ó¤ãuf#¿Å¸—¿ 7±ß€îâ¥ïwŸÄ3ßÇþöìkX×þô{üé÷¸tíð‚½©yò\œÆßæÄ õ6,£žeçBµ.lB{blC“¨‡XÚSb׫ÞE_—6½žkÉ4µß{ëF€ÈºûÍñ árhK9²Ù{€í î+ÜLOuÇ’LÙêÉ’¯|_üfUßQH0òÐ¥t]î"¬š0ø:t,þÊÏ¡R"c݌⠩W-ºÝ<|Já߉ ü.]Xl,V˜UW©§3_`œ¨Lk—¡TüWŸØ0¡wÝ(†!¬úð4‚´oH¢—ËÔÚ¸¥`KñÖß©{õÑààYàå;¸û xîGøàï·Å%Ê)Žoáü+¼ÿkûŸüs¥À{póÜoÍ–:kBVY‚ø6/Xj–š±µf„Æ_´õhÂÚz‰Á¤tKˆQâ¯ÄÕIç•Nœ–œ”]Úª¾ÎtQ•sM§l-­nzà ¹nCrê} ýÛ›)0é×$&ç'dSÏläÌnOè_›µŽ-lªaK’Ÿo¿æ¥b“¸.ÆlzàÚ.ïM{é2R/Y÷JyÿÞ2…bèït [‹æE/ç˜a2…µ(–8®®Ö²‚à%pĸŽ{k¶ÞÜÚT"²-Fø,#Ž=šdà”7É ƵuÑf®ñÚ¼~Òû%ÅúuaÔÂW´òó)›üüêËxáÛ˜¼ <ýÞù­;8:ÁÄ{?ÇÙêŠEçîÝ¿ 7ù¹ +Áå+®!d[áŸ`U_GžþÃXZðsŸð' 4 kqUÁ1 àÏ ¶Ì¶;é×îÉ“ènƬå}e­Ç¨4üÛÄqVá½ü X—À 8së÷΀ù9ŽOa[ÃZܺƒâ°üKjƒ3'ÍI¦Hlé#¨8ŒglÆšXxx0°a0b¯²%}Gb¸Áø“Ÿ›§o»ØïËÀÝgðÊwqüÝS<û|üçï£(pûI”%>zïÿVß´sþ]°'Ìu3€ f¼ñ ¢×¯Ù[…-k«bp$ÆÀÜc´aNëË}»¶ôq²o$A¨@òDÐôü7-=že±"l;ß´òñ\FÆc‰v†ÿL îßRÖù2ZŸ'äæÜû:p#»•{Ä{djÙßbŽ ){4f åÚɘ‹ØÙÂú©•ÄU§LPnPgPUwË>Ô‚.Ÿ,ç=Ã’¸h IDATHФY¶‡xéBpÍ[ŽæÀÄbq‰ã[0ª¬Åñ-¬¾FeåRX–-ˆ5ñé—‡-ËšÛߥ"¥ •Ñøé‰xKÆc`´gnšdžkâD Û€K5ùùià9àîoüO¼ ¼ößbþ¿ÿd9G9A9ÁWÂû¿Æƒ‡WKˆ[`îxÁ^}Ä›‰Øcüm¨vÒüQßJñªU:MroœÖÐF «‚{èrUùí–Ÿ>Fí)ƒ¼½QŽÁô»:ËnàÙÝK‘Çæ·÷‹F(½ÔQ°çÓBÆÖ`„ôÀG}«2¶ÒÍ!ûÕveêFù^{—æw¸Óú ¶ÎK€–>ĪÄAS׿ìYûîºh¼ÌW0p~xGô­):ÚÄQkÇÀ ‡Ì,.1;FQbv„åU£c,/®žŸúÎ¥õ5‡%ú%nV~¾ << Üîýî¾üà¿Â­çñÎ8ÿ ¶ÆdŠóxÿ×øôOX8ÍKà‘þ­BW1dØhN:ÅøØGíú]E^€¤S¢Ñj ´~¹WÚ™BÄ |mí$1ð§sâ/Ú¹VºØ?žót€Â#ÃX¸C?l;ëá‹¶½c]…„Œ¿…÷À×[ö<ºËÍ)lkþì…E{ñ³è¬û.i6Ë7c)cÒÅÃý6à­ž¼»):”ùr ÿ)PVG{x¿Ÿh"Ú¬CŽ¥{!ðÊ„VXÌqrŠÕ Ö¢,ag¸eËoŽ]9º ÅŸ­OÂ+Ÿ”V!‡ÄƧ-Ó©‹fÙOâžW0.w„˜ÈF°ñGiåçg€€{/àõüñ^ù|üø|e-&3TK¼ÿk|ø;œÛ«†·.Yø—O~ΫëX4•7ïÒhÙô¾ø3Í\¬±‰Ÿ‚Qƒ-$xîëqþS_@2…çµv0.!±|õ%.‘WkÙôؽùÌWƒ42pKaÃë~–m[&èle—>âøqkü¤… Óh{AåµÚZœ¼[mÕCÛ4—ÌCÒ¡’Ø_ÖÿÙEòíŒuþà»È†ŽBè/m ¦ò‡uƒ‘L¾®27/X_›mšŸ ` À˜»Ï ¸°8Z`Q€1(gW bƒÉ%Œc˜FèY\Z[˲GŽ)H[*ï‰z|~ñƒ% VDó0*=çYGR¤ÝƒQJã ¶äØ1p <<<Ü-ðÚpzxý¿Çâ!>ü(që~‰ÞÁ¿Å{Õ<šµ¯Î\ì—&Õƒ\¾µo ü–SºC8^Š™Ï"ük}Ö5¡w‚eŠáª Kƒî]p8÷Æ”#t.ÄòJdÑ"MŒr‡9¹Ò¹tï÷îÑ%¢…©{T:!™–oµ€ûë½%Wàv'ów%ý’ÕõƒCÙFÛQ‚µúyO±E.i”Mdšèä‰h '¥L…"šàpëëðó{6ê•Zÿ4X$3„cøM5SK¹4±¸¹‹æ5Oç—prE[ÃLpt‚¢€ª ïYJ‚ê[ûʲW¯ƒqŽ6Û°·ø’yT ä>&5`6V “ý˜„õÍÑ—b¿»Øï+Àë?Ä+oßúfá·ÿ;Î.š#ÿø{¼ýÏ8s _ÕìÉó¹?99†¦ÁoÑB Õ¼ù{D¢¤wÅN}ž®e`UtκimAµ}ɘώ]Ù¶_`|ë!‡&×N¾™½éyÛýbz –k,½Ün·×BAˆe´ó! F¹™4ôj¢C‹–¬Uß~«úÁvÝUGBtzêA²E¨7,òýÖ§Y(Ç Ö†Ñs¹¥c’0qÚ&sLg˜c2EQ ®0;F]ÃVX-¯–!m–Íy®•aÖ[¶GpµaEÓc ¤¿b1çfe¦ÊÅ“ÅxÇA žJš9ú6Ž¥eŸ›…¯žžoè÷^ÿ1ðÖ+¸÷ïññ?âý°føã»xïx´úfžs3åž^}DhJR„ ã/ÓÒe᫾ZùîêòUj½ _³hØÂ`JŸyÉÊdàØe¶ßÛPâ2b3¶»ç»©Úާön¯ ù¹·0rÈríÄ[ÍñZÞ/®e¡¼g€wúʦ÷¡-TØ„¤s˜¬Zd·©wެÁÜ;š´ÕBåhN@ÿZµ§ÂÄQé¿L¨'jØ¿1U~ˆ¦»´m&R:Nƒd§a?¹cÆåmуçÚš… 7Á½Â-n4³˜\ ˜ œåÀŸ®PÕXúá\z€“ʘjýdp`SûÜ#0̽ÜçT¬œ¶YdÉßµc7G4•‰ N†…ÀS7ùùð8ð,ð2ðêÓxíû8ýîoý0þôŸ±B½Ägïá×ÿ€Ï~SÍ˷΀sþ¥ccUÚTA°Ôªkƽ:öãR¾º)ÚÐG«Þ޵êà˜W>õqÑ'»¸ä ɧ͵)·tNå«ÝáIÝKÖú´¥…ƒäËÁ{ì…‹`¥d0àÙ-Y ÉVܪÙùÊ醽m7t1fç}úÎ Ñi†¯QŸ%œÊH4ýZ¿C“9ðaUÍ´”2¨–0@ØYG:X•{¸pÀ3sQ¾r‰ò“)е…1('˜£ªpt†¹zÀÒ8ª©™–nyªÆþ²u ‰—'içhäÁ…¯ùÜWëÃÏÎÏ—áem«æ)~—nzùÄÑïcÀÀóÀ˯|Ïÿ9ðæÿ„§¾‹_þox´D_âíÁŸ>Ç‚ÕlÌ3þ]ùáYšÏiÃÚ-Ñ/_üY¯ü,¢¡7á‚¡,Ìñs ¤{>Ô•N†<ô¥ITM¿²ÛSuÈݶZê=ºúe6Ýk#;/ÎÎ h-€oàm~ç2*¦êE†,‘è\cî+ë`TddWøÇÌ7M Òä»N_ý6RìÛé‹j0—'ò¢ÄÔƒ×}tÝç®U7ØßÕýþší©Ý³壉Ðg€Ê ”˜L®ذ˜8­¯†ÖÚ…‹'/ÙÛ‰¬[› À·*öKà;oíœyoOh-Ù‚X\ÉáæØˆŽÂÇ`ãÇ~›Oóèïà)à[À«À½ïã;|ç¯ñÊÏ~ŽÏ~ ËKüá7øôë—5µÐL4¸.9« ¾¨B +Î)8N{¬1TþÐ íO”]ðýü¤ÓÈšÛŠý¥qšëì·}¼Q¥ˆe;_lFš¤’^|¥¯Û½g”Á2Z+úD¹† ZH¢\{]äC8*×K¯¥ O¤›æ8˜…ÁHE°/ØBsEتC‚eï=Sýà$Ð"*Â4‘ªÔ‡s𣷠飸BNË|²1ÅÁ÷!ýE-Š‚Àsªåü39C9EY¢®Q–(§˜Ì°ZbZ_͆¶5¼´tŒf€ÁUk¶ìqß*–”ëŒa0Ô¹i³[‘>Óùá\9Bªb—©.WûØ¥,–̆~&t°?³ÞÞÞ%(‘ãÚ­­ê·,ûÞ¢2¤´à¸^K9TkZZû§¯±žt§$óðµ‡t¡Ö(òîW¬[¹±…ù> @ÄÜeX£ñ™ôØDÚ3_*B€m”Û9*k\äÝVa›îâð@\\:¦ƒÍ “s ®®2+ L¦˜Õ¨-Jà˜pþmûµ fˆW—>œÐ­ô+̦Ÿ…¿‡§7® ¶‹×Áýp=$çdÅ!©å _53ŸžtôûÊ oýÏþxñßáÖ³øÇÿïþ˜ŸãíÁ'Ÿà°l%ªæ•¿—lí+Þ ÖH ÷L8ÔJËÜZ°¦NZöYÐoðD€¯Ç(·€¥çz¬oY¿š°a#Ù Ùô¬×m̰ØïD½ò÷yàuà#|÷§xùÀ+?Áé3øÙÿjÿí«9¬Åï…þ çÀÊUÙ‚½øwáÓ¯amÃøDöÄQЬ˜ùŒÃoÿ&òSŒŽY¦œ«²ì¨àõ'!§ƒÅ´¡’n*üŠdýý:eðgŒ‡¯Ù¹ÓH»Bµ¾ æ\‚ðsÇ,ÆÖÄ)óùEàeààÕ7ðòwpë5àîßà³_âãO±ÂÑ)îŠwþïÿ \µ6Õ×Ìu¿`“Ÿéébë·7Á«bdJ0ªÀQûM£©vHWõ¾æ„oKs<‹µ c6C5ZÒúîZ+;lö×õŒë^®4\W7n$-ºj¿í¯4uwàƒ´‘‘Ó{úZ6°ñAcFè@ÍÀ‰·$‰ÛZÙÔBM¡b;¿Ö‚Gñ·ø×ªÜƒÝMÂf£:¬:%õé ƒ[+qmÒoA†*/)ÅQ ©c#ÀSÀ¦ ŠE,QØ+f^¸OáHøÈáîÔí/íÓ"I5s!®qf€9GC2Ø­±tzx¸òWÛµ³w]¢µc7Á‚~é•¿Íî0ú} xãûxýǸóðôóøýßÚOÀœ z€·ÿøÝÂWÖ±èÒ-û¼tž°EžÅK°À˜Ÿ&†5?=RùŸXìWc0$X#´~ã‰Ñµö°Ð&pšÿEV‰F³ ~2o­ƒ×((¿¥Ï‚}LrƒPv¥›ý [Ø&KLg(Jc1@]a2Ãrr‰Â^-Ž5¦À ˜ç¾ZR^³ÜiÁ*þاp˜s ¶’–uÚ*·4×qèpÎQz„b: ù£„ä.>°b|úå±ß—€—€× ¾ó#¼þœþà1œ>ƒÞ;ÿ#ŽNP—øíÂ;oã?w½ÂÕ“ÀôÊߦɕŽ~ KYûÇ’ç w ¿P›·ñÉÏœM¨ì´G<8? øC'z¨(è[-Ö7;&11µkÿ ê·É= «†<#FrönCæÐÉ6²Þž$*KßbÒ²6YNÃmÇfl²GmL 7þ>Hor½¯].ŽùÇnšKï>OD?D²}¬îlÎК-ë1Ûuw_O¼¿ÓœøÉa€hC ï óð ú É*ã'#œnÒn£ÂO\…Å- XÁ˜Lƒ¢@1,¬Åd†j‰é«Ž,æ.Lkb5±ÁŠ-”eÜþ‰›]ù¾¥*àïUâ¼Tº©¶Æ_Ñúˆ=ÉL…­rs/ñ–°×]„µôKþÜïmàIààn3íÙàÍŸàÛ?ÄéOžÃWðÛzôŒA]cñ5Þû9~õ3<`ïv®ÜÓÝ ·“C&o‡ç§Š =%«£*.H¿bþ³õÛ?Ô¶ÐLNªÖÏìgÌá ªj!™W?“gs~‚Ö‰SµG²=´øØFôøÔ×o Ì‘…»j~7³ÙoI¾àƒ[rd'ä–fÚ™ø7Gmï2€¯2 3'Y;ScÁâÐÀ©MJ)‚„±¼‚Å~ЬÅÏÚ<­ã„U?¹a"ð•°'À€˜96Q¹v°:µ0Š æE kaS@Q¦ÀdŠåX¡´8.î–îÑ_úÙÐoÁx»dE«ý@1'70kl©YÏ©ðaléÛªÓVôáÆ|W ¶¨X«ÈGNnêâx xxx¸¼qŒ·~Š×óÖË8}ïþÓñ¼Äìg_ã½_à׿ÂW>úVnq¬9©VnœÂ²j-B¦jœ«lë÷G…BD~ æ?¹ÄƶŒÚTe} úg¦¬½`ÆTm„ÇÛi&#éö°/²%³wK¿BÒ7ÐŽ’s“í¢êúÉM(æ!¼¯²ëžû0fïÐ3Bb–h?ð«ün+—KÂ’ÞŒE]rò (IµZ4^Æúµ‰\b=ãÄ!<<Û¼ìøî“xë/p÷¯€oÿ%NžÁoÿ³?`qcðõxïøý‡øÒUœeÜ»t†Åöi’sÍx僫eæAmsÿë÷qýiqW@ý¤Z«s!UDL¿GÄé.9lò_ijîhR¿àG#z#<%IF¥;Ïh{²ô{ Ü>*¹àáÝ:’þýAÚI‹êwî´†­ Vž‰.Û6cä7æŽë6eú<]GAgæëì.- ²i2ây‘— jêÍ‹ó%6>3pôå0 ÖÛæß})jW±áÅ“)ê E[£ª¯Â&ÍCÂVK”˜9L Ó¼Q ˜¹…‚mÇÆ^º—ÇZ*4¬,5#:£&Á6Æ/œÎ[lÆuá^ÏÿÙcí[QA#9»Óô«GC ûˆ—ý6K^=<¼¼ |ÿi|ï¯ðÂO7ÿ;?‰þŸbqkñå'øý/ñ‡û¸ï<Ì¡±f#ôáÕ!¬ª˜óECÕ« [Þ×oýåÉ‚Cü'ç^q2ò³OàhNÕë»’þ@iŽThâ?Eʵ+U{„Iùgwr¿ÒZç¶Oá„þµ6ojÛH.Gk¥{©õ8Ô>ÊHêk$fô"\¯òô+[°==ýHºÐ/ß³C?´È½õxaâÀñ3p㉾Å4çÓ¥c—уŒe4 ØÃÖ ´XÿXzâéÕìùÕ rÞŸv[òª†m0{ˆdÀH˜Y0˜¹ 8C]av‚IÕE‰rcP–(K%lj…馗(.qéTÁÅ!/ؤ\2ƒ?Ù;a¤… KŒ@,LÍãÇ'À-·"×x䔬œ«¹CÀü£©œæ±fÜ o>>R¸Ñ‡cภ< ¼Üîo¾†7ÿOýxí¿µøèÿÇ:ˆÅŸ~€wŽ?VxÈÞ&U+·Öh©T®"(ö[)èÖêÚúêÆ/Tq±\Äy¤‘•'µ  ¶ê!mâ_­o²‰ËQÚŒvjÇ/9Þˆ%ëE®Ò¥ùyñÄV3Ê—µÆ$2ÝÓvÛBnHI[NÞ-½¤‘ë] ]J—sl/ -H/?MÑúƒ¦öÛ×2p¿ÒHNHlXW ½Ià±ÎBl“è—ÄPD2¢.ÞÔH‰jŠî;T©9QX-ôêò Bjœ^ ®1;Æd kQ­`-êʽ!©¸ºSÙu³Bi¯âÀs—;Í‹¦‡„—î-²´&Vë¥+};Kã]±gƒçÎàÇ€Ûl.´q¼W ˜…ÇbuVãÛ–ôI” _ã·Zð¹™ö|¸< ¼ÔL{žáûÿ¯ÿ9ðÚ3xú{0_üüÈžãÑ}¼÷K¼÷.¾p¯ö5~vÖµZ·™ZÈ’0_öY<²+¬µl.YÍÞ ½bô‹HÕ}®ªVúdúƒÊùI$vj›…Úíµ« ŸÓ$äX;qbžÜ´ÈûÂáú’»fsiw+ﱘûè´ƒ 7èàvcQ×2o¸ S¹é\b·ùJì6¼=7nª™Ò·0É„:šA%1†¯!vlð_]ûé{v¹Ùrº½qæñ¨„òF µ‡rá‰ù*SFØ|*‹ÛsT+LgW3Ÿm kQ–€A«Çƒ'3Ô5¬…©`ì7;qÓž)B»`¯ ^—>HPåqñwíîÝH+g9Ü"[·€c—#Áö‚= ?#‘]ÌW[:÷»£/Ô›~ÜC¿O¹%¯^¾ÿ~ø×xòÀ½¿Æñ“øú}\Þǃ`ðùÇøõßãOðÀ…p {îZŒÂ”løfåÆGV~]Ô 9ë"ÔÔ?íyé¯}U‡<ÏB)OŸnš¨ƒ¸´“ôÛ„ˆ«VÐØPOޤ¸…ÂŽ’¾`n úÕ¹v”ä ­%ÓãiÏ£•½M–ï €‡Ëàâ »•œZh]YùGµéQò/%¹Öù}1ðF•µ6qGK¬¿ÙoPx$ÒïU`T—•-ŒÿtÚ*oIíUoUWO Ñ¶ è¢ß²ÞF°;ÈS‚õnùá–m#Ò}\:S…˜ IDATSÑ Ö\dÔ†0,¨\XÅé— ŽŽåE£Œ¬ò•ãö¼µB9„3‰~ûë“Àm‹É óG8š`v„r [ÀªB½‚`Q”˜Ì`–(jÌíÕ=¬pÏŽG¿+þ¥ÙÑ%páÌ(÷¹¨9|ê6š³dó ¸ÜŽ€ÇpÌ€Gî9äã´4§»È›JþQFm ´£fCŸ™{Tó¦ß€W€ïo~ßþ3<ýcàÅaöê%¾z—_á«ùågxÿ×øõßã#{E¿,;øÍ»pÉ8îVnƒF.bÍ,XFË—&úµl\c­s„[LÄþ¯Šb3:ÓôKÉ‚•®/Dâò¥ Ђ?&Ûnpùù®=»g±V‚¹ïjà`„rCй¿2ØXÒ¶åÆp‹îŨ SËØÌë÷ÄØšÆÎÞmx²ÂLK†gàñgÑB•aýK±3¨-1(€Œ«1R€®`˘¬ƒöÅc}/«&Bë¼Âž=ð¼J‡‘grÀx¸«æ+M®ÖÄ* Ô5êuuõÒàÚ¢48*{õX)=¡zéf&7SmgîQaãзfÄ ‡IµOÑp{–Ìà9 B9žºµ¸æì©`ë—T&oObc1 ô-™?Oú~ËÍy~ó)|û‡¸÷gÀKS¼ø—˜ÝÂùçøäŸqV㟾‹·ÿo¿/C¬ŸEéÆeV }­«þ’^ñ²"û%×? ÚO3Ÿ—‘™ÏA4Õ¬+¼D{Ä)\üYSºö¹ÁÕbŒH‡éÒÉb’Ù¦éÒù6ÙöçX’H¶©‘é·…CZûp£·ÑJ¿ÞSÉ,éõ`à–¼/ º‘ý²ö Zú½Ó§/sk™'_ºØ9žÛF0˜€]X8ä @lˆ$h†è÷˜xJþ×F¡®ÅärÑ ‰Eœj¶"”aÅÌÐz1—~ùëvé‘Ε Ò.ݲU ÇÀ `¾Ât…£åÕ´çÕ …µß,/ÀL-,\Ö…#Ò•ÓÉ_á{É œŒ)|úm‚ƕۿdìÔÄ›Ão»¥¡K÷Z sàœ10`•×»è=ä7ÚM%¸S /­éE~˜:¶ xxx xx­Àë?Ä«ßÇ»À+÷pò4.>Çç¿Âƒ¯ðgŸâŸã·ÿŠO-Kg3-HN¯ª2îßÂ_æŠ`uÉ–æ Ï/ëôððr¤_ñ¤ŽÒޤ*>B¬r»>Å7"ÛZy¢ýlï*Ý¥|=:Ð\bUv¤E¹¶ÚI¸®~Ö2Â’¦{k2@u7.ÜNÆC#Á¡:nŒl¯¢5„ð¿Ì7‘@«ßDÑòaت³ÑX§\0­¦ësÄ8=Á"SgÀ˜/óK/é­ÜŒå¥‹ŸO¸Wï.EÙ¬ì7¹Ô¸zc°qÌfØÃÀ`K[YàȽ+¸.YPþK’BÓXX9À¶,ni€`<€™ÓÏ ®˜—xuèºJº9­Mnš~yÈ—ÞrÔ¬zý,ð¼{Çïëoàµïã¹Ï>‹Ç^Ââ >Æçã?ÆGïàíƇó+ô]ºbRTþ<ç Yº{óÄø’ ÐñÛ3/yµÑ/Õ²n±Â±Sc5bC?­úËøÛ ÷ꣂ•‹l†C,㈺*àˆÍªåáMñP(½Ö8… O]IJ¡ßŠ=κ΀p8qQë&ò| \—ÀÜE)ü(ÞßCÎIø9³‡lZ„4×Ñ2Ú¥[3¬Yçùqà)à[ÀKÀKÀkÏãÕïáµï÷žÀÝ¿Æùxø¾úáòs¼û¯xÿ7øà _°¥žk·ÆØÄA5-¦U9Ï,ýW-˜»(ð+ÊNœ?Â]°ÕŒ~y(¾ 5Tò†pŽðRð¤ƒjÕ¢"tFÁz±J›þ$Ôur;×^ºô;×–z­dv|ûê÷ÕÏnG¿íTe¦Ù¶ŒÁ†ÈÍ)ø¶Ïâ±ÉŽß|¸wÙSÞªïÔÇé±ÞG"2±3ø3vxJŠ]lZ¢`]‹ Ï„IP˵Ym’Llæ5û—ö_\­QNÓfsS  [‘«É¨t$LSp/K‡Áw€S`ÔÀ…‹–®„¨¤´>sá&?×î5E´ qó¼î’E©œ¤¼dïæSeYbš—{ %p \gne¬E()€¡ºn\ÛÃHso }K¨S‡ñÍã¾ÏÏ//ß½?ýàèðÊßàÖsxð>ý9¾¸xð!þø~û3|´Ä×ÀÜ-µM“‡éÍI TçÌ£ßÃÔ`Z5šJÍWç¦"Xö“<±tpM² ÿ ô-j*‡W­_A®ŽéÛxÛ S,窼„¦9Ö&¿;Êðø7@gý@¿ÈMÚ’Üœ’,»Ÿ=În½–qÚ9¼I=æ8N—%mjï¸GÒo©Ó˜š#TS èu±IUÆ)Áž¨èó\bÆhÈÌìæòC(gBü ̰,=u¿_Kõô’*Q. À64»tAÔ àpÇ…‚œpÜÒ#»†!1rg.Ò[±ØcÉV„nlî^Ƴd@R:û–®]sJ=wq`š]ûž]dvƒŒßØÄ‡?èÛ¬q5cQß§]à÷àå[xþU¼ø:¾õ#à•?ó?@5ǧÿŠ~wÿwøðm¼û¯øh…/]ÔW˜7eš›Ør3ÌqÉ¢¾‹Pœ¶f‘yÞZ k!›åNE£—l z­8í·‹º×…å6¢<¨Pƒt‚6óY.–R@¸ñl“ƒqï>ÊðÝ€ž¼®Î߆Ü_u,éãJ]$hÛî7†z/àµ÷Ø^Hp¤_§iQY­¶7²Œ2 ,üB¶ÓÃSs$Øy5jÛúé­òž¾î ÄÝ(°£-lôS8—6( Ý´GƒÝôà!shZ³÷5s•+ÆÃ ½O ,PÚo¸‹àÌ¡i³FôÜEŒ¹‘+ȑ˫ö×v{¿qáxrâO>.\({î?•ÊÁLL ÕP;¹Ûá×”à7Ã(±d“À›A„&pÝD}Ÿžž^žâÅ×ñÊ[xöàÞ³xö‡8~ŸþÿêëÃï…·,þ{•›Œ&ÎÍ a·˜'›²Ÿ³Àø’Å~-`°òòÑڣߨD\Mó™ÏA’8dÔàU"¨-¶Ì…§´¬è‘˜v þ›Þ“QÀÌËcNw®ÇŽòxð/ǽ½g=fäØªô[ðëÆ~eä ¬eÜÈözí}Éø-\+‹ÐWñGîÆ —†¯ý}ôRïzZä’‰Hüì®ÜÕi¬ÚÃMJÆÑZC²Þ îµ ±D"¥ˆÞm‚Ít)xŒ—€œ¶D<’¶pùxœ·S³mf87oâ¥uIoÙ±W«OQÌsÎfüÎ]üsÁ‚Ã%ÃZnE§.P\8ˆ]+§s騲 ~.Üë‘.ÜÔîK5Ñ—¢ &W+šã®ø”Ìçô8nƒ¾§À)p xx¾™ö\à…×ðÊwñÂw€WŸÁ·þ“#œ}Šßþß_þ ¿ýOxÿ=|Œ+ôå5EëQT¹‰úÒcÛ+7­}îÂûôÜ/!+ü™Ï\³()§_ëèW¼òWÄ~E›Í>½z ˆ7x±¤Ö`.ü¯ „6²ö ¹é%Ô°Üá <”ɱy'2N«‚’cê`ÅØok9jçô+î‰Á«D_²Gv­¤{zÃˈyc‡é"&tº$S¬ßkÒ£W÷¥‚†iK±\bY§oN<ÁZN€´¾çñ¶ƒÒ˜æÄÕ?ÑàôË 0þ±‚~µ¢ƒkY˜ÂMÍ?4¹5LR(Œ)˜1|cåæ*7Ñà;ìåCôœç”½]¶v? P ¶ß,‘U2|m>sls6·™ì$ó&îðƒK7õ—&î6±Í‰;ªYKyÜføwîxxÅ‚Ÿ4)ºò#–‰ ‡ÞÂßæŸ’péˆô8qõ;ÀãÀsÀ· ¼ø:ž{Ͼ„ÓW×ÿKœ<…³Ïðó¿ÿä—øÝÆï>ÄgÀ™›Ã V‰¤âÐúÈe4Jƒ¥ý†{/]ì]¬Òl²Š§yëâãTG|é%sãÚ—Yß“äØtGM´Ò:ÔhEFÆÏHœPš~ù_<%â¶Å®HéKôÚNW„‡ì­¦óâ—ǵàÔ—½ä’PÒQì7rÉ´v·x¹öVŽ­µÃ­Ê°[;.¿ì5=îÝ99B‰ù0Ý*6j3cn` ðëEí¦ÚlšiLrTMµþ¿:Mf×$çË"hLƒÅrÊ”’l½v¨4”Kõµ%†eÊë½V%²ohµ¤& ÜÀÛ {|—æ—nýç £âFãÔ^…"K÷–à†~'Ø<+YrÅüÖ”‚^’Ô„:‰»š ƒ—.Ä:s+x;¦w/üÑ•›¸kÙã¬Á7â”âJo<ž¨'Ÿ\´üÔqo³Ôó“S<󞻋§žÇ“÷€gŸÀ—ñàCüâ?¾÷OøÍ?àýsÜsWFÑŠhÎó1‹~O™¹²¼ù¼`Ó•ÅlðÊ/#ÎÛ`éWÌ™ÂoÁÖ(š+ÿ©|LôE0#ñ ‚ƒ±ìHbW•µ;c$Ûµ–´èQl£Â/cfa 3þvwz­?Öeï«ãüsI<§¯2°´à­öÑ÷2Ç)6ôs‡N· ±ñ”¨_K.W¾'©¼¥ã½‹‹5¹ñ¼#Ç:MG 9X’1âG<ž†Ð´[¾·Êø)uÖA1¾Côm2q×lþª/Ý«’n·\ð¶¡Ç©C¯‚Òb` *{uÏ+Ý»—¦œJ7¡ºYº¹rX1ÿ4ÇÒ2Ñ|É%>™¹re„c3âÃ&‹;n¡¯¹¿2½—"Ãs¹‚©5láë‚=]²©ûœGÀ)ðdƒ¾O<ƒ§_Ä3/àÉçqòl3%úÎî_þêþ{¿Àoþ Ø«7-݈uƒ1ö /Ï€#ƒÙÆà|%ðÐÀ/Ühñº#°Ð·“rn,ÙÏÚ=M ½ ¤4ñíà Ž8Áõym“yÅØ*…º–)÷k ŽÊmtEÕúR;ñ{§ÐL=ã¹ùfÊM¦Ê.үߵ€-8aSÞa-"ÀÉ®.Љ¶µ[fëžûNŒo7¾µ‘Äôä+O@×µW‰qið˜»r*41–dUk‰i‹qï¦ýÈ ¬ÂÑ,X”5].à*¹"µA„e¾S0€ 9PÄß †^'\²™´§nባ &ÎY2ªŸÙ+…S+û :¶4táÖÊ"¢^1{JfR34P°S˜Ú:SŽfmÀxê(±N6H0,¦FëYùà…qè>qö3.]zûìý_ããOð ðµ e[?»æÃÑ—Ój¢¾³ LX,–Wëx?ôWÃ&Ïðgžù´gÁ¢<ÚL-aŸ—¯+¤J$ÔßšQá·U®M쌉hÉAÑüÌ"óRÀý¶i·Rƒ}:e0îä]õkcYï–vzÏ=¨°÷;þ`N!‹êÛñF²ÃS`ç’ßOÞ­‹|m%§amÊl»eæËnoí-œŸÀ³­æÛQtŽ bcŠ ›5Îm©3‘ð¿†ÃX ÒÁŒ‚P*ÒX×5¾‘:Uû˜ ¨ÍH¤!å”cá“%ÐG5áP? SÝN€YöXï1`\ô²Q^0ôm¤YøŠæ 79ÀÜ¿p¹W,úJï ž:R]¸e¢é¥J–±M½žùÙÕ®PVÅ~+z­}÷Ч|IÅ™§nåêp̀ǀÓcÜ~O>‡ÇŸÅãO㉻ÀcÀ}|úöêíÁ‡ÀÀWSçlèÞ9DÑfšðܬö<NK””Lg¸<ÃÅ€À™‹ýêªxX7!Bnñ :…Žl°`åÔL¡h„zùIÆèÖ(HUƒ«È‘ó‚ŸeBOÆ%ÈçAéë>Õ¤õ| —mg‘©?ó†5~ÛÔÂ!{_Ý;7™2Ÿ´à›Œ@ídx~Ø éHV±ÃðvbŒ¹—ÜÇ6аgKvnä^8¿¬ís˜dCµþ†>*‡×Žð\èc˜æ`wŸ ±ÁÎBi†ÍÚHÞ•¢¾õ‹[ß®,^J±™Ïï%¦m¦mƒQ´ñ×ñ‚{üxŲË”æ<7§ço)¦Ýä51xì œÜÆ­;xüÜ~G'¸ÿ>ûïýïÏGÎfëˆÝ°W"—ÎÂFó pËÍ©>.QNptcP­0¿ÄÃ.€ûníî9£_þ (Z­*x ð5ÒÈá4üÁ˜ÇÉáÅøý‰P%¨um^ƒ¹ÚàG仑è‹À¦—М1#õ¹ø¿ÃËNÆ“íÝ…·*× I¬•Ä÷ZÙëŸò1á'Ë!|Ýdœm.(½Dضté62“¬ê ö2PÚâMS"€“Ûíæ”£S¬°-ˆvú/ž&Qä„I´a†uÍÅ7?ŠX£Bðö&F"t; ¼õc€Z‘0ùÖ28¤§p›IÑ'.,I°ÄŸƒ¥wi¬*€#¹-Ù«’J¦±r£qï.Y Ø²Ô—lygšèKï2ŒŸáBÄó$6.7fOŽ6à]»5®Ýž#ƒ˜˜LP”˜ãøNïÀ”8ûŸŒ¯>ÁG_á+ྛê,&!̘ÂÍvž¸ÉÕÍ:ÒG'§8:AQ ®PU¸<ÇY…¯qþ¥7ñȶõ—}§Œh“4¡fÕ½bËhqÇò–¿™ñf)š´náF)¡o«b[äÌš¨¼ ŵb°[@ì’˜¾Tfvyõu¦»Î„ôxøxúôÜ’D«Þ22e$%ÕÒK-Œ¶t$ã·pïDŸ)ÞX¶]Ýe£sf·¥­s$=Þß]úuNÎ2-ÏzgàDvAÙ¨© öÛ‰.;ïªò|­¿,YLáF}— ~‘À²…Á£¬ÏÀ%Ò£yƒÿ%PgQ¨E_Ð/í¤÷-ݬÝ÷Tð‘{Í/à©[Æ™žž­j6ßGŽ© ™4Óxâ?£;aM03eŽš»W"ÍÕºÄD¿V•néL2,Šk\v„¾G̶Âq8'ºK‹ °¨°¬±´°ç(¾¼òÒ#`éÞ)µ`ã44P°¢ñ¥éYß“f aŠã[('˜ÌP-1¿ÀbŽû9¨>sÏE× €©Òù@ŒhÛ˽ð+zÅ"ÿ+¦‡èÝúDõêgLDÛÓÈÊ…kæà[SÂÆöºÂÁ+Œ>I×H²©µ‰q4ôq[ Edš±íþÛH¼ÑÈ®ŒÙI¾ã:RFUêàùràë#Ðï8o0i}2o„ˆÛsÎöÆn:jÞá R‰72&†ŽAû¼=ˆf]4ÈØÁdð»Úôpoph,=MÁ5,dÊ-„_´`¯=VRÂ&~Þ˜3¶ )'°¬\ø¸å|=vL{ÉIžºHfŨÒ0쳎~—.‹Â0 ¯u;ÝÎf±«&£¹C5øelÊ2a¤À`å^ËD¯š¸—*5\=u,½r‡Se5‹W­Ø«mHòùBoüÀ/-(}â»:m>ǘ£(PN±Z`~Ž‹Gx´Â×ÀCà xÄÖŽ&Lå•+Ö­s2œç €áO–«=ów&ó.Î>ÐÃ=Ÿ ^qAh*Î&!";=@F§U­ô'h0!±òÆ$¡3Ÿ[KþÕ¾£Ýí_{¹té±d‡2ŒÿÈ%دx¥u«Ú-ŽŸ~[[Ø Èí3%`Œý•#]JÍcƒ;7:„öûÐIw­ß3Îã{uíù.Ð1h˜eA]ëÄ`J_çé 49Xÿ§Ø&2‡ËT§án$Í«{:ôÂÅ*ÝzÈ´XÇà‰ ~‚RÈwÆÈÓS7º`/=⋊Q}UîuGMLõؽ¢©vüFGüØæpŠy6{l>öÄÁ|éŒl zÁ๑š=Ç[9§Ñc½áàNÑæ’-p=sË\5ž¼5Áéc˜a2ÅâË9æç˜/ñµÅ×Ààx¨&<‹Çek–)o„4ÈbXS¬ºÓƒÄÜ?¢™ñŸâÔæ‘ 8†Å7läÃŨ²ð¼l¼,1óz”4îæw3‚)c;¸ÇGó¥¯^{¦žÞ!aßé=!kö Ö±.ÁÎåÀ[—‘ÃÌðÒãÍo|»Q©ÇÏÀ1éˆÁ¤d# 9é… 0ãÂQy–$ó|yF9A› ϯ½èâˆ-Ã6åš·›ïÚ‘‰eÝúœV78è4žTsJ×”fDÏYxÆ‚½…C»{_ä‰2-?¯Üs°söö©ÿ¶^¸W ·æVsˆN€%pÎVâ¼dY8ºQÒp8­&½bÅ4,NÛdMñU^G+ÕüˆÏÁV+Üüj˜9€Ÿº¨ïðĦ3Ü~ŰX̱¸ÄÅ#<´øÚÍy¾toú¥Š¨ý|ù(mh¦’ŠØ/èW3$BgnŒHõFPt#O0å›ÐI' 08¿_hØ!éëÆZÑKü7GŒªñ˜¶1ÀjïYdsÛô;رÙ ÙajðâÀËž’ —v|5‚ ²[z-»3âÞ×±Úi´NS_âÀ˜1¯Ñº«'ìÝt@_ЉLRŠLyD×úõ Ï©ËNmQYh03‚‡Nh šu¾¢‡mÙSÁK7O˜ÞU{Ĭ]¸e“§îÁÚæ5B«HîM¸xáXqé¢Ç–Q¹¨v“Ÿé Þ©æ…[&šê”x»p%÷üðÄœ' wÁ^PLÑ]вVìÑY4êQ°B¬ø†¾·€²™ð\àè·î`2ÅôË9—¸ÿ9Ϋ«už¿f¯e^2ИGÆs¯j.¥Cø» øÓ¿ÖW›fQ‹Fn.6´Á‹Ì.xyÑ#;Zø7&º*»ˆ‰{,mF,}ÚžkÇÓ'nD|lCí`’Ÿï`v¹ÉŽ­µäH~y·]º{o< |àƒäJh7ZJl¤‹yé`˜K«:s ³/K6M¶©‘×›†s­ÁDöó£ô­‚ï‰Õ§Ä˜r=ª–É<¾Js,nã´ñ})SÒ\°PÛ&Ô,ùwíдÎ#àÒÅ9ì-ØŒè›M ;ó¼,[Ckê Â’ å™Ú…C›gho3ÇäKÆr%ó[´SµZuíR‚Eƒ­rå^³Ÿ´ 4ù6€#çþÄïñ'·1=ÂìÆ`µÄå},.ðÕë•®¾ænéÊ=TLæU¡*kBpÎ †F1*?ð[©ÙÔõ©‘ _‘ ¾‘ÜÃÁ ÛðËÅ? – E¹ÒÉxzQÀ Áâ”AÈ“k ÈqæÞÙ»b`p÷^ÐÞyuõôi‹—W‡ æ¨ øÔ¬»–¹CÀ¶Š%¨Ö( Áç~¡<ÉMй4h@,MÐ9×1 Æ9¦Œ?Ú™ÑÝòaÊ>·–|ã÷®˜íp½/U¼92:n×AOÜWZëXvŽë9¾êËÈ! ›¸ ìÜç™2;7²df÷«s˜ë Ñ1Çø¶mD’1ÑrÍô“üo-¼¯,ȇ³‚yq|Mð¿U–‹ >ZÇЂÌL)kÿ/„ YŒVTn»f \Ÿfá¿ ‰pwâ¶ ÿNب-ÁM ¹¯hƒ¯¢¼t^±•˜"ÎçÓ†.~p@ÄøÑéÂ)Ô †sü«|cj€IQøÛ¢ƒôkTÑê„yzƒ·ùµ­~B¹eè«ç?'ŠÔÖ应ɮ¢¼k+"3ßà¸Iw¹fú}aìËFż~>É@Òµ”Ñp ɹÖ÷ÞÇ ô.k}Õ#£›ª±UA {†/ÂÀ,½ivÝû|ZƒQÉÖîi‘KæÜ* š6uvš];Š@D§Úg0‘#ñ¼õ¤”¥²á™è×ø„\(³‹=T| í®qñm¨cŪNšóÃ×çÇ¿®¹b]±Æ•†Cž×l ðcØTJ®ÐøÅ„_:ëÛc}?e@Œ®­ÒfÕ‡›eUPú½V)·‘Þ{Ø m­3êäÃHf^½˜t ˆhE‰[z7ãz3ðK·÷|›Å®$‡ƒÒŽ ÆÆ±íäz”b’OŒ}¨»Ë1íZ] ;Ûá(ç ‹Ò}z‘2'wÙÁ\È*ÂBïô æúƒ â”L Pº²ld[H:¬ã(ú·V)y‰ù ÛC6s¦5lì/Žsd7)XïÖZÒGð*üÚᥳþáLÃ,A¨î*·¿öá¶ö'<?Bø);Å8ýšÐ_ð«þ·ÈN3L”~î¤-1µ›ÛhÉ9W*Qº˜[ ý¥·7ºvéFÈmÛèØÖ™nõ¨v2’Žè–ÌhwKÈHܵ Ù^\c§íJ:ðé¥Ewó€(Û–ëäv¥Þ‰¯¶‘if4cmî"ÍÚ®U,ßMËK¼åÄ05ÿþ$ú Ö_+­ÇĽ”>Ö²Þsp?ß#ð‰Ç'c B@Ÿt˜.HïAçGéClä§0R¼ÓXè×È!mƒõ]*ʸb;åÂgcJP2p-Y¡L(#^@ôp5f°· óÒ ‡èy xµú®ü¿ôÚ0¾ä[ù'EŸtdB&q1ÊøŒÍK*¶uî¼\™<„$\ fêÚ”iI$¾½ó½(Å®Œ9ƒÙ¶ÈÈëk Ò5Ü;ó¬í(¡Fo&æJz©‚ÝÖãðã½d·m³õ ¾QŽAÔé«à:‹v#q¼gLô[‡h-ÿô¯ m ö˜ubÎÕœ„Å;ftÏžó@?%;6Q(ò€„…b?7ɨÄ6äUnsðg,aÀ°t8¾åÿŠ)ÐÓ éºpÅáÉxĘƒ™°Ü°iɤ×2B• –L¯ >J#6‚nÑçf°îLÈ9ü/ž^“žh|ŒÌKÂ]1èÕ—îþT+ĨŸývo‚×R¾¡ëzSòm¸ç¶6»1ô$û•J4Z¦§U=J»Æúc“]µ«‘NŽuyÇ_‘]dx"ŠÉZKzÁŒ‘v‡’_ã‰3bx7ff*bÓ ‡è+Ç`FÛ¶i^ùf¬5`Óû uÊEÔ¨¬ƒ<3Rï Úä ú˲ˆ®àm‘çIp6ÊÑù"6Û0ØàîâÚ¬ú7¨P+?­Ò„+q¸ Õ÷¡À*ãÌ¡žÁ!„ ¾'¹`?­ÿâ"Q4ë[¥ë—hmg¸)ÐTé<°,¶~¾â/žp UŸFÐô9ÌΆ>Ú$am‹†¤ßµ:Ñ<( ]Ƶý¢ÓÓÄ J—Þ×®ŽÝ•ÂDûú×»ÜBY+û‚ÁÃK¼¥.¸V{¨¿‘Hæ]yS%IK÷­/8L£”ÞÙ"Ç4vyCžÏ̉c Ì÷§EwO*cÌ­$i:GñLðJËCÓ&^•š<áÃssˆ˜ ­)+¨\dD•NŒ!0O÷ò­?½VÿðµFætmcÚ43p@Ò‹B \çÜÅ·ÅthÍHA#ÅNã[®s„ ®Pž×T&ä8ŸgDJ´£ôHÐfqã³S %–L3•~ølÕ.íJ·‡xÅ'ؤê§ÞŠ`]¾­Y46ôë—цlÖ>„ŸµÈ«ö¹7á˜Í9’ ä„ä»=ÆÃúºÚº'Öå:|ß/v‰Þ¹ŒÁŒ1ØpÓ¤GŸ ¦v%ä„Qp#‡ ^2o·;¬š^Èj´Xmð¨Šc` e¤Î«‹zlÞAÂ3˜÷ž‘Ú¯™pm—ר`ŽÔ9áÜ`¸~ql0X—¶Á²d"‹fÅEƒïÔ1¾ÏuA¸ &䄞ÅÕ\‘€(J@/Î¥ý”#U=ß¶¾aÓl€ÒiÖ‘múÉQßú¦&ZǶÚ7Xó-fëû-˜#ÏE£¦®‘ÃwN´cà šTr…†^=jÀ?µ‚ê {5Oj±*ëXÊ ñ±Ÿºú‚é·!ÃÓo‹£ô¦µ¬Í}øA„±I~Yö®Ôã'ÌœÂÀ2°1<»=ྤ;*Œ‡4v(éNö¨x¬GIj°R§ûLƒI,ǵµ­Ú»ŒG ¸1šÊºHþ FœJ¼÷œ``¡þåX%þ©Òì±PGl)ã‘Ë Š’J¿§`ñ¹sø!| 1íR:Ü(ýFýô§Sí[¡-ËY1æüæSû‡hŒ“Ò9sm|¥(^Ú“ØxU¶ ?MÐNJ“ ýš{u‰ÖžbAÞÓô›>I5“NYLäŽÐáiÉq·$ñSïì~GÕn$mÒ Α³@¯^ôg*ÙÓš:ÈÈE´«ÀåZr];¹6צ1Ôi/ø:^v—^Š™æÀò jÛÔ“1–}ô`ç5رæ‰Qí6òPb!V™-L*ü™±bµê˜©”©˜‹ ÿ·9’ÈHC”Un"1Ù¶-4Óá1·ó¬5Qk´æ•"²¨CTY»oáÓP5k•7¢ÑÑøÿÆškâ´Kf|ÿ¯`~ˆ¶_#=÷s €¹hÖ5‘‚ÐG? ­uò¦ØBĉ™ 9AÐͧߎê^îhè»›1L§åÚt¶$½Óïµwø– 8ÀpÉEùÀ¹¡2\ìØIâz6ÕÐWg%![ÒŸ°&´!¾…yiKÔÁ1 Hž1(Ü+d›dâÅH\CÌb´&Š ¼ô‰õ7ø_‰ \¾H8ŸÇzEœ÷‚ô+œ„sq¬&ê`ƒiÄÙÜ“`ø„å`Åç{ •,mƒø—oUY‚G#·ð­æ^ýÖߘİ6qTì¼* -M¿k;Ö6žuìL†éŸÛîÍï§w‹+XŒy$ã¶­GÉ)fWÞªÜ ;÷ÂÈ‘H_ÌÖ]:šÑc)†tHkÿï¼â„1âÊ12&sì î±!c4Ó xÓ8$Òkð[;fÿpšÌœ¨LùŠÁ$EˆWùQ‰®¿E„ŠÃFkÓlLJ‚”ÈÓëZ"_´æi¾¥4z!(mR"¡¡RsIPP&šêâÀ÷­ñÍÖšcC º©ó¿,kl`î Ž‚ãÖ_õ*öЯ˜—C*‰i‚Í'ÞL^;Ð#¢áµ»æÈ8¡´£ŒÇøñX2°ˆëÆðYd«r#"ÀÝ›ïHXk/$M8{êɱm# Û4e_¶V¥;Öù6ˆc×êéê I@£†t/S³\ÍÖ ®™¼–Z&HF$ökÌ]ñfà  æ|Òh®ãÅ V«qYë7mÁÑD­éDµ% ÀjͺâØP‚fgá§IœYœºua5'Db L²PôSÏH7§µV‰üm‘e'8Øb­zôwm©¥Ð®=j#±jCç;|;ÁÀÛ0¦‹ÎMíÜ9®dŽ/´îjó5ìÜAiaÕöª££ŒÊªí“©¹ïÌì…‘£’}ñXG(í…iûõUNøžµ…ñK_¾œR¯M“¦…&å' Ò¬eëNÙm‰~vƒƒ7c}`Ž'©}`Ð’¤àôK‰ õêÚ˜g Óƒ¸[úê1Zn¡V.rÑãv i"!:}š“uíd(œK¨Jì¥3J4Á–ü[oäØÜ«ŸÎåÚ‚¹ óèXøÍ ÿ&$8 “ØMê+öo‚„7Ò™ÑB‚M½…÷£íÜ¡ŒÍžLÒì­bO½ºV®k¹H¶ZÀ|å7"Ü]ö‹.nŽ\ƒz‰ñÉÀìP6Í=V×vÅÚåÎmÈ<<Á¨ÚHNJ¢oØ_m µ‚±×ú-ˆ±ôµêËò~¼.£()§ ] ?#…m"¥V+JÄ“%ZE¬âÀ ¯4ëê‘‚`ébl¬ÇAbC šØƒãÂÛI €ÅÐ@Œa´y Ž +¬½"iû­ŠÍZß`aa0ë ]'è7xB}ž¸¼§™ü)6DÕèd9’€ÉœK.ZÝPò-\{¯¼öä½Âv–/hcŽ£Hi'›ºîšp=û8aç(Ò‹¤½ËF(Â¥c2{9Jb2@“híC­g°¼6¯LK2KÖK€áØSû+BkD ÈL3ÒœÜ=fY°¹ÐÚuéH‰~*˜?æJ4t ‚Ê#\aÁö§ûî´³ý ÿ(È~» Ú– (kI¡"§×$~¦™J°Y´þCyÅÂYW ©Ftaof„;¢Ð†úRoµsÜe7R_È3á …¡B±tê¶ÑBökõªð..Pài?S%Æû²hþ¸AYœ®Fo‡¤ Ï yCFû*uXýFhƒ‘žN$Æ(Ïtbï…zuÖ.] IDAT&<0ݲϬ/¿Úq Ù3ÇTgÁñªÃ²Ö|ä6™ºJÅúÃU[¯#ÍeËq~–ém¹2VóQº8tLþCŽ/Ù- 3=kSw›C‚ m–°_³Ì{ù=B»Ì«Ná8–ë|¤Ø/U@Ì4âme•—u3ÅrÐcyõ ­¦yåLƇÅ<Ö¬ðñ"’·Cf„>ufdÂÜ ì8¬ åö–OìKvï¬Y%!vÌ ‚m9$¥pQ¼5fPaÿ9ì×)É, '{P=ðÂË~«ð4O¨4t¥0%¿:V‡¤ 1³ßPÌì·"ÒÛ5ñ-Ð3. *(,Œ^` ér`ƒû¨ˆ-é”›‘}BQýPïåvë£Q8$6è%C6&ö…\Úᙳß<Ôeœì4Ðþð&6_G}Di˜YþèíeHu—:M€Š†Za*¢+h¡/¦†ÂQRä,‘@ºØY¬¾Þ°kyI/~@MmŽj¬vQü /ÙÔzc¿(›5ìÉô,? æ ”ôÂTy´ UÅ ¿˜ íæ§Œ™©FùÅPÌ“é©Q°ß©BÅi'ÀfæÀ3–‘i0Ä-™ÃE:-Ì --¬¥|‚fuåWùK …¡ ]•܃ÿŒU°cj¿ažMÆ`¸Ï8ß,óI›Ûxi•—B [`{íK(ñÅÚ®ƒmAi@¿¼Mš"NŽñÐï°±;pž7Ò>¶Ù¯ÁþÕ‡Âvê^²@€¢_þþÆ/äxŽaãí€UýòÎgGEP¤…¹ˆ¹E8 fgöKAqÒN…òóhIS7¬˜ð TÜ>÷]´ü6}lbÉIŒÈÔ1"·c½‰¾ Šºƒ!ŽEãÞZŠ…ô øæµH¦o”t ï[æ9#-oШ‘’‡¯à4Ç÷Ë@øm>¶¶ñ_Ø((yhJéOB? œ°_>é¨F—dÒ(&l—ôŽX¨Ña³v‹œê–OÚÒà¯ûp%~8¼wø£¶=£«!¡öØòùïý¬G¼ÝÁ,4 øe¨Î,û ~¤*¦LtŠÁzçk~n¼ÒV™(¶·¢cÇÕke¬—Ox¨·e%ðZ±rà~J4¸JWªëö* _@Ko·ÊÅÆá19™IÑ"Ë¬Í —ímÒb10Ë‘½]¬½&QGуnù€)6p×6 vl@ûÎ>Zj“.¸¹š’ #ìÎò›ÃŠQ TÖ®Õo;¡4¸ÐaÅ̲·½®sNv˵5¢K(ÝE™›Ã„QÐáM‘U{ÁXC%À†– Yn‡5Ä, ±U ?zÄŒêÎê1Г”= zpŒr`^¦pö£Æd¨¹Î™U(äß½2Õ)œpŸ1c…wÐ `S•“D`\ÖŽêwWn"]fxH–ê³Z" ýa•ˆÔSzœÀ—Qpx¯CM!#ešÓm´mpدý½_êµÏºà…÷ÄGè4ƒaV ºe!ò™-ÂÍÒƒZ†•¬UKEuFWÝ9Š™:"Ÿ0È׊`<:>3vDâUо… `ؑޜ Uy‰´ ¹‰%CfM‚Ñ3ªÈ©2\¥Î 3ò»OwÀ8DŽÏáËÀ†h¯$ Äs6F”cdƒ¶‘älólÃli ¬/<‡S-¢>:šHüyHÔå·;zcúå_ÛŠàGHózpÆñ äÃÎ1êxL‘jã;‰ö¦Ã{º»n]E’sC8a8•¢¿x”rÅÍ”R{]À°> ‚äÞÀxÙoS¬[R+ÑàÂìh¼d F3¦0zÙCÈW½uàüÙ‰ßõe±†ö04Õ&À”ý¶FøÊ+žIöþá ‘ÔÉhI‰jX‘1¦J =¥ÀYï¨ E“Zh] 6Ì)f<ã÷HY¹Ì*?”"dž Ùst>B"J¦ŒØÕYÚ¡@!…0¬s ?q¼„e¡ä VAi§SÑ›³Y„ýN¬¦¢C™9 Öí&/®®mü7òíuж9vlаÉÚönY‘ ´ 16à¤ísÈêѺ»†€2íZüPA»Ã9橯C>Ñ1l0 )›ã ¦—ÙùÌÜtŒƒ^7:çmO:ÿ)cø)Ž ¹I…!\,à!_>ÐBÆUað•ZŠ!Ÿ *co@I_µÐ/ZÐíˆÕ"À£&0e,µ‹B1¥™Bhï÷D8.¬ž¢Z”!ð%s˜!„aŽ(sQÅþ&ð ³Ãº ¦×(n‰.sôVaÇÈ«aCÖÁÕ5`'EàQ¥ÎÇ¡õCAÌ/ÂÚ(µ¹V¿Üd(¤ó©sâ| ×Ð)¦ )P*ëåT@ûb8¦x¯}Õ©ˆúCûÑÕ[uÐ7~ p,5¼á’#Pm8¤×€„O4 ‚Ê“TýqÌOªru-Ç ¡mÑBË>Ñ‚wö›1v¬žQÅva&“[ˆ¢œ-ÔIƒEœºFB-(7“s`‰F‰œÒÐ%ùKvl縌èœÊæ½íI»@·|ÒiŒÂ©–R¡Ãúò™µ šŠ2sNüÚƒKC«m»¶Ü"¦+¡.Èü©áÁL¨FÈ–CG¯3ì; ²Ä;¦Àó^Hçúåãu«¤Ã~ònÙbh¦cžÃ~Õ9”? M†ƒ„C«˜¥ä£ÐrÉÌâ‚PWzáD„®_tàLƒÈgX±&'º·Á!4"dÛ«E€ËP¯DPܦˑ¢¥ÅÝTqêŠÑ~ (†ã­…Æ÷(3l§±¢mR&´¤0Ä€7ÛækËb! ‚Jûå«ö’:J¬c¤“¯vèúpÐ/à|=Ý›[m~hÓ?¡ñðòín¹ÉÌÓâ`¶ Ò]G/\@q  ’QÆEÙé°J¸Éy¤üãXˆ²_굦)xt¼%UÐc^.AKÆõòöKG’›Bmè€ÔòÒêÀqHŽ›zf¿-#ŒKâ°Œ€ÕMj°é(Ó(EŽT’ýN ¨å4†@vØ1>éd—içwB|”"¢¿Šäñ²q4é01*ÿ K¢–÷ËØ,¿¶Ê¦FPHoY(¡¯×öë䜙ü!Õ: öËœtªSRáÔ’ŒsÔ*Þ½Nר‹/6gsþ ètG)å%¸‚ƒ°·ù6µó]O‘#}f€KKÔæ@È‚„ UÎ1¢Gdƒ¦F¬/—W ¹–»f@ÛZ뎑"ßÀÖÉCãZ‹ g´Eª"ôɤb§Š(¤€‹mKÜRw¨:t¾bvÙ¦ú(º!Yµ9ð ¾5Jî–åóåaÃŽIÛTc‡±;®¦x¯M˜!%³?°ßÅÇõ¶:(Ü–æ=ãx‚rN5Ü¡sC+lí(FÁ‡Œ¡cÞÑè8ÙÙZ܃þí1¨îvŽlw¤ßëÎyoÃy0+Â;šb¿ðLÏ Œžy™ãz  m‘Ÿô"n–.Ï~‹©h„n%šÑH+1Vx‘¯™Á}~Ë Ïhq]×ËóðP„çgõsÅ~Dãu¹=NI O`H ]LX r- -´ Åñ$Ž¢äÛì’Æîœ0p•ÅÁÚò¥á¯_6Øæ]¼Á¨ýý²X› ÛoÉ2Vhgu„œæw˵ГÐÂ:-I Têf1–£Ìr[าÖ­ƒá| pLr @‹9ò|çþµ©o}ñXÇ0†÷:gœ[ŒnógQ¡e´ 5í{mŽë8-ŒˆýŽ‹H që qµ¼X©^ÈÚØÔ ðXzbDk¦‹3LÈ0È4ùJ=V½…- âÀ  ‰/Iyª–—*;…yúM9ªýkCë›~«ÐÅGšóß`l–·Í.Yº_Þ´\XØ#^ÕÙAŽ“ î–W P~Õ/ÛZx®@;áêm†Å17JÑË í?ôÌúr-ЍwÀ“Ét.Qì·Ô—~™öR}„FYK‰e}…z¹õÔ'yž´CÕS½–ÍPN݈´.W¯«%Ì¥µ…žZQ4bÆdC€ç>˜œy'ú©¬¬>“ä8›«,^db¡*U"D¡Lƒ‘ÃØÀÃg‡PDÛCɉàÀÐZ”ÌCö S B@ê2é-k»å¯ì¢rzì…=¡ÙŒ´ÛÐØY=8c–››c+’x¦_Vä”§8ªN-”¡<Êvd‰ÃÉÜ2Ô×&ÀݲpcìØè1E‰{ Èf¼ û…A6å@þV•ßûŽ{mxy/´’o¡¥0·ZaÜ=’ãâÞ-ÝÜà—ÀrÀûœšQyß]%èŸ0rÓE&–â‘b˜ðÌcIL´Ú¡º½ã0 'Öd˜-ÅåRl $H²]^ŠvÓv;Ü^ˆÕ[©NƒùÖæ<¼µvIGµSÞÈÜÈëË ¡ß ÁX 9pšï|tZd7vÍòOöECz¯3ZP‡ öPG PÚì”aî—È1€›94Ì¡—ÃÉž® A9á½Ãã|ÛôeW?7ËÕ¡…Þ•x†™]›…NvÎ;åH‚lÇo¨I^-eàL |¹´¬˜Ùo1Ä56ÅE‰îÕâÀ+ÕËe°Z?ƒ¤‹¬t´´À[@ãæ™( í(S…+‚'±™¬B¹ÅrQ¾gÛ dŠdÆ m×—µÀ_2V×CòÖ/_…!©dñÞißêá{¤kwD´ ð’ÃEFqí†(øsÁèÖhxË <‡Y2€€>ÂñCi¡˜³Y&«ÌI‡Ü.Ž×A!=c(®ÃÒ;_1¶öuðß±©Îƒçº’YHÂ~™^MÑ<ÂTø<åÕÕDËÍG»’šÀ™*‰OS™þÄo¹—Ç‹¼¸}æ0ÃзVhß%r`¨1qðLuø1±Âè-BçóRM(0‡—™Ls²ŽF‡Çàqד?£lŠ'Æ6_ÊAóoqá‘í|›+öË—†tt·ñ7¬#tÖŸm[gU¡Úå˜á\rh-GÒR”Ö#U4|´¿µëP_³üÑ9ÓY'ùQ 亣å fØ:8þàíàµ:©{çÂVAVQó5u¨#H¸¼i-ƒ8Ò-šj!ǽ£REhX&jñ|ç¹3=äX0g€GƒÜ\Nå˜åS‘wuô kÍ xíWYûu9ÖŠî&a…¥’zvx=Ƽ±¬„VAþæ;eàAµh?RØÎ{µSÙH£3Ë\×X8'»åKf¹¼} ‰¨cŒã"ȨyØlª[þHé…¤·Å Ê™†X¢B™$t,o 1ËÿŠëB& 0EõÍrÃáG¦ Zm Ã{Ñ·s…½S¦kèÀÞçTBbäd ׳²šT‘™pŠ¡Í'i&«*.TÑÛNçN)Ž@&zŸëÆýq¨n@ãhÖ?郧…á7 Ÿ1ŒØ8(WÉñðcÌ£øRt‹¼™%G>ä½òfHá˜3ÕAØ,?]:ÚW%Às`T¸#¤·e‹r^LÅ`àtˆ¢÷Îù¸Îù`‡ã96{.Á@vj‹f°}žg¿ÔPq,´Ï É0t‹³fä˜~é×±–:°ÕÙ¯£ÑÝD-OP's.1ðÒU$Ö’Hk‡´L9p4š²Yk…Ž*™ØRy¨#—¦õ~œ3À3Úb‰Z¶mòpœßÎ#„5`ûùbC Óƒq`ê2„S.Ü{rà{PÏävcA…¬H_·ÖÒvì‘óψZh]¯ Læ*#…­Ð}qÊÃhGÀ†@¥¼…¨êök;ÊáÒö”ý: "N«;ìXž3Òxö‹: êÌÎ]áÌPϧ·@Ÿ›£ò+k£À¨/ÝñßHH™ÓÏO hœ7R-B4b†ç¹(•¥ ž:½ºz+ÎŽxBDó æGøŠb¼N”/Ù?~³^ )®Í$’Lña³|£p¾ùÿ ?l¬nu€²ÓÞj ôe’w1…: è=4“¶ó©2¶ÔóŽv?ºk–t]a1>êk°Díg,gÎê¥z“/¥QW£ .Æ%²²ß2J[PgœQsÓìt´f^{Zk£Ñ\îe-ù…pŵ„é-c4EP´fÕôz?hú¨< ‘Æå¼ÍA«hD.Qê:»iö‡Îï|H ]½¾Á$»oÛÚ´Ä¡¸¶(ûu¸±sÆ`3ŸR:L¸[¶ÜA·QÌ®Þm0+h€#Ç3L[ô QÎU¦",C B›VuË̈́ܘ\¼àékoyÆ,û JCµÃ1àô/ú]_H}uÛî‰Ôá#sI(¼"ªXůeHÎL’%†3ÓQ-D¯ÍPºxÚZ­8*Êe€ôã¨!‰ifÌX %i½ˆ¦w(œB>Ñ%!Êô â%MH„\Tç‹ y¢e_]|\ÐÂk­TªS5è}¬FWðÀ6Úé”wÊôD}(6¤aGô`¡# mòÖߢuûeÏ@#)8­}x÷Ë­–”wÔIjÙTv8ÃðUX B LøÑ±þ¸‘Ã~uÌ“yûzo¨åAÑ9Cq{p&Ô=Î#bá&ÚÚ¸E¢á#_¸ (Eº”$xÔ“·.d¿9ô6âm ÒÇÆˆ[t ôÌAj&ƒcçÎr åÙ±6Ò]áDüÎ%¡|ªBJÑqÑk“PÌš¢¤t Cŵå¨')Ûç¡"T lE•bÛ±Ö—ßã5$±í&PÏò5‹GõÀTÆ<û e§â݃ÿP 5,QÊË €çáC93#2ꆎ`ÞðìàP Ì<Èx¨Ú;ˡQÉùà¥ôÆ*P2ŠM‰aâìºBEWi6²Šf—Ye¨ŽÑ5ǹ;‚"ŸÜÕ•_ú;Àå£ÿÉ ;e1Óª\;÷ÆmqQxth¢5&…¢2Ý¡b;+ˆô¿t IN[Å°ß í„l>îê¨è€: Þ ØviõËÙ`/'j¡ç f³}^~£)ŽIèg¾$S å{Ù¢\×Yb0Vyæ ã*çÏa¿ÆúÔj^ÿK®ÊÙ/ʇѺ<˜5´°ÂÛ¹*œ‡åèd¾¢dJæ¯jF¯×€DˆVñΟíD‰m²_uí£c¿â‰4Æ¡ÂK°JRµvîötãHu¹«Œí·ÎyÈUŸ|#¦09sÒªˆ.ó²V9­­v8ŒúáMQövbž‚?äy Ã ¦ZHш…ÍC:·_~;´C½ aö͸¼ã º.˜åL+„!Šý24•©Øhy ¶-Y¸‚ÊúöXaƒj/÷v @ï ÊfûLºÏ¡m +ŽCõÙÛ†"Ç.&DZöä ¾’!bÀŒ± GçS_ùÑEÍʨóè2D¢q®yòj ÑÃ8÷øçs¡ªM Õèľ F铜SIl *B'rfuð~s$ë[€ìÅazèGê¤!`=Ö_|ØdÕÞ½iã䦨 ±Î£ÜØX­ð~ì°m¦Ö(¦j@IX˜b§^ŽŠ ì@ë(L`øg³_³|,¯1ÈÎ’»²_”£œÙF‹¹©©°–dåHWc(¨%ª2ÚóI¶Wñä¬8äîߺ!®ºöiDìB<ÆÆNög¦Ç~Ë#‡ º½<÷ˆ {+F°»ö2ÀáÀÆÇr bíSNK¼zSž+0 w¨épÜ-_µ ¤Ã~mʇ2[fõ%·^JL5Êæ“‹ßsºvã»Áë  öP¼„ÌJMO›a°2”.æ*sÒ¹Ú/»…ªŽºZH x›Í¢™^‡zÀ;¥[Þ†£3­=±ôàŒc´“'½è™òðÚÀ»—@5<‚«”gfNfi)w7i- ’k©E³ìWkŽ¡m%¡;’§I€GßÏà¡Bo¤|uM Ê?¤›ªÛXï, u%Ð/GTùVиb_Ñ­m•ÍH<ðšU˜Jú ÕÑN̹ç ᜞n&‘¯[ŒÎ~?Öâ~1˜áŸèIgð¾•4І]Œñ”済Q/QáO2ÅÐû®·ÒkÀ1eÐíz†Ê{‡=ý–G/¥Gr Zñ"å:¾¥Þ›…q2/ßËØS&íFЉÊ:\«·T×€òÍɪ±³fé)ašx† äÑh°-Õ§’}ш…Î1ˆfà0†¦’]qƒ‡"W6† j¿‘V¥ä@BkËìèÿN™8ôÀŒ!Ò¾ÜY»åŸ;¶Ûâ¥^ö³&?†Pã„Y¸q¤í/i·Ï£$™©ë%±P²·¤Íîø?³|`–NAâ¼í½ayÊ 9[cä”W]{˜•,aõ óÔ$£2£Ž·®qóB1±æLÕp¾à»dÄÜHtn²Y2 Ž$o@â$ IDAT¼’tŠ]X×?ÒP`(LÑÍLa/Y¡Ø)¶ƒ8°Ü*>: Ýø¾fä8]¹¾A‡7c  ÓcØïàU>8vNvà’]Ýî©uK¸s`¬†0ÝAYÕ!!Dï“l_r˜³‚J (:S‹rÏÑûÂ!·öŸì5V[„nD›Ï0v´zÆ6ÃÑÂs]/{§D¯®¤1Î H™¡eíÓˆaê"½wYB¡hC ÍQÇ$e¦—^Í™.k«'ÀÇâŸ89T„ ƒ.ÒeJXDœ{ò$G¸Â´[$\_PA3ŸBù5+Üa¿d³òòÞhk™Š ë€x}™ÌÛ· zË o è…mô^eÜh–/1ÑÂ^Bh´©5Ce ŠñÂ?Ãö;:!Øk¼Cä\—:ºœ!VáLÉüÓ„-ŠCèÂ,YÆc¡ZòqΑ É„–mkÅüSžkT#ÀcçT¦™&0ƒÜN Þ„ Dãk9f„ ”/ Žf³(-ñÒZÛ*^  Š=] Ÿ{,vì-®Ø[ì×>pdg> ™³c#‡MEl–»¶üÑù£È•c6_Æ,ó4›@Â5‘~¹¾Œ„ÃbÎy”9{U;œpx—•sŒR_çNDýãh¡@5 ö‚—ÀS'QŠëe¿ÑÈÇâìÁL‰ ß(¥ÂY=N8¡ñì·ż 䕎3û­"ª"jµb˜EKÆÒ› û`˜Ñ˜è°µ^kœ Q« ZÞ‹Xi®ÂƒìŒ02"#äå½AfPí-9Àx:aOþñåÛ¡Í2i´+¢T°[þoÀGh ÔöI´‹ÂëV-H€nìÀ¡‚¼©ètÐ=qÞ,÷KÜŠÚ ôY6-æð=‡â®/´G‘Ã&0½†’py/ ®C S¤ˆ!º=kƒ„ŽÚ†%NÂBu…£[ô–„fHÊhAqBÞ_J§Á¦Œ¯!u›Y~ѪqÔe¿Ãq±ij[ '  ”Á¨l(:Ê›¦ÈÔ)^á-,m„Ú h3êŸhù’ЉÆG×X™MÏìDÛÛ¡QRg;L•"ÃΉ‘¨0(r¸ýgg¶‡3½õöå^” RÖò”Ì Ê$fä0´ªÒ/{Òù[þ–¯±®¢ì—:ã襚àèÎN^öÛc…íãÐi Š’”g΄"Ô‡ÞÂvÐ"¡»Ñˆs5s†WDu}ÒÕÁ*´}Ú8UÔ!ÀÕ#é^ÄõQŽž­Åä@S™–ó¡7ti^ã8¹mF{ÊKE"èM\l-h³ý ÛÜ ~%¸ƒ%º( 6²¨‚¬©`×¶ª[¶e¿ ¦–øQç4лڅ6„ú‘*J s ’sʇٮƒ§Œ}5À^•@Át=¬B- Gó"†ÃS˜b²1sïɈ2¡v 9°—1F7Êd¿ŽÆ¬œGKxubæ5 ®…Õý3có0e §cÎGbtL`5Q¬›ÊL¦ó¨ ,ûåp?“yv—ˆˆÑ%ÔËÐl¨tÝŠÿÖ6¸"¤sg¢«6£ŒO¿¹z˪~Ù*›:\·[þ3Ë…{`<Ú(Y… äסöË£[>v( ä{ø½Ùa¼ýƒÆ;–ÀЇŠo(®kØór0¤×`>e±’“cŒÆ]ê$&30&Óí43ÖmK•;z&Àu _í¨‚f BÝV¨s­r³‰ŠÒíŒ`³(õJl…\‚/¯Õ;r9’Ÿ¡Ÿy0{3` ÁkËïUvTÛ„S8tm^j«ÖZñe¨:¨ ûµ9Xçë‡÷XÊoP¤ŽèGÆ 6y['ûåcû$OùÛ¼ç…mdÎ ™˜„£S2¼%sǵÎàd¦ô˜/™íP—Š&å›0§Ù?3Ì@€ S…bñz›°¨|ae'fØÐ]æhpÑD_:(ÏÑ2Bg2ì(¨!NáP'„z,¢_ Pl³¸Þzµr·üMÚ82Ñé@”õ9ÜØš §\H°«PÞË3a~MÄÉpR…Ѿf³ÒáÍ=:l–!º£ÒxS)c$­ƒÅ¢Y±£}8fØ/ÃöQæ¯8K ©».„·Z …PT¾Õâ*åõ&jnÉ™Ýñ˜ýSLx`–/ñØŒVžÁcu<ÖÂMçíL}ÜDW4–¥ ЊºRx]Dsà¸f é4,¹tœ1^@ª@‘%Êàáw’†½Ðë>'C72|Ø.CÙ,„œB m§m!õ5ËÅ`IÊZù½ƒ?h¹sLq6/­…ì­å€±‡‡—ðËy¯=Zä ¼ë®Ëˆµ‡.:†Ó †¤zn†,TW=Š@)¦‡ôF¡7Eеh¶¢£šBŠ?Ûlá³€Á¼º4F1Î2YŒ/eÕ׊ÐZüjzV„Ƴ›¨ôTÑ[$ÄgC™Ñ}$$´Þh®žz-‡\´ÇØ ýr,èÔi^p]Y`ä &Áò|¦ Úi-š fŽmx¿¨=ëÖ™ÎZ‰Ê@šJñº~ùãpÌÄÁލnùdhf»Þ¡üz E,½€­C æCô,ƒjñÚ£ˆP™èÝ]Ø’b~hᙥŽI6jÆŒ¬˜®ÂrcšF+RäŠîÊ­z,MK\ŸÎD&ʤÒ׌j›ätiHÿÚ©àÞz-–¶oâ×X…m#yÊ á(r* ÉpO ²ÁöÇnY»SÌ`Ñ“rEQ_ž;'% æ Ø|zÙ©—Ga“sƒ9ùÈçC¨Û3AEÅ$ÙoƒT³)“š2&&ÖÀÂÍKÒ15\)Ý=ÔÆÂ;GanD÷#µ»/0ë"©ÒZWÆÙãÜŒ)B¨º*¾JìwŠdÆàTt^‚SÁfù¼ì—'ÃÆ*co¦EYEÇåv’³cO«Õ|&S~Ú3”D‰œsÀ_eäÃöÊAÑZ¸J‚~DÏP'y ,—ò³P‚J.6%N ø†MXqöÛHŸ^ò)&ÖÀZì×´INðw€[pkDp•P„F‡($‰Ü(à«èéðQK>ª=ÓʘÇÜŽŒ=¡˜cå(߀äÛgìT°±ˆ±Cí °ý‘Ò©¯±$ Ì3bƒìM•wËw ÅÆ‡c¸d“Û”:†;µc•!ŽRãØ4LKaI[‘YîSCû“‘)d¿ÂUƒá “™—»‹*V2¥†M>k]&Ž7±änõ¨‰kÿ8HQ7%ö[¾-ÂD]æ p9PK’¡ù·` ¤…ô)‰ºWY,×õO1#¢0Þ¸±§r@®…j‰P!\Åн—… U¨]‡ õË©à~ùÑt8°Ä0JµôÉ,Ÿ7±J)ã ’Þ2_^„U"ÀÄý’„˜·0ŸŒåͦ~‡} ⽨cûåÁi¬ç?\à}Õ~ìµZ…Éj€ü¤:Z¦ˆ- '-RžÝeЂ·W%ݤ«n!Ξ¼+Óq2%OÄD]…ipE¥Ñ€é¬ÜÙ<9T,A‡Œ}#Ç[ÈŒ^˜’’W"o^ ½exí0I%ÑaÃ0cØó†ó‚hûÏ`½ EÙ q„Cè3öIfííeoú^¢ ÷ ˜³vj-µôÉ€â·B  ídúÁ#4Ê«0l–a¿¨óƒ¯Öó7Þxžª"Ÿ¼0K3ê(Fé³V,&¿<û­ÅBõN‰ñë=)/z#óƒ%ÀÆâ½°V(ûE'Rù|¥û´˳;«%™¶³ßòÔWQiaŒÂl¡‘ÅÚºW$À£ÃxYYDûÇÙ\7ÄCc÷6ßIa”†Ö’ŸÆñ^Q齚eâ¯Fp`(]¼à³+ùF©J*á£C[.asàžHÛ€Òn K¢¦«ŒÞä°}í#¦ï ×B)´-§³›Ä6¹ýTuÇ~ž¸R ¶4´<<ÉT7„— ÷Ì[´uKÊEA ««tÖCKbL4ûEå£å¯µÈðÚF­á»ÁlòéÐ]û¿”ôËåm3PÛ`LÃ3‡3’¡ 9‡ ¸Š"û¥‹–§ÚEu“s@±YtBuv«)fEqZ”ú¢BâˆSÜÔ-ׂ`¡t!VŒN”Rys„à™ØonD(ªN`´fDûª èùR m†©ÓÌ›fˆphæNìŒ%{“Y5‡% û¦b$åC#]»zûƒG…!DHHÔËäß íyyðÃ8âqèå·ý2cA<ä® æ9°S×±ª'Üb³\‡JuD÷IX(Êß¼öš<_JS\o…݉îð]à}±"ƒ’[ç-^ŽÅÿ`Ô"÷0ÅÏ’°]a–XHS±A¢¼L•jxtcÏ'{™ó’Loõe*&²_I•ô›7ÂÆVd¿Õí|ÐjZ]†_eÜj¡MËÛ´jöc3á puï·<4QÄ⟞d7ªúØBnk!-1ÄGúZfWm@Pº&1©kšÁçf!UΈÀ›ÔKÔ‡wD4ØN£yE[š¶á oF8,‰¬˜æU¬‹ÒÈ”^æWîé½Åq`ŠôJ8°Þò” af>B£IrZ6xKªÏ6YsÚÑ/DVAºÞt Å8°®–F—ƒM#&K€g¡'Œ ?¡©<>.á+J´Œ" Ì@’Ç3#i#Ï—øŠ6RY"ê¢CHk\¡’ë‚ϯYgºåKÑý‹ÚàH€`jÁBÈ| µæ“Òha¹j ƒ…ƒr¹JÜ/÷ s’:{óÔ$ò%Ia†ÃÇÝn>YwNNocºÞöÅ&¢Öª+§n³+1ù†"Ú!3΂Fh\DÞþN•ˆ-ŸÙ*1DVÉJ°ÑÐ0=QYhÊ1½wäiÆQü%ƒ1Ê€úB8QP °£ïÇá·A‰™L¯p“‚Ão)’ÔG¼(ÆNtt¡U¼÷ª]~ H\ê5€×â4œâЬ¢ô•!ÀèIç èé&\ ª­t°_2*TÐ`JÕÕKÌá„v¬j< 0;S° m BŠCf\v1µ.k!qŸ!~¡ Ùd¦©A ÁŽZ`Ñ­6å`ABø„LPª™)œ8$ ¢SÙZ C¸íûüºU˦¾hN˜’Œf;yö+¤¾†8É“OÊ<Æ~¦wlÏPë8†¸JICÏÛÄ2z´ $žG?RH†3Š„7»·L\4ÖûƒaPxÉq@×FÀÎ8ÔZvWQªµ¤W2Ÿ]92õõ*0ÃUh£éÞ˜ °>æ1*Gt.WZOÁ|Τ+(S4Fè®ر¸“ÞD‘HødcКƒt r@ç8«èÚÓð ac}1ØæÀƒäÎR¤¸$`Üî¤U[ômËçfª,Q矠™“g¹ö1Eb©Þ“ºàij¨FÔl¨³ß ™¡‹PVÙ£[7ÂáÑû V¡½«ÐF!´\1Y<–”W##˜’®@-¤‡Q *´f„$S‰JÒ²$T(hbj‹É%:çå‚R‘ÀçÍì¶8ǰ®M¨úåįYþè0a¯U %¦,D?Úòè±±Œ7‚žbœÉß§B™ëÉzW¾äNaØ ¤¬hÎVÎy¥Œy¨ŸE„öÃÐv,T|:¨³ß’`FU8Q×JaÚMžvë‚ îŠÉàLˆ{ÌW„ðñÓ&QD~‰s`¢ç™ Oœ:´ ǃdBQ)RP2EÝ(/SBs’ÆW ­®èyÞI§h1û¿Í!íÑ( Fóœh{)'C«‚RÊLG­ÈÀñC‹r¬„¨£qy'‡¨4Ô¬ ù­s†Ií¢Ü˜EÁÛûèG¡ð 4(0HBŠ:y¶<ûÕò|è"‹–´ÕLjÜM®ëR-í;SZCûg¬‰ÖF˜<´ÍQR‚D‚1 }jdiÀ›N ŠÑ#80ÔGö˜X¹âÐÊ$'tyB«®W,#\N{ЊÞ2¨Fæñlç*áo&9a6ËÇ6ûur¡†&º)w–Ó4¨Ô·€SÌûQ˜Úͱ "ÏÍöà#,@IpV4‚8FèóZ÷ù^‹úzïµôó¡erK(#3m²ßÜIKf›ý¨‚f}^™,Ÿ2n„ºÔB-N›Þ'ñˆÚ„hv­nž¤Iº] œ“˜¸ÁdƂ̳9‰\\Ò‚ôfÈ÷:Ôwmù¤#g8vèÈ6òg”;4£$Ê1•ØÚ–æÅïÛ,Ð|¨(ÎímNN‚ÖrÕkÅzÓ•ªu(ñP²³Œ„dØÐ)uÎawðM€Ì*.•?R„¶gU‰1Ÿkàc‰T*ß «òÐô.B¡c[¸,UŒýêªà§—LJËKf'¨`v#bþY]œ¢%v’y– "çÛr5Q¸ßƒr‰eP†GÌ9LâWNº†*ÌÕ| ŠP–Ú5Å,q¸Ÿ3C 0š›í—õì’ƒÐ%HžÌØ&Q”ÕK‡â0¥H’Î-Cá2Í99žÑÔÈß¡-W­‹¬ÉçTüÖÔ#OŽ‘š‡ñþ˜,öf-Rd–Áv|–I~ƒ„$9ÖûËä'Ì+2è1 Aô¾ë È퉣š‰ýÅ{À¾1y-AÔšÏ M8r1$Y®.^2`ˆÑ 9OŒ& ¬/nŽEÙ¬s£6Q#´ Œ4ô SŒq”P¬|´ù¼ÊC0H©pÚL rr#´½µ„2dmûHã«–ÒÑŽ[Ú±¤"&K€ ½ ï-Ãˬ…|Ôh¾šÂè8pâ2Ѻ´8°Jž3B~n£3à¤WU>n¢ðÖŠˆqÂïHë1ùTZØ?e`¾×áÃð#ÖnÕ–ˆ´-S ®p¨žç£bã "½SJ"N)³Í>ElŠBï\ErHÖC/ 1Ò«)³›2&4¡3”ÉŽ˜i`#{ÈÕâhd&¯Â`òô©B‡JtG´ÀWåU¦¶Ä{¡‡ú¡©L¦Ú¦^N1/ ãÍ‹p)Eb½$*i¿Ág‡“ï¥ÒÅhOñ9R(m0)"Ýê´%”ë¸â…§3öê7EFjv³˜ýÙ &N€ ¸´ƒMâ1ȱcä$<¢[Ôˆ¼}Ý:•¥¨Ɖé;p^E…Q’渑Ïý¢«|»‚&(4Ã Ï %8©Ñ K„¤”ªsȶI(+F?Ú6PÚÞ¡ÒªASŒ¢[.À¤) æVyj¨“ÀÐù™›)šR±MÝòñLá¢1»ÅL€G†ösƒT¤U7ù©KƒË@qA·ùèc)bp³p{/{É1à©ÂTêUJ²Öîå ÝÈC/óçûM'šåŠN¬y\oÄ&ɈzÏ÷ìU „œSŒÒ86(¿~Äß³ðà IDAT¶|~žBbn$ÏŸ¡ºC‹¥,Z)¢’ºª%`ÆÒÒ¦ì,¹ŽÛTÃ[CJŠRžŒš(–ÕÂ(¿#b…h m஬©¬òPV%&¦ ,í£ÉXûCÌâHWŠñ¡ÂCu)n&ê‰cX1¨<¥"+$÷ˆb*²æÇYXŒý‰ªò|Œ˜¬Æûo-˜¯'s °7¬vÌÐÂØ;¢µ±´:‰Ót(ràäÞ÷X¾7{Œ}É39ü.Ù¸ ›—TóqÙ64°Ë·‘>· G—Ý:áS[%  QiÑ`†h¿ñ¿ÀÆ¥ZNP'uí°ßÄÁT1Ýlx‡fUW£3Ø`³åŠo#Bùqåà2ËuóÈã¡òU™ý~µÖ“™IsŒ]™…œb<:*()‰q ö³Ð–ï8-—È)8³©ÄÐ’M¹Âºéä‡áuIor$åÊPë8DO/)¢´ü·*ÉçG\•]–ʧn†Î3¥Ï·`Ã*ã÷xÅ{¢)º¸â}a£NÉi·Î4v[y³¦qƇ~‹5q˫Ѱe¼BÐòº QÂV0Ýý­Ô.a´0dUk¶…ßz d>"¡òEßèuF4ç5uŽD‘°|ÉeÓPŸ·{Hæ´‘cmŨ®¬%¢ºcÇì@Uܲ٫X=„Q@<£. ì$TQÑÍK·!Sf¯çD£Jbœß(A¥—©òrPzÑóèI¯ù¾wÊ}%\°Ð'=øèu»\š-0”Ð!ˆ¦kÉdCnö˜;æS·§XúWñ ÿòKÞ«q%Qàé9ŠLµŠù@BTwã kµ hÍPóšeÍ6v(îÝÊ$¿}¤ïU¬BSÉôŒ§U>ݘDiÛ˜æÛP™¬:ëWAuGO_ B¨¡—zqI^H1<ÉI±$t'sÄ£Yká5ÇšEt¡X]öË@k̨¸=ñ) …–Ù¯ÊÄâ bü™Õ£Ž«k °ùgôºH¿RHI¼ä@Ý$°z‚1w¸"`*,ßÛŒ„Šö˜²—‡7{Dz¢Áç‡u ÷]ù6÷€×r Ì £*äà%ækö—œË$£™mªQY¿¼‡€X‡PB>Ï êTŠAHÆp¢ ÑiáU¯Sªç3¡Ùw´†ÁE"ÜlLÜ ¨ !è‚ 4¡}4x·*®2ä‹*‚ѹ¢“9™”Ç쌨¡Ý 𠓸ýlA¾BÓ¼(e¼‰4’„ÂaIÄcbtè°›%Çc%úª––hÀ]'=ýQ ލMÒBᦈÞ×µ³N¸em[k®e'{áSøaV¨¸ÝÁÕG£œ¥g,u«ÛˆÛ¢¬¨ÔÑ.9i´ïÊÅsŽ!léž‘s› ýÆ¡´º˜aû”v>icŸ z¤lP²¾v¡iFÊç*Y~Á‹©U ^ïE{F%ýk³ÜnÙ½ƒaÞ¡˜Ã½ZZ†ý¢'GÄdfP˜{BuÏT{ tß@ã§FBÂÊ`¨ ¤ºCæ»ÔíÄòAIºÀ^oTDhVazV=ü ÂQsT§qwä˜.Ú\ΈȄgÚü¢^2…{¤úíŸ Æÿ-Àé÷ße€k­35›ÇSD;ËðF™LW>Q°ŠŠ19¾\”î(­$ùBHJ& Jk¹çgþû±(æRÝ]ôôöNgõJÞkFWÁPTááR‘“¤¥ WšTU;³IY®* êÎjœýª;ªúî÷ì7…ATŠÓå ñí-Øæß] ˆ™ n¡/§D›(A qØÈ²:p¦Â\¥Ð>3´¡õvâfg¡Ì÷Q…µ ˜í|GG€7;n/ƒ$p‡1´J§D‡†º L Ðo%:Vå;´ÍN½RMÙ_kž‰f¿¡"‚nÀÄ»µÍÔî(•ùGÜ Ó¦¾åÕÍ໣ÚhˆñŽ•-o6"ñ"_dªºŠ4u†¿h¥9º ÌD¯fÓ¯ü£p]öKèA×í)|€Ê¾2[íZöqÎDFo=­–AK6Æ æOf»õ Eç^´¢-!Å€bpV u ¶¼¢DlÝôo(ªL×qƒ¶}ö[-4°Á>nVTÑ ñû 0µ½ª$Éà….gΣ€oÛIZF§õ$›ÄJ¶±!ŽVÂ-ß×)ûåƒÄMéðc¨=†˜ca†V Ò…¦ø^ù¼%=}‰‡Cø÷hI¢aaöžUq†:nP—wÊͲØÚBá™Þ#Ã+ò2mqT‘©ËµšÙÚˆ-† ö[U:b¼Ù”4²º® ”ö¥-Ðíxª:Í-¸ktðö¯Vd\}™,/Ó,­«Ýõ]kHÄekƒ¬å©Jb…òU\G¥|ƒÊó@W(`^Wwg©ú®r/_Í ¸Ã|͸)xW7ä¼"·hƒM5BD0õ;QW¤ "s›£»L˜¼c'ß@9Zpc÷àfŸsÅ4˜‘­×ÂJŠÑfªê¢4â.9T(¢|©%ëZF­ÕÕ¿ ž¢¥€… y(©Z÷уn@€Wmíò»¦úª:ì j#†‘q]EÄIŽç¡‹PAë>>fö; TôêÜ¡%ÑŽ·yKêü°MÅâ¨1ít0ЦXMùA˘|-â—ùÓ韢do]‰jX,Z]"²TÅ%G ev -ÔŠÈ%e‚öGX"‘ÙÔ5€çÛA}ÄìLü/1žÚ/À ODá"…ýÕU\ò(Ù- SCñÏŠ°ßF¼]íxÀkÉα[l’h§ƒSPqW3´æ!Ç£ÿH&>Í*-È•ȉ’\Œ—¿Cíäžws¯ó Uƒ¾ Õ1ÍK±ŠJ‹¡^íA1TTùù¹Š^-@B›²SZ1‰@ ¤Wx5¢¢âí,·-‡K§à-ºÂ› 3û]´ã‰%›ùr”걅О­…ä ?´ì´ê†9ÎIÙ‰—»-ÛEo–ôô-Dí"n:a¶Žû¤ÅXÌ;ͦ‡8†Yq¦^A4⟙ý®Úñ€ÐÿÏ µÓ¤0ö»@Ë}·šS;–P±|sEå€z$½õW½"BËØSs&¡½Y!·ŠyµRnZºÓÁ;º‚hy(äBWê çAçãT¤Ä ö=¥ˆÜ3XJõL…ååkÍEêz#6²\¥…Õ 2gÈÑèw€hýXêíEc¹W«¼@%÷¨‹ÎtQå6>43”jh6¥ÜTš©˜h…s 5åI¤ duP [ªX„äh ¹ej~Å)—Ù¯-z“#ã]ì)&QÔlеÃÆU\½ê4Æ¥gMM>e ·¤ilV&´-€vFg´6íQyOhæ–/_fCHœâˆJ;_^U¤¯B]&Vc‡‡Æ¸hB²5Ï×% SÞî‰bö¥LFBt¦=k{…%ë«‚ÜæÉws4î(!¢[QþfêHÙsñ¨jyÀÌì—GëØ´G]òaEš9 )j1ð¯¥%ºœS"*:…®an0E>%¹dÎÐ4$(ÄEW ÇË”ñÖt÷pªß˜%¿xŸ5‘‡ê|µÏOG¨yY›Ã|Ÿ?·ê±c#oòdÖV¦„à3J¢L€Û8ÉOÏ{s2T2MÈúø’è¥LO |¤H(9Ý€t%¨,3{ù¾9âØ]Rm†PLö8úõf\®5ÏÄ‘º ÷5«ÊXÜâ w>šµ:÷ZGœocÉ»f‚ŠêkˆÇ{‰h¤ë#0<í¡31$æè!9V['“[f\ó5ÖëIIÇ1Øh|'‡âÀPW´4GN‡ %mÞ kŽ(*kši/¥7‡.þø£ãÀA~2.´Š°>UØBSý%ääÕŸ0Ñ$Ük= ¤ j˳å¨Ìòí²ô!Š®¡0‹ðŒ×€ˆhU½ê [rɹ_RÐÍ{ÄãwÜI'÷å/_óÛßV7¦qL¾ÓÆ$»o·Ýw¿å­oýw¹Ë¿ÿ}sxFâR)iº £ñæ‡vœVæ§¢éDl\z'ºñt"rtk\–;A‹8C•¬ˆ®Yµs¶=})€Piv­ÄGô8ZéܤC¸ äE#ì׳ûõ®wýÞðÚµµßlœéˆ{¨tDª®D%6Âui9êf±¤3ƘÎúo:Ó ç— ,]²ÏÄÕµN—–Π—¼ÆPCüßÓ™nøoL·fÙa]u>"— Y€”°¨²&U‡æWd5³[3Æl¿ýöÝ›Cf<£gzÆemVDp`]-3Êæ6x»Æ©ÛaçUú7HŠ¡68åå{SQE ]d ³Ë p!2‘&)ÚB ¢ê5RíTçÊÑÂ0ðÝoÛsøá‡_¼mÛF¬mÖ6˜3)ÅÔN²˜´bg}\û'Zë~<ü_sΠ'‰ê¼@c‚JJšµßÑIÃÿ_ú¸Ét›–ÿog˜ó›±’Øy!ä´$¦km‹éºŸýìgöM”–p0à¢ÑSÕéP1í­yÏR+rìßó¤.[XB2™É¼ˆÜrN:g"œÏ+õZ˜è¹Á÷æ÷ÍBÛRüS†x 6óê¢ûÚY#HoTS|Ì‹èñV9ŒÑÚ>0cÆŒ•?!ä%À’î #¢ÕÕ¹_>PMSL$®àí¼eTµ¡=lBÆ[(ä«Ä…õübzÞÕÞtÔübcf°PE£ײ!ñ^Ϫ²§0û5ÚË(ª?r ’}àÅì©Ëë÷ûŒ3ÆïÔ!"ÀqQ…ó™!­ÅÜ“Äj:¹AFï>®fæèÝÜrÄ¢Ú(aêÌk‰—SyËD(ÊDÓwé OAès8F"ÍC7 {×°T B–lã©!Ý, ª>2ÛÅb^9Â’hj«óL}g̘Á#ebÏ•æ¿,$AõÇU-æf›ËèZè:¤LÚH†æ9½¹# ˆv….#myKöP˜çNŠðTáfi&6qOo=‰*ÔÁoj@Û˜¨¨:R™]SxoP±8h iDˆ­>Hf̘Q‰Î,x‹µéÈÝ¢¥‹ªåö*A<ψ ïÞLW‡JÐmEŸD8?Ň%74vàãjFlêyi³!0”EP_ÊðžªÎÒ’=í¡¤½œ•‘“8B´x¸ÊWH ‹@kl³‘ÁÔùŒÁ*£À³S² :ÝŒöYzy µ4Rá~ãGQeœ”‰«Ò›æÐ'Š¿5~¯1|2ÎrHž…*Qo®LÛ­µøpÄV©L€éGƒ Ô„¹M¦z ÔÙoèbœ J²ßt{wÃŒ3¦‡ñe€Ç‚¬¯ºÉ‡ÆÃå3tQf33ŸªƒQoç–‡ÜÕ»|ƒ&!‘2UG ©H¢›)”Ÿ~]CÝ {ÇrÜ`NÙêœiɬ<¯›™äŒ3Vc"Àóì>ª¸¥6t/,¦õÝ ømöAwŒHs 7cÆŒ "À*ñ®\Â4ˆPD+æ½ß+~̤°”bßnP‹WˆíXEB"Okm}OßS-ùЦ$ý‚2Þ¤+ëê€d CË€ ÊG-ëPÅtÁd¼Ûɵ&ö°@Iꮂ9Œ™1cF;h4L…>ãB-&?Š„QÙ¢ÝUÌÏ9úT%ú—QŸa˜ §Ê—]-Aû?CY¨,«É3µRgÑà•Ü,ß7_z‚-SkŒÇø«”Y!ÑMSù í ²_¡êEÓB7`‡fÈMž—ShaŒ‘áŒ3 À;7j`FYÜ»Lʼš²}”_¦­EM›bÅM“ )QYæpšÊ~E¡m*ÓŸ­By¦6‚ˆ_¾Pò53L/¾C—]à2°n:uaÆóDnä‘Z&‰ê¸"åKÂZ·C­E‡öÛ¢mk¹Q3fÌ(µÚpè7þÆ‹ÜOÊLz·«ï-œQè¥Õ-wk¾D"ÜÚª>© Á®½ßa›iŽÊ4^ìq µé úëºvï¨Èªú¡×æÒ ²_õÕ–Ž8®Žèp¨å§ÒŒ32Ÿ¾” 0ª¬‘ ´3F„yl$†h}`7HèÆmÓ:–lpŒ³*}+&Z7nÜõf/ù^ù¡(pÇQûŠ#ú«'|%´¿ÛøkqD·Á»B}ÄzeFk”|÷!T`k¯J2`upã½ö:þG?ºÉÞ{×6¤QÜäïÿßuxIm+ZÅõooözTm#‚¡ÿà¦f̱#1&VuY™ôKù!§´Ö“ÕŽ¡sì´T×6‡KmNv$õ­wž¬lè¾oL‘Ïî&J]Gsàè(GèW=ƒÀ'½©«è²‹÷;ÉŠ­` KÜ«¬¸j#_4êê|ýÕ&pJÞ~†›¶Ûn·›ÞtÓvÛÕ6¤Ql¾Î »Ëîµ­h›¶˜-;Õ6? ˆð¸æÙZX©~§8XaB.Q—ï;!iNz\¡47 7ˆ0 —Ñø ðd¶wVÄx·ôÌñ–ºï °Ì[>´XjÍη²!Oé¸JÌIò ãòIÜ´™Øõê?'Ó¾ÏüÁZ„É[yN2zPi ”£zŸÊ-ÆŒ3Í s¸¨¬.S[³ KμJ`T,¥­±‘¡9p  — â‚B"ñH϶¥ ‘á4jôÖÿá Ú§°$¼Z «ù,öZ›~kϘ1cÆs‚ç%XÕWW ÍNè¹ ë瑦*n R: $ù6ìÂ- µ0`Ãí{Pø›É<ˆ~ÃVãcŒáým[]u-cÇ¥Wvù£¼ r-øgÆŒ@ôd²Bož)Ö Mñð8c䵂”hƒƒäÜ64Õ§Z6Š÷p´g*ž! ékœØ¿(6ý‘眇È=n%AƒîÏæaê" IDATn‡"}WTP­ÄÁ ŸÓ¦‡qñÞSÞþöß\}õâxènçÀ[Rr¥-®sýëßû‘¼Õ>û$Z"7’©²u·ÝŒ1½êU¿þéO£-Iñ‰S`×ÛÜfû=öØÿ¬³Èº1ÆtÖÓ™n8¿\`é’}F\wóþhÇý¸åÆ7Lé–k-A/yAþß²“1Æp¼¹êrÓuÆtŽX³ìè~ÿßùˆ\2dR¢ʚéŒÙ~w³¶Ùìù—œ:Ô0¿"óû“=jŒIžOVˆÏ&I]‚ î¦ü3¥X^+o™¾Õò„p—!ÌH3#¼su f)‹-?5²©Aù/GðÕ™[&«ês@hd _ìúɶmzÿû1[T+vÊÇ>ò=a8¬ýéO¿ýþ÷ç³$\`.¸€+ÀíAç|\K’†É¿4ç·ÔYñë_ÿzqîÆ™O£‹DŒÝþt@ŠR1m[é •Ð‚%Ô¥º‘ È÷¦¶`0s[¥³A·­W G…cýéüüçŸÿÖ·žõüçoÞ¼yOó8ÑJo|Ó›~ÿŠ+ö¾ãC5N›6mzØ£õ’—½ì‰OyÊÿôOó)ÒuæL€Ë¡úmPÝ€ö1%©·E˜% ¢cÖUدUýòŸa›±`‘hRƒhÍ*è.-×12#äÛ,ÝBh›\ 󡵌¯â Vü¦}k¯ J²ßN©Ëâl~ìGÿÊWþÇ9ç¼ù5¯Ùy—]Ž=á„ã_ùÊd[<¨2®5¾æ-oÙm÷ÝuL™îpÇ;~ìsŸÛã7xÉ ^ð–׿þKŸÿ|&EêfÞ½ZèÞJÙVØæ–] Ø´u£‹o´ú(ZÎe*Ó&†±Q¦NPhŸ,?8fTõ®2_=(4Ÿ™ž,UAŠ4•,q­Ts> ¢p[ºåãÂC}‡­[|ðƒ¸óuÕUƘ7œ|ò§Î?ÿȧ?ýo;îg?¬‹‘•ÿùWõÛßü&´ÖH+Ç~÷¸Ç?}öûØœyf>-™ÜèÉO¾óV+» +‡Vcb¨¸ÿ-Ÿ–ĈV’“QÇô†¤e@#€IQ* “¡ÈLÏ J¦Jz6S&¿ ûuúQõ×ãµ¼"+²¶:«?£…ÿÙ~ûtüñ ökŒùÉÅÿói§u]w‹[ÞRË6#Tx³›Ýí÷8íï¬mH[¸ñMnòÞ÷¿ÿÝï|çÙ¯™·@¯,ÆõxÝV™vÏÈ3HM ›8p-¬B„Š6°…Vç£X”.猰<Ê{ãDé‚Z6Jg¿A…«$Ç$á¯Ù K ˆ#Ì£F{Y.\qûºŸøèG¿ò…/Ë—\|±1æ¿~øÃ‚V”@tÿv]wüI'½ð˜c4­™^ò²—íºÛnWýò—ýÌg.þå/¿øÍo>ü1ÑU‘õ®ôàvvMcNäFSþI7¦‘æèr`´z-(rà”¨î ÞÇ•r#xÆ+É:òç½éЬY©n­…/“¨¢À¬»°V(¨/ 1Wu ˆ®ÕÊÌŸŒ ª ?Sl o»×^ùà/ùÉOtå×]rJQý¤§?ý_Þ÷¾Ÿ\|qI¥ícç]vyð!‡\vé¥ÿôž÷ÜënwÛëf7Ûöã¿õÔS~Ä#j›&Ūd€g&?c†"²Æ²9P&e¹P1½+Ô«Õc¬Nvq ¿Áš±4G¯®@çLºF­›K^1GII­Ž8†mX5öÛÈ\±@âóBqñè7ºÑ=þâ/ž÷Ìg¦‰$å{ÞêVûÜùÎg¼÷½µ i{í½÷Ö­[ß{ê©_þÂŒ1—^rÉÓŽ8¢ïûÿýÂj©È=r¸—`ͤ1ú–Û”13Ð@YKrŽï‰UÿY`!Ðì–¢y£~ÀË›ÙB;VéæÄR”Sµ¯R/ÂÅ0Ëm¤Š|ƽÝò™Z/æµÁp`§ØTI¬º…%›œi±8S^öêW?íñ¿è óˆÖÖÖ^òò—?ãÈ#ãªñwãå6_o=Œ1oÛ6œùÞw¾sþW¿º÷>ûlݺõW¿úU5Af€[ˆl1ºQ8cÈ7ˆFÄ=^HèU-´@PÈ=£–L8;JÛú†sŠíÀK´¥30^ͪ1E>uk8'{뤱ÎËï_ûíårƒ;ë@ñ—{%ÅÇHÙoÖyXQ¬-êYÏ{Þÿ;ûì|ðƒzâǧsÌ?¿ç=¿üÅ/vØa‡vØaË–-Ƙí¶Ûn‡v躉‘¤`,^~ë^×>ù½ï|dzý;Ô±)óÏ ­:šÊÔ@•\¹ aG÷J½yàZóö¨ñ™îˆòéÓb·6¯hø±¨Â2´~ÙÂÆGl-TÌHçKù «Ì“TüÚgP­ùÖð¢ýeˆ‡=æ1¿ºêª<å”Ú†dü¶°tðÁûÞå.Nþçcî¶÷Þß8ÿ|E½£Ã¹_þò5×\sëÛÞÖ>¹iÓ¦+.¿ü§W^* îä*à·™ÏÔŸ»Š[à„ïó,Ïsˆ-Œ(lj7J’íÁZŠt¿‘m†V­ñŽSe$öæü ŠÍqžYÎow§c¤éß|Èdÿ½îw¿ßô¦¯9é¤áÌöÝ÷»]tåWäQXÞ¥XøûÿuÄ»ì²Ëpf¿ý÷ñË^öäû蠿{ÑEr½ãuBƒþ³Ÿþîw?äC¶î¸ãð3Z·¹ÝíÞ÷îw÷}X‹Ñ…éX!\=LÐŽ% Œ%ÔkÍoAµñéhyŒQ]3½.ËšÞdܘ.ÙFáïñŽ} @~‚ÞŒÔØHÜuŒÊ”Ö €Fƒ†Bغt'À®Ìº¬6ÃF&‡ÜõÏÿüøW¼âŸO;í˜c]œÙe×]ÿðf7{üx^ç+GÐp½àk_³}~ƒÝÈóµóÎ;ï+_ U:ÉÁüÜg=kß»ÜåÙÏ}î ÇgŒ¹Çì°uë‰/zQá’D®žÁc¡^:²g¢bI`!†M˜…3uÅfçfipy<Þœ9/ÖäϼÞL^R–©]»=qÌÛmu¾h*Ô0/"f¹ñ©¹»2‰ÎiG,ÉøLb÷ÞgŸ÷|à»ìºëó?Þ>ÿ¤Ç>6•|Âv`õ _àòË.»÷~ûýŸ¿ýÛ·vÚå—]¶ë®»Þoÿý/»ôR¹¹ráîì³ÎzăÌ+›iW#f@T7L¸U8AÙ ò÷0gí…ꌮ°As%*$‡ÁÞÁûNÅ‹{:C¦Æ)ûùÄ’ò„Ó™c³~묩mÿ¹¿Ycè/’D Ì„ýÒìöڙšBa¹|&oÙ-%“"(r{ï½gœκ‰nÆŒ2W˜p¨HHÐTI­¯kN¹_ô-sDýjßpO%¦4s|e]ŠogF¢V»Ñ=ÌÝÂ練Ô-‰’”»Œ.F…ÊWäc›´¡J³b,yþQ)ÇXÜ^ýò4¾ÊHa¿FÃäÏ Aôà!=÷_4f×U„p_e½3´8™z…L qÉÕ ²×ƒƒDHÞ³U¾3mÙE…÷Ë-­òîê;Ù8 ØÙmüåãj•^è­ÿÞb*Ñàa Ò„*kCö¡_Lhy9>}é=3¡žªëƒ†DÊ’f€™©¶åá;C•/ži‰ò*ŠP1®gÂI`ż”ÌL©òĺoz°#šºq˜~´ùXáÎRÒözvßjΤA“x8]#?m¢ÖVgf7\IÔRmÞY Ô5¬€gÐ=,möH´ITslcuÀ,nÜc4n‘ØŽ!ænËI†Ô ´Ó´ ¡[Àì”MeC¦Ö©ˆmS¡(bëQú.UîÅ@ø“ÿALõÑx€Šk"Š(™†õªÈDZW«æöoÆÄøØ¼áYÅ—ìù™Û=®MB4Õœ¦ŒVÄuùšÙ‚[°B ¶›ƒö¯¦?ÎÓc ¡uïõàOXLn†½¡+ëZ#3¬…!$aÔwQêÊ/&“R4ºQGSöT¡¦MyÀäyjäÃãžð„¯}ÿûnÛvÄSž¢(¶ýEŠt|xÆ´‘~‹±ZâÓÚl¨‹ÐmccñFœòZé|&tXB]µú"‚G僊%¢å·DBÕBß¡@×ýò¥öá]q(ûÄi Z7ÑØq‹5ézËh©Ò:-سó.»<èCîsÿû×3ñÀnr“Ç?éI7ßsÏ:)¡X·îsç;_{íµ{ßüæÏzò“OzÍkö¼Õ­JižV‘ ÍÜ3T#Óñ*õºQùG²°|&3Z¨0¢Ò9ð -¤tz·ü¡.T»:Óˆ¨[£üY„w @„´QPt-ÕÓÐÁ®[¸³þônwû¿o{Û)§Ÿ~·ý÷w. á îyßûþã™g¾ê oØm÷Ý3)Ý÷®wýþ•Wü¨GÉ­¢p¿>ðʾßÙg?ë¹Ï}ôá‡Ëmøä—¿¬ÅT7oÞüoûúúú¿þË¿|ãüóou›Ûüñíoÿœc}щ'^rõÕøØÇT´Œ¡wVðÏ ¡*GÍyôÖÁTÛÇP•oÓÕr8¥z¥Æ@ ™¨êè±ÌXSê"tœ'¾*Bå¶ zÃYœvfã·sr(ÉKfæSv€52˜m7vôl`û'ÇžðuÜОQ,jÔÕ;=D,s4‚Ïæ3/xÖ³tÈ!èÕ_[E…ŸóáÿÑÍo~§}÷½öÚkó©v„ßv¯½.üæ7£5þͱǞû¥/Ùgx¿Ýâ–·ìºî¢ /ŒSçà‹ŸûÜp¼ÝöÛŸÿÕ¯þè?øúùçcþü€TTŒÃUOíÌS-`Õ¸ßêpà6[„Zñ<“|vÕ(£C¡b‰Ã|ÆŽ0œŠz×T ­J.ï ߭帆ã^S% ÌùÐw€U!BÑKN+‚Ü-•ËoÓç¿ýíoùU^μ ¢}ŸKó>ûÙ[\ïzÃÇwÙåÿüϾÏ>¿Ó.p}}Ýþè•ðЇ?üŒ÷½/\ûÜùΟ8çœýàÙ«¯¾Z]ËİŠ[ ½,óçV×&•j¡Î’ï¹*¶¹NkœhÉÑ ñ O^Þ¸ÈoõtòéÊ„2›$™KÌí©kïÛh 'é2gœ„örPùÓÒƒ?‰ÝјCf„- îM§"|ììW‚ŠAo>lcûvø‡ÓN»å­oý;¥QB‚&cÌAø¿hàÍ›7?ú°ÃŽ=æ]±#B\ßéàñÞá3f„¢ühG’Ç>f¦`ylÚ>"8y23HN h„(截#¦,šÈ›ýNæÐ I(D¯ÊB±¨üˆ)Þ%†Â€srɵ ªJuÿ*„U"Ön àÞøÚSNyùk_ûÁO}êÄ“OÞaëÖáÒÃó˜SN?ý¤×½î¬}ì­ïyÏ-ˆ¯žÞó/ÿò¼þð²¾ß¼ysoÌcÿø/}ç;—÷ý nt#cÌn»ïþØ#Žøà'?y§}÷}ÚÑGŸû½ï}ïÊ+;ñDcÌÃ=ôÓçŸÿßW]uÚ¿þëN;ïlŒÙóV·:æØc?ñ•¯ìyë[?ç…/¼`Û¶ ¶m;è‘tAŸøàŸò¾÷ðªW½ömoûÓ»ÝÍX¸ëº§sÌ›O=õ“çžûáOúÏöÛoq~¡å?¾ò•[ZZ¶´ìy«[üæ7õ×}ú¿ýÛ}¿Ë®».ÎïºÛn>üð‡z¨1æÐÇ?~¯;ÜÁó¶÷¼çM§žzÿ‡<äW^yeß?ÿ%/Ùãú×7Æü?üÃ3?ò‘÷ŸsÎu®{]a_ìÏ{¾ù]ï:ᕯ<÷¢‹¾wÙeŸ9ï¼|ìc7¼ÑWoqË[nÚ´éÛßúÖâã}<ðõ§œòÊ×¾ößúÔËN>yëÖ­ ovÄúä'ï´ï¾O?úèó¿÷½^yå‹N<ÑóˆCýìùço»êª÷nx{§<ó™÷Ò—þêW¿)A 3Fn¬hXq!\-µÎ5æ«HíêöW¾Ñò4D¨-¯kC‘WwZaBU^WÐ’ø£A”¢LsWIOS”È«S”V¹ ·ÏgCÅ ¡!t打\:üð'uÔ³Ÿô¤ÿý´§½ðè£ÿêÏxÉI'-.=ó¯ÿú˜¾ð©‡þœ§>õà{ß{ç]vùèç?Û½ö‚BÎùЇ>ñÑO}ÛÛ>xÖYÃÇ?ø£?Úÿž÷¼ËÝï~ÜK_úõóλÏ]ïzö™gõÜç¾þïØ²e˃8àyGuß<à>éI‹òûüÉŸÜ~Ÿ}ŽÅ+¾ÿÝï>ñѾòŠ+^óÖ·î¸ÓNóÉ!~ô‹_þò§=þñ/xö³ÿמð‡7»™±ðßþÝßcŽ<ôÐ{ÜñŽ—]zéYçœ3$l︬姖cÌ›N=õŒ÷¼çï_ö²‡Ýï~gž~úvÛmgŒ¹Íÿñó_ò’×rÊît§Þ˜·¾þõŸüøÇ1‡tБ‡zö™gžô7cŒùÚW¿zé%—c~ôƒ\vé¥ÏyúÓ¯¸ürè4Ø–;þÉŸœñ¡pÜq/8úèG>èA»_ç:ßûÎwpÀoÛ¶(`ï~Ìá‡?õ¨£ŽzÒ“Ž~ÚÓ^pôÑO~Æ3Ž?é¤ÁÛw½ûÝ_üÒ—~í¼óîu×»~àÌ3ŸõÜç¾ñïØ²eË8à¹Gõ—xÀ6¼}È£õá³Ï¾xÛ¶®ëî÷ÀB;#0®I&ÚZ5<.1 â§ÕÜÜ2[XÍÉ·üœþÀÖzä{SF‰Z¼_¤ä7ÈP‰Øäºâj%æÄJ¦ì€˜-*”;…:ò…Ÿ*(3¼½ÚÑÎ//ͧ³Šé–Wi–úc®·Ç'½öµÇ?ÿù‹/|~᳟ý‡×¿~ñN¦›þÁ<ïøãOyã¯úå/1×\sÍß<ÿù»î¶Û‰'ŸŒŠºæškì×ZÏ?÷ܳN?ÝóÆ“Oþ÷ø'Û¶ýßW¼Âó /üÇSN¹ìÒKßþ¦7]vé¥w¸ÓŒ1]xá§?ñ cÌþþïßû®wýÇ¿ÿûÛÞð†wÚé¶{íݲó.»¼òu¯{ÃÉ'ÿò¿0Æô}ÿoï¿Ù À¼÷Þ;âˆ7½æ5‹3§¼éMÛo¿ýSŽ:ÊÖòú -ÿð†7ì¸ÓN·Û ÷{í½÷.~ÝßýÝBà_ÿú+O8¶}àÛo{ãzå•O{ö³wÜi§ëßàßüÚ×¼±ÀáO|âúúú÷¾ócÌ7¿þõ/~îs·¿ÃìÃþçëí±Ç+_ûÚotÜç?ûÙ·ntÜùçž{æé§c^òÉç|øÃoÛöšW¼bÑäSO9å²K/=Åòöýüà7½óŸ9ï¼Ë¯¹æòk®¹Ó¾û Me0®©,ÅÚÕ} –7²)ŒÖìY Úª*¯OP„·á%û+šrØhpt1ð69ÑÿÑãêmðÎí±ãÖŒŒF‡KAtÍ Ö}:¢ÉÞ^VŸ—·„/G‹~²ŒúAV Ũ¯\E™~,ëYÔhqrÂoÛöžw¾óþyÈ]öÛ磌®ºòŠ+ä-:ÿÜs9ðÀ?½ë]?é¤Ã<ò ~´ý;½=üáC>yÑqwÇ:®Æ2S)Ú9¼ OÐfئa<ØÚt„0KsäÞÿ&œyòMP-¯_È[ím‚0ÃÉKÈÑÝZˆkøØÝÕÈ"Ѩ‘ 7âÛº½üéÜsì ' o~ÞiçŸ|ÔQƘœ}ö¯®ºêàG=Ê.«ÛÜæ_Ï8Í(.¾Œ:dŒ·Û~{cÌ8ƒ×3‹Íɇ>á ÙµµµAï'Î9§ëº¿ìeC¶s»í¶û?'ž(ù‘¤Å÷x?ûÉOÞç®wýÖ7¾qÀ}îƒ[¿öÚµµ5§™¯>é$cÌ;þéŸÞû®wµèº×»ÞãŽ8bÿ;ßù…ÏyΛ_ûÚÅnçn¾çž›·l¹àßX|üÔÇ?nŒ9î„¶Z÷Ô£Žò¶+Æ2S©Û©üà>ÿ×¢ŠÅ‚cÿë¨ÑlÄ? ð÷‘=ì#:b¨Þr'ªìçD¿–Ùr«hY»p¦WÔ<£*Bèóáùä7‹[-X5OBèÞþ¹×=…¨>¡ýç§>õ3ÎxÀAýû¿ø¾SOÝ~ûíïu¿ûvðÁƘK/¹äùGõª7¾ñQ‡~ÚÛßnŒ¹Ïýï¿ÓÎ;·ñk±Ûo¿½1fȦ.¾z܉'þãÛÞ¶ÿ½îµxYôƒ>ø´w¼ã?ÿù–í¶3Ö¶Ûů Ù¿·´eË–áê¢p·ö»Û‚ãmÞŒÐ/~îsÿzÆ<è žpÂ_ýê]wÛíQ‡fŒ9üÈ#ßñ–·|æ?þã£úÐ#÷¸=o}ëÅ[¸|È!/8úèÅûº/v^#´~ä‘o|õ«þ³Ÿýæ7¿ùîE}î3Ÿù]«wØaøoŒÙöãw]÷ ƒ¾øÇ?¾âòË¿õÍoc¾ý­o}ð¬³þäÏþìœضÖÛÝO~Æ3î{ÿû¿üÕ¯¾ô’K®¾úê+.¿üË_øÂ—>ÿycÌC—þ÷³ŸúÔûÏ8ãAôñ/~ñ½§žºýöÛßû~÷;ôàƒm:ÞÞJx;Õ°™ìÜtè£ý>l{4#ª|òCE•dÝÍ¢¤m*]£uÏHŒi³ã:â˜:ã­=7‚Ú70äï‡os0P¨2£–—6%”!W«æÿ¬ôlÕœ‰BË Dí˜ñ3ÎØ¼eËŸí·ß÷¹ÏÕW_ýÌ#üá÷¾·¸tî—¾ô•/|áIÏ|æþ÷º×ŸpÀ^w¸ÃS;ì¿ô#cÌÞw¼ãÿ~Ñ‹nwûÛ_ÿ†ÿ¿½³‹‰êˆðÝD±ë¢&Êhh­FCE ©©ZR·*j@m#j ‰¡iI¥…VK1&$õÁÚ›˜†>4’ÛÄþñ >4´‚E´€¸Ú-´¨Mü©fû°qs½;3wÎ̹?ßÓÂÞ9sιsçÌ9³›9ööôô\º4+;{CEEq8Üzüø×®Ý¿pîܵ«W_ÊϯkhÈÉÍ4iR__(5õÓÆÆY³g_ø+­®©Y_^ž–‘qsddêÔ©ïÜ™ž™™’’ÒÛÝ“›Û°{÷̬¬É¡ÐoçÏß×ÈÿóÉ“ÓÓÒ*«ª>¨­MKO?ÕÑñߣG?´µ]ìì|òäÉOííé™™¯.]º¸¸8%%¥¡¶¶ëÂEQ^Y¼xû®]½ì?thí† ÓgÌ(‡GGG?ß»7‹-,*ª«¯Ï/,œ™•5^îî,)-}kÓ¦á¡!õ/?~3døÐIDATM…nE"êXoîçÎÝXYùMSSôé¯  •¬Y“_P°ª¬ìõåËW•–VUW‡RSOut8|øà¾}£ªâóöÖÖ‰'.Z²$¼r壇?¬®TeaQÑ'Ïjû³ÆÆ³žjûýššõååé‘‘‘ß{{ ¿ÖKQ”·«ªEi9z”Οðt£m¬¨|ßÖ¶iÝ:^-BG¿{Áù@Â)U„ñŒõ•€¥6‚uZ{bݾá[W{úï•n\¶fioI„·ÌÔ—ÏçR1î²AìPð:r/ñC€/f¦Âõ§ØDýúر{ö ô÷[||uYÙñ'^+,ìîêŠÿgk]ÝõÛÛãN˜0avvöᦦ7KJ˜¤°ÅÉÓ§E)]¶ÌìüF•ðÛ¶6t?ƒ$Æ$þºŠaåT½8«è„…”ŽP2_!õ{º*‡Žé^pl.‚ú:Í®‡Å#’‹Î1oˆðÿÊOCÔ‡í®q÷Š,4¶¦5=ίZà›´/Ì™3eÊëè7Á´iÓâ/–­XѸV(”xëñãÇ7††úˆFXý-È`0xÿþ}³wñÛQ€„¸`?úEþe7$£Æ¦î›8U¸ÇÀê–Õ/Ã]ë˜Ùì-MÐÀ¹nÌD‡ íh@î‡1Ü…±¾ÞAÊчô.8(Žäô¯¦rD®WøÑ/(lß•ãG¿Þ()ùª¹¹¯§çùœœw6oNúñÆÆ~9sæ½­[‹Ãá[‘ÈíH$ ~qäHKsóÍ7ž ççå­//ÿòàAZÉíÜ­óóòV¯] …îݽۣúa5Èí(Ll›ºF¸Ð‰ƒV05„dèBL}]RÁPYPÚ)Œ—u@‘bòoɲÎQù-íH­ÍM[;'×áy•XÛì…ðЬY;fKUªô€šFü‚˜\Kä :ZQQeÔåæ~áÆŽÇ,$1Û#ãÕ>Z€¼ŽaRåòˆ!lGL#ÖMÙyîö4Œg€“‚*Æð 2lŽHâ‚!*H@¨F$Ò*\í.+ù¬$«Ž6œâ¥¬0Ìj¶iÆpÙc1tJ²[A’ µ°²>míÒçñaUÒÝ%Zy¤G†q’ž’àÒ¾,ÜZùŒJ* OF%§0€6ÅØæ[ëy†6KaѯÂúP–娈`$$Ÿ¤8%@åîQu H_(’´$˜­M)7 ,b-*I½ƒ&†« &L~ ‹‡º×†ò0·oöV@w³¶Q­iÜìO10ÌöRä4DmY©}ÔH÷sZx=E~œK "›¥],œ›ÖEr" ex8=')bÛY¬pTè¶—SêÀùB«O‹Øf´IfªfóÆ5—yÍ4ˆÑƒÓ•,²ü˜{Q"†ä\pè“Ò}É 8Á0ÜA 0ĮܵG½qøÀö§^èÏháXþ*ü>&]Ej —žRʼåÖ`P½°_‘k–d¦‚dÉýH¸'­=ˆ9*Ʊ@Qó§€÷väÎçØÊžQ=Ý@ñˆöĈ„ä@†Ö¸gG:•3Àq¬‡|œ„ÛèÛäž´¤›ü@)y›„£Ú‚õ ÅÃ\ìãÚŽõHP‹j±5 À<¤€ž}ÕËPàpÙξ•.>–©Fº0ÂÂ×D¿‰3È H šveàê¸ ŒÜÄä Sò¹¡·ó]¦Úà4Ǭ"%Y€m–"c^žÒ~93 1¿Ytà†¡²ýqéÝ2iãÖ¥ìTý"mú§öpJåb€.ÑŽúÉG˜0¼ƒ ÜqÄ  2ÀŽ(„öñ‘y–(ÖCÛ­l ‘'Uð#8wh-´ÈŽ#x%Ê 7³Æh±ïFõæ¾d!Åíߌq‡?øHÁpfs†2K|â8Q‡²,Æ;eçA¸8O¢)‰p9Á=–¾×Ëý $È<ÛÄÌ^ÎzÊŠÌÃá²HWIZØ¢.º6º/ôu߈œ‚kÒ¿NñM ae/y…N=x$øóöí_;;e‹áu0,S|ààrÂMNBXNuƘª ZÐêSmz´Búð Ë2äø&ð5à&[Óþ—>úpáåE‹þb“ùP°ÄIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/hyperbolic.pdf000066400000000000000000001060711477365367100226120ustar00rootroot00000000000000%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xµ]K®%;œ×*¼õÿ̑̀¢AÀ€í¶32Ó—[v¶B w‚®èt†vÅ©SïéwéiÆ–åYÒ½¯éŸJHKÛçLÿNKú-þû—ôË_ÿkIþWù³¿˜? ®(ÿƒ ó5ü1-ϼ~ž3­Ëö¹÷ô#XîmÎÿÇ_Óïå/û–à럟~¤õ>>÷öÜ)Jñ_Ç$uªPŠÿ ¦Ø0ÖýøkîÃ}ÌŸ=ÉçÞß?ýѺ¶­Ûg½—rýu}æ=é1@öqÚçå3o5—P) r¤ýº?÷¼@ ¥¨HXÍ〆e:Ô&¢œ&â¼ÖQ”F™¢ײ|¶ãq} " ÓœúSòºŸÏ"5ÔNéÕàå¼Ïós_¾"=/ç³ïŸs_¼œ 9Ò2¯ëg/j–VÖÏa-—eƪ?­‘‘p Ú÷ÔUQ¹T$,æ²bB·ÕˆH C1— SjwS2鋹@†[Úò¹w¹WrÙï;¢-*"A†´˜N×ê–¥ q)OL§ÝµqZ ×pa.­M+—òžçÒ„:ó§Þ_žضû³=×M75'ÒcÈ"lî:×e¢: BQŽD?õ{±îX|%4Y´‚›Ï$¾çP›%EªÈP í(mÕ•‘CG¦zPøÞ(ÙÕDgµ±(ÔëjÑV”IôVÏ!Üãð=讎ƒP”#Ñ^½ºÄÆÊp¦ŠÇZ!SÐuµ§4Y£Àa­8ñX]öTlÖ‹K¨ôcʇÀ¶4Z_‡¸q¯§¶´ZÏ!~Üã(ÚJG'µ_ëA¶ŽVöÂF-Ø8ª»ŽNQ6uaJ…~BYõaãh¨¬ÎÑêÄFñbœWwÚ/ŸÎ²7”\®gÏ[G=Qç]ŒÀöds.®åZμ{Ù½Ó%81ô¦|$ò³ÜÔXHйÛ)g‰ýÆß@>;¸ÏG>ÃX þú¼˜–m½ò1Êê¯@¼ƒëþ䓜`£.ך“F@€£ΘEl–á"Ÿƒœ1…N^žç À_Ÿ;ø`Ý×íZH$ÜÃû\òm…k¢!µŠ¡ \˜EÛá«0¤Èë¹øÂT:çÅ Äq/ó\>1—p§Jòs[Àësàü7_÷Â[ô8»T$E×󎹴-Ï#5@NC‚UlÏîÙµHXÏm¹pË?/Ö CJ'‡rOÅQ¾ÝÌS:›j$ü(Ž"&ºÜy.W$˜Àˆ‹z†j´‘Š­ˆ C^VŠku5Td ×PÔuQæP#c+u(2CQBÌÕ1(2f(}¬fŠ1«–b¯á.ˆ› CVB‘` ÕO] ×A ÕA‘RÁp5ÐP±Ø¹QtN¯ê¨Æá Çñmf=ÕRÃAcެ(=u²~ ­ðÌ!¾*U@Rb5¨­Ú8…UU_5•:†ºÒX®rcéèªÎjý4ˆ+½œ ò}ëŠ0xç±|Î žŠ·ªüâI½-ç^Nl)Û…] 7FåÏ#ˆÎ<öˆ!÷ŽÀ;«òËßüXÒ¯þŽlûk”NÒŸŒÒ™à¢=ÏÏ(X»5\Ÿ¶c9pB%ŒçŸw·[ EÒ›o8XØèC9xŽDÇÖ»W(^*#YÌ (†š§è+•Ö­ó| ]&¨Ñ#‘ CZçü}DOÉP°+vC|­¢%àÄS€pë>Ë„àùëhS“6®ÛrãЬ]”Ͻ¼ 8MœOhé142ì×Ö&À« A†„È‹øÎ;›P‘¸ çú4 ð´ ®áš/Ÿ¯õ3.ïÆdüJl½î½M€‰ô h„¸aO8º&Òch„x0—|œVA‚ iÃMnã‚„…Øf‰ÁKœ? m‰-„ÙoÙ ­D¤ü×ûeX1人œ7Az ð"læÑê-…HÁ‹°í˜Gõ¬.s™H!m;¦JÀ^›X?.ר—6j;¾É­V;ä`¸H#5xeqÛ¡œ…‰¹BOÝ4•:ºGécw{5б¿fA­ 5X£ Ãvâˆ,);Š»E±X£¨H¼ŸÕS±°EÌfm$ê³ä˜¢Fk⫾1ßøXÔkYGj̶§+ãIqW_†úíë#­®j¸V…@Ñ‘L«Z®q=×:Z-¶Q6èºÊA“µvL„†caGÅxu å3®îî^Vz¯Ô« Q„^k£ÀÕ{e¥éWxê¿V‡@Qøgq`¯HÔ‚¹âÕƒu¹NâÊ£*$ßÑS~‰{žìã7÷Ð÷mLýœÈ³îŸ£“P¶1IÑÝáœH€¡lc5ÜÁÞ£50î‰2hÜSòY‚H”鎖PìbM_ÓÇEÃ#@Ú€p}© ÷0fé® Œ{Ú1¼k©áŽÖ@¤eøvEK w”H€¡hÉtG $ÿ‰öQÃ!À÷œ5b—>rF;†\ËvX!¨9žÓ™Ãe;ä0¨r õtÙ9 òutö.—í(fUÉÙ#33kªéø^b«Ü —íçöP—í,Pƒ‚u¸l‡u ëê²å`Ú.ýêZÜvÛqFäHkb¸Ñsêê•õ+Kû#ϳ‰ÛFÊú’pÝ3Ôp=Ì Þ* Ù+‰Dc!ñVWƒ„ëáªÛº. À F9„¸­«€:ç좄x«c `(JH¸îÄmÃ]o†¬‘h Õ\]«ý†+ouc R+®Zk>½È”6È¢ãrj­Æaçxq©¬§Z«qàÈŠÒmqîâê&Zá™CÌUª€¤‚5¨µÚ8…c[µVã0¨Ö1Ô•Öêt5È¥£«º­õÓ ÏQî¾pîù\°Ô6\gÈÎÖ3̓ÀýK¶¾þ²u|iΧ@% Æ7·3ŽÍËpOd€¤¸{bC™ôŽ…WøäƒÅ•]©£“’ð‘½D†ÿü‰oäKç$ Ð#(n*íÛÎgýàA”À(K CÚ®+§ÛÙMÉP‘°"Û½3Ý.‰Þ$@¸‚g-'W Ñ|}ŸçüXO&(]”Ͻʦ&*ìó]+²ˆô¼ ûr”'›ƒ A†´¯[~¸ÊÉ HX†}[Êó]ZÃD$\Ã&G´ÚÄüI.}¿‡b ÷3?Dææá.Hï/oD8öü‡g¤ÇЈpb5Áð.H‡lÌ£Ù¯A؇׻(!žs0,31?Rœ?‡ ¸1"¨†i$¼Ì#ùÆ®æë» ½¼ÇŒyÔ|eG¤Çà…8ægi~~’ˆÒ±`:¡ Ì×åóèrˆÔWiÖÓtVËÛÔZÉ‘Äm‡ÛŒqˆ•º½Jü¶N‰Î.c´W+£"½ndAA Ö(è°s–”ÅïšÄb•"`²…ßWˆ§ÂáE5ÞÞHZõYrL´Þ8GuZ¬1r¨ùÆ9ÔkC ÂÑÓ•ið^ÝÖ˜ß~ë3¦´W?Š€ãúnN»Z®ô\[b±ªA×5Žj»Nøfqâ¡qr~æŸsT㵡$¾Vé´¾£4ß¼JzšêW÷µ2‚ö«Ý Ûº:EççD¿m8ª)98?«çzaƒ.\;éç|};·¼7ÕàÓ×óuWŸZÁX Íwt DÚ1¼+¡ùŽ2iÞ•Ð|GˆŠ x”@" :Ç}Ô|G4_ß‚¸x‡5™¤™Óßö!ÂÅ;ä0¨r õtñ9 òut|ÎÅ;ÊÁ|]Vx·£yÓ€‡ | /ÉUî…‹wÈ@.ë§‹w LΠ ‡‹wX¡°®.ÞQæëaÇÌözÀôÁ$|Œ„*åÌ/æz,Wþs¾ï ¡(+LvOQý6TE¡{ ¨A ŽSˆ¿º*$cST‡u­@:1\aô\Wƒxî×Þ-S,ÖQ‰èQ$uD"Ej²“£Ûý:WÇ’ŸI3³¢Õw‚ ~éj¨V<…)h³XœÝEEUŸ5ƒš†ö|«;ñí*Qï ' «æk3Ô ¦’Ž{V³uÊŠû†ªðöË¡@Zµß0‰š­5•P\^º-+y•WØšjPÓÔòDü¬ð۷Яq<ОiöuÕÐ=ˋڷïCw’þÌíÅ $›;Ö3?1šÍ]óÆÔv–~_ÅõÏOüóîv‚ÐèvBïƒäÌ…XX˜ƒèH0[êØFù±>å”`¨Q1h¾v ¿iß„A¤WB#ÇŽwi4oÂ8é1_9ŽïÒðI©Áë¾n™Ë„@¼V3B"qùΡ$Å´~”×$Ň ò—¿oŽd¸÷­MŠAzå7<øII“‚ô Ì£æâC C:ç /§‘·ü”6é¡] ‰fyä,OæúÍ ‘pë†ßÛø©tV$,ç¹a.5i1©a('凬: ¼£"½Qx9Ï=ÿÎ3û[]Óò¹w¹kãt˜OpCW€ A†tâÕ&ø/sdA —òÄ6þ{¼é$\Ã…ùTð¬¡"q)oL'÷+•³~îUÐŽVÚ8|µÛG–‚á×D3õâ¸QŽ$vÚì4A‡e8ÓˆÅr³Â´ ¯‚&ëö» ±ŽÂX1-YŒŸ{=FÒW=Akµ¯?û0ÑY=GÀl½¦I¼µÑ#h·¬ô[6c"ÔëG©ƒ¦ú« ±±&ì*-Ö“ˆ—J:·:1Y/-¡Þhui³¾ñâ‡Wf¢Ñ6cïm»ZÌ׋´_ë†ú¯jKKŽŽ„ÜtTLù'8èÁ¬´*!eÕ…C ^ŠïzQÆNœ5ÉÁ»žˆëÇtlkÙŸ{{¹Vs½Y¨ñ&^2f`ìc D ÃpYê£ L†ÚÞÏŒì–G‘ñ(² ’³ó¾Â€hkäãeÐh\AQBŸÒ…|¨P$È ö±"q-5ïQE‚Z2ïQ},:Hðî„P$Öf=N BHc.ꡊq¸¤‡½ ÖÃ=ÊÁà]VøpuiÒCÆãÈŠ¸˜‡ sä¹íRr kâBžÂâ X.ãa„p :fÞϧB>µ”?º`¥³_0e‡Õó7Ñâ¿ ÃKWÖ‡|ÍéªÛFŠÏToE¸£5ˆÛ†Ä[…!;•"®/£(5ÔˆÝu±8 ÷ñV7EJÃUAou â¶_ºð¾çˆÛ:EÆ](ZŠ·:EÆ ¥Å\Ñ6Õm¿Œáõ¼Ï iú5g”A­U)ô—Ea5ÕZÃA1=i­XŠœÖrÝì¬Nu[맃ÇËÌÎšŠ¹Z Œ¯ÏŠÒZÝò$ÔºÌK ™C­UªÀuP¬µV ¡°®´Vç–*uÈ:ÍïrÁŽÿ¹`©ÿcÆži¼Õ¶gQ±ïÿŸŒý|ŽüähÎ$¥¼N×S‘Þ(¼œ÷ŒÕÄÃDz ^Î{)‹9O©òò9xyºW̧æ5öD nyä õk+¼q,#a!î ó©y=©a(ĽcöàÉ]·²꣑âÀô±™îú¹wyÖ©0ü˜þê\¾BC¦˜b¨~§ˆxl©C9ÔdYÇuYÍþÄfIë¬>Ûµ9w5ÖT¨×‰,»Iku[¦™íëkN|&ç¶VFÄn=K‘'ûm£HÐp­ê¸,dŠZ®ã(ž‹ Nµá^Oý M걞ÄùnP]5^«D ^%E]£j½ÆÑzïë=;2Ñjý`îÛ¨+fëÕú¯ÎT5`e Z0Gâ<˜„†jêÂÆ!PQ¥s_å8èÃŽ£BaeÕv,ŠõXüLÄ{=GÌsÖžx2.Ǭuºæ¹ìÒ£¿]Ó»i`úƒËîZ†jðUì®æA•¤÷ YÕ H© ß®²1ë1EÆ Y…šµëý<éì#³V€§äq À³5gÛ…oÇP*`ÖCfí(*8f=Æ HPKf=Æ HSû–öA"},JJ²îf“"M¯}dúã´$Ö¢ž:x¥ƒbuXÔ£½ VÔ¢ã`Ö.®O†=Ê ÀxY‹z”ÁAcŽ<·õ8M…5aÔC§ƒ&ŠÕaQŽ…PÜ1³ÛÞ^ñ‡÷Í׳wþì–ζC»Å—¨ü´ØmÃð¤•"æêjØa(F#a»c» 3ˆ¹ ”`Øf¨a»ocMÛãÕ]Ý Äo…a¸.˜¶;qà/5¼{¸«cPÄM‡ž˜â®ŽA‘1C³¦í¾‘Õp¿ âÕ.·K YK1Ü(ƒº«‚Î4±a¨»‡ƒ ÇPPº+#—ƒ\õ©†ëê0GÒQU ÖÊP`|}Ö”öŠîq „Z£y©Á;.›]Õq£¢¨½Z„ÂÂÒ^Q‡:¦Ã¼²9pǶÿÁSŸ_ßÓn¯’á胧Ú3Ïöl_÷C÷ÿì.cÑ endstream endobj 5 0 obj 5133 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 1191 842] /CropBox [17.28906 646.0001 861.1876 818.0157] /BleedBox [0 0 1191 842] /TrimBox [0 0 1191 842] /ArtBox [0 0 1191 842] /Rotate 0 >> endobj 6 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /ExtGState << /Gs1 17 0 R >> /XObject << /Im1 7 0 R /Im2 9 0 R /Im3 11 0 R /Im4 13 0 R /Im5 15 0 R >> >> endobj 7 0 obj << /Length 8 0 R /Type /XObject /Subtype /Image /Width 301 /Height 300 /ColorSpace 18 0 R /BitsPerComponent 8 /Filter /DCTDecode >> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÀ ,-"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?J(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¥¢ŠJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠZÍàkhŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢–´´È÷H+®¶LF*;“€kéºÖTÍÍTsQšk ‚E¬û…àÖ=Òõ¬Ç8jØÒeù€®¢#”ú(¢Š(¢Š(¢Š(¢Š(¢Š(¥±¤œWYú±U®ºĺêk.nµYºÓ) C%P¸èkï½dK÷«GJ?8®ºßýX©h¢Š(¢Š(¢Š(¢Š(¢Š(¢”V¶”Øq]l ˜ÅWºźk.aÍUaÍ0ÓMC!ªƒX÷g­dÉËV¦”Ÿ8®²„%QEQEQEQEQERÕÛ 6È+­³—tbŸ?"²n—­eN¼š¦â¢5­+qY÷Ö±î[9ª;w=oi0ô8®‰RÑEQEQEQEQEQE->&ÚÀ×E¦Ý| fµ‹†Z£p¹ÍeÎjŒ‹UŸŠ­!ª“=fÜ?ZÌ›“KmwWMaÄUú(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠQW-. l9­Û{ Ê9©d`¨Ì+>eªRÕ)MQ™«>nj¸„³V¥¦0H­˜×jâEQEQEQEQEQEQE8·orPõ­îƒ´<€Š§)ëTfª3UTšƒÈ,zU«{>rEhÇARQEQEQEQEQEQEQE Ô‰)Z˜\F—5œÕgLÔ~FM= µLª-QEQEQEQEQEQEQE´Qš)(ÅQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙ endstream endobj 8 0 obj 1877 endobj 9 0 obj << /Length 10 0 R /Type /XObject /Subtype /Image /Width 301 /Height 300 /ColorSpace 18 0 R /BitsPerComponent 8 /Filter /DCTDecode >> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÀ ,-"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?Þ†Å[X€)’²¨è+6æáFk&{œ“U –4åRj@1K¸ C%&úPÔàiâœ)àS€§m£e4¦(SÕªAƒQÉaY×6ÇœVMÄL¤õª…™OSRG1êô3g½\ŽLÔêÙ©(§R¢Õ˜¢Ïj½ ÒŸ4@Å[QLš@‚²/.ñžk{‚ÄóUÆXÔª˜§˜ÒÔeÉ¥šxð)âž)ž)âž ZŠ5ËU†!³ç“sSc^ô“ÊqYí!v§/íõ,(ÒÔ·´à*òBAS,Dö§ù&šÉЉŽ)†P(Z•%ô5f‚§­j[\†À5t(a‘Jõâ ¸ƒ# U!”l—–©\EƒšŠ&ÁÅX‘C¥sú·^+›š-¯W,>ð®»Kä é!8J¥qµO5Ê_Ϲ5N5ÜsW`TQ®9¨.dÀÅR3T®Á³'”»SR†|qSÛBÒ°­Û[P€qZPÀ[€*ü6\dŠ•¢T^BJ«!ªî3UdSU¤,½)‹tÈy«]«w«ðÎAÙ²»Î5ª :äRmÁ©0b¨]A´ä ‚3Ú‰“rÖk®Ç«16F*­ô”ñ\µí¾ñL´\8®³Là ÛóvÇXš•Ï^kž•÷½O àfŸæriíSY“¾æ¢1š«y7`jˆ94âØëxÌ®+¤±µ â¶mmL„`VݽšÄ™aMžUNgË)5UÜzÔ,ÀÓÍFÈj¼‘úŠ¥<éTYÞ­ +ðØÖÕ¼ø ƒ]tMj2ädSWƒI4{Ò²¤R’TƒæZ¡uj8¬J›Ò°5 nOŸ[^·ìÐ*ôÓá:×=>æ<Õ(†æ«díJª$É5%ÓàÍÎæ©]¶GXóɹÍ"ð)„îl ÞÒ­x Etv–åØ+§²³FŠŽî|eV²'˜ ’k2{Áœ €HîjUVïR©­J¥•탎+>âÙ“íù5Z!–¨ï$Ââ²IËSØájKŒ³ ì,¡ÚŠ1]Ngœ1§y(‰6ŠÀº›’kž½¼.åTÒÚÚ<§sV’Û¬kQ¹ªç¥BÌËS[Þí`´ÂÇsÍcßÚÉ8â°o`ܧŠÍ¶™ Ÿï]m…ǘ€æºã ®Æåš• ÔyCY m“$ƒ)Y’®®Zò)÷1ekâ-¬j¹m¢³¯'àóY÷=i[Œ-AvõƒEËe6.™ªÏÍR^´’·jÙÑaɺûw:Šì­"ÛgÚ²ïåÜÆ¹}ZïnT§¦Ú›‰70⺫xj”²5h¦²är*œñÈ©tûÖŠP¬kvx–æßpô®ZúŒÀŠæï£Ù&áZú%Î@Rk­Ó¥Û"ó]•³yí@j%\¡¬Y×l´ñÊV}Êáª[>¢´]2•y ¬[¦Ú a^Kɨ-Î^µãâ:£rÙju°ùMC9ùÍ=xŒÖMãeÍWJks ÔèÑâ0k°Ñ¢Ý(®¢äùvøö®jþMªÆ¸û§3Ýí÷®—M€Cl;TW2nsYóMƒOŒ2iàã­N‘‰Š­,x$˹S›…tZ5Ç›Òj–µÖ$ äµ$Êš¯¤K²p+¶²~T×m¥>èXa‡§0ÊÖ=âáé±ò•NèRÙýêÙUÌu“¨&3\Æ qšæ®ßæ4ë>XVÀ8޳§?5Yµ!ª³¬§ž"¬{£óš‰:SS™Åv:PÄK]ž‚™a[:Äx®SVlDÕÌÙ/™{Ï­u²|– JÊðMPQ¾z܆̴9µc_Î-äÚjÖ›?˜*{±Þ²ï1æ¦Ð$"\V¦´™‹5Åjåjɲ;n¿î,QkµÑ[1ŠÑ—ïÒŸ»Y7ÚŠ»U®…6ÏïÖäc÷u—¨Ž r:Ÿ®Zèüæ§±û¶úºÎ›ïÕ»_¹U%ÿYO?ê«ëïš:Scÿ^+²Òî–»]ò+WQ%rzÀÌM\æšq{Ï­u—Û¥dÉ÷ R€âƺ‹[„[lJäu¸šk’ËÓ5kHŒª€kBï¥f]œDit MÇã[ZÁÄ…q熬{NnÇÖ»}<~ík¶ÑÈ+J_½Kü5•}Ö ‡¥Wº¦ÙýúÝ‹ý]eê= qú§z宾ù«?xVë¬Ù~ý\¶û•RaóÔƒ˜ëì|æ¡JoI®»H|Ä+±ÐäÄ€WA|7Cšåµ(÷F¹4>Mï>µ×BÂkQô¬é“ŠÎ‘ K‘Wbœ”Æj99æ­Ú¢Æ¹¨®dÜÕ•{'EjhóSkrŒm®3Ql)¬ý57ÜçÞ»‹¨®×FLD ]åéÇîÖEéùª8¾íUº4–~¶Ðâ:ÊÔƒ\¦¤3šæ.×ç5%—Þ°Fc¬é‡ÍV­OÈj ‡4±ò„VeêáTN´’ 05Ñh“| W]¥Í²U®¼5·áX7±ò¹ RÜÇ.ð+GF¼1«×1nù…P‘3ÔSâœ)ÆCŠ­4Aª1Æ×L×UiµµÉàâ¹íRãÌó\¾¥'jŸDƒ.Šì¬c˨®ÖÁ6@>”òrôç8JźlÉJ¼%Qºniö}kT¾#¬‹é3šç¯Fì×=yÌi¶£ [ ÌuŸp0Õ-±ù K†5'µU¾½f†§H¹«ºLÛ$5ØYË÷H5ØiW"H‚“MÔ!ä‘\íý°•Ïí{Y²:f¶í/–DI"+r*³&)„⢒L*¿–ó61[KÜ›©^¥T×5w7“X2fyð=k¦Òm¼¸ÇÔé0nWT¿$@SW­6áð†±œî–¤c„¬Û†ËÕ›N1Væ“jV-Ô¹&³å]ÀÖ=ä=xªQ.×­hyJ§t¼ÓmÎÕ›´êjŠðÔë”ßcÈ»^” ­$Lc”êtÛ€èk¤ÓnÌN9®:ÜCïYpcÇyh$ãšË0¼-ÆjÌW, MæîÒ»©VÛqæ­Åq œTW7¡WjšÅ¹˜±$šÅ½˜¹Úµ&™dYÃ0®¦ÖŠuzU¾ÄŠÑ‘»P*¥ì¸R+>>[4éÛ YŒwIW­øZŠòl)æ±¥›sSÑw ©yŠÇxö½]¶aTncÁÍAÁ¤¹‹zæ³ µ8 ŠnÒ­‘Z¶{p ­Ø'ÈÕµ¾+€M_¤«ÍV–0zUIYÅBÕ¶*¬²â©É½Î> Í–«ol Õ³µ.Êèm¢ ©óNZ¯u6ÖzüÍš‘ÛjÖl﹩ð/z.¥Ø†¹«ûŒ±æªÛ>çÓé£ V«Ãº>•©[àž+ VÐîZËäÑsN™7-g:íj‘áƒU. îTQƒŠ“nE ŠÑ´»+€MkC8`9«‘ÎËÞ¬-ÑÇ44Áª Õi9ªî„ÔgÜy©cµQÚ­G`+BÚбŠØ‚%jbô«ÍÊk6Y NAP\ËŠ¦£sU¥ùR²u+ŒÍr÷SnsÍKdrºí/ ®…rV^¥mx®Zê"Ži!nÕeFjŸÝz²‡rÕkˆ»ÕQ•5.®*”ð`ä ‰xëR”&fY hCsžµiežÞ—4u¤ÛN žÕE6â0êkžÔ-:œV!„«]Äãé\ýõ¦ â²] 5Iö5!P«I:T`5"µ;hji†õZ•EJ•2ÔËR©©NóqM2“@É©JÒZII¦*–5a@QU®n©æ¹ûë¬ç𯕋µ:²kNÞ,b´a\UèŽ*ôc©o7J¼¬UK¨ƒÅa\[bN•ÑŒ2 ¥un+ îÓñYCNGÇZ—†Åž•B("µ<`Ó‚ŠpZx §†§†§M8 ÓÔbŸ¸ cKŠ…œµ*¦j`Š‚âà(<Ö%åÞsÍcM!sMŽ<š½>Õ¡x«h1S/b7Å]‚\b´aš¬’V}ÔCx©¡—**c†JæÜ0Õ[ûT-oíP´$v¨ŠH*E“:KS¤•:½H ;4QE-QN—õZ#ÍY޲‘bŸ€*' «-Àꤗ>õ]§'½0ÊM‰¥Í-´Râ—h¥òÁ¦˜A¨žßÚªÉmíU$„ŽÕ]ZA!> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÀ ,-"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?dG-Í]Tj×ËœVšÛëRÃæ#5ÑÚÁQ*i`Œ/ +ñ@ÎbÜ“T]ŽzÔ{Øw§¬ëS$S+š•XÓÅ:ŠZ(¥ð3R*Š™#Z™#_J”F¾”QÚ«J:V]ßâ°®åpN ªKq&ï¼kbÂFb2k¢¶@Ê3KpŠªqYS1 Å>Iæ­T!vsNûF8Í1¿{LDœâ®[ÇåZö×f­´Á–³/@Á®võö“Y2LsBI¸ÕÈ“u[Ž˜EŠpJ]¦—RÑE.E.êQ&*E˜Õ˜¥Í\ˆn«H"ª\Å€kû#5…p¥E±-ÒµmcòñZ‘]„Í<Ü 8ÍDÐoæ—Kæf¤ŸîqY­»}hY¦HÍlÅn ô¦K: ¬XÆi èQɪ·¡æ².[~k9á$Ó£i«¶*ôOš²¼ÔEi¥i¦šBi¤ÓKRn4å$ÔÑ®jäIW¢ùjÀ˜PNá…dÝ[ù™â³$°9Î)‚ßgQQÉ AUZàçƒVí&$ŒÖäJóQÜãIsÍJ¯æU˜ì·sе¿—Ú´!*Ê·×n*¹“š’<=Nm•—¥eß[í¹»²CUS$ÕèÎjìw»xÍYŽo:¥0âªØœÍÏ­u6‘©ASIì*lª÷AŒ×;¨\—'šÇe,õnÞÕÌHäˊеA·5~Ý~q]šªÚBPµ¶/&H­VQX‘r¥˜šªiÅ]·ªyT¬+ùç‰#3·bSZ* ©ÖE)âLÓÍ8.iâ3Ú¤Eu«LW­hG"¸æ«]Ä ’+œ½IªhùnkBS¤;Ee^rE2ÊãcàšÐ¸pñdV ¤‰k[N~k£EjZüëU5UÚ†°bo½õ­Dæ¹gSçþ5«lß ¡l>`kj ‚¥G óž­En"L‘QÉóU+˜°µåõ~Ýv­Gw/Ê@¬IàiXš®Ð¬#&«=È O‰ÝÍ^‰z²  x§ ÔÈØ«•nµmmÕÇ‘¼\Н;5g^+”£Õëyp(¹m¬¹$ÜHªÒ‡"¬Au½v“L–Íš»f»1Zñ ÀVµ—Ê9ªÚ±Êçb{ë[M¾,V±a‰©-ÛæÅkÂpµ/ÚpqšØÓÌ[»!FTJdÑîTÚŠI lP4ííKw ÁÏZåoågr«E'-W£Úƒ¬ÆÄÕ…¤ðqS& YDô«pÊÉÖ¬³$©\þ©,µŒ—¿>Ö5; ‘w €±ŒÔRϑ֪–¢UÊUä)6=뢵‹ÎŒ˜E°ÕûA’+H-jóïR+-#ÆjÐmçÔXZ£V¨}±ÕT˜½ÀõÙi_,ûQvù5]š°"«]ašÈÍ>­oÛB°Á¸úV«)•Š­bµ®Ü³UY8Z|IÜÕ´e^•2Éš•y©sS,gµOe<Õµ!Ö –FˆûUK™VxÈ=k”Ô#h¥,:UÝ2ãÌ]¦¦¾‹hȬw~qOæ©]~ZÍ•1.k¨ÐÆøÀ5~ê§8§Ùš­Ü¶Ô¬²ûÛyx¨­Že©ï÷u’Ù*̲b­bwÜï]­›í„ I›5gæ«ðòµ™«K´*¾•é7Ò½¸›ÖbÁ¿.Õ™¨«Y…BrÕ˜»ajô3 š¸±ìb€ÄTÑ\`óZ0”SÞ##¥A1„µƒs!†Oj¯r‚â,޵jL>µ½([gÚ¹¹ÆÙH« ÇËTÞ<µoh)·®ãÌyªöÃi¢ñþCYÍWzUOõµ~åscH¸z†æO“&–?x uVïòR9Í1x5£ ÄY¬-EŒ“ãÞ®Ú ¾}ª¡s=Æ;U¹ñqX ’XÖ%ܥ䨵vÆÔ*ïz±%â!Ú´‰;¿J³OZµ£u©¾Æej $¶~sŠÙ¶•n"ÁëY÷ªbséXz€Þ¤ŽµNÊL¶ÃI{ÇÞ]±“|;McêQí›4ënV¬7Jˆ&Zµ´Ñ±ÅtŒ7À*˜Iª—¯ÁªVŸësZRv¬ûoõ•¦ã1V<ã k2á²Ø­ 4`[Ð5ZÒx¶çéX|˯ƭß?•*¶˜»Ÿq«7‡qÅbjMåÄkÎ6}Æ­jBö)æ«é–ò]ɸçÐ"Fqšc2·Ý¨™e^Fj͆ VP’VôÖÉso½G8¬»g6÷O­[ÔTIá\ÌÇ;”Ör~îçñ­[˜Ä–»½ª…‹ì”­7ULüÕ^Ï•©ÏZ|k“ZVƒ +£·ù¡ª³¬k&õªO¿Z-Ú¨ÛýúÓëdÝ X“Ë[+ZWâäRËQV®N-ÿ β]ÓQë‚I¦±f¤q¹‰®{ZnqQXFÕ…})žüF=k°±…l´ñ!8¬Yod»¹+$f´­âx€i+ZÎH'ù3Tµ‹lD¨8­Ÿ \ý¦-ŽN*¶¯‘u‘Ç52·™iøW/yòNER|àÖÄ?=™ÕŠ˲=êÍøÝj•ŸR*gûõbœV„WAcÌuèÁ5‡zy¦Úu Ýª”~´ÇúªÊ¼ïXRÿ¯­«¸+N¢´aû´‹þ¸T÷Ÿê*®Ÿ÷ÍSÕÿ× ³gĤ sZÏúÚ|Y1ö®bÛçÖ€?Þ®Ó^c»}+#Á±-ÅÑ2z×SâV s³Ò¸ý&òQªÉÆk¿Ö£WÑÞ»kÁ®~ÖËÛ5«âu@EV´9µ?Jç5/õçëTß ­k/øö?JÅŸ‹ÏÆ­ÝÇ¿áYö¿|ÔÒ}úµoÚ´!ê+{Oû•ÿSXh´«íÚ©Á÷ëLª¬«¾õ…(ýõlØýÁZŽEhÃÒ®bìf©XHEVÖ÷€Õ‹š “8È®oY“4¶­¾Ð¯µsX0já­v×j/t'Ïhò¶™vsÀÍtww¿n‹nzŠ­¥hán„¤wÍlë÷ª¶B=±PøBÜ«™«^"“ÌœL·]¶Ÿ…s:‡Í9úÕ9¯iòÚ“íX²|ןZ¼â¨Z}ãSI÷êÔ¥_‡¨­û¢¾äšÀ¼ÑiÔUöíTíÿÖV‘â*ȹ9&²'\IšÕÓŽTVÌ WSŠOùh*䫺Ûð¬›vÙqz~ª›Ð0¦éM•ÛSOò=ak ¹ Ÿ§MÉCU5kR%óV¶‡~ B'5jïOI[zb™&Í]þÐò“ Ö¨6úàg8Íu¶­•Ÿ¡ÅdNææïך»qû«\{W-8Ý#Ïcºp­l–òìÿ È·]÷$ûÔº“mRÏÖ¦nZ¦ˆàÖ¹Ë èløŠ«ÝÌkôS->õh7j£kþ¶´f8б¦l¹ªw)ÆjÖ–Ù WGnœ °F)£–­ #Ú°n?uuøÕö_>Ûðª6™†|»z¹M°îñ$eMsä›{ŒöÍk(K¸0zÕ/²½¼™Lâ´`»pj±æy”ôµy­X⃞3EÝñlJ“N·þ6¤ÔäÈÚ+ŸºZYÖª^|š¹6ØÂLÓâ౪z¬™“Ë^§4#a«NÄîq]"|UG;‰¬ëÕâ«Z¬Åi8éYö¿ëjåÛb:Ç-™)Óǘ³LÓNÙ€®¾Ú<Æ :UÅFƒ&´ û˜¬mZ<>áRér‡M¦‹Ësï(’¦°ïs‡Ò²îcŒŽ´ËY^ÁéZñÊ’¯5'’‡¥(]½)þk”‘øæ®ÚZä†jÒyDqíZÏ•Keš°u]¶Š†%FXÕ%3Ü`zÖÔJ!¶Ïµs÷¯¾sS[žNÇåªåðÕµ£üî+¡öÂTˆî5ê|¦³­†&­)J£ í|Ó¯$ÊVdgt• ÑۡK‘õ®ÛO]ÖãéM¸\…ÍW#8KQA"˲s ø>µÐÈ‹=¾{â¹ë–ky¥P¹‘f_zÌ$£{TŠ«%J‘²ô«Q³ ˜Ôˆ õ«íZ°³‹S"–åª £òák1í¹,Õ©Ï·(µ• y75k^ɶ-¢¹é\šžŠ™Ûå¬ùdÃâº] &µ¯%ãËC“S]¦R²ã]²f¬3æ›*ì\ÖlòäPÛÞf¶#\¦*#o‰AÅtúC~ìS^'9ª¨)ÌûEW’@ß,x}¯Ù]í]¬j®­‘ -r“JÐÈAéH$Y~µ*)SÅZ‰ýjÊàÓÅOLÖ¥º#¨.Èj“ÅL)§»a+0åçük©ÒßʈU™fÞÕfÌò*ü£zVté³&ª‰3š»~6ßjæä“÷¸«ÖéÀ5©oÎh%¾åÎ*ųù-н#‰Rªçiª÷2`qTÿ6*€ëU§#‘Uš÷#kʽ‰eÉ™±ãn*ìçƒWãÚEL«RŠzš•Xö«0¡nµ¥* šK‹€ X—0´ìsUZÙa=jŒ²å°)ñE¾’xv¯JÎdùª)ËQÛÛ’ûˆ­!?–«I¼Ö¥¹ÛŠÔ·ùÅTÔ×jÃþ÷Ö¶u/ø÷ü+”p|ÿƵ­H(*ý³aÅtª uV÷÷g"›iw“´š³7ÝȬˉzŠÏ$ï­Wãš’åC!®rù 1"³ÅÁVÃU„)%L¶Ã¨©’&Zr*AÍ=@©‘”TëpJ•fwéV#€¿-DÈ‘¡®P—$Yˆ =iÛ¨ EÂî—p¡3U#ˆË%h›qYÅeLçÌ­=÷Ö¶.Û|X¬¢Ã“RA6ÓŠÒ¶l°5¿i6ñÞ§’ŒÑ˚؆a$X5x„1"«Æ›[v %— Y7l5‘4@ž)±†CWà˜Žµu%T ƒKG4åBjÌPç­_…zÕŸ4ÅQºfpkê"Iª{v±ªv &MdÝïVlmÂòEMxFÌ Åx‹IZ¶)´ Ø‚-Ø5}?vµBþMêEd¤xÍ[ ¸â«ÝÅò“Xîåd­m>MÀV²LPTÂO0S$·ÈÎ*!!„â¥Þ³ h‹iÍJX¬Û¹1šÈš~j&MO¬$@ÔË*UR*AOR*Up*U–§G&¬¢“JÐäU ¨@±n†¨ã;zÓÚBü T¶ÏÌE+Ê"“Ì4õ·ïеnŸ0ÐYÄ6QÞ6Àk%Ÿ{b“`Š0i'ùŠÆžÜïÎ*Ížc"´ƒîZ±lØnkQv”¬»åÆqT"œ£âµà•dZeÀÚ2+îCÍdËɦ 9«‘ ·XSO––œL•f#Wb59Æ*•ÊdÅ»P¹¬Ö%›¯ÙÛgÕ©Ô"qXWLKš}ª’y­0¿.*kxðÙ5±ÁJö]ùÅgƒšy4‡¥5T¹ÅX×8ª“Û»T)&®Äã©ÅÖÑŒÔ3J$ª†NEO4U3܆\Ê»ÃgšëÍ* µ«IS)©(§ p*бZªÀ> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÀ ,-"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?ipµ!”ñO<ª²“Å$‘îäTû* ¦CSG—ÍXŒb˜É»‘MÎ84»CPÃhª­1 Ví±'Z¾-¾\Š…ÁCQù€u¤iÓF•“Ч? 7ÍZ6ã"¬:áj”̓Q&‚¬i†& ¦ÑÍA$Áè'.Ø­8¡Ü¹4ÙP%B$íK‚h,›’ÜÓ 35[BŽi·cŠ­Õ}Xlæ¨Ü[Š’Ý}jyGËTNCÕÈepi²òx¢,޵$ƒ+TÚµX€yu¡ÐÆ +U9âÇ"³Ü²šš&­ç+T®WAóV·U‰ËYÓõ¦Ä š¼ˆ»jÙTqYòÊXàTC9ÍY‚,ÖŒrí¨ç“uV_½Vr6Ô ŒÍS$x^jÌh»j9N:UrKqFͼÒy¼â¥TÞ)Jì£~î)Ž£U˜†â­[ýjñˆÍS–M§ˆwÔ¥8¦sVbÈ¢Vãš¡!RiÑm«9ªò¦j Y¶ÓÞN*¤‡&ˆÁÍ[]تөª˜¹«‘Š{0ŠÙ57•‘š«11ô¦Ã!fÁ­8‘væ‘ð WIÈàÓËo§šŠcÇ\)ÝWa8épET$©§Ü(î5aF3L–ë[™Z®A g`ÅF@0(¨e}ÕQГMRV§I N£u WvÛQù™5".ê°‘Oܨ%!ª«EÍ iŒÆˆäÁæ¯Å0aŠY` ÕS ˆñRÇ9¾jˆƒÅÛzÓüÜÓ•wSŒ8¨™öSD»?fêQ I¸ ªòÍš…TÈjìcš´ ¦™7t¤*H¨$⢚v8¨$â›|Õ¥n4©…¬›£‚j¢9ÝZ6ù U¢¼Uw84ÑÍ+*»°SL'­:7òÏ5~à T®ÅT’Šp1SK ªänþ3RùY¬è2³`ÖòaÍfΙ’¦pµÌ„>K&©È6ÉVâ“䪄îâ­iƒ<š¹vãnÑIak¹·0«·N#L-R·F–LšÕØ*É»|TÄÄœT g“OV Jä°ªRŒiи­‡j M,(sW!j´ÄµLž*A‘OEK$XZƼOYφÁ«·‰#Ȫ6ó43`ô­vq4G­oYb[³®¬ÄUÝ>M«´ÕMR<¶áSi„ÅEzçÌÅ–œFMXE:Í•1qøÖÄmåÚþ‡02ÜgÞ¶-ߡ d¹«ñ ‰U®_ž)°Ž2jÆÈ VIzÕ±L€MYžUqY3NÎN*œˆÍÖ’8ðy«Ð€*ü5~"¬™F9ªÒzκ¶à•ª1’’`ÖÕ©X*Ec¸Úõ0£ª&­ZÉŽ(¹yÍ_ÓŸbí4·1†“5PKå=K)%6ØùgÛ…ÜÙ§D¿-)85:>ª•Ý.jÄû½¢£†ß'qçm§mOgššWصQs#f¤rb ‘r¤šÏÙ™júÊ"êºvö¦J‹æ¨Mr3ÅVó˜·zÔ¹#5µiŽ3Zð¢0¥’ÜÅQž'NEUóùÚÕ¶á¾e©­X§‹¶ª,7ŒÓQö¶ ,ñew ­ÚÕv1½i<Ï)êÈ”8³¯r­šžÉ·ŒSç>[SЇLÒ¥Fÿ~•‰4qü›ªÛ¥ÛZ‘ÆÖdÍûêѵ\¦jµãüÛEKmØ·¬íº\Q9Âb©Ÿ“,j°˜Ë.ÑZÈ« ¥s÷×M,¥Vˆ-ÆZ§G\TñJ™À­Kd.*ò,¨;ÓÖíáªämÂcŒÖ&§la}ËÒ=üÑ´ÔóÃ圊­7Ì•V> º"¬ÀDÖ|ÿ$¸­ ?™*µöU³Då)ú’b“KûÕ.¦vÓ,äÜ•0l58 œÐW,hy{m³íY1Ç×ã[NqoøV Ò~ÿñ­»>-óíYÒ2çõ¢øK|UûÄšŠFÜøªwïåÅU´¥2ÏšÑÕ§òáÚ eiöÆi7°â­_\­ºì^µœ¾mÁÈÎ*õµ£)Öݤ¢,ZðÝDàŠuÅ¢Ëd¬¸f{k­Ó5¥x‹sk¸zV‘ò®¶ŸZÞ¹u¾áéXßÄV«È»_5ØÝiº{ó´ÔZŠm“5L]ÑTšc5J…5S¦icç©5dâ«ØвãkT±ôÍ"°2ŠÒ•€µü+Í×ã[rÿÇ¿á\ô ›ŸÆºFÛ,ûVm¸ÝrO½\»|(IÛjUh[t•CY“cAO¹¨uI|ÛƒÖ´¢ŒZØï<W:7_^àr3]‘•¸-Œâ¨¦ ]«[¶0} S^YÉn\ÔÚ>¡¹ü© í¶ÌJ¢—IŸÏ€¡<ÖeÜf à}뤄y¶ö®}×mÁô·|¹ªŽ¹B*­±ÙqŠ—T`5gF`cÅ7TïYДÕÍLóNÒ^®j‘å*µ„|Ô×)ƒQƒˆê²IûêО_ôo²-_7_tMÍ¿áX…3v>µÐ²bÇð¬ëDýé4]Ÿž³î› PZ6XÖV·'ï@­å°-íY?VÁçšØñ,ŸfÓÂŽ8ª·n•†j?Þ‘sä©ïг¥iEá‘ZKyö ]%ƒ®¥h{ñ\½Þl5`5Ö^F.t_3¾ÚæJ‚Ìrk#[Sç­né<é¤{V^òkúÖ§ŒT½’‘éMðT€[2ž¸¬oÂ˪ï=3]vy° ‘œVf¥ O6SÖºÏ Fm­I“Ò¹ß0›W]ŸÞ®¼‡ðÝv×!¡uV=³ZÞ"`YEjh¼XséX÷‡7‡ëRÈsYmÔÖkóqOÔGú8£DSšŸSVßîUÍLSt£‡«¬˜Z­a%X÷UJ‰#ýíiMú7áX¶é‹¯Æ·Ÿ‹°ñt>µÑ+î±ü+6Õñ95âóš£:nJ¯l¸zÍÖâù­ ·[öª3¡·ÔCûÖ΢æ›êqX:Á²»(x­}bÕnãó“Y6fhdÛÎ+«Ó$ÉZ·w‰mlV3Î+ ÂÙ¯/üÆ­ínàCb!SÛ‘ AµÚR)5y|Û ¾õ½`|»°g}×GëRO&#ÅQcò“Tcî?›S\DI¢GòæªMP€ü¦®jmLÒÏÏOÕ¹ й«eªT8â”q ­ Úþ‹ÿJükjQû¹é—ý#ñ­û_šÓÕšŸ%×ãZ º jˆ\.É*ž­ôÍ7C}¯¶¦Ö¡ä8i—!âòØÖv£hÑOæ «6š‰„’®FÑHr1š½ a÷*ÒÚI9³ŠÖµŠ;8²qšÇ¿•®î6ŽFkF(Å­žzV“=ö}ë¤vòìñíX$æbi“ɓН;mŽ ±¥Í;Sl*æ‘òÅQêÖ³¡û¦¬j “OÓFj[á¼ÒÛ¦Øéê2i¬pô1丒æ U¸Ï½lä4…cLŸ¾ükZÌâU ¥Û6ê½ -ñTGË)Ù×Õ;…ó#"©Ú)†ãñ­›¨„ö¾ø®lµ¸>™­1:\G†ëU%³åiöð:0®‚Å•@ÝZ‚íU~QU§šI¸©l¬ðw½G«ÝbšÎÓ2î5©w6Sh¬ÖùA5TòTW§Œ ’Å6&ãTï[|µ¡`Ûcªú‹dÔéòTÓ§˜õb$ò“4£÷Jí°b–6ã4Öj~Ì­5_m+&êµà¦3Uf“5rÝð Sn£Ü3L·}£i¦ÊŸ6áM“˜ê€oŸžöùù…OÛWkU+ëU—,µ˜Qâ\“P82IV âÅQ#{æ¯Ûü«P\'˜õ4PmJ–Ö/0æ’ý„kE€Þ3Q^dIN‹îÓ»Õ˜ÀÙYò>.1ïZ,›­óíY‹1IvÕð›Óu¶ÖÅ]ÆõªS.ÆÈ©ïZ­q”³ ~ó5­hD‰ƒQÝ[•åj‘‘—ƒPHÊÝj1«B­;vÛŠÒŠvÇç.«4džjY"_zÍ’c$˜+NÍ0¹¥ºN3Yr·8ø× “Uç—'.ãV]¼±ŠšÖ?4æ¬HSìl$šÊÔ¤/6^ÓFØé.âËf£Œ`R1ÃT¦M±ÖsÓgÞ·-pöø>•‡|†;ŒZÙÓñ$…V¸9jõ£ïJmÌy¨£B¦¢¼\¡¬r¤=iZ UÒá—¨Ü@­’+.xŠž*í3ZûÖŒjò…¬û›Œg™3´†™a³ZöÇå¦Þ>â±ÉùòjV”ÅQvÝ%hÚDŽɪ·rfL ØÓäÕk©¿|qVD¢8¶ŠÏxL’n«p˜bP*Ží­Šp]Ç5 ÁÀÅA äæ´aŸË&«Ý§œw ŸN“Ë;MZ¼‡Ì]¢´&6Á­¡ÆifÞ¹œT3U˜¾ZŸvE5ɳç<ÔQ¨-Wâ@J [ÍXl•ª3š¬qÚ•œÕÈŸ›8,¤šÆ¸m¬j1§Û¡wÖ“Ì#‹ª)šlÖÜr¡ÛTdBîZ˜&2KŠÖŽäæ©ÈÛ^¬FÛ’¨Ü$«0cËɪw/Š–(ð¹ª×.PñV¬š0ji£ò›"¯Yʲ®ÓL»‡Ë;––Îã'i«òS"±/FIª¤5ZNƒNnœÕ)ÐLŠ.jê&šÇ¦‚L´eÊÕ)É&¢\´ýÞ•,GžjI˜l¬+Ó‚j´dzÔ!‹5BIZYvŠÒ¶‹Êq¦™‹Ë´Vœq,Ë·„«î5®²þï›pß=Mo'$‘oæ i<±¶¡»f¯F˜J¡uç©lÿtjìî$Ž©A3C/µl,«q;ÕcFùq'ù0j‡Z°‘ùœÕ¨È„UK¹<ÃÅGA榕w-TòðÙ©ÒL Sã‘Víçhx5eæY׫5¯9ÒL}i¾fM<ŠŠl¨Pf¥AŠ“w У§WÀ¦JÄŠ¦àæ•TšV‹šoœ±Ô2ÊÓp*8ìòÛ˜VŒL±.;CSGûºI¤Èª½MHjŽFòéöÒnjôÐ©Ž²Z2²V…±ÂóPÞÍÅWµ%ßšÑ0€¹nqC("ª¸!ªÕ±ÇZž]¥xªªìÅiÛÌ àÒNªÃФb ñNQ¾ME´ŠBûi™5:.êÅM8ÒEBØÍ àTsK‘ÅR*ÎÕ~Ö&¥›aj´a‹óZ1`-2Vô¨†Z® .ൡ”ÓâO+š´“ä`Ó$ˆ7"¡gòÆ* ¦¥Š?/š´'b£dÉȤÎ84›PÃ`ªí9jØ zÕñnBäT/¹zÓ<ÁÞ‘¤SLá œU9¸¨Q¾jÒ·eÆ¨ÊØ5|ÐTša© `sP<І¤‚rÇ´£‡zäÓ$Œ'JŒIŽ(å¨ÜšIcš‰þõ\¶m$õ] ÝWÐü•BçïÓíÀ©äûµK'}_ˆå*¸4°š|¿v¨:Õn×å#­µÜõ¬ù¸Î*©cžµ<,jÉ> stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÀ ,-"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?•ÛzáE1Sg-A”9Ú*hÂÆ2ÕþùðµicE“YÓ1wÀ©­ÆÃ–©®Y^ãVnØ4{EgÀÆ 2jô³ ãÅdMnË&E]µ“hÁ©Þ5q¸Uo<Æø«±¨™3Þ«Î#íQÆ‹1æ­aR‰D‡¥q‘Q±*piÊù µ&*)ˆrjR¼Uw84޴ݧ4ðž´Çq✎ÒñO0mùI䢥e'“P XÎM>I¼ÅÂÕt·;÷5^IB.W5rÚ5 ÍAxåN›iHÙjµtë xk: ²sÒ¥¼·ýÞTU yJIµ«I•<ŠË²ÉÅ_‚_“¢–-í‘S[¹‹ƒRLë0ÀëP¤MÈ©\ŒH£ËdUô;W¢”ªÎ6ÓOš­!j½ÅEZ´ßr¨ËÕ$)š•(¨» «"’jkfjãfALUXÛ&¥3Ò¨Î]=˜ÁùªÔ®¡xªê µ[H°¹5“yg¤†prjáE·Þ±o¥rJ-ÆA5¢$WLȾ„«Z† ²Æ5tB$ª&3ŠšCu§Ê¹^*Cç¥j!C Q¸-•©-·/Z²Ò*"sQLN*²Ÿš¯G÷j)—5k´Ôìÿ-Ts–©àÍK ùj£šc!#Šli†æ¯£¨J¥pÌÍÅ+mæ®Ëªf³Ú|>\ZQVD~_&œg`TbÙ¦lÖŒ!mӚϽœÈØZm´†Z‹¨ÄkÅf‹†b®ee‹žµ“snRMËÒ¬Û^]¬jWw"˜¨cäÔ«8'¯ÁuÍGr­J­ ľ´‘U’ªÎ¥OIŽ´®Á…We Ó㔎*Ââšë¶ /“Š’8ÃU…P¢™#gPyDš¨UªSHsÅMj¬çš·,J‰“UŒœS¤‘œb« r_&µ-c4û™– ·…Ýùé[QŠ>zÖ}ä¥Û L‚ßw-O‘Ä#ЍóyÜUi-vüÕ\LQ±Vr²ÇïYW0²>W¥[±Ÿ Wæ*éòÕ%…¼ÌÖ¥´ÞZ€jIdYF*±·äRš>)†rýi85".idªç W­°E-ÈÂÖvNúз-,ÇhªÂLš™I"”¦î´Ãl½M7p‹¥2IZAŠ" Õ¨KsSÊŠ©‘Y¯+À­ š\n­"©æªK9áiÑ@O-RHëÅg\±”ñPĆ6É«"²â³n 9$Uu”ÆØ5eJ̸ªÓ@ÑüËEµÉÞ«rÝÓ5 ÐÙÒªÅ#–«êNÞj)6“MòÔŽ* ƒÅ:<Õ–|­SqóU¨h§ÌÛ…U óUظZdß5E_75lU¨ðx¤ÜäTžj[uRy«ŠÅgŠš9̃§KPÇ&®ÆëÀ¦K#OÀ¥‚Ü«eªë:ªVUÓ37ØSûÔ\coEK«VNk2î3’V£·csWLË"â 6¿6å«Ü4\´­çu«ÛªŒÓ&`£³äfÝDr°ëV·iÁ§ƒz‰¾Jr6ê˜GÆi&Êg›ºœŠpbjTˆµ8DªÜ(íT‹´gŠ•',9§2ÖŸ j Yg*¼UC#3óZ¶3W§@±äV,ò°|v©b@ã&£¸ù:UUbçš%@"¨´Œb4.Z¨_ݪ–ò¶úݵùÐf‰áQÍ2&*x«BV"˜NãÍ5" dÔ±¨¢CÅGº®%j•ÃÒÚœµi…*ŒëóQVpÕ29Å6I£ [­5´À ’ñOÛ<Ö‚eÁ¦½¶NV¥‚CZ¸.<ÑŒÔ2Ú‚7U7Äq@o7­E*yc5U¥,qKä7‚i¼žTfóÍ:+M§$Uå™c\Q´!â¬[§?5^©^* So"ª<äqQ‡,jÄyÅHWp¡#Pjl¨Z©0 i`]¦®ïùqU&šle”ÔÞa"š9<Õ˜À4ö„5W•U9%9â–6b9©¢€;sV$…Q8¬ö™‘ë^Â`à«P\­RtOÍh$ÁÓRê ÜŠ¦ „óCÉæŒTB §&’Y‚.+.bejžÚ ¼ššâuDÀëT#/,¾Õ»il»4—8îÔܶìU²w­U’ÜJªŠk¸^”‰!cSqP³œÔ‘®ê{.ÑMsŠT0¦8 H˜cR˜¸È¨‰d4õ¸ T3K¾› !Ï5e¡UÀYe1šqºÁ4«n%9(CoÍZ·¼ÜvµZ’ÜJ»–¨9hb)D‹ÍU¼‹wݪ‘!FËTÓL»0+*]Îõ4Vø]Æ¢¸¹ü¢¡…á«A-„+œT‰w”T›LÂk°äÔÙU^W9⢠Ƃ™ëSDŠ*I T[—«ÖËÅ:àak<7ÏZ­6àqÅVMÊÕi$8æ—†ëAEÅU•x¤I>µ/Ú7Sç„ò+(«,•¯c(U©ç"AU–FÍhÛ]…XÒÜD'–³œ´ г‰5 à §mdbø«q@6î5 ÍÈ@TUnÓ¾îÕ£n‚ÍI,Ûת¤Mæf¶ìÔ* Ó/%qYñ³»â´£·R¹5 ʫҫà“Å;iŽýª02jì'h¤™· §³æ«pœ •†áP²í4(~™JI¬ÚÈ$ûÕ5Ä*S"¨¢š–K‚¼XLsS4F1Å,Ra¹«™ •F`Áò+BÆ|.–ö‘w-dùÍb¤ó|áNK@~b*+¹„HTV@Gš\ö­‹dXãç­W¸9n(‚2O5i€E¤Žà–À«>I‘rj ©£œ¸À¤x‰äÒ*…¦Lxª eªÜQ R¹ Q†Ühdâ¡.TÕ˜d&Ÿ(Ȫg†§y¸ÔM¶CSGA‘M’௑0Í:XD)bS&§7 'ß(õ¢B¼µ MV¸&ùjťϘ6µA¨ZänNÐø5£<Â(¸¬G&âojÐŽÙc=ꤳø,qï5(aËÀ¡ òÎãVEÈ ´UY¤lššßjáù‡.:Ôã]Tƒ¶«ÜqQÃÖ­7ݪ2š§…K!㊨äƒP»Ò¤¶Eh$›W š!)⚥ˆ°~zUÉ<~õ˜ÊÑÉíZ–έ W¹\6E>Úão¬<>zæª6ïš²· 2m5^H¼£ºªÊæs´TÛùCqÙ®ÀùA¨£‹ÍlÕôQU ‹4œV…œaW-L¼—<-Al2Ùjµ&6üµHÛòkAU*¼¯“ÅF=hòðjPØ^~j8† XcòÕ9&•>Zw™Aà «4gjý”£n E©°‘YVnÞw=+NðƒFÁ3/ÍZÀ,?/¥sÅYæ­kuòãɨd¹ÜûE[†Sq¦<¸;V—ÊÊîj£$ÅdÚµ£h…Ó-K<‹£…̆¬ùX4œ â£'sMiÄñQ°¨Øâ˜9 ±Ztn°jË@ dU6fGÁ­;HÖDÏzIc*ئÄí ‘:ûÕxQ¢~zU‰a.GZKcä6 [D±äVjÈÐÉVüõÅGöqÝMy§m+'“óSZãÎsD6À6â)·r]¢ª[ÄY÷¾÷`¨á}ÍSÍ(eÚµL[üÛš®C6Õ¤’~M,XŒÔí!+ÅBæ§Q‘PÊ1P÷¥ PÝ*«·4øÀ4²(Å28ðÙkÎØ¸5™¸«P–€{SÞ`ç53F.:Õc—¥Zp­GZ†Þ\I´Ô—‰òîZ,¥Ýò5&¡o±w ‡N;¤Á«Z™ ™`KMÍiß ò3íX¶Äý£õ±1AŸjÈn&ǽh2¬0ûÕ8–\ö«7bai–ÊXå©.æÛò­:Àe²Õ£q"ª`UƒHõ¤°MS••_4N¨nX>MIÚœƒ4²'ËT~jž48ª÷ÈjKYñqäÊÕK}É/5³°I½Rhʱ*NSƒJè%…@d(všUNw ¿EƒTŠùçµY¹”M*…¡ò¥æ¬ÝŸ9*¥´~[æ®ÜMº=µFÞM»jõ·E´U;861cIy1fÚ)öØEÏz³·ÍäÓ$qÚ* ”î4­ ‡RÀ¯qô«Ê‰n2Ýj)o7|«Uv;¶M[‰pµ뚊8Æiî6Ž*%†©ZL­SsóUˆ$sK,i7J¦ö¯È©a¹çkUå]w- ˜ÄvšƒÔWI€©ìåÁ¦ÞA†È¢6àÔ©&ÆÅ2ðnpªÓ“a©¯Ê…rù¼štØ3UÌ’b´L^\;ª¤-çM¶¬] †>+-#26ãRsVUü¸ë=ä2OZ‰„ƒ5šàË6+vÑ2zÖ]õÓK.Ô«V¿.ç©nP¬¤ÔrHOJ"MI sP+.îjÆ—Š£¥h~^*§˜ðÉÎqZÖî—`ã5“lÑK¹zUý6ã)µ©o“œŠ¯µeØH¸§Aû³S» U#cS²jG|ÀA¬»c¶ïñ­mAwÛdzVn–HŸiõ­mEvÁŸjËÓŽûƶu méYÚRælš¹©Ã©Â€%&Ü6j9_< ‰#ÃdÕ²ÙL [xvÆ›wv~âšK[lþñé×7â?‘ 2yþcVDax¥½MJ’F¾• ÇV{Då²)ëæ'Z~òié>ÓƒV¾Ê—1åzÕ=g'µ]nâ÷ª&3o/µYg¥DËv,ø«Ì˜ZŒ> +à®j°9|SnIUÅQA‰7V°2ßÒ©Y®Ë¿ÆµµS›N=+IÏ&´µ,ÒØ'–3V.uÍPSób’o–¡UÏ4?Ê)mÛsâ­Ü0Ž+6Ù ×>µ§|â l¸¬ ek‹œž™®„‚µPJ]éÌY¸$VÌy&–TØ*¯Ú·"§YABª“L¹·ùrµ6—9G Õ{T^ àsY|Å&Újýôa£Ü*…¹;ñW1Š¥kþºµ&á*ƒ¶)RL©ÞÔ—K¹j²ÇÅM`bš£làÕÛ·ó-ñU,#ØÄÕ‰Fù*@v)ÒIûº©Ì„Óæ\šQ«N>SL²ÿYV5ˆñPé˜ßš~¯&WWN]¿5XžRï·5fB¦ãA•Ó$¾ÀÂÓRS/Þ©Mšºç½EöVCÅ1÷Fy«p8•0j=ž\ÀŠÔsæZþ‚«²ëñ­‰ëo²¡âãñ­ ;V]±ýýjÍþ¬U;M4œÓŒ»—)¥AóÕ†‡ÔÒr1M-åŠXdÞÙ©&”®F(X¶ Ò“H튭?ܦØs%?V;V™¥ ©5_R“tÛEX†?&Ûqôªö„ÏuÏ5§¨J- ÇCŠÇ¶w¸—ÚµRÕ@©dTUù*ºÍ*ø«v·Ü«WÖ Þ¢²¬$Ûq°úÖôE8©¬¤ÂV³.—˺ükS­3íX¨quzÒ~ßJ˶ÿšØœ~èUÖ —†¤uÌyªñd¶*n†¤†ñZ,Aƒ5B6Ý.(½R«M²RE]U朤oÅI9 • r¹¨ïT%&šs-7[n@«Z\{lË{Vj?QÛïWu×–€tâ›áh|àe5OÄ—yºòT÷Å^Òí„6ÂWô¨.¯I6ÇRZù™fqZÑÇ ‰ŒÖ}Ü k&ð8­í-Åí¡^§ËjÙj t®¢H…Æ”$•…¥\m»hÉïRëK²Ej¿bÞe‰úV61zG½iÈ8_¥dÃÿB¶.?Ô¥fƒóŽo½S¯ æ–aƒQ!Åin?gü*¡ÍÅ[¿Q´Qd£eXaŠXù´ë¦;EsFGÏP]’™¥ÿ­¨µ¯õËZ¶cY>Õ“£Ú¡Ï­7bª V§ƒ”e3wÅr‹™í8¯µeiíäê‡>µ7‹ãóáVoÁòdÑJçuËc³æãÕÒºXN§fM¸,8æ¶%¾7Ñì4Û)a˜KŠ·¬^ï·òAö«ƒìÊÒž+ Å2ý¯TP9Á®ªÉŶ…´ÿv¹KŒš«?½_×Îà«V´•Ùb~•’Üߟ­iÉÑ~•‘mÿ¯1ýЪYÅBÿ3S_•ÅF‘‘ÍH«“RG÷Å^i•Ѝ£ šmÀ.´ÛU+WÁ§†ÁÍ9Ü:Ô`㊆Eç5ãä¤Ó†%£Y\€iúSþä­PºÍÃÖ´.Hº³Á犫¢9¶¸+ÐU~ØL¾`Õ=&àÇò7JÓšÙ'çŠmþÏȧ›öÛ´TPÆ×Ý+}¥[["ÌŹÔ7·<Öõôû-kéU4«}¤ÈEWԛ͸Þ´áýÝ–=«No ÷­'ÁTÓ‘šGùª»eM.àÜTˆ»9«!„±â³^6‚}Ã¥i‡[›}§®+[W·ŸrŽ3[·âÚÔ4k»"ƒaMXO8 |Õ‘óN7Œ-4HzÓ$ß)Åiéñ¬ ¹ºÔ:•ßò-7O€F7µ%ìÛÛjÔqG°dÔ…óKrÁTbb7õ©®œ ÀªÑç4¬››Š|êÜý+*ÍIºÉõ­ IóÑU4ÈʾãZ7­ºDÞ™I¬¸5¦S0äUXfÙ6 iIl·îk+sÛMƒÒµ#Xîc窲ۘ[å¥FlsHed5<7 ði· qT %ž¬GlÉ¥eÓ×j.j´÷ŒNÔ©ìmËüïN¿»‹Uì‘§mÆ­ÝàUdlŠ| ÈEYƒ§5VáÌ’TѰUÅZV»}í°Tkoå.üT$™Ÿ8_!i¾g˜qHðìù©ñO»ä&’UòNñ@˜\&+>Pb–§A½AnlÁª“É7 ³ £ËÚjÂû–´ôëœ&Ö¥¼¶YþeëU"[·|Uƒp$àÓ•TR ¦Fƒ4ù@î©K¶Ú¬ÎsNPÒ S£¶UmÍSÉv±Gµk-‘î&Éé[Vh°ÅïUîs+ñH±m«±Äª™5RgÜûV¤íq¨#åÇj»+ù1c½T´S,ÛJ¹¨²¬CN]ÒóVu5ÛŸ`Å¥Á­Kµ }«ÚCöŸÆµ/Wu¿•“få&ÃUë¸C¦áPÚ>i©îËäQ ‰Wš­8hŸŽ•=¨pjimÌC+O¶¸ç Wd$LÖd°•“б;j+€jº3S‘̓5#€¨9êÌ,j½ÝÁèµ^ÞVæ´B,)žõÝ}¢´bŒÜÕŽ7qNyK&Õ¨U6ÍOi÷ü¢¤‰D1¨å&vÀéVbŒA{Õ ™WÅ>ÐyG&¬]¸–q¹9ªq qZ$" ˆbN*Äü¥QQ‡«É÷* ÝRBjwjº€m¨&ëRÛTÒkÿÙ endstream endobj 16 0 obj 7073 endobj 17 0 obj << /Type /ExtGState /OPM 1 >> endobj 19 0 obj << /Length 20 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream x…ROHQþÍ6„ˆA…xˆw •)¬¬ ÚvuY•m[•Ò¢gߺ£³3Ó›Ù5Å“]¢É`¨‰µé²™…}v*Ëìðèñ²bç{aÿ[QÓÀ'a?d‡yÖ­ö®Sà{„=5àήÅñÚŠ^-C÷T#hŒsMÄÓ×9s¤ˆï1Ô˜÷F9¦ 1w–ª7€;aYªf ±]û®ê%î{wÓã;Ñ›9 \ Ir±ÙÐ< X}‹°I<>ÎUàw¨˜À¹‰ÜÍ(÷Õg£RVzWÆOã¹ñÅøelÏ€~¬v×{|ÿéãu×¶><ùzÜ9®½UaVqe ÝÿÇ2„Ù'9¦ÁÓ¡YXkØväšÌL° (Ä>—ú’UÜÕîí¸EÌP>,l%ºKTn)Ôê=ƒJ¬+Øvp’Ä,Z¸Skº9xwØ"zmùMW²ë†þúözûÚòmʨ)(ͳDf”±[£äÝxÛýf‘Ÿ8:¾ç½ŠZÉþIE?…9Z*òUôVPÖÄog~¶~\?¥çõAý< =­ŸÑ¯è£¾ tIÏÂsQ£Ið°i!â Šƒ3ÔNTcâ)ñò´[d‘ý@ýf endstream endobj 20 0 obj 704 endobj 18 0 obj [ /ICCBased 19 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 21 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 22 0 obj (Mac OS X 10.11 Quartz PDFContext) endobj 23 0 obj (D:20151021222323Z00'00') endobj 1 0 obj << /Producer 22 0 R /CreationDate 23 0 R /ModDate 23 0 R >> endobj xref 0 24 0000000000 65535 f 0000035184 00000 n 0000005249 00000 n 0000034958 00000 n 0000000022 00000 n 0000005229 00000 n 0000005483 00000 n 0000005648 00000 n 0000007690 00000 n 0000007710 00000 n 0000013459 00000 n 0000013480 00000 n 0000020038 00000 n 0000020059 00000 n 0000026765 00000 n 0000026786 00000 n 0000034026 00000 n 0000034047 00000 n 0000034921 00000 n 0000034093 00000 n 0000034901 00000 n 0000035041 00000 n 0000035091 00000 n 0000035142 00000 n trailer << /Size 24 /Root 21 0 R /Info 1 0 R /ID [ <01c0e97868101376d755ded9d103bd4c> <01c0e97868101376d755ded9d103bd4c> ] >> startxref 35259 %%EOF danieljprice-splash-4d1f09c/docs/figs/menu-d.png000066400000000000000000000344771477365367100216640ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ+hIDATxí ˜ŵ€»û.3w6–„‡ (‚ŠÆ]¢øD£Ñ˜¨‰û†‚KÌsI4.1**5š¸>_b܃(qC‰Kâ.j\PDTöÙ˜å®Ýïï®™¢é®{§gæÒýݯouõ©ªS§ªNsºªŽ>~üøyóæiáR ¤@H €Q]×ÝhðFÝ1™L&Œ "(v†ptȱÐMA;ðÀ·t]<ð€µîõÛßþ6Œt“¤• ¦iårV6kÿ2™K/ºè¡iÓ¬tÚù¥¬”ýûÝ…><õ>æn¦’üÖ‰l…O·&ÏfìÜÈÖäg†”w“pHM :,éÓO?•œ¯¢¢¢²²R>¨©©‰ÅbudUe%¢ ¡iç^_[Ū**ˆñêêâÑ(Õ‘Äók¬¯‹EcååeΣ-OêšÕØÐÆ*ËÊ&ÉPäÙ¼f É‰É ÍrîZscS$)I$ #iÅÕÜØhD"ñDÂÔ,SÓ,Mã¾fM£µ!sš–Õ4ç®×Õ×Ñhiy s õúúºˆY!bDòÚ:;2QQAV2ÏšÚZ#-«¨$† äú´æFÝCänX¨+zY’L°!Þ†®E5]p„ˆ_pÂ2à kí4¡ëeÎ@©æüt½D×J5£Ä‰á×ô¸®qÙîNØ P™D--¢ÛIþÒÝTr¸‰“ÊZVFÓ2w+cYi'œv"S–•Ò,îIÍþ¥,3iiIç±Å²š-«É¹'5D/›aåVH>E˜€Ãí€`ˆ”Xx…è ¬c6ê <…ÂDìÁoßm¦cK"m܇Ázàåº^©º.~åšQî<ÂwpOh°!þ;ü¥8L¤8¹xj\èÑ‘¶l樹M~B#ë0,˜T‹fqo²ÌF;ð Û?ký3ëmffmVµ–a96Omj¶ð](E;íBò'‡1&8N¬ï´2 ]+ÓÞºÞËànôrø¬§Rƒõ2*l.cÀ§Š{Ùz…vÓªLÙöoGJ”ñä£8v&îG¹î]$]Ëcìª8Õuâ.‚ÉǶ€-ýµ†uôD¡Q®[ˆï þé*HÆ%î> Â=­ÑLûnY –Y×ö«5Í:Ó„¯Iñ 敱!ξÛ2](gIb†QÀûÅ­C‰•Àôv2…éÀnЀà5ÜG;ŒÞÔG7øõu˜NÁz4£J·•Ž¥Ì6`$#ÁtƃpʺַpâÇqìá„”æŽNäcÎcë`cÔµ œQgß)ÂÖwìØú³•£ÖǼÜÞæ#â§£¶…mæb«™eÀ5ÄC[¯´ï­J¥­ljZ'D¥Ã­lžÕö“E¬)¬`kã:¦ˆ>šÝRëĺ ÒV½-RÁªrµ–Ycš5–¹ÚÊÙÓDattÌV>ÕFU›[ –ìÊ, †XKâHI•ô`ÃÀÃÀ`xôÒ~†Qm}u£Úæ>:·#õ Iy»ùZ¬¼!F{β°t0Ú H+pŒ#öøL1e„ñÐl«'öLîl“J[¤­¶ðÃÚ" ­¤içà-u£z†•b,3lEÕ8æ3aA+ׄÍÑgy¥Ùj¯£êÚò&3-Òfw³ùYµÚæÚ¬u†g©ˆ#f‘O™dsB[³t_´­ŸZ­åV›æ*+·Š»™[aÚ‘]˜Ãœ9@3ì~ãnwýÃp(P)iïxü¨xù ‡õ ^Á˜‚£$ÙmjW‡Á_Ä#¸ êC£K‰VîAÖ˜ÜÑ,¬fùeíØÐ «PLº#¬.V¥Û?[An £2;aÍV–‘^1Ø•ØìIqºó=A~^°%8^¹‹…ÇÙ¹éÆ–@­;!:¡¤VXæJ›Iå–Y¹å&²•=Iö”²4¬õB°¢{„×&EâHIý c»H¬Ú ÑÆQylŽ˰c«B°ú¨iÖk&=ÕѬzÛT‘«³,lµÓ>¼ºƒL0ô5šöM[î†a˜¦— :!X¡k#ó"Ûª·¡÷6"½4[øå1Yð,¡uÚ%ìOâ3Å:Ê!Óý„ßJtõxP­f¡–[Ù¥ð)3÷­™[iÚÖw‡=q·?#¦•9ìmÍõü 6lÕªUÁk¶Ùf›7nþüù2É 'œpðî»}R¦|Fj²ÅÛЀAt¥•[bfç›™¹fæÝ\úõlê¥lò¹lËé–‡SÍS“M&›ÿ‘ny.|9z3“þÔ0.Ÿ6õÕÅ‹ßþê+¸½Ð;>dÁù tòÉ'?÷ÜsùA:𦤤䡇úæ›o–,YÒdë‚öJè[?ûÙÏF=jÔ(O§‘<Ö^~”ößÿÙ³gðÁ_}õÕZ8ǨŸ¶´zÓZjš_ærŸd³}ÆŽ½ò™§ožóÖóçÍHµ<–n™•iy%“|;—ú —ùÌÌ,2³ˆ?p:ƒýuÏVœMºÆo“o%q-ÇÿÚ q/›‘mŒØ˜HÉ>ÑÒƒbe‡—Vü¸wŸñýŒ6õa†±y$C´E9ÃF?EëD‰¤‡&å¯ÑÚÚBEiM2ó„¶ìV¨vØaŸ}ö™ÒtÖ.ž…Î]ábÕÈ“mO=2ŸuìÚyçÿð‡?<ùä“"Yuu5kj§O¾JÏ¥zé ÂÆI€)α ض€Ï>ûlÖd¾øâ‹…ËK¥R+W®üýïÐA)›³prÞ ”n½õÖv!¬O”ŠK%v?qÄtÙÝvÛŒsçΕUVRiÅŠÀ¬YƒØÔÎåDáZž³Ž<ûLšø±u›µ®·¯±Ù Òtï.£{årKß›‹ÐDÄšîìÏ nSBÄ´ªšÓü¶À\oµX¡Å¯´²ßZ9„©¯Íì3·4—CÄ.íÝû·gžq÷=÷ÀªÀ'ßLÖõÖ¤ñ ½6ß|ó›o¾ùŸÿügCCƒç•’ò˜ çä±X5òçÜ#1]UÜN9å”d29å‰™Ü W`¿ýöƒ÷·Ë’È„¶d®f?pçÄÒ½÷Þ[ŸoYrË¡_®½:„Õô0Óà(å£RçPbÒqÇWUUõÑG­­ŒR¢ØO~ò¤R•SB*‘Gé®ÕôU™ìÇö’ÌÖkØ¢E³ŸþŠI?{ùåF„•~ðƒ€ÞÂ… Ÿþyò‘yDIÂ{”âñøÛo¿ýŽsm³Í6ø‚ . ’¦„ï½÷Þ¿ÿýïþýû+!;ƒüÂ…[ï°ã§™ìK©ÔC-Í·45^ÒXjCÍÑ «'4®¾¤¥îædÃýéÆçõŒ1nŸE¥‘Åh‚f–EÍÝ,kÑ6†Äz]ÿ/#:xѲø#Ožm”ߘè{Oy¿ÛË«ÿwûž;cÒ[7ÝxÏùçϾç¯[G"ÿ±ma_/\øù‚îæo÷-¶ØâÝwß½ãŽ;„hOË šäòŠGô ’#+ÉäÄ{(OŒ¿tenÊn# »Ø”ÅõT亟Cò`Ñ·oß+®¸âÕW_¥ºGàt_ÈáNwÆgÐ}O:é¤~ýúMœ8‘W䉑K>ú(#`Åæ»K/½rÓM7I˜ (!W“)ì׿þ5¼»€H~ÕUW566žxâ‰äŒB*ó$Ð.JÛtALN“&MÂjÃÄ%“{PR"ŸJçwÞ¢E‹8àøãÿXæ%7°'ìA „ñ‹_Ð:0ÒÒRÜ»woôŽ»îºkìØ±úÓŸúôé³Ç{(!‹ˆ<ÖÃ%¹ÜéôcÉ–[›¯É¦K®riߪIM«/OÖÝ‘jH}øŠ·û¼<–2(9¨c%Z›mp1)V¢laD‡.^QöÐLcòM»ÝûÈàko¼±¼ÏEeU'%ÊÆ—”,íµª«7ØKU»®ºòJO»ÃyéÀTù¬³ÎÂ’Àl M yÅc¯^½ÐÄW¯^}Î9çHå‰/Ðëd*Ên#ÚíŸrRÜöÙgŸl6 áZZZh'³¬r)ª¬|$ð›ßüæÐC=äCÐ} DLss3â{Ù²e$°R¾¢ß³V>æ À•/^Œ\6tèPÄ ƒ ÄŸk¯½–zÁž`Ž$ä@$£¥K—"˜À’`UÜ¡Eéí¢Ä\G—½úê«é‚ É‚Y__¯D‰H?òJ*ññ|0L¶_™€(¹=a?• žgS(I’°2¢î»ï>ÌReeö`?d¾&.òi]ÿ2›ãG]û› Qÿ¿øüóìÈ‘£úõ»úÈ#[6¿çž ¾H¯ª Jl˜FUË96%ÓÒW׊ÄG±ÂÔ¹rwß—ÐçÒ²^_šÙš>½†zmSã»|¯4“Ùe×]Kb­v+zb8d¹îºëHW` ˆl=÷k®¹Û=™¶–¯<”/Üëd*ðwñªÝþ)sØÀÌÛh¹GÄ·aư»J°·8ÃûôÓOÓ Œ·–áN"Â…!™IЪü©<1‚ÒÄÓÒâm”0/,>Òl$ràc’CQ¾"çvQBJ"CAÁÈò¡$ðT"/^¹ïÌÏð‚½÷Þ›Q~zî¹çÊ·í¢$!ý•ü"†F—v1Èì/:ò²¾þö[~OXÖŒ–Ñ3<á„¥ æ?p͵C"Ñ­"‘}†µÙ€%o¾WbiUe‰X,[×(mç‘dºlñòý¢‰ý@ºÉLŸzæ°ŠDy"¾jÎ;3*Êw4ô2–å¯^\¾«±ÍÞ_` øëNÌòå˹3¸ßz(/k¤ìuî„"œ¯Ût¥3øKéÁ˜@¶$Är>j¢A  K»ÑEUÆŽÀh‘hàHûO=õÔ‡~ˆôᆬ­­e¶ßzë­ÅT\ÙjĈäìN® ÓãÇŒÃÑõMÀA‰aôEÅ"{üñÇ‹„‚!Ú¼ð ÈGHR¢¯ó6JÈk ZXÆ;ì€î6gΜºº:%J"R‰¼‡JôWl[ååå—_~9&3ˆ&ÒD 0ªI‹ ^\2¹‡JRÄ )“È€ñj= _ >7o÷ýÿûC˜T²åæ¦ÆËSÉò;îxó„Ÿ?:rHzâÉ™Ã~ÛL-03ß –V]•0'µÕ©9U¹¢nøW+öž»ð'o~xw¢úÒÆtúÎ;ŽÔôýã%›§’Öòåàç1âqå@h˨ýåóÕ(_Ã)»MþÙ>f„dꃯcJÀÌòtl· ô—¿üUNò)ì|,c>ÇÊ‹ð"‡4•½çž{ÐÌ_zé¥éÓ§óX…ŽE4ðµvI„v. @B–ÀAPªýç?ÿÆý‰I¦e䣯aÈçƒÔŒ3d|”øv~ÑEýüç?G¼òÈê”D¶Jä=T¢u^~ùe ^ï¿ÿ>þÿøÇ¡ÄDÂ"#ªCª|ybÀ€"JRH¦?ü°€¤¡¹hDî¤rž²JH‘çúA>_yjd7ñí·îyçÜ{_jßý²'ž4¡¡æø5«Ïo®ùê¨ÃÿJºež™fÖ¨æXÄJÄåf'6âl™±ÌéÏœ”‰ÜTÖ÷œù‹­ë®ûUYå+W=zÅïO;øGÞzk)ähi‘ßä]PLHÙ‚nò•Oâý5*ÐpÊn¤J6ð@ÎKb®†Äîk¢n|fFT¹ð eUQÊ<Í _!O‰Ö1~H(NϾýöÛ_ýu™Ê@Ú‚»¡Î455IaD‚µ‹Ò¶Ûn‹•µK˜E°CS/xHŽpët/ ˆ’HNáÚØV$2"àF©0òÀ{¨„¬„Øâ®f‡Pò`"Ý(ÉÈ®Öòþ6h»k”¯‰Ý¤cIú‘ȶÑè6‘è°H|ËX¼,k²¬‰•èüX…àç8lˆY©[ Íì¼Lr^.»˜ÕÎsV™_ÖëÆS`ž¯FîæÈ×mÜ5rÃo¤á°¤ ª†ˆ ˆcèVB]ï(n´" öÜsOò©‚kèYͤÓð]D¾ÓånR ;ÑÄp¨!‘ȈhlXÄfRì(®pðÇþQûØŸð…™asÂ'¹Ì—Ù,[ œó§ìÝë,ló¤ìÔã&ÒmôMÙC Ò6#"wª‡„‰6 t¥‰9´k›Hd»hlx$ºµë¯GÄ) œJÊG=/r6‡/¶2ór™s™¹,›Š›ÌÖ#=‹Îž6ÒwÅMš%u–haºMŽl‹aeùvÑ興͡XsP¥âÐd>ÉyB€:ìôÄJõi. {šï°§F缊c!¿Š~ÇêV'¤@1)À~”¯s9~³5{'`ŒÄ¶1¢l€è$8# ä©m¿Ãbö_[ÙOré`OÙ {?Ù„Ì/¸í)HMº¸ñ%Hë&з¨ð¹Íý%¨0°ò-‹§Y]©|U cßõ°p€i÷Uבo·%À†Œ<‡ÜxãJ´×sdQ¨¤Ä™­NèìžWÁ;]¼—ÉLki¾´±þ¤55g5Õü1U?#ÓôŽ™æ„–½ÃNÝ…½|˜Í›Ê/-í}gy¿+úœSVqHIéN±¦+;À¯ ܢĆ>a»·Uyª&»žÊâ:h]R¬Å¶f÷Y%€ó½›ªó½ÍÏš1qf@þÍ—´5¾‹È³W€sZÚ)#ÏëG>^v4kµÝ @z^'H@È®SɃ!,C{뭷دÇZyöÐH€NwŽsZÍ>žL^Û´æ´5«'6­¾>Y?=Ó4'—jÚ¼vP5ì‰S4EAl^eÄŠULNô¹«¼zJyïÓåû—”ŒŠFÙÝÒ˰ÏÓWp”<3ˆüDîzJl‹X»$'xŽîmÊ ådÅGM†î@þ·îerà.ï÷ÇÇBïN<Ü!äù¶íÉ™e–œCä‰ä±‹ì)ä•ôô×äYø:dȹ5Ú];7òÊjæ#ˆ;ÎédzCMìOî)1Õ*,Ô:ꨣXDrå•W#`òuO)ýnq6÷t2y=ì©¡æœæÆÒË/ycÈfsÌÔ"•-Ç!¨œ>.2á¸Î#%'Å+oHô½£¢šÝ-Ç”–í‹‹Øç"À¼N=ùdÖÜ9ÓBÌÀ`7zJ"wˆžîÜÖ[8âÆZu±Gœ5]¬¦c¿ÇS ƒlkfÍqðMÕþ]ÑJçû=—{K·Ÿp,`£_^xÅ®Q*ÂÎÒàȹ×^{1DŒÙZÅÁCÄäÛøŽüì9  ‹È³qÕ Œ e,±MGŽ:?å•gøé©¬‘âBˆ`q¦8¬.òþjæ#ˆÿ°‡|J__jy¤§¯r¹'“Ékš&8¶§?§žÉ6Ï5ÓK9s³¾¹8~KíKoIa?"V~U¢Ïö÷NúøÌãâñmb±½{ã¨0–w8{$üG8ä#²]@€!#ÀzêîUF”x°­A“Ê–ÚK.¹Ä ƒ’‚‚*cXÍåßL/ÞÙT­L;ÈW:9·»š…ÔìMá˜'öI|ðÁ7ÜpƒÄ6ò4<5ºøâ‹ÙÂFK K¹ñ©Ry@WUØS"CˆÝ<Ï<óL>ä‰÷o»WÒSY#‘í±ÇËnA4ñ¨lwQVSyŒÿ°%é”x?ƒAYwQÏÑ8A½Dè;ÈûbÛ“§3P‰¼¿/uyœÃöÄïQ­? 'ŽwÎÁ?zùêë¶0õU•Ulت©gY&6%}yíPL{%½’qk±•ý<•ɾùƶ1J9½íˆôà3j´;däý}©+ȳàÛÊJíàCÎoj8­qõ“£†™ÇñN.Åyu5VÎdÛ3"ø$7܈ܜ˜wÉ”\ô·e½öÍf¬…Ÿsà'Ò9KjµBÏösé6ˆ@¶$J§…ÄÂ$F72·5»“ˆ0Yy6UçÛ¯ô€ ‘·Ø29˜Q`$p‚<ǧ¡‹!Ã#+!ª<ñIJ.žïùNè"òèkÑÑݰò0·ËÒ=È30üg(陯Fx g<òÈ#²~äóU`A°}<B‰§@#H+ë.’£ðrÒ“ÜlÌhÄZ|Úi§±à{ßûò"†€ôÐ3òþ¾ÔEä¡'óWÿó?[ì´óçüJ?îø‰kjÕTsGjÍ¢áC2£·Y.–ˆy"göÏiD‡ÎýB?ÿ¢Éå½O,-Û¿wïѽª¬††¾••î#<ÍÑ.=O:&¡ˆ‹}dKÂÃaòè,̽ܧŽÙÖ,1ÉsLJÊÓü»¢ ”|4§îB:Ïx ‚<©@‰étÖ¬YÜák² <ß•'ty”NP™‹ÞtÿÇîÎ’Œâ,o)/Ñì¶• mUýî‘’3Kªn©¨¾oôö™G¹÷‚ ÞöÙí  üD.ŒÒÀH± ±={aÛmç¶5‹j+O@ƒà³B»KcРz»g¦o@ä‘AI©µ¡È&+ âQy€nByÁsfå*é驜®ËãXªÊÇÕô9 ú¸I$3ô@úñì•”uç%5:ÿüóe¡ÈC>“¢;’°¿3@Þ“¶‹È‹€Ž‰$Ž<.3—(Ùë-£‘=¢ñ]KCôH¥eû+f/‹[®aõÓ+ûN65'›þ¶×à3#¢Ñ_&*Xˆðr6yw²ñ“LÆ>"«'®%õÕÃ2C ƒø2‹í‹ï`Äêð&üM±þ{­êÅÁãˬì»9ÛikÞD‚ÃJKÏ,©bÄÒšõB¶åÿZ?Ëf{äƒ{»-%ÃüJ:ý|:ù¡™©×r–ÃŽàDlž@nâ©R7Fñýb‰±ñ’¡‘HÂÐq§Îv#9N¹¡OŒ”"‚qªÁ–z´Ê0p”Pgš«"T@•E„oíZmT ø!6 àƒS ÞȤg¥“¸¹¯q³À`(nÞ4<ß7–ø~¬d«h¤D·¤Ãcþ(–i݇Œœµ¥O}afÑøÖ3W ¥¤ ¥W…x„è:0-3Í9™Ì¬LrÎ:¼É2{lˆ½u#ø¾ÑÒ½c¥ƒ£ö²¦£ñDK+\¶rùÝʈ²ÏŽ#}9ö`}r¥PJêz7s)°ÁQÙ‡ƒ™ÞÍdžƒ7eS«ñ¥£ÕéRnBGë­£#ñqÑÄ.Ñ’^.~$*ÃÉ™[ÑÒˆÎÇ;–t®·†RÒz#uXPH @+oÊ›XB§CaÖa7™mýØtsmìW7 ¯‡¶5ydÓ» ÂH9i„ ;Ãw£34ÖÖžš(;Y/MSȾ5¬ÇcÖ,]otêßM!\½-{W)°iQ'+l"90Z¼Ú×{ºqf2‰°u¬[23 )R`¦^ç†ãŰØåpØÃtì ¸³ÙåHœ$·ÚÌ­²Ì•üÌÜ Ó\næÜFî¢W1”’ŠNÒ0ÃE ¶¿}cf“šUk™«M0¸|Gü{b›wÀF@ËÅ!ºLÖvß“lºÝjäX%¼l8W¨¸m8mbR`ýQ Á´L–(ÿ£?S÷q¬þ·î˜PJrS# kâ„õ’5Az yR2)IaOÀ}N¦çÕÚGVos¬:N¸óÌ3‡~8n)q';L^!µÑÌäxvkii™6mšÛ˨LK€Åñ ¸èT8p mtñÅ3»ÒwqJ)J*ÏÈô¨ªé¡<Éó]Hežà† 3¤:,iĈb¼åËÑc‡|«l#ùÖPöO&L¹L-=ôÍ-’ø B¼¿<ù‹Ge5Ï;ƒ2¹ÈTiMœÐÍœ9ù$‘P`â$2~ä äéi#™ „}øò‘ –M¼ˆÜgŸ}ðÐÇ”Ï(`¢‚Wº;V¯ÞÆûUBIAÉ—¯Ðø˜{¸ž|òIØ'®øäèA°¤k™)aV§Jœª”É%¼;PR°Kz¤Þ.H··{OBùˆ‚FOźÿ?¦Sâ™Äà5Â]"\˜Q á ñM& JÂä!ðd +]czðt?¨fÊ‹¬<Ê<ÑO ém·Ývì±ÇBç÷ß߉'Ì€ôÌÞþ6ò$ùú']W¨” e¤¿ä+w@YM Ðng(\ðbÁd¯“9ÈÓÓF2¤QÌò‘=Š\ØD$´šš”ÞCÝi†ÕŠ${öÙgÝü¨ªªJØS„D ˜á^xùhìØ±`¦ô¤áº«W"­,H )"=®Ðó%§wbvgÁD dˆÞÎävÍ5×Ìž=»®®H¦)ZÆŠn‹î†%‚øo¿ý–n}üñÇ£€àu^f° Q)`s t3[ ª +!<ñÄ+•ˆ'OѲ2 ¬¦Ì¡sežˆº0qš ^ƒ}Y·@þ`CaŒIÉWCÄU7:͇G$‘te¹ó—ae5y°3äKNðÄ1cÆpGAA}%vGk4qRËJ¸þúë‘6˜6D$â-Ãe 〲Óa¯y[̆G©|ðF,ŠA•ã1:a¿+t¥'uF/<. »zeMü ¶ÜÝû]¡û“+½Ý+‹‘3fÌ œÁ@.»è¢‹p*lHVâÛ'£è®»îâÓäÃ?Ì$&P ^Pp*oP¥îðÍY³fqw/`óPIä)¦DðM¬¬fÊ ZÉ»R™'3?ƒÒ™‘€èè2e¶¨ ž1ài#eBeÿĆ€)dòäɸ Ÿ>}:­É«$H¾6ò—¥¬fðΠL.JÁ¢ã¦5™#e¹ÝÑšh¸ÌÄO=õ”,…­ÓÔÔÄII"’GL§Ÿ~:j¦C÷0t§êP¸«ç%!¹1¿¡`»Ke*9~Ì0LÂBÊÀÊäò­;R¤b u#ÐÑä XuÀUA3`šqÓcxt[:ÜoÛ w•>¨‚RkóPI‰0þj*!ƒGv=OX?ÂÈD¡ùÚH‰’²*!•‘Ê6RBv±šžä[o½õK/½„õ¦àG¢tàÝ}¾+(ÑasØ”_ýue>îHmÄù”/*îÉHŒ;¹'¼Vôõ¼ø*~DB‰œ;f?•ÉÝ©d88¤Hâi›Ž&—å`òDˆe"uó#â)ÂS ‘fF¢Äî h+ù‘¨‚(·À]YÍðA^u=OV6pɲòµ‘p”ýÓ P8¬l#e’.VÓ“œG0çîG¢t^)ÑpGzòt¿r‡éÆ0}wL0,²ÀÛŽ¾²Í´HŒØŽ¦Ütàù:ÞEF³éЪ§jº)´ZÆž¢p‡ÊE,ê¼X7nÜ×_ÝÅyÃc)R ¤@§)`¬ilæNg& )R ¤@±()))íÓ§7æ±¾¦Xù†ù„)R ˆ$e|‘©ª¬Ä¢Ä§LK\È(LR ¤@H®S ŠÛ¶ÚÚº––du¿jÖzð¹W²$Á¡(ƒ€,I¼•1<а;Þ– e@¼Ùú!=1<†ùKjC´>‚aÿq÷ 9¸dÙxéóÿ@a“U­1IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-g.png000066400000000000000000000337471477365367100216660ustar00rootroot00000000000000‰PNG  IHDR„G¶0} ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P „ GASCIIScreenshotsêóþ Screenshot 390 98 1 \kE*IDATxíœÕÕÀ, »ô* ¨,kŒØKÐ|vc,1ö.è/[ìÄJL{ü%1v±c‹€° –Ðé°Ë¶÷ÿ]îûf‡™ûfï- ܳ¿Ù;oæ¶sî™{ʽs¦ÙÆoœžžžžë=ZX 4kÖLZ´Èþ´—¥ººZü=O—,Cè‰ç ÿ¬ùsÏk?O˜1ÅBàøÇ?þ‘‰‚ßýîwþ^a<]<¿„ÙÂóÄâ‰êêLÝÒ%™ºys3µ3þ›yÎ9™1·ŒÌÔL™œ©™øA¦ú½w3ÕoOÈT{+sß©§dÆ^{M¦ú­7õøO¦zü¸Lõ;ogj>x?s÷YgfÆŒ™©>-S;sf¦ná‚L¦jE&SW—YÆ9Ð̺ŒÚ¶m+íÚµ ~™?¾”––ú{!Êxºxž±„VŠ4OtÕy©½›£­d¤¦Í—,“ö-J¤cY™”«Ó»µ^+—fR–ÉHóªj)kÖ\ÊÕãQª×Kô>6~‰™ÚZãñhÖ¼¹þ©]yÔ4©¬®‘*M«KK¤R¯/ÓsŽ¥z>gÙ2YÒ¼D*Z—É|mgž^«Òûº2¬X±B²Añòà)à)à)°F( ó®´mÞLºèDÞE'ëÎztÒóêÊî i'ýMÚ^vÒ\ÚjÚFï—ê]L¨R!³HêdA¦Nægjen]­ÌÖó9šÎ¬«‘okëd† š Í·¶ÃªÎñµ#ßOO&M4õŽ:Áo G·•GÕ¾;ë@è¬ç¤U§'_+ðóòëtŽ®m–‘ZRÕçë”¡ÎæZs‰žÔ[Ñ­´T¡ÓMûÒ­=W›CêY¨Âa–ßÖªPPÁ0]/ô|zM­,_K…ƒ· âO=< Oªùw×I¾»Nî¤õ‚ ~‚í¦Wh»èÑJ'Þè)¹aŸjt²]®“ûR–™xÑÌ+ôœ´R¯«×_Ý9z¨ ­áÐó­&cþê룭m±…ͤ¥þ¦e*&ÊõZë•VH[½f¬ý]ªçQ@3Õbø²®Z>¯­–õ˜\S-ß«õ€[jm/Ö–‘òýôX (€¶ÝU'ù KJ¤§Nþ=V “ꤿ]õZËS?“þäkºXÝ3æÐߺt,K×–èù2=–Öéu”97¤*4M èÿå:á·Q†À=…0ë¨i½õ¢V  8è5„[{%!!@šž©–)*>¬©’wõÀ¥T¼+I»\ð|^ œ¤¾BOõ‡-t2Dãï­G/Lü6o!=uÒD t×´NžÑzuý¢ìRäñÏã‚©OñÕ¯v4þµÀ›…bƒkì’¨Ba›¥²UIK¤VVÀ:k ¯ÔTÈ‹U•ò­.>75k¡¤C‡ÃMoSüëÞ½»ì½÷ÞòùçŸ7(uÜqÇɉ'ž(/¼ðBƒë…þѪU+y衇dÆŒòÝwß´zCrræ3¼õþ‹_üB¶ÜrKÙb‹-ÌøUU±£»!ÄÃ>ûì#/½ô’|øá‡òÍ7ß4,äø•o¹¸*‹‰{\›\£K\™|ú‰†¿±NüÛè{»·l%?ÓcHi™ìSZ.{éñã’VF °ÐÚ" ˜Øgë¤ÏÂê¤:u‘¨«äuÕŠÇêñ†îôi6d¹oêT™ªòwê:Y¨® êPÇÓà—”—BM˜ŸùÐ%ªžà5±têbò§:ñÏÑé¾Rñn§4j­‚u‡jEtU!»X.°¦d Õ¿Ä*Áù¶Ûn+7Þxcƒœ]ºt}›o!Ñ SÄaÆáq+ö/PÌ;W®ºê*ó’IlÆ”7òÅ!e3&{Sá±Æð(‡~¸}ôÑrÓM7É&›l² ù\ãðý÷ßË”)SdÉ’%«”s]p•kJ¸»ppÑ%®\R>à @¢/z^ÞF†•·•aeíeh«öòëÒ¶²G‹ré§®^þ²ö`n›–’ÙcGyºz¹Œ®Z"]±Dî¨\"7/¯?î¯X.cõy­ØpCqëmÒF_€ƒ´ø%᥸¶’Ò%®¼ë:Πé*ð©¨;*–Èß«–ʸÚJ³ N9vTØ¢µœQÖVöjÙRß«°uÕÚ8÷òQ];餓¤²²RFu;öÚ^{íe4ÅØ 17FŽ) }÷Ý7&GúËùâ«¥Õ¶¢`up@;Š‚|qÈ5…˜7¿þõ¯åä“OŽê¾¹æÂaòäÉrÈ!‡È|°Jy\Bqà*×”p§ÿq´vÑ%o®GñÉ"ð.:!Ûº Eè…8­U;9°´q{°ÃÆú«U£­{í'ªæÿ¬ €ûU¼Ô«»dNÛœk<¥lѸr6×_~)¸’@¯^½dâĉ2zôhar?~¼ÐFÒâ@ÙÓN;MÞzë-ùøãå–[n‘çž{.[åŽ;î(<ð€L›6Mî¿ÿ~Ù|óͳ÷8I‹ep}üóŸÿ”éÓ§ËSO=%›m¶—³…ƒ ÷\ã°Ûn»œ¾úê+yñÅ…úƒÁòQçQ8´Ô‰ëwÞ‘÷Þ{ÏýúõË=ÿüóÍ=x :#,Þxã éÖ­›¸Ê55ÜsñK] ‚‹¹oÇhºèúi¸‡}u:YÀ}úÊÈË}7•cË;Ènjl¬ëÙ-¡(Ý;KÕVýeb·vòPÕ2¹GµÝ©{ –º_N™0Nzžx¢4¸™Ù=Ã^ÿ\€gá“O>‘—_~Ùðr0~¹è¬Ãž»xÞæ±tI:‡ØriSÖ &ª"tOÅ2¹W…èGêN«T¡€`­á¸Vmåç-Ëš„PH$:wî,Ç—ÿüç?ÂÞ„ (ÙgžiÐN8Aºví*§Ÿ~ºÉÂC{Ê)§È_|!?þ¸9¿üò˳ÅãÊe3è ímºé¦ÁK±çø Áƒ¸L—]v™™¤qY!-½{÷6u±frÁáÆúŠ…«¯¾Z–.]*Ǽi—ZÒà€‰ÌÅÚÉgœ!øÞÑþ‚…ƒ ÷\ãpÞyçÉ×_-C† 1cuà›3çipX¥pÄ…(Àõ¨£Ž2|ÂD_¦® ;v”Å‹ËÝwß-»ï¾»Üzë­Ò©S'ùéOjhW®©áž‹_¢è’‹-£þýúÊ¡­Êå,ÕJÏTWОó—KûÉ_HfÆ\i¦‹»{ègé›Z͇ì"s÷ÝU/o!ÿýÙÞÒî ŒhL¹jµ·Ü*o¨Ûîü‹.Šœ l›Q©®Y .º~øAÎ9çœY¢ð#C.º4¨dåÏóšwƒu‡ÏÙQõ¨ZP]±T×W*õ‰zšhÞRŽQ¡°§®Õ¬i÷Q¢Ð»ì²‹ÔÔÔ˜©P¿;“j0ñË…á /”ƒ:H8à©U3²gÏž&Ëòå˵Áƒ<{öls,W.˜‡I‚ |i€ KáÛo¿5–KŸ>}Œ¶Miq`ò¡ÿ×_½¡'‚ РÆ"˜5k– e#ˆ°†H1u-¤ÁM ¡víµ×šб@#æ![´h‘©2nÆáŽÕ7óæÍ3ýG°¡Õa•„! á²Q¿ãpÀ*Š ÀHXO?ý´™dî»ï>³NѺ5!ÏÔŸS.6&îIø%Š..4ȯüǵkÓÚl í£kehÿ:ùU­[ImïR¾Å@yøÑÇea‡Žrá©§ÉÅ¿ý­LЉÿàM~$#Fe´Ú! æ‚•MF&×]wYâ¹…ƒ…_ºëŸÇñ¼ÍWhÞµõÆ¥XQ¯ê<ɶÓeÙUÝFÄd crL˶z=cÞW`}fM@" ߆úÍnõC8„ 6¬­£Å=û쳂iŽÛ$éB`ÒrqE¸oÁßVhÁLh!-ø¬)mž[/;aÐèŸyæáaæ!o°hËÒß ÛõEáÀuÀ…{}ŽUÿãΣߌɈ#ÌBp8WÂe£~»pˆÊÏ5¶¡Úqàwðœßù@cânÇÐÅ/Qtqñ`gÆè‹¯¦ÉäÚªú múä7Ûm™¶íf2¾ÿ&ò\·ÎòUÒnY¾T^T>+8P¾Ô|tØàs›d.¶>Ÿ3g޹„‚†(ü’Ð%\Oðw.ž/4ïÛv¿¯Já¨Êef±ÙZ ¸ŽnÕZú«[/zÕÑUcaî%˜Öååå‚û-•õ„0àdâgÒ²°ÑF æ<“áG}$hÐaX°`Ñ@ûöí›Õþ’”ÃÒ¨LK»i€‡|ë­·6ëhï* iq€.íÛ·7n4&=öX[•Ù‰ @{å•WŒe€6Ü?Ÿ,&ºsÏ=W¶Új+ã6z÷ÝweáÂ…Ùv£p°7]¸G#k mÚ´‘+¯¼Ò¬»06AH‹e¡|@Ž Äá@9›7x,uÌ<·y›îV¸ø%Š..´øÇèm £ðHõRùëò…²èÐCäk]“¡ÏÀ×ö’Aûý\*J-L“ÌÁüiΣðËEÆÓÅK.žÒ%M? •w’ …Ñ*&©ÆU‡jº“Z ·l-Ýõå¿5‰ZErã—eñŠýÿ,ÔY-Õvúž{î1®¤ °`}€=ãh–,„¢•'DÊþýï7þÞW_}U}ôQS]’r¸”xa“ð-âö`BEó BZXH¾í¶ÛÌÄ|×]wIx— “(n"ãÙ!òØc›“´8 ©]|ñÅrä‘G÷H”Ù…ƒmÔ…{Ô8 |^{í5³>2iÒ$ã»ùæ›mu&M‹Šï@àÁ4ÊÂl`~ó/ [Ž|àá‡Ζƒ9à-Ë—öš«œ©Hÿ5ÜsñK]rñ 8Çè ¥Óßt×Ë(=.}ð!¤îÌ×Büiih­YR{-É\`éLmy[§Ÿ`ž(ü¸G;¶.^rñ|.Á~4æù{*X¬Ÿ¦ïnÔêóFdÕýô]K[™xJÙÚJõ¦2š"ÊöÒ(`;!Ú÷EºØÜ Q ̃ea™Æ^+Ç óßyç2nÜ8›Ý™b tvÞygY¦»jÕÁ‚ipèß¿¿°~ûí·?5 ¼Ð‡Éß&6 œø£ƒ¶<´B(ã‚0Iq§®¨qÀR@s ÓlupˆêwðZ‡à½b7ÜãøÅâ¦K.Ì5F¹Ú³í†Ó\sA8Òßaül¹´ýÌÅó¹èbÛmŒ”-¨Ç••ËñºØÏ›ÍÀ;ºèü§ŠÅ2E?ÚS¿ôÜ=I)§KÅi…Å)¬Ü6Ö¹º-ÁTlcÝi§LUìX`'nœ¦ÅÀ½)á·>÷emáÁÆ£µçù.Ä…mÚÉ>%å& a?þ·j±<¬»’ØÔXÊBh¬N­mí`°{ˆ·a=x ¬ x\T/l›ƒÕ꿨¼½ Ôm¨øò q]ÅBaº±DÂÿ¯·õª6%=x ¬I x\“Ô/LÛ¬'Œ/]!=K[˜o0lªw,m)ÓÔ ÝXVB¢Eå ëkñððhZoY“½«V7ÑsUæsœXÃÛSßï­;Žþs|q{XPÀ£ð.”BtŸ·y¹mu+»XX.4 ÷Bõs]È©úÓŸ EžF«§˜ãàB‚ ‚¸5£ ±x·˜¸çƒa`ØÑaE#{­˜8ÐÆÇºˆä‹C¾p‹C·ÔJ˜¦QQyY ØFß`î®ógc؉¯wÛ(“¼$ÂËAĤ?øàƒ³x¤Tȯï¿ÿ¾ðBo(Ž;¶AôCL@9*ºj\ôÃ$ýdk(GÒ‡lS%N»8¦A ¬YH‹;ål&4LVpÿÉO~bªË3.Úi1pï£qžØBËd0¹Ï(ø°Çá7~´GîY@ëå…9ûq¤\¸ÇÑ,­ã"îæ*çÂÒò e\ôä~ðŽïã ¾âŠ+äŽ;îhM nüâpÏõ<w;0ób,ï! æx×>·¸‰á`u"àR>Ÿñ£\RX®‚·Ñ¢•{‹zèâr_á6J$ïpØa‡F"B)a®1—a2 <”* q‘ ‚ä1`C‡5®^3rEW«3I?©Ÿ~†ã.q= ˜üy#ØFù„ãÃõd!-î”ãã>Ä"‚Ùy=ÿ†n0Õ . ,Z3Áº¢¢w‚‰vøðáæ+ggu–Y#²o›Òá8Ü]QRãÆúâèÂ=€õ$"¯ÔÏ‚ wÍ\´¦î¸ˆ»¹Ê¹ð³}NÔqÑÓÖNQ¦ Í_þò¥ƒ—9y1ÓBÜøÅážëy(4îÌðJ(ïøn¢G¶û&Âù…·ßíº o5ÛrDLÈ7®m8íøÙrISv-ЯÏøV¶T+¡³ã{&cþEû+BÂm B¬îÒK/ å¨7Çñ¯Á©Ðæ#R(’Ÿ€+ºª«N&Ø\ý¤~ðH%•· Á7 —°ÿþûËÿøGªÉ®ˆ4¸Ã˜|á’K.1‘W™`¬ÅáŠÀ‰öåŠvZhÜA„v…™Œv6f̘,ÞœDáÎõ¸H¡®ñsÑ…:cŽ9FˆAÔ]üIß]4sEz%´AÚH½.ül0BðHÃä£'÷âºÀ¯'žx¢±¾±ÆyÖ°ìm™¸ñsá÷<w¬1" hx6X/๠BÁ<áó|#àÚzÒŽŸ-—4%Äߟàd·ŸÝä#:ßÕˈ¤Õ¤Î—H kµfWðçI"¢Ùb¾5LûÖpÒˆŠ >`ƒ^EÕÉý¸~rÂÆÄáw.`gq–x­¿l8tZÜ­Ëņê@˜> íòÛrv‚±4±å ‰{0TIpÜl[Q¸skOe2!#èqA”Ïö5jürÑ…û¿úÕ¯äÞ{ïfÆ=)Í,>6µwqâ&Ã-‘\ø˧åÁ8zÚ:цùF5V» iÂ5\£þóŸÍÁšÇ¨Q£Œ{’…f jürá÷<wÆ<£Š‰8 Q8اÅýkýà ‚ ³Kíû‰'ž°Õ™4*g®h§ÅÀ7 f;¾{üñAˆÂ‰!.JªkürÑe¿ýö3‘-yä‘`Ìyî¹hFá(Z'‰¸UÎ…ŸítZtÑÓÖÉ6\¾ Ȥ…8õÔSÍ— ·Ûn;c™ [ˆ¿\¸Ç=ÅÀñ㻿ùÍoL È`Da3gÎ41×È¿Ã;Øü¤Á¨·Ás›'jlí½´ãgËE¥mUëï£á®·Teok}!m‡ÒRÙ©e©ìÚ²¥ZR_?[ ´Wa°wi™¥1ŽÑ¹ñøòÖúÕ»Öæû×'iÚ[g! ‘@À½òé§Ÿ·_ã<Ê:m¤B«åZ­“Ô^C⻢«ÆE?LÒÏ|#òùO j2J‹;õ€WŸþy“"l‚Óí´¸ãà y×\sÑʱ’p!Y¿,ýÂ+M¯ÈEEI?êsÑ…õ\–óçÏ'k\¸»hf+ˆ¢u’ˆ»Qå¨Ó…÷Óò`.zR'BWBÕŸ‰ýÛßþf>fÅ'E‰’Ë»Á+Qã—÷¸ç¡Ð¸#dˆ(Œò„e‚"†(øx_ÐêÇÕ‹eaç”M"îZ/A0r®­;nl¹ŸvülQi[Už×¯Ø -o'ÃÊÚÉP=H9vÖPØmŒMP_òJ[ë×îÚËP=†™C¿>WÖ^~¦ÑQ;©`)4–Q¡"ZÄ\1%1ÓìEÇÝÃ@§‰’jû’+Íw,.pp¹‹pyXF¶}àš+Ú©ÍL×îh¶QQRé—kü¢è‚ÂU„@âÛi! Í¢håýÃcl?ª\~«3.zâÖ‚.¿Õ¯œ…6YŒGÑŠ‚8ÞM‚{T}ÅÀÝÎ{î¹§±¨Ãß'ÃÜð_T¿£®…ÇvuÆ/ª~,„KZ·—ŸëÉmÔ H 5jAܱb±<¢Að ^ABZd|~OOÂPM™ï{¯Ë€Ë’5)»M{]À• v«¦OP»•K¤‰ÑúR¿£pµ~ìˆ]I…X[ð!1é}FOOOÂS€âœßº­ZÚF:¤°X]¸·j‰ÜW±Lw$BHÀAUx<}žžžž9(À·ž©ªÔ]EúÕ´•‹È9Š˜Û³t[êÛÕUòÃʸGIÊäÊ“Þi•«FßSÀSÀSÀS ¦ê:Õ›5+daŠÉ}\m…†ÆÖõ­úH©Ú‹ËìBeüuOOOF¢@Z cVTÈçj%;ðó¸êò}\E¶=/,%|ê)à)à)°)0]·Þ¿¢‘NX²ÂÕ•÷j«ä3µlÿüó5ŽßºNëÆä3^úš;w®àêA™jªÖ<ºüòËåÜsÏ5¯çƒôH6âcðë“O>Ù‰×Î\å\÷\m¹ÊY\Ãå÷Úk/Ùb‹-—³¿]uÚL…´žV—qÒöÅ…_ø^!x"*vttÃäÉ“åC‘>øÀ’¼Aê¢Yܸ7¨ ⇫œ«½ˆªr^:餓¤²²RF•3o±3ä¢u˜'’ö' ÍÒòn’:Ãýkl>9r¤ 0@öÝwßpWŒèÓ§Ï*×ûBV ؆ßÿ}yüñÇÁ€0Øf›mì­ØtÇw”x@¦M›&÷ß¿l¾ùæÙ¼˜öO>ù¤|öÙg‡ÀƒÖÅn»í&Ï=÷œ|õÕWòâ‹/Ê Aƒ²å\uf3EœÄ•Ûh£Üîºë.ùä“OdìØ±‚Y` M˜0A¶ß~{9ûì³Í¹ÆvÊÖWg¿~ýä½÷Þ3Ç•W^)XUh¯|p¶lÔ í¾óÎ;Ò±cGs›†SO÷îÝÍoîc^NŸ>]žzê)Ùl³ÍÌupx÷Ýw¥S§Næ7æçk¯½fÎóí …shoðàÁ}qý0öƒé®qh©"‡f–ÞàÍâÆ=X>|îâòƵ÷ïÿ[;ì0ÃSôÿÒK/•k¯½6ÜDäož×_Ý›!¿Ø|QiÜóÇä/qĦØE]$/¿ü²0É碵‹_¢ú`¯ÅÑlux7®Î^½zÉĉeôèÑ‚`?~|Ö͸¦øìË/¿Ž-·ÜÒ’$›^ýõæYÆ„ÓN;ÍÌ+ü±ÜrË-f¾ Þ/ôù*Á6°ÕV[I­®nýõ×öRlzõÕWËÒ¥Kåøã7q0y-œyæ™F›;ᄤk×®rúé§Û[rÞyç™ú‡ b&‡<0{ÏUg6SÄI\9˜œö™L‡jÌ7&mó”SN1}@rŽ@´W'‡M—2<Ș¡L.à~‡ä€0Ù¨ó|Μ9¦®o¼Qf̘!gœq†Tékêh8àÚ³QËËË¥Gæ^¾}¡pcŽía6caà+ÇEyà 7pÙ9ÐᨣŽ2tîÖ­›”••™2üƒþ.šÅ{¶‚ˆ¿¸Ú›7ožüøÇ?–vØÁxªí¶ÛNfÏžÑʪ—˜™4‚àâ—`¾¨ó¸çe^>|¸Y<묳̺ϼ‹Ö´áâ—¨>pÍE³|y×U'ÊlçÎͳrÙe—ew7àzÞ]¸»Úsñ‹itå?ÆvÓM7 ^2ç‹-2óm]àų޽{ }á…ä‚ .0 «UW© @VÙvzçw  σ>h&)W[!ÏX³fÍ2š&“š6)ý…^(t™ü`¶ž={f«ãáAÛ@˜   ¹êÌV:q•³Y‘Äh ˜¤#FŒ0——/_.S§N•Å‹›—s ®:Áï»ï¾3гÏ>k4A[Εâÿ3fŒzè¡òÈ#Èþûï/·Þz«)‚5#£QþðÃRQQa¬.ˆ 4Êb^}¡ÎÆä%—\b48N&xÀ5Üg‹r%$¡YÔ¸Sg.ˆ*çj|öÜsO£á#à4ko¹Úâ>®üÍApñK0_Ô¹ëùCˆbe¢p<ôÐC†'mq´æ~¿Ø²Q©‹fL†ùøañ“?óÌ3òÑG g;¢¬;0âÇÇG~ÀU§-•æ[ÎÖµ`Ác±ôíÛ7«‰æª“‡Ž_;QÛú\)ø¢]wÝuòÒK/ÉÂ… Mv´ÁˆÛ·¾^îÏœ9Ó<ÀÇ{¬qIœzê© šÈ§/«3ùð.H”4,´Ó'žx¢Qã@Ú³|w=äEp±‰·<…?ÞB¾Ás¿Ø²Q©‹fäχwsÕI½¯­·ÞÚ¤x1pOYhl>Ã;‚µÈ‡áøƒQšQ ,`mBûóÏ?ßl´`ŒŠ Y`¥ÕÜ‚ 3Ñ}øá‡òæ›ošË¸’˜àq+L踉¸Ï.‰Ç{Ì\GÚ1Ù¡ý£á ¥­ŒIáƒo í ×Lpïu\¦bÇ¿¸r/‹'©½f«cW󫯾*>ú¨½‹¦ß§Ÿ~j\ø'9ǬK –NXe°\.¾øb9òÈ#¥E˜½“ÊÝwßmv|=üðÆž‡|û’ï8äËàÁ!ìžþy“†ß¬ŒÛžÕ®Àßò ‹f–>®q§Oap•sµ‡FÊDE?QªÐøy°“Â=÷ÜcÖºX_ C¿„ó»ž?ž7&šk®¹Fî½÷^Ãïð®^­sñK°ý๋fùò®«NÛ6k fø å+Íg¸ïPQß,[¶Ì|;ÂÞc!ù¶Ûn3J!›a\»Ýl™ÕM ö=L&Sü‹a@úó€Ù‡,x­ÏjÈÁ{®:ƒùÂçù–³õ …ûººuÚºm ­ì;,ª[AiïÓªð«‡&¬9¾ŸÏïÆ˜¸ÜEQãàÂÍE3W¹|ï«=¶x£Õ²óÇB.~±ù¢R×ó•?É5¿¸ÊƒfQub壨áŽf¢š_l?)~Þí½¨4ª½¨|Ák<³ ÖhǼ{Þ¿³¹åöÛo7n|¬i”îb…®hh—Æv-÷ :% (iý”Qµ qÄ –«Î¨ºìµ|ËÙòQ̱ºuÚºmŠV† ‰–ä¡Qýà^!õ=àìô)îE‹fQùW÷Z±ÚcKnpÛ3ýÌÅ/.\\ÏŸ«œëž‹_\åŠA³¨:¹Þ¤qó‹í'yÒ@T{¹ÊóÌ"èÓVœ­Ì;”‚;8ÓÔ•4oÁ,„¤ ú|õ@c(ÆÄîé»nRÀó˺9®I°Â:Ä•ÇÖt Ų¼@°ö©§€§€§ÀzNì¢òzN¾§€§€§ÀzO/Ö{ðððð¨§@süSl3kŒ-MžèžžžžM—-ØÚÄŽbìDhºhûžy x x x „)Ђ•k^`ak‚ eŸ1Àö@¬{-øÛ^·ùHm>î±UÓÖÃïàöJ®s‡{¶¬Mm9Êð€­×Õ>el>ß~ñéoÇš[ºÛÔÒŸñ$c#îÙklå³÷¸núØ÷më€_ømC°û ÷H-PÞ±e bïÓ¿ _Ѿ½Gyêå7ýãHÔÉA{åí–Fv Ùç!ÜùÁÉ– ãaqä~°,ï©XúÑV°œíiðžm‹”²ÜƒÔkë²xûÏ5K/úAy;œsßB°/öZ>)} î5IÚ§Ašq·|m¸¼gqbƒ¼ÉuKOÚ§n†{¶-êdÌ,OËÀOqíQG(G?iãÿÜ,%Êë;*IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-h.png000066400000000000000000000270701477365367100216570ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ aIDATxí œUµõÇç-óÞ Ì°(«`YD7pEÔZí§¥*V-ˆZ´XÔ¿mµjÕ¶V´ÔºT+åƒK±k)…ª€‚ ¢XK±"*ˆUAŠ¢,³ÏÛþß™h Iî;óÞ 3÷á3äæž$çü’œœä&9¡áǯ^½:Ïý‡@3@ ªñ …¢ÑÝ"‰„‹TQr€¸"Ûƒk 9o yXI_S~þóŸ3»ÿn¼ñF©BâQÑ ìq€H²o !mâVTTT\\,Û·oÏÏÏw‘ˆk ®14žfÐU’ÄÚ‡@Ó#nú"]‰‡€CÀ §’¼qñ‡À@À©¤=º+Ò!àðBÀ©$/d\¼CÀ!°p*i€îŠt8¼p*É ™}4>Ú$‚Sî£P:±„@Ðö'3ïܹó™gž) \|ñÅ÷Þ{¯“M8?ùä“'œpB6™8–zl»ÿîw¿{^íOÛL‰Òi§öÞ{ï|òÉu‚œÒÌ*`û3ofk•È$ Xº™P‹1;‚JPXXò^ZÛD^MK¸^²çJ"‡=õXo•tä‘Gþö·¿•ìî¿ÿþì×\·nŒñ \yå•_ÿú×½ÞÊøªªª-[¶üò—¿¤Vdd½ÁY ˜mS²”[”Øìî¹çŽ5êž{îéÑ£‡*¯¥Ï>ûì­·Þ*))Q)­a+e“1oeÉ*‘I™}mŠ<µŽ Ô½{÷ßýîwl<Öây §OÅ™æJ"3ç=So•¤q9f̘ÊÊÊÇ{L‹7O=õÔC9ÄŒ7c¨Ë¾}ûžqÆæ« 1ÁYòÊ-‰h¯êÅ’©Lƒ³ä…RÃXâÖ…^8vìXM­,qûì³Ï~ýõ×UzëPo¥l2æaÏÄ*‘*ˆ {Õ¦™'I¬âˬê o jé>g-ÑK"+q3 ª’05—-[ööÛoÓdU‘;ì°_|­$#1ûçÍ›÷î»ïþõ¯#óСCÿùÏ}ôÑW]uNÌ b“RÄÿ·öw衇Ê<Í@·nÝþóŸÿ̘1ƒ¾ñꫯªs ,‘áå—_þÊ+¯¼óÎ;÷Ýwß‚ DÇwÜŸþô§>øàñÇ0`€,7K3aÖùá‡þãÿèß¿¿L®±deÞ ¥“N: öÞÿýçž{Ž|džY’ôZ@c)‹ýë_ÿúwíï ƒÄ×^{-‘T%h §^z饎;Z)›’y¯:Ò$BkoBgæyà®\¹ò÷¿ÿýš5k–,YBÍ L¼:‚x«ýe>AòÅ‹Ëä˜|š¥kùˆGk³¯L‰¬9´ˆÈ@*i¿ýö»õÖ[_~ùeÚ¨ÚÓæ ª¨W\qÍ÷’K.éСÃ~ð^ñ8nÜ8)þþ÷¿¸å–[½I)ó!Ï>}úÈG3Àü®8|wóÍ7£A˜˜Hš ,aW“ðÙgŸ½îºëЕ¬ ˆä·Ýv[iié÷¿ÿ}rfB*ó$P'KÛ4ÁM›6?¾ººšK&×X²2ï…Òüãõëן~úéøï|Gæ„%•X k,ÁðÈ‘#©”NAA n׮ݮ]»¦N:lذɓ'·oßþøã·R6%ó^u¤IäUÅB4­6Í<Ѽ4`Dž0a+ Œ¦$ôé¼â±mÛ¶Lf·mÛvõÕWKOâÍÒ%±°6I I$ã[\`·{H¼¸?ñÄ“É$ÀUTTPOtfI‰]ÊTV>øéOÊú7§yS©T×®]‰)//Ǽ¢qoÞ¼™€$6)å+Ú½u. D€­ôÑGa—õêÕ ó„ø ,ÑÇàç׿þ5rÑvQŽ$äB,£O>ùÕ„ªâ/&´(«N–ëh²·ß~;M °,h‘;wî´²D¤É¼¥­[·ÂŠ’ÁãK0%•X ›(ž¹Ž•ôÔSOÑ£þøÇ?²,ÕªU+ò1)½ª8çÌûÔ‘&‘µŠ%jmZó”´Ìp`ùÍo~CŒOG9«;µ9Z2u-ã5>­¥ËV'SÉ€ÙlÄ+U"Iܬ$f¹\>N§‘>¬Ê‰:PÍØgžy3ËŕԟÒIÔBeXhC*ƒjZÄa‰èŠ$¨N‘Pä°aÃ,§Ÿ~šö$_AP'KXId(ðMÊ‹%Qœ•yñJýËø 'ÀE¯PÁ ,©ùha %í­|¤ÒJÄÈ€|[g çÌûÔ‘&‘µŠ%Ãjmúäùé§Ÿ’D¶dŸŽ sV"9É©ñéSºšJ†½š*‘$n‰@* ³œšÌ 0˜K«r2UFÑE$3p¬}úó›o¾‰õ¡R~þùçŒö½{÷C±%¶U¿~ýÈYMn ÓâÈ_L”   µiÓ†y(+²]t‘H(”¦ÍóÏ?}Ä0+´0oƒ°„½F§ýÑ~tøá‡3w[±bÅŽ;¬,‰H+óJ´WÖ¶Z·ný‹_ü‚%3@i²bR#‹ŸL®¡$(ITJ™D$ ˆWMÀ¼OiY«Xð©Õ¦OžRdðé¥Ï£Æ§Wé^gm6šD>¥7ÿWTz¥ gÍšÅ[5”¦OŸÎTNê)Ö;-ZÄxÎ*/Æ‹ìÒñÈ#03_ºtéìÙ³yô¡dB·qãFôZð1»f.ƒ ÀŽÄAXbUûþûïGq°~©~R¡ç3_c!ŸÏ7sæÌ‘ya‰±ô†nøÞ÷¾ÇLG³Õ5–D¶Væ5”Ðq/¼ð ^o¼ñ¾ºÿ+K $«V­BJœ9s&ãD§NDéK‚’õ~Þ>ñÄ‚’ŠæG%ò—øÚ§¤•RäÙ4Ì{Õ‘&‘Wê ™§Y˜Éü>A ÿªÉnòÕ³Ó§ïÿîÚ;¿qÚ·âñ!±Ø€hôî›o:zà@µÕùTœµÙ˜ÉâZ\ ÷%1VS7êÇ5!-Ÿ™1U®¿þz)<³ ­ä+ì)Q["ƤqZöƒ>¸|ùr™Ê `m¡ÝØQYVV&IV'K|0«ì<ðË"¬C#:H$Ç8Gu²"s È’ G@´6k+2¹¨,ù3½†¶f‹*f½XÒ8‘*K22û@0oÖ‘`[•È«Š½ óÊÓÄ«#˜”Ö˜ÿw`ÏöéÌÿ¶nß™IïȤ·gRŸçåUÆ7î*Ù’N}–Nó¯¼vUAÍÁ«ÙxI¤¦mAáz¨¤f%&æs+1]¯/oÔ"LB>UðqyV}3i0}–Ì7¸Ü}*áž­b¨Ç¶/îÚmïË™¥™ôÖLj+*)“ú4þ4“ÚœN}œJmJ§wÕN7ö‘fÓRU’O•…5Äš‘ƒ'q”- fXÅŽŒu …‹òÂ1±¸m`šÊäíÊKoÎ$?I£’ø—ü_:õê)•*3¬'#uËŽ´  e‹èÍ=˱Þ/Ý›½fXů'•y%û…"mCávLÉCaþµŽ´ …ãy5Ž#¡¼öyáö¡Ø€p_…weÒ›2É©äútrC:¹>•ú0•ÚÁÇн¡Štöi•¤ƒážÀ»É$ÿ(ÝÓ*êó¯S8Ü1éÈßP„91Úæ…£µfT­ÚŠŽUg2[2©ÓÉÒ‰÷ÓÉÿ&“|©›øJ£~Mj|9«„@_Üü çs›ú%ÈŸØúÖÿPµ5 ‘,4·;¼X5ã›3óa¿ûî»Mž›>&'(YÙæ¨svíUö-YͰNæ±q˜…mH¥V& ªªfT”ßW^zWyÉäÊ’©•%T•<‘([Ó£ÓŽÞl˰w®Æ$b¢×--¸0V4!^|eAñøÂÖç\º©Í76lÜ4uêA[·v|uß• rXR%jšpCT’zìÀëø5ŸTMÔ@æ[5Æš\¨¥gyº^Ìóm[å°×Áw%ËšÔ{Šy+ž¦DpÈÆ×ž={Ê£Ñ5LùS™'ÎÓ /3øê/J“ÏzU±™ü«"kC˜ ìVaÐùçŸÏ&’_ýêWįƠåàóh–^/æÍœG]:¦²]û[Ÿ™ÿpyÙ½å¥÷WîšVU2³ºtI²âýt¢Ðâ¥vo̼<Ä#‘ hÌÉLîAepÆI€­xzIDü\ðè£"…(BþU™÷S&! .{`šÏ|“9ˆúJ [ù”4AªØ”]$Ǭà.SŒzqćG¦ùÕþXjá6Tl%V»!ÖðôbÞlKY2ìò!ÊBJm²$^qü€Xˆ1;Ò™•©tþY#fýaZÛ-Ÿ ŒÆ‹ä÷E[…ÂÕÇG „cÇDb¯%«^MV³ÿ ž"ç=ò7ÐÄ Î¨!±ñA "y x¬YÒËYi· xŠö*=àhìmÌuÖ2¹˜Q\`$ØÂ<×§¡±á±•0UæÎ+Eо{Ý%óÌ×èTØö¬ò¨—jÌÓ1Ì;¬xzIôÍo~“;þò—¿H ˜Ì{‰ ±ˆÏe¥•OÁF*¶Ê.’3áå¦'yؘވºì²ËØpÔQG¡˜ J O/æÍ¶”%óàÉ-T×\s ç½å¥V–>þøcN˜BsÌ1Ç ‚ áï÷1D"¥íÚ/ŽÇ¦TÔì!à ÝÎþ=SÅ5ú«M(<8ZpI¼xBAñ¸Îû½ûÎ;2¹è‰ô‰Ö˜Zæ«&ˆ ¤’X‹Y»v-sîë! Þ:¢¿†ã,U›É}J~š[wáMëoA˜qÙÀÂ… ù‹^“µ¢|·Þ%óL ¸Aeâĉ/zLâänyLlóÎO/‰X,cb¾}ûv) •y«˜"‰ˆÏe¥`©Áw0xÉN¶hs¦¢haÂü¸àåá‡æB6pgÛ¯äq" OæÍ¶d™â‚´O4—R0æaiwÂh,q/ 7|bì³2ö¸¸3@^á°êÍ73ûwx¶ªê¡Š²é•åeg+4ô˜t›š‹÷Ø>,Z0®¨]É´iy‹³]ÀªrØ´yV¼à¼x«¶æ5 6ò/gÜÔãׂ[lQ Ë {[¬‡ª&gäÎ2…ˆDÖYÑ8DAë…’UvæŒHô“ŸüDJ€lYÈg¦¦F6ƒóZÚ,™á”SNÁÇ—™›,ÁZUövººæü®í‡Ñ4(ã¯íecÅ9•ÔXȺ|ÍT&Cÿ·\Ù¡ðÝ/;2»”èF :•ԈຬÍùÑsã­Ç}´,EbEýW.¥ÔM2ö›±M-ãZ.Ò"pa¯éFÂ#"±!‘‚:- C£5†ÒºT:³û~îFj yÇçÔ‚üq1ÛóÕw&¸Hˆ@À5µ%n¡€¤wí¬žýäÇCO)8¸îGyuĈ¹=Ô4²ë[%9Ö¤]È¡'N¸Hi(9@\chÑ9ØÐ¼Ìèd¨oRÿÄ&åÒ3©Gòª^*,T©#è*IcÅ=:{ÑPÞàü؉ùñ®áH§Z‡(û‡Â|\óÑOÉLfN’ó%e¸ºll4v[6jìÂ\þ‡ÀG€ËÝ^®®þw"Á¡ÿî‘H·pÝÔ—M¡/¼6 gM*ŸlY‰­r*I…Å…œ!€§ÜçòùâÆÝ#aÔӵ꩓a@q'{”V$øPɶŒœ•dCÅÅ9ö%Ð1Ÿ§Óü[Wãó² ²PÝу£‘mž;+s™SI¹ÁÑåâØkð2 ŠB¡]ïôÛ©¤½¦!9A¹G@3 ‚€G“L½ŽÕ|«ÆøìÛTÉ\x_A ¸ûÏ}‘ HKd>Jb÷6תŸWûÓö¤ì#í²Y‰ÙxÕÁ­†Ü9]§kùæ€7…ãÕ®±9iA€˜PdÃ<×ér8ÞnÌlÕnþF3äVñé* _ÜO.~Ü1Ž“)8`=ÞxF…;\;¨<5Ã°é ½2™ K9©+J\æ‡#.üφ½&H‹¿3¶M¯[·®±Ëj)€ä¼6¹Û¬LÁÿ|@Æ3—…³¿Ú‡¦¾¯t•$Þ-·Ü‚0îóç¾}ô%‡Y¸–|ìØ±ÖܹÝoFZ)­‘fZb¬”¦†¶ºB÷J. j°éç_a¦A ²Š©F6 :´“Y0fE W‹øàÄŸ•ƹULy-•|´RZó”IücÆŒÁ}îüɲëˆZþ¥øˆ¤1ø$WËmŒÚD×påìgœ¡?8…WcD8 ŸfB3FWI‚båÊ•ø}F1¡ d&1VWè¦'uˆ­.Û­É­e™”¸Ù‚I–â~kÉ’%ب$ĦÃ:¾wp4¨ºB7“ãÏ ‡\üpwƒ1ˆi€×SkÑäŒcBœñ–{ÚI‚s ÂÄcÙâ _•ýû÷'–V¬X!|þañ wŒÁ "‡œ£DžC† áˆ"Ó1P÷Ì[Q« bÖBòox&¡øYÅ4‘ÿ’|·ÿ­u…™çßþö7|£Ã<`áQùöÛoß-¯ÝpT‰#x´’ˆöª£Ý}ñd¶OúwþùçCqýõ×ãÔãˆµŽ¬™bÖ«1˜É»uë†Ó·3f (ñþ$æ×W›øéæ‡'NU:|VÓ°™3©‘8¶¡‚<«ñ ÛU’È ·exX•>°Ì¬®ÐMOê$´ºl·&7K!Ƥ¤ÅtèÐþ?aÂ,LtdÁýÍ[½Ý[‹¦“à†ˆÃɼ¥Û`Éã¶£ƒjÀåäøñãñ¨ÅxÂ[XbÚ+ü¬1ÇÎ݃D9G‰<±½±ªXya2>iÒ$b¬(!ÅÈ‘#LJ·><AÆÏKLyA¯ýµÖ‘5Oìñ#Ž8‰¨{†@œ>nÞ¼YËM}¤oÓ[dŒµŽä[-`¶OÆ`œw²,‚#O–¨höV@ÈÊZGZ`0lZfÍšEu‹´& Ä›ud-È*&ý9`c°&Á*µ‰ºyóæaßÁ¤Ùæ¡4™÷ÉS«#)D['¢£¡²‰—4î¸ãæP›ß°°]%áý ‘0ã1@¼ò³GÆ^Œ~O=õê“–Nnº7]¶[“[Ëò¡êÒ9Ö'9ʼn镵\É–Êê>þÿN‰gC×w‰BŠRx…*篘¾É)(ç(‰%Á'}ØêSeR ûˆy‘›FiÍ“™ æ N™2eôèÑàüÆoh̨tHmô6ëH¥—a¯öIÓÓ@’Ø0ëÈJfSRÖÙ|’ ],”‚lu2gŸ€OžZÉL°F…]C‹âë2†€H^ZZªF68lŸ¸Ù‚ T}„ßq±ž‚9 ,¡Œ?ÿüóØGÆ Ü³zR¸€îê­bX ²RŠÈ€þæi,»Â³P">2ogpc(X´hÑŽ; d˜¢ÿð€¹-s7V"ˆ÷rÙ° z¡°:˜t3Z0UÁV˜;w®SC‰ø/\Ë+«˜2‡†¬ybê¢Ä©æÐ5,L`{úäk(ô1IcÖ‘|¥¬í"®º™»]tÑErAÄÄZGjþ2l“·ƒWrr@'8¿LP˜¾‰£6»v특 ÔR(wÞy'kF jdnúJ£„æ.™N»jÕªeË–Q6S9<3§#lºBG}Òo±îµPäbÎIïEÇtWoÏ,Hp(¸å¯Ê0_ ißK—.={¶ÈÍLŽ‘¹víZ&2Lð-ÓZ®Œœ3gaá žvÙ 7Ü€SylCi¯Z]¶/(8JÁ«V‘½¹páBþª;h5”DžÒµ¼¨b«˜>ÈK¸DÀJiÍ“‘ŸNH錂X@Ìã´¬´GزžÅ™¯Õ‘úJ†­í“©ýµ×^;qâD\Óf˜}0ÄZñª#™¿ XÅ Þ¬ÉEæ¬(¡¸©MÆHY\cÔ&3\Fâ§Ÿ~Z–B€Ú)++ã¦$©V1añ¨Ò7 œí}Irô&ØjÙ &Œ0˜TÂÊÄÖäò­N)R1„ªÕ7¹Z4Š Y§Ÿ~ºP²²VpYšQ‰i1<ª+êÛ:ÃÖ"XgmJVö 1Å´RÌ>Ov¥`,ðLêUGV–¬íÓJi´Ö‘•2K1µä½{÷f eÍ ¥ õ#Q:ôj›Ï†%š1jŽ5ååË—[óñ‰Ìò@ÉW¦¯O>¯°P4}±ü:«&d„1q´&WSÉppJ‘D«›ú&—å`ðĈe Uõñ¦Ú%²ÁÊH”Ø(Á¶U D¹>­búÐy•}žìlà'Ëòª#I ¬íS%ð[ëÈš$K1µä<Â9Í~$Jç•• 5RËS}¥†iÆ(}5¦ÉÂ5* ‚ÛdE¶¸‚ø:ž¥¢iq"·8†÷…:bÒÄâN‹«šú2b2‚¨þ«‰õÍÔÑ;†!Þ±s'Së†%v©‡@nˆ°$Ö±C¦ÇÚö§Üãrs8AˆDócø&د}{V”ø”€nâ$¥£q89G Úº¨è³-[ÊËÊ;wéÌn#>÷æ¼ —¡CÀ!àˆÀÿFœ)cµËˆIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-i.png000066400000000000000000000245551477365367100216650ustar00rootroot00000000000000‰PNG  IHDR†EÁéÖ ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † EASCIIScreenshotÚ1 Æ Screenshot 390 69 1 VòÔè–IDATxí”U5·ÇÆ€ 6,<¬ˆ€»bÁök‰]Q,€Š¢. ¬€Ø+ø|.+(XAP,ˆ…‡bW|ba©ØEd†y?Øß—•Iö97wî‚“»`VnÎÎÎÞÿäììä&Ù[n¹åZñˆDê…uCŒ(ED "X…@± CAAAqq¥œ+VÄL¢Hì!¦?ÄÎ÷ΰ [&næóÄOTTþ\~ùå1Ó†$b£A:1äÞ°Eü7VÝu×mܸ±ùJbáÂ…%%%1Ó`‰!v†ê³ Ë—/¯d’ Ö1ˆDj¸¼]+°ÇJ#h’t\bnD "P+D“T+°ÇJ#h’t\bnD "P+D“T+°ÇJ#h’t\êgnaah§¬ŸHF­«Œ@h” 6ÝtÓ£Ž:Ê®ìÔSO½ãŽ;ìœ\Ò¥¥¥O?ýô~ûí— “(’ Ç¶ûã?þÄÕg3>J‡vØ_|qÐAe?œÒgØÄéÂûlU|²ÀÚý‚NŽÿ"Ø5ù$«í#o—%•îùÒÈ‘!ðëQZzRÃFÇ4l¸Såƒ|²ìLÒn»ívË-·.m´û5çÎkr’çwÞ¡‡šôÔä³Qê矾öÚki“™U"\¤@¶5)R~Qb³ÿ 'œÐ¥K—Ûo¿}«­¶²õUQúé§Ÿ>úè£Å‹Û”jZ¥¬1áU‘T|ÊÜ[Sx:/‚SÑæ›o~çw²ñØÉçkˆœ) ç3Ì—F>çœEŧ–®Û§aã^¥Û•”†ÉH“IrØõèÑcÙ²e>ú¨“ï=äCvØa?ßÏ¡-[µjÕ±cGÿQHN¸HIÜŠŠŠœGY‰äÓp‘’PªšHœÀêÖ­[Ïž=uøªŠôá‡sÌ1ï¾û®M¯õ*e x> ªF¶"&Ôš>OЍêVáÁ®=¥áÔ“4R‰ó›Ù° `ãÂ¢Í Š7)(j\XE7Â)È$áj¾þúëü1]Ö.¿ÓN;½úê«X%“‰Û?nܸÏ?ÿü™gž‘‘ù€xë­·öØcóÏ?Ÿ'æ„Ø§”üÿ[ýÙqÇ O?Ѽyó÷Þ{oøðá¼o¾ù¦=× †guÖo¼ñÉ'ŸÜu×]“&M’*öÞ{ïÇ|Þ¼y#FŒØ~ûíM½!"AÌt†YçW_}õüóÏ·iÓÆwDR…OBéÀD¼/¿üò¥—^‚á(’¡wŽH 4xçwþwõgÛm·â¾}û’IS‚vêµ×^ÛxãUÊš>©PAmbò}è|ž[l±ÅìÙ³ï»ï¾O?ýtÚ´i´¬`’ô"ÈSç/ó Š¿üò˦8¾œ~íùªvyäk¤rXS23›¤ 7Üðºë®›1c}Ô~ÓÐî ¶ªçœsÝ÷ôÓOoÚ´éÙgŸÍ#¾öêÕ‹EŠçž{ŽÄ€„Þ§4|àÙ²eKóÕO0F*ß]uÕUX&&†&D$üj ¾øâ‹—^z)¶’u)~à 7üù矧vœ™ž$2Š„³Müî»ïz÷îý÷ß3p™âŽHªðI(]|ñÅ_ýu‡ðÈ#4¥Ô&6Û­™ÂóǤˆéÉ)/‚ál'¤8ÉéÈ™R»]ʤ“º­‘!^C™Mn9?j2ƒÀ`.mëÉTÄÛ(™ÌÀñöyŸ?øà¼›ò·ß~c´oÑ¢… Å)”øV­[·†³]\MÓãÛ¶mË_\Œ Ð„ˆ„FMš4aÊŠl÷îÝ¥ #\›©S§â1ÌŠæiˆHøk¼´]tÑÎ;ïÌÜmÖ¬Y‹-RE’LUx%ú+k[묳Î5×\Ã’ IÙ@‘ CMZ„zñ1Å”„R(bSš"&aLBÕ€ð)mäh¤6±Èé´f O£²$R^‡2å«#gRíI §vG£”Ú׈G™Mv¥ GÅÛv”|ðA¦rÆN±Þ1eÊÆsVyq^Ì+ ?ü03óéÓ§=š¯)”LèæÏŸ]˳kæ2˜üC"«Ú÷Üs†ƒõKû'Þ|æk,äóó͘1c Ï‘Kû÷ïÒI'1Óq|uG$a« ï „{å•WXðš3g¾½ÿ+D$’÷ßu¨qäÈ‘Œ›l²‰Ôîˆ$”¬÷óôÉ'ŸJšÈ_òW+S)…gÍŸÔFŽFIMŒ¨>t>OQYÜdþÊ×”A0íâ‚›yäÈI¾_{JÃ©ÝÆ×ÈT·&&BïKb¬¦mì×D[~fÆUéׯŸQžY†Ó æþ”´–äø” NÏ6lØÌ™3M)?·…ucGå’%KŒ3bÈ2Š´ÝvÛ±Ê~ï½÷²,Â:4zaƒ¤8Î9¦“EÃ-P$¡GA¬6k+¦¸$l‘Ò…‡ÞA _ ·ÅV3+‘IÌW[$“™{¢„÷ÛHĶ5Jjâ$è’xú€$½>eRŽ-§Ð„ÔžÔm’4Jª=¿ùÿ*-½¼Ñz›/ªXùôŠ?ïXRi–ZµºBMRÕ¸WS)\Ü1æV2]϶Z‘ ûî»/ù©‚טgeˤÊô9 _åzëUÁÚmâꀺnv›h’òÙÖxC¬±9ŸL#¯º„@lâênê0I™7T·VµÅŸåØÚª:Ö[3Ä&®œó[KæåíüÖ¹E"yGÀþ•&ïÌk˜a®&‰ŸÛì_‚ª }ú¡ê$†,Ôµ;’Dõóë²ða¿í¶Û|™k>'/(©bsÔ‰9»ó(÷žl3Ì‹ð"^Ì‘l«)“I 9ÖœQîôCÕIÅÙ3V»w|Wå¯uáU©$“½ÚöŽ)”Σp@)sGÉ‘¯lC{ûí·9¯Ç^yÎЂ¼ôdÃDx1Cî"Ù V_:k“d;H:~Íš¾Äá¾¥Z\Úµçx:+áùmÛÑ(éà»ìÇuˆkWxO_#„dãëÖ[omŽFÛZØÈ“ï«™ˆÍDÒI”¾œY5±_Ü©7Ý*lÔêܹ3›H®¿þzr„&©38R¾úµg%¼Ï9\¤ð‹rɲ:r2›$öªËqöt±›Žc;G}´ˆr¬9«CÕþ©è”ÚùýžOúlà ¿¼ 0§FQ„“¥áÂCÙ®];^Qövr"|¯½ö"'éà»@ŽÂspÝ ¼?TÊ»Ä17Óï}äÕ;|©/å(<³3¬$f…­ÈJ#°#ïAz2;òh&(³º˜ú@< µ’Èl’8«qÜqÇÑxœç*¼nZTd¥×¢¤-·¬9«CÕ~ñ”Ú©—ÚíCv¶$’Ʊ—ZÎУG™îÉ£á¡ä>9άÑoØû?dÈr8Xàßm>‰tnÈQxvrr}×0°¾sî¹ç²f'û‰‘Á^½3ÀÇSÕˆL>,êqå†å«*¼ª¦ LüË’(U9EŒŒM ™ª»·ÿ2YC©xgÑ…¹lµO_ø¤¾”‹ð˜Ú—‘žÍqœ Ùl³ÍŒÀŽH¼Gl¾—%0¶w %g$ü+’@Î!xj%áÎG|!8ÖÀ°‰ò©½òÊ+m¼w&¨&‡Ý\þazyr¨Z-Ž9HªÎH…Å1ø 6Rs6…kž8'qÄGÜzë­†&Dx®¸â ްÑÒâa©ß*Õ›rQ1s ‰¼B ¡'NLž|ÿØ½Š§ª‘°íÚµ+§Í@­¶;¨jª×pÐ!äZUNs>c«º ìÑÎ8ã =Îá˜àï˱'§3PJÞïK9 ÛÈyŒŠÅ#zšØÉ<²á3H© øßW!«4&sÞÊÿ³|ñ8ëb~ó(=‘«IJçŸFj<| .Y¯E«fbÎ: l4 /U“” NhبOi™¬¥T4¥ì¯[—þñÓêÛhS(ýGÑ$ù˜Äœˆ@D@G ÐQª²‹D­™×’tÑbnD "Pÿ˜WV6£lÙ«nâOúà"}\¾âÍÊ? &ûùÑ$ù˜Äœˆ@D@G`qEÅ{e+>(¯´_Á!ý¾b•٪”MøD“äà¿F"i¤;J9ºHTMRúñYD "à î(åè"QW4IàñkD "$G)w‰Š£IÊ€~|ˆ8$9J¹»HTTéŒûÍØ[eWÏq­˜bgˆo‡yV;JËw)j`ö(‰‹ôÖŠæŒAºÍª"œZ0.b{¾ýá΄˜bg°{ézÈ„{î^vÅKÛî+ÿþê~êˆ^½r4Ø¢J[%9Öä\È¡'l^Ì4ƒC$v†Ø@€aƒ N\gÓÿ.l\±W½VRqóâE‹ŠŠré!œ•©d’ Ö1ˆD2"`6sç²]Û©%.o;€Ä¯ˆ@(òÓÛOå¹l×v*+r®Dpǯˆ@D 6qWpƒ[ÁZï–/wÅŠ$²¬ò£IÊ ®HˆTB`iEÅ×ååܹĻ´]ð—J?ù—Š„ˆ@D`ìQZ\^–G,¢IÊ#˜‘UD ¾#@Dû:Vÿ©“—·@êõ×ððŸõ¦5>¿e6IìÞæZõWœõ¤_Ö)5«¯9¸Õ;§‰nR§ôU…á¦p¢Ú©ò˜¹âk‹ð\‰Ë]àD»ñÙú9¹Täs#§’I"–÷“ˇ;Æ 2›è‰ÆÓ¥KÂÚAåRw2ãÍ׳•$/Í¡¢¤†–ÏV¼ 'ÞÛ¦çÎ[Ýu­)€ä½5Ù¯HV¦`ŒAÎ;J•L’8` òsß>ö’“MݺuëÙ³§*¡«ù~¦J©fúeÉQ)}1<Þ¼©¥Ê®_Hƒ™ZH„T¤ªigV¡9œ“YH¢¢¤†–‡XUÓGÞÖÔN«”*O»TJºG„"üQ M^%b7GzE)j†t†”âv½ÕÑš&hÕªUÇŽ튇 ðvé$”²ð¯•L’›={6qŸ1LØ£]wÝ5‰— ݤNq5d»Z\­Ë§$ÌB°”ð[Ó¦MÃu¤`x¼yây‹ánp HÔSµj8˜g<åžvŠÜ‚4ùx¶D#Ve›6mÈQC¶‡W‡¼£ÏvíÚqæˆé(É=ó*Jjhù$5}ä¡ô?jAæC÷ì³ÏÁ€ˆˆÊƒ òšU«$9Imdèí„ß?yÇfÍšÕ¹sgÈúõëGP,N jÙüMÚW3«ÎàoÞ¼9A߆Ž ú“̯«¯5‰Ó͇HœF#Ĭ&6s&ÉLBÉ.R…´b’„ aË»fb`ù¬ÕPè~$u ª!ÛÕâ~-äø”`Ñ´iSõéÓ“`§%…B÷‹«ÑîÕªyIØJÚ©S'žòÚࣶ§ƒøB„œìÝ»7µOxŠHL{å 4ѵ$d{xEpÈ;JðÄ÷Æ«bå…Éø!CÈQQB ?´|’š>ò°õ?j©<ñÇwÙe"&bî ú¸`ÁŸ¡ÉáÝæm1_Õ62O„ß?W€ ÞÉ‚)€L‘1Ù¯ÔäIqâĉÇ{,a) 'O8LáµÑ9ɉìFÀ¿#F$í€ç°x`E°Í;J˜EÚˆ0óŒ®ô]‚ƒR‹Šù~hù5ä)žôq(UžÈF3¼:&©uëÖò¾%ñdú`2SÛ(©¬Ú?`XÊeh5jÍ-e}@È÷ÛH­HU“÷9°3¨Å¥"D¥5 B7nÜ8ü;„ôû<”¾ð)<62ñ‚pß|%Á‹†É&ßdú™GUN(&‰èWÔÄ$$‰¯Ìr{qøŒ?óI(>^r? ¼²]-®Ö•B)æ’©”Ì”âØÑ0A£§²ºOü?†SÈİ5.Q̨ÔÂ#L9ýí!å%Yò9y‡ÕИIZ§«‚¼pv(Uè˜ âžéСC»ví ÎsæÌIŒÒ½ý6R‹'õOº®LI¨M¦ßFæ‘PÕ4;CJq±ÅbL¯3œS)<62LðF%ޮɡGñë&§:ÊÄ È&MšdÛ#ÂËz î€xbŒHO:ÿ¨}ûö¸sj$u€ W¯ª§V¤RJ¦ =©8½“eWd#’Ây;ƒÛàÁƒ§L™²hÑ"(¦xø€¹-s7V"ÈO ÙXQV(6“nF ¦*øJ¸cÇŽ5j:(‘o"Ê›„ª¦áPµ„ÊW#Ns°0‡­a}ß3…?¬¡ðŽ¿Ì#;¡öO0ˆ„êfîÖ½{wq¤ˆÁÁ$Ô6²ù›´ª&O;CRq8`Û¶mË_&(LߤÆêhÍf͚᮵QŠÄÍ7ßÌZÆÉ4à˜„yTåD%“$£„.™—–¸ã¯¿þ:u0•#¢1s:Ò~(t5’:o/6.0\½ª†_‘H(Òò×8$Þ¼í^­Z2ÇŒCB‚Á“À/ëß¿?Aåñ a…/M¦²=¼¢p”›©€»9yòdþÚ;h”„§Z^U3yª³?*¥Ê“‘Ÿ—Úñ€˜ÇÙ|ü4lYÏbÌ~ä´‘ýȤÕþÉÔ¾oß¾$ùèÑ£iM†X¤62üMBU3¼3¨Å…9+JnZ“1ÒTW­É —‘x„ ¦´Î’%K¸)I2U”lúª¥sº/ GŽñ ¶]7CÝQz¤Ég„Á¥/ÃdªÅÍS;N)¥Bm²-nW‚²!«C‡faª`—¥›˜ÃW{¥Ã~š1](á} ‚:ksPRÅSÕT)Ã3sçÉ®œ~ “J“ÚHIíŸ*¥š©¶‘J™£šNñ-ZLŸ>5/Œ‚óIíÐÛ}>‘èÆ˜9Ö”gΜ©òIÉÌý@IN&)E²Ì#æ;8± ¤3fÌøÇ(õS¤>´ÞK¬ÈÒOmÁÜMR1DÆU½:« ƯãUözj@¼XÔ‡6bÒÄâN}hîôL_M¬(D#:‚@!Së:"J#"ˆòC@Èq›ˆTD "¨þÍÁ÷Úbù;ÞIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-l.png000066400000000000000000000341261477365367100216630ustar00rootroot00000000000000‰PNG  IHDR†FÈ3å ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ*IDATxíœEÒÀk#ì%s€  Ìžb8ÎÎsÂûÙ3cö¼3'¾;fL˜#<³bD划— lüêß»½7;;Ó/lzËNÁl÷›éî骮îêªî®I;vlÅŒ3$‚ˆ" Dˆ(2ƒÈ––&™™µ•””Hô,¢‹—g"žˆúŠ—ˆG<ÑüyBÐ6ÝtÓ×ã?^ûÛß*¢gµ)Ñ%â?WD<ñDs扴 SRÛ¶m¥]»vþ‰€¬ZµJ²²²¢g>ÊDt‰xÂÇQ_‰Æ ?K4+ž µ0ŠnDˆ(Q ¢@‹¡@mƒy‹A=B´¥Q MÎÔõ³, ³ªÂ ½™)i’Á3½Òõ~:¡^¤·¡ù¡¿ Tˆè)׈ÄËôW™Þ(­Š—j¼Dï•hX̽ RGQ õ) †Ôo£¨†> 0¨çêÕFGî [ë¨ÝZCâ­¸ôw+}–­avUhA–Þ#Ž0@@ 24NG 4BAïU „Êßú³0ÄW † /×›¥#$%* JªBž/Ö{Å߀ÀÐøiX¤a!¡Þ/Ð+_/Òð¾" 4"ÁÐX”ŽÞ“úfdÈPÝ!×.-Ý ü þ…\º‰çè`ŽP0WUÁP)• ƒ A>©Š%‘ áp°Â R8 $¤J0”W †*a„ƒŠ+$¬ X_Q.ëUXpåi|­J$ åGQ >( †ú bTFƒQ`«Ì,׺­tOË0BaÀ¬¿9ZˆXm-q ‚0aà/СoƒŠCž>[Wò{]y¹¬Ñ{k5¾Z…ÏÑ\"ˆ(/"Á/¥¢tMBB+(Õ™8³pìûÄ­9ǘrô9&⬘uýÍlÛ®0„òñ !•ñÁ0:€c¾ÖÁµV1@0¬1B¢2¾Ú „E¹¬4ñJVÐ;£{-›‘`hÙíŸòØ3þ­¢Ì ¶5ìð:ê³ ŠÁ ±Ïc³'Í+ïWÚï7aQiÏgEh”ê@[¬$‚¤ZPè} åZkF@0òû€[é:`#ˆa +X»°ë¬eT }/¦®Öú¼r-„õýÍ=sÿ¿­©,GÍh<³&4Òû…¦²Žš¦£¦õ³Ó„Ò±JÕŠÿ*âU‚b…†¿éµV/ÖI"h¹¨³`èÞ½»ì´ÓNòòË/× âŸÿügÙvÛmå¼óΫq¿¾´jÕJ}ôQ¹ýöÛåã?®×â#â'g2íÀ)úC9DÒÓ+³7ß|Sòòòj¼t^i©Ìßi‘^½ä™ÉOW.Èê@‡9e°òÝ7ß,ç]t‘LÓ¶Ç öÚk/ù׿þ%'t’¼ÿþû±’Ç|^¸OUÜ‹×ç邺]Xgq=MÚêÕFûÊÍÁÆÓe‹ÍH×vmeÉ7³ôyº´QÁ@˜«a†æ³€öÒAwÐg}þRù¡‡i !€X¡!‚°RH”Érý½L/4XÂ"l,°õ°aNNŽì¿ÿþò /H¹–‰ô¿xx)ì=É´_XYËý: ÿ›µszCçÎEO~Ê]wÝ•Æ/³gÏ–wß}7î|6lß~ûM®ºê*Ùo¿ýDOÆ×•0Y\e†=K5«p»rØa‡ sÇw”~øAfΜYƒLk:v”1·ßaxé©¢ÂÏ Ö®“Y¿­ÿª]=þv_¾|¹y_QxSá>¶ wÖbZIï.åÕÛo•É*à¦}úiåÀ¯–ÁŸ«}õ•VWƒû¹éªÛT½qlÓõó¼ k•êJ+ÊU0¨X¦×râz!$–구¬Ìh!žlf"è ¼Ïm¼wïÞrÛm·ÉÛo¿-ëÖ­³·k„‰ö¿xx©Æ ÕYÏöÛo/gŸ}¶‰«O¦ê¬aùl‚yóæ ×–[nio9Ã^j–øúë¯å‘G1Ò'Ÿ|"¼Ã ‰â@ÞSO=U>úè#ùþûïiëõ×_¯.sÛc=&?ÿü³1} 2¤ú‘Dq &‘§Ÿ~ZæÏŸ//½ô’ <˜ÛÕ„ƒ ÷Xí0jÔ(§Ÿ~úIÞzë-¡|/$ƒƒ7P<‡ììlùüóÏeúôéæ0`@uÖóÏ?ß<ƒÇ01~õÕWòŸÿüGºví*®|©†{,~ ¢ D€ßÿèCùP5¯ñÿü§LP¾x]µêÇUÛº«`½\¹h¡,R¾™½Û®r߆<¹¿8OÖëÝÎmdåˆm%môNR¸iwY¯‚Å«„±¸WZ¦l—ÑJÆdåÊ Ùme|«öriŸ~òè!”Î;WÎìÓ[*¾ø\†geJF,Ì»í š¼ì…0übÑÅ[†»xÞ¦iÞµe7Ç0aÁÐIg&L?üPè„þÁ"ÐQ!´Î8ã ÓQÇ']ºt‘ÓN;Í$¡óž|òÉòã?ÊóÏ?oâ—_~yuö°|Õ 4Âûè½Çtø}ºì²ËÌ`}Ë-·ÔHŸ(¨Ç”…ÆrÁ!‡ÍÕÂ5×\#ëׯ—ã?Þ¼S›Áՙ޵hÑ"9ýôÓ¥XgÌz¼„ƒ ÷Xípî¹çÊ‚ dï½÷6muÀx_gâ‰àP+sÀ Àõ¨£Ž2|€ߺuëêœÕô„ybâĉ²Ûn»ÉwÜ!›l²‰ì¼óΆFaùR ÷XüD—X<ˆ‘ SÕœ+¤ã;Ê[ŒÂB¹SÆÀ[þ)óF”[/–ec÷“•‡ “Kס9ºÄ®Â¢¨O7)ÊÔáBÀº Ý=VæIë·?–ôž”Sß—´û”ñ­ÛÉY¹måÄœ\ÙWûÚ–Ê«TPøåD‡ŒénåÊ•ò—¿üÅ”kÿádzXt±ù½¡‹ç½éê›w½e7·x¦¤]wÝUJuA*T¦b€g@ôê!v;?\xá…ràâÑÕ˜Szöìi’탽téR÷æ ËçMÃ`ó¿D€Íá×_5šÌf›mffß”‘( BÔÿ†n0ô¡“"Ðõ^+hK–,fÝ$´#BT` ‰àÀÌ ávÝu× ‹¶`†Lg[»v­)2 †áŽÖ+t@¡þ8fyh)~HÞ ßa8 %9z¤ ´ Ö¼l~øa³Ž‘››kŠË‹÷xø%ˆ..ôÒÖßF}”?o³,V'™ÝÔ›¯ë†Ã† “#zH†·î,{žrŠÜ£AEþÙ~‹²óÐ!2çÕ©Ò+·´cí¸XÝñk¶6_dƲ[fŽ»*¶19ý·¼Tš«L–•ª&¢™”ﯿþz³ÖC¿…½„_—7 ïM4ÞeéoŒ}åáÀ}À…{eŠÚ1ó±X ]+Ò¤oûvÒý¾EÅFP°ƒŠk‹ô,³í—í² ËKd¥>/™òœ ÓMjv*_W9‘ñÖ1¿°zúû‘·o<ÏûéâÍÛÒâ ›’P¹Ùn†YY+ë ~ÀnˆÍ–ÁËBŸ>}5ÿ•W^‘ï¾ûN˜QûaõêÕfFÚ¿ÿêÙ`<ùÐ< dì•þ2]¿éìÇ7ëÌæ±ÿ[HèÂ"*æ50;î8[”ØÎlþwÞ1š³;+\I˜(h: x Ì[kÇÅœôÅ_Èš5kªß„ƒ}èÂ=¨蔬‘´iÓF®¼òJa]†¶ñB¢8šÁôáòBä³i½qoÞ ¸7­7nÓ¦îñðK]\iôì¬ÕÒðþûï7&&¯Ð`ý€CÌ4Y0e–îÉûàƒ{ð{ï½'Ï>û¬).ž|˜š.\h„Ž­CûÂTÁ=¿Ñ%‚cŸ…½ÏÒÐÎÊ í=3ÜwŸ­“ÄKumpÃî{HÙGÊ­…yr_Ñ:y@·'çË{¥…òCy±9‰­lT ùEÒ»<ݘö\¼Jä¾!1>§ŒÓµ‰™Œ!šøÏ‹Œaõ´mKÿ‚xÉÅóat1…µÀ?I™#LâßydiÈ6Dfãéá#/`²Õ{ßGÓ°Ìgï‡å£±éÌ÷ÜsOÜÜÐH>˜Dòóók̲íûÁaóÍ7Ì9»›…`胰€Ž…PìÕ^H›Z±ÛyøqˆwÊ j4fê^Í„´uÁü.ðãàJ[_ÏR÷0~±8úé‹cµQ¬÷Ù÷úC×XÀ!½ÞÊ÷›™+Sú¤gJ¯ô ³Ã©«n“ek¬œvÿµBü@=Ž7xüß³ÏɘµTØã€0ÑzÆâùXtñÖ¯¥Ä“ Í™@,b¡½`ÎY¶lY½ s±ýõ÷¿ÿ½)ì<¼“Jи§~-¹.©Îƒ˜'6QSTý32UXdʦ*(zëÕS…ë~àdöBótÑú']Ÿ ´B"^Ç€Ïû©ûw‹ ±É’| 4vqº6‚ˆMAæÂƒªë£Bb ^2²¤‚BÏJ (8¥íVHüXV"sþ¨á²²Øî:š¢šó;ÿ·:Üœ±H¡º³xAD¦¤@sáAÎTÌUW¦º6ì® Ï[¨itsýU8 MpuÒS–ÃÔ´l’ž-ë2Ëe¾jsõB8Ì)%Tjn²ËMÙÍýÝ‘`hî-Õ?¢ÀF@v/-Òë}õÛE…b^Ñ&ªMtR“BOìpÚZ¯Õ™e2/³D¸KdŽ ‰T“XPZfœ*&B—•DÊÙÒúµµzÉIþ]+õQ8§‰9$WWÀËî( ë ÷úªçƆû¡‡*ÿT÷Í ²\´À æÎ h,ÞuáζØåjúHw.N*,Û òäÞ¢wø 0ÝàÇ wØmý®§ÅÝšb,^TÜhÇf¿ÐÅæ³¥‰Í_Ÿ¸{] x5û® Üy†öä•ÕÖ5¨ýbÑ…çÇsŒ<¤®¡¡Cøq—fþ²âõðëÏçÂÏ›6Q £§-_S¬I¡Å3¸ÜÃdzŸú6âÂn>iÒ$£9° µ_,ÜÃúCCàN›{}`1 ûÁâÀö×_uë+×/­²ähuþœ~¼ÏÚõ² ”n%Ê3EfÛël{Õô¥ÿ%‡êgb»´V^z.â—²RuÁáCí߉¶_íRïN¦$P€Yìž_œWù!Èó£íüØ9Ã<ŒúËá73hÞäÍ5V™±ê™ŒGEÔgTrîøŠ™ýö­{¢¸/Ðß ÐP×јó‘t/yüŒå]µ!pÇ|Ä€ƒ:mß»D}ƒpg€óÊêj¿XtÙwß}'ͧžzÊK*Ã=ÍÈDëx<üåság+(ºèiËÄÔÇw(¼Î¼§èÉvÕí¶ÛÎh*˜-µ_,ÜÃúCCàNûñ]¿þõ¯Æ!¥×ƒ± ‡y‹—H‰âœ«Ézk`?‘ÓO–Šc‘ouÛ뺪M­ÔÌTñõlÙ+¯X?2ÔAÎÒÝLǴΕaê|­šŠY×ñz}¶ïK´ýl¾T ØØùh;æ¾zFÜïB;Èó#„óŒhg½vJhï1pys +3žz&ëQ‘Ï’AƒR¢¸S8àáõ ]H#Dèx!Èã§Ë»jCàŽi—â×^{­™¥£5aZòî‡ÂÙ<3w¾jä•5¬ýbÑ…õL™«ôã2^pá-#ˆÖñxø Êgq¨O¯º±èÉ;Þ¸‘G¸ZÀMú<`>ªÅ§NñÊËٯ떠ö‹÷°þàj[ê•hÿCØàÁ˜IšŠu»nq$ ÂXñE¿ct2sç3ÏÊ=çPvØælÄÓE’6fwIë« ã̃j¿«H—ý2såÔªÅêEwß%ÝÖ®‘wÕtj½>Ûwƃû¤2u‚TµÔa³¦tØ`¾’üž-PYDJt߹˃c2ebJÔ+«Å!V˜ îh`ÐÅeFÂb¦­÷\ÞUm:oظ3Ó òÊJ½\íD„&$ßöHâ¡Y­ÑD ¿¿ ¼ïʆ_]ÚÁEOv‹A—óÎ;Ï[5ç,Ú3á ‚0Þ÷ òw;ì¾ûîFÃö?= p¼ëŸ¹Ê—u‹ëö™Ùz’:Ûlq홞!Yža|­jßëy‰ot;ìôâ"ù^ÍL«Ë+âö(Ü_Ëï«'¸ç+ï,ÐIos€ Íù¨Ž6F 0ƒgæÌ÷Ç7fÀ”É&»½».¸fª ØT5†²²e[éWç6Õ«µ  ¤Ã7ÓôÒ zËLèWébµ ȨN(ÆfåÊ´’"y²¨@äűpá*´žE‚¡ˆ½"¢@DæAlë8óÛVw3mŸÙJ†©C¿6—àù* æ©€øB×(¦—Ë +CÄÖºFq¦žØ]w@ÍÐôõ¬Å´ ÅÆG*S$COþNðÚS¹²QÝ" Dˆ(Ð`.ÏŒO­³Ôß‚X£›W¹pàÃBÙzõPa1X5 Ü…#H²T±ÈÓ|xŒµ€ Ž1­rdÿ¬ÉÕ¼õ ]†¦ûIMR˜¢R"ÁÊ­Õ-¢@D&£ƒü|3uMa ˆÕœ¦N«0î¿1ᛩ»®G êB7]'dàG@éµ]v¶žÝFès€莚¾P ß“ØÂ²! MÆvÑ‹# Dhà¨îB+ ˜íëÀ^¦‚Ï–æ¨&P) pŽ‘)]U@tPßà»fµ’ÑêŠ Ãß”h«Ï—ªa!:UeC¸Yd£0¢@Dˆ;01}¦Xt’¹AvÑ]¨¤n6:ꀩi=,7P5„E:ðçê‚¶wmÂÒgó´,Ù?;GЕ™Ùû©F‚!•Z#ªKDˆ)O|ÓU@ÌVñ‰ 4ª©@à“¤hƒô Ö)pÅ1?»T–—Èš…ë°üq?2%5•£wDˆ(°ÑQ D1Z¬ƒú,]ƒ˜¯këTK`¯ËyÍGAˆ£I°8½\óÌ×õ†T3)j žá ŽðÇ=‹èâ勈'¢¾âåâ-'XƒøZµˆyz¶aiy™¯'¦7sh –^,Ji•+ÿUa2£HO`§Ð¸+cÇŽ­Pw5.ý艞¼¯ êê¶"zÑÅKˆ'¢¾âåâ-•'Ê‹Š*žw|ÅÊ=ö®(þû¸®Â1VlxìÑŠ«/¸ ¥ÆÖÀnø› úê~ipG=³2¿2ŒèñDMŽãÃ)ê+íüdÙ¨é2D BÇ–ÈÈ´J×µ¹ñ“:hº_¿D÷ž>ÏÑOø¡)Æ—@Áà¯Xô;¢@DˆÂ)ÀöÔãÔëñÙíÌtxÊÚOJT |PZdœúÍ,)­  î„/7Ae¢WFˆ(Q ¹Q€S [« ‘zf]I‰û¶U×ûgµ–.zÆ! 5j‘ ”ˆêQ ¢@D$(À‰ç‘ºe•ÐÉÂ&ê.c´ºÎ¥§¥90×ÔP{‹MS×(zDˆšÈ—èn¤©¥…‚—Vü&™Pã™G#` õ>«|^yWˆ”ê.ã*~Öí«ß6±I) ͈£ªFˆ(zXZV.St»ékiEæüB¶ ƒlÙZUÎ3˜Kã{aA:jaB×Þ©‘`H…VˆêQ ¢@³¥ÇÓpœ—×D§Ô®ºêªPÚù¿šÐ÷ Zcð$úÙ¼(ÀÞ"h ´dZ·4ÜîUœÎãcã‡~¸¹‚Î44›FoI 4Oð/¾Iã›Ó¿ýö›`bÀ²½?P0XµéòË/—sÎ9GV¬X!>ø ùø5~PøØöI'T^õ=>ž ¸ò¹ž¹ÞåÊgqõçßc=dèСþÛÕ¿]eÚDõ©MÅË@öÝþ0Ѻ¸ðó?«žòÍ®v˜1c†|ðÁòÕW_ùÑ5¿]4 k÷À‚<7]ù\ïówôÄO”"]Ôœ4iRÜy*a,Zûy"ÞzÄC³Dy7ž2ýõkl>»í¶ÛD¿ž)û쳿*FXl¶Ùf5îÇÛÇjdªÃ@Á`ËûòË/åùçŸêÏ6Ûlc…†;í´“<öØcòóÏ?Ë£>*C† ©N‹Êÿâ‹/Êœ9s„–{µQ£FÉ믿.?ýô“¼õÖ[²ÕV[Uçs•Y( –¯OŸ>n÷Þ{¯Ìž=[Þ}÷]A]ÐŒ>ýôSÙ~ûíåì³Ï6ñǼºô°2  Ó§O7וW^)hYÌf:è ê¼AÞûùçŸKÇŽÍc>lN9Ý»w7¿yŽÚ9þ|y饗dðàÁæ>8|ñŲÉ&›˜ß¨¥Ó¦M3ñdëBæÆlÞ·Ë.»ôÅ$D;Ø»»Ú![÷zC3Koðõ‚‹faíîÍï»ø…´aï{î¹çäC1­]üT{/Œfuáݰ2{õê%_ýµ<òÈ#‚€ûä“OªÍMÅgóæÍ®-·ÜÒ’¤:¼á†L_Æ2ÓTà ¶R[o½µ”éG%,X`o…†×\s¬_¿^Ž?þxãW UØÂgœafwãÆ“.]ºÈi§fɹçžkÊß{ï½Í qÀT?s•Y( –fçý ªgu–Që³Ï“O>ÙÔ¡HÁh!¬L!ƒ3_òСQO\Àó:àÌÐ$£ ÔöeË–™²n¾ùfY´h‘œ~úéR\\,Ì4pÀä‡? ''GzôèaâÉÖ…ÌÙ¼ušÙ¶tL—7Þx#·íŽ:ê(Cç®]»JëÖ­Mþ@ÍÂÚ½º€€ˆ‹_\ïCÓ6l˜ì°ÃFÐ3±Ún»ídéÒ¥o©}‹A’Áà .~ñ¦ Їõ?&ðú„ Ìúá™gžiÖ5èó.Zó¿Õ{.š%Ë»®2™ÔvêÔÉô•Ë.»ÌLZ1ƒ®þîÂÝõ>¿˜—Vý¡mè½eâk×®5ãmy~§Á¹]õž{î1ÐOþÚk¯ÉÿøGyê©§d̘1rÇw˜,h'043Ì•+WJaa¡ÑÂ$.P—IÕ…2³dh”—\r‰™ÑÑIèW;ðœÁ,ÈÄÍ‚Ú2cAP>×ûÀg÷Ýw73~=‚aРAfm.Ö»xŽI{´\üâMwõ?„)Z''Ÿ|Òð¤-#ŒÖ<ã›7(tÑŒA1™~ä*ÓÖÑ~ýõWc¹@S·°þN¾0Üãy_¿Øº"xpXêÆ"6ð¼©À)0÷@TvKbµí1óc–ËõòË/éǬŽó ¿×TD¹ÌØQ`NƒÚËú†«LW}âÉGgâ]¼Œ§LÊ›VeÒ!`*¢3² ß¦M3{#³ùRýR€ðl=ˆ£)Ö¤d~xþ$Z—Ælk—¶ø1"ëñÐ,Ñv·õ Êçzf+fß´áÝwß-Ç{¬ißo¾ùÆé À‚f”aüâ*,Vÿc¢Æz@<^ãW~ͼùáÝxÊ´BÖ¸Þ~ä}o<ñxÞÄ/Þ²Ñ19û~™ójSÓ”DÃ`÷÷ …öíÛWÛÄ™½Ú¬ü~çwŒ¦°Ûn» *vZì诼òŠ|÷ÝwÒ»wïjœi Ö%±Ïc$=à*³º€€H²ùlQ«W¯6Lÿþý«g¦±Ê¤ó±8 ¾vÀ¶å¹Bðe–týõ×ËÔ©SeÍš5&9³$æ<ÌIØ‚y¾xñbÓ‘;î8cª8å”Sj¼"™ºÔ¥’á L“L0q 90[}á…jàÔ$à}–ï¼qÍj\O?\ïCE`ÃhÀ ò¬i¡ùŤÅÎ ä…0~ñ¦ñÇ]ý´06[`N‚§°×[ðÒ×wñ‹ÍºhFúdx7V™”‹>|¸ ±j`¶²ÐØ|†µí‘6öÃßÿþw3yf"áho×"½ã®7M}Ń1Ø™œ÷e xß~û­|ðÁæ6&&zÌM;æ#ž³«bÊ”)æ>ÒAm€RÛÚÐüB\p0›ÂdãÝ»V¦)Øñ',ŸÅËâIhïÙâØ…E§~ï½÷äÙgŸµ·CñC%üᇌ)û%q¯ð«. $bé„–fMæâ‹/–#<Òh^¼u`p™8q¢Ù!6yòdCO‹C²uI¶’å ð zo¼ñ† ý'5ƒÚÁ¾ÏζÀßò ‹f–>®v§N~pås½*õdr…€y)^¸ÿþûÍZë/~âïoWÿ£¿þùríµ×ÊC=dø>Ãì¢u,~ñ¾ßwÑ,YÞu•ißÍZ~cæ…Ææ3ÌzL™(û>ÉÏÏ7ß®°Ïl;„»6]}… ò=T!Uì~`6@G³Íûœ’ÐΘ½Ï\ezÓùãÉæ³å0[ó×µ®eÚ²m­ì™ß­À´Ï© ZØÝý³VMö?Oæwc·3jhà2#µƒ 7Í\ù’}ÖPïck8³\v YˆÅ/6]PèêAéã¹çâWþ† YP™hýLð0S3à/¶žä÷÷wû,( z_P:ï=ú,‚ˆ5Ü?þØû(©xC¸Ä¨©£&U­Ú™˜‘ RZ;fí\bÌ&aæ*3¨,{/Ù|6“ÔµL[¶ ™¥¡Z2kó ÒP‡ zð¬>å̳ÀÙ%¨Sþ< Í‚Ò×õ^C½­¼ÞíÒÔ3¿¸pqõ?W>×3¿¸ò5Í‚Êäx†ñµ­'i ÷ÅÊOŸEà§2ÁÀ ˜Á.‚¦¡[/b€ol¢·64"~IŒÂ˜f°çG?ÒÔtQáâ]‹¿è(eDˆ" 4G ¤¯Ñ}ÃØ#ˆ(Q ¢@DˆP ½¶ì:,‘(¢@DˆZ2óó dåªUÒYOزÂÎ" [I£5‡–Ç Æ" D€™mT[X®{¬ T@tïÑÝœG`kd" Dˆ(Ð2)ðÿ/ÒÇy% /iIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-m.png000066400000000000000000000353661477365367100216730ustar00rootroot00000000000000‰PNG  IHDR†c07 ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † cASCIIScreenshot5w$ Screenshot 390 99 1 Üz$3-IDATxí ˜ÅõÀ»{fö^AŽ ˆ€¢bÔMŒ1‰Goý£ˆh¼ãQã“xÅhHòEãAŒÄ3ÞŃ¢ x€‚ ròìîÝÿßLIÙÛUÝÓ³3»,lõ·_ï›êW¯Þ{UýêUuU={›m¶±Ìe4`4`4Ð=4ìl.ŒºËJÙv•eUs·­”e'm+aÙ Ë’€]à:·-Û³<Ër?ýórž•µ¬´ç¥-/ãYÜÛ¸{8æ Ó€1Iaš1é›­° U¶Ý`Ûõ¶]Wø«µíþ,«Æv¸cƒøÃaÀ¬²llS*o‰òö«ÄkÃÝÁ åmQþ€ç “”7:y“da’d=Ž;é¤ xùÿ›zû¼óÎ;mÿ·†††ÆFjó³kåÊ•©TÊ$J…tec`â¦Þ²¶Èÿy©¦u}“Éþ55½=‹¿^žÝÛ²²îŒ¿´þ†¬³€_ÑÆÜc3Vjµ­üŸe5eÒm¶©J¶Yv›G qUóúL±jkÒ–Ÿ–f~Ú²—¯Yã%“Uõõf¬¹ó·bÕªD*UßÐ@ Ðç3²vÕªêTªWC.P~"œÙ(Ëj]³¦6™ì]_WÍt#DË«e.¼y}C"¹Eu2ÖzveÕyV]&‡‹‡CWía–4¥¯v¼e¶µ0Ӷı–×T/±¼Å–½ªÀئÞ>ÛÚÚÚ™$L’Ñ@—k`X21,‘ìc;[:ΖvbKÛéS€{[3Íñ‘«…y™üðÇmÎÏÑ0Y¿f‘ówþÄO1¯Ì}=3Ði¾&a[õ†œ½ó2æ%EvÆ¡[lЀøYý™ãô©ày…å.r³¸™÷sÙ÷r¹wrYwL¨G¨¨›?2&©›WPOdïÄÚÚ#SõœD´ÊYySÂ|0MVþsUá£U~z˜‰˜ü\ŒË£ìæñ~º˜eïëØzØÊqúóg$¶ân'˜&sÚ›fäÅ6½ëf°Jós™·²Ùå®ûÙ€pÓ‘¼Ý\ҦöátsÖÖÏ9y/É/$=ÿÚ¤/ï^á³TÁè>K1¼ÒuWyŸ¨x´i™¿Œ~˜9ì%9þXHÀØÑ™êk;['ü}Î)üÙI€v¢.¿ÁÊÏî'ªvIT­Mºï»™·øËeÞÈfÞÍæpý”»9lLR7¯ žÈÞ²üw¥NPÞÓþFÇËawèùóßž ÷ÕîFmu}­äøàƒ0ÄRi†Ñ ¤4è–[n;vìQGu÷ÝwžvöÏÜzë­”Žºî¹çžÎ.®Ãô+ÞB:ÌIDÆR[ÈÆjuŒËV{Þü\öÕ\ö} “—k³\ S­íä S~”—âõqò«®0Lù©©îtµû¨Qcõõõ7Üp/ù 3žrÊ)/¾øâÿûß—^ziß}÷é,Z¶lÙW\A¥JÌrö4sÌ1ãÆûÕ¯~µí¶ÛúI}öÙ_ÿú×ý)ÀK—.;wnSSS Ýÿ3‚¦MÂÚ‚äS °út̘1÷Þ{ïßþö7™X>€oûúë¯O˜0!šÃ_ÿú×çž{îK_ú=v4òF|Zñ"d‰YG1h!Ú‚6b«­qÝçÒé›Zš×Út[Ûºg²-|4À`±¾‰sã«&Ö4]S³M‚…¡Ýèê 3øA=öØÁŒ(rÓFêG?úÑ|øA$S€8o»{N8á„SO=U%òµ¯} ×)þÚk¯qÄ/¿ür Ýÿ3‚&hª1Õä'è‡*\þ”2ad‡á¢ŽOkk+ÕñôÓO—Y\e³k«8~ ù$þ£~LŒà°ÃuÔCZÓÀ3Òé›[š§¥›ç»iÎà,Í=ÄU7R]ÃFßΨè¢4;Xêî»ïÎô3&é§?ý)®8A ¸Øÿç?ÿ¡e\~ùåb² &øúÆ¢|0‚!œ.ÚwÐ ¿² —ð¶ø¾6mÚ4<ñˆî‹EF,53Ÿ^}õUæ›eáLMŸ>ý®»î"E` ï ~Lf”ðü±5W_}µÄ ÐdÝÀE]ÄDú^l.c=Q ÷@A2] R¸´JMÄz¢dq1œë­Âˆ þa‡¶ÿþû‡!tqº¨Ó@ â´º¾oðU»Ìxí׿þµÈ‹…b¼FÝÑý_!ãÔ‘–¥Í£ÕŬ\VWNk]KÛºY¹6Ç"ììTPÕpDuí ±< òJxÕ™KþðÃ¥FH¡qLžùrÒ›¼~íÛ®¸>Ù4ÖÎ$Iv `4`4`4à×ÀÇ9³¶á°T3JÍž{GfÝ”–õ±¤ÛLoûÕn`££½8Ô-g{;$’ƒœ$+•8‹ò/Ë)zì2RI*Cy&«Ñ@OÒ>Ñ€„³C"…=bª{•—›ïf+~þ¤1I=©MYÊÐßZ­¼£´µÃ‡y›óL¸Ù•v”ŒI*£ŠLV£¦Už7(‘Ø1Aho§—å,µ²órÙÊFÍ5&©‡µ)#®Ñ@`ê(gy;& ŽR!ôÛ{næÃŠž¦”?>Î\FBq",–Šit»™iàÍ,¡½Ók ñ)‡;©)N ¨ Œ¥™$bp–³¿øO>KjéÚ”®d©²Zb÷ñ…ÆÇáß„ñK§ÕRœö‚ˆ³Ë˜÷ "a­Dò©ʯMA*ð"HúØzë­‰BªZ‡ÏˆŠ ÄÏJI¤RŽH™›Í¾íf T Î.NÕˆD²‚nRi&)À%!ˆÛCØÕ@ºúS4]E#¥¤Øð*…ø,©yEŠZ¾$–èâ”㳦¥Ž±Ã^Ë’6†½¶«×bvó¨WUˆV¢@EˆŸaµ©Ò_+¾–¬61~cð—QqÚRÂ$Ò"W$‘Õ¯çÒK½ü¢$TžHrÞ[E(C$–IÂÕ$" !^8âÁe'>VI&âö¢Ži«X2ì¯Íš"ÌŸlÉ/‚¤ìDvƒ^< ðQºŸ”„Ú_"‰ÜÙÀ[¹ìb/?vKY6&©R¡q‹›$Ür>j2‚À`,í—“¡2ˆ·Q$2ÇÛç}&Î5Þ‡3=3NlxA™?zôhî}ôFP$Æa ‰zõêÅ8”Ù &ˆŒ¡åã°„¿ÆK{î¹çÑ›±ÛÌ™3e8ÖKÌ´D{½ãŽ;êëë 0Í”Jy¹Ça 4ĤFpÙ¸dv•%0‚$r]À|D$ÒV±à3 ºšÁ#^„fÄÏŸa¥£[mÅiÛ|@¢ˆÒ+ûè½\n‰Ëv’|×>ÄI2Ï]úÅMv©& §NÊÛï(Ý|óÍ å¤b¾ƒ(²ôçÌòâ¼ÇJpˆÎ'6¼ Éèš± &?Bê"KÌjÿîw¿Ãp0éÿ¤Z>Kô¥]tѱÇËH'à«XŠ`> %lÜÓO?Í„×ìÙ³ñðýë¿â°DG2gξKPâwÞI?Ñ¿Qz€%É|?O§M›&0©h.*‘;é…_Y-¦ Ù5̇ÕQ@¢°*†UUu*M!²p“¹‹Ÿ/‚Ѐ¼û³ ½ÉG>IWK¨8m›W%’Åu*°Öu»¹¦Âhck'ÁF“Š|u‹{^}5uãÿ¸&¤=á„pU.¼ðB)<£Œ@5ÈGøS¢¶DŠŠ‰ÆiÙ“'Ož1c†Ì¥C‡>}:+*›››¥3"ÑŠ²´ãŽ;^vÙe¿ÿýï™a¹ø„,²ãœBËÇdIdG@¬6s+’øYŠfü€–ð•ð_üb–ÄR€ùÓÏ’L,èæÕ:lû% «â0Õ…ÑTö"¨˜a)~>NœÒÚM˜Da¥W6ýêš3jYÃíZÞM馛Zš×¹y§©œ+®I*§ŒŠçÅeÀc S ×K¥O-²€`ï½÷&#Ÿ*XíÉ8«T"Æ/“ù—Û£2nÜ*î UwÏf³K*ùÚ^_Jæ¿ÒÞŸiþSë:¾Ä•)þ&i’Ê”YdÇb ‘+BÍé†0UÜÙ•ÒÇq.©ëÅQ“ô|®urKÓÌ ©;\tñE&ÝÍ32ÛÍ94ì•©SÅe*°hö5®»Ü˵z;oûÛ‰¾Nñ¹é¢4+@¢hÁhÀh S5àÿJÓ©ˆ»–õ‰›#(.éýìÄ–vìI¹$øÜæÿà8ÎÏèMÕa˜,èng„±ª¦wgæÙÂ~à 7¨&K1f¨K~œÓ]8¨¤ï0ŽÃQ“*NI)e™¤8Ûš‹r½©:,;kÆXéÅWˆÅfahée2s㻖μ–+‘ÈZmV]G „=Н˜˜åkIe•eh/¼ðûõX"ωPfct$P>óñYŠy0Cù,IéüÀ /·®`’ËÞÂv»Þ$ù·„m¿æ£¦ŸiÇ÷-µÙéen€.‰y¾m$ Ûøa"7óZ}ª! _·Ûn;B„å§Ÿy~ªb†)D%†©òYR«ÙEã&°Z……ZcÇŽeÉÏ~ö3RNXcPˆø©–^ó*åø,Å?˜¡L–T&IYézM“ÜÇvzwIb­ºØ#Κ.VÓ±mçðÃÌÅÙÖ\Ò¦juWtDé|¿ç5j”VS"‘…lÔâË ?Ù5Š ì,Ï<˜û쳯(k;Ùþ…/|”°ïêIe2ÏÆ=V'ðþP(ïÛÜd»W5¯=3@Õ§V"Å…ÁâÌE‹ñ3ŒyUÌ0…¨‡=„ajù„‡8U šVv!‘ÿÎb%Vx±–•&qùå—Oš4IÚeUŸ*óam©Læa%1+,EÆPJ†,ñÑDKfEÕfI3€SŸ’‡@`vüJ&G§R{¦R{W¥ö­ª™dwÛ§ƒ­©C«k¯©=±¶ö”ÚºïÖÖZ[·kª´Ó”ŠÜØ«qÔQGQyìç(¼njTðJ«EH?ßê¶æ’6U«Ù#J§\J÷o²ós"`lk©Åz¤`S+Ã=ñ(ó`26dÏ통ÿ×^{-)l,@©{ï½€U—$¢¶DN(“yVrRÇ00¿sÖYg1g'ÖSœÊ¼öÌUŸZ‰HäbR#Ø0,~j™×Š©UDÔÃÂ0µ| 6ŠV1hZÙEvÿÁBýùÏÆY waE.Km‚ªO•ù°¶Tó˜ê—žžÅqì 8p d8Àï‹ïÅË»&{$Ô#”,(Çѧä!`’¾QUsVmãÙ5 g×6N¬ÉÿTÝ0Ôùt 1ÌN«ªŸXÓkbµøë}DUýà7šÇ#&øÉ¶ºM„gKí%—\âGÀ{g€*SXÍ¥n¦OãlªÖfÇ„•e¸ÂâHT€…Ôì¹ã˜'öI|ûÛß¾þúë%Næ©x$ºøâ‹ÙÂFM K»ñ®R{@9ÌÃ*fŽ.‘Wˆ.ôá‡cžtuÛ½VŸZ‰Ùñãdz[PvÔÚz‡­˜Úc ØèçX-Ÿr7|Ñ*ÖÊ.åˆ6pòÉ'ãè±—Ç_l{ 4ri™WÛR™Ìã6²Ÿ£F£bòˆ–&VY’ü@üƒD®8úôÓ÷Ãq‹UÚ=QÅÇ5º„«m»Úúì ¹_˵½‘Í–´ »¸I’å _QþˆØÖŒ¿€‡,{õ8›ª©hŠˆì¤«¥“HO"vf‡]|˜»ë®»XÅÏÄÿ|8Ì‹’؃ñåà‘°Rphñ3pY:̼ÜÄ#5)0O"29?“ÁClÖê3L"Ò?þø[o½)2ú™ÓŸQöÀ0Ÿñ&cÿ£¬åSâÄ©bUv‘·bçwÆ©[|øÉ0ÿ…‹ù,NCÅWb¶ä€>ØWÛR™Ì£v¹‹c!¥VYðÄðÍŽ£Ï0j˜¤ÿ¤[wK¤¾’¬ýÌð„a[ÖÇ^ö•l†­¹á(š'Ånd¢†˜œFwB#’LÌmÍ_x œ.¶+:¬ô˜ ñ·q×™Ëä`Fq€‘`#óŸ†qćÇWÂU¹ï¾û¤ïa'”É<ã5^*|{fyèÛeéæy1Ô3´ú “èàƒfëùßÿþwY€Ê|˜˜ qØCS˧`#NkeÙðrÒ“ÜlÌÛˆ:ýôÓY°Ç{`p1f@ŸaÌ«m©LæÑ'§Pýà?à(Ay(…–¥%K–°Ãœ½öÚ wyƒÄ£€’Eb}JÊZ€¨mÏeÛ>)œ'©Eð'ÎqÓ¯e3¥ùHqºedôÖ[o1fá¼ÿ©#q¶5 ÇAtòÜÅO:%íéê®èˆÒão€æÔ]4xßâ0O.Xâ°G}”;vMj<°ñ]{@™Ì3(à•+¯¼çGAœ\M`×_F=3@Õg˜DL–10_¹r¥P˼VL‘% ˆÃ˜‚%ÞIfyùÌtÏ=÷HâTq˜ìÁš3Å ‚ðò—¿ü…3YÀ™ ,¿’Û‰úŒ`^mKZ%Sbæ±hJAŸ‡ÿå?=†ì–8>qö™‚À˜Š÷ˆ~ÃÄ@Aá „U•“%‘=ìŽ}ùo¦ [“Q¼é@¼œMPz,Ür÷¸ul[³à^»©W¿´èÒFa(½è™5~Æd–´£62¢qÊüÔž(·“˜Ç_œ@¹Z}$ÂÒaõ0yK`Uû3BÌ€Bð³Ð_E’`Så³$-ieg̈D?üáe¡e"ŸNÑŸ¬6†æyËd^¼ûï¿?ž8þ¸$®²ó<õOàJd-àWrIúÔR‰ ¬Žª©=½ºa{'¸ÜÔŸë™lËäÖusJßòV®Iò3a`£n¥<| YïV\…1ÃÀœy@±Ð$ §›¤rœï×5~;YÇl·–%V*ÝÜÖô·ÖõëŠ9Sjvc’T˜££"8¸ºú̚Ɯ*-Þ¬\Û¤Ö¦çÚOØk1ÕÄXÓÛj6“b4`4Г5ðb&óR¶Ml% èƒfåÒó ‡‘ÅùiLR-££vXåºOgÚÞ.„án÷€6nfN6½ÒÍÐ˘¤(Íd10°fg2/dÛVmØà&4’-¸H¯g?6Ö5“Ô¥™,FFQÛp”ÞÈ¥ýîÐb/7;›^šó§•¦+c’JÓ—Á60`³ÈóÙ¶eÖgc‡^εÍÍf:nâ,•”ÅÀhÀhÀhÀ¯4[L2m¯¹mŒ×H_êå^ɦ‰¤äÇ)n·Çõf¬­ò“`»–I4 0Á¼ò]a¡m=ïeGX¹!VòÕ\Ûk¹¬•lwd§Ä”yÂó8ìZ±<ßqf‚I4 0Á߀B„BrK—¶Þp}ËQÇÜý“¦M™RŽ–°Eí–J²­)px ›žØm`¥7 1Á44àXÁý5ËæY6­y³n¥Š˜2ÝŸÝŸÈ^™v&I>3€Ñ€Ñ€Ñ@| lå8 ޽Üu›ÊŽvÛnæ(>ÓhÀhÀh@j€8%ËÊùÌ& ™/n>UÐhÀh`ãkÀ¬KÚøu`8000&IªÂFF_f.iã×áÀh`³Ñ}TYüDZªO)ÆK (¤GÿŒþ³‡¨i“VÈ&Ê|q“ÄêmŽUÿ¿ÂXqÐCÚe·³óªƒS 9sšè&ÝJ^-3œNT;í£ &nB Q¥.‡yŽÄå,p¢Ý¨d» ¥I"–ç“‹‹3Æ 2,¢'ϸqã@h‡.ੜ"bÆ›/§ˆ›·"Õ¡Õ’6´üÆV[:ñÎX6=þ|íÓ &n* ©xm²^‘¬ Áèÿ*¨Ï˜¤Ú™$á龕(`ÈÏyûØKv£p,ù©§žª¥ÈAèÚt5Q‹©MTó’¢ÅT]Óøñæe)výJ­°8iÅô'v :;³\«%mhyµbªš—ú ZL-Í@ưŸD1!|áÂ*•¦uD—!fœÆ‘Ý_ngÔ& †~ÐAù ‚‚ÂûS€µõÀ)ég;“$rΚ5‹¸Ï&ìÑî»ïFN ]¤NvmÈvmvmY*&a¶`’€¥„ßzê©§ðQÉ?Þ<ñ¼ÈÅE¸œAÂõT[4” LH€3žrN;YnL:ž-QÀˆU9räHR´!Ûã…Šk šûì³[Ž¡%qμVKÚÐòabªšS½´ušªº»ï¾›Øè0†ªñ€ˆ¨|ÕUW©e * U)au$ñý€Ú>yÇfΜ9vìXÐ.¼ðB‚š`q¢­#?} «b–ÔÔìƒ&èÛ”)S0”DãëΫMâts‰SJ@Ìjbs1f‰Dô¢ÊæÍ›GÐv"3ŠJ„ƒögé¬1I‚ aË»&c`©¤µ¡ÐÕHêdÔ†l×fWK!EŤÅôë×@F'NÄÃ$Ø)ha¡ÐÕìÚh÷Ú¢Ñ8aˆ9äžòÚàɶ§ƒøB„œ<ãŒ3ˆ¨EÂSXbØÙ¿ (T\KÐÄ÷Æ«bæ…Áøµ×^KŠVKH¡†–SÕ§‡RÌ¢PP§Ö&J6l˜_:"³¢²œtºêµk×]n¿ýö#,#ïã˜1cüøƒ5‹ŽFÈ:^°;ï¼SÎVI³a—€SÄí£ß@MÄäNëW#©“7f¸z²Ç,H a³é1p€ 5C A–ÕÈôa|.Z´ˆfG0EúdµP™B$Ň~øÈ#$,%áäÑ;ðÚhôäDv#à]D ( ÌΖ蘑¥âZ8p uD˜yzWÚ®èÁ´Z¢t5´|„˜ÍKyU €©¥ o„0Ã롱a’FŒ!Þ7•šHaøàd¦­£°¼ÚöIÃT.]ËÔ©S©n‘WUéji ÒŠÉû³1h³‹‚`•Ú$Ýý÷ß“j›Se>‚f Ž¤D¼ ì×?xÑ0Ù¤ËDúƒxàœsÎ!ª0Þ‘{壓Dô+Db‚FWŒré{q¸` óI(>^r5 ¼²]›][V¦0—´HmF‘‘´û0" Ðh©Ìîÿî4:1l—(̨(…G"@9ÝE€Zœ‚*®%1å!øäÖ†Æ ðéÿ!fÍ RL-MF‚¸'¨tÒ¤IãÇGϳgÏös€y!½·ZG,âgXû¤éŠa €6£LTëH>òZ1%BÑÆ‘]Øbad«“”#€š:’DðFE]™B‹âó2‰Š?% Ÿv Ð ÜPÙ#<â·G„ó)¸Â#ÆøÉ'ŸÄ?Âsƒ9m$u3\½VmAZL‘…–ÖÉ´< #Aq;ÛÕW_ýÄO¬^½Lº)´ÏƶŒÝ˜‰ =,d{Ì‚JÒRÌê`ÐMoÁP_ à¾ûî“b´DºŒ(/­˜’BÇ-M\]Œ8ÕÁ͆ùA|Ïú 0‡Â;&qÔ:’ü€¶}‚€A$T7c· &0‰#²H=H@[G~úÖŠÉÓ˜!,;°‰£GæÎ…á›(±3jsРA¸«¨Z pÝu×1×F·áO¬8ÜÎ$‰^".YÄ'^;e3”#¢1c:`5º6’:o/6.f¸z­xjA‚CÁ-w?Ãj(t5»6Ú½¶h‘(¢Ô‹`ð¤à—]tÑE•Ç7„¾4‰Úíñ Н¥øÕWÈŽÝ|ôÑG¹ûWд$hBËkŌмЕ¼k1µ4éùy )^ˆqœ$¢`Ë|dþ§:ò?’°¶}2´gšöÊ+¯$ù]wÝEmÒÅjVG’¾´bÆo Úì‚83Jnj“>R׵ɗžøÁ”¥P;ÍÍÍu$©b.úuî¤~å2¯²ÎK‘£c€íg‚®@eŽ—JxY›]>õñ1E.ºP¡&ñ³Ôìþ¢P,È:ðÀѾ|DÌà25#Sh1Üý3þ§EáÎÐÞ"hGm-iÙÓŠ©ÅŒŸX>MV¥à,ðLVGZ–´íS‹©MÔÖ‘³L1Ù‡:}útæ¼0 ÷H”¾¿Í—ÃÍ3ÇœòŒ3´t"ËßPR–IŠàl³yÄx'–ŽôÙgŸÝl„ÚÌé u„7ÇÔ3$bê§ÛÖ`ù&)‰QtV¯ÛÊߌñu¼Ã^O°gŠ@=¡Ž41¹ÓªÛFÎèÙÄž #£Ñ€Ñ@7Ñ€Ãк›°bØ000pøg»Ñ”ррÑ@hàÿƒŸŠºë›hÅIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-o.png000066400000000000000000000325521477365367100216670ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ'“IDATxí œÅÑÀgæ{° +‡€DATŒFÑÄ<ÑxÆxcŒBQÄT¨$&‘¨ Šx ÷Þ»ïͼï?¯¡fzfçí½8ï·¿Ùžžêîêêžêªšî*ý”SNY¶l™ý" Dˆ(Ð (wá ëz<¾[f*•Š2TŠÍ9¢ÉÐè“ACJÚÇñ›6mZf÷ß7Þe:IÄI ÒA"‚H 4|2è.Å­¨¨¨}ûör ±eË–D"eJšD‰&C4šŽ3¸Y’¤u”ˆ(Q ¢@óS`7³Qó7µØ<04-®ëyš–Ôuþö­–Ðt®q®šãO× M'°¡ë\uÇŸÀ3“ý'¯–¦™™ Wñgj3£¥5-ÉpMi™t†«V“ÉÔj™ZÒYàæérÔJ¥@Ä’ÚèÀÙhÃ2º^hÿiºnÿiz¬G×óí„–§Ù (™KfqM f¤é‰,?²Ó~c²YWC—üH—Œ‰aF’e´,3Êhp¢, ~²ù ˜é],ÉæJ6cʲ§Lµ–©Éh5ö5S%þ´LeÆþ«²ì¢ßדKjíãO)ÒõöºÞ.û"Q¨$ʲ$˜‘“ŸeF⺃1e¹¢œ¥Å°3XŒÉæGZ¦:³ã KªÔ¬ì5Sas¥l:Ëž*4;‡¿òŒUfeÊ(‚)µÅ{!ÐdˆXR“‘6—ŠápºÞÑ0¸Â€ŠtÖ3"ÑÞþƒܶÓ셚͒à5¹´S7,o»zxïÅÝÖf‹NYIÊÖòªê®Ø† B’];ïƒ;-Áw*mfdñWžM”i™R¸R–1Uh‚=Y¥™ÌvËÚ–±YZa8,"¨VMˆ%5÷ðð"ÎÀz:éz'Ãèh3 ›éØüHçÖþ<fT¤°*Ÿ7W9ï%/§­ E)«@aÖIe5&aß±Õ«i+kÊê_ÓæJ²·ü¸:ßuÙñ—µ7ÁŒ²æ'›+aª_V´õAa¨‚ÙœÈþ³5M[yÌZµ„^é•à¨_zU¼ñÊ–˜2Y~”±¶g`Iö†ÅUp¨­k«e•[v_¢_Û¢@Ä’ši¼úÅbýãñN°›ÙÅÙ« Ízà ¼“Âø‚úƒîã¼Öhš9e„r”Õj5ÍV”–fràPÂê W¢fŒÓºaX–àEuPÆØ‹¸Íƒt Ž“e=‚ûØ·pUûo'‚Ý ßaí “`@Î+…šaƒeÙ™“)Ÿ§ÇºØV¯]?0FÝÛ¦Ùì f´5cÚ\iGÚÚbÙ›Ñþ,+bR»¨Ö*S9³¤nݺ~øá³gϖݹ袋†ú“ŸüDæ4$‘——7uêÔûî»ï7Þ¨w=­¥«¾óí£·nO­^‹ÄKÜ5>cÁVl«ŠfaLÁâ‹þbÛ}í´S3ÎÕ¼¹s—­X)L-Yk‹]¦#ß:¬3Î8#iH%ýë_ËÊÊœíz©tüñÇ?òÈ#cÇŽ}íµ×œÞ´Ò²™ƒCáòÂ;sì!ž²kˆ¬ [EƲêª-<28ß²òLsëÇkòÒ¦  Ùú,Ü x¸eEÍÈhB¨ìEÆN5iq»fm¶Ì-ø‘µ)c˜¶Ç‹6qê¬Y¯¾ýöVË&—·ðiï‹à,[PPpÒI'=ÿüóJþ³,i1p0}ÒÞs7Ê+㪳osfIpŸ»îºK²¤.]º°_ó÷¿ÿ}}øá¸råÊ CÖÔÔlܸñ–[n9ñÄëgÇ R0&òi£ tò¨Q5÷ÿ¡x÷µ·W¢\³ÐDʳ‰.úo,+ûxÝgXI²º ʈmCÙnqÍ”Z¶ÝWÈ0ƒ{ïsòw=H%6ûŸuÖYLÙÃ;ìý÷ß_¾|¹ì”’J_}õ0.Î%‹8JÈú 1Ò™m·vÖžM³AwÔÕWÛÈzþi£7|° %m1¶Žh)u^Ûô¦ã‰;Y[K k—AI,Ñb%±]òÔÞª™ùϽðÓÞ½­\µÑ27Áª,k£em€så¡\/‚ ý^½zÝ{ï½ÿûßKKK]””wÁ œ ’Û†ÏOo-˜“3Krá:f̘êêêÇÜ•ï½ýö·¿ ﯓ%Q±œ7oÞ¨Q£X¼õÔ™%¿ªb±˜iJQÃ†Ê %ºéb¦ ”*(ø¬¢¢KFÇkÛh±}h;ÌÛl­m£Eã¸åŠË–¿õöý“'ïÖ$–{ì±/¼ðÂ|ðÌ3ÏôéÓ‡ü£>úßÿþ÷¡‡ú£ýˆÄ´iÓ°Rä¯Îþ<ð@Y§7ѳgÏwÞygÊ”)¼ÿú׿¨J„A àË/¿üŸÿüçŠ+P_yåQô/ùËÇŒòxÀÈ:à0êÌÓO?ýÉ'Ÿ¼øâ‹”ÅAéÍ ž©.¼¦ü5eÓ‹’æ>Öí7·ŸñÚ³ÿ>oõá‡=[]]sØa/Z4øF^qíµÿtPé˜c޽>úèoûõÈ:C¢$á] •’Éä›o¾ùßìoß}÷À×]w™ %Ôxûí·_ýõ½öÚK é7ÄM¼£Ç¦Lí:`À‡ió?©ÔÜššäèÑó;tüuéÖ;+Ëî­*{¨ºlň#ò®½2>þëŽ:¤bÄaKÌš5V „^,:ˆÞ×Y 0’#âç$ŠÆu¾©WŸŸw_ÐþúnÝß¾}Ò3×^³âùç^›9óÄï|Gñ{\ä·èhÈJL à¢<ù²G®Y'‹ˆDÀœoàdp5Ô²·¡XRçÎùË_þãÿ`Ž:ß4PgúBg®¼òJ¦ï%—\RRRrÅWðˆÛK/½ôÃ?|î¹çHÜ|óÍÞ )ë¡ÎþýûË[oy¬íoºé&8È=÷Ü#a „\MA¤°ë¯¿^‰]@ÿÕ¯~U^^~ñÅS3 ©¬“D(!l3?ÿüóqãÆÕÖÖ²pÉâ ´dó–©U•¬ªx¶ºjI~~ñСZçÎ7Ýz«DÞJ?þñ?ýôÓ‘#GBÀSO=UÖ%'°+í¢ï{ßct`:ùùù¸S§Nè“'O1bÄý÷ß_\\|ÄG(!›y¿1=âÃ"ŠØûéô§]»žýû_´27,YZð¿×—_“b=x¢¶lFªbý‘ƒ7¸ï‡VjsÆÜµ{ &•Ø\Ú¿Æ:>^pFµ–÷Èãû-xýƒk¯‹=ýôÄAœ“_pbI—[Æû׫¯z_yÅmÇŽQf7oÞ|õÕWKåÉ÷ë‘,"s€:ç§«¶V{JqûÖ·¾•N§!\UUŒ†—Yö¹UVÞ’øéO:zôhNó¢ûôèуœÊÊJÄ+&÷úõëIH`/¤|ļ簼õKÀ•Ö®]‹\Ö·o_Ä àÄ;>¿þõ¯éì æHA" }ùå—¬í°$XWDhÑz(±ÖÁ%o»í6¦ „bÅcFnß¾]‰™^ä•TÚ´iøÀ(Yl¾2!Qr»Ò^*A=×yZŠ %a7äzâ‰'0K’é…ôâFG>`Œ\=rñÞÙ!^T‹ýÝþaßûècŠ-sêâ7»±~ÅÅgŸ>zËÊ÷36µ¯MÇË+µÚ¬’XZ™_Z9€óþ¡å%®ÎïPѱcjê”MO=S\S=?»àºëÙÏÁg‡l­ŠËí·ßŽmŽ™ÌXËÇ.<z$‹8Þi#žÖ9?•´æt() -×Þ¥’ý6Ì;ìììÀ)ΰÀ¾ôÒKˆñ,þÁVÒ`HïJâlT¦7d0Èa¤E~”0/,>Òl$jX³f ’Μ9s˜Oò5׉R úF懒ÀS‰¼xä¼¢í‚ äúÍo~ãàä¬Ç•vQÉõTÞ2èÒ.&òi‰FG>`Œ\=R±@˜Í½† YRY5§¦æÑªÊÇñäãÞ<èÀ×úíózŸ½÷ë9߬Z‰Ùiÿ>UÌQ¦&ÕUõÝR®?=ç£àGùŽ]õQfúô+ Ú›_ð­drŸXŒ.‚lذ–g¾ Ï€9KÉ´ß´©s~ÊZy"KB,ç£&‚º´³K¨Ê0 ÞF‘Ù»wo¤}Þçwß}éà ¹uëVVû~ýú‰¥8ÙjÀ€Ôì,®L3㇠ÂÑ&(` D0ú"~c‘½ð EAÁŒmæÏŸ|Ä2+¿à†A y—öÚk¯=øàƒÑÝ/^¼mÛ6%J"S‰¼‹JÌWl[íÚµûÅ/~É ¢‰²\àÝdDHÐ/~²¸‹JRPÄ )‹È„ ñ¨#W”C,ðt‘nõš5_TU™ûöxÙò%ýû›cÆÜ]Y:­ »|ì̸5;U±²s»ÌAýùî)¾uò]Q½7–Ï̹,ÙöôÃüöã Š.-(<-/X"Q;”Äò$\xúõÈoà”ÓÆÕ#O›m)#€t»º_Ç”€=xúôéX7‚Ò£>Š*'ùö>–±žcåEx‘¯4u=öØc#.\8sæLn QèÖ­[_Û…O í]€!A „Uû€q<üðÃÎùÛ¾†!ŸR³fÍ’u†A ©p„ çž{.šŽKVw¡$ªU"ï¢<îÕW_ÅàµdÉ$üßýîw9¡ÄB²téRºC©'Ÿ|’u¢k×®¢J{?OŸzê)É@óc¹’Ÿ½K+!E̓¼ß¹zä7Ä êMg3_|ñ“´¹ØÊ$FŽzÄLßUYöB×.æÅN©-.U±fßžÚ!µ®ÅZÌ~wð¯€ô4,–÷ÝD»qɰ§ñ°§Â¢“ª«Í·ßêeYìöt$âê“gëbÖ œrÚx{$›ks‰ü%±V£È8?®‰Þò™Qå†nGËp ƒ|„<%æ·ÈñBBqföC=¼Ui îvÔQGUTTHaD¶R'Jûí·Vv¶SaÁM¿àA¢8Z*¬#ˆ¬-$Jžµ±­Èâ"áD)yà]TBVBlqv3'”\˜È['J2³á‰f@Þ;Fmgü†Øt~uJ‚ •q ¨WÌØ¿°]ÏŒÖÝÒz±nz –Ä.M§Î†®Ç&Ï2éOÌô§Vz­™^c™kM“ÝBÎrâ)꯳uÀü¦_$æm+‘KjUCd@C·êz®¸1Šl 8òÈ#)ȧ >®¡gåZI½áˆ|½ÛýZlÒ!ì ûQßXl#ÞˈímÄ{è±=†íÜIg6g²ÑéS+õ±e³§OM>Å7Ajz±tîò>uæ(‹ gë|¿ßÿýñà,>ò|ÛvÕÌ6ËAƒ¹2¹ ï–B^IOo@ž¯ßøÆ7äÑhgïœÈ+»éGg%"íéÅ3§!öw5˜Àn6jsÎ9l"¹õÖ[É0~“ÁUCÀ­·uò|eû ®¶ö‘ÊŠ{²ƒ9†=;UùŽYƒ/'Á››PèÎJ´»*¯Ã½z›3f”>9}h"Ñq·mn,„cv‡:(‰ìBÉ ßJÒ¡X{ÕÅqöt±›Žc;§všè@˜cÍì9~뭷ؔȾUœ“ÈSÑ¥^ïÞSÑ­¯Îþ‚}°Q€ƒZ|yaNÒN–†GÈáÇóŠ"ƒ<އÈñ;øîõÐ@ä9¸ÇîÞå]☛œ÷^Ê+Ý{é©ì™â‡ÁæL¶ªr뇼·›~ñ:{ðƒTâ a†0eßEœW6+±Ã‹½¬L‰Ÿÿüç>ø äË^zz‘÷›K¹"Eÿ'¯×Ö>ZUÜôÞ±Ãó®§wzùûZ%p÷Ä>>ØõX³!1uæFÛ//+hwQ¯žÿ=»{v&c¯`˜èZNŽ€IO'Ñš9Š%qVç„ 'ÅqE‚Ô͈ D™µtÒ‰´÷X3Tc‡7Laüøñ¨ZìˆÞÏ»€·x@ëÔCëÎCvNLDÄ^jq†ž^pôÄ£0ȉ?9άÁ@ÙûÇwÃr)`RNßЇ#‘.O Džœ4ì;W]u6;s§#'/òJŸ^z*{$‚Q—·Jä•ÝT„J¼Îü •x 4êbÀ”}ÅW”5:…çL„Vvä²ÕVxééEÞo.Õyt¶tÇŽcî»~Aá¤?©¹èíÒ‹^IW¾gÖr~Å–·­ »1‰ç_’hI­ÖᥗÎK$G$“Ý’‰îY÷œ‘ðºpð#²èiz:‰ÖÌi·2¢lžc ,›tž#µ?ûÙÏœ0 Uæ°›Ë{˜^<åØ=â%Â?ÇMÈQzP‡øµN=`Ç‘xl¤æl nž8'qòÉ'ÿö·¿•0aïÞ½;=š8q"GØi!a)¾³T*=4yP…ͱ$ò qšçå—_öCž|ï±{%=•=ÕžþùœD£·Êqe7•n 8èÆ-„Ïð>”}]p]ésà?ø‚b;y_|¨rM *‘÷Î¥"ØÈy˜“*Ù­ÛÄ 7ÞsÓ̓âñA±ÄØÓO-[üNѦíºí…®W*cÍxñBÝžß~ËÆÍ™×_=8çìKxÇ ‚u¾2.¢5óm(–$q²¢¼%p¬y Y®êb›µt€Âü³A1aZP§8ˆè*N¾·u2YÜÄÉ,Ò~?>Ìq°Ž]üœþ= /%!ÌÇ#~­ >Ð#éò@‘z#Å!II€ y2?ñË€é£tpXIO¿‘ÿýïÿÏþ3½põщ|p7…³Ô|ôMÔ"ç#WZ‰§„ 3ÄÞ¾‹âœéÃÞ‡P/Žøp‹šÿ‡ìS ÞP‘•°v좧òÞ¹Ô@ä!;o˜60  ašü½¦×Ž8ú˜Š¢¢•OÎèo$ØèÔÕ`†iE}H,/óåV}ò£÷]n¦V˜©µXšÂq §aè)‰ßü‰PŠh1BbãX†<Öì,"ÒHTåò.àw*Ú¯õ ‘·×±eâ˜Q808„A÷i0Gdxd%D¼Ë¾¸¾ûyh òèk¼TènXy¤\Èóbx}(éé×£N8Ÿ3fÌ$áEÞ¯›»àìÁ©ÄS fˆ•}ÅQxñô$ó6†.»ì26 6 €ˆ! ]ôôCÞ;—ˆ<ôÄ Õ5×\Ãyoé””p,·týú~_òpmõýÕ¥ª)›mUgŽV]”ÏŠa;MùôËãâc“íÿ·]§q…Eé… *ÈïÑi—³‘ÃÓS@¶Ô5KB3™<: þzH8½Ž„9Ö,V±Ès·,JJïÞSÑ­‡?×]Hìzß O)PÂÙÀܹs¹Â×äPq<™ôm ôÐ@äQ ð 2iÒ$„=”8¹›Æ…<¢ ²Œ×g€—ž~=ÂX†b¾eËÙA%òÊnŠ".‚8{pA ”êíƒÁ¯ïT 7G… “懃—?ýéOø d>Ø~%¹è€¼w.)‰Lsaæ' §¬yÈ_.Ÿ0¥³.¼pY*=­ªêîÒmsŠ;%¯«Ÿyb;½´v¶p€¹™Øè´‘~pò¤ƒ^ôó›OíÖu¯ì·m/‘C¢X þáŒ[ýŽ5‹>+½ Êòª×¹5- ¢×é3 ˜¸!‘gˆAI©µ¡È&+âVé À…F!¼àò@»Jzºz§ƒëÁòpKâBUyÐMA³ “D²B¤Ïœ¨¤ì;:#=rEô¢Z ù,Š‘ðN†ä]eˆ¼xŽ;î8$qäqY¹¥vùy½ ã+sP,1 –ìgÄm?);úê†3tïš)6d.O§Ö™–‹IâГŸ%1˜WÄ•’­·H¢XR‹à5Q h5êê&Lý ƒbŽPl4©³fÂ#ŒÇ‡Æ“ƒâ‰ýŒÄÞz\:! šñ疹̬åïÝtju:M\œà ûÇã#“yŸY漚¼n7éÓˆ%5)y£Ê# 4-p6Ð;f’H Ž%ÆýŒèvÊL»ÃWš©%6cª]‘No¶v†¸Û)D¤ó .I­Í¤9øòßÚT JJ1v?Kuzw<£»ˆZ;gˆHDøžOˆIG„d‚žccÂ÷@¡npâ÷ÀX‚Ó¿{Çb èfw<â¾ñø™y…|ÈÛ ‡*ºN=Än©žG,©¥(µQ 1)P“ÑÖ™æ’tj•™Z¯¥ WÇðBM'ä/{šºñAFrÿx¢w,ÖÉÐkµLyFáK‘NÊË?!^€xeÇ6bÕšõ‰iD^iL¼=uE,ÉC’(#¢@›¥\çMËÓéåfú3„ÍÂk:²ÑSpNM”;þzÇâ]ˆ¬Ã˜2½â1D¤Á±<ñõÀÅFl³f»X±=®7û/bIÍNò¨ÁˆMOxÍjÓ\šuþE Á'_7ˆM€í‰ÐäûÅì]àðDrx<I"U¬…†ïð/ÍÐß"–$"JDØÓ(€§J|,M§ð‡ ðJ-c›™4ƒÒP_#q`,ÉNb@I‹8$Ð5£‘[Ĩ±¤=mFý‰(à¢ÚÜFËZf¦Þ7S2f¹fÙ,I3PåØ7ÀŸ“‰²•öj!£’ûŒè±ÍÙ%ŽkE™A¢ÉÐvßÌÝŸéÆçfúßkh&}h,1TOà †!Ÿã¶vöËâ@\S£±¤¦¦pTDÖEÜ'ñ'Y‹›y FìuÈ©DôñÂ;ݱzŸ:s"–ä¤F”Ö„‡õˆ’mš Jäƒñe392 I¨ÆJ„²%±q·êgg®½ …GTOx 4ÝpàÕŸÓu†–jÓAâ)œ¨vMW¿¨¹ ÄKІ K\|íÆ[mSç¸Y±ðO.~#"Ȱ‰žh<çwáíÐÔ85°þñæØJ o”áPRIZ¾{ê×t—.]Ø6½jÕ*?€ÆÊo+iôÑ$>XQÁXÿ‹˜!ëq³$$=JÞ|óÍDÃ!?þöá—œlÂ-ùرc••â]™ïÍTB*3½eÉQB „ðÊPè~ÅEÁz‹~¹X˜†”ÝtfÖc8\'³èµ’JÊÐò+»é¥¼ ¦÷ª„TÖé-«Ì3f ±í¤|Úˆ™~qGpsÝ 3Š;ÛmŠÑ$0.gGål|úöíëÌéxz zsÜ,I@¼õÖ[Ä}†1Á9äo1‘£ …2d»²¸²-/$a¶@’€¥„ßZ°`2*ÃÇ›'ž¹øîað‡D=U6MÍ&$ÀOñÓN‚[&É–(`Ī8p 9 ´xñb™FâáÃ7D©F§u>œÓI¨cPIø™WRIZžâÊnz)¤÷§#À¼u>ûì³ÄF1HDDåÛn»Í[¡Ì!P%àEÄMQ¡rŒ$¼3៼c Ü9çœØ 7Ü@P8ŽA”cä¬_¦½ÝÌi2x‹÷ìÙ“ oS¦LQýIè×M7šÄéæG$NÙ#Ĭfb£3ÉL/žòQýj–$ê"la×d ,oÊPèÞHêT†lW÷¶BŽ’SRRÂû?~üx$L‚æ Ý[\í^Ù4s0DNæ)¯ ’ †lˆ"N%Ø"c4qâDVWæ.ÁAiEI%òy3]ªD@7]”—ýõ&\Ê:ÁfH=L6XÒ€Äûæ­Mä &`ìO•c$ŸºÊùɃ`ËÒ2}út†[ñ„|ï¹ê·Ênò>‡œ Êâ¢fPe4 B÷ / ߤwÎéE> N×Éñ‚p_Þ’àEƒe“/2êt–Ê)­fID¿¢K() ~Õ í‘µaßìÙ³aŸ„âã%÷†÷†lWW¶)Ø%3RYPd@¨WÅy„‚ÆLźOü?–SrXÄà5"bŸ`£¢‰åB}sV¦¡F§’0y’iåüDµ¿îºë&MšDò™3g2š,±J‚ø‘¬_&”Ý ?”ÅEåX”`ÜŒ&k¤l®)F —•ñB¶B‚Ñ©¨¨Àe˜È ÀÓY*§tCý%!ȱ¾¡`;[e)`:Š)óYaX„…”!3•ÅåSg"<¤(ÅêD ×âÎ¦é Ø5räHiØ€&°àbšq3c¸uZ:œOëL7•>è‚RksQI‰ž²›JÈð™ ¯Ö°À2Ѩß)QRÎO%¤2S9FJÈvÓU¼_¿~ .ÄæSp½G¢uàs¾!(1asØ”ßxã e=ÎLž-|  ÅÅÀU~uâÍ ã¥£²¸³”L‡‡E\c“kqÙ. O„XR'?"Ÿ&\­Yof$Zl *¶’‰.ˆv®ÊnÀ‡yÔð:ÙÙÀO¶å7FÀ™PÎO'@pZ9FÊ" 즫8·`ÎÕû‰Öy¤DÙéªÓùÈ™fÃô9éuÔà|dkãH¼±ÎÜ(í¤_ÇÈhœµE馠À×aŒPš0î4õZU:Ê] ¶&¶*Œ#d" D؃)`lÛ¾ÕzîaÔµˆÚb˜¦ö*)A=–ÛŸÚöª" ìaˆÅIÝÐ;cQâS¼‰ßÖɨ;" ´ ÄÛ}µqceEe·îÝØmÄWí¶‚z„gDˆ{þK£¢<"7òIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-p.png000066400000000000000000000335041477365367100216660ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ)mIDATxí¼Åõø·Ü{_ô&REA@±+b4à?–ÅŠ=&ùˆÑ`‰Ñ5Ƙc‹?c¢Áˆ]Ä®¨ÄF,{AQ1ÒË«·íîÿ»wò;÷¾½ï¾GÝës™=3sæÌì™sÎΜ£vØa|ðý" Dˆ(° P æÃA×õXl½ÌL&ez©ÔÉf³eºÞ)¯Öõ*M«Ò*]+³ì*C¯4c<*Ó´„{Õã¶ÍmÂ0$SÓ¹òg8NLÓMC×M×]d¹8¶£sçæi–îØšf;ZÖ¶m]³u=«9GKkNZÓR–•ÑŒn¤4'©9ÍŽÓä8 Ùl3 £Qsê÷üT:š ÑÛÑò6tÄ‹@ëÑ—¦~÷»ßMœ8±¥ÍÜ?_|ñN;íeJšE]†?æ°Cº:gÍq}~Ú´¾]º8P«¯wêë´5õZ]]Ó7Kâ0;q4ØG:“1bæÚL÷µ\6cèÈŸcÁp47Óósl2sëe´€4Zòܺmåê4aq¹l¸šNëYÀÌ8¼Î­Æ…+O¬iNjj:  ×Tkµµz§Z­S§'gÎì:dÈþ‡®ÕvÒ;u2jkµD¢(*E¬e8rÿlå¤Ó}Š[uuuMM—@+W®ŒÇãQ¦¤‰— ¼ÙµºÖ]ÓÊëê{Æb}ÊË»jzGëbk­6ë”ë:/zË›Î[íÖ‚ðÂÏ—éfm?Á å•„Ë>Ý«Û-RHaMº¶ÂήÖúxl•î¬Ô´åº¶LÓç­Y½Ê4ãÕÑkjï\’£¿•gúY’¤K”ðR Ú0úºfÓìe=u³§arí¦›åÈ9^Ùã59©ŽãŠíü³4-£9¨W\-Ä(Ç!¬å*xÃZùÉá—kßÈÉO&úÊ{ÕLÔsG‹£¢ Š¿öÆÖeU9Ü„çÏÒœ5š³Ü¶–:ÖbÇZd[‹,km}cYõ(•íL°¨ºÍ~ÅmóëA»bŒ½Ž3Ð4ûæ6¦ÙLjõÑÍÞF¬“kµqåšõÿ\¾Ó†<¥Ñ±ë5§+V÷jsmÌq°ã4å¸åãNÒѰã€ñ~ FC»2!pðÝú b*sÜNéz\×`¯•:Zîjp­ÈåTëFn`çrÿ4£Ú aÔhF'ÝÀ¼%ëñ¶(êôæ¬M땚ÖÛ0釗U![Õ9ö; “ZàXÿ³³_g­ù–µ­rmÉèß­[/KBF€û 6Ífl[ëkÄ|x ½RÒCQòã5Ž½Ò¶Vhö*Çý[m·$VÙöŠ\:é`zn‘˜dòÍ$é¦s¬%wia:ÞtGMÊ\«‚¹ø®î­+CµpäÜÝ:ÖŒfÚÅ0øëª·\»F7Ý½íª›]t£V7ļhs“ccëeP‘“=G`«ÏÑÄ.s»_¯Ùß ee¿´³ó²Ù–×öV¥·$ l-,©J×û™æv±Ø ÃhÄû›±mt“_rŸ\"”ÔÃÛРÙËk™m-svkiN YfÙK{mgsìD¼Z®8°–‰œMv‰]\×CÒÍRd“Ûà8ðY—ˈ¿ó’T%ÖßÕЋr†Px{ä¸OÍ@,õ6ÄÝZ{Kv¹æjÇ#ô¸cj‚¤H‹KrLÊåPVæÓ“BŠôÖ¥7_ l™,‰Ïä0 íMsH,¾Š÷Î}˜þâmÁª²þ» A^äfÿb'û­åZ=bø°­Å¶Å{(Äœ¾Ãí:¤¨jË΂¬ãnjÝÛqÇYckó5Ë¥¼îÚ³óâ¶ÜÐ{"j_ÓÜ;Ε¥5Ùð~<RˆUnmš†ªˆäµ;&wkÔì…Žõ¥•™ge礬ìrÌRëc!ÊF×MŸ[K‚ÇŒK$Š—6âØ¡«4wV·0 ÖøÖ╎½ÐÎ2³¿±²®!Ã5»Ú 9ƒ+ì&ÇqÖi[Ñl/jfC.þ aŽY­#^£å¬²ìÏ´,CÅb°L]묬((Ôý s[#æêÔº‰1K T$°ÐKÊ44Ds8{¶ØD‘û€¸:ÏÎ|fe>±2g³K¬È %©µ©'¶–„v4ÒL«@óLWÿ0e1O,r™ŽËw¾²²ó­ìBËÂìe=9”{ƒülá÷†a„üð²É\>ÅNN—M­eURûî--ínËŸ5­§ibøl"óÆp«8œ‹ˆâ'˜”¸å3â@Ý诛ß5Ë©ßÒµåŽ{úØJÍ|deWZ‘µ–p›Þ¿æ;ì°téÒðˆõêÕë ƒúì³Ïd‘O<ñ”SNyöÙgeN)‰²²²{ï½wáÂ… ,(¶ža±Øv½È}€¹i¾Ú±?³3¯[ɧ2ÍÓÒ·$þ/Yÿ`ªyf:õF&=7›Ylóµ‹Ïê|M×ø¸ÃŸàG²õRP’•l*!þèG?1bÄðáág:ÍVíu¿ J|ðÌ™3ß{ッ¿þzœ*2X: =áOŽ®yÔQCGŒØ~øð/,X’LòîÝlæ¥Lú±tó=鯙¦7¬Ô<;»Bs…  e å²36…ñ%1§è Ôc{˜eßWW^uö¨‘{TVvnnf‡˜ú ’­æ_o‘ŠŠŠüàsçÎÍm„ð>qÓAÊû œ8 =}E6å[WO/ê·ë®»þáEºuëvÑEy9”|äKüô§?…—ù2ƒ·©TjÙ²e—_~ykÊV°¨¶Ô¶¿a=d™?úÐW÷>¹yåáõK©[rJýŠËëîL6¾˜J}™Í®±Ý|öJ;lH,ÔŠêÖf•‚’¨ccQ‰íà?þñ=öØ?ýéO XÛ!÷_%J,N~øa}}½R™VB¶ïû‡IÁw8“Êmi°ùY‹ý[sÃÅ k&Ö-ËX÷Üñìþ»MK7ü×J­[ÚsØ c–®³w¡òó¬nžRÖé_UÝŸ®íyGm×s+«Ç$ÊøV¨ì¬2Ó÷"ø`¶ÝvÛ?ÿùÏl<öås«¤¼Ì×wßSßméóÓWáÆ½-Uq›4iR2™¼ë®»ZíÆw¿û]¸Ì‹/¾Ø*$cÉZ=nܸb%¯gÓ©Ó©s'Oî;aÂyØ”LúäV›¦iúŒE¡D7}kcéTjJœ:þøãkkkƒ'«•(vä‘Gú¨¤TДù†¸Ý‘CQ§+Õº ŸûÿN9%Ù³ç¯f>ŸN¥ÐàøÒ·iìhÆv4ãÃÌÄö9EÞäþø<—µ ÙK7{8Æ>‰2;¡5ëÎ×væ}+óv6ýN&ƒŠz•ÝÏÕê~2x©T`à”­5?•5l:™a—DÍW^yå£>òMÙ‘#G¾ôÒKp%Ù¥ï|ç;3fÌ@d}ðÁÅʼÿþû¿þúë»ï¾ûÏ~ö3÷ÜsBŠüy¹ꆬ3˜èÛ·ï;ï¼3uêTÞÿüç?T ; ù•8àÐûâ‹/ž{î9ê‘u†DIÂû>”‰Ä›o¾ùßÜo»í¶ÀçŸ>™ %Ô˜3gÎË/¿Ü£G%ä†D>ß¹=zùå†dá—iPgÛcN™tÁÌ™'üçµÕ—]\÷[iXvErÕÙÆí´]]! ‚~'(¾ôí+?.^}my—':õúðàï=wôÑßuç¿§OÿÞÁ ø|/‚¬Í›@Ÿøä“Ožþy&†Ì÷Qžü|=’EDB9mÄ£'ƒ¯¡{Š%uíÚõ7¿ùÍ«¯¾Êõ¾i Îô…Þ>œ}öÙLß“O>¹{÷îgžy&¸=í´Ó>ÿüóéÓ§“¸ôÒK|RÖCC† ‘·Áú3XqøîW¿úÅD„A ¹š‚Ha\p¼»€(þÛßþ¶¡¡á¤“N¢fRY'‰VQBØf b;묳°Ú°pÉâ>””Èç£Òyç7þü±cÇBÀÃ9ÚêùµŠ’ÖŸô¡Â&L`t`:åååºsçÎuuu·ÝvÛ˜1cþò—¿téÒeï½÷VBnHäó‘¯G ñ% ñÌ™\tÑ®{ïÝcàÀ2™››ÛXw|ÝŠÙ“Ï™ó““oNÕ½l5³ÅL3×¾6ûŸ\§ ÕŽf¾ûi¿—ÞÈžwIÉ¿üC*}IUÍÝ»_~ÁÊÁOßÜ}§NPfW¬XñóŸÿ\øð$?_d‘PN SÊd•l ‰PŠÛ~ûí‡÷ ×ÜÜ £áe–¨#—¢ÊÊ[¿üå/8âNó¢ûôéÓ‡œ¦¦&Ä+&÷âÅ‹IHà ¤|ļWêá@$`ÈJÿûßÿË „xB~”xÇÀ·ô‹¹ s¤`ÿþý‘Œ¾ýö[X¬Š+"´h«U”Xëà’W]uSB!Y0#׬Y£D‰Ì òJ*-_¾|`”,¶_™(y}é • žïp5E’üqÞ¨þ󟘥*+9 ¢!ó q»#_`Œ|= 1Z<î¡¶2ÅbÆàíþ¯¹™ƒúõ{êî©=ü°öÁ‡Û®©/ÿv¹–Ì}` ¨íú~Ñêš*?ùjb¼ZsŒì±'ô[¼x‡tó3e‰S®¸‚‡~W_}5¶9f2c-Á|xè‘,âM§xÚêüôV²)§×.qDËÅ8"¾ ó{aa^q†öÉ'ŸDŒGr)l%- \I¼Ê´à† 9Œ´Èƒà…ÅGšD |lBÒyâ‰'˜Oò5·ŠR úF–%§yñÈ{EÛÈõûßÿÞ+ †AÉ[/í£’ï©¼u·®Ý-òi«‰vG¾Àùz¤b‰0£ùù_`,ç+Gßæ |»s—Gû÷¿u§á·Ùë²Ôêç*M}§Z–#ŠÙ6Ê]ŒÍ‹Wì¦ÅόלøÚíô3o¨é<¡¢¢Ìôî“’­,Y²„4ˉÌ!áó@¼¥d:ß´iu~Ê6ñD(–„XÎGM4tio—P•a@¼"³_¿~Hû¼Ïï¿ÿ>Ò‡rÕªU¬öƒKqHd«¡C‡R³·¸2ÍŒ5jWD˜ € ƒ=Â苊Eö„N3B´yá…Xfå0(!¯ñÒNž<ï?èno½õÖêÕ«•(‰L%ò>*1_±mUUU]vÙe˜Ì š(Ë5 J€ÑMF„ýâ'‹û¨$ E¼²ˆLH™6òÆÈ×#å <}¤së\´¨¶K—çfÍÒÊÊGŽ;䑦¦[ËewÜ>)aýªyÕìÞaÙO+Šóθìɲõ/5+.-ëüHuûk»M©ªÙ/‘¨]·£Sl½„Ï|=Ê7pÊiãëÑzímn7¡X|Sö`v aÝô JwÜqªœäSØ;øXÆzŽ•áE¾ÒåÿøƈY³f=ôÐCÜ€D¡c |­Ub¢]£ËÀ#$p”°jßxã0Ž[o½•åT–åÍG_ÃÏ©GyDæ‡A ©ð /<æ˜cÐt|²º%Q­y•àqÿþ÷¿1x½ûî»Hø×_}Q(±°ÉˆîPjÚ´i¬={ö5øPØûyzß}÷ HšƒÈ•üÜ]V )êÜ0Èç#_ò 1¨Gs½:§O§·ÍÙ¬^V6?›‘lžÖ³‡uÓê—]\ýŰÚ€>-¶'Çq÷=¹ŒFâ¤xõ_+»M¯éq}Mç1锳j•ðb è&HÄÕ‡'9뵞›uN9m‚=’Ímv‰"ü%±V£Èx?®‰Þò™QeÊ”)²óh¾a§Äü9AH(Î̾å–[fÏž-KH[p·}÷Ý·±±Q #¬U”¶ß~{¬ì7ÝtfìÐô $Š£¥Â:1‚ÈÚB¢$àé \ÛŠ,.^” #¼JÈJˆ-Þn…’yëEIf–žØÈÇH ííQ¾!ÎGº|uJ‚°paù†u©ª¤i»;Ú>fÙPßÄë–4€¥ÐuùÚ‹ƒ`ö辚M¾œN}‰+áµú/0^ûPO|\CÏ*¶’6׈|›Ûݪ vè»ìIÇò­w3Œ]ãñ}ce{ÄÊð-ásc€é —uh|_9ÙÙY6Í%?Éf±^µm ¶’i³¹²¤¶ ª¯Ò6£¢ÎÓøjˆn7q tôóIEˆN8ŸØÎ4÷M$ö7Ë*¢“å8Y][`gßÈ&_Ȥ>Èd8˲‰So£ ·U³¤Bñ¨Ñ-•Rtêm{ÅÄÊw5ø±kùœë6LÞ„Z‡_º7¬äÌtò݈7­?!Š>v»~ñè.¢@D ¸V$>àfËvp,÷|&5=Ó4ÇJá¶OÂAìIlÇGðŽFœcÀß/«3 ZµÒ¶×í9(ž¨|¥iÃ.âÛéðëYæÚÖŸÛ¼_‚ÚP ›§Ù]YlAŒ|×ÃÂ]lA/|éÈ{k ŸÞ”‘ÇyÀÿøÇð}é8Èv¡’=Ž:¡³ûµ×d€7Á˜œDâ–{ïKî¾û•uG×/;£iùÝéú/í áh×Õø̧ëØ1ñ*>Õ=XÛýÒªÚ=ãñе;ì ‰Vø„-ŽUù:å½í8zz[)1]*K s¬¹U ªÎWœ=cmö ê,ùß•øotä•X‰Löj{?8€ô= O¥Sɇ!·lC{ã78¯Ç^yÎÐH€'ƒ¬G&ò¿¾ür6ò®¶×Óéëš&Ô¯8¥aùßRõsí gñ–¼ ß§ÇÆ«þVÝ}Zm÷É•ÕÃc±^¡Ýl„tÌÐô”ým¯D[X’÷Øò@9ÈñQ3ˆ¢wPð©7GY\x[çû=þžðà->]ò|ÛöÕÌ6Küù2¹ûqƒùäl,ä•ô ö Ùø:pà@y4ÚÛ /òä»™ ÞJD:dÏ¢†8XÜ×4b»Uب5~üx6‘\qÅä˜|“ÁWCÛ`ë^ä±Áƒ 5'“¹©¹áøºå“—ß‘®ÿÜæÈR ob&Ab†ñÓ5S«»ßׯæ±/NÚê[*3°;Ô‹ž’È^”¼À›NºÕꨲW]œgO»é8¶ƒ{*ч0ÇšÙsüöÛo³)‘}«8'‘§¢JƒÞ‚§¢ ´Î÷{~…}°Q€ƒZ|yaNÒN–†GÈÑ£GóŠ"ƒüž{îIN¾ƒïAO%"?hÐ v'ðþÐ(ïÇÜä¼R^é3 HOeÈ?„6g ÿyùv3A‚>òA*ñ¥0C ˜²ï-]òüÃf%vx±—•)ñë_ÿúæ›o–|9HÏ òùæRQÈco‚7ñ¹ ÿ'765L¬_~ÏwöjœtŒ3rˆwrä&xÛú,Xš¸þ¯ÿLÔÜZÓåˆòò‘ýú1ÄLÆ^Á0\”càCÒÈõ Å’8«qÔQG1x§v®HºQ1³–Nz±k†jìð†”çœsª;âÏç] X¼@ëÔCëÞCv^LDÄ^jq†ž^pôÄ£0ȉ?9άÁ@ÙûÍ5×Ãr)`R^ßЇ#‘>O%"ÏNNšÀ öŸüä'Øìä±» òJŸAz*{$‚Q—·Jä•ÝT„J‚ÎòA*ñh´:Ä€)û.Š{¯(ktêöÛoGX`uaG.[m@žAäóÍ¥¶!/xS¬Sç3þø§º÷¼´ªråÕ—Ù§»ÐÉòÈýÙóµp+>Æ,¿º¼ËMI»óƒ쑈¨Šíݽ{÷„3Aùˆœ«´õWF€m¬«_Qâ%_¸IåHí%—\â…AzGA•9ìæ ¦O9vx‰ðÏqr”Þ”ÅaùZ§žV@³‘š³)¸yâœÄ¡‡zÝu×Ilà ÏÀÓ#´s„‘–òà;K¥Ò@)ȃ*lŽ%‘WˆÓäÉ»WÒSÙ#Qíĉ9-ˆF#n•ã2Ên*ÝpÐ!Œ[%žá}0(û.ºà»Ò#æ~™ôÛ™ÈûâØ“o2PP‰|p.•ˆ„zqć[Ôü¿æ~˜Zð†Š¬„µ`=ó!œK%"Ùå)Âf¥XŒ¸x/¤’/¥Sý'_›|óôŽ2èq0 -“Å—Õ=±ã‚eúÙ?¿±¦ËŒtÓ›Ê%±B$ÂÐ3D5Jq£qFã4´CbôâòX³·ˆH#qP•Ï»@¾SÑùZyyq[&Ž…#CäqŸsD†GVBTyôÑGe_|ßóy(yô5^*t7¬<Ò >äy1‚>”ôÌ×£C9Ÿ÷ß¿ì ‰ òùº ° œ=ø •x 4 ±²ï¢8 /žžäacÞFØÐé§ŸÎ&€ÝvÛ yC@úè™ùà\*y艪sÏ=—óÞÒ)¶p\Œ¿ÿÍ7O:ùÜdý‰ ËoJÕ}ÎÖ‚2wã›LΪ|»ü ³üúŠ®÷vîynu½paçõ]8øˆžžrc]C±$l1Ÿ~ú): þzHx½Ž„9Ö,±Ès·,JJïÁSÑZ¯»Ø÷¾…AžR „³gžy†+|M•ïà»Ò@‰È£àAåÊ+¯DxAÐC‰“»i|È#Ú Ë}陯GËPÌW®t5ñS"¯ì¦€÷¤€³$Å•x’fˆóõâpsTQ¸0i~8xùûßÿŽB6à³íWò8‘žÎ¥R‡£á”‚5ùËçÆE©gÏñ'œ07›½tk–=6öû¤£µ}\xng0‰²y‚OŸzæCw˜sÇß÷jqö$2EÂÐÓ­zãýÚá@IÛŽ5‹.+½ Êb ouk ZDoÕg@aÚ†D ””ZŠŒ`²¢!n•ž|htòÈ >Ÿ´«¤§¯Gp:¸,·$>T•·ºé#rôñ’HVèƒ âY•”}Gg¤G¿øÅ/d£$¨C>‹¢7“tp2@ÞW¶DäÅ‹pà"‰#ËÊ}(ñA®²¼¬›nì¥iGÄ+G ï¾J<°Es¾“}.Óôd:I:/‘ ГóÈf„/J”x¶c¢XR;bUQ })€Dƒ¬Ql¨›öÅ!|m(æØÅF“¥àMÈG.ü‰ ©Þ9'6¹…à)£[­ÙoZ©é©¦·3B„¨M<:©¢rh,þhªé­t)ÇZZm§u€ˆ%µN£"¢À¦IÌ.ì`ê¬ë£ã‰#•XÁ«<`Lp¶‰?–iz>•\b·l-öeÓ¼¨²Ööx¦ ñ«®<:v ('¢ÀæAW "܆ã̳²Ïd’³íT³n÷0LñyNœïí©›ûÅÊÆ&*úƌ嚽*ø=UÓ-+¯dÔ@#N s­¶;u*pK*†Q 62°"-µì×3xÓ|'ÓÉ0ð‹‚“9÷óœ®ãŠ`'#ñýDåNñ8î.—Ùë¼`EšPVµ{¬ Õ§½ƒŒØjÝšëÛr²û±¤ H쨩ˆI!4qT×(O¥“oY)Ýp’*r{šš°…Ôcã⣠¶9¡Êƒsl¢ìDE7Ý=ËÂçs½ s‰cáœWälàkÄ’60Á£æ" t8š°"-²¬—3éYÙä*Íêiµ9gr0&D¡ÞzlL¬üÀDy¯˜±_¼|'3aˆm9Ôºifa|ãdç7?u\"–Ôq´jŽ(°1) „¦UøȦŸI'çIme.§ÍuÕLü^Ðchv^D¹ÛÖ0Ý5QÕ…øZç-[z:bI¥Ó0ª!¢À&M„&LàŸg³O§“sìTÜÐÐæ8» ëAhrÿ üš™±&Íf—æº#¬°ŽÈðŸq?öVy[â¸V”DP š ›ïÛaéz:û¯ã¼—jb&—}Ï(ï½Ö„äá"]©ã˪—úcéTszÃ1í°ÃãÔ‚üሯ„Þ…¢Ìˆ ‚ÑdðÎÒ›+A8­šLÎ?¾~Ïý›Fí“÷o—ÑÍg}gΆì¦«$Çš|Î9ôÄiƒ(S.#A¢É°L†5í¤æìîºß¹ìšH`z-îÜÒ°æsÃØ0ãîgI>„¢Ûˆ¶< `=:·ªúøxug·w¾n²ãéþLÃß›Yy÷ç+Û†üPžÚPoT$¢@DM–#ã±ÍD~D0-ÿ VyxYEµÊÞî}ŒXR»“4ª0¢À¦Nýãe%ÌkB¼jlY™/ÂxøÂCF,)<­"Ȉ[¶™»äÂðÕ™mŒØ„DÕèDŒ¬¨ú%ðzßûen”ˆ(Q`K¥ñ,ß´Òs-¼ê²ÉÛÁK.W™ zŠH“Ÿ&ßqØ—D&Ñè8}ÒØñ;'#–´¥N¼¨_Ôø8“e$n¾¦‰Ÿ—Ϭ˔O‰µê‰è|àuÇ|ê͉X’—QZÖ#BH lÖQ"Ïg³ï;RÒ7eKb÷6nÕÎý|{FN޼âsºÕÐòÞà à)œ¨v!KÙŒìg)Èã_àD» VÛÑ9~–D,ü“‹Áˆ2l¢'ϱÇK8B;t4N%Ö2Þ|‰­lÄâí2J*)CËoÄžækº[·nì'þì³Ïò´WþæBvM⃌õ¯½ˆ²?KBң䥗^J0òão~ÉÉ&Ü’Ÿzê©ÊJq„®Ìf*!•™Á²ä(!Â^xe(ô|ÅEÁ6‹~ÅX˜†”Ýôf¶a8|'³èµ’JÊÐò+»¤¼ fðª„TÖ,«Ì™4iR2™$ü‘òi;fæ#ˆw8 7W ›a&CâÞv;b4 L°Ã;Œ7ÎÛø 4È›Óîi?K ¼ýöÛÄ}†1ÁvÙe—|­*C¡#©S\²]Y\ÙV’0[ IÀRÂo½øâ‹È¨ ožx^äâG¸„AÂõTÙ45˜g<ÅO;EnAš|$[¢€«rذaä€R0d{ø†¨¡Ý©D£Gæˆ"êT~æ•TR†–Ï×Í å þ”cXt?ü0±ÑA R#Qùª«® V(sTI x¸’ÈÉ7FÞ›ÎOÞ1nüøñ€M™2… &pœ|QŽ‘·~™v³¨É,Þ·o_‚¾M:FIô'¡_wÜh÷œ‘8eH³šØ\èL"S‰’¾ i5K¶ w—2V°ve(ô`$u *C¶+‹[!'ÉŒéÞ½;ŒÎ9ç$L‚–/z°¸2Ú½²i^Âq8™§¼6Hò„íEè ¾!'Ï:ë,²žð”P{Eœ5²=|CÔÐîT¢Ndo¤*,/(ã×\s 9J*Ñ‹`hù|Ý Ržjƒ?å)ëDßyç÷ØcØ=K A/^¬Pæðnó¶È[åɧ¾Dp~²®°¼ƒ)<1Q1í•¡*åùšàVÙÍð“AYù€ÐçL0âÐQVêÐÑ„ÈC† ñöŽÈ¬G©&_‰’¾ iõ7‚£ñRñ‚M›6MÎVóN·u2«“+³?I²!ÃÕSÊËþ>HeàF3¤&,ièСâ} Ö&rP0vȧÊ1’O} åüdÁ”ËÒrï½÷2Ü¢H äÇÈW¿¸Uv“÷9ädP5ƒ*£Iº3f ßdpÎD¾@¾1’=âá¾¼%Á‹Ë&ß›éCÉû¨ i5K"ú]BIAÉW©ÐrY{ø=þøã°OBññ’ÃÀC¶+‹+Û*)Ø%3RYPd(€7Ú}¾JPИ©X÷‰ÿÇr ‹¼F„KlT´Â# ñÍW[˜†ÚJÂä!ðäV†Æôáé½-ÐÍ0”Uù •u¢ "ž@Ò›o¾yâĉÐùÝwßõbâKóBúVïàùŠˆÛ|ó“©+Ô@Ê‚238Fò‘7¡ì¦hu2(.x±` rÖÉš $ Ôé#Y Ò(f yK‚Å.ìÞÌ6£ä­D¦ÕŠ${úé§½ü¨¶¶VØS„D ˜é^xùh̘1ˆsÊHê.d¸z‰–7¡lÈ àKûB¡ç+ÎìÄì ΂‰ø*ñÞ¢·³¸]}õÕ3gÎ\½z5X¦xø€n‹î†%‚üE‹1­ ëŽBÔyYCÈ†Š¢RÈá@éfµ@UAVBxôÑG%V>*‘ObdeBÙMYCÛÊ:uaâ †9x öAdÏõ€ …wLÂÇH>ò&”ó"¡ºÑÝ>Œ8¢ˆ¤ƒL(ÇÈ[¿L+»ÉÓ“!_qj€'Ž5Š+ ê›h±#F³OŸ>ˆ«ZvŠÄµ×^‹­eÛ©DÉ PTÚÏ’Ä*á —ÌKûÞ{ï½òÊ+T*GDct:ÒÁPèÊHê¼½ð¸áê•Ø l¹z†BWF»W6-2yä"< ä² /¼ òȆT…àJ&oÑm·ÝƧÉûî»EL ¾¡ðT ?`Eßá›Ï<ó WïZ•DbI1ÄÊn <ÍyJHe,³¼„´Î*ˆ„ç­'˜&€-ö, dÞG¾1ò>’iåüDµ?ÿüó¯¼òJB?ôÐCŒ&K¬’ ùÆHÖ/Ên†Ÿ Êâ¢rÌ70nF“5R6×£‰†ËJüÄOÈVH0:¸ óf*Qò•.Õ_‚ë ¶·U–¦£˜‘2Ÿ†EXH2SY\>õ&ÂCŠR,¡^Š-îmšŠ YcÇŽ•†=h .¦/0Ãíe½ù!ÓA%¤º ÔÚ|TR"©ì¦2|féuÂúø@&Í7FJ””óS ©ÌTŽ‘²ÄnúŠMøZ!³ÍÌH´ØTm%?]í¸*»Y>Ì£Òëdg?ÙV¾1’Þ„r~z §•c¤,Rb7}Źs®Á÷H´Î#%ÞL_ÞGÞ4Ó¦ïÍQ¦[EIYªp¦«#AðƆۚŸòu¼DF³5SoÃô}k#”&Œ;†ž![é”t”ê-lM ‰_Q ¢@D)`¬^³ÕºÄZ¢â" Dh ˜˜ÄztïŽzìÛþÔ.µG•Dˆ(Q ( ˜±xB7ô®]º`QâS¼‰_QUDÀ" Dh/ Īª«—.[ÖÔØÔ«w/vñU»½ªŽê‰(Q ¢@±øÿi1_ö׋~®IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-q.png000066400000000000000000000270101477365367100216620ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ 1IDATxí œUµõÇß6+‹¢(¶(›Ö"àR•ªØj¡­Ô¢µ(U[+jQ´hݺØjëÖÚÖ¬ÿ®à^¤à‚(ÅÜ­JÝEE‘VAdŸõ­ýΤ„L’{_fÞ{3àä}pÌÍ=99ù%99ÉMr¢}úô‰øŸGÀ#àØ2ˆmbx)<@^%ùvàðlA$TY¢Ñh"Ñ"&•JùH"ˆo!²=øÆPôÆÐ„-kIòwÇwäZþ~ñ‹_øHˆŠaˆD"Pxc@EùOjý®]»vëÖM>X³fMYY™”˜x@|cð¡t𡱱±…J’Xû€GÀ#àèüòv‡Àî3õxìx•dÇÅÇz<‚€WI»ÏÔ#à°#àU’ëðt^%uì>S€GÀŽ€WIv\:gl,æÚÜ);'’¾ÔmFÀµ Š zõêuÄG¨™ýð‡?¼âŠ+Ô˜BÂ÷Þ{ïW¿úÕB˜x‘zl»ÿÞ÷¾÷ý柶™¥Ã;ìÝwß=äCò‚ïNi²r¬âpáM¶Ö™d޹› µ³#¨UUU ¤µMäÕ´„[Uöb•H“¡[§’öÚk¯Ë/¿\Š»ýöÛ³_sÉ’%2&(pÆgzè¡Aoe<¥V­ZuÁP+2²Uw‘Ù¶§HÅE‰ÍþG}ôøñãÿò—¿ôíÛW-¯¥O?ýôõ×_߸q£Ji [)ÛMx«HÖ™”…צà©u-£wÞùÊ+¯dã±Ï£‹œ!g2,V‰LÎÓ:•¤IyÒI'544Üzë­Z¼ùøõ¯}=ö0ãÍêrРA£G6_¹Ä¸‹Ä-k¯Z%’©LÝE B©m"qëøãŸ0a‚V­"½öÚkcÇŽ}ùå—UzëPo¥l7áÏÄZ"µ 2T›&O’X‹/Yå ¸75÷гæT"+ñ–餒05-ZôÆoÐdÕ" 2äÉ'ŸD+ÉHÌþ9sæ¼óÎ;ûÛßÄÈ|ÐA=÷Üsûì³Ï™gžI€s‚ؤñï5ÿ¾üå/Kžf wïÞ¯¼òÊôéÓéÏ>û¬:×p †§žzêÓO?ýæ›o^uÕU?ü°Èb¿ýö»ýöÛ—.]:cÆŒ/}éK2_‘ f:ìóƒ>¸ÿþûwß}w™\É*|J|0â½ÿþû>ú(|$OG‘$½ÐD*//á…þÙüÛu×]ñYgE$U è©… î°ÃVÊö>¨Ž´QkoBgòÜe—]^zé¥ë®»î­·Þzì±Ç¨YIPGoµ¿Ì'HþüC&‡À”ÓÌ]ã#­ÍF¼2Kdå°µDæWIÛm·Ý…^øÔSOÑFÕžF i¾À¡õ´ÓN£ùžxâ‰={öüÉO~Â+O>ùd)þþ÷¿8ÿüó½I)ùÀsàÀòÑ 0F*ßýú׿Fƒ01‘4."aW“ð‘G9ûì³Ñ•¬ ˆä¿ÿýïkjj~ô£Á™ ©äI ¯HÛ4Áÿüç?'NL&“ \2¹&’Uø ”~ö³Ÿ}øá‡£FÀï|ç;’§‹H*±ÖDBàc=–ÚAéTVV âm·ÝvÆ ×_ýÈ‘#¯¾úê=zì¿ÿþVÊö>¨Ž´U±(šV›&O4/ ˜"Oš4‰•FS†t ^ñ¸Í6Û0™]½zõOúSI ÉI¼™»$VÖf# ´Éø­1Ðâ*k<ðÀt: põõõÔY’a—2••Î9çÖ¿ÇŒ“Éd¾ð…/SWW‡yEã^±bIlRÊW´{ë<\ˆ*[é£>Â.ëß¿?æ ñ."ÑÇçÒK/¥\´]”# 9~ŒeôÉ'Ÿ`˜ ’PUüÅ„y剱Ž&{ñÅÓ Ë‚¹~ýz«HDšÂ[Qúì³ÏEÉ`‹ñ%„qI%ÖÂ&J g.c%=ðÀô¨Ûn»e©êêjø˜”AU\táCêH+‘µŠ%jmZy JZf8°üá &¤#HÎjà’K.amŽ–L]ËxMNkî²ÕÉT2`6ñJ-QE4ºm,Ú=í1¼”E£¬Dä"‘L$Ò˜ËÕårës¹ÕÙlç÷%ß-)_%1ËEøl6‹ØôaUxÔjÎ0À>ôÐCTýGe¨ID8œ’‘„Y•™J‹ÚÊ žšo]DbzQ#¨N‘PpX¶l–?º¢|A^‘°’`(ðM*H$‘UxñJýËøŒ.à$½‚ùé”)SäÛ¼"IJ3 ¡dˆ*]¶["6ã‹.|Hi%²V±”P….„çÊ•+I"×ûC:‚ä¬Dr†5R“3$w5• [›Me4:¸Ç¶o-\8¶²rûh¬G4¶m,Ö-ë‰VD¢åÑhŒÎ‘kVI‘&•´!—]“Ë®Êf>Éf–e2f2[”zÊ?qÃ,ç£&3 æÒL•YG 7ŠHfàXû>øà«¯¾Šõ¡R®]»–Ñ~À€b(¡Ä¶8Qµ_¢rx¼bh¬bh¼b¯xÅñÊCUG–u™PÞmRE÷IÐWu;­ªË·+*z« ì!(ý«ü* ½ÎR‹…wÝuslÕPºñÆ™ÊI=ÅzÇüùóÏYåÅx‘]šRÜ|óÍÌÌüñ™3gòBÉ„nùòåèµ¼egvÍ\€…,‰]DbUûšk®Aq°~©~R¡ç3_c!ŸÏ7³fÍ’<]Db,=ï¼óŽ9æÌ+ÍV×Dl­Âk(¡ãžxâ ¼/^Œ…¯îÿr‰ä_ÿúÅ!Ç;3qbÇw¹k" Ja™Þ}÷Ý‚’ŠæG%ò—TÍOi+¥àÙ>ÂÕ‘V¢ *FT:“§(²0“ù+C:‚@@þU“ Üä+MNâÍÜC*®²¼|öÿ¿w,ºpÊäIU]'UvC ŸJDî¾×UúDLÖÌí3Lpšæ8-˜QƒbeßHTŒzjÒM]¬¬úbÜy³lKnE|r½/‰±šºQ?® !øÌŒ©rî¹çJ™˜”iÕ _aO‰Ú1&%•–=mÚ´gžyF¦2X[h7¦3µµµÒ‘dyEÚm·ÝXe¿öÚkYašr¡ƒDr† T'‹ ’›£H‚ž¢µY[‘ÉE@)\xè5”°•0[Ôb¶J$Mù¨Š$# ´ƒðf ±ÕUqtA·©_‚‚ÈBâÃU%d±`K»3 HT3~Kž#ìþóŸM™Û?¦((YÅæ¨svíUá-YeØfáéCãåýq¨Ø¬R]+_Î4Þ›ª¹¡qãõo¨«}¢1ÉR‘ú+|ÂVU©’Èp¸H¬f/N¥®¯¯ÑXóQ.•Éå`T¢ ýøÅøÿVš$«’ RI.ÇšóJ~¨:(9{Æ:öÎǃïVù;\x«T"’½ÚêÇJí•; Ž”…£¤IÈ#ÛОþyÎë±Wž34’ (-Yr#Ðfá×fs Ò u‘ܪh.û­‘/ î?­aã•u5s°eZìTÞ”ŸãÅ ."¡ìno¨»-‰VJ³M­„­tLeõ6í¸7 Õ*I=vÀ·sëM|ÔÜ׿ÿ«;€6ÇÚBÖä‚PͽÀЭžoÛš¤AßÅ~\¸c…·âi–!ÙøÚ¯_?y4Z-…Š<ñf1ƒQ™ˆp¥)g«ªØL®e™Àn6j7ŽM$¿ûÝïˆ4AAãòhæÞ*áUÎ46ÌNÕ.¹ñã§<õôÓÉd êA¥hv¿˜ÁE$ö Ü×ÐpG²vE$ƒ-ÆÖð£Êª)/¯Út@¢eæÅʯ’Ø}/Έ³§‹Ýtœùîw¿+q9ÖܪCÕæ©èÜù~Ï/üÎ6 pP‹//Ì©Q ÂÉRwá¡1b]Øá_ùÊWˆ :øŽý¬ÝP ðÜcwý‡LéKÓ‘íÞDÞzg€‰§µDDŠF›3ÙªÊcðf1ƒ1/{¢´Ê‰ .U ™µì¢Dê_6+±Ã‹½¬4‰ßüæ7S§N•zÙÄÓ>¨-(<F´$j…­È(JæÛÙuõ5‰±cŸXºtã¦k6èG4Ñ’Ù‘G5AÙª‹ wÄ“}3êg%k76oiê_Ñu€l|0*å/¿Jâ¬ÆQGEåqRœ«H°º©Q!­–Bªâ™Çš[u¨ÚL’;ù’»zÈN•D„ÑAì¥gè)G™î‰W.ÂCÉ}rœY£Ý°÷ÿ²Ë.#†ƒæÝàÑHÇ©7(<;9¹>á /d}çôÓOgÍNì'FSxë&žÖÉE=®àÀ°x´ o-¦˜˜—=QZåbä­bȬeÉÕ¿LÖ(Ô 7Ü€±ÀèÂŽ\¶Ú OSø ¶Tˆð¨ê—‘žÍqœtÙi§„1™°ÓŠa“Âs¤öW¿ú•J€õÎUÆX5‹·.‡ª­ÉQA¹Ã©Ð8R3ÀFjΦpÍç$?üð?ýéO’ÆEx*žë~ùË_r„š–õà;C¥õ&€B„GTÔC"]ˆ!tîܹAÂo»·âi-‘`{ÜqÇqZP ÔÄXëa¬Å´^cÀÑ —k!¬rÊÓðy«ØZvQ"í/%¢ üøÇ?ÆÐã,† ö¾X)Ö ­Â›m©@á19Ï€R£Q±žEK“2›"ÉWjÀýb‘ÊOAɺÒôÆÚñÄn‘²x4zxYõ"6v§’é\¤W<Ö7ïKô‰ÇÙŽ0¿±‘=™ªT…„ó«$É]ØŠò‘€û±f—CÕÔ<ÅADó,¾™;Ä nyï `2ÅÁ:vñ³p Þïá"¼°UÅ!”/¨ÅWØ´xA©ÝY›…—‡x¤}$2Õ„'’™ÚV<ƒJDü~ðƒ[n¹…R¨åÒ„/¦š0ü²•Ò*§$p©b³ì"9fw™bÔ‹#><2Íÿkóõ,nCÅVbµb Ï áͶT ðÀŽNÍe!KmŠ$^aÓ7•Ø=ì‚§äöj*5'YwzE÷î‘(Ó·qÕ;Æb=ØöÝô/Ñ'VÆΩòOµ$G‡€7jHl|ˆH¶ŽÇš%½ `qÀJ»] èTtPîÚ‘nÉ\ `oc®³–ÉÅŒâ#Aà"<×§¡±á±•0UfÏž-™k߃n(Pxækt*l{VyÛeîšðt óÎ+žA%úæ7¿É÷ÜsÌ‚€)|P1!Ö ¹ìA£´Ê)Äp©bkÙEr&¼Üô$ÓQC§œr ›öÞ{oT&† Ôð ÞlK žÜB5yòdÎ{ËK)¬"}üñÇ|J‚fß}÷¥‚†¿ò>¯4E¤ ž’3l„çÓÉ•MëÜMÕÁñÊS+¸B Û÷˺î¯Ü©éˆ\+ióDIMÜÖp~•ÄÌèí·ßfÎÂåÔ[G\Ž5‹@ òü JÖÛÌSÑ!¹›Gºƒ@àÖ]^iýÍExR!— Ì›7¿è5™…vðÝz@Â3)à•‹.ºãCIœÜM£ iƒ!fÞ`âT"˘˜¯Y³FÐ*¼µ˜"‰HÈe¥©Íw0•¶hs¦¢haÂü¸à妛nâB6pgÛ¯äq" ÏáͶd™ì\Ú'K)ó°¿´;a4‘¸>1öY‚@™Š~ĸÎeÚÍeÕïÞ‘."AÉǵA‰Ä芊 U]ÆWTWmÚ±É>ò~±²êÈæ%%Všþɤ ËZd×¶¿…(iÛ±f!«õP5¦,viÞ­1ÌÂ\î ÅQx,DD²ÎژȈÆ!2âÑz€&F‰„Ç^Ðî _+žZ‰Ðth=T×’h¢ZCŠ©‚>*D’¡FiÊÙ*”¬eç%%úùÏ.3%[òÕHÂfc^K[ ð¢#|ík_ÃW/}7EBx²Vp5I´GdY§qçŠÑlêÔšÕÿnÚ-P´_¡*©h‚xFb#€Eƒ­Á%ëÅf\~L̹kLl4)IL9ˆ;¥ªëÑe]¸wÉ<òxºþ‚ÚõŸ¶ØLî’.ŒÆ«¤0tü;@gC`hYÙ™•]¹’{Qò–ý¦äÆêkÖgõO"y†8éÂôþ•GÀ#ðyB€¯l75Ô,Î&]Vˆ–fRÉbª£& ½Jú<5'_@x>•º¹±æÍ,[ÂôM&’û ›a«w²TXx•¤€áƒ@3O&“·4Ö¼—mº ’Õ¹ìêLnkÒø{•¤â=¦½û66NOÖ.Ë¥ƒ´—ÉqÓ[ÑÁò*©èz†Ï|Ø¿¿±áödí'¹ŒuýúƒlºÅ~ó"Ú«¤"éÙx>w°–4«¡þ®dí§‘Œi½ŸI•ÂJjqÆýfì­R帖ô€|c脽ƒ‹½ïi¨c¿Òø²®Û)Û&ÑPK³™l"¡ÞÎYx ijiœZ?.b©þ¸3ÁGz@¾1¨-pçäÞ[nn¼í–úQß®>¢nØü[³ßA³ÿz]ÑAµØ*ɱ&íò@=qÚÀGJCÉâCçl ýºu;>ŠvižÂ½•KŸ“©¯my5Pὃ³2-T’ÄÚ<€†À.ñøéU]¿UVËܹéºKk7|VÔ£$";¿¼­Áî=;Ë3™›jžL×sÀRî$)Á2n±˜mÄÇz<fÞKgnª¯©ªŠ¾ÁQ’Ò`×ni)M.ž«GÀ#ð9A€sÿ+r™wÒi.·5w^Ho%Ž¡çàè\ü3•*]½J*¶ž³G Ó!€G³Ìêu¬æ[-Æ/ok€têGw÷Ÿ¦­­Tøü*‰ÝÛ\«þý柶'¥“´Ë-ª˜¥«n5tq-¿% ÁMáxµ+µ$[ &…Ï•¸ÜŽƒ,“m;Ä´PIørà~rñãŽqœL!›èñÆ3~üxÜàÚ¡d*$ Gó…dѱi‹RV”¬®å;¶°ÖÜñwƶé%K–Xß1rk¤èµÉ~E<°2cü+"žŽ¬Z¨$aéþùS¦LáB~îÛG_rn…kÉ'L˜`åÈEèÖx3ÒJi4Óc¥4MSwó2—6›~­­0—Œ¬ÅT#ÛPÚÉ, nEÉêZbk1Mä%žZÀJiå©% z<餓p„û£ ‚bÅ¢VGx^!Åti !ÉÕ|KQ›8&4hÐèÑ£ÕŒ§ðjL)Â-T’Èॗ^Âï3Š }4|øð \­®ÐMOê$·ºl·&·æeRâf !qXŠû­Ç{ •„îþæñç…C.~¸»Á|ýõ×ñzjÍÎ8&ÄÁo¹§$8· L<–-^ÀðU¹ûî»cuÙŽZëH¾Õfûd\aÆy' ¦8òd‰ŠfoVÖ:Ò²àÑZL÷Æ`MŽ}€ës~è`Å* •´6yàÀjéðÌ 8Âe9ñt@pcPgÓJ|»«Äm[6L›6 —ut°;ï¼S8Î6¹s`‡SøícÜ&üò—ÖozR'­£»z’;f$ÈÐÙ¨g `\̓“eÓ3}œË—/§ÙáL‘1ÙÌTÆàIqîܹGy$n)q';L^aµÑ8Éñì†Ã¿3fm7e+™cF°-:J4ê7󌮴]œƒ’‹%âM×ò!ÅÔ'yÐO£´òD6\˜aõÐØPIƒý-ˆ'ÓÕ‘™µŽ‚ÒZÛ' K¹ - õT·HkB¼YGÖŒ¬Å¤?;6kr‘¢R›8¡›3göBšmJSøžZÉÑA8‡/ ÐÑPÙÄ‹Hl4<ô1äÓ¨0oii*q›Ã•„÷+ŠÄ$$ˆ¯˜å2öb,ð{àPŸ¸â£“3Âúź–iM—íÖä’^ „P uI‹TéµpHr(±B5zó‘ -•Õ}üÿ1œBÀ †®î…¹ðJ8(gôÐø¸dTt”Ä’‡“>lu©É©>†ÓyÁJ£´òd&ˆy¤S§N=î¸ãÀyñâŪ$Z˜©ÞfiIÄcPû¤éŠi kBiÖ‘|¥¬Å”yCHr¡‹…R­Nr „ðÔêH2Á~te -Š\¬ˆ±˜D“zJ·9`™¸ÙÃ?¬ê#Ü‹õÌaeDxÁ‚ØG#GŽD8«'u€stWo-ƒ5#+¥ˆÔ\¡%§u²ìŠÌB‰„0dÞÎàvÉ%—ÌŸ?ݺuP2LÑøÀÜ–¹+Ĺlw̨U(9V“nF ¦*ØJ˜³gÏ–ÅÔP"^z”—k1%‡¶¬<1uQâT sèÖ±=CøCÀøL“4fÉWjÀÚ>!@!⪛9È 'œÀ"ŽH"qk©üeØZLÞ:6† äp@'6Œ¿LP˜¾‰KQ›LÄ0WZŠÀÿøG¬ † ‰œÕÕÕ“'Of’t*e!á*IŒBíI¦Âï8‹XÄ0•ã1s:¦+t«'uz/:ÎÑ]½ÌT ˜ …´üUvñ7oõv¯æ¨…gÍšEŒpO»ì¼óÎé<¶!¬°¥‰´ºlwÏÈ%÷ê@* CoΛ7¿êZ %ÁS ‰¸œUl-fòd§þ¬”VžŒü4nrgÄb§ò1Ã8°e=‹2õ•VGê+¶¶O¦öguÖE]„ ò™3gR› ±V@‚êHò—k1݃5¹`ΊŠ›ÚdŒ”Ù•¢6™á2?øàƒ2ÔNmm-—"‰HÆûk®¹†1+UX**q›ÃÝ—„寸Æ[Íž¡€æ(Z¤Œg„AhaeÈHkrùV ¸SŠT ¡ª­M®fMņ¬Q£FaUÉWdÁ .³hC€Ã_u¥C}›7\ ”°>(‚uÖ¦¡dÏZL+¥{dá<Ù•‚±À2‘iPYE²¶O+¥5ÒZGVÊ‹©%0`Ÿ´XóB)hýHä½Úæ ‰fŒšcMù™gž±òQ#™hc°ˆ%Ž=^ø’ÍÖ¯šcQ4}DBùuVeÂcâhM®¦’awJ‘D«›Ö&—ù`ðĈe Uõñd¡åBd›•‘ȱ(!¶U‰"ˆ|CþZ‹Bïòªpžìlà'ó ª#I ¬íS%[ëÈš¤ÀbjÉyDrþšýHäÎ+«j¤ÆS}¥†iÆ(}5&$ŒŠä-‹ª555!dö>ÑcÝt6JFŒMgC¬ýËëë¨ý1ʱp+)Ê"VøjbPÞ>Þ#àðSë¢3õ =@Ûˆñ!Àå¸MÛ¸ûT€G Uü;í’®Ú) IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-r.png000066400000000000000000000345161477365367100216740ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ+wIDATxíœÅýÀ·¼÷®s”£ƒTш]ÑH, v Vbƒ šLŒbb×{‰IÔ{¯(Ø0F• ¢¢¢)A‘r×_Ûý÷Íݸ·;ï±ï ºûy·÷ÛÙßÌüæ73¿ùý~;E?ôÐC?üðC-¼B„9°p â¡A×õH¤E`2™ Ý\ ¶ÙÂÆÐîACKÚÆuÝÿývËë7¿ùMèfIÈ77€C†„ ‘h{cÐ=†[iiiYY™*++£Ñh(y2$l acè8ÉàI’×!°…p«9ªiQ]‹jº©i†®š¦;?@ü ÕÒ5ËÖ,Ͷ€Àù¥5-©Ù [KÛöRœŒ¹9ÐÂm”5|›%…ºV¦ëeºQêÜõRÝ(ÑõÌÏ(Öõ" ½4»VÀ£è1Í@Epêqψ!—¸ûiáÙDŽG6¥4;…„²ídNhvܶ5»‘{hšUgÙµ¶]«Ùµ–UcÛâWmYàgËÅOUr uERkø†@én=š]5£Üлè¿2Í@‰_,£Åd4'ôÜ$b„@ùæŽ$k¦HÍmýï”L¢B´Øº ¤Œ¼»;ó’ñ‹#¤l»Ú¶œŸæÜ7ò³ì*Ûª´­u–ó«´¬D(¸ÚZQßéø¡HRT?ÖP¹aô2^Ü £§nVf…ntÓ®ºÙU7Pp„ÅD—‚&;]Þù¹$‹"ƒN ‚0q5‹=ÐüÂû¿.ƺæ82›…” p FQÄj5kƒempäTzm­µ¬5Vúk+½:#³BååqøÜ’ßi‘„1ÕÇ4ûfÃèc˜½ù!}t  ¡C42ª€yDÔ·ý¢÷ Ó Õƒˆ;6”¸;¶U³…åX[Ø\Îc“ŸH‚Œp¤— UÊ&Ê3¤füPx£30긥„g óPwLÅ&³Ñ± l!„|åð‹ü›‚Ë5£ŸxjR‚BñH¹P©ÖÛé5¶#¤¾²Ò_ZéUüÒV…,¼Bà¬ø\…†ŽÐh˜L³¿AõÕÍ^º‰s‡òËΜxÔq!ç{!ðÅÔh8_¬Ì=cà8¾«Î¶ë4 “ Öv~õ–ãÙA±òÅéÁ-à j,ïnX^¢'ûI–!ð?6…Sà ¸á>G0áù*5š\`œñ…•8f©ÞEsŒSaŸvÉn™¬¤ÇIÍ uRs]Mˆè˜ÛØ&4[¦SRáÇÕ…%è(S¶#¤VZ©éôòtzeáür%‚ß~|ÛDR‘®÷3!fd#20#€>=t€>Êó‘m…#<&Uv«¤É6±Òë-O ^:ÓÇš…K¦¿5É`‚yšî[Jウ¦ËLðÓiG¬d$‹Û,ÊW†7ÁŒÙX¸:ö¬ãVÓ ´ËîÜu“ÌÏ,C0µT¼ˆÞ2„çÂÇPdGT9÷Œ’U¯ÙèS«¬šÔ +õE:µ4•Æ]… ¯o+òI½{÷Þc=ž}öYÉ‘Ÿüä';ï¼ó¯~õ+Ò   àÞ{ï½á†æÎ›;DJOCfF›¦#€ŒÈ#ÒSwl®h,J»·âIG=tG´›uVz­ÍÏ2~g Þ1¯¸í¶¿Üþ×wÞ~´L‡qÄ bF>榶S¸DÑ>úhÀ Ú /¼PSSã&ÒOÒø·¿ýmòäɯ½öšƒéÈ(çÏx@æë¯½æ)gj‚úμ'$X¨†Ñ—œŽWÎä‡W®§aïÕÓX·Ñti@DZ‡Ð¦‹­TÓ@)HYŽ]‡œBUiBj¹…•ü"^’Ná¥.*‰šSûæðöMäïn¬¢¢¢ýèGO=õ„»Ã¼I:sWœ'Áö*‘'ÙÎzÌ[$!}þô§?I‘Ô£GækÞ|óÍ›,ÀÙgŸýÉ'ŸÌ™3'7f<_»víþð‡C9$£v4¡ÓX{™æ0ÓjFP‚Ž„Û‚¸tŸf›+錣-Gã¦tœ6m§Wó³7€Scá«´ca¥œ›'õddMæ1¡­®«?ÿ’K<$å.ˆûífã’;S`&û{ì±4ÙÝwßýÓO?ýè£$‚’¤5kÖ€ã‘\2Š˜¢Ã¥3ÂË[Å6²)ýu:ý‰#ž¾ÑO©Ê_4là€óOžÔO7úšŽ/Ïùéf¹cM;òH\|Ôm'W&LÈ)GŸÚÕЬH“Âèû©˜yÄ®»<>oBMJ! 2)fk`Íýïéžh ¸þúë_~ùåêêjÏ+%ç=89*΃Éc{•ÈŸr§„ä-’£g¿ç›7b»w'LømIÙ±E…££‘UK–À=wmúë}àÀ ,¸í¶Û„jOÍŠì²uIŒÀž :º’ŒÎ[ç ñçîNDÂÊf#Þ¶±1È,¶ HêÞ½ûÿøÇ7Þxƒ6êîi€æ ;Ü%9묳h¾?ýéO+**Î8ã ^ñxúé§þùçO>ù$ÀôéÓ D¬üßñÇ­yêɧRTúxYÏkŠº+o|²´¨¶Ä ¿ÂÙ¼*ª‡°úˆ>6zð§þ¼ñáU½ö¬êÊKꪋOžøéé§Wôì5%Czõï~÷;Tž_ÿú×ÈJü¢—^zimmí)§œÂ²> Rw¹(æðáÃÝ!e›&¸jÕª3Ï<3‘H0pI—°¤`)Y@âïÚk¯SÉ%ÂùË_.[¶ì ƒ‚‡v˜L`“$¹‘=°‡$>þøã©„Naa¡@îÚµ+vÇí·ß>nܸo¼±[·n{î¹§³‰gl@AÅ7ÄœòÌ7JM/)Ygï$66\W_ÛýÆëÿsê)çì³øâ_>åä¿'j^I5,åëBIÙߤI¥-½®Q«ª-^»±xþ‡Œm¿/èvoIÅìò^Å—]6þËUG‰Dbºî¯w$/ ˜"O›6 O£)ÉæèöŠÇòòrŒÙõë×ÿüç?—ÎîÏ]"»e³‘mi 2‘-d¸í³Ï>©T Æ544POt$I:Ê ¦¬|8ÿüó?üpVóbûôíÛ—úúzÔ«šªªú¥K†,Y2ÚŒŽìÒ}ˆ-Ÿ~ňˆ‰P4_Ÿ¯1Ĺ›®I*´N¾ a§¾°pg¦–¤û«ç AÏLŸ~áñ'¼·páuõOžpb·AƒPOÈNÅ ·+ÁO}ŒÎvå•WR.Äb”ˆlˆ€fôÕW_¡˜ /UÜQ¡yÅEWdM²€•wÆ:šìå—_N„Qh´È7‚ìçÈ/t¥+V T2âáT­^½@f±nÝ:èAP2Ø¢|Ép€M’äFöÀ~’ À³ž–(hIø éQÿüç?qK;º‰STqÇ/ä+õ¨£Q;íôeeå˜ýöK ÜfÇC~tÒ 7ÚÉZS×f=p÷¬ܵô¹Y|ñjDF——wI¤µDó\‹TÑ“a‚^‚9¹hi·ÅË.-ì†÷pcÄðÐCºi7|Xa"±ëرԻ`-M¶\}õÕ„äèßs¿âŠ+ðÍÑl¨kùÊÃùÜ­NÆ’€¿ÙˆWmi 2ñ-$’°rOK!}ØM7=Ê­;0À>÷ÜsTý5ZW·AÁöft;3:üÊ«‡¯©<¦°^~·0ZÆíN0¾²î´Ý C{æ­w>O9Ÿ~Ñt˜+Èàéü2n æOë…E5ÔÃi"átúfÏRn’D^8œü3þé6),_¾M‡‹®(_‹ÁíÍ7ßt“êÑ’HPðG²l$‰ˆB”S%¦'MŸ‘{ï½7½ïÜsÏ•8›$Ibú—ü"„J—~1 dCö‡·;ñÞ:š9³.•‚D\VË6n,Ùe×G‚ÖE³>~Âø_Lž|ÑQGÐýFŒ‰¦>_Ñ,•4ݲô„…ï‹ÓšõüœšÝª³æ¬,+úCañ*’]µjÃ×_S(éïÏÑüe'äëLt†÷[ç½%jÙêÜœ­Ù´¥1øséÄ@†j95± P°¥Ýäb*ãG 7ŠÀáv©¬üêïûÚ¿G\ÃN×Ýt]Q·)±²˜…+¾.hH0oˆfáö9KØ·é]¹óvw'j.j¨<¦vÍä"½ô¦ï/-»¯¡~n"Žs¡Êrfâq@!•[â¢Å3†;ª ô„SdæÌ™|ð ‘À¡D8}±CñÈNš4I a„jóÊ+¯0N¢II·.êÞÈ‘#IY`*ï¨GQ¢}öÝ×2MgΪmÏýàƒ.#Fì0mÚG»ïÖåª+¯¿öˆš5gׯ¿%¾ñßQ[1(Ý<#ÖÑ’)3™Ž&ÓE ‰~ëª4‹ÏªIÆO>õî´yKY×V®·?_̬ÑÁâÎg+¼UVœ²Ùl 9¨Úr^IÈu\ S¦LyðÁ±±ÝŠÒwÜQ^öÆúÚ™ñÆÅÉÔ”óÏ_¹nÝÏ?ã•L ?×°®±ehÈò­CRE…¸`ø¸ƒŠã•DH™?þø¦›nBpà¿ÓvDtz>öŽ|>H=ñÄ2ML¿•+W"×dˆ`,½ð ;î8Ô+®î!IÄU×]wá¿xõÕW{ì1Ðqÿú׿px½ÿþûhø×]wÌ7I $ .¤8Äzàʽzõ)xH˜B |衇&ÍǸ+ó”RbŠ47ñÙêÈS"§Šo¾yÊÔ©7þå/zQ‘V\Ìtð×âñ;êÎ;÷«‹§S»î¼†õw%jæ¦7F´ÚUæ²lÜ—Žº^ÛßÒ÷3‹[±V?ç¼™å½.ÞPûÚÔ³Nßgïî¼ÓÓšâ6ÿZ¶à[óÍC'áþå¨8e³ Ò$[8Ç~IŒÕ°X|\CÄ‹‹âTRBýY ‰&sÌWb*—eMÿµ’Ÿ¤“ŸÚÖ¢D|}f¡Í‰ˆ6-â¢+¡¿¸‹™IJ䣛$Øv`3ï¯#A¶»DÙªX²nÞܹ½iûdÐÀht÷ò.ÃêÛ›±Az$cÓµ`Í Ñqè,-¶—¤ï§ÿI&>H¦Ø¡ê¦Üt Ül%r§”­ÙÈåî2d8‘ä)Æå¥å"ÅÔœRÑb1×Vê‹Y!‰E©ÔWé´Pyœ]{2ë*<©åûˆÊ€îƒm%Ìõ|£S‹|ƒßk¯½ˆÈ§ >®agå›H«ñÛH|«óýNEÌ·ŠiÆÍ{TiÝ cd$²c$¶ƒiDY—çw-/|šˆ'Úsff%¤âo'‹S©zר–1Úúôi6­Iç—œ+íѵòmž•ÇNštõµ×¶Å4cò4³+óÈ;ƒŠ³€hx¸óèÆçÜû3–ûU‡Â[2ñÇsÌŸÿüç-~ÀÄÛ…KʼXê$çCJ„ ÿ¦SRXÙ‹êôφúój«Ž®Y;¥nÝíñêwÒqéêÆÿ„éÇÈÍ®¤{Ó ºÜ]RñX—ŠKKËfú¾×þ“T´‚D¬ðeY¬Lj¿åCÇñ³e>mzj½HÙŠeÍŸ}öY[¨‹ªóM9cbÏ1Ù,ßèà·‘xÖ pÀ­È—(N|²™«íþà˜Óó*8Cb¶K ydÚÛo¿Íz=¦È³†F"´¢1Hñ´&mÍK$no¨;»¦ñô‹úõ$kÑŒ¬X“cË“‚mð†éÑ£#ÅWu{²¬çm]ºM**fE‹3EFu'InÌàNÆÏäŽà§;Çv[#’ÜË” Ê¡Œš~úÜ3€üoÝ!ÊèÁ;ßïGŒÁ’nwÜàp^ÄÓr<)3ÍrôèÑž@sˆÈÎ"^ÉO‰ ž‰¯ƒ–K£Ý¥s¯,f6†¸p6L?yU±?º'kÔ¦†0QkâĉL"¹ä’K8Ùƒ'…lˆ§¤aàxú2~%ŸQW3©zݹ¥lµõ»…½Ê×Ù™í[œ¶!T'62Ç…¿.(¨´â¾²îLëÛ9E¥r§œ$±139ÝÑ•L΋ŸîÔ6H$1W]¬gN³éX/rÄGƒ,kÎkQµUtŽÜù~Ïå^ÒígX¨Å—^±j”‚°²48ñ`Ž;–.Šbýœý÷«™‡ôêÓ«1‰TÂlãkV×È:éƒÍ¢ŠŠ6¥?kL¤æÍíSTÈÔ^a¾Iåág^ ¶/r Ã,©!1ñÑMAÀeÍî(Fã )ÏîÙVEgË=àhômÔu|™lÌ(604!žíÓŽèðèJ¨*lð.ËâYøžm'€6½F§ÂvÃËÃØ.s÷OÇðï äg¶|ðÁ,=øá‡e~â³dC”{0ˆÄ=˜J:f*V–]DÇàe§'¹Ø˜ÞˆúÙÏ~†ck—]vA_@Ř~f#Þß–ZM<‚ŸM5ß^¸°¸wïݧN{uä¶µ3®´þz“ >²rú.'ÜÞ}õÈ÷ëSÉó§ß-ºs谟﹇ּç‰ÜAJ&ç§Àì¬{ ‘„eÄfòØ,ì ·ø€è Ëš…â yîâ‘AI¹»€UtŽÜƒ/€f×]¨õô· Ä ’Øl`öìÙÜ‘k²ª< ß•;´‘xŒvP¹ì²ËP^Pô0âälñ¨6(bþ=üüÌV"œeæ•••²€Jâ•ÅQ< QîÁ Ä$µz†le'Y¤9¦(R˜‹ ^î¼óNö d{60ýJ.'òð3ñþ¶¤d2ÙiŸH4gSŠ©Sï{ôѲÞ}ôaØL0¹zý¤Úµ-°í}wKdf8îp|âµ ¥•µûÔ¥zÞð{êÙø›Æw){ÿ­·<[8dʪyªC!I`vÖ½õ³·%Å­[Ö,¢»w bA —nrj VX=d²J ñhˆ¤´Ú0d„éó¨Ü À“{¾àÙ3€|•üô”I‡ÔCä±-‰‡TåcŽbz‚žÜ,’ z0ýtæÅ%eÙùFI‰<'z‘,Ž|EI‰ü!ñž¸m$^t„ýöÛM}œÄQ°ÝN>þøÝ‡ ~÷Æ›÷Ž2bÅ®Y˜×Î"vÍf]×¼Tã ÉÆ’)¾ôys39/~zÒÙlí ’6­aF!òå êOseòM¹#ð1ÌÙØKL4‘é ÙÓ´sŸhA6ÙÄyîËíÔ©øìxãçéT^§÷39ÚXžâ±¶¬Â$· ER›ØF9°Ù8 eÓ ÓÜ7Vp`¤h[#ʤpI«êPš5û+ñr²qN"μM¯Ö$±]ÀÄ¢ Jf%×s‚†ëM'€&³Ÿ¥9Ý ù‡Y†9Œˆ æˆ3`e}˜JÍL6¾™ŠWjé.ºÁybœoˆt+WØ`ÏHááEc¢Q[w¶LiÌ.gj“ Kö4 FG¢lµ¸oo0z:+IÄØ0ÙÅÄ Rƒ™Ô¼ •|6ÑÀr_ö`¢S‰³¥";Îé|§cIçÙ-<8V48©±­ ™]ƒ0;i—H¬7S¾\ì‹rFAÙ¾±X ì æF ERnþ„oC| 9°g$ÆÄnÖ )“•†êÑ)¥»Çb"I4;N(’²ó&|ràÛÈ>  `²ÉÒómî{FlraÉ÷¢›6ôd¬ÖžAëÈ c…9ÐAiš#͈{z$Yš]§Ù¬ƒÛÈy±šÅQ9;ÖNóX嬳ÖXçtU2ÙP$IV„@Èï°¾^M5²³‚†«7X6âÄKL‹doç®}s'À¸Iq¢ǽ«ÿ­;$Inn„0ë qbGÈ Á­š!Jâ%S‹SÎú5)k„ ÚBjò’.ì”>yòdOdñÈFèÊp SèKˆSìÆW…ž-ºˆØjÕ/ß ’‘²˜îÀVT‡ge¥VrIy´<ÈÊbú9/˜é¿+1•iúã*CN;í´ÆÆFŽ?R¾mÇÀl qWGîìr3HcÈÝoGÔ&°åìøñãÝAÏ!CÜ!n8H‰ÜøJØ+’Ò‚ 8÷Á„<Úi§”1 t….ŽU Ð’:Ê#Û•Ñ•yù19f "9°”ã·æÌ™ƒŽJÄlG¡û£sžrqqÜ ÊàG}Ä©§Ê¬I™ƒ 9àŒ·ìÓN·&Í–SÀ8«rÔ¨Q„(lž)´;—HsìØ±,QăKbŸy%—”GËg+¦Ÿó`ú/eægÝã?ÎÙè«Ñ€8QùòË/÷'(CvØa‚G*‰lu$ñÝ€¿}ÒÇæÏŸ?qâDÐ.¸à5Aâdcˆ²ŽÜéKØ_̼ƒ?zÿþý9Dïž{îAPrú“°¯;®69§›‹“8e‰8³š³¹°™D`^%r§“V‹$cË8vMžåOEyºÿ$u"*lWF÷çBˆ“SQQÁAFÓ¦MCÃä°Sв…î®<í^™5„cˆXœÌ[º š<Çö¢tp¾GNžyæ™OÈxÂ[HÂìõÙ<#Rhw.‘&º7ZžŒñ«®ºŠ%—(…ÿhùlÅôsždý—²Ž”i¢ï¸ãŽ»í¶âž!CW¯^íOP†Ðè-òQYGò­ð·OÆ`ïÄaÊAž¸¨höJ†”²ŽÐÑÙ„‹À¼š·;°Z$qúEÂHAÉYX¹Œ½( \Ï>û,â“£øèäØAh¿h×2®ÿÈvet‰ïr` qI‹tã{àÑÁD õàû1Ðh©x÷9ÿá1*C—(ĨȅWâ€rÿ‘íA2jw. —‡ “>¬<Ó_^’£˜A8/Òñ`*ÓÄD=¥·ÜrËI'Ÿßÿ}I† CzFoùc’­}Òt… Œ(ýu$_¹e1%Â&CŽèB ¡ [L9#MOÉDÐFÅ9º2„Å.ü2D›,‘?Ç£Úp#ƒY³f¹åÇ  ê€Ð„0~å•WÐÆ‡:§•˜Ê@e)1ÛXLOô¡C‡¾úê«ø¼ ž~$rßÝæÛBÍ1‡OyîܹÊtrvò‚4<‚VùuÖM7#ŒŸÊèîXŽ)¢xê&ßè2_O”XR·<"œ,<¹Øja$rì.A¶R‰"ˆ|sÜ•ÅÌäUÛÓdf—Ì+[I7 lŸn„ܰ²Ž”QÚXLOt¡œ»¿‰Üy¥$ÃèIÓýÊ ÓŒúîÍ;Ö8=v³e¹ÕeÄ×ñ6 š­®È[Áß…:Âh¹³ÕUM¾ë#5·71ßDCü!B´ŽFÕÆ˜Ö­‹Æ 9r ä@ûrÀÄ%Ö³¢óXNjß ÂÔB„9œf$㈹îݺáQâS²‰+xü3ä@ÈíÈHIiéšµkëëê{÷éÍl#¾j·cêaR!B„È‹ÿ®l´ªËÍÃIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-s.png000066400000000000000000000277631477365367100217030ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ"IDATxí œÅõǧgf/`T‚ ( ‚xßä’x%FEÑ(x‹ú7‰Q<“¨ ‰W¢‚ñÏGGT4Fñà €ŠˆGT"—ʵìÁÎLÏÿ;[X©­ªîéÝÙe¥ú³ ÕÕ¯ªÞûUõ«WÕUõ¼vØ!æ.‡€CÀ!°i ß4Øp\8N%¹vàplB$U^<ÏK&ŤR)©Bäq-D¶×Z¼1ä°e.I^<òH¶ñuÅW¸HˆŠaˆD"Pxc@yü“Z¿S§N•••ò–ÀªU«JJJ\¤ÄÄâƒk ­§6lØÐH%I¬]À!àp´ nz»M`w…:vœJ²ãâb6AÀ©¤6ÝêpØp*ÉŽ‹‹u8Ú§’ÚvW¨CÀ!`GÀ©$;.›gl<µ=D§Ü<‘tR7¨MP°Í6ÛsÌ1ja?ýéOo¿ýv5¦pYYÙOøà/ù‹è™:è Y³fíµ×^]tvÌ b“RÄÔp 4HæizöìùöÛo?ôÐC¼3gÎTÇQX"ÃsÎ9çŸÿüçÂ… ÿð‡?L:U±Ï>ûüùÏþä“O~øá]vÙE–…%ˆÎ0êü÷¿ÿýì³Ï0@&×X²2„ÒÁ {üñ?þñò‘yFdIÒk¥ÒÒÒ7ß|ó_ ×N;í$ˆ/½ôR"©JÐ@O½öÚkÝ»w·R“ù :Ò$BkoBgæ¹ýöÛÏ;÷î»ï~ÿý÷_zé%jV`ô"ˆ§Ú/ã ’¿ð 29&ŸféZ>âÖÚlÄ#S"kí%2¿JÚrË-ó›ß¼þúë´QõMCBš/p¨¢žþù4ß3Î8£[·nçž{.¸=묳˜¤xúé§ \sÍ5‚Þ¤”ùgß¾}å­`ü Wl¾»úê«Ñ L$M–°«Iø÷¿ÿý—¿ü%º’y‘üúë¯_¿~ýé§ŸNÎ Hežò²„±Müâ‹/Î;ï¼úúz:.™\cÉÊ|J?ÿùÏ?ýôÓ¡C‡àÑG-óŒÂ’J¬…5–`xøðáÔJ§¼¼\wéÒeݺu÷ÜsÏ!‡rÇwtíÚuß}÷µR“ù :Ò$ ªb!šV›fžh^0"=š™zS†¼¼âv‹-¶`0ûõ×__|ñÅ’@ã“x³tI¬¬ÍFhÉøöht‰U€<0N\mm-õÄË,ɰKÊÊ[—]vóßGuT&“éÑ£1555˜W4îåË—Ä&¥|D»·ŽÃ% °•>ÿüsì²>}ú`ž…%Þ1ø¹ñÆ‘‹¶‹r$!Û±Œ–-[†a‚JBUñ‹ -ÊÊË}MvìØ±4A€Â² E®]»ÖÊ‘&óV”¾úê+øAQÒÙb| f"²¤ka%Ð3§À±’ž{î9Þ¨|i©:ITÅ-Î|HiY«X‚ Ö¦5OAI Á –ßþö·Ä„¼2g50nÜ8ææhÉÔµŒ×ø´–.[L%f³T‰$q; ä·’årø€ïûHÈ;¬Ê‰:PÍ:Ø¿ýío˜ñX.᳤á”fO¢*ÃBRÄPÓ"> KL@P$AuŠ„"‡Ï>û Kçù矧=ÉGäe +‰ >¢I±$г2/©¿ôÏp\¼ª1…%5-¬¡¤=•·Tº@‰OóZœù:Ò$²V±dX­Íã5&òù|óÔSOÉ<£°D_:f̘“N:‰‘Žf«k,‰l­Ìk(¡ã^yå&¼æÍ›‡…¯®ÿŠÂÉüùó‡}ôQú‰­·ÞZ”®±$(™ïçé¤I“%ÍE%òK|Ã]ÚJ)ò,óAu¤ITŰjBgæ)Df2¿â6äEÈ_5¹ÀM>Òø$Þ,=¤â¬ÍÆ”H×QÏK¢¯¦nÔkBZ>3cª\~ùåRxFZ5ÈGØS¢¶DŒI â´ì &¼ñÆ2•ÀÚB»±¢²ººZ#’,/Kýúõc–ý®»îbZ„yhäB‰äç¨N&AdnYôˆÖfnE&•¥pæ¡×PÂVÂlQÅlK'òVeIF(óf ¶U‰‚ª8:™']t‚ãžùe€çq+È1Î篬C‡T&S]W—f6£Yx©|Š dé!ù5› ‰B²ÚÄEUI›”˜ ˜cŒ­Äp½©¼Q‹, Øo¿ýHȧ >®1Îjj&ͦ/ùf—»Y%ŒRÅ=ñÝ’%•^¼ÄóJc±’˜—ôbI~é†zò«²Ùµ¾¿6›]ãû«ý\LóŒ¬ülµsŠü‹Ú¹€ì3øÌ=øV ^Åå1oëxbÛœ=ÔÌ 3ªÌóÊäØÎ¦Í0¯°¡P@ëþr*)›YõùC7­Êú_ùÿÐbÍäãÛ•lóUIß®ztÒ4Tê 4ži°trã/bélø,–et††ðYü@ÆücÇOvãj,Ñ0ÄcÐÇXq_inôç¡¡ªª‰0:«ÌKlÕX÷aU­Í¢’2_£’²™/ýÌ—9õ”YáûË}ÿKßÇæŠ._iÔ¯IÑn‚”‰ð/¾y9æsÛÈ‘#Y —2ˆ€ÅÓìȲwWÍɾ²†ˆÏsj|“Â…3ߤâ$ñ¦Ì<[ØYÆÍþÉm[Z%+óluâD†aTÌ/S?'³áÍt}üàý*†zï왳Óf§ëù›•ÎÅÏNÕó+þæ¤!®ÿWº~nºþ­týÛ™úyéúù™ú™úw2õïúõïùõïgR‹ýÔgžßý }>Y·zEMMuÌgÅ-:‰s©­Pd½x7/±C<9 Qº{²t÷DÙ dé DÉÀdÉ€d²w"qü°a#N9åå×^Û¸`×*LÃN&¦VùºÊ’‚’\tëáRh3d%‰mÍ|ºjFÁ2‰ØTÍ·s%Àš1qfÀ°aÚ±Š" dž½¬1aTn5š6g^ãG½e­vó:˜è€D¤,%U.fn»í¶d~íµ×>þøã"žÆpÝm·Ó’_¨o´ÁÌ!o ÖSǸ×ÉóÆí»oïc{ñÿVòÍÔ‹ó×9÷ë5üænù«Œå&×É3#>÷h§x ·nkã±-3þS§]PÑé ?ý?óy&ƒeZOA3hí³5ðÌ‹F37íR·m¿æ£¦™©ºÈ|ªÆX“ µô7@7‰y¾m«Úø®t„ZŠX[1oÅÓ”vYøÚ»wo¹5Z@ežxSÌ @ÔLD8ˆÒä³IUl&׊ÆL`µ µN<ñD‘\wÝuÄš Æ år+KÏIJë|i&3îÁ{="yØa“ëꬭ¹³fýÍ5U·ÔVÝQ[5¡®j↪û7¬$µþÙTõë麅™úÙŒT7è©nY/>kÞ..YÚityç Ë+/ªètnEÇãÊËw/)éKƒ+úÁ MÂ3DØV}”_%±V]ìgM«éضsì±Ç ž¢lknÒ¦jsWtHé|¿ç ?3€…lÔâË ³kAØYy(÷ß^QÖvbí½÷ÞÄm|7O(ù>}ú°:÷‡By—Øæ&Û½‰¼õÌO«DDŠ #‚Å™b,ļ)f æaA”V>a)JCf•}£HÊ,Vbš{œ&‰4~üx©—M¿âñ'ÊŽ=®òìsn©©º«¶êÿêªjO;iÁÀ>3Òµú)¾Ö‰¹nfÊ™{¼¦¶ÓãÏŽ.ë|n²âÕÓG=qê©[®XÞ£¬T¼ÌA I£à©‚Vü°>19`¦†n“ "l©½êª«T¬w¨2†Õ\æfzñ4ʦjkrÔAPéäœw4³˜ìMá˜'öIüð‡?¼å–[$·Q˜gÒ‰®¼òJ¶°QÓ²n|§«´žPó°Ššc‘:¯sùS¦L bžxsÛ½O«D"Û#F,[¶Œ¸µÖ;ÌXÅ´cÀF‡(ÇBXù”»áóV±Uv!‚ö‹D´¾Æ`è±—ˆñö¾øP¥5Z™7ÛRÌcѰŸ¥F£b>‹–¶Ò÷ù›K]>ì¯ü狳gõŠ'wH$tí:ì€ýÿóÒë[er+bé SãÝ ¿Æ_W».uï}'ÔÔö®è°8ú¨®ÎZ(xj¸ù6¿J’ aÒ˰„lkÆ^ÀB–½z”MÕbzBlDÔ’SœY:‘tnbg–Ƙzˆ;6Ö±ŠŸ‰õ|(Ì‹’؃òåà5g5Œù@‹”ÚI5›y¹‰G") Õ˜'’ ™œ‚Ê`!ƒ6[ñ ’ˆøSN9åOúR¨ri̇‹©&‡=0Ìg¼É°H}¤…­|Jš(UlÊ.’³§³L1êyá‰á–aþ.æ³8 [iöìÙ<Òð bÞlK2ìr!ÊBJciÉ’í x'•~'–ÆüÙ½Ç6GŸsö3gn±zí>}zìÞ½ú텼ܔR—X<ûÊì#b±½Ë*?J¦ù©2鲕+’ßœr¡fO•¾øáü7x¢†ÄÂ6ª,FÜÖ¬&a,²ÒNÚTzÄ ÐØÛ˜ëÌeòa[`$xˆÂ<ǧ¡±á±•0U&Ož,eÑ6¾P óŒ×x©»1ËCß.KטçÅ0Ï °â$Ñ‘GÉ™ò ”(Èd>HLè5@B{Ð(­| ¢T±Uv‘œ/'=ÉÍÆ¼¨¡³Ï>›E{î¹'*€¡± Ôð bÞlK2žœBuÉ%—°ß[Ja²Ä:ï÷—.Kõê½ÕgÌЋ1—ÅFñpýúiéš¼Ìú†—˜–>í›,QÒitYåÏ>w´Þ«WßÎåDx^<¡dUÎ k»+¿Jb.fÑ¢EŒY8¯‡€zêH”mÍÂp<¿â–NÉzº€¹+:¤ôè 9u„µ÷- ó¤‚%˜6m¿è5YSÚÆwëI2Ï €Tn¸áŒ =qì€ hÌcÚ`ˆ™g˜xIÄdóU«VI­Ì[ÅI4@B{Ð(KÍ>ƒ!Hv²E›3E æâ€—ûî»39´—3n½õV¹HÃ3„y³-YA¦¸(íÆ¡ôyØ_Ú A%Îä„OŒý‡¼f‹.™=÷º»¶z‚ŸtÏ]Æ\~Œ·×ÀX×JÊåkÝvñäÖ³lóì´ë zä¤O(¯Ø%™,÷¼¼,m^ZºÇ7Í,‡ZѯB÷¸5o[³Ózº¦¬¶ߊ £°(gXÓÊȈÌc!Â’uÔÆ@F(Y‘'·Ö“d‰"ÐJÌc/hgPœOM"4Z•DZ$«ÖÛ15@°³ÀG…Hf¨Qš|6 %«ìŒ‘è¿ø…,”Ù2‘O§¨F6CóZÚ™/Âa‡†%Ž=.37Y‚yžª¸Ü¢ƒ¾L&wI”ôK”°²‰]2;"–¤¯ô3ïù©…žäUWŒŸüÌ ³fÉ"Ô@‰ûŸÒ²3Ê:}ä§î®]¿4Ó6›ð UIªH.ìؤÀ¢ÁÖhÞÊÏâ ÂÀœy@±Ð¤y¥cõJ$8Þ``¢¤¢¤O<Ù•ãßäÅþ•üÔü̆yéÔ»éÔ Cãì˜LœSÞ騒Ëü £ÂIuµrÔ7yã§’в+Ã!PLº4MuS¼ä;^RMµYÿ“lš}0oeêç§R_d2âsFÏ;¶¬üüòÎXXììãéøºªYgÜ‹#B¡{ÜŠÃ¥+Å!àˆŽ¤,Édæ§Óï§SK³iNध^<·+Øó¶öâ%;'Jz&•qbNP’<±¬ã® vç¶ã±µ…ãéùrÇ£èå¶¥SI-£ËÄ!°É!ÀTÐêlvQ:½ “úÜOËpÚA…硛ؼ¥—è/aÇïw‰î‰øÞɲ!É ù­ «Š-xU1Q&Í¡żœJ*&Ú®,‡@ À)—Ÿf2 Ò©OüôW± G_VxqÎ!@1uñâýâ%œ@Ð7^²U¼ÑÖÔŽ1¯C<þy–Á]Qç¹Jjƒ&âŠtN8Yæûï¤Ó‹3)NhâèK,¦Ž^îÈ–\ò§±ÄÈ C‰¥˜‹2)ŽÇÔž¶Þ­SI­‡­ËÙ!°É!À(ŒƒëÞˤQ4(&N¼´ê#Á7Ã7&•¾1©T´á›SI›\£q 9ZFb«|a&U“õYÍ´MÛå%.„@ÿòWH^.­CÀ!Ð.èïSRÚ/ž[«ñÂ-ðÉò!eåroJÄ„M% ›Ùjj^ŽÞ!àh°÷ãtzRl}ÎÓ¯—s>N€“r¿¹~s‘ì>Ai}È-S:¼¤|Q:57îÆ© œJ*>—Ø!ÐÀåä u± uø`äÆü`CI.ðM¸ÁYfÎ5&JŠHnÙ×Úò:•ÔÚ»ü›.é,>~cÕ­¯h¢CàTRt¬¥CÀ!<ú˜êq¬æS-Æ©$ ÍúVœ°¾YCÐXøv H[1¯) «’j s£»ü_ÜX½Í±ê'4\Úš”F9¹›¢ ÐzÕÁ©†œ9w“¢ÈQP!œŽW»‚²ˆ¸bJSó§ËYàx»1³µÆà^Až o%hRd#•„/Î'Έp2E^,¢ÇÏÉ'ŸŒ;ÊnRîÅ'Æóå!CŠ_nÑJl‘ê°¢du-_4¹¢„¿3–/^¼8z’æQ¶@Z¼6Y¯ˆV¬ú¿pèðª‚×)Ü+à9nøðááÄŸ6RIXz$»æškð†«BÎÛG_²™…cÉÏ<óLkŽ„n7#­”ÖH3-1VJÁ°JÝß¼LÕlÓ/o…É"D JAV1ÕÈfT‡¶3 f¬(Y]ËClÓD^VÞZ)­yÊ$áQ£FÕÕÕáþ(œ¬ð§A€¨Õ^Jˆ˜QCHrµÜÖ¨Môïßÿˆ#ð÷ß ~p /ïQø…Ÿ1c>âñHÊxMx+Í 4RI"‹¹sçâ÷ÅD»ï¾{P¾VWè¦'u’[]¶[“[Ë2)q³“8,ÅýÖK/½„J Wèfrüyá‹ w7ƒ¸?Ä멵hrÆ1!ÎxÊ9í$Á¹aâ±lñ†¯ÊKsæÌÁ‘ a,^áK2zA¤jq”Èsÿý÷g‹"Ã1PçÌ[Q« b6@ò_×ò$·Ši"¥yYë23Ï¿þõ¯øF‡1xÀ£òرcÍ e Ž*qV1Au$éÕ€Ù>yǨ8^*ÈxÁpj‚Æ ÄZGjþ2lŠÙ¤Æ`&ïÙ³'Nßzè!åÌ™3Åøºõj?Ý\xâ”Àg5 ›1“ˆìׯqð KÅ]{íµãÇ7;?5yİE%‰”¸-Ãíšôefgu…nzR'¡Õe»5¹Y 1&%-¦[·n¼ÿ£GÆÂÄÙ)dA®ÐÍäVo÷Ö¢ÁÐ:ê(žòÚ`Éã¶Üñ/„ËÉóÎ;÷„ô'<…%†½bD×Lü\½ ˆ[%òÄöƪbæ…ÁøM7ÝDŒ%¤Àê>묳ðÖ‡§ ȸ‚Ä4‘ôÚ¯µŽ¬ybï¶ÛnßûÞ÷P÷t8}\¾|¹–›zË»ÍÛ"c¬u$Ÿj³}Ò¯Ð㼓 Sy2EE³·BVÖ:ÒŠàÖ*fôÆ`MŽ}€ës~èÈŠY jÕÚä¾}ûªÒá™p„Ërâ¬ÁÉĉyèð&L˜P]]­Ò7/lùâFÖ¼T¼`>ú¨pœmf͆]Ná·~˜ð È/­ßô¤NÚˆîêI± A†Î¦ÇÀÆÕ 18Y6]¡ñ¹dÉšÎé“ÍBe ž§L™ò£ý·”¸“Ç&0»hôäxvÃáßÃ?¬9”ÉÙ4± ’´8J¨Eê7óô®´]Ô ¥XQ"ž7SJ„ˆ©!/å5¥5OxÃ…V •´óÎ;‹÷ÍÌMÄ0|P™Yë((­µ}ÒÁ`Øò^=öØcT·HkB¼YGÖ‚¬bò>Gl Öä¢ X¥6qB÷Ì3Ï`ßÁ¤Ùæ¡4™ÉS«#)/ûðå-^4T6ñ"’æÍK1räHl:†,¼ŒA£ 5“¼a‹JÂû"aÆc€¥£\ú^Œ.Œ7Ô',/¹éÞtÙnMn-+„R¨KZ¤5¡ˆ I^…$ç4Z*³ûøÿ£;%†NŒÊî…¥ðH8(Ã75Û(µ8JbÊCðÉ;lu©2©…CÄŒ‚¼ÈM£´æÉHóH±üGŒÎóæÍÓ˜Qoy!µÞÛ¬#•^†ƒÚ'MW  HbkÀ¬#+™ULI™·1„$ºX(ÙêdÎ!<µ:’™`2­!o ТøÀÅ<€ˆÄjad÷dž‹ù,f÷ qB' ² Ü€lêÔ©ª>êܹ³˜OÁPF„_|ñEì£C9sÎêIà"º«—<©kA*ŽèožÖÉ´+< %¢e¢Þ2n§s7nÜôéÓ׬YÃ#º)Þ¾0¶eìÆLñK—.¥Yó‚^çe jJ«ƒA7½Cl%L€É“'K®4”ˆ'OQ³2`SæÐ¼€5OzW”8ÕÁĺ†ùAlÏü!`…wLÒ˜u$©kû„…ˆ«nÆnT¾H"qk©ù˰ULžFl AÉÉ8xð`~ 0h%¶FmöèÑs¨¥P~÷»ß1×F·!"ÑY¨!Z;zŠá6ŠSF¥o^¸‘J½„æ.™—vþüùÌ«SC9<£ ›®Ð­žÔy{ÑqÝÕ[e0  nùUŽâoÞêíÞZ´ˆ|ê©§gð°ËÆŒƒSylC²Â–&RºlŸ4iu#XŠ^Pt”¢W\zsÚ´iüª Ø4”Dž¢K„QÅV1C§8õ²RZó¤çç%¤tzA, Æqj>f¶Ìg1A¦>ÒêH}$ÃÖöÉÐþÒK/½á†pAþä“OR›t±V@‚êHæ/V1£7kr‘93J(nj“>R׵ɗžøù矗¥ v˜-â¤$IOpß}÷1·Å"^‡[o½•ÉV•¾yá‚ÎK£c€­–MW@s-RÆÓÃÐ +CFZ“˧j :¥HEª2ÐÔäjÑ(d :TNìA@Ìà25£‹ êL‡ú4o¸5PÂú@ë¨MCÉÊžUL+eôÈÂódU ÆÈD¡AudeÉÚ>­”ÖHkY) SK¾ãŽ;ò¡9/”‚ö‰Ò¡WÛ|!,ÑŒQsÌ)¿ñÆÖ|ÔHˆù.¶‘|QQ;?"Í5¹þ¯õk>˃…¢é#’ȯ³jrzGkr5• G§I´ºijrY.:OŒX:RUOZ)D6[‰[%ضê#!‚(7ä×*f}”G…çÉÊ.YVPI5`mŸ*AxØZGÖ$Š©%çÎù5ß#Q:¬l¨‘Zžê#5L3Fé«1!aˆ¥> !‹þ(·ö‰76z‚Í’N @E³¹!V|y]󠱉ÌGšÝd¨1k4 ì7Ôì\Ø!àp‚@œ¦ô.­CÀ!àhAâ,á[@ æè²r8ÍFàÿ!»*-7öIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-v.png000066400000000000000000000344351477365367100217000ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ+FIDATxí œÅÕÀû˜kï]v¹AAP@ˆx5¨@"bâIŒÇo£¢ñFñDÔøÄ3DQŒ‚HÄQP9AÎeÙsv¦§ûûÏ´MwÏlïÅÂg÷o~=ÕÕu¼zUõê½×õêÉC† ùꫯ$ÿò1àcÀÇÀ^€€ Y–Ý"ãñ¸iÅ’„˜ãÁ >$¸¤ý,×K/½dì~ýíoó#­(ñbÅa!>BL 4|0È6Á-;;;''Ç\ƒA?Òĉ0øƒ¡é(ƒ$™¸ö>| øØóPö|•~>| øH…Ÿ$¥ÂŒïcÀÇ@3`À'IÍ€t¿J>RaÀ'I©0ãÇûð1Ð ðIR3 ݯÒÇ€TðIR*ÌüBãåç!!K?žÍŸˆÙoIù E–ßì&À€Ú£GÍ›7{/¹uëÖ'œpÂÊ•+Í,çwÞùçŸÿî»ïš1 „ÃáW^yeýúõëÖ­«w9¿X ª$e™_X–3eèé§÷ïÕ«_ÏJ7ü‰Çs9/ùS åCϾpذåóçªJ¡¢)Êo zíùç·~óMbãÆÖŠÒZUÛ¨j»š;ů•ªþöÈ“'Nܶre|ãFòÖüäŠÒBVò•ä*øå$r¶"gŒ,G’PIÙáȤ‰7ÿôÓ†õëÓt16guVïÞ½<ð@C,K“X¼òÒï2À¨Î9¬àeddœ~úéß|ó {­ñá¬SÛ«EN8›%f7Û/ôïßìØ±ÿùÏDâÂÂBökŽ?¾Ö¼—_~ùòåËßÿýô)«««·lÙò÷¿ÿý7¿ùkw¦ÏÎ[ï ÕZ”H°'AJƒ%ÈM@–’ Ñ Äc%?üpÇ5לÿé'ª‘$Cª /#‡$)[V²jH@–¬äªá­[5­maáì/–Ä 5"Iª°$gƒÝ7n.Yôå39EA ” bRpÙZmøy·i 9§U-ÈYº6qÖÈ[e)‘Ó*aš$%d#•Y­iåUјd@?’wè6Œ¨dD ½R2ª £ÒHÞ•ùóî<ã´;¾ø¢TO7$ Ñ%)YŽdhÄ;’Sõ¦³ßIV×AV=/ïƒÁZ;¦sçž{nnn®G“øT-ª'ÐÍšÍ>€SK:}út‘ýðÃñÅ׬Yó /ôêÕË,Ó H$÷ÜWŸ~úñ¬Yg5h?U={À€O§LéŸuéá¿úïÝw½~þùWgæÜ–•÷ö¦Ô÷Í]&çµ~:«èþŒ‹ä_Î=µ"a¼úVï­e}ÕðþJ°µ¬f:é‘ AM€©›äD’\‰¡‡ƒ‰pZPÿbè/Û(È1Zä”+R)tÁУ™a£(OjU ñªe¾^˜W*'I‘É_a®HYfèUÅÈË’ò³¥Ü,#+¢GBðGÔ’eIU˜Ö»²Û1[–[+*­è§†Ž DNd̹2œ;:#ÿ)#6ââ1›J'f·ŸÝâÞ¬üû:uy}Ä9 ÇÞ÷Ú ×ŸÝ½{ï` [@í¤ªý;wúèÝáX5¢ ²®]LÝÎÞtö{ÇŽ-Zôä“O Öžž@§š»5i×òÙá•Ìì¼± bœµï*`·ÿ4cÞÙ¢ÝrîSéÆŠÙ-ZÜ~ûíóçÏ¿öÚk­3ûï¿?è0S¸ôÒK?ÿüó?ýéOEEE£F"†Ç‹.ºhÕªUo¼ñÑ£G‹ôΔf9”Ù­[7óÑ€§*Œïn¹å(ÈC=d¦ñ|5á®»î:h%z‘ýÎ;ï,//ÿãÿHɤf™j f›!ˆìÏþ3Š.‘ž¡[ÇŽë–/o¥(Tµ‹ªöó¶l*\½jæ•WÀaÞݹóÙ—¯ü.|É•ñ‘£ä«oÉzðÉvoÌ8+˜uœš±Y4øýFi{™”pY« Eaæ#AVÊ R²ÝHl3[ôÄ&=±Q×6èÚzI—{vYVVéñ¥zl±ûD¯Ž{ĪNmgjUÓ´ª·´Ê)ñŠ×â•SäDpÔoåE&ÄÊž•-?úð’ߟõa¯n‘ëÿ:s¿¶ú¥¾ß½ãÓÕeÏDË_”´à£¦æE^Œ•¿+Ÿ¯ø¬í8é¸Õ}ºÏQõdm^"ú±^]uÈ%Ý÷[”Ê;´ÜQ”ûc ’©â -j¯$Öºcï¾»¢¸8P^þÄøñ}òóµòrÔÆ¡EŸõYµêºÌx~­Jc±s/é¢](zåÜú*hàaìÓ"$U9Šëz\KTWÇPµ ª$ߩ‘•ùÕÒð)å†="€ìS!ä à ’Ù.ee¿ÿü„«Ï:ëK‹:fþ•Wþg„g?ù8Y¯¸ÊK±§ù‡s^ŸôÂÒÊ â:öî³VU'.[>øÑq½ìò·þ篟wê<ù“O¥u¤uæÙSþùìÒÊòdîJI*ÙþÚ‰'ÁJ{gš(ûÓÇyä‘ó¦OfÁ‡³ß~;¢è¹ÅïÊÓF óšòäS9I©SæÎ/W’sev/X#O¢ (rQ›¢ò-Ûe-¡òçeч$¹•¬ò“f/è &Ãy¢ö¨¦F¯¹¶ÍÒ}Ú²±c:´0XZC¾áàô²²Ì¼<˜)ÐèÚï¢Fl8½ï¾ûˆI3DzÛýž{îAÆHf š¯lãÓµvsÔ™¹Ì€ë˜çm­ãÓ,a/x"IH¹(G„DͶ6 r`eg"‘È;ï¼C7À¬Â ZSÚÂéS²’ UÙ²85¤3xEO‹^@BA@z¡ñ1ÕF¢„ï¿ÿN‡ ¾ùŠ’ ±êÖ|ؒУ3n‡œ²zõ‘¬ç™}·l‰=ôЃJ¤evL3nE³„Iñi§¤&B‘5.Jb#Ò"7×ÊJ+ƒè I/©–2Û·Ìë¾çCývÍšg&>¿ÝЋu£X×_¸û™?úhÌG v›â/×0äpØÆbÙ°”"«D§›z13*±3æ5-TiÌ}÷O?ö¸«®ºÊL3zð`ºxRÄÌ~L> òý­YÛ¬¬±½ü±H›·¶Õ6™™õêQº~£^]­ê†¢‰Ê(ƒ8©žGB´ÐôHµ&-_{„–ø-Z&-ºsRvKXÈzâGCë÷Ã÷K‹· ¢±B¡e””løvÕÆ׿³{¿oÚ´ àÊÊʈi&‚½ 5Ï";|·õ­ óéG5£»Žy^9ǧ3ï>cefSŒäÅGÍ«¯¾FYÚšQU‘yŒx~~þÛo¿ýå—_Â}XSnß¾î£k×®âh‹4)á­8àJ¶fw 3âûöíËÖñM¤ñ-BwˆŠÒ}äÈ‘"£ F0Û³gφ?‚“2õš¤o–-c…çƒw;U骪'„BçD2¯ÊÌFÇqùŠµÚŸFÝcD®ç°¥\Ÿ6§³¡~'¥¬©ƒïJI!K–äÖÕ-r¶•ʶ…Úû–ˆÎÒ*Öž|–Kþô`AÆÿHÕg•nZº-ûŸO¾wè!#f½÷Ië6êI'Ϭ®^‹¯Ö´HëÖôêU+–h&=Bå´‹K´”» KÄR$0fb[ÀL`D[ÓtsYYY·Ývú>zÜ,'}ƒ¢Í }E\[‰|–“üí)ï¶mû*_Q¶}è¦õÛî¾ëÓ Î»ÙˆÏ:¼ßú¡§¿+Ÿ®U}¬G·µ/Òº¶ßh$¶ äÁ*†vfÄP~F?«å„ìÂkvT–<úHïᆵš=»m´êăn-KÐq)Vm›i&‚Ù´Z6̧uàÖµã\Ç|z|Ö Ò^•À†swØ ëãÆCYÈŽ!dl+£ôÌ3Ï Ê™t …ËàrÑò¼˜SšrŸ{î9$ó9sæ¼öÚk<¦I‰@Ç>èš;4–X¤kÉt²í$´Ú=öJô—ÖÍLä5¤>ßL™2&(G–ÑÝzé¥}¶eæÌßE"—ffÝ‘•ÿTv᤬–dB€Îf£ãhËWøªŸeX¸>$1=¶)†Ñµý¶‚ì¯ôøÜDôÝLU½òÒÕÃÏl?ù…ʇÆÞ’Ÿ{~iñõå;ÆV”Ý»xI`ÐQÏûðäÉÈ_°(ÿýïQx-^¼ÿá‡6›éK,$K–,¡9äzùå—Y'ZµÚùu߆%‘Rp¦¯¾úªHIGsщÜ)¡æIsM) ²u1\USÛí·tÔQÏÍŸÜõ7üïš5T–ß\¾ã’Òí÷lVÿñÄŒ¾'Zòt¬ôµhÙêýZËútNthe´-D°E7jâÑ‘Bj޼9³ç´9·Vè#ç/ì0îñ[3óά®Ö,èiè]já;øšùcê‰`–)c‚Ëx3Ø0O¼mÔ“¦ã\Ǽ—Á`°—êp^Ë(¶~\mãk%¬Ê 7Ü`6¡ÌÖ æ+ø)Ñ["Æ™Œ3²Ÿx≠ÒÉ#p[P7$‚ŠŠŠ’’³|¨¤îÝ»£eg;ê'ôд D^hP ò«Š·#pµUù è PoiÕÚ¬X톭.ñˆr‡/Ó|“Nþdb\*éÈ m}"±NOô2¤Óa‡]wóÍLˆôÀS  K°ð/ÖfzÄ’+¨f¤K櫆öðP,o[·nµÁim‘èâÇÇ/þî»ûo¸>¸mÛ»ãŸh¯:‚}ºv®Ü°IŠÆÐCk:¹ÏV”xdk¸Z¯ÖµU‰ø÷ AOÎÈ(O$J¢Q¨ÛÏäÍ5ŠH+œ"IªY H5le0X+jÞpHRój«–v ÙJˆë¶·µ>Ò‹l 8âˆ#P–¬^±âžÑ£W.^ b§rw5°¿è*÷S¨Z]‡** A}jv&÷n—ôõº¶.¡}¯óK|ŸHl×uôЮWw-Ó´aàç.®ùÅ÷Ó… Š4HÓ|ú tVTz¹£¢ÊjMeöš&(×w“·w5 ôPЦoñ í'=' çÅnO„M›¶nW¦Fûÿ… ›}•$5¤Ÿ¡2ÉO<ŠÜ*/¿U0в´¼‡è¦»*Á<¶Ð¸!±=/I€jv$#¬7ßéZò—H¬ÕX<ë²Å°!Ðûy나)Ô‚µšL(r—@r)‚)î¬Û)jvÍ' Èß.àƒ‚å†Íkt ò´,[SÃ@A›øA¹øç_õÀ§/nõ+z¯ÍÑùM8òë`¤{"ÐRWƒ‘¤ö×vÁ“× ¤>(*[ @‰$bä}«±<êÄÛ²ø{!и{j»nlÅ?‡÷­¹ØlÉæÕk8;(*;ãù(( PüÐC©*jD2±õ±n9;¿±•š¶Mg§Ur7†Ož¼àßšæ—H’§TƒÔ K| c+Au T%›k˜ oñU m•¦ñÅÝ_÷L\ý¿ ‹}£iüDK‘è;Ôžj ÕC ¶‘Õ¬Û(d=ñ…([Rz«!~CƒYØôý k°N_&b²UסM‚{j:ᮆ/{OŸÖù$'è|nkàIéª5Š”õ>3Æ‹ž j¹™›*+¿3´ÏÕ3ãÑWcÿ¬.%Zù~¬z‰_—HÚ…6:GÔàM„4ófQÖö÷l²Ÿ9s¦5²Y‚%WÈ1ub¯õ‹0ÉRáÞi‹®/×´ùñØÔêªñ(;à!:¥R"!×èÔìÝ„û_?P–£œê™4ŽÉ85#ûð@°K@ÍUØ+Hw–7´)H¶Fa°‚j•¯«l)°½²>6>­µ40ìi@š:„Y³õ¬’4‰S½FÕ©Þ¦Š7  Ý$ýT™vƛЖ$bôàe¾Û¯÷åÛF–ÿ­|ÇsU b±­ Ov–Ø pNK-5¥xÝàE‘‚yWè°~p~ÌrMi‹ôŽ)Ž%„<² í“O>ùàƒ0$øýïo&ðŽO„2ɳUìÛQºí/ÅGK§j•KôØ:]CÁÄŽy”¢äpÂ8P fßQðLVáýYùgd !¶åä6£›8ÞABYÆþdsK§(ɉä¦À§ê†FÔ‡$‰½Ž¢f¾»žÀGM'hÖ@ηÖ×ì"µv¾ßsÞgXóz ³Ü]S^²êüó¢CNûû´é?`Sná„\k7·ƒšå³Í’£|ÌG3†D6 ð¢¢:aÞc‹(™¯;w~i—i´Ù(Vàyt63B¬…ˆpª”N8ëÔÅÎ춪aØ­ÂF­aƱ‰äŽ;î F¤I…O[ ¶G>´!š½­º£¼ôüŠ£*Šï«Úñz¼âóD’*aägë»ôXÌ¢†/ åŒË,d_Û-Yy¿çè•P›aöߢ«úYPSw°zÁžœVð\‘\'|ZKÛcaO$‰½êŸÕ\ìéb7ô˜ã©ˆ^ÌšÙ¶ëݨÚi¦vL ¹ÒŸÀFO?ý”//<`ÀÚѲeKÔIpÎ^€'×À™¢ìíädί!&ÕÙð϶“|—.]øtÍü¡Ræf:æ¬sÏæxŽ4X½z52—iÍãħk‹ˆLûÙªÊc*àÍL…ça©RºÂ ^º˜d®m-²ÞÙ¬Ä/L…·Þzëã?n®4N|:wK”/€_µzõ&|ÛµË˜Š²óK·*ßvoyqéIÇmìØ{ãb#ŠJÈkž¶²úë@ÆuáüÿÍ,œ°™—_öÙ„ç^ÿØÜ©SÙ£ ÖsHÌ#ƒÉìÈ£›¨š­Ë´ELOúK46’y럢œf¹{"IØjœyæ™t*Ž"! \°@#­ ;ÍšëdTíÌž¦vê¥v«‘¦·°{<õÔSy¤˜þbØ-^yž”œ'‡$R=‚ú˜1cˆa9ržm~œ'4xvrr|Ç0 ßùË_þÂîmÓìÎ <?ß}÷݉'žõíT'>][D$J=²s0‹xtÞµ™®¡ça©RºÂ)À¨µ‹IæÚv‘ÝzGX£QO?ý4Ì« ;rÙj+8ñé>ÕXréawÈ[Ñè¢~ý¿¹äb„»GªK§k•ËõÇ3pÀ _l…hÇ7–v[vd½8%pÍ-=žØê­©gF2Û«J·víÖ¬ZeÂÏSµˆøsÎ9g„ ´ÂÖ:+ðé›i͘þ°kJW8Í^ºØÙv‘¶}L=³”óÿQs¡já4Tx%´Ý¼² †TÀ;ÇR€g7Àgñ8?Nyh£*ý¡³»8¨M›M ±}<;àx>ßåÉÊÀ@DzbÂðp°OVþÂDõB-žÀ䱬,7#&_ˆo&Šêð‚Ï:ظ‰= nTI‰pŒV<š5[³ˆ0EÙNHeªvÐðÛ°ëè2Q²À¶˜ÀxQ⯫òæ›ošÙm†ï°QLffÀô"ö «´¼Æ¤BvCËÃÚnÖnž‰á4»wÅgª|òɘžÿë_ÿ2« à>U3IlCºÇB¸Â)ÀðÒÅ®mÙxŸþyÓØ˜Ùºøâ‹ÙpÈ!‡À/Àbˆ”6|¦Þ9–ê üÆ„>½:z×¶m™ãÆ}2ôÔé­óªöÇH­,؍ެ†/ åŽÏhq}qEÕK/^5ø„!ýû:çÌ …:Ü<Á ˆÙºÃ;>EÊæº{"IHFœIŽÌÂᬧŽx1kŒƒX之ÇT§ 8­¢ÓÔîÝšSwA±m¾yž\€•™1cwèšÙU6Ãw>ÁÞxãÇG{ ÌâÔ®PÀ *wÝuÌ Œe U0Ø€g ÃË8Ï pâ3U‹P–!˜› tÞµ™"‹ !i{°¥ YÏ`0aðÒÅ©ÚN!PsDQ¨°(3Rž}öYÎ d=õàƒš¶&6|¦Þ9–\‘L^€‡¢=öÔSCoºù¼iÓª°]¿Ì#ÑÒ÷´ªoõx1²׈µô`KÓS“~=íý ³§OÓÁ)í23—,Zd;ÂA4Ö‰d ‰ìÍuo·ú™5‹»ž.€_ZëÖ¤0^ë™é1ëx8D@r•Úd‘ñˆRˆ iªn"àálgƒ+>m-‚ÒAõ yK’lóUšfÚŸ~¬(²bwÂY',¹¶µ-ºæškÌJ P,Š|Ek$aç`H¼-oá¸ãŽƒ‡§pŽÄ9$Ñ·ow-_óc¦”ô:Źšf½l}ÂÂî#-ú‘ÃÚi‡žIj:Üú%ûh °ƒàÇÚ4#VµBqx†¾&Žt‡i"ÀöË.Jðø@ÆQ¡0§¬¥³³ i!ìbîËV)öI  EZHÌŽUÏÕª×Ǥ`%Ó„@‡w0ÈS+EýU ||@T’$ ÂÄ7;^ ‹d²-£_ZÎ#çjVË”¦Qf³àÂ'IÍ‚v¿RM‚¸›eš6#]˜ˆK 8hÔ’’ü³@70n©&mj£ª§†29âÙ„†8•¼LÒÙaÀ7¸=ù$iÏãܯÑÇ@ÓbJÂQ–‹âqhÓ2=Î.´©æ„9!ÐåËJ_5|B020î ‹d”)+xI(–ôä¡=fìž ØmÜ ¥ì­²Ö޹–é#D`À ûÖì€ú «ºXU ½U÷àPFw)/%]œ³ë2;éúÜÝ~£“87’U©Èóµ8_úöd¿KC† ÁjÁ¼8Å–õÂÛŒé#D`À Ö‘@xCˆŽ;µÕ/¿TuÅUCN/;äÈʾG¤ùEoºI[¾ Sò=ÙLûVIÌšl`ô„µi2J>BüÁ°¯†\I:B’ήJtÇnÎlŒ#€8;¤¿ªHŸog‡Àžéw;Ir@åGøð1ðÿ‡ƒ×eäö«ñø”¦y|•›«x>ZÁ.Í=³…Ò]’L¢ÿÊÇ€}|†;2F‡]kCøTwF0ów‘Œ"ÕÕéj­Ô9O’êŒ2?ƒ}íUõà@¨ÅÎ3¾kiM–¬ fŠà÷©–¤ñzOÔÑpúeøð1Ð8@y4·(É}”^/ÜÒe…ùTç5O}ÓÕ¬úVáçó1àc`/Â@Ž¢·QÞv^˜´a‡ª¨ÆÖdg`gLYa˜—Að*-þÕ.'À»r7ò¿O’¡~q>ör ôP“›lÑ“êj~q)éœs*$£"éw€»wL~ì籌#¿ —¥ºáÅÊ>N Xcu¾µÆø$ÉŠ ?,‰Ö}D˜اâ üzb|´Œó'¡8¥†QesCn¶¼™žtIìÞæXõ¡5—moB3ý‹®¶éºƒS 9sï&{?~9)¯vM ç>„'*R‚¥qm¥¦ý”HT¤ G‰‹/d9‹mê;I—ç“‹‹3Æq› l¢ÇÏþðÜàÚ¡©aj`ùNWè ,poËÞ(ÝáŠ%W×ò{[ó§°°ýÄ+W®ljØö„4zoâ ¬ˆ`¬Md[ùv’§GŠÑ£Gãü‡ù9oz‰… '¥_xá…¶Ì⑃Ð]ã‘®)]#y‰qM)¶¦wu…ž*»ÈXoÖ¯®æ¥"×fZ#ëÑ6Ë,ZíŠ%W×ò$vm¦ó™Î»kJ×2y]c.¸à‚h4Šû#×·™ !ÖîH_]šfz i²[ëmŠÞÄ1A=N:é$kEÀÓ¥KkL£‡í$IT°hÑ"ü>C˜ GýúõKU««w§'u²»ºlwÍîZ—3%n¶‡¥¸ßzÿý÷áQɘʺ3;þ¼pÈÅ…»˜Á¯¿þ¯§®US2Ž ñGÆ[Îi' Î-g‹0|UöìÙ“W—íÞ+¢„FÇe8EÄ1°$ΙwÅ’«kùTÍtbž”Î˵HæDÝ믿ŽotÕp@xTÆi°³@3¦OŸ>8‚‡*‰˜T}d¦·œã“9†Ó½aÆ‘ì†nÀ© 'B\ûÈZ¾v6³NƒÁ™½}ûö8Ñ›4i„ïOB¾nºÞÄO7ž8ÍÀg5¾¹™Dä1ÇC— ?— `vwÐÖ,u »“$Q nËp»fúÀrít…N§'u"]]¶»fwÖBŒ3%#¦¨¨\\vÙep˜8;%Y*WèÎì®Þî]«ã¸!Â8™·L8yÜöÂtà_—“¸Ä=!ë o ±×æ²Ý{E”ÐèX¢Lxo¸*4/ãcÆŒ!ÆK´ÂéZ>U3˜§XçåÚG®eÂ|ðÁ‡väž%§7nthÆ0·™-æ£k™omçød]aÆy' Sy¢¢bØ»"„¢\ûÈV®Íô>\³Ãàúœ†:ŠB‹BEMÚ› ¹[·nÖÖá™ä˜ (hV±§žz*i˜ô“Ñš¾a÷/n8GÃ-ìå—_޳Esx§ðÛǺšð ÈÑïô¤N^§ËöTÙ=V$’A³Y1`€q5CŒ«+ôT­[·Ža‡3EÖdg¥f ž§M›ö»ßý·”¸“7n¯`»¬äxv«ªªzá… [fkcq‘«Ñ±Ô¦Mú覛nbueìŠÌKÔÎÌ´‰išiüµÉ¶°-¥k™À† 3¸$é€óÍV”ùˆø€²Ã|tí#ó­-à:>Y`På²´¼òÊ+t·ÈâDñÎ>²•/]›É|ö8\³‹’•ÞÄ ÝÔ©SáïréÒ¥¥¥¥&0NàÓ”ië#³&Ç|$ÀDƒd/"Ko¿ýögœñꫯ2;xàkâú…ÝIÞ¯h$0 ÍR.k/Ì.^!Ÿ¸âc’#ÁýÂ]›09]¶»f7Ó[iR rɈ´¦·…Ód'¥ÕÛ½-£ùˆ€ÆHE»ÿ?–SâYÄ 5Â-"T˜Q á \°²f ¼TÔèX*'sØÕ5¦H[8M3½`^”fKéZ&’ ì (}üñÇGŒž/^lÆúÈ„´­ÞÎ>²¦7éÆ'CWˆÌÄ®g¹&sm¦™²ÖÁ&» Å‚(˜£Î,9M M™¶>2 ~tÍF¸Ð˜1`?ÌèšaâPb˜ñõ¸ n lúôéVz„»q¡O F„gÏž „T ;çêIÄytWïÚ ×Š\SŠH›+ôTÙ¨]Y‘4"·³¸ÝsÏ=³fÍ*))!%Ëó‡/ȶÈnh"ˆß°aÃzäÈ‘ x7 ôXQ°ä±;ºY-Uà•`Þ|óM*–ˆ7=Ê›×fš%Ô/àZ&¬.Dœî`LCkÐÂ{¦)ŸèP˜cfg™¯¬×ñI"®º‘Ýè>”8"‹‰3àÚGÖòͰk3yëq0¤ÊN Ðľ}ûrG@A|56Eo¶mÛvT›"pÿý÷Ãm°l˜‘0.€ÁNÈ™3gšñõØI’X%¬n‘)šI»dÉ’yóæF”ã12a§+tWOêÌ^hœGwõ®-qV$ Ðr·ÌWBÆ÷œ9s Þ¢4gvØÑ+V È èСƒk½fä”)S gðàËn¼ñFœÊÃR¼4‘Ì¢§žzŠå&–EL€ä½"ïXòÞ@EÛ¡›3fÌànÝAkÃ’(ÓæZÞµ™i0OuÖË5¥k™¬üLBjg„B޳–ã ãÀ} 2ë+[Y_™a×ñ‰híµ×Þu×]¸ gÌЛ,±®IÕGfùfÀµ™ÞƒkvQ¸`FèMÖH³º¦èM$\Vbä2³ôNEEG†Y#ż@³a¬w¸¡ç%ÁÈ1ÿ°­°0ň4ãYa`©—aFºf7ßZÞSŠ\,¡VêšÝZ5 ²N<ñDS±Gª@ƒ‹8mM̈áѪ鰾­5ÜX‚û  ®R› K®à¹6Ó5¥÷Ȇ— é‡Yà™¨4U¹‚ä:>]SºFºö‘kÊ6Ó–½k×®,´è¼ ¶y$j'½uÌ7$†1dò‚ \ËIÙÌ%p(6z¬æ×Y+ܬ0N<ºf·æ2ÃÞSŠ,¶¾©kv³^,ž0±,¤VzD­ Ò‡]ûÈ5K›iËÎ#swÎ#Q;¯\Á°FÚÊ´¾²†Æ}kÌ '¥q8fì«rŸ«ˆ¯ã $4û\“÷9€ }„ЄrgŸëšº,#ŒÐÔôÚĺê§÷1àcÀÇ@ý0 ”ìØh]¿Ì~.>| 4.TTb-‹ŠÍíO[_š>¼c@ C²"·((@£Ä§h—÷ü~J>| 4"YÙÙ›·l©¬¨lݦ5»øªÝˆ¥ûEùð1àc Nø?›ýÆÛN;‚ÞIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu-x.png000066400000000000000000000324771477365367100217060ustar00rootroot00000000000000‰PNG  IHDR†FG}¤² ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ'hIDATxí˜E¶€;Ü0y€! ‹‚ DÓ*ÆÕ}š³"ºëšw]÷=3¦59¡‹û|º†5­ë*ŠEAED0€Œdf&ܹ·û¾ÿNIÑtWßéI ãvóÝ©®>uêÔ©ªÓçTW£qÄóæÍÓÂ+ä@È[".t]D6ËL&“a¦“K!CÂ"ÇC8Z}0hhI½×ÓO?ÞüºòÊ+ÃL'KB†8¹A:dHÈÉ–Ýe¸Ê—‰òòòh4fJž„ C8ÚN2¸E’äu˜9r äÀ–ç€±å« k 9r ä€B‘äÇ™0?ä@Èvà@(’Úéa•!Bøq I~œ óC„h„"©˜Vr ä€B‘äÇ™ÿÐ|Ã:$‚Cþ‡²2lv³8tüIä=zô8ꨣä-‰ßþö·÷Üs3§%éx<þÜsÏí»ï¾-A’$¸Ç¶ûã?þĆ˵™/—~ýë_ýõ×tP£ÌéE°‹³ïE«l‘,`íÞ‚®ïDpäææÂy?©íå¼³,é&µ½µZ䢡½n›,’vÛm·;î¸C’[RRÂ~ÍE‹É¿ÄŸþô§C9Äï©ÌO$kÖ¬¹þúëé™Ù¤Dp’¢Ý’$µ.—Øì 'Œ9òî»ïîÓ§³½J.­^½zþüùëׯwB*ÓJÈ-F¼’$e‹¼-ïMÓ5\m³Í6÷Þ{/]ùÜ¡3KÇy¶V‹¼˜Û%§É"ÉEå™gžYWW÷øã»ò½·|ðN;íäÍ÷æÐ—ýû÷>|¸÷Qœà$ùa3MÓõ¨I$y…ip’ü¸Ô<’8uÚi§uÖY®æp«$‰ØÇşŸ~ê„W¾ê•[ŒxÈó2DÙ"gCdÚ¯7½8)¢l¾DÕh"ø`pÖž¥ã”5úµH ¼•gI¨šÓ¦Mûâ‹/²Î&í¼óÎï½÷RIf¢öOœ8qáÂ…ÿþ÷¿Å›yÿý÷Ÿ1cÆ{ìqá…’àÄœöBŠüo®ÁƒKœÞD¯^½æÌ™óÄO07>úè#§­„$ž{î¹~øá—_~9nܸ7ÞxCTñË_þò©§žúî»ïž|òÉAƒÉzƒ0æ VçâÅ‹_~ùåÊâ.’”Äûq退¼o¿ýö­·ÞÄ$ ïJ¸HŠÅbüñ' ×öÛo/€/½ôR2éJ¸œzÿý÷»u름ÌFük¯}»`ÁäW_ÙgðஆÑÝ4JM³Íþä—ýúmcš½2Æ/L³§iö0L`:F¡aäêzÔ;¡5ͯ\-¢ Ê.&ßË:/Îm·ÝvöìÙûÛß¾úê«)S¦Ð³‚'~Ab†(íp ˆt¥¥K—¢—õíÛ—W/ùAHbŽAÏ-·ÜB»»G âÍhÅŠ(&ˆ$D¿¨Ð¢®FIâ]Ç;v,CF¡Y0"+++•$‘é%^É¥µk×B‚’—-Ê— & IN`WÚË¥¥‹—ô(*´W¯ÞÞ²ºÆbź±Ý¢…å_Ìï4}F"b™0±¶ªjÔÒ²Ãò‹£år*k“ümäúZ+^Õt†Q¤¼ºð•Iyµ‰mkêLM7#y¦®SgRoFÞú?½#¹›Èø,³þØ5ò“øÛ”ïJ¥5û¹Wd0Eò--m›Fá›S R)$côÍÉñ s‹’é4=~ð²eÛçwJhéštºG¯^}dÅÝãò¬ÔñØoFž: YgÛi»>­9{SÙï‚ Fj8_n»í6r²LÕâöæ›ofmŽ‘L_K畵ËQ'KÉ„w؈GÎIàŽ˜$’°rq>`Û6-d;Û‰8pª3¼`_{í5ºùã´2œED:;$o¬*o)Wކtùô´x„$€§Qa´‹‚Ã÷ߦÃõÊ+¯ÈG4JZÄò#IT§$^m”$ éL` u6ôÕŸ|²O^ÞÚxNg %=c+!ƒ Ìhò®»Î¬ªÖrŠâºÞ}æl3eõ­NÚÏN8 óîÌ"™? ‘ôÇózskD7!/_ÏxŠëTïM¥M¥¬ŒÈËô¯®ÙZzå1MãO[·AÓVï¨#P̘ÛWÓúFréÔÂkÉ ó¹O‹æ%"éÜù bjbA `K;‰ÆTfÙ(2±ÀÑö_}õÕÏ?ÿíà ¹nÝ:Þöýúõ_£³@¢[ 0ÌÎâÊ4Óu×]wåÕóMÀ!‰a‡²"{úé§‹‚B¡Ú¼óÎ;èGhRB ó4Ièkˆ$DÆ!C°ÝfÍšUQQ¡$Id*‰wq‰ñÊÚV~~þu×]Ç’Le’ÓõŠ‹÷..NÍúøhø¬KÉ Ewb åuêòäSûÌ›ÿ‡œ¢3b§Ä މäˆä Eí·¦ ªµ™±~F´`Meîº …¼‰ªjÜ þ’MKjé i{mÚª+íR·]Ï%Qý+=5×J̲U{íüMŸÓŒÔÚaC+Þçµdͫɚ—“Õ“¢¶öÛföî>!Yýb²ú¥†¿‰ÉêW’5ÀLJÕLNÕNIÕ~¨'gÇ4ã×û~]ÿJ·ÙÉ%vÊêSšè\Pmh–ið"ròS’,¤T¼>¥¯*/ÕÍ>F¤ûÚ*sÖü½Ìø‘ÜC#yGÇòKÞ~oÀÌ9çÅ /Ê):§¢ºêúö›1cषö-[z|çND"ÛÙvºšJ6»²L„Íà²Þ¸Æ§ß¨c|2•ÀÄ€ä’(•Ã&Èø”¶òD - ¹ÎRV1ë…Ì|§¢ô÷¿ÿ}Ô¨QÈ©Ç{Œ¦²Þ1yòdÞçÀ`¦É)Í£G}£fêÔ© ,1bDH º²²2äZ£¼ÃºÆ–<4d „$Vµï¿ÿ~– øLÃ÷lY–™ÏÅBþòåË8ƒÄ»tôèÑ7Þx#8Y&vêê.’DuJâ]\Bƽûî»,xýå/a…›_Iª—¤|]ïa= ³Ô`Øèª›]£Ñ‡תkRÿûà¹ùZÏ^µ+ÖÆÒZf¦}·œŸ¾F¶`EÍTNl]m]é.ƒfÏš³ãþ{WöÃ÷e?÷§óõ¼|=7WËÉÑãñ›¯¾º¢¢ Á´]¼çiçœÙ¿wŸï(ýßÿƒ:}T·n#/¹dp^nYÙwßwßܺ i-£š^~éE«¾éÿ²R)!T2¿zFÝAÌ@99ñç_xUV³íÁçÚšm]xÆïk**†æôyö…ÝJJÖ­^ýæ|–§ëyšÑ¥°àØ_øÑŒuß,†ùšÑ£K§B­¯ÑR?)™Jô kMÓ½“Tñ¦Î`‰½W~ž½lõ '"§’5‰úÛo»ÂÖ–åä•—§f2(YþÃ÷ßwߪ‰fç%æˆÐ²I‹[à ÞQ‡ðÙgŸ‰}Ï<ó ÷Úk/Q\9l¼ƒÁILÇJ7Á_ïjXìü¸&šÊgfT•+®¸B¶£ÌÕ òú”³{¼pœiùÀLŸ>]–ò&жn˜3ÕÕÕR‘`’´ãŽ;²Êþ׿þ•å'Ö¡irDG9gQ“‰- Iž²2Êò™,.N’²¼‹KèJ¼'Í„¤Ç~ø™Ưùt.s 1Ä·ª.ºY¨ëš‘ –™¥zÓ[¥Gl¢M× »Ò¶*µteÚ^Ÿ¶ù­Êü±"c×¥Ó‰´ÆêLC"…œHó›É¬Ï$4q2ö¼ã B|.v t'e!¹Ðc)£ciwì1;õðÐ]wÅu­Ï6ÛŒ:í´·'¼X½jõ)§œdÔÔLÿ÷„bÍè‰ ¸cí÷Ërêêdéì!g«Ó0ó§¥aÎZþ"ÆrËZ’¨-³ìµ¶j0ÿýq(ž8ƒx,[¤€Þ˜å7lš4>7"Ûzÿ7A$mU`Qu ÛJ˜ëM¥^dÁ>ûìCA>Uðq ;«©Hš ßâw‹FwD‘AÝu“Õ´€ŒBisRhJÂ#šu åi«³ˆ©å7sì´¶^ËÌÖwX¾]c“°ùØÄDâ/þ6dÜvl¹Ó(«³w1+ý°Rüaî!ß‹t£«avkøEîw7ÌάáûH{¤6¬nP*ù–—^“FŒ_^ Ëlk±•ú¶ABU²^¾yEá’ÿÑ"IÉ‘­ Î€Íæ’“*Wšmh3gÎä¼{å9C#Ÿ6i$£¥®´lÞÓëë_KÔý«®öѺêñuë鶴[»n|¢’VŸZ‰D—B-’јP|‚ØÆˆìbÆÉe5ðìxᕹEcò‹.Î+8"žÓ/b"¿$1"œ¤€ŽÚ‚Ÿ.š[~Û‘äô¼Ã·s¥'>jz‰ ~¨ZY\ tÖÞÂÐM"žoÛ®ù|Ïò᫽ˆWòÓÛ"ÈÆ×í¶ÛNv6ÙI<ùÞfú1ĉD¤ý ½t6©‹½Å]U£&°[…}g't›HØDFŽ€ñ . Ê[$Ô Ë^`§ß¯¯ŸXW÷T]ÍCµî­­ºÛN˜×]6­WÉŒTV¶ø‚É”C<õ6"CÍø™¹'Çòÿ˜Sx}^ñõùEgææí‹b áœ¤àŽšÄOecÛ:3Hb¯º8#Ξ.Îyp^ä裔9ÖÌžãà‡ª½§¢³ÔÎ÷{®ì>Ø(Àqv¾¼@ðÞ{ïMC8Yœx ‡ Æeo''ÂÅŽ5¿ƒïèÏ.O-$¾oß¾ìN`þ@s‰c:rÖy9¯ôàå§²E‚!ü¢D°9SØÂ~Ä{›éǯ³?H%Ф‹S¶]6J&ØÆ/Ž 1$Øw:~üx)—½üôï7–œÄ4¨ÒNóÅmV2ùÄâ%ß÷Û¡ì€ýî«[smÅ]‰Êgë7|l%øa5ØkdóÁFto3çøâ’‹·ë÷ðþŒÉ/Fu:,ß½wï÷ß*w2 b$³#n¢]MrÌ|@~JŽmùD ‘ÄŽíãŽ;ŽÎc‰W$hÝô¨ •QK#t{57éPµ·x–Ú©—ڇ윔ˆ42ˆsâ =­`O9æžx„x ñ'Ç™5¬z õ[o½•À „”Ó·üaÇ6k[NO-$žœTÖwþøÇ?⽓]~Ä+}xù©l‘ÀÉ¢.80,n•Ä+›©dH¼Îü •t 2íbÀ”mÅ¿k4ꡇBYàíÂŽ\¶Ú ï`ðï7–²ÿõÒ¥¥Cv™“LNN$ž««}¤®z\mÕ-µ÷$ª8Ló9gntvÓ7hE5u±•å±9 ‰äœ+¸ §hð”)=^~ùÄœœþ‘fó¨{÷îl[`¶w—––’à€§×…ƒ“EKƒðS@¶Ë¯ÛQÁ±^›4ž#µW_}µíUæ(5‹§AU+‹#üjs£ YÅäl nžž}öÙÃ?üÎ;ï”Ô!žŽÇ=ÀUW]Å6zZhXJß¼*•žZB<¤"æx%2…XËýõ×ýˆ'ßë3@ÉOe‹ZÎqZ‹FÜ*ûb”ÍTº1à C·J:åiøF»XÙvÑ×/-b ð5E_HØ;èûb‘Û5(¨$Þ;–‚}Çf%þ@ž¯×³± Ô0Ý{ïQ#†O½çþím½W4±l¶›ujX×ÞŸ58j–Ä WÇì¥vjU*e/YâõœÀ{ËeS+ǧdE~Jà-Ÿ$’$YBW”·$‚kr¨Z,Oˆƒˆ¨®³øÞÚ!€—[£>0¦žþyvñ³pàôï„xa(‰C0_8›ïL£>0â¤Ë`Í&µH¨îR?•ºˆ'“™.ŸJ~úµˆüSO=•³Š´ÂÙ.ñÙ›é,˜ÝÙƒRI§ÒÅÞ¶‹â¨ø2E©g–’Ã-fþÿ6\¬gá ]‰Õn¹øéG¼w,5øÌ†UN¥àÀ§kWí7‡=xË­%–uÄnÃ:tÞ£Oõ5£…èNé4‡‡ûÑ>š6ĈUÔ¤êǻԌÎÎÍ+ŽÇ4‡* y$„ŸAð´L úé!±ñÑIJÀcÍÎ""Æáõ.àw*Ú¯ö€ Ñ·Q×YËäöp`$hB<îÓŽèðèJ¨*/½ô’l‹ëÔ¾Ÿ'€½Æ¤Âvc•‡w»¬ÝE<Ãë3@ÉO¿qš£çÿú׿d$¼Äû5`CXûèBI§ #H+Û.Šcðþãÿ@‰[f#bèœsÎaÀî»ï޾€Š!¹øéG¼w,µøOçÌÉëÞ}Ä…V 2è.ÒO8ážÚª[k+­_¿¬o»g‰ØÂ”£ë¥œ¦{wæYæ¹E%gÕ'Ó?tzn.‡» W8pú puGp~ Èöú $’X‹áø>6 ÎI8½Žp¬§n¬³È°Žó3>jð½`„ ä ÅA¼äù·¼”ð.€kìŒd‘ °·x–Úƒ€Æë.È]ó-ñ‚$üLš4‰_ä9ââì(k˜9¨`äO'Ÿ|2Ê4 O-$£*cÆŒAy¡pŠ¥ªsjƒ"†Ï€¹sçRJÆŒñò“²dz[D'b˜———‹Öñ«$^ÙLQÄÅéìÍ‚ÉïÜä‚$¹†À¤‹ýÚ¤9¦(RX`ÃÁË#<‚B6ÐSwÝu—Ü”çâgâ½cIÉdj B< §¼óàRS×n3“É—ñg_[=vémôeÓ†ö'U» ý[Ëh¯f2Õ­ÞÊý¥þÒgÆ ÿRÐùÃóÎ}ï¦íËŸ}ú)œIùëer@’¯Úë·θ5ïX³h°Ò»S½Ñ­1Xa0½QŸÙ9x4DHRZm2RžR·HXa&d©ºˆG_pù €%?]-BÒ!õyŒé,dËGYšébzüq²È‰Ä™ï¥³I\R¶o”´è’K.‘•’- ù¼™¤½ƒ! ñ®²-$^L„_ýêWhâN§ï§ŸvÚ>|ãx(ßÞŒìdÆvŠÄJ5|ÊlÚÄÄlj–§S_[©9©úOSÉÕ–%9»# ?Ù·‰ß˜”ÛdwµrKܶ‚HÚd†u„hÐhPZr´ YÕ6³†9¾Æ¤k$'$~ 8¿"dÓÎft°ãØS6q˜‘cF?ؙ埤êç§’lGp"É’>’7G:ýa²~}à"Y°µäQ(’Z½°lÈv಩—ankš;š‘!èMf¬+ªðFµ WÀœû]Á‰_;ù™•œ™¬_b¥p7žåÕŹ…½ÌÈc‰ S‰ö= Ù gܲ45|r ä@«sù‚ë¸Å‡xS 8jgÕ/e¥IO³)œíKœ­ËÕ |ªp°®¿ ŒDr 3z˜xJb猈æ²c“ã,Z-ßdö)ÁÛ63ImËß{ȶã@]Z[cÛì_Ô ›¾´“[á$¾SXbk8žU8X×ψ²µK4ÚÓ4ê2¾1Ó?m·m  ÷u'Äóö0ãøçÄ9rŽ®á‘‘×vdgÇФìü Ÿ†ØÚ9€æƒúƒˆo2²)ù¥]¯œÕdüg6x:FuÂ[f=Ò?‚KÒXf/¸¡ápN(MûÇb‡GsqW@;d=ŒHZO/µ-<·KËC‘Ô.l+ 9Ðúhpæ—þÁ²1èˆæò…,K§l=®„TBi²ÃÇS?#²S$:$íj<Ëå„*’ ˆ P=Hn³ÓÏÐk}ÒC‘ä`F˜ 9ð³àÑPËí42ÙÄ×·…vr†ÒdäòSÏxqÂ@#–Tf¥ÉŒíbÆJŒÍüv ¹XŠ*×,œpáÐn _¡HÚ « 9°…8à1è2JF™TšHd\bþä³w3ªð틜be ÿ\[Ø~sŸqc¿{«œÔq\+Ì "8†Ž8;0è–$“Km{~,=#mõ7ëw7¢»±­É±uÀ9ÂIsô—}O§äæo0ÏS©-ÙïÚGÁùyáˆíù΋€BafÈÁp08GéÉDÂZ¶,ùÑGó~sxõîûÖìºß_íÁÃŒ·–/ß’Íto•äX“Ëчž8mfÊ×HÈp0ü CoM;³¦þ@ƒoÙ®r#=1š~º²¢ÂŒl™~w‹¤lÔ…ÏB„ø¹p`dNîYñBüí6Ú \5=V¿þÕº:645 Ür€ì"²åøC !BluèaÄJ)Ý~.;}Û‘£ùûrš|ãFìð-|Ф20,r ãq`Hl Tİa©¿%lÁnÑÈÆƒtmØäP$µ!sCÔ!¶BÂw¯hl[½q“MÏ®îÝÌø ±<ŽËÉÌ6J´ymDwˆ6ä@Èæq Ÿé¬¸1!ˆSRK'Ó¿œþÏüj™õdâÕþ§4r¸%®òº¶âФæukX*ä@GåÀ Ëúg]Mž^‹›JÎß¾‰-Ú$ð—”ùmŽ/·L¢á‰ÒAöMÑÇ˧;VïSgN(’œÜÓ·ÿ™„–o­¾ìÐ Q¿Ê¶WÙèC[éh-‰ÝÛ¸U?±áríMØJ›õ³&«íº¯†øœ&¤âÖÏ?<…KÿâmGmbˆ— -!—¸ø'@–m[ç¸E¾ÄñO..‚› ØDO4ž‘#G€ÐmMS ñŒ7ßÂZÚ±x«t‡’KÊÐòíØR¿ªKJJØO¼hÑ"?€ÖÊï( iõÞ$>X1Áxÿµ3âq‹$4=J^{íµ]tùñ·¼ä„ žÒÏ:ë,%R¡+ó½™JHe¦·,9JHA°>x¼yYªÙª_S;,HEÊf:3›Ñ®“Y4\É%ehy€•Íôr^òÓ•PB*qº úÝü†Øv„?òh­|?†8»#{]Yšd0d)-z“Àýû÷>|¸³"è!(¼3§ÕÓn‘$*˜={6qŸLÈ£¡C‡úÕê ….Ã*x#©S\²]Y\Y—’0[IÀRÂoM™2•‚ÁãÍÏ‹€\\„»Aœ?>QO•Uƒ™À„Ä#ã)~Ú)Bp Òä£ÙŒX•$G²=xE`hu.sذaQăKÂϼ’K샣™ ,ùš)(.e3½œß¾ÙeáÅù /  ˆˆÊcÇŽÝ ×æ7;ï¼3àEÄMPÙG›úéÎ;>™c³fÍ:餓€¸âŠ+j‚Äñcˆ²”y›Ù¤Áà-Þ«W/‚è=ñÄJ¢? ûºíz“8Ý\Dât¶Ž˜ÕÄæÂf™JÖ9ᛑV‹$ˆP_„]“1°¼Ø•¡Ð½‘Ô)¨ Ù®,î­…/$#†øq2ºà‚ Ð0 v ˜_(toqe´{eÕŒuÂq8™§L4yÂö¢t_ˆ“çŸ>ÊxŸð’0{]!ÛƒW†Vç8ѽѪXyÁ¿õÖ[ÉQr‰VxCËû5ÓËyÐz/e)q¢ï²Ë.{î¹'âžW AW®\éE(s˜ÛÌy«ì#ùÔ•ðŽOÞ+¼€ ÞÉ‚)ù¤3ʨ,K‚Ãâ+¸Õ¹TZZJ]uÕU¼]»¥%—Ègx¹L‰,Ítqžâ~— R‰Úa†ÖÃ`C$ 0@Ì7?œ˜,vȧÊ>’O] åøäÃR.¯ÒÝ¢ˆ—!ä{ûÈ…_Ü*›É|8”ÅfH¥7 B7qâD”ˆüâ‹/ªªªâ$$1^â³àtõ‘DÂá¾¼%ÁDCd“/3•¬“O›‘P‹$¢_Ñ$Ôx?¤ÂÊåÝ‹²ÀEˆWÄ'¡ø˜äØAh¿hײ¬7d»²¸„w&²@ qɈt»ÒYЉê‚÷Þb 1RYÝ'þ¯Sx‰!kDXD!FE-<ÊQß\x‚TÔê\K‚Næ°24¦‹Nçm–fá¼@å‚TâÄD=¥ãÇ5j|&f¯“Wš éz{{ûÈUDÜúO†®0I( ÊLoÉG΄²™ ÑÁ¥¸ÅB(ÈQ'1gIdÁéê#‰m”e yK‚Å.ÖdfpÖÉ"Ùjà –½ñÆNyD¸q±ž‚: 4!ŒH¿óÎ;èGx êœ2’:Œ ®^I«²"%¤Èt…B÷+ÎèdÙš…É‚»—ÛÍ7ßrâ—ie3yp0ø2q×]wåóMÔØ½Ù³gOÔUX-EâöÛoGÛàµ!3•¬“O›‘p‹$ñ–p†E)“ö³Ï>›6miL9wÜ ]IÙ‹Œ ®^ÙoE‚BA-¿N‚ùJÈøž:uêóÏ?/°y‹+£Ý+«™&L !‚Á“@/=z4AåÑ A…îJ&³èÁäÓä³Ï>ËKL¼¢à\ ÞPEÛ‘›“&Mâ×¹ƒÖÅ%S¼¡_t±²™Y8OuÎK ©ÄÉ›ŸIHí¼Ñ€°ãœx¼iزžÅ™ó‘«œdZ9>1í/½ôÒ1cÆ‚œ1CoòŠU2į$~™P63ø`PÈYQBpÓ›¼#eumÑ›X¸¼‰_}õUY z§ºº—a"SÉ:'|3Ò-õ—„"ÇüÇÀvÖÍ«€á(F¤Ìç ƒJ%´ ™©,.Ÿ:Á!E)^¡NšZÜY5 ²=ôP¹°U°‚ËÒŒ˜ís¥Ãù´Ñt[p íƒ&(­6—”ä)›©„ žÙrœˆ~”>‰JýúHI’r|*!•™Ê>RB¶°™®âýúõãEËšBÁ5DíÀ;Ç|KHb#æXSž>}ºO–Ìv>P‚†â’GÐ*¿Î:éæ ã売¸³”L‡E\}ÓÔâ²^¼‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † FASCIIScreenshot¬Ô0û Screenshot 390 70 1 \¸Œ,¼IDATxí}|ÅöÿIï¡$ô&E¤Š¨ ðÿ‚(Hy* ¨ Hìàß¾§¨XhVžô" U¤ ¡…’Þîï|‡LÜlvçÞ½)$dN>›Ý»;3;çÌ™9efÎúT¯^ÝE44444²(à«)¡) ) ) ) )`¤€ FjèkMMMMò7ÓÀÇLJüýsݦ´´4ÒÏ4]Œü¢yB÷#?àZóDñç Ѧ˜c03gÎtYÁ˜1c\úYnÊhºh~1s…æ ÍÅ™' |Ì“ÏáááaVèܹs Ÿ™(£é¢yÂĺ¯èqÂÌÅŠ'RRR(—`È…‘¾¡) ) ) )P¢( 'ŸKTskd544ÜS@ ÷4Ò)444J´`(QÍ­‘ÕÐÐpO-ÜÓH§ÐÐÐ(QЂ¡D5·FVS@S@SÀ=´`pO#¢ˆRÀ××;öõ6_%ƒ®–¦@¾SÀ»ž•U *P—.]rUꡇ¢)S¦äºŸß7‚‚‚è믿¦–-[æwѤqðœ¤Þ´vÑßwß}Ô£GqXíA ìÚáöÛo§ýû÷Óm·ÝæyE9¥·ùì^R¸Û½÷íèb—Ç›zÚ•eußn,0§ íîN8;ÁÏS^2׿ š.Vï,÷ò$š6mJo¾ùf<£¢¢ˆw~Ò¾}ûrÜw÷cèСԾ}{wÉr<ÇFŒÓ§OÓøñãE¸ŽóðÃ[¼yeQá°ÚaWºwïN½{÷¦É“'S5r‘OÕ§N¢?þøƒ.]º”+Ÿê†*Ÿ;ÜýX˜óÎGi¶V¢ù(•žFþ:B/FU§ª~~â¨Âç*~¾T™Ï•ø¨àë'Ò#_iÞÖóÞ{é^½hòÛo[â®ÂAE»|Ågò}Vc|f÷ðó¡£<˜7 ‹ ¾ˆÃ‡Äµ?Ÿ!|˜ÔЦäÁw(dÊ{T­mkzÿšZ{&û½¸-ƒ³‹ÿP+qO #ßJéÑžºOçÂKQ?Oãg)Üž8Rù}I™”Â÷“øwbÖѹ뽔rè -ùâ *åëC |?]¾ˆóÛ;>³k[”g¦©Ý;œÜ÷–wÍõô„—TõrGUÞ«õ™cÁï±Ç£²eËÒêÕ«sÑ¥Q£F´jÕ*!Œaò?óÌ3T¯^=Ú±c9’þúë/jÕª½ÍZLQä}ðÁéàÁƒbÐ@~»|²ìކ z$ªT©B?ýô“Œ åÄÇÇ u–àä{ôÑG©_¿~T¦Lúå—_èºë®£»îºKÙ¼yszê©§¨uëÖ‚f¯¾ú*íæJ‚S.‘ÇœP6è9zôhÚ³g,RÐÒÜ*ÜݵêþüóÏSýúõ…5ˆ¶„Æ.Ád^»³U;ÒÚµkÅÀLl1>Ý·/ÅÇÄPiD{vëF-o¾‰B¹ÀãþIå8´Kú… ´yáÿÈ'5nmך|ÒÒéŽlÿƒ\É©"ŠdXhE—"ßk©?o^¡2e¦¦QZ|ùqY~<øúªÞäLr-^Eõˆ0þ{\fæ·?S+Ø3üC…ÀÈ€ø`Fá¡”Ìu;GÉ)©Bh@xTݳ—'½Fcý‚)5,HªMS}v«†”+G;¤ ×Ö¡Ñcž§ ®LŠcAyô u_±ãÏjժѼyóè·ß~üvüøqš4i-[¶Làçn,Pž†¶mÛÒ±cÇèµ×^Ë.y¬Ú÷íê‰gv ây™§ xW–]\ÏP|<ƒ &ˆŽ9bÄ1È›3×®][ Ôæûƒ ¢-[¶P_îÈÑÑÑB¸ î 0@ø‹øáq=vìØììvù²ð¶N:Æ[¶×ð)Ä}zá…èСC•aÌà˜Ç(  ÞM7Ý$,óå—_èá‡ï…«Í Np€éŒŽ…Ž ášš*Ìsc™V8¨pw×ǧ#GŽÐwÜ!Úêî»ï6¾N\;Á!WfÓèë”/Oq[·Rk÷S¿PâH«»ÝGÛ{ÞO‘Ó?¦§RÒiLH$ ޤf;ÿ¤À™s(შêºMä3g….ZAmÒý¨µo¬ÚHþë¶ÿ¦T'ÕE×úPM>Ê'§“ïÑX¢c§ˆbÏ‘OÜ%òKHÖê¡ ¦z;þÉ::!ÞË&ÔÇ—ÂÒ3)€ëàŠ‰¥ “ç¨bš‹®áz¢¾ |)òÏý÷/jÁBè6ÿºƒ…ÊÝat3×ßoöwtaÊÔpóV*7bÚŒ -E“ÂJÑÛa¥ÉgêTêpò `ZÞÌùƒéµ!ƒ)åô)êÿðC9øB}ÊÎ!C„Ûö‰'ž(z2¨hQªT)‚ëîìÙ³ôä“OæHjÅ»HàI?ÊQÿPñ¼1m~ò®±ÜâzíÈbø×¿þEéé颒’’Ó`@4ÌCøíÌ0jÔ(1QݹsgáN©T©’H’˜˜H»ví¢‹/ÒÉ“'ŵ1¯]>c Œ*Ÿ¥1­¼ÆÀº•£GÒüùó©fÍštøðañØ)mÚ´õ‡%ú@P@ 8H¡Ð²Oœ8!,$œaKp‚4't̉'ŠŽ…¶øòË/ íkÈ;ðÌwU;œ9sFÔÖÒ¥KéÇDQ9À ÈȼRž ¶›¥¥Rž˜Œòñ£²ðÃóññÇÔzßjʃ>\>!ì¶ æûÁ <ˆfRæK© ò ¢gÅ Líº˜È. ÷C µp¸n‚Ê—¥$ž38wö¼ÐÎSù~߯qCC*U¡<Š=EgÏœ¥Çþ¦ôLÖòñ>Ø^ ¦·µ"d×ÿrÙÊž'®íeÀÙ—A°·Š­a‰±eÐúδcõ¯”v)A‡PŒk_W‡’Ξ#Wb2»³8=[;°ndy—Kýç?|>žÝb$:#4öC —Q!×ú-”H†Sð  ª?. î#ùy䢅ÍVaï°pÊd·gfÌQz­„»þ4_ýuQ˜'c|¯Õ–,Nô[ð£¬x×Ó~d,ÇxmÇó2SÞ•ù®Ö³#ÁßüÙÒ‹AÐ hÍÚ{0k&?ÿü³` *0=OóAÃøõ×_=)2;^`˜Q‚SàE~éë7Î#Èrá6ƒ†cÁ‚¹æœà‹ï’ô—F¾ xXá ñSá.Ó˜ÏÐ1YŒ`àâ6lXŽdv8À¿_}÷•x¶"˜^Ñ<È—æ+íÝw©÷vÛF°Æ à+´gß•¿Qu¼Á0¸åx¡ÅLlãÙ/_ªvuv­ ª7_O1'céÈ_Ç(a ?õ1œ>ÿäSŠ9q’’™ŽðÑ}hˆPL|ÿƒô!02ø¾ÏæMô¯Û;Pcv}´h݊έYKï³€¹ÌpšÊÉ7o¦“ã…´Ü$Îüg) p„û…S»GÒ,VPŽ:!„FÅÈŠ4yÔ3´’Ýg¸~~ìòe7ÐÖU«)ˆ_úôxà~J8ušv­X-æN˜ŽÕ*U *åËÑ©{)œßÆtö$0g.5_4|³º>ë&®¨,§+à Òö¦ø¥kè¶BRÙÆsxò¼IW¶8Ùºv-]B탨2 rWBKEP…«ÅX Øü‹e І¬xWò¶»~d.KþvÇóv¼+ó—´3øÓc€»ËÍàV€Ö £à;‡¿ƒ—ø*K—.-|ûð‡C£6C\\œÐHkÕª•ÚÛ“|°<àÏ7úìÍe[ýÆ@פIÂÚ<\Jœâº`î5LÞbžD‚ddhóðÍÂR€…!…+Ò9Å–æÆ wÒ¦M›èüùóòµ‚ævU¸[µ:åW_}Eaaa4nÜ8Z¿~=¡mŒ p`ý÷ŽítK@ pS £—Ã#éðÒ4žÝϰæÿhPõamµk@(uäãV ¹Õ›¨FJUåÁª, L›C4ÜXWàa{›¾÷ÝE«£Ãi–O*½—Âs ÛÑÆ»o§iäÿìHz+ééÚ•–_Sƒ>ä{&³ä<žOàIë_ÙMµ00€¾IN¢x±Ä‚”dŠ©X‰jôèIG™?·±Ëq=Ï3lâoÄŒÏé"Ï=óþû´áøßT–ùf/ßßÏÇô J,Wžj³ÀÜÄsGø÷Ö´g‡ø|ˆïäé‘o71¡¡t‚yƯvŠå•|{ù7Þ÷—q’ËKlÐþË}åP•ªݳÍeËz×õ«äDZMeyžozZ2MMЧ÷’.Ñ™.Á£GÒŽ.wМ:Uéü¨¡”2ú ú(å"ÍI‹§Ei‰´ÙŸ©Ø¬1OtQ<‹µËCú?­A˜–Aá‰)TÛ¢»°2—o –é¾Ô‰ÛªÍÉ8òùü+z*8‚nß²“|ß{fq_¥~=Ô¸¹ö¬<úCå¬úŸ»~„þ‡1€¾†Ã*žwÚÿŒå^­×æþ§Ä’ü]Öî0Ñ:{öl‚Ò¬)LŸ>]¸˜ŒBëͱrš&ö@K7Œxé§Ÿ~*|™+V¬ o¿ýVÔÓ|p5Åpg„²€ïî ¬0kà‡?y¢ó=î$ð÷O›6M¬à0–‡Áî£5kÖVÚ|ÿý÷ÆÇä,Ñ|öÙg©k©°>¬Ìq+äKU¸[µ„ÐÊ•+ÅüɶmÛ„{LîSiÊ‚¾ÿ[¶ ‹¯¼Bm×þF#Ù¯ý €XÜãF·³üž(mÈšÿ5<àÀZ€/=ó…Ñ9vèïÏL£)´"¦}hU“º4)ù<½”Gof$R½Ï?¦æ³>§€~}鎙_Ò#+–Òâð0:X³©^ƒÖ°E⺾ ­e>‹¯\™Žq[åzþ´uÍcËÒ'"’fÌK›yàf!Á)î2ŸÓöƒrµ}ûvÁ(cÖ¬YbAù¬ºXñ qX7Ù…5•݆eëÔ¡Ö}úÐ2ÛØ%ù-/Ÿºružð àç©-ZRF»öô9 ’éI B0&ìK§{ÜGÎÆÒK‰çibr}À‚cev¡ujK¾ZRzýš”äÏ¢7§µUZa,4è@ Õãv¼ž-Ìù¿Pý½G¨'ÏuDÍ[@4íCš(æ3"ééÐpVBèf¦{9nLâäx!­jü–÷.§ ²ã]+º ;z"Šç¶Ê»ÚÁ«ï1@sDÃbYª`"´q¬”1\CVŒ`LKÃÌ(vùÐØèÌSyBmݺuÆbl¯a‘@øÀ%’À¦°QË6fr‚õ×^K˜0Ÿ5JÌS`ùè! n8LâÁWoopùA+gÌÓXOqGYVíËš˜‘f³UÐ@•Hv`ð*wµ<®Ñ%ÖUϲ†{†³ì*9Í®Ÿ3|ÆÊ™K|ÆòKy´ïÖ•ê6¹F¿ø¢ð÷[á™ß÷<ÅïÍKû©êmÇ/2¹mÝñ U=1á ×öeDú³‹/²eò–òF²àŽfwT¹¬syæåùwçȧÌË /r[â8Ï¿Os[Çd¦Ó_é+*†¬¤²3~2;ºÈtòìŽç­è"ó–ä³W‚¡8 “X°^àΑ~μâæú‚×”ßzë­¢(¬pÀÊ#¸wŠîƒY0<Ä‚. #@ÃÅ áü§p×*ñÊV…•¬§$°p8ÏÇ9p-cAkbo–EåBCáP@ †Â¡³~‹¦@‰£„EiØ—Å‚"ŠÏ°& $°ê öu˜" Q‰Ë‚ÖèûøØÍÅñŒÌ|U< "䇧âô;×Âü¨šž={ŠåÚ/½ô’Xj+Ó»ã]™ÎéÙ®ž÷V{ KW·ò^Œ%¬°}Í›ø>aAñÿ“.Ò«,(¦ð>‹ïÓh ,d³Vˆ+U‘­‰ÆlM´ç}½XH ª@.ÞgU~Î×ÔƒO]îSHçd¤^lT5ƒªm%ˆì|µ£‘ÛÆ7ó¶Øl‚0ˆwrÏ=÷dÓE»g±Ãq}¥€´¿ÿþ»Ø†» ÓNLC04´s˜eì¾¶*Ó“zbI)Deõ°¼uãÆb/ÒßrË-‚å8’¥§¸#_‹-ÄÀ†Í|À½Y³f¢8 z6lã°kׯ4‚; û&°QQk{Íš5ÅÒ[ * 2mbìôv¸#*ë¢E‹DÄ\D5†C±k?¼ÃŽ.x&Z06Þaƒ#Àîv4sGk„ÿ@<­½¬‰~óÍ7ÙßOp—O…ê딑GEO<·ìqÀþl†¿È{B>øàƒÑ ìÚÏwwýÁ[Üá~‚ ØÂ‚b1 Š9ìzúˆwwOaA±ì–&”ðØƒ”ÑåvJ®ÎB€c>0GURQ±qä¿b=uñ ;ì_d—Óë¼›}ë[oÒ­[ sØ¿ž`è!Ç4ðwm‹tÞ´Ÿ,¿¨Ÿ  êÝ8´1´¸ˆðÚ0£A\ .f»Èˆy‰àhW¦'õDýPOs\'s½åo0v˨¢ ‚þÁ%%Á)îȇ !Ö ¶ý#1@íôGP0«èª;„"ßN˜0A|}kðàÁbIî^E}ípWEeµk?”gG<`¾ ‘^¡dHPᮢ™ŠÖ(Û.¯»|*üdð ò¨è)Ë4Ÿ¡T6}ô‘Ø| å›B±ÁS‚]ûÙáî®?äîXÒŠ#{¹ïõba¶Š÷ÍLá°$ ƒ%טaô ‡ûØk;``°IØQ5ØåÔ ÖÇó ýæ{zÆ7Æñ¼DGv]U`«û.5ŒePð°‘V‚»¶•霶ŸÌWÔÏÖþ ›Z#4´3AñŸß 0Óá3‚*2¢L‡È¤0é`ú{ÁQU&ZwõÄ{‡§QY±»a7`µÌ™3‡:uêDo½õ–¬¾8;ŽbÅŠÂrzî¹çD¤W0£´@TQg¡©¢«æ7î@‚ÚÌg„CY¸p¡[Ü‘À.*«ªýTt‘/íÃá ã »Ø%¨øuWÑLY!ð ['‘UøÉ ‡¨·Dz;z♀.à×~ýú ka[Ð×`éËÐ4V¼‹òT¸Ûõ‡‚À|:/W}‘ç%Ð7Òø»*Ïql²9ÜG%¬vòó§±CSì’eqô$E±=<èÚ”®çéìëx^"x§N£YHìÊH¥ßy<;Î!JÌ êÆ´NÛϘ·(_; FD¤9f¼‡ko##Ê]ÈÆO5ÂU¦–Ìk •!ýÄ2¸–]ÔR»z¢®Ð’œDe…ëqœ°]~[sèi§¸KWŒÄ ñéÝ´_ÐE擤‰ÌŸŸ¸C -ù.+Üñ n0«¨¬²®VíçŽ.xþÀÐgŸ}&è ë`<›q÷”fÆ2píi„_s>~Æ´NyÐŽž²LÄ[œ¬x n܃ËôÃ?üæ3fÌnKLH¬ÚÏîvý¡ pG›c<™}At”­ ~¼òézõé +¦?½?•j± ¨ï@‚C/G’å…˜oJâ Ok§»XH4g‹âÿpxÓ—-¥Ê¼¹n§‘+£aÜüsÚ~nŠ+2¹’Pk0‹\ó‹àUfð&2¢¹ ù´]4W9 ÀwjµÔ]=½‰¨ó&9&îà/—ß>õuŠûþð Ìu̹@dzŒ`íÔ]tÕ‚Àî# 8p'Á·oœB}­pÇa•UÕ~îèrçwŠHšs9žìpwG3”cEkO"üZåSá'ëì”Uô”ebùîçŸ.„¼‡Á ‚`àÀb~äÆo–ŠüþÒYµŸ;ÜíúCAàŽö å´O?ý´˜w3F0Fý±“z'ùl|oWZ’‘.–ÅN娳o$_$׈!t¸Qm:ÄŠ&‡]àûØ¥}3 ‡»(ˆÒ§JƒSil™(êÄ…B”X ŽVm+ àž´âJá³°Å  ¸]ðùH¸;ðw\›Ch;Œ(5©…â,ïA‹QEsµ‹¶èI=½¨ˆÉG€Õ äw”áuñâÅâ ¡c«ˆŸªèª;\)þ GO…–« ®%ãzx+ÜaÕ@sÇWíÌQY%îvQgUtÁ| \™çÎ3’J¸íøSE3Yˆ­=‰ðk•Ï~xî”ÝÑeBxÃÅá*aÒ?ùäñ•A,WET^ìý0†n±j?Op·ëv}SÖÉ)î6ˆ` % –Š9¬6Ê•8<ÈüÝ÷räÖE‰xFÌ1ª1îEªøþd:ýPÊèÚQ„ß_“ †»i÷ajx)…z—‰¦'ÃËЄÐHz24œÖ}8ʆ —¥Œúì‡;ƒx¿"Â.6ˆ,¬ˆ dçs~EF”´REs…‰iµTæµ:à ä4*«U9V÷¼ÁpP¹‘à ‘S¾÷TÑUe:ãùJàMוUÖIÕ~Vt0‚p‚`·=œ‚'4³¢5,ÐßÜÆ÷[å³Ã//í ¢'V‹.ø&·ðNLÚCá²;Þõw«ò w9´mÛVXØru£|¿ÀÈB˜Žjöñ„õ¦ôT±œö,[%,#l¡;b ˜DlØû/oâÛÈsª<¶…ò- ™àúuššE‹ð§#ðDMÖî°hÊVDMÐñA)# Dü °"¶³€XϾ/a‰¸P#B#ÄmLzcÆÒôDú”7ïá ~EüØÄŸPÔ+©ë§) ) )PP€û$[xßÇAúþäxNû9º+v[cÏ¢Âúòƒ|‡æ¨ÁaÅëú_¶2Äk–ø Ê´âSBÄîlüÆ$4¾³íòqÑQvO]ÌJ‡gE´`(Š­¢ë¤) )pE(€xNøfÈ1þ·Ÿçö±e°‹W:eò ŽA8 v‚üaeS->°hÌG´Ÿ¯H×1ðòçl9¬„BèñDŸL±iO ù¼(µ+©(µ†®‹¦€¦@‘£€ÑÕ„ ëx.â&^æZ™-ãgN1±ŒÀ˜°ÆÜEeVp€Í')—DÈ¢*´Å`Õrúž¦€¦€¦@¬]M—­¸†ŒV®Å×ë07ñ±ƒ–˜ÜŽbÁ¯c×UQœŒÖ‚!G“éšššöÈàG˜K@ü&¸šöò|Ä~Wšp?E°«(T~ÎÔF( d¬yÂ7Ò±·+0·QÔ@ †¢Ö"º>ššÅ‚pÈš°ÞÏî¡=|à£A•xÐÇDµ üùyyNÇSÓÜqüŠ¢¹œ`Ø<ƒ:f@<ýLÓÅÈš't_1ò®K"OÀŠø‹[Éìr'@'&¯;p̦3™ôµ+‰Î±P1Õ §¨‡;pŽùÏ;ïsØ1c\ú™¦‹‘š't_1ò®K2OÌîßÏuªã]®Ä&·::bÚ´s­÷¢+31ÑLÎ+BOȃ\«’kÇê«WˆKƒpúYN™®é¢y"'Gˆá¤ûJ„™,W5]¢Û~‰)t§oØÍ:ç¢Èåp"í¡tšìK8/Ç͆+1¾ Ês.Á]#}¡) ) ) )à‘uPpÕåyõ°ñ2Ö¢6#·SˬtMMMJH^]Ô, ªñnhoû!šòÞˆî¡TÏbŽ×Ûr½Íç=&Þ¾QçÓÐиŠ(€•á‰äX^z ÍaòÒØ?„36½‰3ã‹g©xÆ×¸ùiøwVÚ“¼9.ŽÃp\iЂáJ·€~¿¦€¦@±¦À ÞÓ0;9‘c*%ñL‹?Äâ¡òpÎ×â,~ó}âYV\ÿ“†ÓbÒá ƒ W¸ôë54Š7by/C,Ý»š@ †«©55.šššY?~¼--Ì_Š4'Ô“ÏfŠèßņøÂ›†Â¡@I¦uIÄÝQÏÂÎg|l¼Gâ°ÚÓP8lªßRT(p¥x_ðÂ7‰o»í¶¢BŠ|¯¾m=eÊ”|/×i%Öv4ÉoÜñ‰Q|³ºeË–v¯,÷s †òåË>¼-_ý•Zµj%*‹PÝ»w§Þ½{ÓäÉ“©FE‰ü®ÄСC©}ûöù]ìUY^Aò„ªð!û?þøƒ.ñÇÞ¯FˆŠŠ"ÞELûöí»âè]í´.L>Ãæ±Ó§OÜýôSññkÄíÀǶyäS®œ?ñpo@•OõLõ.U>‰«9»ví¨AƒæÛÙ¿UeÊDùiM啜ÖE…ŸùY~ð„Ul.ÐQÕ;wî¤{ï½—¶lÙ"Ižã¬¢™]»ç(Àâ‡*Ÿê}E¹½Õ¿JNN¦3f¸M[Ð ÜÑÚÌžÖÇš9å]OÊ4ׯ°ùìwÞ¡ºuëRÇŽÍU¢fÍš¹îÛݨV­šø¾÷wÞ)’Øõ%»üv÷s ™ð÷ß§~ø `þÜpà ò‘í¹yóæôÕW_Ñ¡C‡èË/¿¤úõëg§…É?þ|Ú»w/áƒåFk£uëÖ´hÑ":xð ýòË/Ô¨Q£ì|ª2³Y\Øå!Û´iÓh÷îÝ´|ùr‚¹€e´aú馛è‰'ž×*»t»2k×®M›7oǸqãV´Ù{î¹';¯ÕÞ»qãF*]º´xŒ›£œ *ˆßx³óðáÃôã?R½zõÄ}à°iÓ&*S¦Œø ³tåÊ•âÚÛº sa¶Þ×¢E }áB;È»«Ú!?™šIz_#¨hf×îÆüæk¿ ­Ýû¾ûî;êÖ­›à)ÔÀóÏ?O'N4¿Âò7úÀªU«„p Üñ‹Lgu¶ë„ÀK={öÙFMK—.% öîh­â«:È{v4Ë ïÚ•Y¥JÚºu+}ñÅ·~ýúl÷ã•â³ކ J’dŸ_}õUїᙑ j#Œ(ëŽ;î¼ÂÁ–d¶}DûnÛ¶M©LN_9`ËòTgà -iÒ¤I´dÉ:þ¼Híƒ $Üyp'ÁŒçÿý·èÈ>ø pU 80Ç+¼©K^ÚÁž€kÊ\° ­Î›7/Ví€xŸä;㵊f9 Χª÷Á…ÀOÀÆ 9-X~žÒÂŽAÈvübLc¾Võ?¤…Ãb ¸“ÀSð×K0Ò×x­â™×ꬢÒ{ûîÊD¹bMš4gx5à¶’PØ|o ¬G´±Þxã ¡¤=XÐx µ¥ ƒ„ÐÈ‘# Ú\6ƵÛveŠ‚ÿìòI¼$ž8Ë{²8¬ÂB§^±b}ûí·ò¶-~h„={öWü—¸6 ¿ìl.$`¥I€%óì³ÏR¯^½„å…wÀœ`pùÏþ#VˆÍ™3GÐSâàm]¼moyx  ô/^,ÎæÝ˜Ví ß'µ-à/yPE3IU»£NfPåS½*,ÔÊ,¸—<…éÓ§‹¹0Ì¿˜ÁŠ_ÌiŒ¿UýýmĈôÊ+¯ÐgŸ}&ø|°ŠÖîøÅø~㵊fÞò®ªLùnÌ5@@ƒß „¡°ù n=(ƒP”Í>IHHß®ÏTmåêÕ«ÅÁ0…;~cüÍ äû÷` aP…ÿÑ ÐÐÑdg3>‡-PjÌÆgª2éÌ×Þæ“å€ÐæºæµLY¶<ƒVrO&ߥÀ”ÏQLhÁïn0;@šÉæçÞü.ìv€F ¨ÜHVí ÂME3U>oŸÔû°4Z.V IpÇ/2ÕYÕÿ¬Ò{rOÅ/ªüA3«2aõCÁƒ›®Õø"ë‰üæþ.ŸY­Þg•Îx}‚s¸ëÖ­3>Ê÷뼄ÄÈwÁïØ]åÂ}óZÛÚµk¯rl5zy¥€æg„¶ oÜÚÒïfflâ›:/‚Á°4¯‹/ Šoͱô2?5þâK ]sO( ùÅ*ý“®øó58£€Íå鄘³¢ujMMMMâH_ø5h h h h h H øb%€Õf!™@Ÿ5444Jþí„Ú‚³¨§IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/menu.png000066400000000000000000000235001477365367100214240ustar00rootroot00000000000000‰PNG  IHDR†EÁéÖ ÜiCCPICC ProfileH‰•—TSé€ÿ{Ó%H ½#RBh¤ƒ¨„$PbL*bCWpEQeA\]Y bAÅE±a_QPŸ‹QQyx„Ý}ç½wÞœ3÷ÿÎÜù矙sÿsæ@ äJ$é° âLix€#6.ž{ °€ ð€ .O&a………D¦×¿Ê‡;šXoZOÄú÷÷ÿU¨|Œ”€p_ÆË@¸ Ñ<‰4Ô!Än¸‰°UFÆÒ DØ ñ—@Aº˜IŠ™ò—øIŠø\nŠ‚§êš¼¯H&Iç®ü?[ó¿%#]>}† ¢d¡40|¢§Hÿî¦- V°8i~è4‹øS}Ÿ`¡<0jšy2vü4ó¹¾ÁнéóC¦9YäÏQÄÉäDN³@æ1Íҥኳ’¥lÖ4s¥3çÊÓ¢v¡€£ˆŸ-ŒŒ™æ,Qôüi–¥EÏø°v©<\‘¿@à3s®¿¢ö ÙŸêq{3…‘ŠÚ¹3ù Ĭ™˜²XEn|¯ßŒO”Â_’é£8K’¦ð¤(첬ÅÞLäãœÙ¦èa*7(lšˆ€@à¾d VdNÂ^*Y)¥3,ä¶ 1ÏÆŠaoko ÀÄÝúÞݼ“?cËNÀû°ßŒ-¹uµÐµglF_+T@k'O.Íš²¡'@Ê@ h]`Ì€5°ÎÀx?BA$ˆ‹‘¼¥`9ÈëA>([ÁNP*Á>pGA38 ΂‹ \·ÁÐ ÀK0 >€1‚p¢Ašd YBöò„ü (Šƒ¡H É¡hTCePT ý €ÎB—¡nèÔ Ao¡Ï0 &Ãj°lÏ™0 †#áEp ¼ Άóà-p)\ ‚›à³p'|î…_Â#(€"¡è(}”5Љb£BQñ¨d”µU€*AU£P­¨ÔMT/êꋦ¡hk´;:…æ¡—¡× 7£ËÐÑMèóè›è>ô0ú†‚ÑÆXbÜ0L,&³“)ÁÔ`Žc.`nc0°X,kŠuÁbã°©ØUØÍØ=ØFl¶ÛÁápš8Kœ.ÇÅeâòq»q‡pgp7p¸x^o÷ÇÇãÅø\| ¾ÿ?FP!Ü¡>a%¡ˆ°ŸÐJ¸F ŒU‰¦Db$1•¸žXJl ^ >$¾#‘H$WÒ’ˆ´ŽTJ:BºDê#}"SÉd69,'o! ·‘ï‘ßQ(Š7%ž’IÙB©¥œ£<¦|T¢)Ù(q”øJk•Ê•š”n(½V&(+³”+g+—(S¾¦üJ… b¢ÂV᪬Q)W9¡Ò£2¢JSµS UÍPݬZ§zYuŠ£šPý¨|juõµŸ†¢ÒØ4mm?ím@ «fªÆQKU+T;¬Ö¥6¬NUwTV_¡^®~J½—Ž¢›Ð9ôtzý(ýýó,Y¬Y‚Y›f5̺1kTc¶†·†@£@£Qã¶ÆgM†¦Ÿfšæ6ÍfÍGZh- ­Z˵öj]Ðz5[m¶ûlÞì‚ÙGgß׆µ-´ÃµWiïÓ¾ª=¢£« #ÑÙ­sNç•.]×[7Uw‡îiÝ!=šž§žHo‡Þ½ u‹‘Î(eœg ëkëêËõ«ô»ôÇ L ¢ r   ™†É†; Û ‡ôŒæåÕÝ7&3…Æ»Œ;ŒGMLMbL6š4› šj˜rL³MëMšQ̼̖™U›Ý2Çš3ÍÓÌ÷˜_·€-œ,„å×,aKgK‘åËn+Œ•«•تڪǚlͲβ®·î³¡Û„ØäÚ4Û¼žc4'~ζ9s¾Ù:Ù¦Ûî·}`Gµ ²Ëµkµ{koaϳ/·¿å@qðwXëÐâðÆÑÒQà¸×ñ®ÍižÓF§v§¯Î.ÎRçç!#—D— —¦3Œ¹™yÉãêãºÖõ¤ë'7g·L·£n¸[»§¹×¹Î5+˜»n¿‡ףʣדá™èù£g¯—¾׫Ú뉷¡7ß»Æû9Ëœ•Ê:Äzícë#õ9î3Êvc¯f·ù¢|| |»ü¨~Q~e~ý üSüëý‡œV´bƒ·öpt8DúDE>ˆ2‹’GµG+G'D×FÆøÆÇôÆÎ‰]Û§'Šk‰ÇÅGÇ×Ä,ô[¸sá@‚SB~ÂE¦‹V,º¼XkqúâSK”—p—KÄ$Æ$Ö%~á†r«¹#Iœ¤Š¤a›·‹÷’ïÍßÁxŠÏ“=’‹“S#1ㄘ*NŸ_ª»tÅÒn‰¥$_Ò»ÌmÙÎeÃÒ`i ’-’µdª!CÒU¹™ü;y_–gVyÖÇåÑË­P]!^qu¥ÅÊM+Ÿgûgÿ´ ½Š·ª=G?g}NßjÖêª5К¤5ík ׿­X°îàzâú´õ¿åÚæç¾ß³¡5O'o]^ÿwßÕç+åKó{6ºo¬üý½èû®M›voúVÀ/¸Rh[XRøe3oó•ì~(ýa|Kò–®"碽[±[Å[ïlóÚv°Xµ8»¸û¼íM;; v¼ß¹dçåÇ’Ê]Ä]ò]½¥!¥-»voÝý¥LXv»Ü§¼±B»bSÅèþž{½÷6TêTV~þQôãݪ€ª¦j“ê’}Ø}YûžíÞßñó§Ú­šÂš¯Äz†<_ëR[[§]WT×Ëë‡%º~Ø÷pKƒuCU#½±ð8"?òâçÄŸï >Ú~Œy¬áã_*ŽÓŽ4AM+›†›…ͽ-q-Ý'‚N´·º·ÿÕæ×'õO–ŸR?Utšx:ïôø™ì3#m’¶WgSÎö·/ip.öÜ­ó Îw]¾pé¢ÿÅs¬Ž3—<.¼ìvùÄæ•æNçΦ«NWÿæôÛñ.箦k.×Z®»^oížÛ}ú†×³7}o^¼Å¹Õy{þíî;Qwîö$ôôÞåß¼—~ïÍý¬ûcÖ=Ä<,x¤ò¨ä±öãêßÍoìuî=ÕçÛwõIÄ“ý¼þ—OeO¿ ä=£<+y®÷¼vÐ~ðäÿÐõ _ ¼”¼{•ÿÕT¼6{ýËÞ\Žx#}3þvó;ÍwÞ;¾o yü!ãÃØhÁGÍ?1?u|Žùü|lùÜ—Ò¯æ_[¿{8ž1>.áJ¹“£ Q89€·Ù82—NÍÖ“MýLøO<5OŠ3ûÚYÑ D+Ö`Œ( yæ @¤7€ú/‘%;ØOÅ"5#£IÉøø;dvÄ™ðµg||¬y|ük ’ì}Ú>LÍô‚Efùb}ûÏqðw™š÷ÿTãßW0‘#øûúO¶Ò1R(beXIfMM*‡i&’†P † EASCIIScreenshotÚ1 Æ Screenshot 390 69 1 VòÔèiIDATxí°TÅÒÇæQ¡0"FÌŠSUbö¡ˆÀ€¢–F@Ì|–e"Š€ bࡘŸ‘R1!Ìú}?骮¹3}ÎÎÞÝ»{¯w¶êÞšíÓ3ÓýŸ9==³3ÓMÖ_ý¥OB !¨,Q?ÄHR$ ¿XÊ…¡I“&K-Uƒòûï¿'¢ Q$õí©3”½3ü-7ýÜÿýÿWósÞyç%¢ IÄEƒt$¢”Þ°EMøS«¿ÒJ+­¼òÊú•Ä‚ –^zéDTL ©3¤ÎPw–á×_­a’ë”H$UA -oWöTiB !`#L’K¢&UA ™¤ªÀž*M$l’I²qIÔ„@B *$“TØS¥ „€@2I6.“ºÄ±ý!ž³q"™´®5±]P*Xgu8à·²£>úúë¯w)¥¤—]vÙ‡zh—]v)¥$’ Ç¶ûC=ôß‹?Þf"B”öÙgŸ÷Þ{o=ö(~ú(‰þýû È©åPf«V­ôk˜`þŒT¾»ð ± LL”'F$üj2>ñÄçœs¶’uÉ~ùå—ÿøãÇs %3!Õ2I g›.øé§ŸöêÕë·ß~càÒìžH¦ðY(uÖY}ôQÇŽpÿý÷×2cDr™½´'qÄ´Fg¹å–æÕV[íûï¿¿í¶Û:tèpÓM7­¾úê;í´“ÉYIá³ÚÈÓ(«‰E5¯5Ã2±¼t`TîÝ»7+ Œ¦dÌyg8’¸•jZ¬!…–zŒH,ÀRdÁtJF)áã?ÆÓ?~<ýIÁPP$¼$ |¤Ke‰$Õ™ÂË#÷?ã3’o…ë Æˆä–ã¥=”¼§ú•F” hBŸL”]øœ6ò42›Xv[3§Ì/¾ø‚,Ú“s^-ÙMHv†—èÉ™S»›KÓYÝÆÕH™h¢°IÂ-çGMf8Ì¥]=™*c€x…È oŸ÷ùµ×^Ãûp9¿ýö[Fû–-[ÊPœÃ‰oÕ¦MJv³›iz|»víøkƒž‘Ðh•UVaÊŠl÷îÝ%£#\›)S¦à1ÌŠæiŒHøk¼´gžyæ–[nÉÜmÖ¬Y .4E¢)¼‡ý•µ­W\ñâ‹/fÉ Ð$o¤H°¡&-B½øhv%ᲸœšEÊ  yTásÚÈÓÈlb‘ÓkÍœ2UeIä¼gÎWOάڳÎì6žF9µ7ˆG…Mv¥ GŽÉÛu”î¸ã¦rj§Xï˜ìK% ÛÈyŒŠÅ#zš ФÜDüÅ ’+O·üʧ ›$•I|EýJ"çX3þ²Žê1‡ªiÊ”ƒˆ^vèaíIädé¬?Ìq°Ž]ü,¸÷{Ä/%9ƒñå⑬ZpèñÂéÝ@–Z ¯‡xIÀ"2¹?“ÁC&6ñÌÒú‘Gy÷Ýw£…§£+|¾šnF¹ìi>óMæ î#/mÊ©<1Mê.Ùq+¸Ë§^Žøð•iþXÏâ6T|%V»aöðÌ>ìK% ìzŠc¡Z‡"É#ü#2}s™ãÓ1xÆ—Vœ…'nÔJ ±8 v‚ˆÊy¬Yù5ÇAQÞíY§¢³j<¿»ÎZ&3ÊF"FŒð\Ÿ†qćÇWÂU3fŒªà|Ϻ  DᙯñRáÛ³ÊÃØ®µ{Âób„w˜xfi´ï¾ûrgÀƒ>¨U…ÏRfœËûì3N˜Â³ýöÛ£‚ðð_ïcЄ<ò@b žZrµ…M3£wÞy‡9 ÷õpo‰9Ö,Žƒ òü—¯ Jæíá©èœÚã@së.øzï[ŒðäB$.˜4iÿ±kÚNÞÁwó&€…gRÀ * ÀyÁÑc§»i<áqmðeÂ;B<³4b±Œ‰ù‚ TASxSMÉâ’sÙƒÇ)"Õú†,Ý)kÎT+Lš¼ÜyçÜAÈ&îl`û•'òðÌ>ìK&ÈTÓ?±h\JÁ˜‡ÿåÝ ã‰Ä½€Üð‰³ÏÆTÞ#Æu.{ð®pX¬«÷†cDÎ*þ/õ@IíŽ5‹Âæ¡j\YüÒ‚[c˜…ÅÜl¤ðxˆˆdÎÚ˜ÈHçŠøjÞà‰QGÂã/xwP¯‰§§–«‡ÉãZOTókŽš øYàãB¤zœ¡œE¡dêΜÎ>ûl­”ŲϠèI‡!Gx/o‰ÂË‹°çž{â‰ãká¡HÏSwW™Í„ rQxš¥U†XªIªŒ”©–„@-À£Á×à’õZä­|&æ¬ÊF“Ê×^jL&©þ´E’$!øWᵤRB !¨É$U êTQB !Pd’ c”8 Š!LRÅ N%…H&©0F‰#!¨É$U êTQB !PgÜØoÆÞ*7ǵ1"¤ÎÞ}ê¨3ü]>§ôÃÅ@lÏw?Ü™ˆ A u·'N€”lQ­’kò.äЧ Q‡Hê ©3€@½œ•©a’ë”H$UA -oWöTiB !`#L’K¢&UA ™¤ªÀž*M$l’I²qIÔ„@B *ÔØ…T R¥ „@CD€à=¡ØîÍ«áÓJò’bPj,<ñá? " *|a“Äîm®Uÿ÷â·'¥‘ôËz¥fÝ5·rç4ÑMꕾ¦0ÜNT;óQ‰ PëR„çJ\î'ÚMXl(5L±¸Ÿ\>Ü1N)$`=ÑxºvíJ8B;T@¦RªˆŒ7_JÕÍ[–æ0Q2CËWWY³vâ±mzîܹæÓ2 eoMö+•yã_ñŒ,ª†IO¯ÿþDãB~îÛÇ^r˜…kÉ{öìi–ÈEè&=$šœ&1Ì Åä ]ÓøxóZK­]¿b,¦"SM—X‹æðNf¡¸‰’ZfSÍyÅÓK˜œf™^Ƭ¯=zô |á²ÊEÏÄmŽüºrÔŒé 9ÙÝzë¢5 LкuëN:¹!Aá]J]¤k˜$©`öìÙÄ}Æ0a¶Þzë¬ZÍPèa$u²›!ÛÍìf]!'a¶’€¥„ßš:u*>*ããÍÏ‹€\|wƒ3HøC¢žšUS2 pÆSîi' Á-HCdz% ±*Û¶m Å Ù_%”%Êlß¾=G™Ž’Ü3o¢d†–ÏR3DÎðc¶l!t<ò±Ñ ¨ñ€ˆ¨KÎyóæÑí¦È˜Vª")N˜0áàƒ&,%áä ‡É#¼6:#9‘Ýø7|øp/( fçœtdEd);JÍš5£3ÏèJß%8(µ˜(ACËç¨é!¯ú† Ó,Ùa†×CgÃ$µiÓFÞ·°4¡0}p™™m”•×ìŸ 0,å2´Œ9’æ–¼! ÐÃ62+2Õä}Žì fv©QiM‚Ð;ÿ!Ã>g(|N™^©F¼ œÃׯ$xÑ0ÙÐ]bÙÓ†I"ú*1IÁɪOf¹Œ½8 |Ƈù$/y> Ùnf7ëÊásI43 1'; n´û¬B˜ ÑSYÝ'þÃ)l bØ —(fTjá‘(C¶ÇTTv”dÉCää6Ccfi¯f òR²ÇiBÇL÷H‡ Ò­[7pž3gNŽ`¼Þè¶‘™=«ÒueHĄ̂İô‘›0ÕT†‚!'»Øb1 Úë´äœDN™^i!x£GW)ô(~àb@)u‘0&n@6qâD×n\ÖSpÄ#cDzÊ”)øG:tÀ3#©\d¸zS=³"“Sˆ^(ô¬ìôN–]‘YŒHNÌÛÜ 4yòä… ÂÉ0ÅûÃ/Ìm™»±=+d{dEE¡ÙLº-˜ªà+áŒ3FÕôP‚®å5aª©%Ô.a–‰«‹§9X˜ÃÖ°>ˆï™S> ¬¡ðŽ)OØFúÈM˜ý "¡º™»uïÞEÉ¢8hÂl#·|M›jò4²3de§lb»víøÏ…é›ÔX­Ù¼ysÜU V¥H\uÕU¬µ1l¸Ä²§k˜$%¼pÉw|úôéÔÍTŽˆÆÌéH‡¡ÐÍH꼽ظÈpõ¦zaE"¡HËWà˜xóf´{³j!Ž=š„ƒ'_Ö¯_?‚ÊãR¾4D3d{|Eñ(Å7RvsÒ¤Iüw·Õz(I™^hySÍä©Îý˜œf™Œü¼„ÔÎ(ˆÄ<Î-'LÀ–õ,ÈÜG^¹4möO¦ö}úô0`!ÈGEk2Äš€dµ‘–¯ SÍøÎ`f—ÂYQÂpÓšŒ‘Z]]´&3\FâñãÇk-$hE‹qS’K,{º¤û’päߘ`»b1Ð¥G*—J¼ %šÙõ©›ˆç”\ ¡®Åfw«FAÙÕ±cGwa*XÁeiÆe¦ÇðÕ]épŸL×Jx¨`ÎÚ<”LñL5MÎxbée²+gȤҬ62E2û§ÉiÍ629KTÓËÞ²eËiÓ¦±æ…QðÞ#©~·Ï—"Ý3ÇšòÌ™3Ír„XGJJ2I9âþc1ßÁ‰e 1cÆ?F©˜"¡ðæX:`…D–~êC Ö‘IZ ¢àª^}пZ2ðëx­½žjÉÜØêm mĤ‰ÅÆÐ²MÐ35±1 tL$ê K0µ®'¢$1 „ÀüsÜ&!•H$*€ÀÿÐÐ/i‡IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/multipart1.png000066400000000000000000000130101477365367100225550ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?íŒIDATxœíÝ…w#gwÀaë?ø’ÝÍ6mÓ6…”1efnÚ”™™SfN™™™Sffffff¦Ô»¶u-[«{e]if¤ç9'–¬•4“™÷w$d½GG°¹´[ot 9þ·`ö„\å:\k¤«eC»^^++_\Ô|t$©F%©5Xùâ¢æ£k,Iµ³¨$µ+_\Ô|týOÁö‡úiM;jJRk°òÅEÍG×’:ÿ6Ùv—t¶”ÝmhEŒáÿ.8Ä·za-£Jj¶p²’¢¤ U$õ_[ìƒ|’PR´MR·×a»w¿dCo~ö¤ U$õŸŽøA"’úIAb4IÝ:(áðÓ7ž¤¶w×+:ôægÿDRÿ^à‰$$­F•ÔÙë©í.åü‡ÞüìŸÅoHú·vpà`vòŸ¤Ø•;Œ€Ù¯Ž™HjUNó¬¶<ÂçU툤Ýò0›]>w§ .ßx>ºþµ@Rì—e#บÙüì…+ÌÖy”’‡gÝ'~“Kêö‹5‡'Ø‘ÛÇ–þÃ’s§¿­‘Ô¿8ˆÎ~9ñwE /ž;ýER+IêЭ÷ÄOR)Iºµ’š­¸Å¹kÍG×?ìà œ½ÕË­õÄïâµîp—óÑõO;øôÄNIêÐmõ­Þ1$µÝ»_²À vû œÔìò?Ýé.ç£KRžêAôÙU’úÇIAbTIrÊ6X˨’Úýʧ‡o` Ó_ ©“í"©($"©¿/$Æ•Ôí'¢;ìVR´URþ^Šé‹¤þ®@R´’´Š¤þ¶`ûŸžpx‚‰WR»ýbLI±‘Ôßx_ ’‚V£IÊô×ì‡Hê¯ vó÷R’bÂ$­$­"©¿*$"©¿,$F•ÔIL>=Á”-΂¸2§]Þöé ¦.’ú‹oõBBRÐJRÐ*’úóIABRÐ*’ú³IABRÐJRÐ*’úÓIABRÐJRÐ*’ú“‚½›_jèÍÏþ‰¤þ¸ÀÄ¢´’´Š¤þ¨@RWRO0y£JjçÌ(O¯…åÿ°`ï’z°$­"©?($F•”ÃL߸’ÚîÝ/YàЛŸýIý~¤ !)h%)hIý^ÁÖ¿Ýá ¦nTIíôûÐo/pèÍÏþ‰¤~·àÂ?÷ .<ÎxâÇôm”ÔÉ ïôã #üj7»:IÑnã¤f~žÿ}í~¥[m@R´‹¤~§àò˜_(HR°aR§¯›Î.Ÿm69¨$1}‹³ Þ²4¥Uƒ}Ö–ÔÎIŠv‘ÔoH ‘Ôo$ImúZjç$E»M’ZÒF‡'¼–bò:“Úø}©…»ÝIÑ.’úÍ‚ IËgÙCÕ•úF·^kICo~öÏ&IÍ¡Ÿž½tîª}³›¯³¤¡7?ûg³¤¶4Ðw²”ÛKzó³"©ß($F•”#~L_$õëy»©LR´“´’´Š¤~­`‹IÍÎÙÞR..tèÍÏþMRƒí$­"©_-˜rRËžSJŠv‘Ô¯ìæ{ü¶s×K/zó³F•Ô6ÿ|QR솤 U$õËSNÊk)vâp’Zvß’¢ÝÁ$µ¸ˆ³ßÎ ½Ø?©0û¥‚­ñ»<ê·±„ømè½ÀþWRG[ÿ8’¤Ø²Hê &üV¯×RìÆá$µìI¥¤h7¤¶µ%O*%E»Hê ¦Äï‡ÞüìIA+IA«Hêç $‰Hêç $‰Q%µÍ¿—Z¾¼¡7?ûg\I횤hIݲ2§Ý>€ì„¤hIýl¤ !)h%)hIýL¤ Iýt¤ !)h%)hIýT¤ !)h%)hIýd¤ !)hIýD¤ !)h%)hIýx¤ !)h%)hIýX¤ Iýh¤ !)h%)hIýH¤ !)huàI™MžV 3ÊÿpÁÞ%5ô`ÿH ZI ZER?T )HH ZER?X )HH ZI Z-΂ø+˜ "©U9ͳrüo¤h')hI}¤ I}_¤ !)h%)hI}o¤ !)h%)h%)hI}O¤ I}w¤ !)h%)hI}W¤ !)h%)hI}g¤ !)hI}G¤ !)h%)hI}{¤ !)h%)hI}[¤ I}k¤ !)huàI™QžV 3ÊKÁÞ%5ô`ÿH ZI ZERß\ )HH Z-N,úM+˜X "©U9ͳrüo¤h')hI}c¤ !)h%)hI}C¤ I}}¤ !)h%)hI}]¤ !)h%)hI}m¤ !)hI}M¤ !)h%)hI=V )HH ZI ZER_] )HH ZER_U )HH ZI ZER_Y )HH ZI ZER_Q )HDR_^ )HxR¦¿¦ÕÂô×™ÔÐ{€ýI}Y¤ ±8 âʜ̂9RÐ*’úÒIABRÐ*’ú’IABRÐJRÐ*’úâIABRÐJRÐ*’ú¢IA"’úÂIABRÐJRÐ*’ú‚IABRÐJRÐ*’úüIABRÐ*’ú¼IABRÐJRÐ*’úÜIABRÐJRÐ*’úœIA"’úìIABRÐj³¤ÎÏü1;Zrvä$E»’ºõëi?³87;ù‡)í"©Ï*XLe'³‹Nƒ¤hדԥ¸&–¤h·IR§7<’ÌERŸY$uákü$E»ÅYoùŒ%æÿ¸dTÎI Î%µ,¥Ki]”ç~N0)3ÊÓjaFù+%5»tⵇ-’úô‚Koõ.ž‘l”Ô…w£.ü˜IÑn“¤Î³ˆƒw8Œ1J’¢]$õiSI¥JR´“´Š¤>µ@R´’´Š¤>¥@R´’´Š¤>¹@Rˆ¤>©@R´’5wÝu×Ы0 ‘Ô'HêpIªHRÔHªHRdî:3ôŠLC$õ ’:D’Z‹¤ÈHj-‘ÔÇHê]¿~ýÚµk’*’I­ERd$µ–Hêã $upŽKzðÁ%U')V’Ôº$ÅJ’ZW$õ±’:8Ç%=òÈ#=öØÝwß­ªŠHêc $up$µ.I±’¤Ö%)2Ç/¤}ôÑ›7oJª"’úè‚i'uù«Ú%U!©µPR³ËQIªBRkYœXteNš‘c‰³yE/zóOÂqI÷ÜsÏ}÷Ýçó‘ÔGL9©…“³ ‡Þü“ ©µL'© —-©+“ÔZ"©,ôQj³§’º²“’î½÷ÞëׯK*5¡¤6‹jyRg†Þ £&©šó³‚Þ]HêvW½åÂÉÙ…Cï…IÔZ"©(ARW}¨’Ô&ŽKºqãÆý÷ßï3©I%µô@xõ¶ 'g½ù§BRuÓIêü“Ô+Ý~É-%U$©º¦^0ø¿W|êwù½jIÕÇôÐC=üðÃ’Zm’Iµ‘T¤Š"©G $u¸$U$)jŽKºyóæã?~ÜÖÐë2j’¢FRE‘Ô‡HêpIªHRÔœ|†â¸víÚÐë2j’¢FRE‘Ô‡HêpIª(’úI®ãžŽ_EݸqÃAôÕ$E¤Š$E¤Š"©.Ôá2b‘¤¨‘T‘¤¨‘TQ$õA’‚„¤ U$õ’‚„¤ •¤ U$õ’‚„¤ •¤ U$õþ’‚D$õ~’‚Äâ,ˆ+sšö,ˆKIŠv¥ U$õ¾’‚„¤ •¤ U$õ>’‚„¤ U$õÞ’‚Ä'e6yZ-Ì(I ½Ø?‘Ô{H ’‚V’‚V‘Ô{H ’‚V‘Ô{H ’‚V’‚V‘Ô»H ’‚V’‚V‘Ô»H ‘Ô»H ’‚V’‚V‘Ô»H ’‚V’‚V‘Ô#’‚„¤ U$õÎ’‚„¤ •¤ U$õN’‚Äâ,ˆ+s2 "ä5ÕmNÅTwììhÚëÎÞšèîèjŸ˜ôÊ“™æî-œLÍDW›ši~XrâIMq“S5ÍÁ9»p:-Ó\kîlÙù'¶—§Ô‰)¯;¹‰íßi>¶^0íµ'1±Ý+)Fk¢ƒsvîçäLzåÉL9©©­ôIí·‰ÑæZŸšôÊ09SžÆh¦(è$)è¥(èäQ ZI :9â­&=»0]ÿØÀ§a«¬ IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/multipart2.png000066400000000000000000000434631477365367100225750ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœí݉Ÿ$G•ð©ÿ€EHšé’„$îCh¦™Í»,»À.»¬–´]èH’èX„m°„lƒ øÂ6¾ðo|bãß8:còõË/_fFdUVÿ~ú|F=ÕGUeÆwª^ô‹È]»AAdxf’=ÝF×<ÇÌžóœç<÷¹Ï}Þóžwê©§žvÚi§WÙ½{÷ž*+++{÷ÎöîÝ»oß¾çWyÁ ^pÆV^(3;ƒåÍ<Ÿ2{~˜}Afõ{•Ìö®2ÛcIä«v‡™En£C¥ý¬ä=¶>zíTg…-‘æQÞ>òâäðóöÂÙö å'“NÔÉC¿²BÉ7tÜrÃè”S~æg¶Iý?C “]ìì”SNñ˜hxTŒö2F3:ôî@ŸY嬭œÍrÖY³³êœÙLž”xF,3v6“™^cá†CO•%¾*ýo‹ÌösLD-‘¦í´…"ÅMVöžê{™T"Ó U$c‘J¾&•$õ¿ Yº_õ‚ÔœR…Gxã#dæ )_EqOô†žŸH2øqODçÕU›\?y “NOÑrÌB:­Œ”“™RuF=­Nªöì9ýt©ùgIIý/C ö¹t‚Ôb¤Šð²?>r‡¼êâé¼X[œ©uÕ6 ÁáÈÇxt:)C¡$å|ž«¨<,¡ª*§vï)©B¤þ§!K7ãR UŽÔVþ‡’¥\/åIÙçÎë£ÿâ Š-]X j¹À•L§§b¡Óz€ÃsÂOZê|¦TEgÓ›¤4NĪàèžíÚ5þôHÍ- UœT¹­Ü)HÍ-;€ÔO YÆ7~¢2xòGÿüfR¼R²kë nÁb|Š=Ü(Œ„¤ðdŠŠÊ?Ô¨*ò©… H•á'멲÷Âï¤%ËHê¿2Âï¥fc–U[õ„¤h:˜N6­„'£­h†ƒ³›+I°ßCè*¦Ÿ›4£YüdÎèLÎΫ˩“ªf'Uñ©t6¾gÏ¢‘:©j¤€HÅNæŒHÍ$©YRÿÍ©å'å@Õ¤f’Ԭ˫Ô&öMè…Tuà/’‚ÆBÍ¢Ín. Á¬,zs± ‰é‘Ù~‡žÌÙõiœÑ©ð¤Üg7Ë)ê¡XHRÕÌĘÓ µ£IU]HÍ^Ô…Ô5dé&ÑAjG“ª_¥¶×餜(Ò#Iñt^!œÃ ©„§(, ¯Þàìæú+Æb¸˜V7 IÛuSü$ÎNžI_l…¤¨œóè R ÕÔ–¨.¤þ‹!#là<î¯zA ¤¶…oü¢¤êIýغ'FM„Të z“Ô…utU‘u¥6\^¦ô~Èaú³ÀP#'í4O&'åÌ1R[éò*µ¤ÊþøÈ‚HÙHÍ@Êv‡ µÓIÍf&R³>¤þ³! Õ ua3­EUvdYÀÍ;ß:¥Ó!_ŸÄ™¤3sžhóc¤DÅ‘ÿ’m 5ÿ ê”#µ•Sù¹¸ñÊo¤æ›áO2R|ø.Ä«ÔØÉû*5PUvdËž!GWñ”ïUê?R µ8YxR?2¤@jqR–!>uQo~RyUñÌ{üÎ1¹¡8?Ê9¤?aRs_/R‹˜\‡ÐgDRÿÑ©ñ“ëú€TÙ;,@*T•–È$Æð"%<3 •ùA ¤Ê‘ú†”þôH-pv©q7ƑԼD”S¡Ÿ@ÿívRÁBùo~/R“ HÚÙ±¤æsùkÚ3+©VUÓrÖõ¹Ìï¹vz­gÏÿL_/úw†Œ³^ ¤+]ŸËüžk§‡±˜¤2¿¢€ÔB¦ës™ßsíô0’Tî½aT¸CÒ(¤FuCár¥<©kHs°gRu@ª|Ê“ú7†€H-M‘T~³Ü?°íþ,¤Ò[c*'e¸ª0#£ÑŸ]ßd<Cby!)?J“Ê `>Ý K>FEJ¿Xä`Ru~‰ò£Iÿö¤”äcTô¨ô‹åA&£Ð 嘲'W-õ’: 8xZÓÃÅK´ôøysÒâ‘û¯ I)µTì*ˆ½HM[Hm¥2‘ú!Á¯zÇ= uHm?!ñxæAjꢑJ¯¹=ƒÅ Ì"Sž+ ƒIýkCÄï¥ÆîrÍ©…"5ý€HTÖôl›eçÅ2lJûøhè¥Ö,¬°Öç-îÔN*6‰þ¯ ))RR RYc%E—ô³‘J •ŒcÃ>lz2Óéšá¼úÎNÇ EŠ(8)¯*Aê_²t×—)*Gê_²¤)©Lw%uV•hϬ™TÒc¨µ>T ‡—uÈ\„uJëý Raç¬% %ï¤@ª©nHHMŠÔœ¦'ÄÖ˜ ©z ’8/©qRtTXÒÃP:]Ó[XÑ£>ÿeD*ºdj¤FOüŠò R[éCªqEùfÈґ«H•{•)FJY%R­c#ïxè:`Z9¼Üš,Â^Cjë! I¥Öʇ¤‚‹áüSC@ ¤@ÊLj+*§ò‹3=R µ¯RóšDWH¥{fõ¡šqt$ÙéôH?a­¼Z³ýØð"æÑ•ÎÙ©bHH”v‡ R •õû‘b§)5 zŒ„ŒéĨWhÉ‚¬ôAm=oÞâ0RÿØâW”_¸é ©)“}³%©‚¤¾oÈNzãÇgÐÛH)ƒ!×è7Hú1RÅ LW^ÙÿÍJ! ©p¤ä‚HTÖ;)*Gê²SIù3Œ”8;ú0ÈCÆ0NêïR RfR[Q9-ãv. RåHý]C–î÷RùH¥N÷\$…˜:ÑyuæôÖj«U†åø…?Tµ.™â›$Õ¤VV@ ¤@ ¤²¤@ª ©¿cHAR3–r÷"ï´©ìªRæ‡$}`Û¼æ5¯ n  G¦Û Ÿ´ÅVë!\>Rs HHe HTARß3dʤbï) ‘Šžåá†LaÝ¡HÒ­”I?a¹`YŽbRÛqöñ+ó££7‚H-5©™2ú3ýlq#HH ûÙâÆL¤Œç··¡Ô0Ð% LF:¯í™‹ªÐÇüS…)¥UoXÊ7v"tOpRË)“*YKHí@R±Ÿ R Ryî¢þ[ì¤ì'7 ¦W‰b²¸¹¨Îëª\Ô9¯«C·(¶t^ý`•&•j›• ³¿iHñ¿pÔ—¸‡í¿{•©G*èD_R»Š·#HFêo2á_õ¶ÔR´Pþ̶’F'þä¦WIa !„˜†åâ‹/¶tX ¯¬ÞE•~º8©® åw©Ø›J©@ªÔDÞT‚H$õ× ™þŒŸ¸CNªãÖ˜bþ»©~˜Ä€ŒbÃ>Ät±!M@­_(`é¶B^=`e!Ežºï´•Ó{O4þ7B@ ¤ ’«HTVRß5déH÷DÊ©H)˜¸§VIä‰Ðøq¾¿ ó}6GRªZ…¥`õVõ$H‰=Ñû^ ç¯R RS"Ur½Tüþ@ ¤–›ÔØé}ùkÚ]?SY0½,HéÈÚ¨u²¥Ã ‹ªTi%T…Sé­°8©Þ+;*R»wo“ús†€HHiwR RYïp+©Žë;.Ì´¾#ôD¤Z=é#ó@µYŸCãT‰¡î¿ssI•ƒ‰Fj1r)^–Éõ×5ÂÒË)»ªl¤W”ÿ³†,o÷HTöW©E 5v@ ¤@*kæKªÕÓ«YBO~”Ò€<Ä“:zôèFµs yòÝŽš+¤|ÏlJ•’¦è'¯ÔÌ:·í§¶ú©ŠÂ"OI­¬pRÆ)*L*²K®ŸÙ~§ RåHýiCä`u.¡@f»wïN‘R(¢¤¢ª,ž^Þœ>õ“è“%O~¬FGæºib½j‘X¯Û%¼'Éýé ©#GŽøiáTСfzÙ¥UkcÅű„ª©~ªŒ¤ô%½9H·V°P@ ¤‹Ô.)J’ú–!ËHjeeetRQOœÔ«ƒ‹qðŽ 7 ý0'R«±ˆ‰s_éx›Uœ§K/½ÔÁòª8¬.±«°Rᯢ°RåTU •+ RIÕ‰RJÎÅHT‚Ô7 ©mRC–Lµzâ³æ[1¯W¯N ˵tü¦ùíP•V­ª6ƒô²•*ªÂÒ*e+Jª«*…T¿MüRÊ))% R •5IRmk凊z )î‰0­Usç~púBjµÞ÷(lR =ñp%¾–ÃêžC6^Ñ~ –FªÂŠÞªì¤xëD©oR R…IM; R •5í¤øZù¤Œžx»„EDÇF?zi®³(…”缊r9zô¨˜M/ +ÕO ‘‘*QNUTé€H$õuC@ ¤@ÊLêOR-¤tUâvŽ):}î;d½"âÇ$¯¢¨1ÖXH O¾yÖ©ò¤x<“Ét±% Uч/B°Rå”®*ZN $Å÷Å))Ê©‚¤þ„!;ƒTjwÌØ¶è–r*QBE=Q©¢á¤Â1É ¬hßYñžh}Xì¼R°”çáŸ4UT7÷Mï§J!•ºHé)©¬)*Hêk†ìR©M’8©úRˆ½Iñ¹sòÄçν'¯!ЉH‰'âGlÊSª„º$–ÎBUVXZ…¤ÂrÊ¢*5•®“J] GôÌ©½{÷‚HTAR_5¤@ ¤@JI )êœ vÇBŠ{ ;&\ÜPY«vµôÏ¥µúê…kÁ)¢ÃÇ$ÝB…Û‚Ž"ÉÅVXbr?j+EŠ—SvU©r*E*º/f¸X ¤( RImå+ù:5£¤@ª )±šãð/‘“¤Ü±ð¤ÌkåRºª¨'š;wqÃà ?êi˜‘QWùlT]±ü‹CO¼Š IN+ZT ^¼¨â•$ŸGï­*EªßöH E)*Hê+†€H”™Ô3¤‘ =½Š-‹÷žÜPqɺzÓFu5›°¾ðñhVÓíŠ'>}ž"u¤Nx‹šÔw+°©I©k§¢ªBXJ9•…T} D)©¼©f1A ¤²‘j\Qþ²t¤ø«T—M’zžÂBŠš&¸1«LP¢·ðpOáô¹ eQs4HmQU:¬ÖŠŠï•ÞCURú*ùêUêôÓA ¤@ ¤²¤@ª ©/²¼¤:®•¿ ãZù¨'AŠH­5{c}µäK%AŠþ*HÑ)OQL!šIÙ U ^›ÍöŠØoDE+,RR¥R UÔ1¤@ ¤@JIFRJçì+XBOž”~ÔF5_ÎçŠW›û_R’:Ø /¤”JX¸ôÒKÅ_;FÖªJð¢)RSéáÅ"ª‹‚Kd“**©‚¤þ°! R RJ²j]2ÕêÉw7<üð_¯/qC¤\øp"IÑYóÞžHÄë«p#¯…>Õü¼nKQEÎWÅëF®*\8¥¨¢r*:Þ›T¸=’F{ö€HT1R_2¤@ ¤Ì¤þ!;†TÛ&I˜wÇT<Ñâx7*ÜrCn“]Ñš×Rklƒó ve›)òÔŠ)Dó†:ÂPôÆÄw¤j¬hEÅà‘zÏ&AŠ«ÿÜU¥æÑ»’â=³m¤¶¢rZÞ½'@ ¤J«HTVRϲóHñM’º“²xrçÝ ?ÌøŒ1Á¢úÉc:\mié†\XKñ¦SªP.iFx"ü—]vÙ:Ä9ÿ&N”VŠ*zŒ¾ÆêDŠ`)»fòrJ4PpRú•p@JHHe HTARÐêC*l•%O~Ôzµ2Þ‚¦Òת D‘DËRJº¬cÞøÆ7·…°BRGØ:ª°¨"R©ytEU””P6Pô#Å7D)©‚¤þ€! R RJf§Ÿ~zH*µ-zÇëáè…”÷äNº^’—á)ÐàY¯7@¢â‚W)RaO÷Ä'ÎFoTó¦íˆÏDa)y Im°æÙ°¿Ä¨ŠO¥ƒT‰€H$õEC@ ¤@ ¤”ä%EªÂB*5}îÎþjµÊ×OþAÊsñ>MÂÓ&‹ÅSH*†FægYšŸ‰Â ‹ª#,:)½œâª8,½¢•”ríkÒR UÔï7¤@ ¤@JÉ©={öpR©Ý1ýeðΫR¡RÖÊ)Å“Ÿ>?P­…òn¸!9QU)R\ÒOÂÍÏÕáó]UÑ õKêÖ‰Íæ®™QU­°¸-¯J¢ÎÙN¤Ä*ù4©ßgHH”)Êš¤šåT+)*¤¢žøè4Î ‰ø/§ÒÉ‘˜,žÂ©q!éÍ-ºÂ¢*:¡žšM'R¡*ÿtSªÖþ ¡*Þ@ÑJJ\ ÇLê÷R R ¥¤@ ¤²ÆJ*˜GïD*êÉ_NÊAŠ!(UHn®Ž¢R%Ú'+*§‘ùùXÞò–·Ô [!¬VU­óèa9Φ“ª”W-§R¤ª_”œoÙSßÎå÷(YÊí\@ ¤Ê‘ú‚! R RJªWÞl¤ÂôpTèɇFKŠ”¸‘J(QHqIGš;_†žÂVÂ$ôP~¡™úf²UÅgÓCU¢œâ¤6›Í³­åTXKÑ-:)¯J²oˆ¾MªqùëI*ë«HTãUêC@ ¤@ ¤”HRæmÑí¤ø)ïÉ“rgÙëY­WïÛz"R—;ó¹sòD%”˜,瘢†~1–šVJï¤ð°x'EªœÒImÄZhSk§èF! RI=mHH””º-ºN*:ƒÎ=ù-©ˆvL¤0E=ª¶Ì¤¹ó®žød9gDnÞšN튫ò°ìªÂZJÌ£ó§›R5)¾XÊ@êwR R ¥¤@ ¤²ÆD*¶V¾•­”k¤ÈÓê*7«lËs÷t(­” IQŸ¬Ý“ô6–·³ø[N¢2©½´vR­ªRå¿etRŸ7¤@ ¤@J HHeMvR©Ö áÉK¢&Y':&ª¢¢¤h™T¸@Š•m ¤Ä©ClíTTUVQRûª€Ô.©¢¤~§! R RJ¤ºl‹’²´N„µ)!Rº'úbŽ)UH‰ésï),¡x£„÷$$½£Î¯Ôñõª¶kªxQ•R’²L¥G몃l—Õ …H‰ ÑSÛ¹¨œ–};©¼¤~‡! R RJ’¢ëát"åË)w®yaÔê‰H¬MQHE§ÏyÕê‰cr†~µ™&,šRU¤ŠwRðæYe¹|”Ôf½=¨ %Ê© õYC@ ¤@ ¤”€HTÖ´“¢%S]H)=³4î€9á„pôc1~x!Ec/,¤ø)*¤¢ž¨]‚eÈÎ Ý= E³­¤ø$ºï™õ†Äª)'ÔF¡{âM¼"O©nY±4*ô$0½ë]ïz7ËoTq7z[Ͳ*T¥O¥GË)±h^¢ƒÁ=Ek)¾C’‘Š^qHͦ¾à¤@j¡HÍØŸÓ HTARO#5eS#“¢Uò~ø³¿¶&/{(<ñ"b³î)ZHÑâø°Šzâ%”Çäô¼ç=ï¹âŠ+ÞËâþên¬aù²ªœ*zº]IEk©hÅpRn ¤>iHH”’ÆåA ¤“j\Q~G’ò¯RîX´^Û@*µ='å )?S~ Z5µÆB°„¤VObK¤h·,‘R:&¸'ÉzßûÞwÕUWý&‹û«»Ñ}ª‚å\qUýH‰…S¤J4PˆÚ2œD.™òÈø$ú(¯Ružˆ„>ÙÿM1 RIÅ(´š²ñ¿)¤@ ¤²f.¤<÷gR4ÀÂŽ ¾%‘Juˆ«£¨cÂé Ê¡qzŽ;vÍ5×\WçÚk¯uu7:[W^yåW¼ûÝï&UÙË)1‰þ^á`ý‹‡Å#õ C@ ¤@ª )i¢@ ¤J’úí†H>ïG*KжGò¤h‰<âU6ƒz≓"XÑ**º¦X¯xr(¨ŠrÕ’CãôÜpà 7ÞxãM7Ýts÷Áûßÿþ믿ÞÙºúꫯ¼ÒÁóªøTzWR©EóJ!Eÿµ îÆIšz@ ¤@*k@ ¤ ’zÜêFŠK‰ÝÐÉuIðÎYÒ#FTjîÜ@UTŠ”RH¥<94NÏ-·Ürüøñ;ë¸o½õVËQ«TUÕîûÜw‹rÊHJÙ-)¬¥¸-ºQ”SEI¥.R»@ ¤@*s@ ¤ ’ú¸!;›”K—¶Y"Å«(O‡¾Zòãä`sÕ”ÿ JŠVÉ+µTj¶D¢¾ _H9+Ç¿ï¾û\ýôýïß“¢ZŠHU ×4(Ü£Š)¿E{׫a+žü¡%L¼–¢Ñ÷W©¢)©¬)*HêaC@ªZ2Õ‘”;ƒîTR÷æjs}<Å÷SøÙt¾vŠ )šDWH¥KEI……Ô•W^yìØ±ë¯¿þæ›o¾óÎ;žüã?úÑ~ò“Ÿ<óÌ3?þøG>ò‘}èC¼sö†® :gÅ$zj½”}­¼(¤¢ž)RµŸ¥Ç$:µNt'õQC@ ¤@ ¤”€HTÖô$µUM½8JêU¢ë¥èþ*[ÈÃÿêÆÁæ2p;©pSL…T¸>ÞR~#Lj˜õ¤\ýôì³ÏþøÇ?þÖ·¾õä“Oºwÿ<ð€«±îºë®Ûo¿ÝÉ‹‘²ÔRÑë`·’R )Aj½Þ~´© «d"õC¦M*lþ)©þ™…¨@ ¤@ªof±‹u— %6D÷W½ŽnŠ’ò3ë\•NŠ·Nè¤ø5pDëÄå—_îŠtë­·:4'Nœxä‘Gžzê©o|ãßùÎwž~úiWZQçìñãǤh“¤ÔBù)±-º…ïžàž|8©‹«( å©ÊDê!C¦Lªñ¿úF©Kjà}ƒHMêÆÌõUjØÒ’‘Iñt"Å³Ú 'Å犹'NJ)¤Œ¤¨–ò¤ü úÕW_ÍIÝÿýÐã?þùÏþÛßþöW¿úÕÏ|æ3=ö؃>xï½÷zR¬{B¬—RHñtêžÐI¥TQýIªü¤¿ŠZжÆÔgÐw©a¨â¤ê€H &%/h=R•¾ßÙø_}#^¥@ªÜ«Ôo3dHõ}©š;)Þ½ÙJÊŸ”WQRb7ôµ”_)uìØ±ë®»Î“ºóÎ;?ð<ðÀ?üð'?ùɯ}íkßýîw¿øÅ/~âŸpÿº:R·ß~{Õ6ë¾Éïd'å×›ª'_NYHqUž”ÿ”û˜¥bý@°5¦B*ZKUeÉHE'­ßÛø_}#HÔÎ%ÅߤöúþÈw‚H$µ••,Ðv.=ßú…O`.¤ÂrІ_&Eõ‚NJx¢Bª_-E¤n¹å–;î¸ãž{î9qâ„ô±}ì™gžùÁ~ðÃþðÓŸþ´+°<©o¼±ÚÓÏ ‹ëá({¢Ó$:÷$öD?R_þ:$Å‹¿…Ñ º'ų¿Z/5)±aR UÔ†€HH)Ôëªè¤hâ—TÑÌ0ÕR4®tR“ ]øÚ8‰N¤œ˜»ï¾û¾ûîsoO}ôÑO}êSßüæ7úÓŸ>ûì³™ÓvÛm·¹¯lnäWÉÛI‰žÙðz8­¤è AÊÿU”¬ªÝ1}Û,H•HTAR2¤@ ¤@JIiR¢¢Ó’Z«.Š(TÑ€9ÜLª{B)¤”…ò|•<‘ºù曩»îºË“zä‘Gžxâ WN}ï{ßûÒ—¾äÞ°¸O9v7ÜpC=ƒN…THJ¬—rá¤h‰<ýëàU R„ÉÌIÑ¿>´|ÊX~Z¨ùÒ ¤Š¤@ª ©R RfR' ©–’ZI­ÛøP6šÑIÑz)±/f'R~kÌhÛl”Ô¾ð…¯ýëO>ùäý÷ßüøñ›nºÉù«fÐùnè¿ZÅ_ÑRÊByQHñ6 ÷ü¢…”§’:\m(ïù/s·»ÝíþNJ߉H‰K ‚Tk@ ¤@*k@ ¤ ’ºßFêÌ*‚T½'º÷ÔƒÔZ° [t{†<¼œêt%NÊÕ8‚_(ï*¤(©Ï}îsŸýìgzè¡»ï¾ÛR×\sÍUWE ©VRá :=÷{Z©BÊÿæÀC9T_.ÈOîS¾¢Ú¬¶?XõÕúŸã'Ô©{¢u_ÌT÷õR R RR UÔ}†ìR/¨’"Å.M…Tk÷„˜Dçµïð\gᤢª¢K¦”Uò)Rnüû­1‰”ßÓÕI·Ýv-™úèG?ú[Uœ'wKÝ0{mµ@ž_‡{¢Ö w·¿PEo gÀgÐçûš£Õ…Ã]ü{=ô/N¸šÊ`¾PÞ~%ê©‚¤>`HH”’¤XëÄyAëDiRVR´V>¼Žèœu'Þ7Ïœ8qÂïˆYOŸ_]5N¤ )w'ú º'E­²¼gVìˆ)žºÿÿ~®¹¿ºŸïgÍ}å?öÓç=.RR UÔ½†€H”™ÔVTN‹³K¶ŒF*ì“å œT´‚“ =ñM’:‘âK¦Äõp®¿þzW-9U®¢ºãŽ;î¬â0ùK^3OWTžôBÊ“ò ³©Ö ÚI¬”ÚŒÅúÓ{òo³š>§†Y?§NÓç´/&^¥ ¤@ª ©{ ))3©» ©Ì¤VYólWRÔ:ÑC‘ò TNÑTº¯¨n¸á˺ùæ›ÝŸîcw˵՞Hl3Lç‰_ù÷ ³a!•ò>’ò!F¼ E”©«m3èúI¨ HYR UÔ†€HH)©ú+Rûª«¥Œ¤Rž&.‰ÃÛ(ÂóörÊO¥{U¾“ÂÃrtœ­÷²ÐµkO¿–nšhm˜%O!©°cÂâI¢ÃL?ìGŠo’äÇD’TãŠò;’½JHå Õx•:nHH”’8©3ªd"åÞÀó+áXHÑü0÷$HEUÑš#Ú*ÉØ<ëUQEuy‡ÆÛizzg&Ob=l— FÜSHŠTù£K—¼ö…”…”Ò@R­)*HêvC@ ¤@ ¤”ŒCÊÐðˆ”Õ`]'ª^N‰ÙtK„0Õ+¤¢ ¤ÈS+)ò$H…ž,¤è÷5´+’'eœDÏGê6C@ ¤@ÊLj+*§åÝ{¤@ ¯RyÒNÊ_¥;©T笅T8~)E• ªò{T UÑ¢ÊÃò¹¼Žÿ+-Š¯Ê¨~žZ—I…ÿ²ðCBžü›Õ–™îƒ¤úM¢»¤n5¤@ ¤@J HHeM!RJÅj^×§•÷Ô•TT•S¤*UTyXd‹‡azGõáê(áÉRH‰eRQOáá¤x!JŸ:Ì£g$E›$%HÝbHH™IÝlHH”’¤ôŠý,œ­•ª5ª Iñr*5•N³é¼¨°hZ§‰É×Po«ÒÉS¿Bê`¬–¢Yój#LîÉ/‘©1R UÔM†€HH)I’òk¡s“ I­Uûx I››rOÈ)Ñ<›RÅ;)¢EÍ©,Ïȇaò5Ttâ\x2.“ f…Ÿ”¿q³^VµÎšg[Iù³7œ”F R UÔ†€HH)iò×5)CŠæÑCR‚ 2•ZÊHJL¥[TQQ%`‰ÐHoß®¡¢íSÔSXH Rü醞„*þ×CÕþè´Vž~i‘‘m’d õ~C@ ¤@jTRS#R µØ¤&·žjޤDçltŸ$>rtR©ytN*¥JL¨‹9uÊÛë¼­N½>UB O¼²Ì sR±„·ÓÄ9e¿a¡¼÷Ô•TôBˆMR7¢’q @ ¤@ŠF×`R»ðƤ@ ¤²âWA¤¢ªá¤Ö›×Bä•WÕÚ9{Y3žT¨JÀ"UѼµPõH)L)OD*Ú0ÛêIH¢PÇÅØ:Q€Ôõ†€H”™Të"¡O¶ Ѳ²¤@ª ©¥€Vs@Î$µe"åMî=HŠT [\•NÊ…“Š–S^5Òò uQW‰0IÔÅ$.z#š&ì ³):Ñ}¨i‚HqO M*2DË È©‚¤®5¤@ ¤@JIiRá<:_1UÂ2’âªh¢«ê_ ŦÍE{lXB]¬Œ=ñBJx¢)ú˜¯7ó_¼V_ü{©R UÔ5†LL[@ ¤@*k$)¿×a1Rb«¤ª¢¤DE%–LqR\ͦ‹ u²Íϳ¼ùÍ)Lä)º@Êèé`sô°f¤Öëµòþ[Ü-)O:)eOôèî˜iRÇ ))RÒ¸¢ ²IòÉý¹¿Þ 3µLŠÏ ë¤º^' u…! R RJ@ ¤@*kF#öP„å”@¦«ò¤Ü@õø·ªÐV§¼þõ)LGY¢…—t¨¾È·7´Ñ ÕUlÕ?*î Ütº£Å«(£§Þ¤øZù©÷R R ¥¤@ª ©w²t¤vïÞ­“Šm4œT¨êâfôŠŠ(<ÉU‚TÔV?ïh^ODSsê\•±ÒjóD¤,žÖšY¯.»v°Z>ÿTÖªëðÒÕíx!ÕÛÓË»/™Ò×Ê7I½Í))% R •5åHõVíŸåòÓ[U8òéö¨³4;"-¤xÓ„¨–VëÉrGÏ`£j¥ïòç¾Èô‡‡“êçI¨ÊMê­†€HH))*Hê Ù1¤ÔUòç«¢gTÅwÊä¶BaŠ*n+ZQõKMÁbËøSž¸*>S¾ÆVïW³T?QR…”‚f8)}“$)©¬)*Hê ©n¤Ubù”€ÅË)®*ä…µjè§à!(©ÛÍÆøTú¡ O–”ŒâóÛ…3÷D©x¢Pß„RH½¬#©›$”HHe HTARo1¤:“ a‰r*ZQ‰©t‘°´JM«“­Vt~ Ÿ»™TQ!µk’õtÄCv7ºïZ¯·??Àz…ýô9yâÿuò”:KÅHý¼! R RJ@ ¤@*k¶HE/(Z'“ê§ê¢ öiuQ¤Xº°TÉ¥†Kã?`£ÙÁ &þ¨Ýíë«ò‡ ½&¾‡§¤¢K¦Ò¤ÞlHH”)ÊšÙž={“RN–]Uªœ aéªBaBUV+¯.ÎüWùÙtWm4gÐILô‘ú/ãŸõ­²©5ñ]=¥ÎR.R{÷rR?gHH™ImE崌۹€H•#õ³†,/©Ö ÑsŠªjJçIµT誢°º–Vfa®¢"O¾<¢©è#¥ ’ä—F O!&AJñ4„Tj“$?njR{öìpR[)ÊFªqEùI ¯R UîUêM†,;)Û*ùè†èFRÃU¥`¥TíßÙ`i-–TÕ…¯¢Ž=êHñ ^HéøÉÓEluÔkÒ;!u*¤tR\UÝ1AjHHeHTARo4d‡‘JôÌ^ÛÉNŠ«²´QDy…ªhpFy…-"QdÝÁmTÛñ¥ó‡ª]ŽBOâ!S^×܉·ÊZ<µ’Šž¨N¤¨sVl’R»@ ¤@*s@ ¤ ’ºÌ%%Õq±ÔpR…T¥’²¥8kÆœ…ðDuE唟 †HÇôÚ`uTkŸ¬Ñ“T%SMRo0¤@ ¤@J HHeMFR<éª^ÝL Vª‘¶U·E-¶Ts Åuv¡›Õº3¢¦¼žF$õzC@ ¤@jDRÓ[üR µÀ¤*OC•$¥.–º û*y”^Q…°R•ÅVJXk±ec’r…”ß0i½º ÍþêÊÕHH”’ž¤N¢JªÊ26†ðj6„šá§ö`4\O#ªxº¤z¤@ª )ËÑ))R’$ÕÖ9+Α2lJмÂzE¹[…QÞÓûFªÿÊÖžY S-X)ÊFªqEyËÁ[:Rx•©¬¤¯R e U—SáÙ‰ž‘‡‡‘Woj¶©<¨ÒÇÞðh…“ ©¾¤,G ¤@ ¤@J HHeÍIRûöí³JÏ£/ÂàQFr'd]Óv·Æ‡Aîô>`üñP!e!å†Q¸‹vh–x;)ù€sj=%. R RJâ¤ÂŠpÉ”JªÜ€1ŽOeÀˆä££<ûrÇcàÁS¿ÿ–èb)Þ:¡’² )2“²<())%VRéÎÙ𼌠öèF<àÖžY)*Hê|C@ ¤@ ¤”DHY–Lm¯–—'eîÉ(¬“¶î?rüçÝ)Êà?ì™.–)º¤Ê‘z±! R–Œÿ¼;E9üñƒT !uA jaÇUws±Co†²þÔx¢ªÄÓLêH•H|‡¤Á¤¦9*—,CTõ#ì´•ÓònçRK˜ u¶! RS HÍ%c’šãè=–~Q‘Ò ¤Æ H• HU£ë,C@ ¤,©jtTR#cê1z§–¼Ì¢*©3 )?yH HM!yHMvR%0Í{D/`ÑVU™H½Ð©EÈÀ# RåRÓÌÀ# Rå¿¢|&R Ȳ~»|2>¡ìªú“j\Qþ C–ŽTÉW)R“ñ -©Æ«HÔ˜Éø„•Ô ©$©~UÔ4o[9·¾ÏS )>ƒÚcÈÔÈ´¤æ)Êš@j·!KGÊ='÷~–“²4Ϧ§jz² é=˜-;6æN!sC´Em…'óܶ†YNje…!))©‚¤N7dIIùа‡"TÕ<!#!i8ņ’7£iKÙ C§ÑâÉ #©E H-A@j‘²t¤N3déH¹&Ä<ºQUp"tI¹èô«g.VÊiëá,e‹ŸÉ¨'>}N¤öìa¯;³S ))ÊZ~R¾œòªl³éçÆÒj(¯›û…cdĘ̀ÍÂ+u>£žxÅ )WI±êhö®Ô~áü/ºaý_–¨Îˆ¿Ø?yüÅéäÃb’¦ÓÜ0:冤@ ¤@jh,¿k³=çÑ¿jAÖN?+Êç»Ëéd† ÙÓmtÍsü#‚ ‚ ‚ ‚ ‚ ‚ bÎTÁ7É}2S=æˆ%S=±³]Ó~ìÈÒf¢§w¢ÛgÒiË4Oï¬ñ¿©e¢±ešÍ’'5ÅCŽX3ÍÁ9ÿŸV¦ù¨‘tbü;ËÓ&å3åÇŽ´gbçwš¯­"Ó~ôHK&vzA YØLtpÎØŸ“ˤ<Ò–)“šÚƒ®RˉÎèNóQŸÌ¤<‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ 2¹Lùˆ²ˆ™A‚ä H!HÞ@‚ä ^¥$k@ Ar3~’5“¾º‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ÓÍÿ ÊjDh/IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/multipart3.png000066400000000000000000000452301477365367100225700ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœí݉ŸfU™ð~ÿ„8Tw"²u£( Ð]Ko3ãìãÌèÌ(‚ ÍÒ²ï8@a0(n˜D&1ÑÑDÍb³˜ÅìfO4«‰YÌ>9uOݧžûœsžûÜ{Ϲï}ßúý>Ÿ®~ë­ªw¹÷|ë­ç¼gÙµ AAA†g† ÙÓ­uͳýÈì%/yÉI'tòÉ'ŸrÊ)§žzêÊÊleeew•={öì­rÚi§^åŒ3ÎxY•37ór–3ÏœYçe,g¤súVf§ÇrššêaÍö¦³GÉL^±Û˜™õ«c§Ýcø³`ÏP?òè±cš:üü,Ñ©cg±q2étÕÇ~/6×\\»™zªk@®½ô¥?öcÛ¤þŸ!ÅHÍ ïÌyª1­TMa¦0ò|Î:ë¬W„™ùÿÎbyy:g*gñÌÊhªF1S¼6Õ&Û[·äÿÁ–Ç_?ÃÖã!`ó˜FÏ?QÁY|?™tÆ^³ÚÖ)§¼ô¥S!ÕzE™»© 2zÿ HHeýÁe'õ Y:RîÏ_w ¨r¢?Íé\ÒY¡£öfΑ™¹g7°‹F±ÈPF,*im–í™e¸°ù+™%A(>¢‰ž~®ØYÜF:-t,éw·¾ºZY9å”f÷„Ê©d…R µ|¤æú*5§€T‡€TWRÿDz¤Æ;ž ˜6þ¹afþ?íìtRàÌøf]£·ð0ïZàh`6ÕƒÎÎG””¥®*A­Ÿ¹ ¤ß³´ÓIcÚ"?‰ R³ó·ÆPl­œ’òª¦HjÖøo„€Ô¼3mR›ïZU¢@Ê|‡ 5çÌÔ,Šª&5ÛêhŸù1IþBØ=‘ õŸ ©­³’òU5œ×pj ›,Çl_b¼Këi¤C~^=kÊ—S •¼Cšz²³} 5V@jòÉrÌöíXRc¯æ’‡Ô+«U•@Æ3oÑd–­1~qÒÄiLê?²ÔïKT©d–­™©R[' ¤º$û³l HÍaíf·ƒI½’¥Ÿª¢ÂvLzìð×¢8‹MjN¦@jY2IRÿÑ‚ ûv€Ôò¤¢í{;wd%•E„2ð¸*žú‘JÌ—š;©9 ©ÅÌ‚ú†Œ°Í@é{hÞH-d„ÔfTNã¼ ;*ªäDù¾¤²«Yˆæ:ù(ž²’ú÷†Œ3_jkO€Ô2gÇ‘HÔÎ 5ÚÛT#Ê®ª5; Gׄ'§•”Ò‹Ô¿3dy$ÔŽH•Hí°€Tét&uþÖ IÊ™‚ªá ŸBîLä9å&Å×Dÿ·†Œ´Úìhs¦@*•ì‚&pH¢£$©cÈh³zAjÎÉ.h‡$ú0v ©‘Lmî‚8 ©yµ"=½9DŸµí3ÎÕùþ›á€HYR&Rß7déþð©^©E!å%¹œ‹Øþºc'z®•·ýØ[”½™åN§GT(­m)Híw$êÐÒ²¦Ó#*”ÖÇ6˜Ô÷ Yº÷¥@ÊÜÒ²¦Ó#*”ÖÇR=2R©”sC1xUÏLYXëãÙß}Øl“Ô¿6d¼’Æëñ)©|w R RYï¶k'z=Uœ”TšKSÑSLOFgãñÀü÷ &õ¯ )G*H©{jÞ-HHe½[©r¤6£rù=£1¢ ›¥½¯ÛHé f„æÑš†.ì™iòÒŸ½ µŸ6•o’òªÚHýKC@ ¤@ÊLê_2yRõ(AzEe¯­‘—Y)RS;Š|ˆŽ4‘:· 'Õ<5–v’½atj6vC}õärÖ*lȱ´ ~/!)¯J!Õœ(¿¤f\›#Âf‹4ŸHTARÿÜi“š5_Š@ ¤ZŽ Hµ$IŠÍÀJ‘âžBRçU‰‘Ò62Rk½£!Œ^Ý3…aïè÷ë«…”Wµ”¤ˆHÙÛH$õÏ ™2)Ùa"U¤@j0)9JañIÑêSKEI%fÉGIE›GéV¡§‡¡¾zr9G˜r/ )êGç¤x9¼JýSCÆY{bè-€”xl e;0KHjø–½;ÑA ¤–’Ô`TÊ ÔŒÁ¢o’j3»?æ)Õ*2¶„!­e ¡×ôÉ@a…x)&TÕiäl@êŸ2F-5hpný£Û7ÂËÅà–A ¤v©ylÙR 5R¦6ñQzå³EªÓd© ²4†¡RÌ-Ä")7ŒÔzð²cËá I¥FÎHýcCb-=cëç¤å»UíA ¤&GªPÛ)ZxRß5$lè%šþxo('IÆÌ*mÖØ ²êÁ¨+‡‹:d °Þ¶z¤ ›åTt…>e*©¼¥Tô½£’)*HªN”’¶ÈJ> RËDêRÔè«#UwÚkÝ ©Œ  w éÁ¨ š~éÊ+ûѵœ4ÿ+Ì8rvš¤òÞ’õA ¤¦D*ûßi •»‘€T—£•›Ô?4¤0©Ñ“‹”Ò2xéØ6º2êââéÌn«Ó‘N­¤þ!rô}ÈкóÜLÇ;)š©œ}èÕÜÁEíž)ÊDjÑ£‘âC'¤R­¸÷éîg¨“¤¬\z§¯è3Óy…‡ÜrÌøÏæ õ÷ )©…#5æ^ RËMjkÞí4j)•?Mö3žPIÆöÉÐô–Ë–ýȉ’ GΪ¤þž! R µ`¤" D”¼C©r¤þ®! e%5ä\÷kIåõdq6‚-ý¤Tÿ;)ZnR~a0êÙ$@jØñËMêï‚÷¥:*¡Ê(I`êDçµEÒO˜n«÷!o=c Õ; R •5 RI}ÇòµÔt†Íæ •K•QÒEAFJû]Îô@¦Û²ÀJxý\å&õ· á­ÞQR UÔfTNå_?@ ¤–‰^¥&G*u›­’LQ7âÓ×gË@^yaµzÊMêoR R‹DjtS RËMjÁ{üR'w4La ­œ„›(¦o scüF‹­”°°”ˆÔIuœ/õ7 ÁûR R ¥¤@ª ©¿aHqR³Qg ö_!©©ÖSoĤO‚(ü•—¶¥é¦õ£¥UW[X=<-3©Í=EwMerHÔšÒ|)©¤¾mHµ“ê§ÊxêCOQFzý$üxBÇeUZm%rY ,]X!UÑ©¡wR RYï¤@ª©¿nHùÑ‹ßã׃TFLaƒä%¡¹ŒEáКØO¤® +·á°†¨ÒIåXó¯2B'ú˜‹Í‚H-=©‘R RYÓNŠP¤×DOSô õ5$0ùv~ùå—8pà`wáò*¡•Ôõ}“R¥ ëZTuRÕ™>©‰n R Õ›Ô_5dœùR R •©…7þ!IRáÈÙ2¤zx K¨”¤×±^sמ=¦ÕÕÕµµµõõu¯ŠrùÐØU‰ ‡ÕUUêÛì¤|+)y‡ RåHmæ¯(o9©¥ õ-C@ªeûë,¤^D/¡¸‘°„ò¤œ'÷‘H [gêWuU"Q[¥UE¿‡<ÑЉN¤N?ýôÉ‘Ú5r‡Ÿ¿?©l¤xû©±ƒW)*ø*õ— YRRîXpRѹòœT…j8)‹§ÖŽsòV(4ŒÜP,º@¡žõŽI©‹òŠª²Àzm£ªð„¤¾Ú•”o+ ÅR RYR UÔ_2d‡‘¢‘³œT¥*EÊŸ¯Þ¤zxâ5“Èeõ *}–´Qe½Ž+­8,‘¥Á_׫¨*:-©ë£¤¢ëbŠ¡ ÅR UÔ_4¤@ ¤@JI„TtÊT°:fRB•îé¢fBO¼ã\TNѤÔèÐÑ£G¯¸âŠCu¼-RXm1ÂjUÅa¥:Ô…-¡J!•Š‘Tëd)ÚR U”Ô_0dyIuœØ;Tô«QO³pOÑ¿÷H’PE¶Ñû¼ô'ýù·K(¬ ¸®†°UÖ@UYIíÞ R RËLj>³zA ¤Jú¦!å×D7%H)±R]=¥Ê“Ëšx}šåÁIñ>@«ZkÕ VXT)}€ö~¿!¤ô)½®íÝËIýyC–tcQ)Êt‡ R •õwïÞ"¥ó{ezboðó›ê8žÄ;¹)O‡r8Âï¯qž>Ìßðå‰VW±b+%Í^Z…OByóWØêñžo+©~SzRÎ)2“ÚŒÊi„µ'F_Ǥ@j©_¥FÏ&©½{÷N†”ðt Ëk›ó8M´Bñ\3öƒ#|kç˜ÖªšéèÑ£GޤRºjk"‹ÚR`EÇS^zWº]U1RÖ))% RËNjµTRCTñ“õDm†{¢ÞñTËôßà|;vl­Z¹å`sô„£æ )?fV$ÊHÿj›½Ð–+T•êY–S—Ã(tUHñô6RÆ¥=R µÜ¤ÊÞ|äA ¤Ê‘ú†!;†”>±—‘XNéž8&ï‰úÎ=÷‘Úä ®Ýz@Ôžý§‡ë¸BÊó°¢¶ô$E¿…¥Œ­ˆŽ§°:•SŠ*áI_ˤZî¤@ ¤²Þ!HT9R_7dœ5Ñ'Ðã×FJYÊoˆ'OJôšóq²Þ“k¾ézRˆ7TÞeÎ=mTU”/¤œ§+®¸ÂÁ"U ¬C,i`º7+:ª‚à G„\ÖTÛµ+=k™IM§Ç¤@j9H•½ùÈ‚H•#õ§ Ù¤R‹$e%%N«(¤^› Ož\³ôM›H‘žƒÍ&òB9Ìr¨g¢SªÂõÖnu.L/§z¨êMŠ/â#õ§ )©E"5º)©å&5—ùR=HÕû¶å"% )1VâR¶çÚjµ°%µLŽ)l¨azò¤\9å‡ÐzU­¶ß`„eQ«Xz9Õµ7=EÊ{r«7‹1³Dê´ÓNk’úš!;c$:HHõ HHeM„Ttäl°HÒ@RŠ'^HyO42‚ª¨ºûü`=6l¢<;vì oxƒSu¸ú5QuQ^$LŸP†Ã"UáøÙ~#)tRẘ‹Dj µHT.R›ùª’Ñûˆ/… RIýICÆií£¿J¹c¡“ Ê©\¤Dß94Až²òµj1˵jþ!£Æ)0­¦»Ï¹'OÊÅ×Rb´•*ªBXâz®êÒôºé]UI)³äAjûž@ ¤@*ë=H•#õ' YvRæ¹ò ˜+oñä§F¹&$ÄPãƒ&D³¤|ëU<­â/{Gê–#A °”'!ž4‘ꡪ©z'œé‘»Ã¤@jÉI©‚¤¾bÈò’ê¸HR?R¯iæ¢æ8Ù¨'ªœÂ^e^n„m’*‘â ûp=b•Pä©o8£¨7»ªÔóàªx9•R¥Œ¤BJŸ,U‘ZY)©B¤¾lHAR3–r÷"ï¤@jiIÍ%)uälR¡§‹‚q²äiµÚ©Æ·ºÕºŠZc=墟ÙÓY  )î‰H öÔ \¨jÃ0®6UNñ®t‹ª°+=Jª÷º˜ µ ¤@ª(©?nȤI±¿·/F¯Üþ©å&5¨”š©øÅíÉAÊ2€"åéb6-ž<¹–㛼ooÔºÖÙ"—<îzßJO¼ïœW=©: RƒIÉ‘ ³/kì9;(†ž`]Ãþðk[$éó꘺'1Aê²j{C^Aߺ2®'åéKè©Õʱ>Q`…ª8/A«¤ÄøY½¨J•S=Hñ1³m¯Ru¢”ÒC…¦ôVÕ,ø¤@j~¤ú½JMPTŽNt©á¤¾`Hh’¢âšf³]Áã­¬¬è¤ø"Im¤BUѾó()ê>_ †H¬V#)|ë"(dh=±íàzs¨,ïÄ=Y˜\$öEÝV«*!Œ«:Èf‹¥Ê©(,Re'¥,ˆ^šTQ=o´ñ·éöߨ¼\ þp)*Hê{_*c²÷Ê·Þ!HÔ”HeŸÞ4R{öìéN*º,º eôäI¹à‰o?T,ð1©¦Xk†÷9 ODJñ¤£–(/¡JÀâׄåTHŠo’v¨sUJ9Õ›Ô™U²¾JeoáÿFHTARŸ7¤@ ¤‰TöAƒ­÷%E(ò‘R<¹¸“îZˆ°Êv´ö͆VB¢x4¼¿¼ÕSt¬D(é ¢ ‹ªâàý7R\UØ.¦ÐË©¥&µkÜeü@ ¤J’ú#†Lém¨)*Hês†€TEªÞ[Ÿ+o÷ä†kB®Õ¹F%Ú •S«l¬„ç²ÎFLpIä)Ä$J¨(£+¯¼òª«®º²^JEEîX½8;¯)þÇ®ŠÊ) ©ê×fœ3 R" R •5 RI}Ö@*:eê¹âþ¶)Sƾsß}îÚ‰of¤„7ò´^Í‹:Rí]£“Ò«(áIˆ¸ªŽøÔVØ› ïGçuã@R¢œ(BR´÷µX]L–))Ê©‚¤þ°!;˜T³œêJêâ:—$fÆ»Vä[ŽoHTQ&Þ5¾¡.†$F#´z²Hù SX!)EU+)£ªpî/§,¤¢;န©‚¤þ! R RJ¬¤‚~t#)½òs¤\{ð’|³ñÍi­Þ‡J(ÞÆÖ‚¤<ñÞiÅ“.å'M m XQU!,ÿ¨é醪Â÷.¯“*§DW:ïG·“J-¤/ç¢r*?þnô-¦@ ¤ ’úŒ!£Mî)©-|û¿qLIRæÕ1÷·Í• ©Ð-‰´VïvèŒoKkl´Àë>wRS艗à}ä)F?eMԇŋªcu¢°8©P/§ÂŠJÀÓ§¢åÔpR¾Ý€ÔÖ=H•#õ Yö?ü@ ¤@jØ–$¥šx}½Ç5‡¥â‰{"U®]ùÆ–SÜS8õH=Õ“ =…¤Ó­ mõV%µLœ U¥Š*^W‰rª7)±©¹/9˜”èAOy¢t±ÑÜê$‰¬'"Hñ %ôÅDÕÇô3A~¶™újÕlQUÆ~ô°œJ©¤¸ªÍ•Bêô*{÷îm’ú´! R e&õ¢! R RÚrR]–Eo%E=芧õ†‡ÞŠ…TÔ–oo‡ë…%¹$}œ¬bâz~.F‹Ã"U¼¢2ª GΦʩUuú”R±IÍwMt©¼¤^0d©×D)ZBR#g©è²èœŸ/<ùiRÞèGO‘âׄž¨JažDg¹Àúy-µ«mX¤J/§h$…RK OëìýƒT8zBrÇ>©3«€”HTAR¿Ï)ZRl݉ ôø…#g{‘¢tîÉR—W»ÜøXHqOA¢¤ŒžÄ˜‰“ù…f~±N}…Wåa)ªÄ`ŠVRŠªõ`… –SbEoR|²T©Í|JÉÈó.F HTAR'b5Çæ_" R •5[¤Ü±ÈG*:t‚†Ê†žhŽ”(˜RžtRGš³£Â¾ó¨'Þeî=…†~)ƒÕI•‡åUñÁ³­¤ºª ;ÑË‘r¿–RŸ4¤@ ¤@J HHeÍ6©ÔFˆ]HéC'x÷9 õôíAtë¤8#ž()ò$†KD=Q9/˜¼ž7ÅÂ` U ¦HM¢(ް(ª6šÃ(V8†Âç@½Köè¤~¯! R e&õ{ ))R'¥l„Û»•÷ä )Âä=mÄV:G ˆ*JxâÃf¤¢žBLä‰Kúå:¿Â⯩`ý"S%Šª”ªÖ~t1†"¥Š¡pÆ<ÆI =!ÖÅ)©‚¤~·! R RJÊ‘cf‰”¯¥°M­©…¤Hù/…Ýç¡'*¤D÷¹ð”*¡¸'ÂD†~µ¦Jt©·ªc(R¤¢ªèÂz3TNEaÔh©Æ-‚He#ÅÂÎ>aÈґ«H•{•)3© U”TëÐ ^N­×+m$¶³#Hf‰vŸ RÑIQy¢âÉzs•·¼å-o®Ó„Å»ÔyQªJ‘j-§Äï‘°œ²“òè|uÌ2¤ž7¤@ ¤@J HHeMRMUFR|è„èGwmÀµ^HE‹'ÅÓ¡Øn‡©BŠ“²xâ˜ÞRå×êøO,ïŠFTÐL*¡Š“RúÑÅ:IQRÑ~ôÕ`µ$NÊEYÝ—Á¹I}Ü))% RImFå´¼kO¤HÑ"I¹IùBêÛæÚêš“kBýHµŽ–z¢Q4\B`òŒ~½²U»¢aQ•Re)§BRqlˆT(I”SÃI‰u1Ó¤>fHH™I}Ô))%RÑÕ1J-Šé[<ëkNÞ™…ÔB*ôäK!ï‰×OÐoTyk¹ ëÍ VXT骈TWUÂSHJL™ò×DWÇl%eÜû¤vHTæ€H$õCv*©`E¿ZÊRêµ0©×wµÞgƒ £¥ª¨#Á4©ž¨ãœJ(ŽéêfÞö¶·y^5,_V¥T…¤¢ª8©£êÆ8QO¢=JÊþpä¬?i •% R •5 RI}Øj'eYÉWQþDÓ¤ùpØlS´û<ê)œ&åZµXI÷äÜ8=oûÛ¯­óŽw¼Ã}¼æškÜ•µ-ï*TÕ¯œ:Ê2„”èDWHñ‘³!©Ö-Ó¤ž3¤@ ¤@J HHeÍh¤\<)wf]ð=å|Æ<%êIH:”XIŸ/ )Ñwî"<¦ë®»îúë¯g•n¸Á}tŸº+Ý—*XomSõóÍ{”SœTøî‚ ¥ žm]S²ì}&õ!C@ ¤@ ¤”€HTÖ"Å—G I‘î‰WTëõz^>ªW=U*] S¬‚é'Hñq²TH‘'*¡\åäô?~üÆo¼™Å}ê®t¶*XW7Uõ.§RãgõZj½9z"•)1W~0©SOÝ&õAC@ ¤@ ¤”€H$õ¬! Õ“”ïD÷C'øßùÔwÎûÑ׫¹SQ^_³#©ß2dN¤Z¯è}Ë R »¢÷-ƒHTìŠÞ·< )ZÝz×6\kñ£$</épµúázuLßNÜõ®ùk¨:Ê%å›hXHyRbÜŸ#ECeo¸áW$¹RéÞ{ï}Ï{Þó¡}è…^xþùç?ð<ñÄîš|Ð}éÎ;ï¼õÖ[o¹Å‘ri ïG·RfMñ7Vا.0½bHÊ/]©•ÔéUb¤ž6d'õøHTç€H$õ”!ó"•½«¯¾]AŠöÃ)PKÑà×l|ð͆Oüñ¤6ê A¤ÍHŠ<‰Z*ڃλÏù¸ _H¹"ɉqtÞ÷¾÷}éK_úâ¿èH=óÌ3žÔC=ÄHÝëGIyÕR¢=ZQ&e¾Ô¶ýpô1³úˆ NŠ’HÔäHŽ,ë‚H$õ~C¾·@ŠöÃI“º°J8_ŠFOø pøI÷è¾C&KùfCÂ6Øty”˜"/FO(=è|r<R7ß|³³rÏ=÷<üðî~úîw¿û…/|×RDª@a!Å ©á¤O~Š E™<) ¤@ ¤r¾JHTŠÔû )+©pØ,Þ¤™R™»ì 'åÃk)®*JJ ›M ˆNŽ¿îºëŽ?~Ë-·Ü~ûí÷Ýwߣ>êýà?øÑ~ôâ‹/>ûì³O>ù¤'E#gOœèJê§«¤FO„#g-ž8) ì>Εԓ†ÌŸÔzü@ ¤ú‘ª¥”|_hRùÇ oÝ.HÔN•Ê›1I…g\ôú®V›`SkéJ*œ%íD§¡œ”ßçP ˜uhœGêsŸûÜøÃo|ãùÈG\AýØc¹ëþûï¿û^¤Ä²è­µT”ÔZAŠŽ® Iò‰®‰^ŒÔ†,6©ð5¤@j§“ò—ß,üq©MjP)µõ³Í[“”Ãy0‘ C¤D?º3k©¥¢¤ÂU‘î¼óN‡ÆÕRO=õÔóÏ?ÿµ¯}í[ßúÖ /¼ÀGÎÞsÏ=m¤Üý(›`Sz?RB?þ=‰Õj-*®ŠH½¶¹ýuR2GR•§a¯Qì¿úJ©©‘'³èkL·›hüW_ R UŽÔï4dnÓ'ågÜ(¤üèMÆ)J+NŠ·቗Sa!ÅWCç¤ü®×QR4SÊ÷ ßpà œÔ#<â=û쳟úÔ§¾ùÍo~ùË_þøÇ?þôÓO»rꡇêHÊÝj–|j¾” Uå‡oTÃPè@’3>€¤š©Pe'U¤@j0)ùÞéÔIí8H¯R 5ö«Ô{ ™ó»P»ÐÙõ•YIù•vÜ9žÜyô¤xD]å›Áz=™þ0› . )ª¥ˆ÷Ä )K-åI]}õÕ~¦ÔñãÇý˜YGê¾ûî{÷»ßíô¼ÿýïî¹ç¾ò•¯|ûÛßþÌg>óÁ~Ðývu¤î¾ûîjØ,_!ÉO”O퇓‹”?6ôNƒÿUT)R—³’@ŠeïGR Ry3£ì:©r¤3d¡×ñ‹ »ÍN*ZHu"EåTª“¢ùñ¾A†…Tt¢¼ %ÆÌ:R~œ{ï½÷Á|ôÑGüñgžyæÅ_üÞ÷¾÷ýïÿcû˜+°<)‡ok+Äë\!Eûáè!¦D;Ñ…'…”»Æ]¦A‚i6 R-Wô¾e©r¤~Ó)ZR£íÜQ˜”?­­¤ÄŠh:ÕRž”èA§BJ!å×ÅTHÝsÏ=<ðÀÃ?ì×DÿèG?úõ¯ý·û·?ûÙÏ:dNÛ]wÝå¾³êA¿öÚkÅf8­KcF·@¤ø%ACRÜÖF½ 6]¦!´þXzR4ªâ@½‘ ¢ïRåR UÔ{ ))R’kiL;):³ü\‡¤Äd)ÂD GOˆBª)¿<’ƒrûí·»Réþûï÷¤žzê©çž{î…^øÎw¾óùÏþ±Çs_ºóÎ;Oœ8Q÷ óí¯{¢©þ>D*Ät¤^-TòŸzR~H…ÿÔ×U¤Ê AÊ|©,)*Hj3*)±Ìÿ¼R UÔ#†,;©¾›áIñ¿ê©„¤|à½éD*ZN…ÛàPº…”kÿ~óC1lVò(>ýéOõ«_ýð‡?ìš‚«´n»í6çï†ø€Y߃.vA =EIÑø©Cõ6Gëƒø¯ž#Õ¾àþø®örWúË*NJì„RYR RYR UÔÆì$R/¯’”(ž²e|ø;þj-¼TEI‰)ò¾é*›áˆ‰òDÊUHÑZꓟüä'>ñ‰'žxâ¸ãŽ;NTS¥®¿>UH‰ÉR©½¯Ý£¦BÊÿRphôDHÊvü᡺Ê}t_ò%ÔázW!w ý¸ ¢¤J¤@ ¤²¤@ª ©w2OR%î{4R4\"ì8§wü…*QNQ7çÊ‹å‘,Ãfù.ˆ~3Ú çï|§_ÓÕIwÝuM™zòÉ'Ÿ©â<¹kê³7Uäù¸ OêWª´î}ö “0á‰?{÷ŒÝ÷«6wŸºov—ýÑ:ToI}ê¾Ær׬ÖG÷å£{_ï@R%v\)*Hê!Cxí‰ø ‚HíhR»†­á¹¹2¤\¢Ë#ñq²\UFRa9%åZ;ßþš÷£ó‘³ŽŽ+›œ!?í‘Gñ+bÖÝç7T'R…”¾ z8tBì„C¤èyû¸/yFô©ûNÿöƒûè>u·ï«(_Tù˾û<µ úR^Õ“ÊúRR UÔƒ†Lã¿|¤@j“âËxf»Í¤x9•"%T餄*êDçÃfÃrª•T¸Ž/§ü~8·Ür‹«–œ*WQÝ{ï½÷Uq˜ü–×ÎÓñíá²|Ü÷äbéA¿’Í«¡‡¤øïŠGããË©µj¬„ûè+*w™`ö ¶ó!‘:„á‰A¡£{°^‡4ÕƒRÙR UÔ݆€HH)éIjß¾N£'Âr*ìGç…âŸòчÙÀQ¡ªw9å´äEÕ[«¼­ÊÕu| Å<½Eõd0ËIñq|ÐÄzÐ'å1ùAjœ€H$u—! R RJZHùQ’‚Ôù›•Ôþ*­¤¢ýèa8)Þk®ª¢¤:©ŠU¿QÇóò— SÝyžÑ‘˜¢žBR¼´Z¯vÂñž8©,£'l¤î4¤@ ¤@J HHeM„Ô˪„¤Xúùu!e$%FÎ^΢¢f“"%zÓSýè¤*ìJçªÂ¢ŠÛâ¡Q²uç¹'K}çb÷›)ቓ ¿ðlͼö9\­ é¾Á—SDjà|©Ž¤î0¤@ ¤@J HHeMvR©eÑi…yâ­B!-§”~ôT9%*ª°¨¢ºŠÛ¢ú‰ÆKTe”îÉ2n¢ÕSHŠ®¤èh¹«õyOJ™(aÍ•ç¤hYô©Û ))3©Û ))RR”T¸HRŠ”˜/%ÚÒ¡ Rº*Ñ›NEU¿Òw›×K!ñ9ñÔqzRzÐy÷¹½â¤ÂBt­¤  (Ij3*§±œ HT.R·R R ¥d ©WV±¢!)RE]éº'®*<{El‰t]UXT…°HRÓ›ªŸhõ¤OŽï7nbu¢ûÐÑ"O|¾T+©WU±¢E’@*LõÇ,HT6R¼:š½Ë¥#…W)*÷*R5©jÙÃ\¤ÜTH U©r*–"–Sá0 ¯*:˜Bô©‡yS>D6Ñq.<é=è!)R¥“Z¯÷?ôß¼Vmƒ#¦LµŽžh%]½Ô C@ ¤@ ¤”€HTÖŒCJ)§ø”)Ñ•.ÏR|Þ|T•RTñüR†é&1HÖâ)5t‚HÑ1Xk&u=ÕO”ÖBJ!¥ï‡ÓFêC@ ¤@ ¤”€HTÖl“:½ÊüH‰r*lªÖÄJ&»§pr|艓¢C²Ú ?Hî‚;„bóC^Hõ&Eså ¤6sƒ’%^Τ@ª)±šcó/)Êš)¿¼unRáŠÔÄ©°¨²”SÊŒy1i>:}Jt¨s[$L\CßùÆ7 L¢„¤Ä8ÙÞž¢Åyò7å>u‡Sx=èIÑÈÙ4©wR R ¥¤@ ¤²¦)¾,z´½U•…TT•FÂJ¢°RycÌQ“÷äIEgG…ƒ&¢žtRÕäø°rG:ê‰H‘ê½N“Ôõ†€H”™Ôu†€HH)ÑHñÉR}IEûÑuU©~t#©#͹SÑ¢*5˜‚ÛJå§‚4%]KjvÅB*ªŠ×Rþ?Q>Õ}.zÐA*{@ ¤@*k@ ¤ ’z‡! Õ”(§†¨²”Sá0 ‚¥«"XÜVÌM#MO´¡Ì‰I‘z¢ëu¿¸ÿ*ªøðbºæ[):GŠ{“¥Œ¤¢ûá€HHe HTAR×Zð±é’Tj'œ.¤Ä ½+= +:wJ¨ k©¨ªhE•‚%x…]âÑoHK²{â¤ø/÷=þ±ûaœ”?<“Ÿ&e,¤ú‘J­ŽÙ$u!Ð&¨…FR 5)R³Æ‹)Ê+)¿Ê`RÑrJÄ^N¹–Fhø€½¢J¥¥p=axøÕ´¤ÔJHÖ!ÑN—ÝÿlÜá‰g­^©uš”N*µNwRo7¤@ ¤@J HTARu¢”ê4dã¿EL„”Ÿÿ’bžöU³itR¡*NJWåaµªò¤|vV´X‹*+%,u=}é 2W4ÃÍG«(¡j=¯-ìA_­GκwßæXtI$á©)Ë~8MRWR R ¥¤@ª ©·²ÃH%&K $¥¨£*U¾ë±ô¦‹Ö.,„¼”’„§c,a÷9UN"dh­º23ë~Ê??wÞw-¤Œ¤ŒË¢ç!µÀ¢@ ¤¦EjW¤Ëb±R UÔ[ Yd>±ô&åßa·º81c>$ui¨ª()@ÁëEÕ‰$|tJ “ðÄûËS•“P" I¹î8¹ƒ*ÆÉ¦<IuZ¤vHTæ€H$õ†ì RmË# RþŒ„¤ìå”H'RÑ„E•(§¢¥UŽL<Ñ3ó_¢çê„RT^º+ý-ûîsw\ÃŽsÞw®ºpð²è©_7¤@ ¤@J HHeM!Rz9ÕI'z {¡-ªÂ„"¢ßý©à&ÝS´³œ óOe#0ë>u_u÷ïîÈWQá×OCHñ¹ò1R¿fȤI±7ɶ/F¯Üþ)Jf¦~à·đڻw¯B*6¥w_°QoŠTø·_T‘ ÿð£&ÇIÑ5 ,ÑõÇ£ŠFýÁ&Þ%©x CÏlµÚ{—¿õí¾êîèÊ+¯t7~iì^Å“…T×¥ü–‘Tg¹$LH$õC¦LÊGè)©a‰’Úü/Nj÷îÝQRêZ.=H)ªB[RÞ oŸ–RTEmeJˆ)ô%ÅGîùOù—V ¶ðÔè®ôžÂB*åi©èüŽ©72yR¼`²ªR 5˜”œú¾ˆ¤HDý¸ÓMð*Rx•˜Yð_[-•›Tøn¯RN U¼[“ g±ò*c#xÇÔRTY¢«‰1Šz:|8¾f‹(›VñO=|Ç{£zó÷òjCÞ×û² RŠ'®j8©½{år.¿ªdús£fÍ Ró%¥q"VeM ˬyÉô¾HH¥2—£/P£‘2–S¡-¡Š“JÙŠF)ª¸­®Î 9l[©oß[íÆëŸ¨ðD?µ^-Þ’ÅSHªëR~ R¿bȤIñž Öc1ãÛÊŸ)*Gê— ™2©>)©¬ÑHñ1³ R4¥W'-§tU‚/+,Î+¦¨JE‘’ø†ð+GëUûOk‰‰Ü“û†ÕzÜ'å>ÒlŽ×Åoéä)+©Ý»A ¤@ª©7R R ¥d›T¸mÇ`R½U‰Á³Šªhu%l UÑX¨Ù4­Ôa…ÔF3ë±Ñ²¡'ÿ%1nÂ_£xº8X¹EÁÄIyU ©èÄ^â)*Hê— ))R"IY¥$©NªÄ ÞØÄì¡ÖÒŠ·ê~°Ú¾'êI"O«Aøõ©_ôÔ/knÊÆ1õð4œ”WúEC@ ¤@ ¤”€HTÖXIù­º“2ª°Rãg= ±„°ú©âhŒòØ\E{X#%ܬÖÃ`7š›²ùë马öáõ[ñ^ÚÜ—M1Ñꉫ‹$¥6ïˆ.åúC@ ¤@ ¤”€HTÖl‘ê¸ô¹'ÿ`é§|ǹǔݓBJ@!I Hý¼! R RJ@ ¤ ’ÚÌÏ)™þÚÝÓ“T°_›NªŸ*^N‰\ÞŒ¢J/ªB%ÍtÔ%FÑÒíE=‰GRãΰŽsœBRý<¥Hé#gÃÕ1›¤4NÄjŽÍ¿D@ ¤@*k@ ¤ ’úYCv©¶Yò=HEUÑPOEUjŸœTuÅaEëªõf6‚¤®ÂbW{U~qtOŠ0…UTêú”wŸóá„)£§(©S¦@ ¤@ ¤²¤@ª ©Ÿ1¤¶HÑòHvR]U‰“¢°REU´NÝê!¯0QX‰ð¢Ê“%THŠ?pwû©Õæ¦7þG³£ÈÓ%‰iñ]=•!õÓ†€HH))©¬I’R'Kí7¬‹ÙªJt¥‡3¨Äb™|«ѳ~y"UC„%؉o’âž|Ü•þ›é«dËR¼~Ò'Hõð’ê7W¾IꆀHH))©¬ŸT?U‚W¨*e‹«:ØU‘âÕ +-_é*ª£Gºòˆ“žøCös­!KÏéÒ`jTˆi¸§WgZ$©Iê§ ))RR UÔORH…ªR¤ZUEa…¼¬Ð–^cu4çlyOîãz݉¾Æv±&Oü‘R¯ùÁjB¼ráÔ¨K‚ÙQ 4ª©!)©¬)*Hê' YFR©phèD‚Tס½UEy W…ÕÕY͈.zOǪÐ Å“På¿ê'ŸÔ Ù¼ž^mX$‰Hñ)SœÔi§HHe HTAR›¹JÉR.ç²gÏžVRÁº˜H)_2v¥§`éê©+FÔF3À™WŧOù~ôƒõD¨()Þkî“ò¤lcÄ´’ŠÎ•o’Ú³g›”ƉXͱù—HHe HTARW²¼¤ÂÑsŠžDAJWåÕ[•(­¢Q¨Yʯ؊œ¢–Š2â]æ¯g ‘§KÒsâOüä”#å#õC@ ¤@ ¤”€HTÖHR–YòfRÊyœ‹ª/#µVm uÖÁjd¢´bj-¤RžÄùBªuuÌ€Ô†€HH))©¬i!•:a\3u‹ª ÓV'gmäÖ«¹S¾+ý@5Š Q8¦×µMˆ7Ž˜¸E? )}ä¬X$) uÌ))% RI5dIIuœ,ua]LÅS'U!¬¨ª×³…”UQav[ j\ÝÁz”ÕU¾–Z­§¿‹Ê)Ši¸'A*¥j ©pHUCA ¤²‘âcËw&)¼JT¹W©#†€TƒTx²ú‘¢*+*,UWYü¨GÅŠÒê›VNvL½=I½zð\y)©¬)*Hê°!;†”:K>EÊxºû©º$¶aN –Ò¿Þƒ”bðÓØì¨KÙÜ÷ð±§0)ž”cz*A*:e ¤@ ¤ ’:dHH™ImF崼˹tœ%Ÿ‹”EU§¢*e«,ÝSØ+Ÿî²§oùñÄXÓ*ª•Ôkbýè)Rú\y¼JH$l½ HH”’Þ¤°¨JUakŒÂ …)Ã+,eVê§Ânû !¦Kb±`êç)¥J!Õo‘$)*HªmC†Í€H”™”ºâáV@*?)£ªVXö+Úì9,á¬MO´ûž‡{R$µbâ ¤Æ HHe HTAR†EWw)>t¢ )ýŒç…¥ÛJ ‹6û—-m>J9bº8HQL­ªŒ¤¢såAФ@ ¤²¤@ª )˪‡ Õ“Të™mU¥ÃêÍKw¦$M'š˜ì’Z´”¤Œ‡j཰كR]R RYR RYÓNŠO™j’ÒUEÏã+cÉÕRm؈lX”;ï-)z´zÇx ù]GIÑÐ )Ëo')2“ÚŒÊɰœË¢¤@ª )¼J1RѹòžT¥J'•«mô³¥óÊâÌpó©‡6š!Ëm%åÏw””o%*)Ë¡œ<©­¸ýŠÊ^[#/³ RIYNÃÔIÕŽ"øÅíï))%3®§ú(/ S[¤N?ýt#©ºœ'(;&K{È+lX”;Wå=<½dø8ý·Q!e$åšÑ²‘š5_Š@ ¤L²)ý¨ø€HÔÎ!EpR„ÍF*@N™ Tß`úñÊâ¬í¶‡• º$ïÁã u²Ô²‘j¬É.»#L¤ê€H &%÷â˜)wB™©F¶ŸÐÐ?ü@ ¤²¼Jé˜|¦LªJïZêŒ3Î𤺌œUNÍðvÒ©©è§Í"lXZ[¨’®G¥_ìÇ,E*5fÖ“r ( e9s‹AªO':HHÅ¢¼@Í,úv)RS?@¶‹+ƒa¿ Rö)SÛ³å㧦h›±œ']Ø@g†Ûn}€yɃ—zäĆNè“¥R–G4yRR RYR RYc"9+NÐ8˜¢É%lX&k(šÔáV3k#µß)2“ÚgHH”’ÙîÝ»S¤Ô‘³ÑS3…Vd6Ä™ùæçòìí±<øNcfkR»w7מP9-ãÚ RÉ?˜Ôù†€H3—goåÁƒT”#5¿Æ"cF0$=—¥;Ìž¼†!Hu HeJǵHgHT®§ R ’J—qUVdlQ¹Ôäx–ÃÓõðG>ŒÔ¹†€HuM¥ŽHeHHe6z"7©é4¤ùÉõKø° â£'Î1 sÜIDAT¤@j O®_‡ RÙR™2ò“ë—ðaƒTö” µ ímgÄ¢*©³ )ZèŒKꆀH-t@ªtF 5ïF4~öåK‰‡RERRuë:˩րTݺv6)ïi0©¢ž2¶ÕEÎð©«²å½*ÚR ™ár,R/7¤¶N*HÍ/Ã$H•‹F*µBÒ¾$©Œžæ×`.ÙUå#µ™3•,år. µð™0)±šcó/Zü€Ô¤’‘ÔOókÝbYžÄ¢q *qéy÷"õ2C@jë´HT, Õ) RmÙ"EC'º“Šf|C™ût’ñØØU…§‘Ž®…”kFMRgR[' ¤ '㱩1RSMÆc3?R§²“HÙFO= ly›«eÅÆ’òØH»*~ÞÎo6 R)Ê©‚¤N3dIIه͞/7BÔ=•¦“±[–qìžÞ§(5‹*:t¤[Iè R RRÊOj¯!KMêe±‰ò^5F*<FL…Äd!pNžŒ@0‹¶,~é<øÃÃ{ÐÛ&Êï1¤@ ¤@J HHeMr…$1€‚Îw}†ö'ÒCOF.™@œC-§{†Üg.s]é'ó|uè„Jj·! R RJ@*Ê@j3*§e\{Â=¯½{÷rRÆrªy.tIYЦ0÷d1×\Ô?“t~¸§èР׌öîå» ®R U( µ©ÉdIjÈÒ‘Ú #EåTÛŠ}AZ eAÓ©•¾bê™;¸”-~>ÏK›à…Ô)^íLRâU ¤FÍ’«HÍ3ËNêC–””èG]鯨U±s~,F@¹Ü oÒ–%†eȣ˥Í"L9ŸQOg±q¬ý4)©¬)*HêdC–ŽÔÊÊ @ÑE•¥`Ê¢gbJJd|j)[ÑóyN¢ŠâÝçžÔž=ì¦ÙK )*Zš€Ô4RK“Íwx9VT©Þôæ‰ÐetÓ£¹¦¶ß›k ±ëA-jKœÌ¨'^EÕ…”«¤Ø;M³“ )Ê)ʲ‘Z¼É›ïørÊ«j-ªØYQõà’Ç™ ì {˜KñâgòÍŽs>b·×€ölVRì¦Ù¢‘©<-ª|¤f£“jÙ¯ê3º¸ù_peÎ{Sî†]™;Û÷\(Ñç6cÏ­@§³7òÁDÒ™3/·OGI™Û·8k¹2wŠ·­íÌbÏ­yöÄ9ƒ¦¹¤þ=žúƯ½œ÷׸›âwؼãÌÎÆ;˜Û7«Ü7`œ±ImßàÒ‘Ú¾ÚÁ¡#?Û¾¢x O·‚Yã; ÜiñÖz0s>€ÀMê)™Æ˜üíPŽTdÊ¿UÊq_ 5•l·öÿðkÜê’ýá'xÑçÆ~Wá¿IeäZªùÛz¹HÍ‚ÿæøW4HÍ-3ñ±ìI‰ýù'ï»H+¡Ež[ñžx]©yF¶íøçYïL¿¯2 àMó{÷Uô`Š;ˆGˆšCêßpÔƒÀúrÏræ=Ñ»)8­ºôŒíøs›~ná‰å`"‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ H3ÊÜVÌ{EîÑÍ€‚tŒ4#–=)é"$–Ò)éB¬‘K±‚‚tH¸ $H!ÈÌd‡„\ݤ¤S$’Ô"Ê … ¶ÄI5wÕÚRbŒò*µ ¤¤kâµwÔÜ@¤DK¢Ço&?‘ïV!M¸QYY½Y }RÒ-6‹ YR’5˜/… ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚L1ÿl/\ƒCÓÏIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/multipart4.png000066400000000000000000000657331477365367100226030ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœí݉ŸUÅ?ü¾ÿÁ/›Ñ¸¨à ("Æ—÷%jAD@vºÙwlvhö]PŠûšèŒ‰Ç8&3ÏdLžÌL|œyòd2ËS·êVÝoU}ëœ:}Ï]ºûóy%MÓÝô…îû¶Ï÷{¾UÕÔ„ H‡LA*H¶çQ=Ÿé5K¡éë_ÿ†Ì!Å|SçPšÂa2ßÒ9\æˆrŽÔ9ª”£eº‰Š/º—rŒN™cK9NæxžÅôêÕ«pB)'ÊœTÌÉ2§èœ*Ó»”>&…>}Ë9Mçt7ý¸Ø·&F¾‚|yó÷écEÿå §êèÜÉ$ò¢Žú²ôÒ)ôê©£¾‚Ç•r,Iù Ðß‘îòû£r´Žþ.¥¿­æ­¾ó¥§xZ”IýODªFª¡ì‚HuR)¿¯i MeO‡°ž=ô°‚ï‰r<éïKéûT&á©§ÖÔ«—xÊ4&íé$âÉ<mL¥gmÁ¢D0yÎðRðß”O£y°L° J–ëê[•¥ÿss‚$%’¦Ê&eTºw÷HyªR%Uñ?ó<©òƒƒHå@ê¿#R¹êVR}ëCª_}Hõª©o5 ©†ŠOÊõ$R&•æI“ò<R¶§cyO½ä“¥@0%yêmc ”NaDýíúgKؘW»y°ª©«ªNâTõ*'VU€T{Ê)ó<)©\HýWDªDJ5øÆ+HT'Uhjçz/€)QÌÙ$Þ;½$^rמ*çÞ¯7ýç\þqªôe2§êøUε_÷îRÁk?òR ÕYH5ˆ)©\Hý¿é*¿< ©4Oš”ç©§îQ<)R)žNçJ(»x :›É9$Üû⺂]À3ø{¿ªØy?oâÏSUàU¬rJ<'KªÄk åT’ªî§ HuyRJJz*HR©*–ÔD¤@ª  ,RòÛXè¦D‰— •5>©öR9zr{ç§öæWqÊ¿¡K0qˆÎás®ÀG¥ó`ù•ßOwæþlU~9u²µÃÛJ'ª NA¥U‘ŠªÐ]‘ÿW¤˜¾DHù©.CJ–îi¤ºw/‰*UÅ ¿XRÿ‘®Úž©NJªôSŠls UÚ€V~ÈшTƒ¤D*É“!e{jÏZް'E*ÅSíÉ”P\ÏÜ. Ia;$çY |KK>’__`U]UO[UÁÝâ…’*£ÒõT7SQ9¤´*âR å*t'¤”©R_F¤@ª3’ ]ø¹»uPRõgCŠoŸ;¤ôUƒCÊTÂRÞД {ò&%Ø ‚)àè<>ç[ |…Åñò`Š*:NaORpªt'¡åZéTU¡o¿§S­­[œ¼ž'{˜Ï”Pº€rŠ&ÏÐ%n.•¡¯p¼œÊŠk¬'©À«ò—zpªìa?NU¥å”w·×-§‘T½K*©\Hýß©û5YMR RÑ)­)¼3Ãï>)½…ËáaOv!e·Ï÷ìó<±[·HR}íÝúô ^Ö“WBéŠJò]êæ;\Èû9`,:œaUС¿v«J+§ì1 ]Mù唯ªã“2ÛÔTñäË&ó’ü¾üA RyúCDjµ±Z¨ ¡B“¥‹|HT¤~‘š-”¯ÎéOì=ŽK*¾²=u«Ü“$Åyb·n‘eëÉ-¡.ÐÅd;2d.KM"0–]SUt‚¨òWúÚÍtJJT\9uJ;Ê)£*}€¢[èüÞ®DÊüTò§`HHE~v©š‘ú<"5ÛÎ¥ äö$Hé„ )‡TЧĭ[Ìj» {òVHOf^‚x2“Z“#Éfô]>—Û‘oã„9°§{öé;¼t§f§’eT´'©É`2ut]J/SYU¦¢¢Ýt²Úƒ¬ô½Ûß%IU4)­*°Äƒ%e/ò°Iù7|íY?·R~@ ¤r!õÛˆ€HHeN¡‰™í³Gû()RHÑÍš)25áy ´ÏOeÚç§sísÝ<÷=ÉÂÅäzæ´x2uÓu×]/s“ëI,SV™¢J«òÊ©K’Ê©l¤üI?©ª=¤lUá1?®œ©l)Ê…Ôg)©hRÿ‘ÚlçRïø¤Â…”ç‰+¤â6k¶gei!¥§&Oš”ïIÖPŽ']@Ù’ŠÑ”¾'s#É÷Ê¡¼´+ªJT\9u _NÑ>:YÞkyTØGÏ”µ­KˆQÕx¤ê~f‡ HT§!Õ¨@ ¤r!õ›ˆÔâù^ç•MŠTõ ©`û¼7ñt٬ٕ¥³²Š”7%ëxºª¬IaR’ˆ£›tn–Ñ¿£º4¬ëˆ*»›Î•S¤Èª©³¹rŠRªb(¨ª¤ =?Ñ“#åõÑõüD÷BªÞ?ª@ ¤r!UL"§š¬ ,p[Õ8 R¹úuDªÝñ3f‰WH…Oép )ýÊ\HyžúËg•Ý>Wýs®ºD{º‚´Í¥&ŠÉ8’†¾Ï„ê"°®÷T‘N:-§}t©ê¯&•~~o…RN9•BJªj(RôY]Ç€HåBêW©Í3½ÁÚ R–»ríShJ-¤|R¤îµÏãÎf£‹¤HûœÌÊRO"zjÂñ¤›çÔ) (&ãèÅüЋ|3…¥UÝ UÙ­t‡”V eÊ){€¢¤2ôÑUÜäl}ô$UoQ Rùú4"U|¶7Æ~cê¯BIeºê3¤¨'BŠz:‰9R@Ïöæ' ×ñú»·ðž.ÓžÌâ }µG1)G?*åõíÊSenüÚ×~WòM?²­KôÝÞ*‘ò¶u ßíÕª:,)õ\nˆ€HuR ©\Hý}Dº)ÎS} )õ$²Ï°×ñ:+xu§Ïx2=>©ÉÁ$øÜZÌm2·’hXTU¸œJjúÑsì%5!e«2ÿA‹%×ô+«jR ¤¤@*RŸD¤zÏ{Ù•hHT' ÕH)4YýsÎSâÑñ…™í£…”ží;Û¬Ù&EVtˆç'Ý·EMõéÞ¹òdÚæ“–T¤4¨˜Ûeé(^º¬òTE²k©ÀÚÞ´1¿:²UT.)Ê…Ô/#R“Å5xŒ´¿HTç ¥ÎÍ­»©)»ŒòzyO—¸1¿3u¤¨ªl¤ìœ;)æ4ꚤ@*RG¤@ ¤¢Iý]D¼#uómx7){E‡¾5::^‘ò<RáBÊnŸ«þ¹=-{&Gʬè Ct¯ž˜O~5,!LÈž¹Â¤Ý!sg)êwÊ–VešéJU€”.§Bë;ø –Ty3¿*‘r(ÚMŠSU1©Ò½¤<ŸË ¤@ªn¤ÈË|žËEŸu¿Ó R •©"ReR ’2©\ )ÏS⡼ž'öl698!×ðZ‹xEYC<ɪTCÉúI¨‚†ÊÜUŽø‚ET9¤Ä§ª)2@Q[RZUcÒOÀΩz’ê|¢@ ¤ò!UÊ/¸$¬¸Í“TÃŒÍZ¤¸BÊ NØ…T–ãÙ´'¯bÏfóHéBê"»º²<5A=Ý"k(Ù3d”¤aÆ /g˜Œx³Q%I©)ŠZ‘’ªwt LOpí!å©òI%õÑR¬%—óôËõ¹Ü)Ê…Ô‡ñžóù")êê¤r6Ð0¤˜º]Huç )–ß>§‡òz;÷ys졼Kƒª"íóâÔ„\uóÍ7SO²†j„ »ï¾{Ĉ÷ÈŒ(F¼AÁR•*§8RâsRöälx½T6Rá%Sýu¢H9kåíІ$•7©ÎDꃈXÏùüw k˜öDJ»Ï»ê#‹:ÂW}^¯ž J®úí¾o37yÕ]^Óë3ö‰'ºô$(Oƒõß°aÂŽ`4räÈQ:âuéJ¼Ç\ûÙ¤œ1¿(Ri3~u'eßím)OU¥¤:m@ ¤@*×€HåBêýˆtARÄ“M*®"wy…õduX‹y))¯º„ôúÌî-²Ù§†úŒ'UC!=úÞ{ï##^¿-¢*ªá‘J¼Õ›/©¤[½Ž_xa/%•¾¾#‘”RÕ1I`Q/HT>¤~‘ªÙ¦—LÕ5²ER •”Õ]kRM ±`*ôS*±Jê Rv!Åž%Õ¯tt¼×A?›¹É{±Ü¶R²}~ƒ¼Å«†ún¿ývåIÕP£G FcÇŽ'3VF¨5ª¤2oçÒHY¨ŽiìŸR RˆÔÏ"R RT½EE‘Ò_[Û%E:è'¦(¤ˆ'ÿèxµ¨ƒRâÉ}CyjÂñ$j(agìØñãÇO˜0a¢Œx]ÀÈŠÕÔHŽTÄ⎺‘âÖw´›T–õˆTS#ÌN€HåD꽈Ôÿé^‹€HåBêo#ÒuHéщDR^!u|z=\HRÌÜ„"åÍM\ªÏfS…”YÇ+§& $` :Ôx‚&Nœ4iÒd¥J”S餢6pVž ©Ëd8בTÄä,WKÊ)÷ÖHù)ê ¤ $Õ{”¸¿ HT¤þ&"58f A:~)»ƒžFÊ.¤Rf)/ßA?ƒ/¤Îeæ&Ô:)SH)Rj‘Ô­· “@"´ˆrI؈ZZ¦È´´´477 ^¢®’}tñAÎØ¬(ĸÅR’”:«WyòHÑÅRí#•vxG¾µTR½sª»))Ê5 R¹z7"]…TL! åRÜè„!ÅuÐù¹ CJuÐ/–'´©=\¼¹ µHjР;î¸C¹çž{T%< JÓ¦M—™6mšP%Þæ‘ Ív.R^!UkRÜŽ.)º£Ë):6©ô ‡×G“*&‘Sõ SKHå@êˆt•é ©NBª1G*®ƒ~by¼×AïÃRý­½ûФô¶HN]’ƒtnâûr\V.’6FŒ1zôháIÔMÑÌ™3g#~ª0CJ6Ñ))ÙAdÏÌêBêF®ƒÛDšž¨”T_w+¿ÊI…(@*= R¹úiDº)²KìU_Oþªï$îªO“ò®úúóW}çÙÓ}ê>¯$e¯éø¾¼ê—}Ç5jÔ¸qãáIPš;wî¼yâÅìÙ³g̘1uêTñáMÎø‰ DEŠÜ祤H»¯Ã“Ê0æR¹¤@ ¤r HT.¤~‘®CêhtR΢ŽôBÊk÷Ù…Ô™v!EàÚ}WèvŸšîO~µË]w‰BJ`™4i’ð$-X°`áÂ… ÌŸ?Μ9‚”¨¥Ä;©Q£œ?u°(Ÿ·¶¤”*B*úˆ)r·×#åŒùµƒ”QE<9¤ÞŽHHTæ€HT®)4¥zêÁwÐ{ò…”9=Þî ÷%tRHI )ÒA?_O÷™eê¬=ݧ:躕ÔèÑ£'L˜ *&áI`jmm]¼xñ¢E‚–(§©–––‰'ŠZëÞâ^EʾÏ{[RdIoÕHùc~±¤¼Å)®‰q·×*¤Ž). R¹z+" R Õ±H5ȪÞRAOBêd¾êËRl]NxË:ÔºUHé5¥E#FŒ;¶¹¹yÖ¬Y‘À´LfÉ¡KÔRÓ§Oï¤äèÄhÒA'£>)é)´—Ë•Wú¤ô©¢q¤ì“;ì…½i¤ÒÖwxÕ%%QQO©@=\K5©ºcR)Ê…Ô›©Íz©z¤@*RoD¤K‘Ò_¤Ì¤*,¤xt½‹*¤L]‘ÒtCJTBǨQ¢pæÏŸ¿dÉ’+V¬ZµJ¼\ºT‘š6mšé  R²òIÙ;øRÞ™q¤ÌúŽJHµsçDR^=½îLO€TR@ ¤: ©1R • ©×#RõöD#uü(óå£S6)²NŠz"ƒöÀ¬™˜¥…”&å ̪m\èJ)r\‡é ‹ç¿  XˆÂhÌQ+ ;¢ŠZ¹rå™¶¶6IJÔWS§N¤T}Tqv°I‘ú÷t!UŸZª¿NûHUtr–k¢‡ûè^!Õ¸¤$ R •k@ ¤r!õZDº6)g\–)¤zñ…”CJwÐOã;è>© J³t¥”!¥G'ÄÓ^uÐ…Œ{î¹güxQH >¢~Z·n݆ Ö¯_¿zõê%K,X0sæL3:!ê9b„ÚÁÏŒNؤìщï1§ôRRt;—ÊIuÖY6)ZNe •XNU‡T1‰œjQå4t-R ÕÑ~JÕ“ HT.¤^H×¹/¥¿BYHñs””)¤)Õ îooÞ§I™BÊ#EÎiSKäÍè„!ª£I“fÏž½dÉ’µk×nÚ´iË–-7nåÔ’%óæÍS£êÌñ¡rs$o¿Û䡵%› Ò¨I¥•SõR„”Q•­‰R: R¹z%" Õ£|”hl»#•Ôî;‹k÷IRæ>/%åÝç>|ø½÷ÞÛÒ"®ðV­Z%¯ÙÈe”‰”·²#DŠÛm¶¾¤"š~áU½6ªJªALHuR 4=R U1©—#ÒU.ü,OR\»/L*â>ï€ò6.Ü}Þü}Þk4)sŸw„\×1mÚ¢E‹Ö­[wÿý÷?øàƒ<ð€ ÕÖÖvß}ê>ofRú,ùÎIJ£Š#%QT†€HT®)Ê…ÔKé’¤Ì×.ý>o)ÒA?Ý»Ï ¥7nVt‡”>LT<ùÁBÞç?kÖòåË7oÞ,<íÞ½{×®][·n¥ÕÂ…3gΤ;ø.íÝœÖD÷Hù3~„Ôwe)³²#¯í\Ìú©*Ž”w·—¬ï ¤ˆª4RÞ­ÞnÝʤ^ŒHWéøHuR Óñ)ê¤$,©¨¿ˆ•}­sÚØÑ ¾ƒ>PvÐ?IÊìà'(ˆZJ™8qâܹ¢r…Ô#<²gÏñrÛ¶m+V¬X°@mÝ,>"‘”ܽùV{UoõI…wp¤H9R©\H½)êH¤«– tÐIÙ+;lR´ƒž™”\ÐëÌÌRêyAAÍÌNž=Aøà³Ï>ûüóÏÿéŸþîïþîµ×^sTÍž=uêÔI“&7Np4åT©“>È Ïê>º!%BÖÊ_Å/™bIIT†)§"H)UQ¤Â}toÉTZ=3©$N†UŸèµ HT.¤öF¤ëâÚ}aRú;r¢·¤7”·¤÷~Iï%zIo€”ÚÑE-*LŒ3eÊ”ÖÖÖmÛ¶=ýôÓï¼óίýë?þñ_|!^|úé§BÕã?.Þ©T-X ªóFÇŽ;jÔ(uíwçäÄÚô»‘¿ök©ˆ1¿Àµ_€”V•Hêd)¢Ê'eoçRé)©\R • ©Ç#ÒµI™û¼úö_b!uJy/—RÊSRW_}µGJ<íÅóÿŽ;î•ШQ‚‡p²jժݻw¿ôÒK¿øÅ/þð‡?üùÏùË_þô§?ýêW¿zýõ×}ôÑ­[·ÊåóçÏŸ9sfKKË„ Tßoøðár‘‡>qàVÒôK$EÇü}òäɤ•Nvv¡å”ÚÖ%‚”T•FÊÛÆ9în¯G*ânoRZ•!u|ygŸ”VEI=)êH¤ª~ÂTä_¤@ª³2/ëjªÐ¤¿HIô0)³|€RßÜRr'—DRâé&%žùƒ†5j”¨‹f̘±H2úÔSOýô§?ýíoÿã?þãÿ÷ÿë¿þëüãÏþó§Ÿ~úذaÅŠ­­­sæÌQc£ö# |‘rê&RNÙ¤¸1¿ïðë;2“ò—xDõÑ9Ré ®œj?©G#R³%ˆ R •ËsYÿR R¹<—õË@Š™M¨”Ù½9@J<áÕ…Pp×]÷ÜsϘ1cDi4kÖ¬%K–lß¾ýÀï¼óÿøBÕ_ÿúWñò·¿ý­(±öìÙ³}ûÚµk—-[¶páBÚJ—›»è¾ÅrJÏŠÇãúèt}é£Rö…CJ«rHiUµ"EUe›åH=‘®²ª¤@ª“j”U½ R9Ú‘x¾× %R±3³'”ÏìH$¥úº§—í¨)ÝG¿ûî»E95nÜ8!D¨Zºt©<Ëã'?ùÉo~ó›û·ûòË/ÿûßðÁÏ=÷Ü®]›7onkk[¼xñ¼yóDý¥ZérsSN‘å½7ó}ô©ÄÉYo€â¼@9%U¥MÎÚ}tŸ”>ºÍ¨²ÖõVFª„ªRRô- pK)—€HÕ”-(M@¤@*RG¤à>÷šò%Õ('Ê3¤ÌèD`±”&E;è†)¤ÚIêÒâ2y³{³·^Jmå§ÖÊ+RwÞ9lØ0QN‰ŠHÔES¦L™3g޳yó¾}ûÞxãO>ùäŸÿùŸ?ÿüó¿ÿû¿¿Ý»wÇŽëׯ§­ô‰'Žs)§ÈŠùï“>:GŠ›œå¶qæÊ©DRJÙÔ¥ œª&©2ªy“jrIUø3¦a¶Æ)j R… /Üfg©HíŠH2©Ð[2<—+ý ¹$™“2žõÔS»víÚ¶m›*§Ô°ßôéf¯]NýH—Svœ,OË©ïUö¤WN¯cÊ) +±N÷uÉFJ«òïörµTêÝÞ2©))Ê)Ê5²žK!Å-éM"EWvÔ„TqÊïΡr‰‡ê£«Š––3f¨rjýúõ<òÈÁƒEEõòËB—øÝŽ;6mÚ$Ê©åË—ßwß}³gO™2Ea^9E%¤®õúèRÕwùrêâôrÊ#å”S¥³åÝr*–)§N´Ã‘Šè£[­€ÂŽˆtR?¥@ ¤·¦@ÊHHåšö’ .éÍTxU¯žžðö*R¢R}ô1cÆÈ>º¡˜#¼ˆŠiûöíû÷ïþùçT¤ÄÅý–-[6QkÉrJíèlÊ©;K‡¸Ý¢ûè´œòHérê»áÙò"wy¯TåÍPp}t–”TEI‘ŠSur$ETQR÷G¤@ ¤@*s@ ¤r!µ="]…”å)3)gfÖ#¥Kµ“=«W<‡%)º£‹:¿cðà;ôä¬ ¥úèãÆ›4ITG3gΜ?þÒ¥K…]»v=ñÄÏ<#^R<ð€ê£¯^½zÙ²eÅjªXNy3·’>:Ù×å:®œÒ}t£Š Ï^l·Ò/¼ÐŸ¥ªœ ÝG?Ó+§ì>ºG*<9[)­ ¤¸€HT®)Ê…Ô¶ˆtIRÔS{HéщÜI‰ç­$uƒ½£‹^2¥H 6ŒöÑ'LP릕ÖÖVQN‰ïª ´oßÞ½{wïÞ-H‰ÿrnÞ¼yíÚµ²œ’#¥ ñI†ÉCÜÊ æáY‡”VåÒª )¯•~3C *§rY2Å‘òÆfA*= R •k@ ¤r!µ5" Å“2 åízx¿þ¥ÕRÊ“Gê<©J‘"K¦¾C–L)R²~?@1dÈ¿œ’ë¦Zô …(§Ö­[·cÇŽÝ»…+QVíܹSR}ô¶¶6¹nJèkÑ §„N9<{»]Né>úõž*fK?£ê®œèlçÌ–S}ôJH “DŠ `6KäÔ‹k©\Hm‰H•I™¯{å¤Ô3Ä#%žU)çnoñÒ¯tí'žÜäÚO.í"šº‹¨’m¿IS§NT˜+Vlܸqǵl[èW‚â;-Þ¶fÍš+ÈÎ.Å­]ôµß`îÚÏ#¥UÙçËÓUŽ*~W?ÿÚ,ñpH™¦_)¥*3){qHeHHå©\HmŽHW%u)£ÊÌÌ’¯zRq‹;¤.¹„%%Wx8å”l¥«¾¢Þ‘k|ëÝ]ìÍ]Ìî.¢hªÄ÷Ø´wÅëk×®ZµJ®î--ïFx$[úé#æÕ …wx¯RÅßwмG*ÐGÏ—QU©õ))Ê©\H­‹H—"u,š%¤zY•”½¤×!¥¾ÙHIUþô„MJMÎêáÙkørJà&žóúðÞ;d+ÝÛÑY­Z´h‘¨›„*ñ_NÕÞ¤Ö­[½zõ 9<;ÏÚÓléWÚÓOÎPx‡÷^+Uy;:_ÎLÐú§yØ3>º!¥T%’Òª()­ê$~+?g½Ôñå%S=ìpÓ ¥R R¹¤@*Rk#R)¤ìí\ªIŠ”S”)§Ä“ü‡¤•.žÿ²•nöwÑû©ýÔ…(Ä·Y¨RÞuëÖÈ>úÒ¥Kõá½jżÚÒoˆ½b¾ÔI÷[éd锯Šìï’¨ê<¯&ETy¤Ìج]N±µY/å­•© )©\R • ©5©HR¦ƒž )½dêR=@aHÉáÙ«I9¥NIUf¿$½±ßíR•¿©³ÜÙoΜ9­­­Ë—/okk3ªÖ¯¯Š7˜áY½bžléW^1O¶s¶UùGø†ô°7öãÊ){€"Rd•|,©ˆõR«#R RѤŠIäÔÕöñ “²ïór¿DRf}G)ríw íw•wí'û~7ëk¿Y =ì5¾f‘ïŒ3ĵßâÅ‹W¬X!¾ÛëÖ­“7÷)Õôïï%'ýôêÞòò^yÃ×9pÊ,ôàUùgÍ{›»Ø“~ÜÝ޳컽Þúº°7©^½z¥¢ª4©nÝðSÊHT.¤Ú"R R •9ERækFH…üò"EÆü²‘âÊ)³À×îûÙk|ï8ä=ß©S§ªóF—.]jú~’Ôš5kVÉ}]ÔfÎry¯(¸rŠ,ðµÊ©À‘£W\áïíçmî¢Ë©ÀÝÞ³tc~H9ûøõ*¤* HHå©\H­ŠH—'e¾È9‘:“ÛÑEïéâßíÕª)­êJ¢Š”Sf¯i¥KUú–ïлô¼Ÿl¥7ËrjÞ¼yªœj“­ôuë©6ÝGד~B¡\Ý;Ü.§È_ÚJ÷öw ííçmîâ‘rÊ©òFÎ.)½™_5HT”T÷îN}eD@ ¤@ªó’*¸ÉíƒHTc“’ßÓ8RRÕ¹|ýb¾œºÒ+§¤*³À÷ûÖB2îWš÷9r¤\ãk6wQå” ¤I­^½Zíë¢6s.¯î-/ï•唞õsTÙK=Œ*gï4»~>×G“âj)½²Ã¨:%é䎔~68¤ô‚^‡ÔŠˆ4©”ßWð‰A ¤@ ¤@ ¤*LI‘.)73«I™Ñ‰©Þz;—êÒªÈÎ.¥­]¤*=>ëŒQÜFsSª„ŒÑ£Ç‘rjÑ¢E¢tŽô¢ÕGWûºÌ™3GÎÎÊÕ½#írÊ,ðµUù{ûöu¶Ë)»Î’²—·IÑU½•“"…Tˆ”76»<" Eªj)©\R • ©ei0R¹÷úJŸ–#eF'ªCÊ  ¤H]õ–)RN]Á—Sfé”i¥Ë1Š[‰*2F1f̘‰Þ Åš5†ž9S¯î-J1ñôÖ.·zªn¼1°·ßÕÞ_ršGÜEޤÈÉ†Ô Öä,ñtœ·_ç!eRÉßË R ÕåIU`ªà£)Ê…ÔÒˆ4,©v›âþ\»H”td›MÊ,”—¨I9|9u9¯Š,º‰¨ú‘w˜›,§u„¯:ÆM”Srá”ò¤B†gÍn#õž~rk—Ažª›nR•Z=¥Té1 z G*0@Á‘2ë¥tzÂ#u ßAwHSH™?VpÞR Rý1©*Z‘†%Uéu_Á~£EÊtУHªÓNRöج½O’CJ—S†”ÜÎùjõŒ½öZEê{ŒÂ^=¥TÉ=“äŘI“&é£ æ}[ )RHy·z)©ÀâC*åVo˜”]N}—¨R¤¤ªkyUf©‡Ù×Y–SÃe95vìXUNÍ;·µµuÙ²¶¶6CŠlæ,Þ­N›§÷ô6lX£ÊÛ×ùºÒ/ÎÆ~Z•sÒ¨^ßá“’ªâHé%½™Iyëy (ï>¯ê÷u R•]2׳ R¹jHã‘*zÈûoR ÕUI•~¾äOÊÚ½9š¹Ïë žÜáÒ唺›éùñåÙÙ…–Sj­§ÊÙ×Y<ùåqój‘‡(&L˜ ʤY³f-X°`ÉQ<‘E¦œZHÊ©1ò ARÎú Ÿž*ºÔƒ;Ð#‘”.§. }ôJHÑ?Tø>o{HÝ‘#ÕR R9§ˆ ¤@ ¤rLþwËbHxbfRJUxz"0@aH]xá@®œ*¯î-ÏPHUzŠÂQE—ùš1 9B!*"Q©3Üôò^u†›*§ÖÉÝ]d9Õj—S£åQ£ETwéq¿ò¼ÙâÅ^èaøÚ{úúè)ÝGo)3àg¯êuj)”QKjaD‘T%-ôÀç)êÚ¤òFR ÕåIå›dR'Ø•”KŠ.î"ªÎ$‡w¤MÎ^H7r¦Ã³—ñªè_¢Ê[æ{‹,§Ô"{Üå½fK?Ej]éŒy9B±PnéWÜÓOü9?+;éC*5B+—zøû:Û§yå½ö!—äEŠ[ÙAH™og)Û“Mª[1eR "ÒP¤j°5&HHåò‰A ¤r 5?" •DÊVÕ~RúÜ6:@!U饽þ %eZéWù›:ß`MЖ÷u.VS¥rÊž5‡÷R²œZî•S÷Þ{ïÈ‘zŠ¢8F¡öö“ª~Ä—S×ò}t²Ÿß¥„” ˆ#¥OTÏž~=@ªTHupRÕ?¹¤@ª+‘ªZ@ ¤r!5/"]…?6KF'jBÊ+§’Šp9¥+*CÊVåïë,Ë)9Bq§7<+à¨>º"µ~ýzYN­\¹Ríì¢Ê)Q|‰?3z´(Ũ*5Fáíï¢NÑ]ýÈž~~=ÔYÁ#ÛÚIª©¤+>züx}Ëw„R¥ú~¥CGÝÓ¬]®I$%›~aR¦éAJ¯ìâÚ}¤º—â*&‘SgÜtŒ HT.¤fG¤@ ¤@*sr e6ñóHÙë;ÒHÙM?½­‹µ¼÷kW?Ò÷#·|ÙÓè°Ÿ¼ß+ê¹¥ß]jy¯œôS{9/“ûº¬]»VhÚXŒøU­óP§ÌÏœ9S¨š4Ißò9BÎû  ²ïGO0å9sʾáAŠlåGI)UöŒ_©¤Bª'9c ‘T·n HT.¤fE¤ñHUãoR Õ…Iå¾J¾)ñVoÀQEI‘»½)²›ŸQE6u9;©î¯ò¸Ä:Ê#E]ãknøÊ]ý‘I?µ¼Wž6%·u)îë²fÍEjS1ª¢Zµj•j¥Ï˜1£¥EßòuZéô@RNÝÀ÷ÑÍ^ÎÎÂ^¯œJ¬¥'HT×%ER RDU{Hy}tŸ”Tu6ßG¿À+§ˆ*¯¢r6u&û:så”9hÞ^ÞÛÒÒ2‹ ÏŠêI8Ú¼yË–-[eDQ%Té1 pi¥‹rÊ>ЃÎÏÞdmçLúè‘RG¢pÓš·²#±–j?©éihR¹¤@ ¤r HT.¤¦E¤\RT•M*¼°×&ÕŸ[Û›TN]àÎÏRRDUb9eTé ²¥]Þ;yòdñŸÒyóæ©}]T}ófiûöí÷ß¿x)Š*ñæ%K–ÌŸ?sæLµtJµÒõü,ÝØOæ!Ë©›t9e÷ѯ°(lRΩmHéé nfÖ'ÕÞщnG R~@ ¤@*×€HåBjjDº )²ŸèÜÎåDkr6š”TGŠÏr­tN•]NUþi²œÒ æ­áY½`~öìÙfxvýúõ’”ðôÀ<øàƒ;wîªÄ{-š3gŽ)§ÆŒ£ægÝeó·éùY²³ í£«ýüèä¬MÊ›&\,EI%R„_Hå@ª3")ª©N¹t¤@*RS"â*ŽÖÕøé^‹d'¥TiRþZù¾¥øv]«ú6飓rê|»œÒªì ZgSg¯•® *EŠ,šÿ>_N‰¢¨¹¹yÆŒóåfÎ+W®\·nݦMÛ¶mÛ±cÇC=ôˆŒPµqãÆåËÕÒ)µ±Y;åmì§ægo¶Ë)ÝG7§·ÙK¦IÑÅRáõR±¤zÚ ÚMª%"¸ð)©Ì±:~í¸ðËLÊ»áë“"ª()©Ê?z@ªºŒ¿öãŽø^y‘‡sí§Ž˜W§M©I¿5kÖHR‚Ñ®]»öìÙ³oß¾G}T\®Y³hÑ¢Ùò†¯öÓ =î¾ûnîÚÏì=k7ý®$w{kJÊo÷iO±¤Ž.¤ü€HåBª”f.á#œ@ ¤@*@еäÒbž~/ÖιҨ"HIUd[—³=R–SêwªJ–SfK?:é'·ô“«{ËË{W­Zµ~ý–-[D-õðà OxòÉ'EEµiÓ²eËæË¾zc¿ñ²ï7Â.§ô _µÈÃLúé#®äÇüjBÊYÏ$,¤@Š HT.¤&G¤@ ¤@*sâ¶sñ—xp¤´*CÊVußGwHiUçqªô6ö3›:såTà¼QsއYÞ+žÿru¯ÞÒ¯TN­X±bíÚÍ›7‹âIzâ‰'ž{ U;w®^½Úœ7jÊ)½£³×G7¤èÝ^}ÔT€”ø7Ç’R_f{eG`I/KŠtÐ3:ê¨2©I)©*“êŒ)©\S©ÀÂÞ4RÞ¤ŸQEûèöI£ºœÈ—Sô4û¼Q_•ÞÎùîò^²¥_©œZºti[Û† ¶oß¾k×®ýû÷¿ð ¯¾úê‹/¾¸gÏ&RN™óFGR»ú RwÞyg˜” ¸Òó³Iq‹;(©3J~Õ E:èž'UIQR#R R •9 R •kâöñóIyë;2“²("Ê©òÝÜåâ¤rêJ¾œ"[úÑáÙa|9µnݺ­[·>øàƒ{÷î˜Þzë­7ß|óÇ?ohkk£Ç¸ÉáÙ‘#Gš ñYE&I‰Gª2)oIoo»ƒNH©og)¾òIMˆH!U HTvRÖÔ^a|Dº)ü”©<~J”KŠŽNx¤¼>:%P&åžÞV"ÅÞ›XNù¤¤ª)ûÒðì!Â-§Ô©%KQ7íØ±cÏž=¢–zçwÞ{ï½7Þ•ÕæÍ›Eµ¥òh‘û9›íœÍälHÙKzãH™ÿI§“FêèR@Š HHå©\H‹HW!EÊWBªÝ}t³­ËÙ:òÂ)wW¿‹lRþð,§Ê>¼—”Sw’rJ-œ’[»¬åÔ¶mÛvïÞýì³Ï¾ûî»}ôÑûï¿üòË=öØúõëY]Öxî IDAT[»˜3ÜìÉYEJ­•O$%wtÉBŠ›™µIqô0){t¢GB!uHq)©\R • ©±©ª“ ”SR•¡pf(.äË©K3õÑo°û袜’óæ¹³ÙÏyñâŪœzðÁŸ|òÉ·ß~û“O>ùõ¯?üðÃW^yE¨Ú°aƒø¡ª¥x€¯ÚÒOõÑmRj­<%U:·ÍÚÃ9)]HRöèD)ÚA-¤¤ÆD¤@ ¤@*sØ}üzéTiR§èäEÊîûy{Ïž$¸ö “ò›~ƒ Ö×~rïÙÑãK'N-\¸pÙ²eâÚoûöíBpôñÇÿ®ñë믿¾GÎû-Y²dÖ¬Y--âO©CTÓOùE“ÊÐñ3¤ø?JŠ´ûB~ •S@ ¤r!uoD@ ¤@*šT1‰œØ}ü:cb6p’J[Øk«êÇ« “ Üðå&ýI9ª®/1o7ýn×å”:pJž2?Iž2¿hÑ¢•+WnܸQ”SÏ<óÌÏþóßýîOúÓ¿üË¿üêW¿zë­·öïß¿eËQQÍšÕÜÜ,yŒRM?ñ =Rdç¼H™vŸ!¼Ï›HÊk÷R¶'êÈ#ñSÊHT.¤FG¤@ ¤@*s’IyªbIqåT")O•·óy餼>ºÒ¨,§È!¥}]d95È+§ä°Ÿžõ[²fÍš­[·ŠrJP¿ùÍ—_~ù—¿üE¼üì³Ï~ò“Ÿ<ñÄR•øhQ\åÜsÏ=ª.ÇüÄDò¶sÉL*}À/#)¾òIŠHHTæ€HT®© )¢*LÊž¡`Iq'z{9ÛK<¤œ>º,§n³Ë)½ÂwÊ”)³d+}ùòåëÖ­Û±cÇSO=õ³Ÿýáøë_ÿú?ÿó?ÿþïÿ.T©ŠjÓ¦ÖÖÖéÓ§O˜0A•Sª~ÛmêdùDRÞÉÙH™B*LêÄòì„C*XHE“)©Ì)©\“°_Z]¢òIÙG·E‘rT‘EÞðl`‰‡}ˆ‡é£§‘¢}t½¥Ÿ ÎpS+|ÇŽ•ôijsÕJßµk× /üò—¿üâ‹/©ÿþïÿ¯|úé§¢ÄzüqNT^---cÇŽ(U]ßAï¨)of¶"R–§#)©{"R RѤFD¤@ ¤@*s’Ij)­êd~GJ*½>@‡#å φÖöòægr¶¸´÷ÓG×ó·rʬð•ã³ÍÍÍréTiíÔ–-[{ìµ×^ûõ¯ýå—_þçþçŸÿüçÏ?ÿüƒ>8xPp[±b…(¾&Nœ(DŠO"€ÔNRÊS.¤Ì·N{©ê¤@*RwG¤@ ¤@*sü…ò)[U")­J·Ñ³ P83±}ôð…MJ•SŠ9½Í’å”xÚ;唜Ÿ3fÌ„ Du4sæL5F±zõêmÛöîÝûæ›o Uÿú¯ÿ*`©ÚŸþôÀ[·ne×”)SD9%.w„NIÊlåKÊ.¤Î–_‡T¿Ò2y–”î SR\!•NŠz©”€HT®)Ê…ÔðˆtmR¶ª@ݲË)‡”Vuº­ªF¤¸>:9¶·ÜG—³³~95b„ì¤[éjŒBä¶fÍöíÛ÷ïß/T}òÉ'¿ûÝï~ÿûßöÙgï¿ÿÒK/=òÈ#¢à…Ä‘#G:tðà[å’)Ž”ø Š¿©ÙI’â:èѤÌ*ùØÑ ›õÄ‘:ª‡Ô°ˆ€HHeHHåš8RTU"©¤r*LÊWe­–?§Ê¤ôª©ò唟7nÜäÉ“§M›6{öl©jVõÆo|ôÑG¿‘ù裷Þzë©§žÚ²eËÂ… ›››G-žKÅù‰Û|Rr‡$Ÿ?:"Þ©¦¤îŠHHTæÔ›”µŸ½ösHÙw{cöH‘ÃåéÝ^µ—³"E®ýî–³~ªï§îù U Š«¿Õ«W+U¯¿þúûï¿ÿñÇÿâï¼óÎóÏ?¿k×®åË— €â’QüùâÍÞAjao©‹Šý¾©³¼SEÛMª§Ž!ŵû¤Ž<Ò!UL"§®¹HT{I HHTæ$"ª¢;~’PÞÓó+ïébùµ›]Û«·u1M?UNɾ#tßoâĉ---BÕœ9 ‰ª'žxB¨zï½÷ÞÿÝwß}ùå—üñµk× zãǵXñf/KŠ;U4R§ê ?Ž)¤È€ßqÄSxÀï(«’¢¤îŒHHTæ€HT®©ˆ”¿°7)­*Rú€Ñ8RÖáò´þ¯.Ë)µÀwäÈ‘ª•>iÒ$¡jÆŒ9R•ÚÞoçÎÏ<óÌ›o¾ù7#j©W_}UÛ´iÓüùó…Ay·W5[ùHéû¼i¤Î´O%¤è€Ÿ$å,é=¡ÜBÏ…ÔG”IÝ)©Ì)©\SmRž*JŠ¨Ê—” ÈBJïççLú«©r95fÌQMž©!)©hRƒ#R R •9,)O•OŠôÑ9RM]¤èE,)2@MJª Òûù•HérJ-òå”ÜÜeôرcåÅÔ©SgΜ9wîÜûî»oùòåÛ¶m{úé§_yå7Þxå•W8°cÇŽÅ‹‹²KNΆIyKz ©´™ÙDRÁ%½Ñ¤¼BÊ)6 R¹º=" R R™“”REj)nG—Æ$¥Ë©0)§.Ë)AŠ–Sª•>qb3QµhÑ¢uëÖ=þøãŠB꥗^µÔÎ;E•5eÊñ$)ñ)ãHKq£Š”üÚVDª]ô#@Š HT.¤E¤ƒ“" ¾¸×Ì[@ ¤@*"ÒŽT|Y¢TðQUDêdJÊ>º-‘T`ÉT­IiU)=<+gg‡ÒrJ¶ÒÕ…^=µpõêÕ?üðüâ‹/º¸T~%%þW7sáK L"¥¾TaRÞb©Ì¤lO>©r!e‘º-"›”yYhr_u>¤@ ¤ÒÑ*Ðw•?¤@ ¤bSKRDU€T`l6GRÞáÙHÝì PÈ>ºZ0¯¶s&åÔ„ &Ož¬Ê©yóæ-_¾\ zòÉçž{îÙgŸÝ·oßý÷ß/j)ñ~ñÑLJIy‹¥ÒHy3³§'­’7¤Ìw/S½{ ƒ~Ä©[#ÒñIÌ JÊ6R R| å˜7™ ¤tIe[ØKI‘¿ÓuÒvtÉFJª ¢g‹’1?CÊnúé]gKk{uÓOú•¯ýFŽ)oøŽ—×~Sä°Ÿ"µ}ûö}ûžyæ™ìÙ³gëÖ­‹/V¿áÃÍ­^ñHâQ=Rä>ï@û€Ž”}Ÿ7R|»/@Ê®“È©3l:V /+¼ð)b~J~x™Ô-éè¤ î/ R UAœË¼r§"‘”¿¾ƒSÕ>RÙ¶ò;[§j¤¼»½Rƒ½¦Ÿ\åAøÎ˜;w®óÛ³çÉ'ŸÜ¿ÿîÝ»7nÜØÚÚ*Þoßê5¤®*ÞèuHéE¹­›¿Í0`H™û¼½ùMüRÚ}ÇrË:ºu mäâ‘úQD:6)» "eUò­^)âB«GRF2%"HHåšüðÃÛ·ookkÒD¹5räH½‹ÚÀY<ª\Ùq•½²#Tú€ŸCJwÐ9RÞèı^R¤~)Š&õýˆ€HHeNhz¢¡H)U•²›è­üÚIjæÌ™ .\¹r¥¨¥|p×®]¢Ú´iÓ²eËÄ{ÔÉC‡Ò“;lRÞÌl")nfö4~tÂrVvp£±¤ôÊŽ#‹ž). R¹º9" R R™S Rì’) ÈFÊ9®7ÜDÏ•ÔСCí%SjzBš5kVkk«(6oÞ¼sçŽ;DMµfÍñ6rV¯øLŠ”x0½—ËU—_î“’K¥¸Ñ‰³¸™ÙÓJ•TZ!ubù°¶Œ¤¸B ¤’R • ©›"R R •9 Mt£ªW9 eŽð¤&Ož,ÔÌ™3gÑ¢E«W¯¤¶³aÆ+VÌŸ?_ÍÌ/.“ŸI|Vñ†Ô•ÅÕRÜ̬OJŸÑK;èáB*¥ƒGª›UIEº1" R R™R R¹¦L*i€‚%¥wqOÎv`RdlÖ,”WMtµ^J.”onnž>}ú¼yó–,Y"H J›7oܸQ¼ºxñbQb‰ZK|è°â.~·Ú»7ËUòWò3³ð…Ô€`!•ØAwH%yR¤¼B*8:a‘ú^D@ ¤@ ¤2'™”VU)¥ê´R¼»½¹“JŸñK$¥Ö!¨}ülR†¸êSÛ¹Ø~K—.mkk[WÌš5k–/_¾`ÁqI(® å}Þ¡·ß®üìMü )»Ýw>³¬ƒ’¢W}d¼Ï»ê;9§vwŸ¤Â)Ê…T17$¤Sìã©\H%q2¬ê÷<¯a,RU€”s«W’r:~)µTE¤¤*Ÿ”·så¤èÎ’”ðS¤ÔÎr¿©S§ŠŠI*¿jÕ*QCµµ­X±¢µµU¼yòäÉâãä}Þ;ì?½¤÷ rŸ—´û|RºÙçmßgöïã ©“½B*¿û¼ Ô·¾U&u}D@ ¤@ ¤2¤@ ¤rM‘T²ªNE*¸%¥zQšTÚÉz¿1Å3å›E¹¤—Z²dÉ ™eË-Z4wî\m„ ºƒ>Ä»Ï+ü.×÷yíúyÌM^CÊ^ÌËR§”·q1…é ÷ tÐ3R>©ë"R R •9 R •kXRÞE˜ÔIé{8÷íKQq¤¨ªv“2g‹¦OO˜ œé‘mr‘œ3à'I™Mü)ylÇX½ƒŸà#H-^¼x©Ì¢EóçÏo…”p'*/ÙA¿]žÙáN\N:èZç´q…Tÿ`!Õ‡™î wÐ3’â )Iê[Å”I])Š&uMD@ ¤@ ¤2‡m¢×“Ô€äSÛ )¥ŠLO¤‘òÎêõHq+;n÷Îk»·´“‹˜3g΂ Z[[E %^Ο?kÖ,müøñ¢e}щ+J;¹xË:Ηýso`V‘ R†”ÓA· ©DRÄGŠ/¤@Š HT.¤®ŽHHTæ8¤|U餔ªv’êߟ%%Qe#•¶^Ê#eNÜÄ/–ºtÐÉèÄx}J¯ %ª§2óæÍ›5kêÔ©'N¤ )ub‡î _¯wðÓ'vpôs¹BJ“âfûðô8R^!¥Hq…Ô:Hq)Ê…ÔU))ʧ‰îP¤¯— “²UÕœ”==EÊ›™½˜0y²"5{öl¡jîܹâåÌ™3§N4iÒØ±cEÍ%Š/UHÝRl¡{+¥)ºo3Ùµ9K½Ý¤2wÐI!哺2" R UMRÎBßB'Yø R U'Ró‚ü¾$ŽT œ¢¤lUѤMôœH].CK%‘âffbvð3£šÔôéÓ£Y³f‰—‚—(£&O7nœø »ú¡=0«;èßáG'2’ ŽNœÛAO!ÅuÐ}RWD„!E HT%¤ Ö/òµÎpÙgHyª¢H…ïöVƒ”½K;I]S:V4‘”i÷ÉfÍ}^JjÒ¤––ahšŽ&®ù´'apÈ!äP)5Ýç"÷y‰§søvß±÷y3´û2¢í>Mê°Ã*'U6UÕPHåBêòˆ$“bÛR • ©RxJ:ö3Ïþ•ÿmLˆ”}«7s-ÅÝí­tÆ/óÎARÆ“ˆò$Âßç"I©û¼j?AJÞêmnnª„$ñR¼.= PÂxçwŠ?® ©›õ..v»ïR}Ÿ÷÷(Q®¢¤ìBª7_HÈ/ë8ž÷dnô&’:\'·ŸR.!)’Ï£ïF¤@ ¤ªGÊm¢ˆu¼Ä‘rnõ6)o;›”·¤÷¾ºY’RtAAßçBü(©b55i²ŒxEWâÍ£‹ Ä‡ªö¹9JTÞåå:è—’eö‰RÆ“MŠ-¤ì›¼”_HEмÏk‘º,"LÙ¤î÷–ïúv|Q Ru#ÕdýÛN ¤@ª~¤:gêZKIUYH~ I .máç3¦x¦hU1B—øx›ôtô¤Úçr´ïzó>ñ¸^!u _Hè ósáBêÄ 'oY‡!åø%R‡QR߉HHTæ€HT®)4sLWU,©ðôD•HÅÖRêÒ_ÙAÊÌÌÊ-üR÷Þ{¯4¶ñªxèQ£Äûe%<™ö¹ÙÃ…/¤.&³öYêë` ©~¥þy :5×Bª¤.H!U HTvRÖˆQá’ˆtRø)Ryü”)‹”F&(§­‰Þ>Rþb)MÊŒÍ ;£eî-Fü*Þ ¤‰wŠ‘e”ð¤ÚçjËfµ‡‹=7ñòqÞÀ¬!åÌMèþ¹=-Û;à‰ NPO„T†B*ØA)6 R¹º8" R R™“')¥ªŽ¤èymQ¤n”¹©tZ[")UN U#Ë¿S%””•e”ñdvî“ã²âï  ©Ë¬ã:Lýku<›èW^ϵÏMÿÜñÄ‘:®\I%Rzn"\H)P Ť@*RE¤@ ¤@*sò'¥QU”Y%ŸHÊÛÄOo”…”œžP;$)U¢hQŠxUaïמn'žèA²}îRùBê,¦}n¦&¸ö9K*XHÇRÝ£ )›Ô¡‡–I ŒHHTæt Rz¿I‰+3µ¤—ëøéU½wÚªT† o0˜„>ñn½õVÛ“YÑ!{}öM^u——ó4€ïõæõúÒ®úô·.âªÙa6±ÝRá€HåBꈀHT4©b9u’5»é)’:¦¬*GRJU;I%mà&EoõæBJ–SwhU –ŠÄ$Þ#>BÝÜL–QÆÝÀ…ôúH!u¡.¤¨'BªŸ»_³ïé”òÎ}zêÒÙÃÅót,Óë Rfÿ>¦Ý‡ŸRl@ ¤r!uAD@ ¤@*šÔù餎ßÃ9”REH)UC*°ª—¨’•Y?‰w«JüáQ–Qâó‘;¼æ¯ñt±uVWHÉR}ƒíó“3R>)2ÛçRG&tÐ). R •k@ ¤r!u^Dº<©´r*+)ZNRJURá¿ÄÅQ¤L9ET ÖQÝrCiÐ RBý@mØgWQW•§&hû\ü¥õl_˜”WHõåÛ笧vRݲR Ť@ ¤r HHåšRU©ØŠ*2Ü>~±Û¹PRF•¬©4£%Y?‰Õ%ÔÍj/çIöÏM!¥ÚçzÎí ÇR¼§,…TfR‡ê:7" R M꜈€HHeNHúèH] Ïê"ÞÀY PÜ|³De©Ò°nÓQÌÔ{4&]BÝ(=ÝpÝu“•½R{ºŒ´ÏI!už$%'„Ú¼eRfp‚+¤ÏåU¤ˆ§yR HT.¤ÎŽHHTæd!å PäNЍú¶½dJ“:Ï P«ESHÎêõÊ©ïËü@FÁ’¹EGýVQ’˜nÖês~]”ª¢®´WHOZ'´ù…™›0¤ô:©ÀÜÄI¶'›”WHT•R • ©oG¤@ ¤@*s*%•8@á‘RªªLŠLβ¤Š¨ÜrJªºYWT–Ît%Ù57 £®Ó5”í‰ÌÊROº ‘"…T€TD!EHyž¸Yöh^ Ê^¯=úÍo–I)©Ì ‘JlúUH*j}‡CJ© ’bwt‘+<¸1?EÊSeøš|¿œ›µ#Óà³®÷”§«­Û»t°ótÕço·û¸›¼'¦_õéïoøªïhþªïˆ„«>bR • ©))ÊœBS÷îÇd½Û› )­ê [•}·W©"w{Ï‹]ß!URv9u­Œ§êF›øhIEJ ¦«ä ^¯ŠRe”òt{ªõdïáâyêÍ÷úR¹R‰¤Êž¾II“È© íãR •©3#R RѤúG¤«’êÁíæó#w{‰ªS´ªÞ:U)¥Ê&ETQRÞ˜GÊ)§¤ªk«§ãmO=¬Eöš§2¤’ )bR R¹¤@*RgD¤Ë“²U…Iyå”!e—S‰¤Îp×öžÅ—Sçñ}ô‹ºœ²Ué) Ö L®'1”Hý¤1©Šót¡Ääxÿ.Þ“t¼žšx:÷ĵÏRí.¤(âR R¹¤@*Rý"ÒÕH¥”Sù’JŕSÁ>úEÜEy??K•5A[†¥iqÑQªž¤&%É`Òóœ'¿ŠÒSö¨,õd·ÏB*àI×½þñl\!u´Ž Êöt8_HT8 R¹:=" R R™c‘"¨()²‘s")­ªz¤Ê³³¡rÊôщ*ÓJ·UÑM]]×RDš‘Ó0w1}G–Q¾'®ŠÒSýíS:ÈÔ„WHR>í$ã鄘Cy# )ÏGÊõôÍC)? R¹:-" R R™“LJ« P¤‘"ªôàläQe“âÊ)§®UÑrŠª"{û™\ŠadæzLB}nɬˆ÷Åèèߟ=¥Ãx²IÚ牧txžüsy5©8O •©\HõHH”ý/(¯¦ô×UIugTE²6r>Ñ#•a€‚S•­œHÊ)Oë Kç*;ä=¦[®¢5QLº†R˜lOçiO)ÎS_Û“"lŸSO‰¤1Át·|—lØÇíÙ—æI_ò)PO=3y ôúÒ¥ž¨.FªÐä’"¸è‡Hå@ªwD:6)óS ¤@ ¤rHÁ~AIÙ¦J¤ˆª´»½Qª¸rªO œòTé u¸rê»ï§U™]ÒTX–®2/‡„¶ö´&ƒÉÜÙÕËwéBŽsËe”çÉR¶§Ä=û|O=ƒç ¤ïRÔ“&Åõúº©B9ZM)©xRä¹FžG§&¤£ïãçéJ»ðÃO)ªì§Ô)éȤT2ÔRœªJHq7|Mã's9•¨ÊÛÕo Yëá¶Ô]0ò†Ë¾cåR’…éB¦„:'ÉÓüù½¹#:?\'²:äßèâ¤èå ù)ŠŒWQ17§@ ¤r!urD: ©&Rúb¡©[·DR)ª()­Š’ª¤œòI¹»ú•Ë)²ÔÃåVV¶.W˜'ˆ0"’.Ö“|ΰï‰îÔL×ñ’ö9ñÔ›÷>Ÿãxý JódRNûœ÷t˜ç©K“Š HHå©\HâIÙó³)G•GÊVÅ’²yPUzŠÂ?ÆÍQe`¹••­ë’€4òfòËK7lL¤snçf-‡,£Ô?$੯½u‹í‰#e·Ï÷š#åÝðMlúy}?N•!PE¯ý˜5¾tZn—£ÊĦu“ ™pw>‰þ¬æaœ¹Þàî)ÛYÎQ©§ã¬#Ò=9G î^ö…VtøW} Ť@*RÇG¤@ ¤@*sR™Ë©ž¾Ÿ­ÊõsïùUõ×áT…×|p´Î&ÌÇ2äRb0}›`"žúsž$)2×ç öyžØS¤8O†ßë;Š/¤’â=}¤¸€HåBª˜ãÒÑ7‹HT.¤ŽHW#V•Bª'?ì(§‡TØÓñÇûÛö9ž4)®JôR¤@ ¤r HT.¤zD¤ë:Ú-§ŒªÄ>º·«Ÿ[M…Ê)[•®¦\U)Ûûy¶üé?W×9¶®6¯#†ê#[\;IDAT,J6&íÉÁD<ÙU”ꟷǓ]Eeñ”_!¥@)Ê5 R¹:&"]Š”VåÒª¤Ž·vvñIÈœæá¨²:éɪìžgZ¼CN¸+BPÙEÉ­ŸL¶§~¼§Þ¼'³Y³í©gÐSÀ|ûœ*¦ŸNûÆÁòÂÐbÃq¤ŸÇ*ž˜¿‘D§du•æ‰ò ©°'¾Š¢•”=-w<[L!õõ¯} ¤ü€HåBª[D@ ¤@ ¤2§ÐtÔQ.*gW¿¼Tœ¢ª»Å‹7G[.ª[^W=¬+Pj±|\FþŒ„Ó3טÒ=Ê{ mÝ’î)€)ì)½úfÐHR • ©£#R RÑ¤ŽŠH×!uTªª¼*¶•Î,bU’´½Ÿ½q’Ëíª;••Íë,/˜0—‘EÉÅt†É™{"½óÜ6ì# ¢<%nÖÌ´Ï…§¯©ú‘*tFd!Riª4,öÚ¨:!iÚU>¬~V¼ËÀ3Ý à óa•)y÷t=LIž"¶n {²ïïfðÄnÛ剒úÚ×*'UÕ MHåBêȈœ§^ç HT}H¬_:QJ¤ÂåT’ªã2©²ïúXtâÀê„ÕÏ‹× Kp–"ÈeÄÕO”É€j§'çþ.·a_»=Ù¤â<}¤ü€HåBꈈp¤:Ÿ)©\H•r8ýήBêÈ#¤ˆ*JŠÀb[édSç^ü/ž*VŸr¤:Ÿ(©z‘jê¤'€HåBê°ˆtB?Lʤˆ*TX•¹Ø¯D•«w9}ìx°8^úªÝ±?_?ûÁœ¿ SBPÆéœ{%”åxb&&"ÖrpžØÍšùöù!Ä%õUòR • ©C#R R •9ERGºåGÊo¥ÛåÔqî2_ŽT¢ª“­%¿½ƒ°üº* «_nñ 7¿t²1O§žjª(RB…ÖFeðdH=ùË£ž)¿}žà ¤Ø€HåBê›é"¤Š)ÊNÊꃔ‰õSŠtÒäˆ*‡TXWQyk¨ü†ºg‹_TÅêò$: Û M¶$Û¼]BE¬ˆïÅ Êzžzpž4© žÂíó¬?¢¾ú•¯€”©\H)Š&õˆtRGqdmTùU¢*›Vo7[¯°“ ‚8J}”Ê%TôÚ¨(Oiíó(O™wjzú Hq)©\S&•¤Ê'•¤Š’r.ÿxX~ÿ/Ë£è&^f÷ mJuS;<—âÉëõEoØGš}>)ÞÓ×yO>©¯G¤@ ¤@*s@ ¤@*×Iá–Sž*RMu÷P™ ·š ÁÊpï÷dï\‚ô^`ÀV»Ó‡ëˆ)¡(Šéfùnº§c²z -âÍà)Lê+_©@¢HêCªPR…ú*Ô‡T!'R_‹HHE“ò. ™tR‡~DYÕQ¬ªB¸¢ ¨:.j——0,I«à]þñ´Ne¶ôC|$›)„>C¸nr(ñ7wÞä׫Á“!ÕOÎî-„TVO©b9uÎUñL@ ¤r!…ŸR:U'U¨ )†E-HêCªPRJê+é:¤OSU>Û8¬ª³Ú£«ð³ÊÖåMT’zëɶ ¡*+".)O’C‰ü¥ n Åz¢mór£¯àhŠÿuT!ÕS"©”öy˜Ôÿù? å¤@ ¤rMÔ¿²’/E¶>›áÈëU}¬”‚TlÏ£z>ÓAAAAAA¤«…ÜÎó_«Öc²U“{…µ¼!Y¿¦9ÏÞ¬­þÃ"Åè¯tÁÌŸÈתúõ/”·üX…B-FZªþo³«NÿÌ‚÷,4u•¡º§àü]hrÞP…Ç4¿x[åÔòYE¾°5~Z¬³§¡©¶ ~õkBÊ{Ø*ë«ÿoóÌù’ÖâŸYhr¿©5ýwwñø_ýš}ùëð\«ÇS ¤ºVÌ7¹P~CHÕìa ί5Kªª÷›Z¨Ë¿»«¦Ž¤êò°µjÕ鲤jkq‹÷Õ¯ÚsÛ[Sc_uZRÖ?³&¤¼¦HÕ2åçy­k©‚÷K§¬¥êðÏ$ÿíB-U§œ—µøòìWjFªFb?ZSíÿ™ëMªMÜ+…|õ ökþõgu¹æ¢jþÏô¾“5ýwwùèÿ–™B§êûвÊyØ*>*yìª?Jù¡êõÏ$ƒ>,‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚Ð$,rÅXÉžd3 … ãšqö)ÉCÈÙc ¤¤])É5îN¬ … ¤¤‚ø›­º›ƒ‚dIÁÜܤ$*.ºÃ19\¤$.Ræ%H!H–ð~Ô‘Õ¥)IL =QpãÞ­B„f–LXc~R’-›E\R’k@ Ar – "‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ÒÁòÿXzÿN–ôIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/renderplot.jpg000066400000000000000000004451211477365367100226410ustar00rootroot00000000000000ÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀV"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô¿x+Lðv‡mmmiÛ<°n.HÝÈçŸOjêwCùÔ9ÿgõ£?ìþ´_UÖm4[AszìªÌg‘ÏEU“\¾©¯Iwªi³$ú•¥”$É5¬p8’fì‡ÊÔnöÅCãé.m¯tkÈ`ó6™<,Œ«´þAÿ:æ.W¾…–Y˜ª W­ƒÂFPU=ËcÎÄâ\dàzÆ›ª[jÖ)yfæH_ A} [Ü}çX¾¹·ŸD·[h¬*!dme#üúÖ¦ÙýkËœydÑß sE1n.Eµ´³È$)`€³` œÉ>±­‡óª¶÷0ÝÛEslé, ’9²®¤d{‚*Lÿ³úÐ¥ö‚O ’[¥ghzþâ=15*çí®ÌÆW•8<ÅñÕÕÏööVž ê´Ÿb€6à0&FÈ€#sƒƒŠåc7Þ»ñ—{ak§Ûêºl·vpÚÜ´±¬‘D@ D䯖ØÇbs@­¸úÎÇÐþuäžþÉÿ„ß@Mxö/ý°É3;ò†ß7'ƒæ`{gVg„²ŸåÒ%x„È¢ûlÌÒ o)÷‰< ù6äc;qÖ€=fÏÄV—ÈZ$¹À¾–ÃýY?½Œ°bvç ò˜àtîkWqô?yM£þËÆF|kz_øù«> }jw/¬˜Æ s¹gqö¹m‚0N|¿/Ç黡üê¡Õm¾ÏmX`p½xÅz.ÙýhmÇÐþuªøŸOÑï౸’]MJ‘ZÚË;Rb#S–}kK?ìþµçž.¹µ¶ø‹¥=Þ¾t8ΗpÈ’Ü|ؾLʬ¼õéž>´èv·BîÖ+„I‘$PÁeFÇÕX±CKñ¦¯c§]Û%ÈPFxwFx®â2ñ<ö®S½Ð.üak&»}æ”ÚZ6™#I¹&›Ìa#&Î ¸Ù¼úU_ ªÉ§ü:…×tOkv¬¬xaåô4ê]Eu Ío*MdŽ@ÊppyàŠ—qô?p -ôÛ? 5½¤6ñßE<±ÞÆ„F¸Pã¨ã¦{WmŸöZ‹SÕ-´6ãQ½vŽÖÝ ’¸¶¨êp9¨Ÿ]°[ƒFköùàkˆâçæHç§çK¨ÙÅ©i—V¦b¹…á÷Xx´Z–£k Aã)mõ æ-)—2…âoÎi¿Jö‹rÏQ•RÕ¦7›‡òÜ!òäòÛæ#{§<€HÈæ´7Cùכç]ÒtÌ’mü1tŽw}çæú““øÖw…ôètÆðÝ µês‹™d•˜Ì>ήªÙì¤ €=+RÖ Òä°K…”›Û¥µ‹g8r¬Ã<ð0¦¯î>‡ó¯ÑäѤO¸a'‰N¬§TbÌel—p—Óæû öf¥¿{]š´’99ÎÛ%Þ|ÿ/ÎXEÏúŸ+¯ðã9æ€=§qô?¡üëÆõØõÔõÓÍH¹“ÄP•$WHÿ ü²+¼ðd†÷IŸZelê×/v›ºˆŽ/ü†ˆ~¤ÐQ¸úΪjz¥¶¦\ê7Ò4V¶Ñ™%p mQÔàrj\ÿ³ú×/ñ ÿÅ·ñËÿ.OßÚ€:+ÍZÖÂ[(®dd{Ù¼ˆ ÜûY±ÇNõô«›¡üëÍõ"ëO×<#,úæ¥~­ª]y;Tùœ‘©ÏnN9¬_ Å,ž-Ž{ýWM´ÖáÔçûDn[»˜Ép±òØhö•+…ÀÚ1Þ€=OHÖ Öôñ{j²ˆŒ²Å‰8;£‘£ný2§ð«û¡üëÆãkì .©(ŠÁµ½LNÍ)E󼑠 Œ.qžØÎx®·áðmõ¥ÓW: Ô[û8†% lMû÷7ïÆ8ë@¾ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´ã—þôH渇Ϳ²…ž Ú'Ø÷Q+ÊC «ÁiŸð‰éÿóõ®àö÷ÿŽÓ|_ÿ [—þbšwú|†·±þÏë@ð‰éÿóõ®àö÷ÿŽÑÿžŸÿ?ZçþoøíncýŸÖŒ³úБüEóô-7Y‚ÂÿSXÄ/›¨O++5ÄŠÛYܲä(t®§þÿC?‹?ðhøšåþ.Ƕ³Æ?Ñ4ïý*–½²´“i+¤›w<ïþÿC?‹?ðhøšËÐ>Zjºt·ø—Å é{wnjd ±\IžAçj}óÓ¥zÅsþ ÿÏý…u/ý-š§™÷+•v< Z\h~-ñ¯«Ík Ö‘É5ôžnÙ¦O0R ä1_—b½+þ=?þ~µÏüÞÿñÚóýgþJ§‰¿ëÿAÿÑÑ×®cýŸÖœú =L?øDôÿùú×?ð{{ÿÇhÿ„OOÿŸ­sÿ·¿üv·1þÏëF?Ùýj <ÿU‚M6ÿTÓ­¯õU¶“ûïêwëæßI›]œ²î@ÚGJé?áÓÿçë\ÿÁíïÿ¬ÈÉÇý;ÿÔFZîñþÏë@ð‰éÿóõ®àö÷ÿŽÑÿžŸÿ?ZçþoøíncýŸÖŒ³úÐ=¡[;Åú½Œ77ÒÛ-…œÊ—WÒÜmv’ä1Fb2zz Æñĸt[åÒô™­e¿I6Ý5ÂNñÛ¹ùHıÈàtï[–œxûWùæcßþšÝÖ_€úwŒ8ÿ˜üÝÿéœtÉŸ‹:ÒŒµï†ÑGV{mE@÷$ÅÅw~ñ6¡­\j–œ6ky§¼Y–ÆVxeIc#)nz¹â²?áÖò£`Ÿ9?ôÍ«øOiv°_ê3YÍ ½Õ¶Ÿ *í2yv¨ŒÀw\ô=èÓwCùלø¯âÜ¿6¶ú=Íê,\4†̈pê‡iÜT¥zÙýkÀ|sª[Ùê6vs,«ug©jSMŒ‚g p#ž oÂþÿ©hÿàÃÿµ×¡ø+ÅÑøËBmJ+W¶)3Bñ4›°ÀÁÀÈÃÕórjöë)Ir©žTlžÿ•{OÁ©<ß ê3!dÕ%uÏŽ€=/qô?AmmyKkqñ£fŠPà0ê Ç¥$ˆ%‰ãe8`Tàú×’øAàð$ÚÇ…u‹Éìd‘ÚêÖòFT±Ë/ µy=8Á€z—ö™’üCn­*ª|t ã §8?O˦+Cqô?ch:†™©éÂçJ¼Žò?4ˆùù°3‘ü$õ#޹ïZyÿgõ  ·CùÖn¡«ýŒ'“¸u˜G,hß2Œù×>õs?ìþµËøŠ"×±]I QCùeä-ûã±›on6ú䟡êmîcº'üÈœeX7Z—qô?S³Ég co”º8ù=¸©³þÏë@·‹¼a'†¤wy8a[ÝÞC.ýê„÷=k“ÿ…Éüõ›ÿCÿ’ëKâ….¾—ñEsomöt²˜´ûÈ#uÒ‰$¸Àç¥yçü+[þ~"ÿÀïþG ]ðŒ$ñ,ˆé"É‹0æØÀèñ˜²ï\Døé]kÊ"¤íE™‹pï^qð÷B—@Kå¹·¹ûB^Ì àºÕ ê¤Pä1Ò½?ìþ´Ïÿok:·Í éÑ‹S÷o/•_ÝP`‘îH¤ã‹ÞIý‰z£Ÿ*$–ÿ¾‹¸ý)®áIxc-¡1Ý,+ɲ=ÙGüòõÁÔ|¿vy>M®]êKºÃü¡{ÈätA‘Ï|€2H>“®¦¥$–ÒÛÍi}[i ŒF_qúV®ãè:ÈÒt¤Óc‘äss{9 stü4„t Œ·¹$™uh.nôkëk9<›©mäŽw•ØåHVÈä`àäP/UèAEx_‡´gBø¹¦¦¿¾îY–fóË™ãÉppÍÉÇLnدXð¥´Ö~µŠxtޱ¹;‘FdSžr¨çÒ€7÷CùÕMKSƒI°’öíŠCÐNîìB“ÀÉ dàä —?ìþµÉüL¿¹Ó~ê—vå\Gä”|ÚL¨23ßžPyŠÒ•7R¤`·m/¼i¤ï-Šwÿt2Énnm¯yLko Žqœ·Ë!dc’3FG5kHø›¦k>"‡E‹NÕ!¸–i YeHÌ>dK¹Ô:¹3÷‡cšùçQñù oo­Þ^ÛìfßsWV‘ Ê£%Žöæ<‘œßøb<¯Š:$+,RF#y…˜ f¶%ºÿfíqÀïÿdBžS©ñ$Þ—¶ÞdÕ©S÷I¨ùî}7¸úΨ¾©‹‰!†Öêá£Às)ô䊱ŸöZÅ.e±Ö,ìõTÒ¯Þë|wO˱r§î1ÁÈ{f¾pf—ö”ÿô Ô?ï•ÿâ©ÖÚ—Ú.šÜÚÜÃ"¦óæàqÛ¡5åÞðˆ´Ï‰—º¶«<7ÐHIþÐþÒû?›ûÄ ìŒ’xê˜ãÀïçInZœ ñÍjÁp.-âEY8)FŒò§cÈ®T³»¾ø§Zjws®ŠI’Ë?¡ó†>‚¤µÒí¯þ'jòÞ#NÖvv2BŽÐù›çÚ8Ü1Áí“@¥ê_Z¥Ä+(ó"4mÁÇ*ÀÒ©¯ˆl_þÄ7Ûü¦—i‰Â•] äm8Þ½ ëX¿·tâÙc™y'þš½gê:î‘Åm& u;$š=>æ®2Èò@QÏ @8OjèîüY¥Xê/e<Ò‡‘&•bvŠ|mHÔ'#©î3ÔV´÷ mo$ò’±Æ…Øäœ2kÊõYá´Ð|m \þÖÔoe6vÄþòàLˆ#dXÁ#¦Ãž•݇ó¬­{Äšw†l÷UšH yV(!glà žpjþÙýkÏ~0O¿†´™æ!"Yµwbx$ÐU¤xÓDÖõÓí.ä[åMæÚæ ¯¨Y>™­íÇÐþuäú†©g㉽ðè{Ø4u¸šòî;²€±†#‰­s>×mdøƒá»Û8m4Û{ÿµAso ²»îÛû´ßƒ&à0?˜ ~Ü}çT¬õXïo/-’¤kGí,lŠäŒå ᇸ¯Ñ,’Ó@ð~»·Úx¥l̆v @ÒH0¹À'eÌë}o»É'x‹hß·ìç8íšökÖÞЮµ‹å˜Û[(i\¶ €HîjçÛY}­·,"?4’y Œÿ*ð+…³O‡ž3m7VÓn,®-­¥[!Kf?>H-ÆG\Šö©üR’|¿òâ{ÿ±@4ˆ¾×/­l쯦óîÕšØMo,B`½v3(ìk Ô/×N°žòX§‘!Bì©w?E“^QðÇÂ2ê:…õÝKT’æ ¤{‰cHY‰³\ñžq牢é«ð_^×Oœú‹Áw•æb?7;Us€2 ôÎ{лÁqö‹x¦U‘VDò¬ä‡Ú¤Ü}ç^+é2x¿NO¹]ûÝ´Ñq#,M«¼äoë×¶=ªŸ#7^8Ômµ B×N²k‹wxòªÄ¡Afˆ©ÆýÝsÎ(ßwCù×-ãiž1Ðîm®­#ûg–M½Èz8séí[:l.—i#ȳ³BŒe^’£æß­ZÏû?­ršoŽ´bðÚiñÞÜL£,Ùð¿SŒƺ2r?ãÆoûî?þ*²<+gŸáÛEŽ0’M–SÝ™†yüñ\F¯âéu/^iïu{m¦Z;BÅÌrJêpĸä ä1Ò”¤£«4¥Ju_,Ùè·ö‡Q´{iìfÚ܆G•#¡7ZÉ_\ªs-é“×÷qôÏõ®CHñlºoŠ­4ôº¾¸Ó.ÜC¶ùÌ’Dìp¤9äŒàsÖ»ÝXþÅЮõ˜ñ(Ø™ûÎHU™tëÊ1÷%¡°MF¤u,Ù[5…¢[Ãc6ÕÉ$ÉXžI?7Z³¾ùñ—þþGÿÅWÚGs}eö½GWÖ~ÞÀ·ú5ÃE@€à¨5»àÝvóQ‚îËQm÷vN ËŒy¨ÙÚÄzðAúW5<]*Ò´%vm<-Jq»Z#§ß?üøËÿ#ÿâ¨ß?üøËÿ#ÿ⫉ñ§ˆïmµ;=ÂW·2§sÕ‹¨jwZqßiú´ò#n– û†š9W¸ù‰Ûøbœñ¡.YJÌåu"›=C|ÿóã/ýüÿŠ£|ÿóã/ýüÿЍ,o£¿Óí¯"Ï—qÊŸFçSï­‹ óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*ôo |ÿóã/ýüÿЍ/!{ë+‹Il§ò§¢}²F`ãæ÷©÷Ѿ€+Ù[µ…ŒØÍåÁÄ¥¤Œœ(ÀÏÍè*M]IµÓm,n<‹hÄQ—–2ÛGLÕ{}èß?üøËÿ#ÿâ©7Mœý†\úïÿŠ¥ßFúMÓÏ„¾¿~?þ*óŒâÆ^züñÿñT»èß@ ºlçì2ç×|üU.ùÿçÆ_ûùÿFú7ÐoŸ9û ¹ÿ~?þ*—|ÿóã/ýüÿŠ£}èß?üøËÿ#ÿâ¨ß?üøËÿ#ÿâ¨ßFúBóœfÆ^:|ñÿñT»çÿŸïäüUèß@ ¾pIû ¼õùãÿâ©wÏÿ>2ÿßÈÿøª7Ѿ€ óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*ôo |ÿóã/ýüÿŠ£|ÿóã/ýüÿŠ£}è7Î3‹yëóÇÿÅQºlçì2ç×|üU.ú7оùñ—þþGÿÅQ¾ùñ—þþGÿÅQ¾ôoŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñTo£}çÿŸïäüU&鳟°ËŸ]ñÿñT»èß@o4á}§ÞMeqæØHÒöXÀË#!ÏÍÏ jèyÀÀ±”÷ãÿâ©wѾ€ óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*ôo |ÿóã/ýüÿŠ£|ÿóã/ýüÿЬGÕÞ û [¹dƒíùͱ|¢ÀýÒzƒø~5 ïqß,Þj$«±nOP8ê(ÞùÿçÆ_ûùÿFùÿçÆ_ûùÿYzî¸4K8fÏs$÷1ÛG0RYÛhäðk-2ÿßÈÿøª7Ïÿ>2ÿßÈÿøªÊÖ5ôÒî,ìâ¶’îþõ˜AoÈQ–bÇ€ cŸpª–þ'žé®íbÒ&þÔ³tÙ´è0Ž WWÎN1ëœñ@ùÿçÆ_ûùÿFùÿçÆ_ûùÿX^ñLj-Öëû&[[G¶W™,¬TŒž þU[UñÅ–¦k7·6óÿÄ®åmä‰pY÷`Ëíµóÿ4ÓoŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñU‘?ˆ¡Žú{h¢ó<•·/!•Q|å@ˆÉgòÉ5mµ5n–ÕµApîcXŒë½˜Jœçqï@7Ïÿ>2ÿßÈÿøª7Ïÿ>2ÿßÈÿøªÄ×|Uc¢ÆPOo5è–û'ÚdÛ$©ìrp7ç§8­ u: øìeÔ-c¼e-Þe7Ñs“@÷Ïÿ>2ÿßÈÿøª7Ïÿ>2ÿßÈÿøª¯ý¥e¶6û\’S 4|Ò ‚ƒÕ†Öã¯Ò¥Žæ)·yR£ìbµÚè>ôýóÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*²tÍxê:®¥`ö3ÚÉeåçÍt;ÃîÁIÀù}sÏjÖß@ùÿçÆ_ûùÿFùÿçÆ_ûùÿFú7оùñ—þþGÿÅQ¾ùñ—þþGÿÅQ¾ôoŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñTo£}çÿŸïäüUçÿŸïäüUèß@ùÿçÆ_ûùÿFùÿçÆ_ûùÿFú7оùñ—þþGÿÅQ¾ùñ—þþGÿÅQ¾ôoŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñTo£}çÿŸïäüUçÿŸïäüUèß@ùÿçÆ_ûùÿFùÿçÆ_ûùÿFñFúÍ×l/um/ìÖñ5¼Ë<Ë I4R¤€) ”ÇQÖªù^4ÿŸÍ+ÿgÿ’ësx£x  ?+ÆŸóù¥à¬ÿò]W?çóJÿÁYÿäºÜÞ(Þ(‰Ö¼#®ë‘]=ìÖ’ÜJ-‚m³ ÊÒaÎÅ· ò8¬¿øWzŸýü%ÿ‚8ÿøýzVñFñZF£JÄ:i»žkÿ ïSÿ ?„¿ðGÿ¦Øü?ñ>™g† --cÎÈ`¹»$“…¸$ŸÆ½3x£x¡Õ¾é ÙÛ©çv_õ¸n/nç»W¼¸’ÒU™•¥Ã[Ëæ)2á™ó€¿|`Šê<¯Ïæ•ÿ‚³ÿÉu¹¼Q¼TÊW-+~W?çóJÿÁYÿäº<¯Ïæ•ÿ‚³ÿÉu¹¼Q¾¤g)sá½zùïnnî­Íìßbòž+0‘ÇöiÚa¹ Á-¸± ¼Uÿ+ÆŸóù¥à¬ÿò]noo  ?+ÆŸóù¥à¬ÿò]W?çóJÿÁYÿäºÜßFúÆÒ´íbßW½Ôµ3Ô×0Cn«mÀ¨±´­“ºg$“)î: ©©øÃÚÆ¡%ý÷†Ì—RãÌ‘g\Ž2vÈ2}ë¤ßFúãÿáYxO<ø]Øz5Ù þZëcCE"FŠU^0€ Ôýôo |ÿóã/ýüÿŠªWÚ]¦¨Tê7e>ïÚ6ý2N*îú7Ð7ü"Úý :þ[ÿiÚÛ­ºÛÚi?g…~ìqyH£èb¦ßFú7Ïÿ>2ÿßÈÿøªÌÖô[/X›]WEk˜†Jå“rU!²Ò´÷Òù˜ï@þÒ´ýNû‘¥É Ë02)bÝ÷ÙÏséZÂIÏKï¸ÿøª­q0Žñ ŠwÜŒcùÿ*» îÃ@ ßqÿ>2ÿßÈÿøªd‰$Û<Í:FØá×/ ýïsWïš?ïš«¾ãþ|eÿ¿‘ÿñTo¸ÿŸïäüUZÿ¾hÿ¾h*ãOK«•¸—MœÈ»zN¡[iÜ»”>’2"­î¸ÿŸ¿ïäüUZÿ¾hÿ¾h*ßOK[–¸‹MœHۺΥWqÜÛT¾$pO&­ï¸ÿŸïäüUZÿ¾hÿ¾h®ûùñ—þþGÿÅU7I¶Ò<ï°hïœÛŸ!éÑF_…8Q€2pkcþù¬é5»-äÜA%Í¢xLЧ¦z“©è;Ðûî?çÆ_ûùÿFûùñ—þþGÿÅRɨYÀBÍwm£kÊ äô{óQ>¯bš„–i‡í‰“É. ‚{÷À'Øs@ÆòÉ’iŒï™£% î BjM÷óã/ýüÿЦÿiÙ¥¼RÜ\ÛA¾5|<ËÀnœçê85l@ ©¡[}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøªµÿ|Ñÿ|Ð]÷óã/ýüÿŠ£}ÇüøËÿ#ÿâ©´lpçí–¸Œnsæ¯Ê3ŒžxQý£d-Ò¶Zù. I<ÕÚÀuÁÎ0h7ÜÏŒ¿÷ò?þ*¡–ÜNÛ¥Ò|ÆÆ2þQ?ú,ú¬Hú‘åOìÆ%‘>FlŒuû¸üjÄ7¶—¼P][Ë$}@Å~ t  a‡þ€©ùEÿÅSâ·>øtŸ-±Œ§”èÔËÍnÖ îm¥·º0:#¤rƒ´³çÇ_Ò®ÛÝ[Ý+5½Ä;XÆá°};ÐDÎH&Â\އ||ãÔ»î?çÆ_ûùÿV¿ïš?ïš«¾ãþ|eÿ¿‘ÿñT„ÎH&ÂRAÈùããÿ¦ßÞ\Úh, Ê`—a* Lzî"«r%Ð#Õfã(d€à»÷@÷4o}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøª[kèn`µ“r#\Ä%HÙ†â0 ã¾2*½îª-þÊ-`q#F‚9 ¨$òN8Úh}÷óã/ýüÿŠ£}ÇüøËÿ#ÿâ©’]^-¼Nšqy\ñù¨6}Nyü?J“O¾‹R°‚òˆå]À0ÁÇÞ€}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøªµÿ|Ñÿ|ÐBf,ØK‘Ðïüz—tÿóã/ý÷ÿV¿ïš?¾j.ÔÓäQè1ÿ³S·ÜÏŒ¿÷ò?þ*­ß4ß4W}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøªµÿ|Ñÿ|Ð]÷óã/ýüÿФÌßóá/\ýøúÿßUoþù£þù  »î?çÆ_ûùÿFûùñ—þþGÿÅU¯ûæûæ€*œt°”wáãÿâ©wÜÏŒ¿÷ò?þ*­ß4ß4W}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøªµÿ|Ñÿ|ÐBÓž¶žü¼üUEqs%¼FY4û–Uç…þI5¡ÿ|ÑÓû´ĉ¾2üÛ ã9V¶pF=r8éN—âW‡ d’iÕXd%¹äW1ñKJH5Ë+«DŽ7Ô–rP¯'Ü,ã·P%—!™ùÚœóŸn½+7;;£sÚ´;¯7Ãúl7ÚÄØôÊ æäÐN®^]‹I.-n¥3n ´lÇ, ŽqœœZéü=áû³á­(®¡Sg·$°wÞ3Z_ð^ÿÐJü?ü]9ÁMYšP¯:2æÃ¦ƒý£­ÙÝ›Y-ímen 3²ò )çç'ÒºmVÕu=2kBÁKà©=) ¹ü@­/øG¯è%þŸþ.øG¯è#þŸþ.”iÅG”u±5*ÍNOTdÙÜC Ÿ—s§Ý¬à`ˆá.¤û0¨ô›3i=Ý܈#–ä¨òó’¨¹Ú ù'ñ­¯øG¯è%þŸþ.øG¯è#þŸþ.¹pù}*çŽâž"¤ÓMîs𶙿ëj±Âg+“4k÷Š‚H+ë‚Oôš¤êVf³²¸Im2O F¨;“¸ ýk¤ÿ„z÷þ‚0à)ÿâèÿ„z÷þ‚Pÿà)ÿâêªàiUŸ<ŽYRŒÙNÎ8ìlmí"ÿWk}`*›Î÷©¿á½ÿ Œø øº?á½ÿ Œø øºì4!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.€1®èVú<·VÐ…cÏ#€c`NݼýìþU[EÖÞm4»à‰}er±—O¹:ó‡CÐç¾+þ«¯ùÿ·ÿÀCÿÅÐ<7tEý¾ëÐÿñtÎx·O¸Ö,,míÚ…¼²4ryl‘«‚ÌAN}*÷‡ÿ²¤Ò¯´+C4–7RO412\ £¶÷<¿B7ØÈ®ÏþëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹  Y_ñ›­ÛµÍ½´ÂÐYÁ3Ä®dÝ)ʱÇzžÜTú¾€4øtù´{ ‹É£Õ"»º&à<Ò…F\—•ÆqÏ«¶ÿ„z÷þ‚0à)ÿâèÿ„z÷þ‚0à)ÿâè޽:”úÖ—â(t‹¥kTšÚ{)d‡Íhßi„9N Ž FZ=½äþ#Ô5ëËV³ÛÅk»²—؅سí$d—àpá]?ü#׿ôƒÿOÿGü#׿ôƒÿOÿ@÷„mnt¿ ÛYÞGåN)dÜJÌ9¬[÷:Æ5:=͸k¿˜s2$‘¨Ç^V\ÿÛ1]Çü#׿ôƒÿOÿGü#׿ôƒÿOÿ@q¦èÒx) ¾…[V–þÒY”H§Ã$JsõqnÆz“Þ¬Üøzéíµ™c±í—:ݽÔRnMÍ I 'vxÀY8ë׎yï¿á½ÿ Œø øº?á½ÿ Œø øºó‹Ý'V1êz|z9œÜk1_­ñš0¦14oŽNíʪWƒØ»TÑuIW^ӣӌϪ_%Ì:—˜`P Ùmà¦Ã ŽG½z/ü#׿ôƒÿOÿGü#׿ôƒÿOÿ@o©øoV—UÔæ¶…ZÞÖoí-0yРܱ™zñÌn2p?|}+¯ðõ´ºn…mÁj`e¹ ç39.ÿøóÙÿ„z÷þ‚0à)ÿâèÿ„z÷þ‚0à)ÿâè“Ò_POê÷Sé7PZݬ+ï$%v…·9ãëŠé¼ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þÛÏúÁÿ€§ÿ‹ |ïz<ïz›þÛÏúÁÿ€§ÿ‹£þÛÏúÁÿ€§ÿ‹ |ïz<ïz›þÛÏúÁÿ€§ÿ‹£þÛÏúÁÿ€§ÿ‹ |ïz<ïz›þÛÏúÁÿ€§ÿ‹£þÛÏúÁÿ€§ÿ‹ |ïz<ïz›þÛÏúÁÿ€§ÿ‹£þÛÏúÁÿ€§ÿ‹ |ïz<ïz›þÛÏúÁÿ€§ÿ‹£þÛÏúÁÿ€§ÿ‹ |ïz<ïz›þÛÏúÁÿ€§ÿ‹£þÛÏúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹ |ïz<ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹  BãüŽwuü+RÊMÊ>íyÇÅoÞøMÂA}ö¿?‚¦=›<¿sœîý+Šƒãö£hV§ë3…}: ÷Í|ø?h½Hù¬ÿïû…ðÑz—ý Ö÷ý¿Â€>ƒÿ¾hÿ¾kçÏøh½Kþ…ë?ûþßáGü4^¥ÿBõŸýÿoð  ÿïš?ïšùóþ/Rÿ¡zÏþÿ·øQÿ ©нgÿÛü(è?ûæûæ¾|ÿ†‹Ô¿è^³ÿ¿íþÃEê_ô/Yÿßöÿ úþù®oRÓ¯$oE¯˜/íq ” Â2»NH “Žz{×ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…zåö‰=Çöëý–7–âÁ!·bW%‚¾@Éã’½qúU™l®×VžQoæ%Æž°y—äuÞyÉÏ;€ÈÍx×ü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øP®Zè“ï®-cc–À±S¶Nr½^•³¦ÛMƒgk91Ì–É•`J°P<Œæ¼+þ/Rÿ¡zÏþÿ·øQÿ ©нgÿÛü(Ü¿²ßþ‚w¿÷Úÿñ5nÚoÃ;ÌsÒOèxü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øP¯Á¤4>kY¬¤3´í+ gA&|ÒÊÀ“‚GÊy=±íUî~Ú²hPµ7+<ÄÆ¡0ÛIçnì`œg¥yGü4^¥ÿBõŸýÿoð¦ŸÚ'PfV>²,¿t™›#éÅzý¦“z†ÆF·X€ÔåºhC/îcdp䎙åª; m_ûfÖîöÑð°Í€4Ab¬69ÛòÿNOA^Mÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþê¿ÙZ„šæœ¶Ò LB¶ÐܼfEò˹I@9ë[V6/k­ê,)´±@±íÀ®ðx:­x‡ü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øP»O`óLÒ û˜þÙB¦E-½ƒA0ß\ÊðHÊAü€¯ÿ†‹Ô¿è^³ÿ¿íþÃEê_ô/Yÿßöÿ ÷ fÚæù-¬¢E6ÓJ>Öû€Ä@d¯©Ü@^;QêúD×®³ÁvÑ<1:ÇE+’1žzqžÀŸS^'ÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþë—6¡s ézpqÌ1†kÌ€Ð0\mP§’s·Ó÷ÅZ’Õ$Ñ,àºÐŒÚ …Ó÷D d1a€{çžkÆá¢õ/ú¬ÿïû…ðÑz—ý Ö÷ý¿Â€=zHµ¸4=6ÈÃ-ÌŒ»o%‚T*ÐeÉ= {×·lURÆ[_²ª¨U€íÊÐ|¤ÈׂÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×ÏŸðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPÐ÷Í÷Í|ùÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó_>ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×ÏŸðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPÐ÷Í÷Í|ùÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó_>ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×”ü=ø¯}ã­rïOšÎÇLŠÚÍîÞáÙ¤+"rWæÎsÚ»ßí›ú´üwÿŽÐñ}¿y¢Ç ‹ôÿWÍqVÒFòÛ‚ÜØ6òr:“Ž‚º¯‹É9oÍö˜.c‘gxä·hÇîŽrYb¹˜–WŒ.Ȫ‘ê5ËUÚF‘ÕAøP†ð~ˆ@À6?íšÖ½cxDçÁZ Æ?â]oÇý³ZÙ®£0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ç>:[ÛÜÏ¢¬Ör\4v¤ªà‘m…>fR§?6Ü®:׉Zèšf¡u¡G;Ý[ÚÍ¢Ý]ÌѬo"¼?i$•wa sƒ·v#Õ¿i[«‹tðÊC<±«ý¯pG 7ËóŽ¿+0ú1ëÁF©¨ €_Ý`YÄͶ5 QžC×<ÐZ<1£2ÛZK=VêÖ÷ÈŽÛM†åâId¹Œ~÷Ê!ùµ8Q'Í?/ÍÍø—M‡FñV¯¥Û´•ìÖñ´„*ŽT€p=I£øŽëH•ÉO¶BÖgäMq: ‰›s'î¤C´’Ä©;NâHÏ5Ÿ}q©ê77÷’y—WR¼Ó>Ð7;Xàp2Ié@™?†¼3yñæ4´»6pø¢=2æÜH°¤‚y&Ú# ¹#1mÆIpr GÍÇ™¯O¨ëo¥ßI »µ²·Óld†IRLc€!æ6¬@’㜃»›¶¤·pº…Øîéä6æ™I+!9ÉpYˆn£qõ¨íoï,|ÿ±ÝÏoçÄÐMäÈS̾ò6:©ÀÈ<ìguùrÜÿ<5…õxìฒtd”pÝòÛ±ã³4%ÀþárØÜræ×u‹ˆ­¢›U¾’;Xš t{‡"(Ùv2('åR¿)‚8éUï/ï5 D··sÜÈ7a湘»r}Y™©bzšôí,âø{§ÝN4¦µTïqj–@ß<Ïqs3 Dy«¬@Ÿ0 .ÒõWÐÓa°Ôµ gŠÊÆÎ;í1Im¨èñ¡Óä6wO1]ÆåPÀw4©¿1©,â¼½oïËÛw:ùQ<âB6Fû· ôS½ò:ÍêjÄÚî±q´Sj·ÒGkAnpäE.ÆEüªWå pG(¨×Ž—wá+Û«U±žú»®olí|ˆ¤v[Ö>RlM«°B¬.Z2p~ñ4ß ¯‡Ww¦K}>ëûhžxDí¾å}ª[~Ö ;ùtèw)Ýž­¯xjâêÞËPÔ´©÷칎žܤŒ8‚HÁé“Qɬ\ïÔd»¾—fèå¤vÛçyŒÈ[¶üÊHþ,¿^hÑ--t­^âéÞÆ;[;»‚âÖ]&8î,Ù]:¢°pnJN^m¯º4 ©g®?Åvºm­Ÿ‡–ÒIºc;M-ºÃ$­ö«…˪³ €¡AÜxQÓ Ï“V×®¬¡yu JkK$û,LÓ;$ "òל(dFF2Ž‚‹jrlì“ @ˆ·¶PÝÔ36ÍFØ7;'&€; 3LÐdÒôi'ó¡'‡5)„Å)Y~Û¶G¸!×`ÇÈq±9¬xžÎÓ_øƒ/…ôÙí-mÓS¸YÜèÖ–KeE·0•4ˆˆÅs°q“ǟ˪ßMqç›™ÂIˆ¿v¨’.ˆ«€¨w¾U@1ãš!ŸR¼Õ Á-Üú…ã²Ff–v—*ÃŽX¾â︎s@æ½`¾‹Y×m-4¢×·v’ÚŽÞòanZH|ñ’ÃåîÝ`1/íÓÛø+]ŠM'M´žßS‚ÐFúlF[t•nŒ‘ï‘L ‚Šf,»@V~›¬µ–°Òâñ¥­¹F·µY–xa,WæT,á±Ó,zˆÃX“C¹¼†Òù´„•~Ñ2Fæp»˜|»‡™ž~z±á}&ßZ×¢³¼¹û=¨Šk‰¤ç„Š'•†B±FB¶3­Œ’ÿÞ°Òî5•¹Ô¯lÃÛ,Û¹@æO´«/,(HÜ6ñ3¹0OÎ99l5ì:Œ¶—Öv'²¹hÞ-øÃ¸Î2§#ÔQª_ëÞ]Å«]ßItÒ¯Ú’îG.dŒÃs¹AeädŠé5/iºaÔõ $ƒJ{»;¯™RGºI C±y4m‚w Î>àÉg¢éZ†¹àk)£»[MZÞ8çÉÈ®×SBX8‘¹Caƒ|»°œ×÷—hóîç—í2‰çß!o6A»ÙûÍó·'Ÿ˜úš±o®ëŸcû6«}Øwý“˸uû>ÿ¿³åÝßÏz؆ËÃgN½Õ¾ÍªÍci,~WÚ£ŠI¤LÞn|·¸‡^‚ßë9ØÕ|£éwGHûUôÚ™´Ô.<ü"B¿e–ä}Ìo1mñÃa9ËçhãíuÝbÇQŸQ³Õo­ï§Ýç\Ãpé$›ŽæÜÀää€Nzš®·÷‰åí»|¨žñ!#}Ûz)Þùæõ4隇ÃMRUŠþîÞÎÞâq)¸päÅÛù‘2¤›;‚6Ê6“ó1ïü9áK .ãY[JöÌ=²Á »”dûJ²ùÒ„€mÃoc;“üã“}wX’U•õ[æ‘%«›‡%d îýàÒHÀõ˱êMGy«jZ‹Î÷Ú…ÝÓÎèó4ó3™ªÉ䪒= Paâ MÒü4t¸4û»½ZÓXÔ­MìN :À ,팶À™!wü§{dƒÉè–¶wÚÄw×g†}Ñ,ÅÂ$r2‘;‘‡*\õ »â£m[Rd½FÔ.Ê_¸{Å36.1`dçç!‰99äæ©ÐhžÓlíË]ÛêW÷=¥ÅœËýªàLáT˜Üå4£+»Ì.3…ÉâOxo@³¼!5Yn¢Õu 2%7„>IB’±òóÀ‘A@>nHdÆÓɦ­©Gqwpš…ÚÏzŽ—R,Ìus—s– y ç=êKÍwXÔ,Åî«}sj%iÄ3\; ‘‰,ûIÆâY‰=Nãë@Ðì/eðà|vòè—× {ÜÀ×,ê®}ÿ$€X9]À|Á@­‹ÝÃzg‚Æ¥s¦j±Gwö˜íäš3?Îo“h˜Ä6ÆËIŸ-³…eà×VÔ•,‘u °–^ÍDÍ‹v,˜ùù `F9«–þ,ñ%¤²Kmâ V%ÿXñÞÈ¥þf~H<üÎíõv=I  MOD‡FѼSdÞ\óéÚí½š\˜Â±P·a±Ô¨bŠHÏa×cÆ>Ðô+{˜ôÝNK«Í>÷ì7` ]Y°ùbL(±ÆpåÎNKrpßÞ[ÙÜÙÃw:̰2ý§Ê0®ö<Åœ&nÝ]1׿é^Bl4_µ[íƒL:«nݧ íÖ'Ž7ÎdO/åù†ÙeÜÜŸtúŸí-kq-¿‡.#‚W†´ù²*±äÂãÐdð3^ú.«²¦^¯Û°-7@ÃíÆ<¾>|î^™ê=hª‡Mð‘»¹Hn ŸN~Ñqsxñ=·/á7͹¸|Úœï*¿Ø<,t}÷7^L#þ=.á Þ\|ß?›j$t]§…Ìå~aæ”a§‡µ[fïJ°°»¿»µwY#µ¶‘˜m¥Š£8ûÀŠ®4Ë“£>ªcZ-ÂÛ Oµœ©bíÙÈ,Ìd€²m;B–Û-ô¡«¶íúbjM<ñÆëƒ*y/Ì6Í6æùO—÷I›áyrÜA>š6ý¢âæñâ{n>_!Âo›spùµ;8ÞW/6…¬[Åm,ÚUôqÝDÓۻ۸ƫ½I2…ù‰ÏJ¯}ay¦^Igi=¥Ôxß ñ˜ÝrSÈÈ þ4Ô}ƒÂÇGßsuäÂ?ãÒî åÇÍóù¶¢GEÚx\ÉWæaùE‰´í^[l·Ò†®Û·é‰¨4óÇ® ©åü¿0Û4Û›å>_Ý9ö~×o´{}Zà63é÷z€”ÊØí˜¬€Ž»³´zóÃm-ü >§«Y=íŒÙWrZÜÍ#HPŽy†Ô,Wm´³ÊñÉÀ„:o„MåÊCqúhÛö‹‹›Ç‰í¸ù|‡ ¾mÍÃæÔìàp?yUþÁác£ï¹ºòañéw òãæùüÛQ#¢í<.d‡+ó0ü£›Ô´Ù´Ë…ŽFŽXäA$cž2H„€qA*À0 IÔ–Á/ÛO»nŒépao-•\#ØÁ™TžÅ€êh¬›NÐ…å¶Ë}(jí»~˜š“OmNÎ÷•ËÜh·ößdk9’êÐÞ$~D„CqßÊŒ®Ô/¹r»{ä$Oê¿o»±šÂîÞâÎÝînc–ÚMТ¦ìº…%AÊ€Hæ9  wÉgä‹a<óÚŒl’xDNÜ åC0çø¯+Ñz-Éß*qÀ,Þõ5ÍÛhZÅä뮕}<ͳÅnìÇz€?‰˜z¨$p+>€=rKû?V°7^þϸ½a¤[İ+ˆZÒõ-ÞgïxFemñŸ™öd^Ê?i~ŽÞi¼?q¨GeºGOžƒR‘Ws˜‰ÑN2®6.]nòº(Ö©ýƒ>•m.¥­®¡§Ìo­Ì’.Ë’óI#ä0ócرãhó±âü}_kW qiqÝì÷0ÉksêѼ¬T’Œ@8çiÁds\ÝÔxzËBžÌ»¼z¸û–Z”æÒØòsûÀFÿ—æù¤ƒ<Ìâ¬}ƒÂÃGßmuçBãîîbå¿ÍòyV¦DFÜxlI6æ>YùOEwi¾–É5Äi§wÙî-¯W¹ãæóܦøv· ‹Q¿‘ÈýåéÚ¼¹ßo¥]vìÓP1éãŽvÜ _Ìù~cºhv·Ê<Ϻ8z(°û…†¾Úë΄ÿÇÝÜÄ Ë›äò­Lˆ¸ðØ’l/Ì|³ò›i¾–É5Äi§wÙî-¯W¹ãæóܦøv· ‹Q¿‘ÈýåpôPq¡ËöúQÕ×nÍ1õž8çmÀ•üÏ—æ;¦‡k|£Ìû¢¿Ø<,4}ö×^t'þ>îæ ^[üß'•jdDmdžēa~c埔ñôPq6›áyl“\Ašw}žâÚñå{ž>o=Êo‡kp˜µùÞQ¡ËöúQÕ×nÍ1õž8çmÀ•üÏ—æ;¦‡k|£Ìû£‡¢€;°xXhûí®¼èOü}ÝÌ@¼·ù¾O*ÔÈˆÛ ‰&ÂüÇË?)±6›áyl“\Ašw}žâÚñå{ž>o=Êo‡kp˜µùÞWEwéÚ¼¹ßo¥]vìÓP1éãŽvÜ _Ìù~cºhv·Ê<Ϻ+ýƒÂÃGßmuçBãîîbå¿ÍòyV¦DFÜxlI6æ>YùOEwi¾–É5Äi§wÙî-¯W¹ãæóܦøv· ‹Q¿‘ÈýåéÚ¼¹ßo¥]vìÓP1éãŽvÜ _Ìù~cºhv·Ê<Ϻ8z(°û…†¾Úë΄ÿÇÝÜÄ Ë›äò­Lˆ¸ðØ’l/Ì|³ò›i¾–É5Äi§wÙî-¯W¹ãæóܦøv· ‹Q¿‘ÈýåpôPq¡ËöúQÕ×nÍ1õž8çmÀ•üÏ—æ;¦‡k|£Ìû£>úËBÃ’K£¼Òqö‰ï§0\Ãó€¾]¸!NykOÀ |¢q\½QEQEé?§ko\Ì«¹–ÁÈ_SæG^ÿ ë2Èg 1ço– ý=kç>4¹ôàÿú2:úMLcŠòÿŠ÷3ÝI¡<‘ªM\¡9‹ú×Ê,—I{™L«.àe½yçoQšôŸŒÿºŸEF7­ÇÌ;å׉ßH|Ì7\Óæiesëogþ=³mÿôZÖÕbx7þDoÿØ6ÛÿE-m×J3 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFË^?^ÁûGÉCÓÿìþ–¼~€ Z(¤0¢ŠZ`¢” Z °˜¥¥  W) Å( Râ‘j"b—¸¥Å+–¢&)qJ;®h¢ ¸¥œMÍFNœ8 Mš¨ Å; R…©¹ª€˜¥švÚp^jnj 0/4à¼ÓñKŠW4P¶”-?»i\µ›¸úÓ3hJi§cÛõ¤éL–%%/©¢™"QGj(RRÑ@„¯·ü ÿ$óÃ_ö µÿÑK_WÛþÿ’yá¯ûZÿ襦#áî‰¤ØøCBÔ-4»{Ùô»6æ+tI$Ý3n`2r@'=Mu»­s~ #þ/sÿ0»oýµ»‘ê+‘ÏS©GB}ÇÖ£ž(î­å·¸‰&‚T)$r(eu#x ŽÔÌQFG¨¥Î¦†ô­;Hñ¾¹o¦XZÙBÚm‹´vЬJ[̺!@Àû ì+˜Ò?ä~Ö¿ìaÿ£në§®¨;ÅòVaEUQEQEQEG<Ý[ËoqsA*’92º‘‚<G®O[ñ±‹WCÓ^Æ6ž+aÜÛ¼€I#\;³‘~Q¬˜P2]—,k°®nþmJ÷ÅRYio¦ÚÏce­swf× Ë;È6.Ù#(·òwexy¹áBóSÑL÷溎îêÙÚÌhÞTòD)f#!ÆOZتzU¬Ö:]½¤íh^Ø>Én`ˆ(áBÆY¶€¸ÉéÛ ¹@Q@Q@'ûBê)§ÛèŸ;¬“C{*ÛÆÅƒ,jxÀ˜Æ£,8ÊðG…kú¥†¡%åÕ¤Ú‡¨Ý›¹íäUHac¼íbe È@r?)ßòûí5ÿ2·ý½ÿíð‹(­ç»D»ºû5¿&IDeÈ…QÕŽ0 dŒ• ¯“ĺ$þ,ñãË}ý™ª]¡ÖNs32Y­ôöQ}»ívr[Ïj$Mz« ò£¢Ç‘æ}™‚)26$VÁP¦N?Åš%žu`Öy–÷¶Ÿh ç‰ü¦É'šª«&#ó*…ç°˜埊ᶷÓ-É»ò-ô{»)ã\my¤‚7ÆpB‹ 2y|ß ‰Pê:޼ºµî³6Ÿ}{<–jÄLma’Þî*4€>ÑÊCÏ<œ~¼—G¶ÔòÇuÕ¤·–öžió¤Ž&Jq· ´DÍóp¥˜.þêV—÷nÓg’Îáà¾hff[M©$›œíùŽ_ ¹†Â¬áH>µ©C|l­­Ag§Ûý–ÝåI"ù!w i…Ú02Ä=F›ã]6ϰérAvgK)-Ë*.ÝÌšŠƒ÷³ŒÞÅÛø_Ðg]ÝW®EgÐa¦x“GƒN´kÈïõž•y¦BªygÎef'<Ê” Ý¸ýèþ5ÐTë×A©½jâ{¹C"…¥¶»‹Ë_›,îTï8Ü3ò)\7Ñ@©­x»Añ&…¬¬šŽ¥§A=ìDÇ $³+\êüÕš,œœ8t5çzî§ý·âOVò|Ÿ·]Ësånݳ{–Ûœ ã8ÎgÑ@êü8°{—2Zê±ØÛË,)w5ÄqCª¶¸™f‚VŒ$Q“nIm”Üe²ãð•”×-…¬Ý˜’+O±Ô¢º–us&넚(YZ$1¬d*œ;à°#iàè­ wLþÄñ§¤ùÞwØnå¶óvíß±ÊîÆN3Œã&º ~ꉩÜéñßéS\ZK,7[.p:G, 3° ó¤2‚vãl µ’ÛTšó^±Š´ô½²ºsÊnVbE†ބVÝ´€W&©Ãà­JãÃðëÏhñËn÷Hv*©—ƒ•Û’¶×0zDAÃ2+stWX|{¼Âšž›%ÜW©aul¦]öÓ2Èv¶cÑäÈ1rÄ¡‹ Ç‚.¤Ôo­´¬Dv1gœ$í°U·D±“iV ^5 ’¦à^ŠÔDf°Õ®ŸPÓb}5ÑÝ®”ÉpYÊþçnDq’AÆ0Fk.€ (¢€ (®£ÂÞ³ÔôíCSÔw´²–¥ò®ºÄ² šòäùWÊÛ´)fi.[ À½¡®éŸØž!ÔôŸ;Îû ܶÞnÝ»ö9]ØÉÆqœdÖ}QEQEQEQEQEQEQEQEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@gñ¥CO¢¥°.2ƒÝô?\W–ë:dmiÂÛÌ2’ ¸ÎyÉ#§¥z×ÅÏ-ïôHZG¥[…Wt«á½¯jóHþ‘=í¢[Lés—!—ŸâÚÎâ¹j|f°ÕDx;ðƒèzfÛãþý­mÖ'ƒqÿ?‡ñÓû6ßÿE­m×JØÉ…QLŠ( Š( Š( Š( Š( Š( ˜?hïù(vö ÿFË^A^¿ûGÉC°ÿ°Tú6jò CAE´ (KAI-RSrÒ)qKŠ\R-!1KŠ\RJæŠ (¸§Jæª"J8-8 –Íc S€§JMÍc§âœœŠ–Í£¡iÁiÀR…©¹²€ÜS‚óNÛN Jæ±€À´¡y§…§©¹¢€Í´»iûivÒ¹¢¦0-jLRâ•ÊTÈöRí§âŒR¹^ÌfÚ6ÓöûRí¢ãöd{hÛRm£mfG¶µ&ÚLQpöc6ÓvÔ¸£m¦E¶“mKŠB´îK¦DV­LV›¶ÈtÈŠÒâ¥+íM+NænDSvÔÅi»j®dàDVšV¥"Š¤Ì¥)¤T¤SJÕ&c(¦‘R‘M"©3)@ˆŠLT¤SH§s,Rb¤Å7W2qŠLSˆ¤"ªæn#qMÅ?˜¦fÐÊB)äSiÐÚ)H¤¦M„¢–’‚B¾Þð'ü“Ï Ø*×ÿE-|C_oxþI熿ìkÿ¢–˜™“à¦ðøwþÁ–ßú)kwpõ®CÀZ>“eá=ú×L³‚òm26â+tY$ÌjNæ'$sÞº­ãÞ¼¹KVwÆ:î´nµñïLž8n`’ âIa•JIŠ]HÁ#µ.qò•ôSŸkö °ÿÑ·uÔ×á=3OÒ¼g®Á¦ØÛYBÚ}‹´vð¬j[̺€3€9ö®Ú½_8j|L(¢ŠÐ€¢Š(¢Š(¢Š(®ÄRi÷4}.m;Ryå·1½ý¾­5ªÛ«¬Ò"ÁræÕ÷ lL“ÀÄò46òÊÉ;¢X£*Ètn dôäêEyþ¯*kþ €7…¼OmªiÈ“»Z]YÄÍ ‚hÕY¼üGžtË+»$¬ð¼ñO Åå$éåK5¼‹=Óܰ’9^7ÄŽK:ïVÚNÜp½Åcø^âÎçA‰ìl§³…%š‚à†‘dI]$.Á›sV%·Ää’I­Š(¢Š(¢Šùÿöšÿ™[þÞÿöxE•ÄV·i4Öp^F¹Ì—üÉFVã¯tô⾈ý¡,íïÛÃöò Vao¨MŠÃjùqÇ! ¸Ëd.ÆsÏJñÍsú~Ÿ¢êSÛÁ¨,Úvªšk\Ë*´7-¶RåT (ANÝÍ€ã=‰Šïƨ_ÜÜè:Tê‹›«\Üä¸È›"]á±+Œ †û¹Œ÷ñÅÄؼ´±»ºÕåY¦¼šÜ¢påØÄFn$†ÀäqÅjxOún±¤j·—æï}£©E‚U@U`¹¸pr­É[m€ÿ }Ä66OÀzkwiu¬I&¬©{,\²ÛË4ê–7ÙØ–3.ÀÄBeÀ0äñÕûÎó%•Œr\ÊÓjVOô÷d’62eÎܬÓÝyë0BíÇÕµgÕeƒý [{h¼›{h7l‰73 ³1Ë»·ÌÇï`` jÿ4{;Ë–¶¹¾¶’Ü#‘ÑžHâ¿(` +§¿Í´ç(Ú|²dLJÃÞm>çS™5XíN”º¼)qºbóì­1ŒÜyÙŸ»&9çáñ%äbÛìz}ÆŸTóÞvâyûÃÏ|œ/œîk^>7 Ônô2ÒÒÎòök‰£a!kµq*b\ÈÛIŽiTùe?Ö9 Vœz&s£É­E4ðØÃÂM“£L·±nªv€U„‘“œÜÀ+?Q°³·ðæ‹y ¦«Õןö‰®cÚ]®ù 9l=(BoO=Å›èÚP†]§}‚ưù¿é0ökí»÷­Ÿ›oEéYõè–W…lþ!øgNŠÇR¹K»>yRêâ"гÇùDy_¼Ic·#)´}úÇÒ´òââêîÓR³ÓÝì)qv#Y]‹. ×PÑÈr*ü¯—_,îäè«ößcÔnmvξL¯."ò¤$|铵¸årpxÉ®ƒÄžÔ|1§G{y.øÞQa¼‡’ ûÓBŠ~éàûc8å袊ØMx$V¶ÇJ±kpÒÚf`—R…*%”‰–œÁW-…›t’x”Ë{ í¤é¦+k"ÎÕ–GŠ×ç2nPÎKìí‰ ©ÜA` :(Içšêâ[‹‰dšy\¼’Hř؜’Iä’yÍušWŽž kX½Ôl žV[‹«ˆQX+Ás¨Ã‚#ÍÉÏ;°89ñõè–ÖZEö³á—†ÆÒÂÙô+ÛœL ª$…¯ rÍ…&R H[å!¶à&Ü%sð–Oö¬ÿgXÿgý“ì_Ù¿½ò|Ÿ7ÎÛ»›þ·÷™ßœñ¿-XOj‰§!oc嘤ˆ•‡g.Á© ¿ñû. ©ÆÏYs©ø^ËI†ûÚÝêVöó$§A´ºiBMyŒ!m±Bd$…9à ¹Üæ›hM®‡âøo/ô©uûh¥7 A*}–HïcM°ªÄ# ã#p9ýâ®ØÕ\°?sã‹Ë¸¥Žm/Ju¹»[ÛÂÖ䛩¶È®ÎKdn· ´!ÁŒ!É1§Œ%]Q/[HÓXD‘-¼_¾S‹î2L² ²2@Ì„chÆåè–v÷ÚÄ^ůÌó4Y•K18 U@³m«–ÚØÚ{ m3Ãvø‰æÓ¯®í?²¢¹µqwÝ7qFZ)L'vr>bˆËûÈÙw@'¶Ëa«Z¾Ÿ¦Êú“£µÃZ¨’Ü«–ýÎÜÃgŒ` V]w àý&ßÈڕìöúìÖ—7IjR]ñù/*h„,06XÊ›2I\'ÍcPð‡‡âÖ5;kYu_²é©±º’@®Ò¡Yßp¤Æ¨-Ø3âL©.mòÈŸÑ[$ÓìôýF1§‰þÉ4BXšYªë’7$Wz½Ñ[r2†BN…Ÿuï ¶¿¸µX¤”¯Øo„,ïðžwàw#½jiZÑÓmî-&°´Ô,î${k£ _1pctl€î1œ|Ç Ë¢€,_ß\jzÍýäžeÕÔ¯4Ï´ ÎÄ–8 ’zUz( Šé<¶2Þj]ØGu+é—­ ÊÙXJZÌû‚÷}ʘ$áy଼ÝWq7…´íëý*(µQý-Ìw·Ñ£¹ò"šC´ìC?ÁTù¼19>^;-MMZÒâÞ ž¡¡j‘ÛݲÌвCtƒ.CÐïjã u\.Šê,ô=. µÃý¹µVŠK„NÜD…†ôŒ¦&(C2Ê~s啈–ÇÑ4‰õíb 6Ù¶Í6í§É–^ŠXü±#¹àvSï“@ôVlj<9uáF;+Çß#Ä%ìóÃÁ$}Ù£F?tò=óœcÐEX±šÞÞò9n­~Õ d˜L…œ¡ˆçnq$d¤îÃ[iq|GñƒiPH«ý¬-Aâ;a7 Æ7©´ôPÚÊçôQEQEQEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@]ñµuy{·r ·òÇ^ÕÈi:Ê©6À[ÅsCÈ»¸e c¢±'‘èqÅuŸN/¼;ó9¸Á#?óʼ® }ï4ÒÂ’@ß~ñI#Ž•ÏQ®b–š£êO <¡Ðiöÿú-kb±¼"sà½ÿÔ:ßÿE­lÖëbBŠ(¦EPEPEPEPEPEPÌ´wü”;ûGÿ£f¯ ¯_ý£¿ä¡ØØ*?ý-y "P­:‚’ Z)ÀT–KE()@¥ŠW5Q p S€©lÕD@)ÀRN¥³hÀ@)@§N RÙ´` à)ÀS€©lÞ08)ÀS€â¥³hÀhà)ÀS€¨¹²€Ý´à¼Ó±N¥³eLh S€§b•ÍK¶Ÿ¶” W4PŠP)ûivÒ¹j™(ÅI¶¶•Æ©‘m£mKŠ1Jårm£mKŠ1EËmj\QŠ9ƒÙâŒT»i6Ó¹>Ì‹m!Z˜­&)Ü—L‡m&*]´Nä8âŽ*]´Ý´îf鑦•©±M"©3)@„Ši1ZiZ¤Ì¥)¤TÄSHªLÂP!#Ša1Ò*“1”qHEJE4ФÌ%")„TÄSH«LÆQ"Å4ŠŠiÓ2”HñIRM"©3†Šu%Q›C)§‘M¦fÐÚJq¤¦KBWÛÞÿ’yá¯ûZÿ襯ˆkíïÉ<ð×ý‚­ôRÓ!˜ |xÃüÌ6ÛÿE-noö®{ÁÌáÐ9ÿ˜m¿þ‹ZÚÜ}kܽæzѺ‰÷ûQ¿Ú Ü}hÜ}jyÊåáóŸëö ±ÿÑ·uÖ×áÂOŽ5ÌÿÐ6ÇÿF]×a^Å i£Ë­üFQEldQEQEQE‡£ê_Û2jšF£ik<öñÛηvmp¥ci í’2§2¾rN~\c;•—©xƒOÒ®ÞµË9@æ;K)®Y’a1PH` c;[ÁÀš.™ý‘¦ S7#K-IJÚIdijäáw;`H“ÉЪö7±jqÝB“¤oœ àx\`‘Ê8 :wõéV(¢Š(¢Š(À¿iid…ü.ÑHñ±[Å%X‚U„@¡ƒìkÆnuÝG[°²Ñb¶Ýƒ J‘4²É; eˆìØÇ˜øT 2玘÷ŸÚÊ:n’%û(]Ñ}„“û¬ëÉã I#ϱáý#Ä:ýµ®Ÿoik«Bð\,Ð\?ØÁ;ÉŠ8·ƒ·aÌÅ¥Rß›ysg>¥½Ð²–í ¾äBÌ),¾8Æ%)“ÿ=þ, «kÓiw¨Ú†¥&ŸqpñLÎb’gË'8.|²ry;3ÚºÍ#P»ÓïµûI.|8Ú–¥§Æ#A ™¶YRx›ar¾BþéŽÒväù€‡vÇÁZÕ°›Mš{MNÚHfYb+29Œ¸Y] ¸ã©QÉ  ·×u‰%Y_U¾iQ:¹¸rV@ÎáÁÏÞ $Œ\»¤Ôâ]yžõÛ[Ô‹ß KÆ7O›… T 9ùÀRFx8®òæëÃwºöº>Ï¡Áž«,Z:‘¤n+¢ŒÇ¤‘™’Ø“!1¨l|±’µÍøâ ƒÃò7öi¸›L-q&qDò ™Ôñª1B–PAÛX`~MJgÒáÓ‘cŠÝÌF3ÉÎÉ<•SµGFpg-×÷—vÖs]Ï%­®ï³Âò‘n9mªx\žN:×yµ”> Ò&ºµÑ£²ŸG»k‰™¢û\·[•·Ú¤ù¸†äPÈrQp»–m¢bÝ|ß 8x‚ØÙFñÚ]0­Æó32ó” ‘#($e,çz/ˆuíKÔmô[›»T‘ḹ¸´wGEMÈ ²‘„-0=NÏÆ½þ±“$V×wÑé«/ï9B$’6N@ãs uõ*tÍuš½r—~ ÓÖ/ÚÜÏd¶¶‘5½¡·ÝÄo·Ía°Hw»åS,ÌÖN Ùrƒ/\_Œ|íÌÃöLJ]lü¬+¬aýË0¢X%U˨çëbëÅž$¾ò>Ùâ VãÈ•g‡Î½‘ü¹îºäðÃ'r+¨Ð›L_F º[6•|/î8Zåï¶Nb–S"ü¢ •L‚ÞJ›¯¦yú3ˆ<8eÄp¬Ð•upÂD\ª±ØÞ«2°Bìêg‡Åž$·¼¹¼‡Ä¬wW[~Ñ2^È]£ ¹Ë`p3Ò²ãžhRdŠY&M’ª±×pl7¨Üªp{€{Wy¬Z隌Z¤wµñ–ÒàÊB«8”‹÷N˾¬2Vò÷‡Uè5ÏøCæƒR†ì0«öß Áä«rú‹¦pO0Ø…ç…*£å”†òtûfŸ-­ä~}´‡ÛL¹Bv±ѽ™HÈèT÷cûwXþØþ×þÕ¾þÓÿŸß´?÷výüîû¼uéÅu–ri[ü9y4cB¾Žâ1 yã[¡•« Á†8f8!‹ ‹\i÷M½ý¬žƒ^žÞ).šêÞßÈŽ15ÒÊD,¦0ûVÐíDódªÏ=[R‡K›K‹P»M>gß-¢ÌÂ'n9dÎ ùW’;JÔñŠÝžOúTîë»î[MŸáë·ñí~–ñê7)fûíVW¶âÛ“'iÉU'ŒrU~ƒ¥G$B¼±H‰2o‰™H»Šå}Fåa‘ÜÚ®iš±­ù¿Ù:Uõÿ“3ì–ï.ÌçÚ3ƒ×Ð×Iãˆï'Ó¼?wy}¦ÜÏ ‘µmoíæ1¿Ú'u@‘9Ú‚6@6ª0£ÅXÓì[H߇„^×Sí³›‰u•†ß+¸òÏ›þôƒƒ…*A €.k Ë´yö“ÅöiD•!Ý„lýÖùƒÏÊ} a¸þÎûy¦_%]˜ ÏŒ òØÎ3·rç—=ľ4ÒôÏ ë^Ó`žêÕîÝlµ yœ ­´R3ÞD·<¯™òÆ“[[kº4ò C¦GáÉ^À]Æ”[L[+ !Û<ì'~]´Ééšî±¢y¿Ù:­õ‡3ì—ügÚFq“×ÔÕ{ÿ¶hÜÿhùÿnó_íhÏ™ædîßžwg9Ï9¯@ñ‡ìu‰5Ý:;ôí7*DË$73‹¹ÒÞ)ÏÊmáÇ:¡Ë”9˻Ԥ¬îä]çRº½»K‹™D^ù.‚à’ù.&"F×k(`Ÿ¼Õµèî-mïu IgÒŸe´sLá¬ÙH@Nc ¨ÆÑéRZê ¾Ö'Õíµé5Xbižè]7Ú6*íb;› ×Â'åRGy¨jZ¯âOpº0h5‰†˜ê,¥ã»*îÄþõu¶bd-îÇÊŒEswßjÿ„¯Ã¿Øÿaÿ„÷^oØ<'íž{ù[v~çîyÛòç;¾mÔÏìG¡ÜÙÃw|ºCÊ¿h…$qHy]Ê>]ÇËÈÏ?'µWû ÇöwÛÌxµ2ù*ìÀn|d…–ÀÆq»—8ܹé5]H·:¶¤iѾ‹5ÅËE!cæ6dRËQT±$ãpó>Y/êë:<ðAÒ¢:|ÓÍKÚþ{”€Œ.>ÒU‰6 6P'<ZÜKoqÏ”’9«#‚<‚«¡kÙÝ^I¥_%­¤¦ ™šÝÂC vƲ@Áç‘]†½e¯üGâk‡±¾°ƒPk«TŠx®a»’Y¡ŽM…°¥RGe8%c*v—STôk©šÊ÷UÔõ;K2Êê!s5ñk»i&ýÚÄÍ–¼£sp¬Á‘ƒæÐêž¼µ¼·ž{+‡ˆMosm6ÒQWSþòœe8 pxÓÅKp÷ â]dNè¨ò ùw2©%A;²@,ÄÛ­Iÿ4óý'þ‚¿è÷ëý+§ý¹ýïøñ×?@O<×WÜ\K$ÓÊåä’F,ÎÄä’O$“Îj:( Š( Š( Hø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠùsàŸüŽ·?õàÿú2:úMÿV(Ê>;·>l¹Èþ¹W›5Çú:Ç®Ò2>_^EzwÇ’k HË´cŸúçž;×™Ã[Û»|Ê­ò…eåErVjã>—ðqÝà}úé¶çÿ!­mÖ'ƒŽ| cþ%¶ÿú-knº–ÂaES¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(æÚ7þJ‡ý‚£ÿѳWׯþÑ¿òPì?ìþ𼄠EÄP1KH)“- êJp©5H§@à*[5Œ@ pO¥³hÄ@)ÀRN¥³xÄ@)ái@§RÙ¼` ð(žCfñ€iÁx§NU⥳¢0-8-8 p-›Æ@§NœMÍ”…æœ8/4ൠ›F6Ó¶ÓœSÄ|T¹(m§„⦜ ”GÀëPæUŠ«iÞ_½ZHúõ§ùf¥Ìe//Þ¤ò½êÒDsOò¾µ. ¼¯z<¯z»å}hò¾´½ ¼¯z<¯z»å}hò¾´{@)y^ôy^õwÊúÑå}hö€PxºsMòýêûÅÓ­7Ë5J L|u¦ì5|Æpj?+ëT¦)æ­[hþj£æ©HN%b´›jvB 0¯5jD8‘Å4­LGÒ*“2”H¦‘SM"©3@„­4­LE0ФÌe´Â*r´Â*Ó9å)¤T¤sM"©3 @„Ši1Â*Ó0”ˆ¦‘R‘M"©3 DˆŠi!Â*“0”FM©¦‘T™”¢0Ši§‘HEQ“C)¦ŸILÉ¡µöï?äžxkþÁV¿ú)kâ*ûwÀŸòO<5ÿ`«_ýµDHâ< £é–~ѯ­tëH.æÓ ógŠY(¤î`2rFN{×Q“êkŸðð…h<ÿÌ:ßÿE­mdz×ÎTæî{‡º‰²}MG4QÜÁ$ƲÃ"”xÜnVR0A¨#µ7#ÖŒZŽb¹H<¦Øé~/× Óì­­!k 1Ûı©o2ègpå]åq~ÿ‘×\ÿ°uþŒº®Ò½ü3½(³Å®­Q ¢Š+s¢Š(¢Š(¢°ÓÄRÅ¢K¢jP<É4‘Ü»@bhâ*þYK€K ®~aÀÁÆåÅø‹R›Ã~*¢Üø~/¬’Ý×VÕ£;DîÊcýÓ 3näçrýÝ¿?i\}Ö£u§üC¾û}©ùºU¯Ÿög<œKqåÿ¬‘wnÝ.q÷v/]ß(A¢j_Úú<ÞeŒžnïšÂëí0œ1,›WwNx9³Z^Æâ[»8çšÊ{)9‚r…ÓŽJ3/=x'¯¯b€ (¢€ (¢€>ý¦¿æVÿ·¿ý£^3ÿ®¶4C«>s©tXËÀàÊ­’N0È©sÀ ôéìß´×üÊßö÷ÿ´kÏ#ñ~‰j²¬:›W»yîITÛËÌL¨7|å>ѸW~1ˆñ’ÉÛhZÅä =®•}<-³Enì§{˜Ó?‰Õ”z° r*1¤êM`÷ë§Ý›4Ew¸·–ªÎQIl`ÊÊr¤uÜGã]ÏAM*Ò I’+'µY%D˱Q]äùAkÈÎÞv€Ã-´¹âoè÷ooªÁ{},ÒÚj‚ ;ËC_k¸ºRÒ8ì“dŠÅB…A»çúŽ©¨ë–Vº$sÉ©¼ªm„ µÃŽCãn1ÙÆr1Z𯉮\øŸR¶¿¸»¿¾µ·77WRÃrÌc ‰#(ÆÕ”‘’šÏðÖ¥â­#T¸Y +Øn$XÀ,U1$ àzŠ“Ã…ž™­ïÌëk%¥Õ³´‰|Ø$ˆ0RÊ ƒŒŽ”_ì·—zš‹Üoµ°–+5Ü’žo› :ÊHON[¡É¨ï4KO·µ¸½Óîí »MöÒM "̸(Hà 09£Ö®YêqøKUÓ&3­Ô÷v·6å# å¬ÊÊİ+ÄÙû¸ã9­ÏøÆßÄ6÷"ݤS}{öé uµºÂØ|)’0^à5€wÛÐ’¤·ÊÉßX^i—’YßÚOiu7á o–Ñm\Ê‹Ç,˜È2òGqë]$Þ1°ƒQÒ5;o·]Ý[jßN“$vþ`Œî #¡"âL³þý‘ærÁ·‘èþ Ðô{{í2Þ[¿²\<Ë­*Úí™ãŒ yb&Æíìv{9 Ë'Rk¿]>ìÙ¢+½À…¼µVrŠKcVP{•#¨¢óIÔ´û{[‹Ý>îÚ ´ßm$в,Ë€r„Œ0Ñê=k¼Ö<[a=Ž›©K¨_\_¾Ÿ¨ °Äoou5Ò³É"²í“lŠÄ†à©÷AyÿkÖ¦[K}%Ô’‰gi¡Ž,€….dß÷̨çsîݸå讃Ãýއö¯¶éŸnó¶lùmŽÌg?ëíåë‘÷vôçîñË„Ûo Hwfå¨çŠÇ±­^h7ZN—y©M>ŸnmX]Y$*êfš]à¬ÎAÌ¡vã±9íTìõŸ²xKUÒçI/îíem‡ñije[ž~gŒ‚>\ð@ ü/¬'…áñØgm2Yd‹ÎXœªl(73chRÏ´òÊõI§øC^ÔuM"Át˸Vp,äžT‘N pvòФ1#8Ö¦¿âM^þÕ2Ç|›µ[íBÉUPyŸhØäìÙå«`ß’¹O½W&ñ®›m¬¾¯eÜóÝë°kw6ó"İ´M+y(á˜È ˜åSÚwa@8»ë Í2òK;ûIí.£ÆøgŒÆëÊžFAñªõsRj\*ir]Ë  -Ò,m#dœ„RÁ nlàœŒí–~'Ó­¼.ÚTš?™tb’1u²Ï‚ŰrÖ­/ò×]Ô6««é¶W…&a`þsÊLrÉ]ÉG’ñ8>:@ªúÇ…ît{y¥’îÒwµ¸—±B_u¤ä6#}ÊÝÈ2…×ä<ò¹è.ï4–(òù€´dîU 2õ¿GÃÑiaþÓ$²Çwyu-”0HÒª:…ÝZ_õŽL’1f$p¤1p ; 'RÕ_f§ÝÞ9p›máiâ¬À| óµãÑXö4 'Rk¿]>ìÙ¢+½À…¼µVrŠKcVP{•#¨«–zÏÙ<%ªéó¤—÷v²¶Ã„xâY²­Ï?3Æ@Á.x Wqâoè÷ooªÁ{},ÒÚj‚ ;ËC_k¸ºRÒ8ì“dŠÅB…A»Çê^ñ&—©ÚiÓh×ÏuwËov²&cYT²Ã÷H5Ÿg¡k…á³²Ò¯®n„K9†ww°_hÚC)¡Ü=k _hÿkRhï¾ÜÚSéòF<¸ñbÖªAÎ_qØäávÃd©â/è>"VóÁ©Gi%Á»7» ›ÉV>X„ —`ù¶”?#ƒšâßBÖ#³º¼“J¾K[IL35»„†@@(íŒ+dƒÏ"¤¼¶Ö´ýÖ ë;»}>éþÕjn-ʬ‡hâf ”ÎÓ†Âg;WF±ã +S:Õ¾¤%¹¸»{HšÃF³Hì1p|i¶F $FËœ‚á’;é>}¥Ï—}}'še¹I ·‹xØÁD„¬‘ÜÈ Œ|ç‰\åó’Ëå€põÐYøBþûGkøe€È-$¾KLHd{hÙ•åÈS¨(ã êI\K.êþ$Õíu­F;›;±F±Ì{` “ŸÜÃ÷Tž:ãnYøÂÚ YÚH÷k=•ÕšZG yWa:‰^]ÁArûP«ƒ‚¾c`‹«·×>y¶“Ëi¢h]‚Ûïz®GÊqŒ©e<1½U·\g}€É›Q/œ¨Êׯ Ry\Œgݵs«ŠôPEP‹«ë‹ß \I¹`‰a‰B…TAØÀÉ%«31É$šôQ@Q@Q@Q@‘ðOþG[Ÿúðý}G¦ÿ«òçÁ?ùnëÁÿôduõ›þ¬P–|p¥ç‡ñ)BEÎþ/õ\W”ÝÜŸ3i`œ^¥ñáK †Ÿ´`žßêëÇlåH_›©Ç5Í5ïõ§ƒñÿNƒŽŸÙÖøÿ¿k[U‹àü íéýoŒÿ×5­ªè[ îQE1Q@Q@Q@Q@Q@Q@0þÑ£þ.‡ý‚£ÿѳW‘W®þÑŸòPì?ìþš¼ŒRf‘ا ¥©6HQJ(à*[5ŠS€  p-›Æ"N€)àT6tF"O€)àT6o€à)BÓÀ©l錞(ð*:#§Jœ¡³¢0 x¡iáj[7Œ…§§ªdô©V.:T9(‘$Ô«:Ä7*d‡Ž•”ª@#àu©g¬,Y*aÀâ±u¬"àu©D\µdB08§¤]x¬ÝAV2ÖŸå}jЈdqRíPêGÊúÔ¾WÖ¬ù>Ôõ<RêOÊúÑå}j÷”=(ò‡¥O´•õ£ÊúÕï(zQåJ= |¯­WÖ¯yCÒÆj~Ð ÷>´ß+ëW¼¯j<Ÿj¯hŒQù_ZÐh¹Æ)¾HôªUÎh¾cÖ¢xŽkKÉö¨Ú O­TšñóÞ¢hù­&ˆÀ¨|ŸjÖ5Í1àTey­‡åßÿE­lîµÆxgÃ~ŸÂz<ÓhZd²Éc;½¤e™ŠI$rMu»ý«åjÉs»w>†œ_*¹6áëFáëPïö¬ûÝHÔæ_éVWrªì=ºHÁrN2GNOçY©.¥¸¾†×„È>3×qÿ@ûýu]µy÷€´û;Åšô6Vö‘5‹‚%E-¾ègx•w³Â·6òÀæ@’!F1ÈÈÀŽH*}Áv¯§Â[ØFÝk+œ½ž¿}¨øêÒvþùôˉ`}¿5̱Ë2ƒÿ<¶É…ÕãµYü§’EfTU3„“’€|‡žW9ú¶›6¬ßiw Oeq%¼%K#$dŒAZ‰â¹"ó¢‹GÒ’Íü¶KO%š8¥~É~f-#2N$.¤6 •U —«jSk:Íö©p±¬÷·\H±‚3±bI8Éõ4Ð?€oµ­4»mOM¼¼»DšmL®Æ‡Îóˆòò\ü„y‡Œ!I/ü¨i VöÓO´D–îê+„W2(ÊóA>L¿yù ÎKSºñd÷ô´Zu«Gh¶Mošc–’U·»71|„«C|Ô'ŠÞ/:(´}),ßËhí<–hâ–=û%ù˜´Œ<É8ºØ*UT(¤^6—÷֚Ƨi öö÷òCmÉqöd˜oCå” æBÀ†*Ä)àeIäìl/5;Èìì-'»º“;!‚3#¶' 98ŸÂºKˆ•ÕÅåÔÖ:kÝ\¥Ü^{BÅ¢†àÈÒF™l( 3°loçŠåO7c{.ŸyÔ)È™Àž™A£‚§¯qÇ^´&¥¤êZ5ÂÛêš}ÝŒìÖ;¨Z&+’2qF}S«š–§>«p³ÜGhލ [H­×'•TÏ\g§ ªtÜx¿Áv~Ó¯'ž;½?P[âž`í:°”¤á/’­ä±T,ìUÈ]¬ü=nk(¹Ö-æŠKKHêà]ÞË}×s€Ø‘÷1 y!Â_œñÂâž·ªÿmëê?`±°ó¶ÿ£XCåB˜P¿*äã8É÷&€.Cá{™¼4uÃwiÙ#˂젒»ÂùJøV"6urÂÉ»¶-|@öz<öéö&Ibh ÙFyE· 0ùä3£2¤Q6ãÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP¤|ÿ‘Öçþ¼ÿFG_Qé¿êÅ|¹ðOþG[Ÿúðý}G¦ÿ«ãß´"oÐ}§8ÿ¶UäÍŠªÀ.{㯧ҽwãúoºðâ’ ´‚Íœ/ú®kÇJîP1ÎÐFNqßéXÏqùŸ]x0çÀ¾>ºm·þŠZܬ_°è ¿téÖäßµ­ªÕl&QE0 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>bý¢ÿ䡨Ø*?ý5y¯\ý¢ÿ䡨Ø*?ý5y ©fÐZ )@ S€©fñBNSÀ⡛Š< @)àT6tB < §PÙÓ€ð´O¡³¦1)ái@§PÙÓð´O¥³¦0 xZP´õ\Öm€Š¼Ô©&Ÿça#ÀéúVr™ªV#HÈÅN‘qŠ•bãÿ­V1ŸþµsÊ ¬\äS¬'5*EÇÿZ§óœ~•Œ¦"‹ŒqùT‰æ§XùúT«>ßJÆUbõ§ˆ°jÀ‹œÿJ—Êã§éYº‚*ˆr2§¬]±V–>1Òå{~•›˜|š_$ÕµNÄ~”ï+Ûô©ör¢ÇŽ´¾Xöüª×•íúQå{~”¹Âåo'ØRycÛò«~Y÷ü¨ò½¿J9ÂåBƒÐS $š»å{~”y^ߥ?h(ù4°?úÕxÆÿª£1äôý)ªr’})­nõ|ÇÓô¨Ìy9ÇéTªDÅŠˆÅŽ VƒGž1úTOl~•¢˜ÊV=?*…¡;Mh´}±úTM?ýjÖ35¢íPÔo>ÕãëFãëYóÊix0çÆïýxXÿè˪ðI'ÅúöçÂÇÿF]Wy_]ÿw‡¡óX¿ãËÔ(¢Šê9‚Š( Š( Š( ¹ûÛÝbïÄ3é:MͧÙm!¹’[»W¸ó<וB€²G·o’NIlî1ÏA\Ýý†‘­øªK+­29'¶²ŽIîw˜Ùâ‘ä ÛÌ‘¥‘ÎÏ»ò¶NÐ êSjºOŸp±‰ã¸¸µÆWhfx‹€I*¦í¹8Î2q“©Xþ–ÎM%±Ó Ó¡†Y­ÚÖÝ@Ž9#•ÒM˜*]Xƒ€H9 ElPEPEP‡þÒ+xB¸'çK© ££ 'œd}ÑÀ8õIªizEÞ¿b–ún¡k`––¯y,l%PÕeÙØp®]ðçÜ!ÚTúí-uq¿‡-ãžT†o´ù±«²`ÂFáÐàò3^ º¦ ‹f©t«då홀·bCœü§ Œr3@|G§Ùéú„cOý’h„±4² U×$nI®õ;{¢2¶äe ;þÑçÑôÑæ_ißiWz†íÈ!‡ÈkƒŒcsïX6ã+°üÙ|í^^öþóS¼’òþî{»™1¾iä2;`2Ç“€ü([ûÄòöÝξTOx‘¾íÈ=ï|އszšôM'Âú ¯mmšÞîá4ÏÛi‰<ÈÉxÎÒ _/ä@Ð’c;÷ÆáŒŸ?Ô£…nkK+»[9Ð=ºÝH$fPJ’"•ÆBŒ`Ž Ñy«jZ…½­½î¡ws¢l¶Ži™ÖÀ@Na@Àô•õýæ§y%åýÜ÷wRc|ÓÈdvÀe'øPHÏ¥Z|2“NêW÷³Á%ÓI!:í d”‘Ô“’ņu$ð^Ž÷:ݬ/|’hrÜÚÜHó# ©#¶º‘]T ò×u¯*K’\ž Ï3[¥»K!#,v«0ˆ!Tßhô«’ëºÄßaóu[é?³ñö-×~ÍŒcËçäÆÕéº=(¨o hú_„-5Íb-TÍ4VÒ X"ó<é/ù™ÅÙo†Ãg$c u!ðv›¡j—útö·z¥Üzf«8ºV´À¬ñbNøCÞ¸gAÉ\·ŸÝjÚ•ò2]êwï½–i™ÁmÎÙ9=wI!Ï«±þ#™»¬4SDu[ãÒ¼ò¡¸|I#©Gvå™Y”“ɃÁ  ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX +øç›q¡ ªNÛžþÙ×m:^\ÄŽ$^­Î z÷Çv qáòHÿ—Ž ëþ®¼’êhf¶h¶ŒØÆ?rÍ¿ig±I­™õO‚¿äCðïýƒ-¿ôRÖíaø3þD_Ø2ÛÿE-nWR%…Q@Q@Q@Q@Q@Ts̶ÖòÎâB‘¡vÆÎÄžA,}€$ö  =ÄókÑY\ÅáÝVÞÆò%š;¹ÞÛfÆ]ÊHY™ùþüãšè+ÏΕ¤økLðüz¯}5Ô’ÙÅd«K8¹·ó"YYa.ce³1*˜Aó ¸z|ÇûEÉC±ÿ°Tú6jòA^·ûEgþ†?èþš¼”Þ¡4¶S€¤žC:b…ž ð*:!@§¨¤¤¡³¦*@)§PÙÕŠ< iàT6uB < §Y¶t < ©U2j:cUÉ©Ò>œ~”äŒ U˜ãéÁ¬e3A© cô« >ßJ|qtõ«)Í)€ØãïŒ~2EÇOÒ¤X»`ÔÉ|ç”Ä1cÿëTËl~•*Ä:b¦Xóõ¬%1,|õªU¼uö¨<玞դññÐñUÞ?þ½oŒÌxÿÎ*´‘çœ~•¨ñž:ÕY"ž+¢šéßúT$Uù"5YãÁâºc jåR)„Tåj6ªf Â*b)„U¦sN$,)Œ*fZŒŠÑ3šq""£"¦"˜EZg,âBE0Š•…0Š´ÎYĈŠa©H¦VŽiDŒŠi§‘M5hÂHe}±àOù'žÿ°U¯þŠZøœƒê?*ûcÀŸòO<5ÿ`«_ýµq9*ô<»Áú^ŸkáÝ*îÞÆÖ™l!ó&ŽW|¢“–''šèr}kà ?áѹÿ—?ôZ»‡­|5zÔ•ûŸYF¦­ØŸ'Ö™,iO’¯$»…Q]g0QEQEQEV^¥¡Ã¨Ü-ÂÝ]ÙÎPE4–’ÚxrO–Çã$ˇ\¶Ö]ÍJ(½¾g­¬~\)’bÄ’Iff9,Ä’KI$’I5bŠ(¢Š(¢Š(çÿÚkþeoû{ÿÚ5àô?í/i#éþ½|¸¥ž&òK„#ß!ý+Ä´ï kz–©¥X&s êŽÖI uGS‚\rŠbFp9  Z*Åí…æ™y%ý¤ö—1ã|3ÆcuÈeO# ƒøÔ‘é³K£\êŠÑù÷Ûº’w‘de#Œc6yî:ö§Ejê¦ãOµ†Âîk»û´Áo´žc!-‚Q¸RÙ]îA;]þîyâ[YÑ ´kÉ3² ›ÃªHVpÄmùÔ’4ŸEl?…õ„ð¼>#û í¦K,‘yË•M…ælm YöƒžYXvªwšN¥§ÛÚÜ^é÷vÐ]¦ûi&…‘f\”$a†Që@è«Öšeä–wö“Ú]GðÏ× •<Œ‚ãRG¤êSisj‘i÷o§Âû%»XXÄÇ øÀ?2ðOqë@è­ÍcÂö…ge{¦]¬÷©¶_!ǚΈÛ* :— Àg ÅWךýìDÔâ:£Û‹Wó™ ¨+Œ‚UY€îž‚€2è«‘é:”Ú\Ú¤Z}Ûéð¾ÉnÖ1#qÃ>0̼ÜzÕ:(¢Š(«67äv¶±ù“>H‚€%™˜à*€ ,HITš¶›6¬ßiw Oeq%¼%K#$dŒA@袊(¢Š(­Mk@¾ðù²MAcIníþÐ"VËD<ÇŒ«ápѶWªô8 _MÒu-fá­ô½>îúuBí¬-+È!A8É>â€)ÑW#Òu)´¹µH´û·Óá}’ݬ,bFã†|`™x'¸õ©%ѯ#]+ËO>MR/6Ú(AgoÞ¼Aq¼Z3€3Ôwâ€3è«Öšeä–wö“Ú]GðÏ× •<Œ‚ãU袵5­ûÃæÉ5%»·û@‰[-ó2®?…ÃFÙ^«Ðà‚]Q[—¾Õìotë)aíwÖæáa ªò# IÀŒ¯”å²~@í¤0tUÍ[M›FÖo´»†§²¸’ÞFŒ’¥‘Š’2ÆG ªtQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅxÿíH¹ðÞÐKfäŒÛ*ñ9$ÅðR9=y¯jý É[2œöŸý¥^En’B…Ý#‡¸¬dí+…Ï­üøA|=ŽŸÙ–ßú)kr°üƒàOc§öe·þŠZÜ­P0¢Š)€QEQEQEQEQENÏIÓtû‹«‹->ÒÚ{·ßs$0ª4Í’rä ±Ë“ê}jåPÌŸ´Oü”;ûGÿ£f¯%½kö‰ÿ’‡cÿ`¨¿ôlÕäâ³–çeî¡E< hð+6uEž õ 0ˆåð)SÔT6uÂ"RM¤³lê„EžSÀ¨lê„Ež¢€*EZͳª“Ò¬G;RD¼ŒU¤LV3‘¨èâîEZŽ?j#¦jÌißµrÎb"ç8« ¨§F™#Ò¬"µÍ)€‹ǽN‘þTåN3ÅXHùÇÏ)ˆbFbÁÎ)Êêp˜úV˜ˆÖ?n*EÚ¤Uâ¤UíY9äF±ãµ• S?J…ãêx­£1™Ï·Ö«´xÏkFDÀÍ@éŸé[Æc3^>ÄUi"ê1Z.œÔ&~µÓŒË’221ÅVxñÛŠÓ•=j«¦=+¦–éÏ¢"¯Ij¬ëÏÓ\M\¬E0Š˜ŠŒŠÙ3 Ä„Šc ˜Šc ´ÎYÄ€Ša1¢g,âD£aSLaV™Ë8‘L"¥"˜EZg,âDE4Š{SMZ9¤ˆÍ}­àOù'žÿ°U¯þŠZø¨ŠûWÀŸòO<5ÿ`«_ýµ¬N*ëc˼4Ãþ]þ¼aÿÐjoõÎxSO°µÐ4˨,m¢¸’Ê/2hâUwÊ©9 däó[Ûý«óìD—µ•ŸV}¿gö%Þ=èÞ=ê-þÔÉV9¢x¥dÔ«£Œ†¨#¸¬yѧ)Ñ|?9ñV¿ÿ^6_úÍzyŸÃ+Kx‚+;X-£6–LRÂwÜóßùW¦WÞeÖú¬-Øøìuþ±;÷ (¢»N@¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ãÿi;«uдK9 ¢i'–h¶ *v1È#‰20L{×’ÿÂaagªÿjZCs<×ÔÄðL«ÄÑ4å+‚ÅÁ2‘¼ªãh;Np=+öšÿ™[þÞÿöy‹¼3§è±]5—œ¦Öûì¿5ìW^hùþfòÔy 6}Çå·}Æ sRj\*ir]Ë  -Ò,m#dœ„RÁ nlàœŒí,õ 8ü%ªé“Öê{»[›r‘†FòÖeebXâl‚}ÜqœÖ=Ö[x‹M‚ßFb.Ìöš=þ:yK·tÂçËemÙ#7v@ÆÞ7fµ5?hú§Œ“Rd¾†Å­5+i…EûL—l¬xå27C{çôPä:–›/…SL½[±=¥Ä÷»ei’$ñ9@†Ü+oÉ_“ïUÏkÖ¦[K}%Ô’‰gi¡Ž,€….dß÷̨çsîݸåè  ßÙê~#»¼°»ÕnídÙ²mZA%Ëaì88 ìhYëÖø]¬ç–øÞG‘@‹ !rÙ)p‘#!Ø4%]sŸ•œ2rôPiiâ­*ÛX°Ö<›³x,–Âth£’(Qm ®õVȘ‘¶M­° ;ƒn]Ké:¯…õK+­núÚÔKc m:Þ'ÝÈGÙ£‘c"“ó?Í´œn|ÞŠî5Øj°j·Sýº+Ë©nd‚ÝR6òLÎìB\‚²,x‘•¡(èùsò´€§EQEbÅ,ä¼oçž SòA•׃Œ)eœõç¥tšçˆ49üU«j–š\z¬ÃÝmÕ#–·fwb‹äO†aóÎ:øz.’úÞ¦,£¹‚Û÷RÌóO»b$q´ŒNÕfû¨z[ð…ÞYëéÚ‹ÁÑé÷Wh¢b<Æ…d€„o™) Þ[m|2±’XÁ¢Yí$ÔC»4ZmÐÅ¥€.[lM¹¦Ãd±â9Q¸Ê+“®‚?ÞK£Ûj ycºêÒ[Ë{O4ùÒGH%8Û…Ú"fùˆ 8RÌ Œ{ ÍNò;; Iîî¤ÎÈ`ŒÈí€IÂŽN'ð  ôUÍKIÔ´k…·Õ4û»Ù¬wP´LW$dã Œû؇ÁZ•LJáÖ!žÑã–Ýî<ì$US/+·%m®`ôˆƒ†dVY­ôöQ}»ívr[Ïj$Mz« ò£¢Ç‘æ}™‚)26$VÁP¦HÏ48ì%ÔA’æ'KvŠ®[[¬EÞé$Sq,a%!­¸Ø Ç‚î w}qÝä“Ãe”mŒAr‰€Ù›ž¼“×ÓŠé5[Ÿ ßZèv±jzÈK vµ•ÛK‹%L³K½GÚ:î‘Wi#€N„óòY´Ö÷z¥¼‰§Åp°þòUvC vIn;c~Bòô½ãᕚßOeÛ¾×aw%¼ö¢A$ת°Ï*: ŒygÙ˜"“#bEl dâü_¦êÞ*ÔuM.[·‚úâK¦[¨&Ù¶ ®á€|ÙçXuÐx³D³Ñ®¬Âo2ÞöÓí<ñ?”ÂY"dóUUdÃD~eP¼à3sôQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅx÷íBÜøpžƒí?ûJ¼wí * \JõïÚ'>o‡p;]í*ñ8ÜmùºÖrÝÅc쟌xÃÀ¦[sÿl–·+ÁœxÃàtþͶÿÑK[u¢QEQEQEQEQEQEQEó/í?âáØÿØ*/ý5y8¯Xý¡óÿ ÇÈ*/ý5yH”·;ðëÜBO‚žfÙÙ("Šh ›:¡@©R(§¨¨lë„G(§HH¢³lë„Ež "ŠÍ³®5b4àdjsV£Lc5Œän‡Ä¼ŒU´LcÔÓbLñV£LcË9ô^™«1¦y¤DÅY;×,ä!Q:U„NæˆÓjÊ'<×4¤!?:°±ö¥Uüêe^+žR%±;Ô¡qJ«ÍJ«X¹ÊCUx©{SÒ<þ52ÇÚ’M˜ÊdJJ©ØÔªH©ØÖ±¦c)ˆðiá=*q)Á2x­U372„zS‚Ú§ ëN‚kEL‡2¿–(òÅYò}éÛµW³'Ú<±G–*ÞÃíFÃíG³hTòÅíV|®zÒñÞ—³9P§åMò…\)éM1÷ÍK¦R™H¦~”ÆLp:ÕÒ•Lt¬¥Lµ2“'sQ”Ç&®”â¢tçÞ²” c2“/çL+жéϽDÉÚ³ÕFe6^=ª&^jã//5¤dl¤QuãP:õ«A×­WxñšÚ2,ÎtÿëUižkIÒ«Ij脆fÈAªÎ˜<ô­ƒUx⺡!™nÅT‘xæ´äŒU%N™®¨Hfs®*"*ã§qU˜bº¢É’¹Æ3 …j™Í8‘0¨ØTÄTl*Ó9gÂ*R)„V‰œ“‰ a©XTf­3’hŒŠŒÔ¤S hŽi¢"+íOÉ<ð×ý‚­ôR×ÅŒb?_iøþI熿ìkÿ¢–µçâ7G’øpÿÅ/¤ÿ×”?ú­=Ʋ|:Çþ'þ¼áÿÐin>µùÝeûÙz³íh¯ÝÇÑn4n5ãëFãëYØÓ”é~ø£_ÿ¯+/ýæ½¼ßáÁωüAÿ^v_úÍzE}îYþéOÐøœÃýê~¡EWqÆQEQEQEQEQEQEQE|ÿûMÌ­ÿoûF¼oYñ,ÚÂ\¯ØlìÅÝÏÚî¾Íæ>Q» w»cdœ.Ìr=“öšÿ™[þÞÿöyïâÓä‡X6QC› \Zål"´òyß»_/>rŸ+ï> ì{`‚¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(晩M¥]=Ä ;ÛÏnC‚FÙbh˜ðG;\‘+rçÇW÷ž!Y¹²±–EŠê€¬‚7K‡¤þ^ 0À Üsü1§ÙêzÑ‚üNÖ±Ú]\ºÁ ÛÊ‚IB†*Àd Áë]Eß„,4?\i­,÷ ÚV£$nD,¶âæ2Ä2°*ÆÙ˜†O1pĦæåáñ%äbÛìz}ÆŸTóÞvâyûÃÏ|œ/œçØÞ˧ÞGu @ò&p'&CG(à©ëÜq×­uþÑçÑôÑæ_ißiWz†íÈ!‡ÈkƒŒcsïX6ã+°üÙ|í^DÒ'×µˆ4ÛfÛ4Û¶Ÿ&Yz)còÄŽçÙO¾MG©jsê· =Ävˆêµ´ŠÝq’yXÕA<õÆzz Ø´ñ®¥g£G¥Ç¡-ÚÜ3#nÚËt¤ýìg²öþô9§âO]xcQŽÊñ÷Èñ Aû<ððIvhÑÝ<|ç%—‚´Ûß[êk=Üwe-Ã’êÑî_¶:€»Am‹)ùŽLÁ¸ µÀ2î|qyu©.—¥3Ov·×ÖåŒ÷!d_5òÄ™Kyxòò£pØz–¥6«p·7+¹(Ó(!§lŸùÁr0 ÝŒœ±f=¥ÿ„4{X¯cK-rI,u´ÑZâ)Aw!Yh¢òÇÌ8ÛËÞIp$5rzþ›ª6ŸI#À€K9#dì~mñqþ¨©]¤“¸aøÝµ@uûÈ4³§$:i€£&÷ÓmÞ\6sûÖBù烻#Œc²ë¨³ð.£}áv×ã—«’•û ãp…ýâÂbþÎüä`ã—  M+Z:m½Å¤Öš…ämtd æ `Ž nÆ3˜ä?ˆ®. ÖÅå¥ÝÖ¯*Í5äÖà͇.Æ"0q$6#Ž+cÂfÂÇÃÚ¾³v°-®íaU–Ö;†•'fTx՘ƇÌaòª¶7±óüO¡½§‰¼K›a?öf™¨K :#:[§šÉgçÆãÎ;Љƶˆ»Hq  0ËINi¼?máíÕŠ;cv–€ÜÒé¼ËøÉ6Ø¡ Œ6€K’\€pkã=nóDµ½ž×L¹—xµ†â]§ï7D€¹ýÛy§p9ݵI'Ø“ÇWï;Ì–V1És+M¨Y?ÓÝ’HØÉ—;r³L?uåÿ¬8Á ¶4ðÍæ©á«ÿ­5\.`6ñJÌDaÁB XXÂåƒ|£ ^‰>áùµ]fÅ"±Ý¡êÅÁ´T†[[É,{çØÖÑiî!”i<ŸVÕŸU–ôh-mí¢òmí Ý²$ÜÎ@.ÌÇ.îß3½€õÔxÐXJú-þŸ–·ºy–Vòc‡Íu¸š-þ\`$yX×å^˳rôQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅx×í3/‡íçÿiWŠÙ€—dÛ·<î¯qøÿ–'jý§8ÿ¶Uä ih•® ~F#G¹¬§%{>µðYÏ<<}tËoýµ¹Xž |áõ8ÈÓmÁÇýsZÛ­ØQEÄQEQEQEQEQEQE|ÍûCÉC²ÿ°T_ú6jò+Õÿh_ù(v_ö ‹ÿFÍ^T¢±žç¥†^â)Ê)©dÙÝ*Š‘E4TŠ*:áÊ*EÕ ›;!@©¦RY¶uB#”Tˆ 4Õ¬¢däÖRgTQ"'95n%õ¼$hgHHªÎ¼ñZ2/çUdSžkª›"zÕIPŽÕ¤ê{UYcÎ1šê„†eȃު:+NU8éTäQŠì„†QaÍF¬:àÔL+¡39Ä…0Š˜ŠŒŠÑ3’q!aLaS0¨˜V‰œ“‰¨È©ˆ¨ØV‰œ“DDS HÔÂ*ÑË4DE}£àOù'žÿ°U¯þŠZøÀ×Ùþÿ’yá¯ûZÿ襭©žf+¡â¾Óìmô=:æ;x®$³‹|©«¶UIÉ''šÛÈõ¬Ÿ°ÿ„oKÿ¯8¿ôZ;‡­|våVM÷gÛЂT£nÈ—#Ö™"G4Oª¯©VF PGqMÜ=hÜ=kr'»;[ø†+;hmã6¶LV ßsÎ~z…y§Ã3Ÿxƒþ¼ì¿ô;šôºû¼½·…ƒ}„ÌRŽ*iw (¢» ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(çÿÚkþeoû{ÿÚ5ã~ ÿ„£m·ü$ŸÛù¾Ïý£æûnÙ¿þœ{W²~Ó_ó+Ûßþѯ=ñ½Í«C¬Ž›»ÕÄð‹ ±qö¸Ç™eùßc ë€6æ7Êv Q@Q@Q@Q@Q@Q@Q@C<ÖÎ^ d‰Ê2F*J²•aÇb¤‚;‚Eh[êÚôÚ¢^Ûj“꤮“Å3™Q~y$!È4ŒÇ݉êjÇ„¦¶¶×Z{±hR;+ÇŒ]Æ”[Jcʸ*Ç~ÌN+°¿‡ÃËãV´ÒÎö;3R¶ÜòBbt–Ç{¨ûc¶!ò d1$¹,çkxž^Û¹×ʉà²7ݹ¢ï‘ÐîoSU븵ºÑÛGÒté-ô ²è—²ÞNQ<ãptÐ)sÊ0+í.U·.Ð9}-:}bõi|«»Ì5£ÇÊqó,R‘Î:#~@}\VÔ¢·ñêiB‚5™‚…!ÁÎ1‰eÿ¦ý㛞$·Ñ­µÓC¸óíL@³yï.'#/'¦8Ú~§ ì4ÿøFæð5¬7_ÙBítù·å¬ÞaƒŒ°Ãß 9ª–V þ»¬IÄú­óF‘ ñ…t~èY$P:aØt&©É<Ó$),²:B›"VbB.âØ_A¹˜àw$÷¯LÔ[L6·km/… °Õc:lo!×N1\äÌȾaʈò Ã(8È[‡ñ'Øÿ´cþÍò?³|¡öM˜ó<¼ŸõÝüìîÝž3÷?w²€1订Îǯávžêûf¯åHD?l•~p[`Ø-yùxóyîW·/@ÿ„“ûFOøEÿµ~ÝåÿÙžg™åäg>_;s·Û8¬øoï-ìîlỞ;[­¿h…$!%Úr»”pØ<Œô®£ÂsÀÞÕìU,eÔZîÖæÖ;û¨ „yi:³·šBI´Ê¸ŒžI†Ue5üC¾½­x·ÄzŠÚǨ<ÐÃ4†9®’Y›i‰Ë``¶q€h½Ïü&ñ"ûWöçðÿcy¾wû~ÏŸûgŸìûV…§ü,íGì_ð•ÿiþëíþOÚ<ï»û¿77ÝÎÝݺWq>»¢.«¬ï{°Ö5 çµòob3\‰mo´²`ùkˆUVUQ9 ••9¯m¯|1ý˜m<1s{j–ˆö2êI¼@I~ÃË‘gA!TšHw9s»/’<¾ö}In/mï廽Á{¸çfÜÓ)`L€ò\q“ÈÜÞ¦µ.á0ÿ‰Ú¿·?‡ûÍó¿ØÛö|ÿÛB0›+é¿(ƒf½}wD]WYÞö)a¬jÏkäÞÄf¹ÚÞ!idÁò2ת¬ª¢0rA++'Öÿ¶?¶'þßûwöŸËç}¿÷FÝÛþo»·íŠÏ®£Æ—‰pú-°)5–ž`šW†#ö‰U]Kù2Û˜’Nâ[urôQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅyÇÙ^9ü=±öçí=zË*ñwmÑnp Žê0M{í O›áàûOuÿU^/±Ä%ËõŒ—¼>Ãð`Ç|>8ãM¶éÓýRÖÝax)‹xìz2Øÿä%­ÚÙ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>hý¡?ä¡ÙØ*/ý5yPê¿´ 'â%ŽÇöTYÈÿ¦³W– Â{ž®~í ¢¤š¢¤±g¡8 ‘E4 ‘ECgd"9EH¢š=EfÙ׎¤šJfÙ×A«hž•I׊¶‰Ï¥sÎFÄѧµ\‰ÑQFŸ[x®9ÈD±/¨«hƒ½Er;Õ¨Ò¹'!Æ™ÆjÔiLDéÚ¬"ô®YÈC‘yTê¾Ôн*e^+žLÊR‹Ç: ¤EíÒ¬"{~áœÓ*{Tê”*úêuNz~ÕÒ"{T¨œô§"qR¢s]1Ï)8õ©B)Á:qR„éÅtF2™OlSÂt㊑Sñ§ªtþU´`dæG°S„xíSlöížõªd>y킦TçÖ³ØU(æWØ=èØ*ÆÏaFÏaG ¹ÊÆ1ØS|¿j´SŽ˜¦ì÷¤à52®ÁïM)è*ÖÎzS séPàZ™T èi…;Õ¶N¼~5OƳ•3E2¡N9¨L}ÈÅ\)øÔe?ÂP5ŒÊ,žÕ'µ\dãúÔLœZç” ã2‹%@é׊¼ÉíøTk–p:#"ƒ§*Z¹"ñP2×3VgL$Suö¨$Oj¸ëÍA"ÕÆGDYFDã¥Utõ­ Õiž˜®˜H³2DõªÒ'<ŒVŒ‰ÇLÕ9S§5Õ gH‚©JžÂµ%CéT¥N:×e9 ΕG5Y…^‘:ñš«"ãµuÁ‰«•ȨØTÌ*2+dÎy¢"*6) Ñ“DDTdT¤TdVˆãš"aL"¥aQ‘Z#’hˆŠû;ÀŸòO<5ÿ`«_ýµñ“ƒü$¨Í}›àOù'žÿ°U¯þŠZÞ™åc7G‹h ?áÒÿëÒ/ýVŽáX>²³·Ñ´ûˆlàŽy-#ß*F6T’NO5³¿Ú¾¼W´•»Ÿo‡¿²û"]¢ßíL$±´rF¯‚¬¬2 ŠË”ÔìþøÄõéeÿ¡Üצו|$µ¶³×¼E­´6ñ›k&+î¸çð¯U¯¶À$°Ð·càóýjwîQEvAEPEPEPEPEPEPEPÏÿ´×üÊßö÷ÿ´kÆG…u¿ì˜õ&Ó®Rî!·¶VÃ\´ªì¾PÇÎ>NÇø—®kÙ¿i¯ù•¿íïÿh×”ëzö•¦j«kà¼Ôõ8õ |Т8°'Ìk‚IÁ”aÎ7á\|ÀWºeÍÅäoŒ–—ÚYDNª-€w(*NÆ 0å< ¯<ZÜKoqÏ”’9«#‚<‚®¾_i«ã]wRKw½Òu‡¼[kËu?¾ e‹ro+€ÿ»cœ˜ž@0[žy®®%¸¸–I§•ËÉ$ŒY‰É$žI'œÐæ¿á9ôµÿÄÆÆûìWb»û'š>Ï7Ï…>b&ìùrr»‡ÈrFFyúîLm’A*1ìIòÁL?/¯êPë£j,‘¼è °6@ÃåÙ?ê‚…ÚF»˜.Šê,üO§[x]´©42èÅ$bëeŸ‹`å­Z^2?å®xà¯åècCðìúç˜Ëu¬+,vâI’Wß4›¼¸ÕbGrÌñòãåÆr@9÷ö7f£say—uk+Ã2nk©!†G•¹áÝrÚÇFÕt‹»›»8¯Þ'7V–É<€"ʆ0¬é´:ÌA`ÀàÁq¥©èúÝ׉5kØo¡Ôï®þÓa, o•šE”áH TzÐÉ~j± ÂâÑÒ‰-o]|À¶RÇI";ʤråyŸwŒîMÄÞ¸´·{ËícM³°)Áu2\…¸Y„» („¸¹“–UÎÐMñ"ɵk«ñö¹Ž£pÒͶ‘yv ÐÜDz4ÜVp Û¹Ü#ÞP–‘ŠÇŽìÓL›O‹_ñ”‹äíÕ-¡}Î$º–O1|õÛ–ºÆùòòpNÏÃq,I4s¢9U–0Á\÷†à^@> WQ/ÃíV!¸\Z:Cq%­ë¯˜ÊXãi$Gb€9TŽB|¯3îñɺ8¼C¤ÚxKRÐãÑ๒k¸ä†òa*;ª¬àHê³mYÍ]ª_½»q×I7Ä‹&Õ®¯ÇÚæ:ÃK4RÚEåØ+CsÈÓqYÀ7nçpyBXfF*Ãëš΃qmï±][­Õ´ñ«ªÍ€ê®U‡Ì£8ÈÈ œºÜñ6±­5ŠA=ÝÊYÛ´FîíBËpÍ4³3²†lÒ‘÷›;s‘œ :(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šô‚ò:Üÿ׃ÿèÈëê=7ýX¯—> ÿÈësÿ^ÿ£#¯¨ôßõb€<{öƒBóøwôóÿ´«Ä$b®Fî=+ÛÿhF+/‡ˆéþ’?ôUxtß1 1î=*ã²±öGÿä@ðçý‚í¿ôRÖõ`øþDØ.ÛÿE-oUˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šù§ö‚ÿ’‡eÿ`¨¿ôlÕ傽Sö‚ÿ’‡gÿ`¨¿ôlÕåŠ+ž§Ä{5û¥ýu¢¤š¢žbÏFx"ŠbŠ•k6vSC€©SV¤QY¶vA¦EÏzGµYŒJÊLꊱb¾ÎzÓ:ñøâ¬•”¸÷¨p)H¬WÖ£)Ï¥[eã¦*&\öÅe()Jþ^}*Ù\•§ÿ®±” £"£'·áŠ—⮑P²{~®iÀÞ2):öªò/QWY?ýu¥rÎ'D$Qtöý:Ô¸«Ò.Vt®IÀꄊL½jÕqÇ¥WqX-ލH¦ã‚j´‰žõy׊®ëÏ­m¦gºóéU$LvÏáZ&j¬‹ŸjꄊFs®G¥S”JÑ‘{ÕIWÛô®ÈHfdªAøƒÄ?õëeÿ¡Üרז|'ÿÿˆëÖËÿB¸¯S¯²À»CÐø,ËýQ\\rê_4Ý6ëÄ:Íͤöò·VPùWÅQeŠªG+°,§ý^27 è_±‰/MÓIm%“…–).C1XÙr\HxM¹$åq¼2޳„Ô¢¹jzí€u OD† kø­áÅëmÕP³`(ey0vçœ0u5­Jkemh±›ÍBãì¶ï(&8ÛËy ¸Æä(Æã•°Ô¢¹¸ZúÛYOjò_ÛÞÙO4W;|‹ˆÄm°g‹h$ùÿ+"ÆT'ñ¸XƒÂzuµÄS¥Î²^7¢MjñÔsÊ´¤0ö ƒÞ€ñ‡Ä±h’èš”2M$w.К8І–Ràè+Ÿ˜p0q¹\•†¯­é—Ú¦™ia¨X!—Ö®/T£ g‰<­Ïæ YùÞ:Ê(¢Š(¢Š(¢Š(¢Šð_ÚZ${H×#Çö±0mÒdøqÔäl׉jþ¸Ñm­åžæÙÚUVò¸e Ö” ía¾2éÇÞåsî´•з‹Ã«öh$yíVIT±Œ~è£;rAêA#‚0FkÃ5 qïôø¬Å´k)™ÌÃÌ€ `±TÎ9„S…È;Whôϯ}±£º‚Ú8¼é¤•%“j÷m±#¾ÐËíÚ¼AeR/‡zôÞŸXHãh"I¤5y㈰‘ÄȦÇàÈ ÛÀ;“v>‰­ãΗd:IœdFŠE9WI"tu#'€Ø< U"ľ'šæÃì÷:v›4ê’GÓ@U­ãwgdHÔˆ€Ý$„„®ï”«´Oh6Zõ´6Z¬Ë-¤0ŒH Äñ ÚÅÉ\d…ÆìçëSQ×&Ôì­àžÖÐKFt±Ÿ6U<¸ÃHP¨áîÀ-¸€F]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@7ûDáíßôóü…^4•e?*dkÈõ«*8éÍmN',ä=Ž*Â/¯4Ä_J°Š=8®ÈD䜇"ûsSªûqMEüêu^zq]p‰Í) ‹Þ¦UüèEã¥J«]q‰Ï)§~µ*­ üjU_ZÞ10”WŽiê¿•(_Zx\ô­£'!»E;ÐÓ‚ŒsOÁô5ª‰C6{Òí”ý‡Ú”/­W)<Ä{G¥G¥K´zQ´zSå1ÏzB¸÷©vÒ"§”®b¾¢­L@=i¥}*\JR +ŸcQ²ö=*Á_ni…}k)Dµ"«/cÒ£eõ欲úÔL¾µ„¢m]?ýu :sVÙN1P²ñÓšçœMã"›¯·¯^*ã/·¯^+’q:#"“¥Wuô«®§š®ë×ÉR'T$Pu늮늼ë×õªÒ/å\Sµ:á"›¯Z×mÇ\T ?:"Ψ²Œˆ3ÍT‘}±WÝyæªÊ¤âº`Í ùtëTäRkFE‡5N@}+® £:däóT¦QéZR§'5Je•ÙMŒÍ‘G5 ·*OZªÃ­vAŠH‰…FÂ¥aQ°­‘Ë4DEDELEDkDqMcTL=+DqÍšû+ÀŸòO<5ÿ`«_ýµñ«†þÔf¾Êð'ü“Ï Ø*×ÿE-tÒêxØýãó>vÒ42MÅäÓìÙÚÞ2ÌЩ$•'ŠÚÈõ™£0þÃÓÿëÚ?ýUÝÃÖ¾J³”¦îú³ípðŒiÇ•[DM‘ê*µÅ…Ü‚K›Kiœ ¡¤Xé“OÜ=hÜ=k5tîe%i+×ÁËk{]kÄimP¡·³%b@ ×ñ^¯»¦^jþ ÔôŸ:}y§Ëmæí1ÆdxÊîÆXªäçb­I¯é³jZ[ 6Ž=BÝÅÅ”’fNT1!”|rQÜw­J(ŸÓ쵋¯[Y¶±µû5£[ZÅgtóîóZVrѧüòˆ(ûùÎF: ( Š( Š( Š( Š( Š( Ÿÿi¯ù•¿íïÿh×€W¿þÓ_ó+Ûßþѯ Š’x&µ¸–Þâ'†xœ¤‘È¥YAäxÅ –Ý.)ì‰!Sµ™@,èH ¤ŽÛ‡­GEPE$ÐMlá'ŠHœ¢¸WR¤«(e<ö*A¸ ÐtQROÖ·ÛÜE$3Äå$ŽE*ÈÀà‚ ƒÆ(:*IàšÖâ[{ˆ¤†xœ¤‘È¥YAäxÅG@Q@$ðMkq-½ÄRC ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñŸÚ%wIáÕÎ8¹ÿÚUâ *öÀçî´@Ìþÿ·Ÿý¥^%µ•GÒ¥½@û+ÁŸò"ø{þÁ–ßú)kr°¼ÿ"‡ìmÿ¢–·i­€(¢Š`QEQEQEQEQEQE|×û@ÉC³ÿ°T_ú6jòåê?´ü”;?ûEÿ£f¯.Zæ«ñ3ÜÁ ]I­H*5ëR(¬éÓ$Z‘E0T‹Y³¶š$QR/jEL€dVR;`‹UØÀ#š«Œt«Ñ(ÇJå¨Í P¨çŠ·œÕx×Ò® Á®)±"çó«‘®" Œy«q b¸æÄÉãÅYAŒTQŒÕ„«–L‰2D«1®Fj*Ìk¡¬ã«9¦É£^†¬(ïQƸǥXAŽ{We8œsd¨¸çµX{Î*Â)é]°‰É6=Gz@Î)Š9ÍNŠzW\"sMAßµL«Þš‹À©sô®¨Äç“W¹©îhQOQ“ô®ˆÄÆLP¹çµ<ÂŽõ"®>µ²FMˆžiÔ dÓÀ¥h‘ Œ&—aö§ÑUbn3aö£aö§ÑE\Œ©4•-¬!*?a©Ù})•.%¦@ËÆi„f§eÇ=©Œ2+7Ó+‘ØÔL½Y#5õ¬%X²«)Æ*«l¹úÔ.;×<âoSp3Š…Àæ­2œb aÍrN'LYQÔóïU¤«².j³Ž¾õÇR'TJAŠ­(íW\vªÒ.8ï\U"uÂE'Ï­@ÃnEÀ>µY‡zçZ3® ¨Ã<š­(É«Ž2j´ƒVðfè ë޽jœƒ? kÓj’éqhš“ê¦ùmǪ̃¼rÉŒó/$wµ—@±ªÍáG¾…-lt¨­Ä³eL×–Òo_&_#ÍŽ8”ª™>Î[ílÌ:4Ñr!µÒ%ºž Ov|>³äÚÄv—òbPHËHÀÈû1JîóµÒuí6öÉ×OÔ­nä¸)fÂGi‘‘.¯ÈçI'‡ã†m2ý¯R{{q;߸1,@®øÆß ®Í±ämyÚl\j:~±âMTÕfÑ¥°QÅ ¼Iop¶aq&‹pˆ£Ï# ÑîÇ™×A¬x3[Ðÿ²â¾²/5!´û<¢Lü»W” Ìw¯Ê…ˆ' ¸ ²òm-®.äÓáðý†®©o曩mnàXs7œÀ,Bøû7Ë 32ÆA\'†ëÇ^!¸·–9 —S¹xäƒ+©•ˆ Ž#œÖ}æ“©iÏ:_i÷v¯¢L³ÂÈcgRÈ#‚Ê õ‘RM¡kð\O>•}6Øóä{wU‹.ÑÄ—çF^‰Hê z«sá»ïˆ·Á¬fÓWP¾ßËy®_Íhd2°*ð³¬x$ãÆpKÊMs§×î Ó¼8“E¥Dâî¬çÍÚÜ­DŽ6abRQ°¢@ÌÅOqá}bÏÃßÛ—–3ÚØ´°Å ϧŸæ#º´dŒ2â3’ñ/­cÐxšŽ•wa§ZÜ[hÉö­þâöd‚8ä7*÷OäcË!–,*m,Tî]ª$ñìÚéÁ4‹¡èCy’=¶ïGJë‘åö†iàdù†¼þŠèïJû&§j?o±›íÞoú43nšßcmýêãåÝÕzäV}ÐÂ+ÿü#ßÛÚý„¾Ùþ‡þ¯úÜÀz}î+Ÿ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šô‚ò:Üÿ׃ÿèÈëê=7ýX¯—> ÿÈësÿ^ÿ£#¯¨ôßõb€´n>µO©¦´Ü*¨É$àQÊlzwÁrN±â<ÿϽŸþ…q^½^7ð:âOÄ É*ˆlÁd`Ã;®8â½’¾ ­F)Ÿ™4ñsk¸QEÐqQ@Q@Q@Q@Q@Q@Q@5ñÿX·ÓltH&IY§¡J@͹‹œŸïL¿€?Cá6Þ!µ±ºð•ü1Í5ÆŒAžöܼ˵òO!ðr£ïž=oöšÿ™[þÞÿöxušV©áí6ââÔO©I§Ê‰æ5ÅŒ3­ÃÙ òÎ×Ú²$»×‚<Ì'7söÍFæëtíçJòfâ_6C’OÎø›ž['œ ¯EzøöÎãZñ5ÝȾ’=cPgÜx­Ú ¸9¹d[„ÂgfÝÊ0k?þËþÈß}ý™ý•ý›öϳ§ÿkßäù›~÷îñætù³ü5ÇÑ@Nak‰ZÞ9#€¹1¤Ž•sÀ,ã¾}tƒÄ–ð“èç§JM6\(Þ¹±®ê3†ÁÜÀ7`W9½ÚOâ-}=Q©>Ÿj´W $· ܾÆMÌ" ö¶]àÉ,­» s\ñ힩⼌_ ´ÕbHdå’í]Ä&ˆ1ëò¸óú(°ñ‰4}ONÖ~Çð¾ÕõXõ9¼åAXî‰pIm¦a‡8Ü?…6üÜ}PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP¤|ÿ‘Öçþ¼ÿFG_Qé¿êÅ|¹ðOþG[Ÿúðý}G¦ÿ«㟴1>o‡†ÏÚ{×*ñ#æu$(öâ½Ëö€0‰41œ0%6Éý×ÿZ¼?pa¹†*Õö/‚F<áÁé¥Û襭ÚÁðAÏ€|8êmÿ¢–·ªÀ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šù³ãÿü”;?ûEÿ£f¯/êÿä¡ÙÿØ*/ý5yx®Z¿îàƒë¨õ©V£Z‘kzÔÉEHµÔ‹Y³¶™*ÔñuÕ¨‘šÆ{qص_‹¥Tˆ t~ 1ÐWFQf.õz/ëTã_J¹õ®)’\AÞ­ÅÐUhªÔc®9ˆ°ƒaG бjæ‘„Ùb/ð«QŒqU£ëVÐt5½4rT'ŒsгÅAä°€ç5ÛMsdè2¢¬ ïP§Z#Ší¦ŽY²uû¦AÞ¢AÞ§P@æ» ŽY¨À©@Èv©Wï é‚9äHT£ ¨ÇQRµÑ)QÆií`bœ£œÖ©6< QEd(SžiBúÓª’%±6ŠB¼qN¢\f¤©)Œ1I¡¦%5—½:Š–4EQ‘ƒŠ”ŒSdp9¬Ú4L…ÇzÇz˜ŒÔDf±’5‹!aÞ¡aƒS·Ý¨\æ¹æ¢Êí÷MWdâ­:Ž•]Ç>ÕË4tÁ•œ~•]»Õ—ïPIÒ¸ê#ª7f«¿zµ'J«'Já¨uÀªýMT~M\“ã½pÔ;)²³õªî1VXdÕy;Qª%9zUGqÆyíU%®¨"ŒÝMR›¥]›©ªr©?Jí¦QŸ/ƨËþ5¥*z÷¬ù”óø×u62›õ5t©_©¨šº¢g2&ëQµJÕV¨â¨DÕ©Z¢5¢8ªµ}àOù'žÿ°U¯þŠZøå«ìoÉ<ð×ý‚­ôR×U§‡˜ýŸŸè|˦ÿÈ*Ïþ¸'þ‚*ÕgéÌ?³-?ëŠè"¬ïõàÎ>ó>Ö‡ð£è‰è¨7z7zžSSÕ~ÿÈWÄŸõÂÏÿB¸¯b¯øs©ø“þ¸ÙÿèSײW¿†þ O€ÌÿÞêz…Q[œ!EPEPEPEPEPEPEPÏÿ´×üÊßö÷ÿ´kÀ+éÚÎÞý¼?o •fú„ÑH¬6¯—rËŒ¶Bà`Œg<ô¯(OéS]jP£Þ§ö5İ]–•[í~\7“È<¬ý•‡>f<ÀyۆᨮâßÞu·Ô&ûtVW¶‹-´],ae2Íî¼–@Ì`f]È‹‚ÙuòòòIàí×Doµj7qêÒÛÝ]A°Ê’ªÂò¦Çbq“ä6æ3.ÍÄBeÀ8:+sÁ¶v:tK NÞK‹;«Ø –$—Ë,‚ý쌑œ`‘'#RØh!ºñ©{i}k ¥¤WPÅhð.q,Q2¢ ÆAó*¼’²Evx{G¸³cK亿Óîõ;iá Ž>"uòÁ‘ˆ·?8dx;~\5Ïø+Mðý­ÕÖ=ÙH/~ϲáÕÉS-Ô@åUyÝfíÓ¤ª8ØYÀ8:+ Ð4›;½:êþòÖúûeݽ”6v2ˆ¤’I„¥HbœyDm ’\r1ƒOĺl:7е}.ݤh,¯f·¤ ±Tr œ3è(.ŠõH<¢½¦¯¦4vé§kf¹Õn2Î-íîä”E¶,ÄÊRGïJîC†ÚaÇ¢èÖÞ%UÓ¥ûm…Ɖržr;ªº[ܵäŠ?3 `ÁŽJd€pôWiká} ¼'ouu©Èºµå•Åô •ˆXšUÛå¬,%²æTÚ’¤'Í¡¦h: —Äm?Jm?R¹Kv-6òIÞ匌¡ˆòÿv !>Qß¹w Ë·$Î讲ËDÓnmî5S¤k/f÷Ö¶6ܯŸ3J%ľI7[ºíXù-ŒåNîƒÄ¾ÐmnâÑmÅÚÞAe©¤ÚÅæŸ%ûðÂÙ¡*UZ6hÁ„u9Îâ㠼߆4Ë=_Z6·óO ªÚ]\<(g_* $R@< ã#=2:€ z+´²ÑôÔÕ­.-àÙê¡y½Û,Í $7H2áT1 ðv®2UɯgáÝ6m.Î9Mßö…ö™u©E:Ê¢(–?÷mÒ\·ÙÛæ¸óÊvüÀÞkšN‹wâM=,ô½JÏOK+9/f„ÊY¤£;"Õ‘ðäáÜ!ÚPó~$ÓìôýF1§‰þÉ4BXšYªë’7$Wz½Ñ[r2†BH=Q@Q@Q@Q@Q@Q@Q@Q@Q@‘ðOþG[Ÿúðý}G¦ÿ«òçÁ?ùnëÁÿôduõ›þ¬PŒþÑ?ë|;À<\õõʼOzÈ¡HÛJö¿Ú)ŠOá¶¾Õÿ´«Ä[,2W¯qR÷ög‚F<áÑé¥Û襭ÚÂðHÇ€¼:ýí¿ôRÖíRQEQEQXþ$N—Nu6}C÷£ìñÛÀÏ"̓µ‘‡ú–âRÈœî^µ—¦Ÿéísy—hs‹7´^ÁõHTpcý㟘‰d8BÖQEQEQEgë¶·—ÞÔìôë³ßOi,Vóo)åÈÈB¶áÈÁ är(œ.Ñîn"Š9.öJá"¹{ÒÞBÇ ¶r‚6 H Ca‹(\ägr¸½WRÓo¼-¡[éë³ÜÞØ]; ’¢Ãu •`ðbU`à}ͧ8Åv”ógÇÿù(vö ‹ÿFÍ^^µéß´cñÏiþ%Quÿ–³W˜G¸˜‚}†+–¯Ä{¸û¨«W%Z‘j5©°g­U©£Z‘k&w@™:Õ¨ºŠªjÔ]Ec3®;¢éWâéT"éWâé\U»z´ƒiÅU‹½[_½\Sr.µmÕHºÕÄûµÇ12Ä}ªtëPGÚ§NµÏ-Ì&[NÕe: ¬½ªÊtÑLã™e: ´¿tUTè*ÒýÑ]ÔÎ9–­YNµYzÕ”ë]´ÎI“'J°¿z«§J°¿xW\i’¯QR§z‰~õLë¦<‰½H:Šbw©æº"e!õ"ýÑQÔ‹÷Ek) JM%9zÕ¢ê(¢¬¢Š( ŒÑEGÞŠSÔÒT1‡zm=úS*å-ˆª*–¢¬dm"2*&û¦¥¨›îšæ™´H­W~†¬?Z®ý rÌè^^•^NEY—îÕwí\u¨dâ«IÖ¬ÉÖ«K÷«Š¡Ù´Ý T~•nn†ª?JàªvSجÜÕy;U¦éUdíJ'\ î0*ŒµzN•FZê¦hŠRŒ±V^[|dúÕIºìE{þ5F^‡ñ«Ò÷üjŒ½ÿí¦2Œƒ j©åûÕWdLæFÕT­Q5hŽ:„mQ•ª#Z£†¡WØÞÿ’yá¯ûZÿ襯ØI“†\»ÿׯ²< ÿ$óÃ_ö µÿÑK]Tºž`îã§Ðù_Mº…ì­âIcgXW*8ªæïj¥bÇû>Ûþ¹/òcyö¯kÞv>×eöD»½©EE,Ä$“ÀóíFóíSÊlzÇÀiâžÿÄ­ˆê"³Vg3״׋ü9Ôc£sÆQø—^‡T—T‹[Ô“P™6Kv·N%uã†|ä•x'°ôªñêÚ”:\Ú\Z…Úió>ùmf;qË&pOʼ‘ØzV‚Úø[í­¬ë"ŠQÆ“bÙ;_´à6àäç'Žc6ÞûÌ5]TÝ þTgLc`››ÏÊämÎíÉv2@2àžk[ˆ®-å’âpñÉd`r#Aç5bÏVÔ´û{«{-BîÚ ´Ùs32,Ë‚0à0Ãê}kBK_ ‡„E¬ë,…ñ)m&%*»O*>ÒwÛF8$çŒZøWí­¬ë"ŠQÆ“bÙ;_´à6àäç'Ž@3ãÕµ(t¹´¸µ ´Óæ}òÚ,Ì"vã–LàŸ•y#°ô¢ëVÔ¯‘’ïP»¸G}ì³LÎ nvÉÉëºI}]ñÜ6ÞûÌ5]TÝ þTgLc`››ÏÊämÎíÉv2d’סák:Ë!|J[I‰J®ÓÊ´ÇvÑƒŽ 9ã.ÖþòÇÏûÜöþ|MÞL…<ÈÛï#cªœ ƒÁ¨çžk«‰n.%’iåròI#gbrI'’Iç5°-|+ö‡VÖu‘E(ãIˆ±lÀ¯Úpprs“ÀÇ1›o ýŽf®ªn†ÿ*3¦G±°NÍÍçår6ç vä» Û]Öìûµ[ãöo+ÈÍÃþëÊÝåíçåÙ¹¶ã¦ãŒdÑý»¬lkÿjßiÿÏïÚÎû»~þw}Þ:ôâ®IkáPðˆµe¾%-¤Ä¥WiåGÚNã»hÁÇœñ‚ _ ý¡Õµd@J8Òb,['p+öœÜœäð1È|z¶¥—6—¡vš|Ͼ[E™„NÜrÉœò¯$v”^jÚ–¡oko{¨]ÜÁh›-£šfu…p…P0=¥\6ÞûÌ5]TÝ þTgLc`››ÏÊämÎíÉv2d’סák:Ë!|J[I‰J®ÓÊ´ÇvÑƒŽ 9ã›ëºÄ——W’j·Ïuw‚æf¸róF@³–\0xàT“ø—^º°–Âã[Ô¦³•ËÉo%Ó´nÅ÷’Tœ[æÏ¯=jÀµð¯Ú[YÖD£&"Ųw¿iÀmÁÉÎOÆm¼7ö9˜jº©ºü¨Î™ÆÁ;77Ÿ•ÈÛœ)Û’ìd€S][RT²EÔ.ÂX9{56-ذbcçä%€9äf£¾¿¼Ôï$¼¿»žîêLošy ŽØ ±äà? Ԓסák:Ë!|J[I‰J®ÓÊ´ÇvÑƒŽ 9ã¾ûC«k:È€"”q¤ÄX¶NàWí8 ¸99Éàc øõmJ.m.-Bí4ùŸ|¶‹3¸å“8'å^Hì=*G×u‰"XŸU¾hÒ!¡¸r0®ÏÝ $ŠL;„Õƒm῱ÌÃUÕMÐßåFtÈö6 Ù¹¼ü®FÜáNÜ7c&I-|*³¬²Ä¥´˜”ªí<¨ûIÜwm8à“ž0@$´ñ¿‰,lî ¶Öo£’êT–K”ºMò™[h`ßušwb;·=sœxoï-ìîlỞ;[­¿h…$!%Úr»”pØ<Œô­Aká_´:¶³¬ˆ)GLE‹dî~Ó€Ûƒ“œž9ŒÛxoìs0ÕuSt7ùQ2=‚vno?+‘·8S·$ ØÉ§y«jZ…½­½î¡ws¢l¶Ži™ÖÀ@Na@Àô”iº¶¥£\5Æ—¨]ØÎÈQ¤µ™¢b¹©ãØV„–¾‹YÖY âRÚLJUvžT}¤î;¶ŒpIÏ µð¯Ú[YÖD£&"Ųw¿iÀmÁÉÎO€c™ækt·id0#³¤eŽÕf1 $*‚{í•sEÖo4 Lj6åÝ,RÄ’AO26Œ²A ’bX6ÞûÌ5]TÝ þTgLc`››ÏÊämÎíÉv2d’סák:Ë!|J[I‰J®ÓÊ´ÇvÑƒŽ 9ãŸöî±ý±ý¯ý«}ý§ÿ?¿h;îíûùÝ÷xëÓŠŽ=[R‡K›K‹P»M>gß-¢ÌÂ'n9dÎ ùW’;JоûC«k:È€"”q¤ÄX¶NàWí8 ¸99Éàc˜Í·†þÇ3 WU7C•Ó#ØØ'fæóò¹s…;r@ÝŒ k«jJ–Hº…ØK/f¢fÅ» L|ü„°#ŒÔw×÷šä——÷sÝÝIóO!‘Û–<œáZ’ZøT<"-gYd/‰Ki1)UÚyQö“¸îÚ0qÁ'<`‚׿humgYRŽ4˜‹ÉÜ ý§·'9< r‡Elo ýŽf®ªn†ÿ*3¦G±°NÍÍçår6ç vä»2IkáPðˆµe¾%-¤Ä¥WiåGÚNã»hÁÇœñ‚‡En _ ý¡Õµd@J8Òb,['p+öœÜœäð1ÌfÛÃc™†«ª›¡¿ÊŒé‘ìl³syù\¹Â¹ nÆH=Q@Q@Q@Q@Q@Q@Q@‘ðOþG[Ÿúðý}G¦ÿ«òçÁ?ùnëÁÿôduõ›þ¬PŒþÑ83xs?ôóÿ´«ÅöÀ½¯öŠÿ[áÏûyÿÚUâp>Îðcoð7‡ÛgM¶8¿tµ·X~ Çü žÇOìËoýµ¹T¶¢Š)€QEQEQEQEQE^ ;{Ë›Èm ŽêëoÚ&HÀyvŒ.æ¶=*ÅPÍŸÿä¡ÙÿØ*/ý5yzר|ÿ’‡gÿ`¨¿ôlÕåâ¹jüG»þ ®¤‹R-Fµ"Ö õ©’­HµÔ‹Y3¶™2u«QuQjÌ-ÈŒö;#±¡J¿JψŒu~"1ÔW@.ÅÞ­¡ÜsTc9«±Zãšz.µm;UHªÔuÅ1£íS§Z®*Ä}«žF-§j²T­[Œöô­éœs,§AV—ä ²kº›8æ‹KÖ¬§Zªjdé]´ÙË4ZN•a~õVSÚ¦^•ÙsI¨©S½BªUûº`sÈ™;Ôƒ¨¨‡QR oKR/Ý9§¡ç­lŒ˜úUëIEY”RšZ²BŠ( Š)¬}è`4õ4QAàVeŒcÚ›JNNiŒxëPÙi ¨ªBp*"p+ÄŒœ ‰¾é©îÔ/Ö¹æm'ëUß¡©™»â vê=k–lé‚ —¥W~Õ;÷¨$é\u¨¤ëU¥ûÕbN•ZN•ÃPë¦W›¡ªÒ­I÷*£ÕÃPì¦Wnµ^NÕ;œ‚NÔ¢uÄ®ç"¨ËWöªr×U3DR“ï«7CVfêjœ¤Šì‚(©/ƨËßñ«’¿^=k>Ryük¶šVO¼j©_©¨š»"g26¨š¥j‰«DqT#jˆÔ­QÕUÚ¾Æð'ü“Ï Ø*×ÿE-|rÕö7?äžxkþÁV¿ú)kªSÃÌ~ÏÏô>R²cö úä¿ÈTûQ±¸í!eFur¡#V·ZòçyŸi‡’t£gÑn4n5ãëH_j–f’Oj›]ÃðæÿÄ¿õÊÏùÏ^Õ^#û?Ê“^x™£up#³Sžó×·W¯EZš>2iâê5Ü(¢ŠÔá (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>ý¦¿æVÿ·¿ý£^^ÿûMÌ­ÿoûF¼€ (¢€ (¢€ (¢€ (¢€ (¢€ é/ü+o%Ùñ›im{Ói«,q! ¾b"H1ãk`ñÎk›­‹‹¯í3CÑ´ëyÞH¼Ã$*›Œ×RÉŒ¦2NcKuÇ¡ÀÉ$€SÕ4Ù´›ö´™£r$I#$¬‘ºGá••°@#8 Š“©5ƒß®ŸvlÑÞàBÞZ«9E%±€ +(=Ê‘ÔV‡‰g‡:^™ ±Î4»!lóFÁ•äi$™À# …iY7ClÜc m{M±ðLJËjw–ú=íªXFŠ`®$¹ŸÌÊ>×VÛåÁS@6žñ$‘ZˇõWŽïfu²‰²¥ÆÃ›å¸ì éV4ïx“T‚ê[]ù¼‹Hï}–BÓG#„C wg,ñTrË]E·<7¸Úœ‰ª¬—^ ·×.BÃü¿=Œ7Øi@ó ŠWËéúµš_ë‘_Ý_MkªÄнñˆ<ÿëã˜HÑ—Ã3€#ÉÉÆXÓ.NŒú©ŽAh· l$1>Ör¥ˆ·f@ °?0 ’ Í'RÓíín/tû»h.Ó}´“Bȳ.Ê0à G¨õ­õ-5|5­iª·p½ÅíµÕ𲱉”¤•ÁÛ0;‚œ•è3Åkn«q{e>¥çê—¦úæÚUXà‰s´a˜ÊA€ä&?)ßò€S“ÂúÇü$:†‡gc>¡}a,‘L–1<¿qö3vç:ŠÇ¯@oi-®xãyã±ÕõÔ#š}&ÞñÐ4˜Ì2¹AÌÇç Ÿ“§ÎqÅê×íªë7Ú‹™ ÝÜI;yŒ¥²Ì[’ª ž{(€t  .4-bÒò;;*ú©eò#†KwWy0§`R2[‡~uõcþ?hÿgÂ?ªý»ÊóþÍö)<Ï/;wíÆvçŒôÍw—Ä}ö[°–×ËÔ³†b‰”ŽVÔ`7rʷѹ”a¸ 1ËÄþX¬tðu%Óí¬…´‚âΕ¸a<îIˆºl,³|®’. ¶íôÇǤêSisj‘i÷o§Âû%»XXÄÇ øÀ?2ðOqëTë°oØO£Þ,óê¯xþx€MåË"™‰oµ²"FFG-!ùZ@cã袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñÚ(f_vÿŸý¥^$ ךößÚ/>w‡1ÿO?ûJ¼@ðjXfø$çÀ^>ºe·þŠZݬ/ÿÈ…áßû[襭ڤEPEPEPEPEPEPEPÍŸÿä¡ÙÿØ*/ý5yx¯Oý wÂIJÁeEœúk5y€®Z¿îà‚¿®£Ö¥^ÕÔªkz´ÉEHµ©³gm2e©âê*ºš±ŒŽÈì]НÅÒ¨EW¢é\u /EÞ¯Eýj„l[²qÚ¸¦„_CÎâ®EÐUªädm¸æ‰-!ÍXS€*´gakšHÊh·ò«QóTѺV£<+Jl㨋qžsVc=úUD=*Êô®êläš-¡À©Ðöª¨NqVŒ×m6rM”Œõ©Ó¥UN•aHÎk® åš,)È©TôÅ@‡ŒzÔ«Þº Ì$‰ÁàŠ…O©©àýkx³"dnìB* \ŸÆ—Òv·²ÓmÚÜZ@ÐÛç˃̑ÌxrÀ†ó ± ³¨Ã¾Màüñ¬7Ä“G:#•Yc À?xnàõäêGRO"Íq,© p#¹eŠ2ÅP÷FâNNI>¤ÔtQEQEQEQEQEQEQEQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅx¿íq7†ÿíçÿiW‡òÜ×·þÑ¿ë|7ÿo_ûJ¼MT„ÆG­KìÏøç×L¶ÿÑK[µ…àŸù¼;ÿ`Ëoýµ»T€(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šù¯ö€ÿ’‡gÿ`¨¿ôlÕåêx¯Pý ?ä¡ÙÿØ*/ý5yr×-_ˆ÷0?Â_×RU©¢^µ"šÅž¥6L*EéQ ‘k&vÓd«SG÷…@¦¦C‚+9eØØã­^Œ’9¬øØb¯Dãë’¢44"ïWbëYñ·¥\Œ’y®*ˆEôlŸj¹Š¢Œ«Qâ¸æ‰eØÎMYCŠ©ÅXCÞ¹dˆ’-ÇV¢óW#sí\SB4#8\‰²¬øÎM[‰úb¸æ„Ëñœb¬¡Èªqy«(s\³D´[Cš³vªhÕ:qXìÎy¢ômÈaOªQ·AV‘°=릜ŽI¢â6GµXFj’ñÚ¬£ æ»a#’q-©íS« 檫sïS+~U× ÒE´=­L­Úª¡©U»WTdsÊ%¥nƤ Ú«+v5*·c[ÆF‰88©ïP)ãšp8äVñ‘›E€þ´ê€0Ç4ðpkE#7PÄSƒúÔAùæ—põªR%¢MãÞãÞ£Ü=hÜ=ió(ýæ›ÞšXcŠMÆ“$8œSæšHi¥ºÒ¡ÈµY»Tdâ‚@¦ÜÖR‘¢@ÍÜÔLÝÍ ÝÍDÍÜÖ‘¬b ǨñŠs1Æj#®yÈÞ1Ì:ÔzŠ{Ö r9®YÈéŒF;}ª³¶jGcϵVsÞ¸êHé„Hä=ê´§œÔ®Øüj´Ï qT‘×DíœÔ sOŠÎk(£®‰ÛZSƒR»sÍU”à×L±¶jœ‡Õ‰tªRW\È%~Nj”Î0zÕ™_“š¥3Z즆U•Ç={Õ795bV¾µUZí‚1FÇŠ{lŽjŒa¨š¤&¢=kDqÔcÔdÓÚ˜zV¨ã›#c_dxþI熿ìkÿ¢–¾5pßÂ@úŒ×Ù^ÿ’yá¯ûZÿ襮Š]OõÌù×þ<áÿ®küªZ«i,mo,ŠXF2 ò8«Ã%«>®„“§vE6‚ÁA$àI565¹ìß³÷ü~x›þ¹Ùÿ9ëÛëÃg©K¯ua²ÐeN{Ï^å^•/iâf×p¢Š+C(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šùÿöšÿ™[þÞÿöx{ÿí5ÿ2·ý½ÿíð (¢Š(¢Š(¢Š(¢Š(¢Ší-£¼»ø[wj÷ÚjÄ—°][Úµý¼rD¹¿—¼9|´c‘¹€@2cSÇz¥…Æ­‹3b°jzÜz…¡†â9¦1p^IJüÑÿ­ˆ,nh8Áa#,èÉᣯH±¥™¸Kt Øy e^»3®ãÁ ’­‹z%߆u-%µ_.:-ÑE.ºxÛ \Û1±ÿe°rž*ÿ˜'Ÿÿ!ì¨>×ÿy8ÿo³ôü~mÕÔZÝÙÇá &v:Ry:%í´—‚ôȤy.‚ ó9WóåV;——‡Öío,õ‰Òþãí7í¸7Ëùë"‰L·Íó+ù€nyäU#ÂúÆ·ksygc9±¶Šif¼1?’žTFFRà€»/LÐæ>›ªC§]j2Ú ë–ÉVé—läÃ#Y»nÈ`’¨Ëâ5A‘·uuåœi÷jðõÅž˜‘ÏdëaRLnn˜ 2EE1rùM¤‡¯™Üh·ößdk9’êÐÞ$~D„CqßÊŒ®Ô/¹r»{ä)ÉФ/,R"L›âfR®â¹_Q¹Xdwv  /üßíŸ?Èó¼×ßö}ž^ìœìòþM¹é·åÇN*½tøNyt{kÔÔlMÅͤ·±X~÷Îhbi¶vycòBð ~€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX ý¡­ä¸—ë ¤ñëþª¼FhѶ¹Äƒ¨Çݯxøú¡“D €39ÉÇúºñ9ÚÃýöÇ%†sXÎMJÃ{^x(cÀ~õ ¶ÿÑK[µ…àž|áßû[è¥­ÚØAEPEPEPEPEPEPEPÍ_´ü”;?ûEÿ£f¯-ê_´ü”;?ûEÿ£f¯,S\õ>#ÙÁ¿Ý/ë©*ÔŠj%4ðkzPdÊj@jjU¦“ýÜ}´RQHÒç³þÏŸñ÷âo÷,ÿœõîáß³ßü}x›ýËOç={z¾|v?ýæ~¡EV‡ QEQEQEQEQEQEQEóÿí5ÿ2·ý½ÿíð ÷ÿÚkþeoû{ÿÚ5àQEQEQEQEQEÒYÞh1ø*ûMžóR]Bæâ+ ©d´K:ªo3†óA-·åÁáªMn]T±Ð´ý}VòúÖ/±,SX$~vé¥Ù+Ù”(\sŒçµrôPç‰g‡:^™ ±Î4»!lóFÁ•äi$™À# …iY7ClÜcSLñ&hבßë=*óL…!TòÏœ. ÊÌNx3•(A»qû‡¢€:Câ(mbðÅÅ‘ï4»y ¹‚â!äJ¦ydÚHlº:ÌQÔ…ã#Ügëú”:–¨ÆÍdO·Aoe€XS…,Àvåßw=ë.Šî!ñ}œ^²Ó÷U³é÷’iF1ö9¤’I™f-æ}äóQ‡îÉÝò8aÃÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@SñéCA¤Œâr3õ޼Ür£‘ë^ùñÆ1,š2åÜž™éå×ÏŽrçœ ÎJìoá>ÌðN?áðîû2ÛƒÛ÷K[µƒàù|9ÎâWmÏý²ZÞ­QEQEQEQEQEQEQE|ÓûAÿÉC²ÿ°T_ú6jò°kÔÿhLÿÂıÁeEž?é¬Õå`Ö7=l#ýÚ%SRQ)©¬YèÁ’ƒR)¨V¤SY´vSdÀÔŠj iêk6vA“S#cµW¤SïYÉPeøÛ>Õr'穬؛¯?­\°}k–q44ãqž*ÜoÓœVtmÏ¥[¸9®9ÄFŒOŸñ«q¸õ¬è›‘Ú­FÿþºäœDh£{Õ„nj£ôïøÕ”jå”Ih¸­Ò§GÀôªhÜŠZ±zJ%äqÜÕ”~j„mëV½ÿÖЙË8—Uýÿ_ŸéT•ÿýU2¿¿ãšë„ÎiÀº­Þ¦WÍSVã¯ëR£ÿŸZéŒÌ%Ú½J¯øÕE~}*Enk¢30”KjÙÿ x~}*²¿áøÓÃñŽ¿l¦dâZÇ­88õÅU Ç\~4ðüc¯ãZ)àO¿ÜÓÃcÞ«oö§nÿkõªS%ı¿ÚþÕ_wû_­¿Úýió‹”¶ZMþõ?ãøÓwûRs‰.ÿja|w¨÷ó×õ¦³õþue¨gãÒ˜_ŸZan:çñ¨Ës×dæh 8¸úÔeÿin=*2üzV2™¬b üuüjoÀR3ÿúª&ÿUsJfñˆ;ŒÕwnIíJÍïøÔ.ÿç5Í9ˆÙê³¾iÒ· ®Í\s–¶:¡¬Õ ·½9@íÍ(£¦1#psU¤~=jI­UvÁëšè„MHùëš©#þ,#bºá‘»`zÕ)cÒ§•¸ûß­R•øé]pˆÈ%|“ɪ’63Þ¦‘ºöª’žµÙ1Œj"iÌ}ê2ktŒ'!¬iŒiÆ£cZ$rNCI¨É§QšÑ#ŽrMFM=ª2kDrM&¾Ëð'ü“Ï Ø*×ÿE-|bûBÔf¾Îð'ü“Ï Ø*×ÿE-tS<œk»GÇö²£A+©`ƒ G>jøõ‹ýÁüªL×·>–‹~Í_°ìÒÀ$êM&hÍ+\öÙÞE’çÄåXl´=ç¯s¯ ýžãëÄßîZ9ëÜ«¾ŸÀ’Æßë¿p¢Š*ÎP¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(çÿÚkþeoû{ÿÚ5àôGí%e-Ô^’7V»fΑ’?u÷CXñÑrzzŠñðÅú¼Jn4œÊÛ½©í-ó3哜¤En/„õ¸xν\“­Y…ÃÍÁ?)È#Œã#1Ÿ _‹9®Æ•åÅ¿pµ©s°v§™¹º`ÜF@1è­É<'¨Äð£\èÄÊûnµfÀ¥¾b%ÂŒ)äàg©ƒÂz‹\<çFÞˆ®IÖ¬ÂበæàŸ”䑯q‘ :+`øjüYÍtn4¯.-û€Õ­K„ƒµ<ÍÍÐãîàŒ‚3$žÔbxQ®tbe}‹·Z³`Òß1áFòp3Ô€@0è­Áá=E®s£oDW$ëVapĆópOÊrÈã8ÈÌgÃWâÎk£q¥yqoÜ­j\ì$©ænn‡wd z+rO ê1<(×:12¾ÅÛ­Y°io˜‰p£ y8Àê@ ðž¢×¹Ñ·¢+’u«0¸b@Ãy¸'å9äqœddŠØ>¿s]+Ë‹~à5kRça íO3st8À;¸# ŒÉ'„õžk™_bí֬ش·ÌD¸Q…<œ àu  :+pxOQk‡€\èÛÑÉ:Õ˜\1 a¼Üòœ€r8Î23ðÕø³šèÜi^\[÷«Z—; jy››¡ÆÝÁdŠÜ“ÂzŒO 5ÎŒL¯±vëVlÚ[æ"\(žNp:<'¨µÃÀ.tmèŠäjÌ.0Þn ùN@9gⶆ¯Åœ×FãJòâ߸ ZÔ¹ØH;SÌÜÝ0îÈ#2Iá=F'…çF&WØ»u«6í-ó.aO'8HŠÜÔZáà:6ôErNµf Ho7ü§ Ž3ŒŒÆ|5~,æº7W—ýÀjÖ¥ÎÂAÚžfæèq€wpFAÇ¢·$ðž£Âs£+ì]ºÕ›v–ùˆ— 0§“œ¤ ê-pð z"¹'Z³ †$ 7›‚~SGÆF@0è­ƒá«ñg5ѸҼ¸·îVµ.vÔó77CŒ»‚2Ì’xOQ‰áF¹Ñ‰•ö.ÝjÍ€;K|ÄK…SÉÀÎRâ·„õ¸xν\“­Y…ÃÍÁ?)È#Œã#1Ÿ _‹9®Æ•åÅ¿pµ©s°v§™¹º`ÜF@1è­É<'¨Äð£\èÄÊûnµfÀ¥¾b%ÂŒ)äàg©ƒÂz‹\<çFÞˆ®IÖ¬ÂበæàŸ”䑯q‘ :+`øjüYÍtn4¯.-û€Õ­K„ƒµ<ÍÍÐãîàŒ‚3$žÔbxQ®tbe}‹·Z³`Òß1áFòp3Ô€@0è­Áá=E®s£oDW$ëVapĆópOÊrÈã8ÈÌgÃWâÎk£q¥yqoÜ­j\ì$©ænn‡wd z(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX ,øá{ï‡Ìè\\®OoõY¯ Õ<+:[ýºÀyöÌ72¡ÜÈ?¢½+öŒÿ[áÏûyÿÚUåN¹u¦ªäF{f³’wº.2[3ëoŒx ãÓL¶ÿÑK[µ…à“Ÿxtúé–ßú)kv´ (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šù£ö„ÿ’‡eÿ`¨¿ôlÕå@ת~пòPì¿ìþš¼©Ma=ÏO ýÄHµ"šˆx5“=2`iêj iêj:¡"u4ðj%5 5›Gd$J H B H fÑ× #lv«HÜõÇãTTûÔñ¾OJÆQ:5#o|þ5r'ùGjËÿ »ü£œ×$â3F6äw«q¾qÚ³b~ªÔrtÏjäœDi#r9ÅZ¿ýuœÓ½[‰øëøW$âIz6çúÔêÞõI§ò©Õø®yD–‹ŠÜzTèÿþª¦­Ç­L­ïYlÌ%ê¿¿ãš°¯ÿêªÿþª°¯Ï_Æ·„ÎiÀ¸¯Çÿ^¦G÷ýzU%~­J¯ï]1™„ ]W箑_ñüjš¿¾*EŠÞ30” óŽZxn}* “ñ§‰;“[*†n°üc¯ãJŸJ¬$ôíþâ´U Ü ;¿ÚýiCß?V=E.ïj¿h.BϘ=¿:<ÁíùÕmÞÔnö£Ú Ÿ=Z q×õ¨7⓸¥íÈK¿Úš_9çõ¨Œ˜÷¦÷ÅK¨R)n=)…ùõ¨ÚNÝEFÒc¥e)š(㮈¿ãøÓ ó×HGJÆS5Œ3ûþ9¨™½ÿk?Ò¡i?\ò™¼`+?ÿª wëþ4;ûþ5¿ZåœÎˆ@¸ëP3R»qÖ¡f¨JçDb#·½W‘½ÿ s½V•ùþµ´blÙŽ¿†j«¿>”ùªÈüõÍtÂ%»þ5VVéó~µ#¿qTå~œW\"29_Ž•NVÿkõ©e~:Ч#ñ]ˆÈ¤n½ê4æl“Q1®˜¢dÆ“Q“O&£&µH圆“Qµ9FÆ´H䜆µ0šRi„Ö‰sÖ5§L&­³cI¯³¼ ÿ$óÃ_ö µÿÑK__gøþI熿ìkÿ¢–·¦yx·±ñõ¹ÿF‹ýÁüªLš‚ÚDhcUu,dÈ⦮9-O¢¥$à­Ø\š2i($I8©49kýž?ãçÄßîZ9ëÜë¿gWW¸ñ9F 6Úr{Ï^ë]Ôþ|¶1§^Mw (¢¬æ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>ý¦¿æVÿ·¿ý£^$2Ä‘<‘:,«¾6e :ä®G¨Ê°Ï¨>•ô—íäùZ/ÚþÍöO³ßnó6yžfÄò¶gçÿY·;8ÇÞùkÇlÍ‹Ÿ =ÌÖN©¦]B‰,¨Ê—BK–„J¤áW{ÂxNr¡¨Ž ¦Iž(¤t…7Êʤ„]ÁrÞƒs(Éî@ïQ×¥Úê‰g%õ”áõÖo´tKŒÅfÖ­t·À G£ì꤀B–9 ó‰ãXn%‰&ŽtG*²Æ+€~ðÜÁëÈÔ ±&“©C¥ÃªK§Ý¦Ÿ3ìŠí¡a·<+ãü­À=¥S®ƒÄ?òðŸý‚¤ÿÒÛªçèHàšd™âŠGHS|¬ªHEÜ-è72ŒžäôA×W[ÛÅ$ÓÊá#Ž5,ÎÄà$“Æ+´Ñ5ý<®èòZOÃiùwKäD¼›íQ% e‹"ãÄmI0»5pôbúÂóL¼’ÎþÒ{K¨ñ¾ã1ºä2§‘Aüj½t2ÿå·ý‚´ßý"†¹ú(¢Š*H!k›ˆ Cy"™$TPIÇ,Ää€;ÔuéášÆòm/û(\.¡û¡cå¯îÌרp©€WˆÐôÀÈn²±`;ž ­n%·¸ŠHg‰ÊIŠU‘ÁAŒTuÐx«þ`žü„?² û_þ=ätãþ=¾ÏÓñù·V¦œl€îãÑ•ÂHÍ,¯JÏœ* \+ýÒ¯¸Uuæf|Muq½¼RM<®8ãRÌìNrI‡>§6«çZKy5¬°=£´ÌåZba-“oßxù€ÆP˜&[t¸h¤;²$…NÖe°¡ 2’;nµz³¨X_x^÷KÑnt¨t»=VúXÄðƳ}™ŒFßËg_9™Š2’¹ m@1çôQEQEQEQEQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅx·í@—ßöõÿ´«ÃÎí¹&½ÇöŒÿ]á¿ûzÿÚUáÌ3ëIˆû?Áw€|8IÉ:]±ÿÈK[Õƒàù|9ÿ`»oýµ½LaEPEPEPEPEPEPEPÌß´7ü”;/ûEÿ£f¯)½Wö‡Ïü,;ÿ ¨¿ôlÕ岞硇~â%ž¦£SO²gt$J H¦¡¤¡£ª&SR)¨TÓÔÖmp‘05 55 5›G\$L¦¤FÁëPRY´uBEØß'š·ôÁ¬Ôb9«q8ã­sÎ&¦œR óV£~+6&üªÜmÓÕÉ8ˆÒú`â­#ôæ³QûU¨ß±®YÄFŠ?#š°žüÖ|oÈf7çšæ”D^WÅL®? ¦‘S+~UÏ(’ãrØ|wæ¦v©«sïR«~Už¨ÂQ.£Œu©VO~*Š¿åS+ñÍi˜ÊÑ&{ñR =øªjüsOWÏÐVñ¨bà]zSƒóɪ‚NžZÙT2p. ;g¢Ny5PHM87<Õª„8üÅ¥ó~µTIŽ™£ÍúÕûB}™kÍúÑæýj¯›õ£ÍúÑíÙ–Œ€õ¦ù‹ëUÌ™õ¤Þ=é{AòùžôÓ üjçši|õ©u P&2qÖ˜\v5ný©…óÓ­fê HÏžüÔM&{óQ—Ö£v?c*†±#IžüÔ ôÆ|ýj6~3\òÍãYÎ:Ô,Ô3~U5$ãf÷¨Yýèv¨óšÖ15HGqÏ5ZI=ø¥vãš­#ñ]0‰CdqÎ*´’ ñNvàúUW~p+¦Ç~zæªHüpqO’L3U$cžk®¸Ç&ª;öùUv&ºáb1¨ØÒ±¦1­R9ç!¬i„Ó‰¨ØÖ‰³Ö4Æ4¬j2kDŽIÈBj2iÌj2y«H䜄&˜M)4ÃZ#–li5ö?äžxkþÁV¿ú)kâÆÏb?_iøþI熿ìkÿ¢–¶çb]Ú><ƒþ=âÿp*’¡ƒþ=ãÿt*“5ÈÖ§ÐÓ~âôE74f•‹¹í¿³¿ü|xŸýËOç={¥x_ìëÿ'ÿvÓùÏ^é]”þ|Ö/øòõ (¢¬æ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>ý¦¿æVÿ·¿ý£^_D~ÒWA‡RK(.E» ò—#û®WkžˆÀã­xƒkVâaá$mÌ¢[¬H6‘µ¿}Ó$0r£œd j+quÝ8\<§Âz3#"¨ˆËyµH',?œœ€rHùFç1fÀÙÍðΔ$“~ÙÄ—[ãÜIG·åÈ ýÑÇ$€W¸Ö¯nô{M.vím2 ?fŒH€³1_0.ò»ŽÒØÉéÒ³ërMwNw…—Âz4as*Ëy‰Ò6¶g' ñƒ•ã ƒ]Ó…ÃÊ|'£dUo6©å‡ïó“I(À䤂f¶¸Št—è’5u$ò¬aìA½jfÀÙÍðΔ$“~ÙÄ—[ãÜIG·åÈ ýÑÇ$É&»§;ÂËá=0¹•e¼Äƒi[3“ŒxÁÊŽq@3õMRïY¿kÛ×§dDýÜI…D * P0éTëpkºp¸yO„ôbŒŠ¢#-æÕ œ°ýþrrÉ#åœÆu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw’EnI®éÎð²øOFŒ#îeYo1 ÚFÖÌäã$0r£œdkºp¸yO„ôbŒŠ¢#-æÕ œ°ýþrrÉ#圀aÔLÖ×N‚2ñ¸uF®¤ƒžU =ˆ ÷­C¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸ä™$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ2<óÍuq-ÅIJM<®^I$bÌìNI$òI<棭Á®éÂáå>ÑŠ2*ˆŒ·›T‚rÃ÷ùÉÈ$”`sÖl œÐ éBI7íœIu¾=Ä‘´yÛ~\€2ÝÜrH=¹&»§;ÂËá=0¹•e¼Äƒi[3“ŒxÁÊŽqA®éÂáå>ÑŠ2*ˆŒ·›T‚rÃ÷ùÉÈ$”`r‡ElfÀÙÍðΔ$“~ÙÄ—[ãÜIG·åÈ ýÑÇ$É&»§;ÂËá=0¹•e¼Äƒi[3“ŒxÁÊŽq@0è­Á®éÂáå>ÑŠ2*ˆŒ·›T‚rÃ÷ùÉÈ$”`sÖl œÐ éBI7íœIu¾=Ä‘´yÛ~\€2ÝÜrH\óÍuq-ÅIJM<®^I$bÌìNI$òI<棭É5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚ wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s :+`ë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9&I5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚‡En wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s˜Î³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’@1è­É5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚ wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s :+`ë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9&I5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚‡En wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s˜Î³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’@1袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šô‚ò:Üÿ׃ÿèÈëê=7ýX¯—> ÿÈësÿ^ÿ£#¯¨ôßõb€<[ö—Ã~ßiÿÚUâ[FÎ@õ¯sý¡bÜømNü|õÿ¶Uãòéê„–Ç*ê e9¤ìKzŸ]x çÀ>?õ ¶ÿÑK[µƒàù<9ÿ`»oýµ½Z”QEQEQEQEQEQEQE|ËûDø¸v?ö ‹ÿFÍ^N z¿íÿ%ÇþÁQèÙ«ÉÅg-ÎÚÝDŠi⢞ fθ2PjE55"šÍ£ª%¤SQO¡£ª&ž*j@k6ޏH˜zš„x5 p‘:“SÆý3UA©«9#¦,Ñ‰Èæ­ÄÿeÆø«qÉœW4âQ§ç«Q¾>•™½±V㓹'(ý=*Â?cYѾ1éVNÕÍ(ˆÒFüêu“½g«œb§I{â¹åÕÏJ•[òªJýªeoʱ”DÕËjõ"·z¨¯R+óY¸™¸–Õûš‘d$Õ0ù§‡Í+´dà\v |}j|Sƒç­R¨fé—D„špnyªb\ b”9#5j¡™t8´y¿Z©¼{Ò‰qÚ«ÚÈZó~´y¿Z­ç{Qç{SöÈYó3ëI¼{Õc&{Rô¤ê!`¹æšdÏ\Õs&;SL™íPê©“³ãžÔÆ|ôëP"š['5w-@”Éž¹¨Ëv5|ÓKæ§Vh =›ó¨Ëf˜_5IÆjÔMTG³qíP³sM/Žj“¨Åk–çþ½Wi:õâšïÖ it‘ÄÒ N6ávˆ™¾b³¢ž¹©CqmšÈ–Vëkj²¨%™Ï'äi$Û–Û¿h$(­Iê •ŠÝÁå´@åq´y8…€*à ÊK3гñ¤7e-5{kKm6 uKhmtá:Ç$rJñ1F™Ê>rÁ²7«’Z€ ¯…þ!µ°Ô.Ù#t²{€|¸æe‘ vYIåùjŽO•ÙXíá~e݇ucoqáè5{8ü¦†U´½„1*®S1È sûÀ’åFv´lr¡ÕF†·ãGÖ›I±2O-Ã[Í0i$µŠY^Fy¶ ²a™ Ù»síü=‘g'šÓJ·w³!YÂb8Ànv\°Ææ‘†"±JÑN¥oqw5ý¦ŸgnéÜÝ ùŽ¢;d„sœcå9 É4OìM;P¸Ö-ówÜšlÅþ_9|½Ñàdiå•M=+Z:m½Å¤Öš…ämtd æ `Ž nÆ3˜ä$Öÿ¶ôíBßX¸ÅÜ—rjP\”ù|ç¾B¨8ó6ǃ‚£Q…WfÝ<[g¤j:­‰„j±é·Íi+9Ý›bçaœFûq»i“aȬ}?­©Þ_Çk«XÉkcš[ÄŽá“n2X"Äe 9Ë” 1É—v†¿ã§»ñ Ýþ‡e™ê¿Újê¬ÒK*;˜ž@îêw¿ …%ŽAc>ÛÅ"×Q[¨´-)ca‚Y£ò eu•dnË1æCÔq„M ÙipÞÛêZqH×T²Inb’D‹p±€e ”¢¼ŠêyÚËóïM¸u¹eªCeo©j%ãmRõ%¶Š8b­ºÈ–L Œñª(ãs7ɱ7aÐQsá»;ox‚ÁäŸû'E–äË&áæ4qÉå¢ç3¹7!Kî+€k=ôø®|=}®F ‹f¡¸¶ŠGýÊÈ’¸á”îS°€|ÍÃaÈ;?á([ïêÚŽ£iVÚÊH—ÐÚÀ.CùЉÊÊ©.ÝÀ1]¹ qYãR6:^©¢"Ú]ÛÜÜE ¹@CE¼+Ç’¼‘ÆO #€ MsÀ·þ—ý2öÄۭص’æ6¤d´‰¸Šï†uáIýËa½ˆ|!dú§‹¬ï5H4æÑw¼ç’UȹH‰fHIeˆÈU%™1»õïê^"µžÞî DI®ÃQ æÜË–¹›ÃG\7v‘À]’8ܸ.Ê +¼/”¯…b#gW )Ü›£º±·¸ðô½œ~SC*Ú^•W)˜ä¹ýàIr£;Z69Pê¢Dñ<Éawoý¦ù÷Hñ½Ò@ca¾òžZ¹•ùv‘±6Çu}ooáè4‹9<ÖšU»½˜) ÎÆsû°òå†74Œ0ÁˆÃöú¯‡µ-BmB ´»¶ˆËräFD˜Ÿ•U›thPp 0 RMûNÔ.5‹|ÝÇw&›±—ÎAûç,‡Ÿ/txšE9eFS—¥4Z5Ζ«‘qq ñphÖEP9Æ1+gŽÃ§}‹Í}|Coª¦¨ÑÁq=ìÚ¥´ˆ­å¤² ËN$ÛîÚcQÀvp'‰<­ø[NŽ÷Q‹lfQ£Ê•<©H$.çEY>ëüÑ—_—® æKÿ¬zψã‡R´´Ó4}LØ´÷ò6ì”!Â!.tA ¤óœm W/Yñë{ä—O±†êiL÷WP£y—2œå˜³¹,Ĭa“ÈùWnÃøÒÖî-~{ýÆæëUÔ ½0:ÀŒ«0ve´ ’¼· (>wö¾soäkzo(Úû¼ß+ýtMÎß•ä ûŒ¿9dÛÏ×A··û_Y¹¸óõ½KΈmM¾W›þºVãoÌŒñ…ýöoªnç袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñÿÚ Ù%ðñPÿIÏþB¯’æåQÊîQ÷zçí§ðàa‘þ“ÿ´«ÄÙ·º¨\¨â°šM’ϱ¼1àú…Û襭êÂðWüˆ~ÿ°e·þŠZÝ­Ê (¢€ (¢€ (¢€ (¢€ (¢€ +/RŸ^ŠáWKÓtÛ˜6Ïu¨< '€« ‚1ŽsÜñÇ1Úßkqùòêúe½¬Q4›¬o%º‘ˆç?!Iã= 9Àæ€#Ò¼[¥kOn¶ ©:\¦ø¦}.æ8™vîÌxÂ`އ<ñŽ¢·+‡‹K·ð–ƒ¤]xV¾žÌKcj{Ãs ÌRË!†ììÂÈY|¢ŠN2@ÜPÌŸ´Oü”;ûGÿ£f¯%ë?´VáaØcþQÿèÙ«É{ÔHê¤ô%œ F)³hê‹&ž D <†ŽˆH•MH B¦ž¦¡£ª&ž B H CGT$L <…MH fÑÕ ƒR)¨A§ƒPÑÕ £`Õ”|â©)©°k9FçD]Í$|Õ¸¤ã²Ò@EXŽ@EsN5cga±¬Èä ²’exÅsJ4‘ûа’sšÌY;Õ…qÓ5Ï(ÒI8Ç2¸Î3YË ëS,˜« @,h+çéR+æ¨,œqR‰8ŠÉÀEàôðõLIÀ |Vn$´[ŠPù5P>iáÀ$¸ƒK¼U]ù§ï§”N€Ù¥Ö«oor‹³‘FEVÞ(Þ)r ²O¥!|U}ââŸ(ù ÷Šk?qP–ß3ÔF O¾˜[|Šg™Š¥”I‹zTlù¨KãéLy9Ïj$J_5Iߊ‰äç£ò¯¶< ÿ$óÃ_ö µÿÑKZDäªïcãhOî#ÿt*~MA±ˆP£½MŸzækSÛ§$â¬.M4™÷¦´ˆ§ ê¹¥bÜ’Ü÷?ÙÏý‰ÿÝ´þsW»WƒþÎ,­7‰Ê°#m§Cÿ]«Þ+ª <K½Y0¢¹ý2ûT“ÆZÍô}–+Ki­a…s°<— K1噄JO/ÝÁfϵM{Z±¾Õ,õÙí»†ÚÈÅÙ †i"@äÄÒío-Káóó6ݼF'a\ÿŒ5ûÏ hw¼6–7¶±<·j¾6çŒmTÄn˜ð+ÉœðGe¦ø»NÓõ¿3U†;»Hå‰!Ô®-°Œ7Éw|Üž}3€*Iíõ),íô{KËDIË©ê3‰wR„JVRÃï‚ýœ(b3[Ä×Çå‘#rê­Ž@b#=ð3è*JËðæ›6“áû;+†ŒÎˆL‹>TlıH²);PvEQÚµ(¢Š(¢Š(¢Š(¢Š(¢Š(Ãh«8§‹A¸¹g[{xoT€ZFˆÔg‚wrG]ªät¯$µÒíîµM7Ã’Ü}–ÁlF¥{0Èó›ìÍs–±c>XáöüÌ—e>¡ûLË ‹Ãa5Ó2Á#Ê‘ê23^ý±/جPy‘Þiïþ‰u…4ÜÏ·¸v,¬#,á·hM¨x{ÃZuœºÊK}¨i‡ìñÇ 4'|†à&–ÜyŠ>ÌzD9|gä;£ÔtÍ6[ÛÁ¤jO«&§¨Dg}±¸XVo6 ŒÀ*òïùvɟĺô:¤º¤ZÞ¤š„ɲ[µºq+¯3ç$|«Á=‡¥S†þòÞÎæÎ¹ãµºÛöˆRB]§+¹G ƒÈÏJï-ü ËâQ¥0Ô¶Yë°è—’ ”ÍÃJeQ4cËýÐ ;ü†ÆáŒž^ WMÒõ˜¤Óí®çÓJomîåQöØ÷e ¸Œ0 @Ë”`9*®¾%וìu½H=‚³atù·R¡HŸ`cŠ4Ýnk eµ™<ËIÏòÈNÛÁ„¯œ— å€'°[pX=wLþÄñ§¤ùÞwØnå¶óvíß±ÊîÆN3Œã&ºøDìçÔtHúí븒±¹ Uñ2O\c`1˜ß½8ú±5ýåÇÚ<û¹åûL¢y÷È[Ínö~ó|íÉçæ>¦€:‹/ì¿ê7·ZŒsÚØA¶ :Ñ.|ˆa XÇ ¸1:«pÇ.ªùŽî¤×$ðv‡k¢7Úµ¸õimî® ‚XeIUayScÀ±8Éòs—fâH!2üüþ)Ô¿¶eÖtû«½;RºCöÙí.Z?>FmÌÃn †!X®HÝ’00«Ÿ­©C¥Í¥Å¨]¦Ÿ3ï–Ñfa·²gü«É‡¥tdž­—Y›BÑ­5)u ]Lio4²#As)fE í_$³!!¾A?0Ù–±okáB-MdK¶·Ñ4ȤŽâÏlfíüôYw†LÏ9ç#TÜŽAZçlj5¬[«ê—s%µ¼¶°$Ò™¤ŒÆèŠÙ qŽØè*½ž­©iö÷VöZ…Ý´i²æ8fdY—aÀ8a†#ÔúÐI‡´{‹84¾K«ý>ïS¶‘®’á3â'_,‹só†@7ƒ·åÃhjú©xŽÙ,4Ëë;4¨n®ÜLޝ<\*"P’8Ž@XîÜÛŸok‹VÔ¡ÒæÒâÔ.ÓO™÷Ëh³0‰ÛŽY3‚~UäŽÃÒ…Õµ%K$]Bì%ƒ—³Q3bÝ‹&>~BX‘ŽFh¼FðÞ¤^ÝÜ躩ŽïÃñjÃ=äbXs~±eÁüJƒmû¬ÃÀŒôð~“oáÄmJö{}vkK›¤µ).øü—• 4B˜,eM™$®æå×]ÖQQ]Vùo¢ßåÜ‹‡&òÌØläd»“êY½MG­©C¥Í¥Å¨]¦Ÿ3ï–Ñfa·²gü«É‡¥j\ÄÓÁ¿Úów¦ÝÃdf<´ÐɘÔÿ×?!€'$¬Š¹ Š<1¦iwßj—U3ˆÓdpí›ìñ¼­¨Ó˜äTc´à0U 1.¡0Ù÷ºŸÚtë-:|›K]Ò-½žg $œ»Uz¶æhôÝ[RÑ®ãKÔ.ìgd(ÒZÌÑ1\ƒ‚TƒŒ€qì(Kò9u&†Îùítù|»‰e¶(aË_4 ˆØ‘¤õÈÉ®ÒïK¶ñ=Åœé¨5‹m6XfÓ ôö˜¸X÷£fà/–ÁšP¯”R1½ë‹´Öo,t}GL·}¶ú”.O̱¶åÎß½ƒœnÀ 3ŽóVÔµ {[{ÝBîæ DÙmÓ3¬+€0€œ(Âè=(¤…,üAöÝVãO¾–Ò ¸4í;H°œ#ƳyÍ+˜ßv<²Ù¹ÚBÄîÎëׄt}:ëW–+ÉÍŽ—-íœÉ$©ç„•’Ü(Û¬69Á"’È+Ÿ¿ñåÞ£s¨ÛË=ÝüNš‹A1Uºg$ÈH¿“•Ýœap«Ÿ5ýåÇÚ<û¹åûL¢y÷È[Ínö~ó|íÉçæ>¦€;ø{IðÇ™&‹¬O&§¥j k;Äe8oÃî0ư°hŽ<„äá¾B[İC/S†(ॹxcPª’,’Bä€4Lû@wí 3N]bòûì0j×—×¶6xHàk“û¸øc-¸&BÀ `pqŠTÔ¦Õ¯Úîe D#Œ±Æˆd“…UUÉ$œd’rh¨Ò1æGy¦¿úÜ2h£ÞÒmÀêDŒYXFæpÛ° °ð嵫éÂÿ׺‚‡:­ÉFÚèr*GC— ¬0*»Úé³|9ÓZ *î]YïoA¸ŠU#lqÛ»A⊄ànNöÉ uÝa5õÕo–ú-þ]ȸq"o,͆ÎFK¹>¥›ÔÕxoï-ìîlỞ;[­¿h…$!%Úr»”pØ<Œô  ‹øšx7ûB~nôÛ¸lŒÇ–š#sŸúçä0ä•‘W!cQ\ýh^êiÓ¬´è!òm-wH¶öyœ(’Bp:ìP`UêÛ™³è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñÏÚo–Î?Òy¿ÕWŒ§²É¼ð9ü«Øÿh’É7‡N0.¹ÿ¿Uâðωo+…ã««²Yö/‚?äAðçý‚í¿ôRÖíax'þD/ÿØ.ÛÿE-nÖÅQ@Q@Q@Q@Q@Q@ö>ðÞ™y凇ô«K¨ó²h,£× ƒ†# ‘øÖÅPÌ´Wü”;ûGÿ£f¯$ë_´_ü”;ûGÿ£f¯$szoAàÓ¨Å8–tE’ƒO¢ž CGDdJ =MD 8–ŽˆH˜x54ðk6Ž˜H”„x5 P‘04ðjiàÔ4tÂdÀÓÕªiàÔ4tÆdêäTé&1ÍT OWÅfân¥sE$ÆjÂJG9â³Nœš°’äqšÂP(ÔI;f§IxëY‹/|š°’Œ×< #Edç©ÖSœçŠÎI†*e“°&°”ÐI{æ¥YO\ÖzËÐT¢^ƒ&²p ²¤ÓĤžµ@MÐT‚`dà/‰qÞœ²É•qô-b;;«É4«äµ´”Ás3[¸HdŽØÂ¶H<ò(ä–¾‹YÖY âRÚLJUvžT}¤î;¶ŒpIÏ µð¯Ú[YÖD£&"Ųw¿iÀmÁÉÎOӷе‹»É,í´«é®¢—È’íÝ$Ã…@Èl#œuùÐÕ{« Ë#í–“Ûùñ,ðùÑ”ó#oºëžªppG€4 ·†þÇ3 WU7C•Ó#ØØ'fæóò¹s…;r@ÝŒ™$µð¨xDZβÈ_–ÒbR«´ò£í'qÝ´`ã‚NxÁÏIÔ¦ÒæÕ"ÓîßO…öKv°±‰Žñ€~eàžãÖ‹Í'RÓíín/tû»h.Ó}´“Bȳ.Ê0à G¨õ  ká_´:¶³¬ˆ)GLE‹dî~Ó€Ûƒ“œž9ŒÛxoìs0ÕuSt7ùQ2=‚vno?+‘·8S·$ ØÉ$ð¾±ÿ ¡¡ÙØÏ¨_XK$S%ŒO/Ü}ŒÀ¹Ç$¢©Ç¤êSisj‘i÷o§Âû%»XXÄÇ øÀ?2ðOqë@ZøT<"-gYd/‰Ki1)UÚyQö“¸îÚ0qÁ'<`‚׿humgYRŽ4˜‹ÉÜ ý§·'9< rk×´+û;+Ý2íg½HͲù<ÖtFعPYÔ¸V8n*ºxwU¹Önô« »û»Wu’;[i€VÚX¡Pê3¼ Œ€@ìÙ¢+½À…¼µVrŠKcVP{•#¨ªðÁ5Ë”‚)%pŒåQKª¥˜ñØ($žÀ@׿humgYRŽ4˜‹ÉÜ ý§·'9< s¶ðߨæaªê¦èoò£:d{ìÜÞ~W#np§nH±“~צÕ&ÒâÑ5'Ô!MòÚ-«™Qx哿^Hî=jšØ^?—¶ÒvóbyãÄdï7nqê£cäô[ÐФ–¾‹YÖY âRÚLJUvžT}¤î;¶ŒpIÏ µð¯Ú[YÖD£&"Ųw¿iÀmÁÉÎOáÖ¦±¢M¤\MnÞd²Z8‚ù–3åÁpK~ëF !௷r€ÄCm῱ÌÃUÕMÐßåFtÈö6 Ù¹¼ü®FÜáNÜ7c&I-|*³¬²Ä¥´˜”ªí<¨ûIÜwm8à“ž0qç‚k[‰mî"’âr’G"•d`pAAã¡'†µèl¡½—DÔ’Òdßíjáv2­Œ±Y²;z °-|+ö‡VÖu‘E(ãIˆ±lÀ¯Úpprs“ÀÇ1›o ýŽf®ªn†ÿ*3¦G±°NÍÍçår6ç vä»5ìô[ûíÆ;YÄki%á“È‘—ÊMÀ¿Ê§åÜ¥7}ÐÝH‘zN¥6—6©Ÿvú|/²[µ…ŒHÜpÏŒó/÷´¡%¯…CÂ"Öu–Bø”¶“•]§•i;Ží£sÆ-|+ö‡VÖu‘E(ãIˆ±lÀ¯Úpprs“ÀÇ8ðA5ÕÄVöñI4ò¸HãK3±8É$ñŠÐ>×…ÅŹÑ5/>ÝâIãû+ Fc ± (=sÆhCm῱ÌÃUÕMÐßåFtÈö6 Ù¹¼ü®FÜáNÜ7c&I-|*³¬²Ä¥´˜”ªí<¨ûIÜwm8à“ž0qç‚k[‰mî"’âr’G"•d`pAAãrm X·ŠÚY´«è㺉§·w·p%W{:’>e ó8ž”pZøWí­¬ë"ŠQÆ“bÙ;_´à6àäç'Žc6ÞûÌ5]TÝ þTgLc`››ÏÊämÎíÉv2lXø#Äš„º¤è×ßjÓbIn-¬žhÞʪ¡Bçq ¸Œª±íYcL¹:3ê¦9¢Ü-°ÄûYÊ– >Ý™ ‚ÀüÀ€FHВסák:Ë!|J[I‰J®ÓÊ´ÇvÑƒŽ 9ã¾ûC«k:È€"”q¤ÄX¶NàWí8 ¸99ÉàcšshZżVÒÍ¥_GÔM=»½»,j»ÙÔ‘ó(_˜‘Àô«~¼›\:ÜSØê²mŽÞÚæ…æll³‚›áˆÆJç K(m¼7ö9˜jº©ºü¨Î™ÆÁ;77Ÿ•ÈÛœ)Û’ìdÉ%¯…CÂ"Öu–Bø”¶“•]§•i;Ží£sÆ\6—w7ÚO%­®ß´L‘’‘n8]Ì8\žzÖ†¡á÷±Óìz…ìqJ°\‹Gfû<¬ª–*óåÉóF]~CÎ äAká_´:¶³¬ˆ)GLE‹dî~Ó€Ûƒ“œž9ŒÛxoìs0ÕuSt7ùQ2=‚vno?+‘·8S·$ ØÉÇ¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX ý£A/áÃŽÚsÿ«Å6…Œ -^ÝûDª´þÝÐ}§¿ýr¯“ipˆ§Ž˜äšÎOQ3ìȃáÏûÛ襭êÁð8Ç€<8?êmÿ¢–·«A…Q@Q@Q@Q@Q@Q@Q@1~ÑŸòPì?ìþš¼Œõ¿Ú3þJ‡ý‚£ÿѳW‘Ô³X=ŠQLRm<x5§RÑ´Y(4àj iàÔ´tFD ÓÁ¨§PÑÑO¡ž CGDdL <„p5 1™84àjniàÔ4tFdÀÓÃT Ó©hèŒÉÃsR#ã¿ëUÁ§¨q7ŒË«'ËÿשÒNùýk=[¤Y8ëúÖR¡¦²cŒçñ©Ö_˜súÖbËóZ™%ãÿ¯XJ˜k'|þµ*Kןֳ^:þµ*Éׯ½e*b4VLž½=êA/=ZÏY0:õ÷©^¿ãY¸ $ÀÆZU“'¯ëT<ßÖ¤Y8ÿëÖn˜üßóš<ßóš£æûþ´¢Lž¿­O³ï›þsOÝþ×ëT¼ßóš<ßóš\€^ó·çAqŽ£óª>oùÍoùÍ/f"á|¹üi¾oùÍUóÎióßõ¦ 2ß›þsMi3ÎqøÕ?7ßõ£Í÷ýj½˜|ßÖšÒwÏëUZLþ½7Íÿ9ªTÀ²dÈëúÔFLŽ¿­Vó}ÿZÍÿ9­0,™21ŸÖ¡ixÿëÕ7üæ¡2dc?­ic'yyëúÔ)çüj&“Ž¿­BÒó×õ­£L ^^œþµIœÿFÏœÿFZ¶Œ݇ëÍ0šBÔÂkTŒ¥1I¦“HM0š¤Œ%1I¦HZ˜MZG<¦)4Âh&˜MZG4æÓ  ša5iòL&”ša5iÒL&‚i¤Õ$sÊBM4¤ÓMZ1“ÒA¦“Tc&ö×?äžxkþÁV¿ú)kâJûoÀŸòO<5ÿ`«_ýµHÂgÆ:˜Ô 8Í?4ÈÏî“è)Ù¬ç­î¡sA8=)3FiÌ{§ìÞÁ¤ñA‹NŸöÚ½æ¼öoÿ[⥧þÖ¯y­ã±äÖþ# (¢¨È(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šñ?ÚQM>ßDùÝdšØ‘VÞ6,cSûÆÆ0ÜíaÆW‚<Äú®©jöw7“[ÛØÁj¢ê0…<´B€ì’ u¹ã¹÷Ú3L»ÔO†~Í)Ú¼É]Ö8ãÏ•ÎÄ*ç#'ÍxÄš}jÓH¶˜·³] 9"gyÎ@Gù>l°+¹7¨8É‚@ jPéi¨\_-¥ÅŠ¢7Ù.“θVß#Ï#r•v<žU3¨7"ñMœ–p^^Ë}.¯m§ÝØd—h3–™å/¹X}¥ŽÝƒæ¾\µð­õÍÃÛi“Zj·¢™ ±—|É9DCƒ1]¤“uØæ«Ãá­zçK:¤&¥.žœÝ¥«´AW;Žð1ƒ“ž0h´¶ñ§†ã×S‘5U’ëÄúåÈXca—ç±ñ» (a# “±Jáüþþo´j73ý¦{¯2W>àbIrIÜã-ó§“ÉêzÖÆ·¦iÚ#èWsiCsiö™¼ådŽV[‰cePq Csòµd>†ïÄ}¥ž£iga©ÛýªÖïSœGk†ÜŽøê²G$[¶ÅA%ž½a…ÚÎyoäqI°Çò-’—‰2ƒBUÑ·9ùYÃ%ÏøÆßÄ6÷"ݤS}{öé uµºÂØ|)’0^à5€wÛÐ’¤·ËÅÑ@€Þ2Ò[\ñ;ÆóÇc«ê ¨G4úM½ã¡i1˜erƒ™Î?'Oœã?Vñ=†¶¿Úê°jqEuG—‰ÄÒÍ!i&vÿÇÃ+"ņ FWËÇÑ@šî¥¦ê°ÚÝD·k¨ {{yQ‚ˆ£XaX²§$¹}ŠÜ„ÙÈùó¸ljzþƒ«êž%ŽYµ(4ýWSMJ)ÖÑTaç~í£ó@ÇïÛæüåù¾^.Šï5_C«k0^ÉÜp-–©¶Þcší®ˆ+Èbhƒ6;: æü1¬ÿ`kGQwØnâ¹ò·mß±ÃmÎ3ŒgºM4CákÝI®¤´Ô4fEšÐN–ý•Ë[È‘dñ¹dÏÜFš2C°SÅÑ@O<×WÜ\K$ÓÊåä’F,ÎÄä’O$“Îk¸½ñ^ƒrú…ÌGY†ïPÖ"Ö%xvFaeYÏ“dCÊ L{|°SÁÑ@d"Óeñsj÷bî.ì® ¸Š•þÌÒ[ÉXT²ƒ†BªJí_“¡š;=z µœòßÈâ’(aä.[%.$d;„«£nsò³†N^ŠÔðþ¥•«y÷ !‚K{‹Y `Ešˆ¸€ÅCîÛ‘œc#9$^'Ñí´«ë kÍV=º!Ò­'[dV›uѹs þíN|¬ùRXÿtðôP^¡¤x¿G> Õ/!½¾²“V–ïR¸™£HÍŒŸd» °“÷­ºã O–IEã-òù}ØÂC£ùÙ￳?²¿³~Ùötó¿ãïí{üŸ3oÞýÞ<Ο6†²ãÔ´ÕðÖµ¦ªÝÂ÷¶×VjBÊ6Æ&R’>WlÀî rW ÏtP¢'ŽôÛ-GVÔ¬RK½^â{ç"5ŒÙLÖ÷Q¢ÆáɺÎü!<…$àsñˆ|F4$–¶úm‘‹P»t ŒÜË#IŒòÌ  6J盢€:‹ßYêkâÛ©¥Õm.µ{µ¹·´¶˜f̬ì³çöƒò:äñQø–óA¹·‚óRû5»‘Í’D¨¤|Îγ1yX…ÜvŒàµUPstPEPEPEPEPEPEPEPEP¤|ÿ‘Öçþ¼ÿFG_Qé¿êÅ|¹ðOþG[Ÿúðý}G¦ÿ«⟴y"o 3ÿ_ûJ¼^! ˆ2/Þ8-ŸÒ½³öŠŸÃyÿ§Ÿý¥^+…à`dw¨“ìøÇ×K¶ÿÑK[Õƒàù|9ÿ`»oýµ½VEPEPEPEPEPEPEPÌ?´oü”;ûGÿ£f¯"¯]ý£䡨Ø*?ý5y4™q)ÀÓ)ÀÔ³TÇS¦S¤ÍbɧQƒN¤Ú2$ž D 8†£"PqO¢œ KGDdL 8„5<†ã2`iÁªiáªZ:#2`Ôàj ÔàÕ ™0jp5jxj–ã2`ÔàÕjPÕ-)–jE”â«æœ¡ÄÕH¸²àu©DÜEPÇZx“ŠÍÀ»š"cOIºô¬ñ/šrKךÍÓDMÈäTžw¸¬Ñ(Èæ¤ó½ê0/yÞâž³qž?:Îó½êA0Ç¥Óÿî(ó½ÅQó½èó½é{0/yÞâ;ÜU;Þ;Þfï;ÜQç{Š£ç{Ñç{ÑìÀ´f94žw¸ªo7Ni¾w½R¦Ç›Ž¢™ç{ЍòñÖ›æZ¥L q¦<ÜõWÍ÷¦´¼õ­0,<ÜÔ>iõ¨YòzÓ7U¨!\ÈH¦æ˜[ŠBÕ¢‰c‹S SKRªHÆSµ4µ4šij´Œe1KS© SIªHç”Å-L-HM4š´Œ%1I¦HM4š¤ŽyL ¦“A4ÂjÒ0”…&˜MÓ ªH甀ši4¤ÓIªF2bHhÍ!5F-ˆi´´•Hͱ ¯·< ÿ$óÃ_ö µÿÑK_WÛ¾ÿ’yá¯ûZÿ襦Œ¤|]úµú uEŠÅ>±hôâôC¨¦ÑœR°î{ÇìÝþ³ÅKOý­^ó^ û6_Å ñiÓþÛW½ÖñØój»Í…QLÌ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šð¿Ú2ûìgÃ!í-n¡“í[â¸9Ç•Œ2ëÏ÷Xg9WŒAã Ö­5q¤é{ м’VI ¸œd‡ŸåÃÛSb“Œ‚Ù¿iÓikáô‰6Ï7Ú“Ï•‡QþöFHÁÀ#£\«áëaµ LH~Ùc«­¬3CdÛcˆ¥ÃyDC–f˰cœã3¸ g¬­…ÅÕÄVše•÷Bg‰¦[a“•D‘™qûÀä`Aæ¬OâíbòÞX¯$´¼yP¤—7v0MpÀŒs;¡“ pì€À­Ë¯YxoN¾ºñ _O$Ú¬PZG%¯˜%ÜB¬¸òs¸#‚½Id“QðV›¥ÞÏ¢Ë=Üú‡ÙïWT‰VÕîcE´–-öVù„ƒ`àíù€0õ=zz 7Om+JÒ£µÄ1ÜÂnO•wrt’ewHÌp¥»8©‰á´ñŸwg§Z^Xi–ÿeµ´ÔàG"á·;¦z´’I.ÝÇi`!Età_ϯj¶V··ÐZèÚ„¶×SݲŸ9+™¸„ÇjÉ»nÜ Ç–pïΙázÎãL’MGG½· slæ@“Åæ2¼^cÅpLy#ù£Ý@¡®éŸØž!ÔôŸ;Îû ܶÞnÝ»ö9]ØÉÆqœdÖ‡ˆâYka¢[ü°‹K{Û†^>Ñ4Ñ U˜°’ˆÀÉk0È€9ú+Õ5)´û=gÆ:Ŷ›iZÂX[×nwÀZèùH†3rc2º–US‚ßq¹½oCÒí/ümV¯üK5 “Û&ûktóÙ1;¶Xe@ Ï$æ€8ú+¬×dÒ!¼‹F-$ÓÚÔLA•–æáË ±;Sqr å»u-V ?޳éÑYXµŒÞ k&¶šÎ)c›¥U]H^\:@EX†ÂòâÎæòIäµµÛö‰’2R-Ç ¹‡ “ÀÏZ,l¥Ô/#µ…àI83ΠÀ'—rtîyéÖ€+Ñ]¥Ï…´Êö}^MJöâÊâ [‹H"6!Zd’Duy‘œ€±U¢NXHj÷Ú>ƒ¦øinçƒY:ƒ^ÞX¥d€ˆFË#©V(Gš¢Ëdäï\`€rtWaoàõO±ÜiÞmæÿ%îíeŠc³†ÄHËÈ?ê »F ìí±máØ¼§jwš¹î!–Ð —Lvic\î‰îªÌСó ª­‚Ç(ÀoEwv6ÿð”x³Â±Ç¶ÂÚ[ù¬C1o²½¸y2¹äîŽ眫Æ5¨ô(ô$h:¥ý®¥žÞü\\^Ø%Ŭ’Ýa6èÃb»ƒÆH4ÅÑ]‹½Õ…êͶ·–žm³E§ÃdÛ²FwÅÊz?9l®Þ{~€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX ý¢†fðçý¼ÿí*ñ\ŠöÏÚý‡?íçÿiWŒ‘YËqØûÀÿò xsþÁvßú)kz°|ÿ$ÿÃö µÿÑK[Õ ‚Š( Š( Š( Š( Š( Š( Š( ˜?hßù(vö ÿFÍ^C^½ûGÉC°ÿ°Tú6ZòE!ÀÑMêE¦8u2”F‰ài” ÒhÑ2AN£š›FD€Ó¨§RѬdJ <ˆPjZ7ŒÉ§PƒO¡£x̘pbטhó UÝFê\£æ-y†0Õ]Ôn£”9‹^a£Ì5Wu¨ädLe$õ¤ó*Ñš®Qs³’)7ˆ·4›©ò‹œ~ê ¨óIšv!Ì~ênêfêBj’3sOÒi™¤&ŒœÇM&šM0š¤ŒePq4Òy¦“M&©# Lq4Âi ¦–«HÂSši4Òi¤Õ$c)ŠM4šBi¤Õ$a) M4šBi¤Õ$c)4„ÒM&©#HRi´RU6Óh4”Ì› i¥4•D0¯·| ÿ$óÃ_ö µÿÑK_×ÛÞÿ’yá¯ûZÿ襦C>+O¸¿AN¦!ùéKšÄô"ôC¨¦æŒÐ;žóû6}ÿ}-?öµ{Ýx'ì×÷üQô´ÿÚÕïuªØà©ñ°¢Š)QEQEQEQEQEQEQExoí!pñiú R[´¶rÄ|»%<¶Ý޼¿¨ÝЀËàyªëÊÁîoo¼¼CinÎÒíÎHלg 0=} ûHío i æD$M&Æ‘U™Bí%A9l\ã8ÎzW›ZêzNâ;RwÒRÒß[·}=íâ†G[ ¿˜eT÷òH20•ùƒPg õå½Õµ¡‘âDûTÐ,˜Ü#oÙŸ˜ª»ž!wžcR>»¬Igug&«|ö·r™îak‡)4„‚]×8fÈ'žj4zÂx×Nk)´Ù5Ǹ… ]8AåG>à#_s·+ó|Çvà2õßìïøHu?ìù}®_±ýïõ;ÎϽó}ÜuçÖ€,[\m¿¶žùä¹Ô£¤ÍæOv2U”gsÈ»þðÉS ÉÆl6§¬hÞ(“QÖ¡¾“_·Ù$M¨3‰"˜1ÈáÆæÚ¸*§;s¹AVè-.lí¼K¡†Æ7‡ä·µh‹sKo4r®öfnÞq¹ÆÕÎ~àbøøkR}>Û^º±´šÃOX<› ÆHc&âáö«Åop$¼šÖßZ»´´{K%ŒZÙj`ŒÓ9HäH.|ÀU‘É.pÒ0ÏP›´Ä–>Ôd·Óo—DÔ|¡qyäIä²Ç'Ê7}Ïõ˜çï0 Á±î¬n,¼ƒqÕž%š& ]pG>Œ¬§="K. ÊKgÒ¾Ëo¥j«|/÷ÞF^[±BÊY\H€±€²³|˜8ÿù§Ÿé?ôÿ@ÿ¿_é]?íÏïÀŽ€+ézï‰ –ÒÏIÕuXä]ÐZÃiq #Ì`J"©þ& HHêO'Ä×Ú]ΙÔ¯´½)ÚIb·‘®-mÏ—ù @>ùÜ8#qÏZ“¿óò?ä!ý•?Ù?ñß?¯ñíöŽ¿‡Í¶‹?ù'šÏý…l?ôUÝSÖ ×™áÕ5ص"÷è+»å|Ü(UÁW¾•äÁÕ'†ÿá$þÑ“þí_·yGög™æyyÏ—ÎÜíöÎ+°ñÞ©aq§kbÌØ¬ž·¡ha¸Ži§L\’R¿4ëb …Ú0XHÆKdžM[ÄVM„nç’âÎT²´»ÚcªÃ i#“ÌŒïRê6ïäÉ!ÚÛr }’jPøOQžÏI»6“8‚÷R³D±†Ö,ãjá’I8@6ÛéÛëºÅ§ØþͪßCöÿdòî~Ï¿ïìÁùwwÆ3ÞºG¹†öûâ%ݽԗpOnòGs"…i•µ r€AÎ0:ô+Ÿ½Ðæ²ðþ—¬µÕ¤°j/:$qHZHZ"¡„ƒRC«“ÁŒÐ;ëûÍNòKËû¹îî¤Æù§Èí€ËNðªõ±áë} æð®¹{=¼ÀFàçtddÇÄOž‡hù‡Q«ÇZ:¥¥¯…-mÅ£ÿh—1\:Üî}žKïyÏÉä屌1!°€yýè!™dñ-†Ÿ›áIá{KyåX¦·Šn>ÎRóÅ"ùxpÿ"º!*§i-–¯™àyr¯¬Nc]»ÜI9Û ´v“ßtPíè<ÁóN='R›K›T‹O»}>Ù-ÚÂÆ$n8gÆù—‚{ZŽêÆâËÈ7íYâY¢`Á•Ð÷ppASèÊÊpAÒ!Ô´{]l¤±k{]+RÓ¥¸šéeóëÉH¢eIã4E¥Tèqû°²ƒÇÿÍ<ÿIÿ ¯úýúÿJéÿn{þütÏÑ]¿äo¾ÿü³ÿüyÿ«_õ×ý­ÕÏÐEPEPEPEPEPEPEPEPEPEP¤|ÿ‘Öçþ¼ÿFG_Qé¿êÅ|¹ðOþG[Ÿúðý}G¦ÿ«ã´7úïÿÛÏþÒ¯+Ú?h_õþÿ·Ÿý¥^/Ž+9nR>ÂðJ…ð‡T0`4Ëa‘ß÷K[µàcŸ‡þ>º]¯þŠZß­ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡ØØ*?ý5yzÿíÿ%ÃþÁQÿèÙ«È) @8¤¥ ¤:”S§R)1àÒÓ)A¤h˜ðiA¦S³JƉ”fiA©±¢‘ 4ðj iA©hÕH˜Pj iÀÒhÚ3&œ¡Í8–£2`iÀÔ Ó©hÚ3& N¡œ E£2]ÔðÕ4ày¤Ñ¬fL”ˆ74 óScU2`Ô»ª-Ô¹¥bÔÉwP F ¥bùÉsFj<ÑšV+œ—uª,Ñš,?hKºÕê7Q`ö„›© f£Í¢Áí 3Aj4™§a9’n¤-LÍ&ê,C˜ýÔ™¦HZ‰uæšZšOÒÕV3sZšZšM4šiÊc‹SKRM&©#)LRi SI¦“T‘Œ¦)4Òi ¦“T‘Œ¦.i ¦“M&©#Lq4Âi)3T‘“¹¦“HM!5V2r ÒQHM36ÀÒHM%36š ¤ª!°¤ ÑA,+íïÉ<ð×ý‚­ôR×Ä5ö÷?äžxkþÁV¿ú)i’ÏŠ†Ð2:Ræš¿t})k;iè.hÍ%Xw=ïöj ·Š0{Zíj÷Êð?Ù«ïx£éiÿµ«ß*ÖÇ$þ&QE2BŠ( Š( Š( Š( Š( Š( Š(  ý¢t›ÍSþö¶‰ŒvðßM4»IDUHß’Á;HêkÀ$ÑuXc‚ItËÔKˆšhY `%Ws:œr¡~bGs_Bþжz|º÷+;HöºŒ¬XÀi"DÜÙì7©9ã äš§ŽÄ—òÇæ’[á{5¬–CG)?žáH•Ж+•-•;þPH²Ö?ÒZÊâY4ù¦’alïþ޹Á•IU%LeÆ,¬B–ªqé:”Ú\Ú¤Z}Ûéð¾ÉnÖ1#qÃ>0̼Üz×Aoâ-4xµ®$qh±Ù\iÖ«JÒÅ ÛÉ 1MÁK’þcà€]œŽµ_ûcM›D±Ï©A¨iöSXŲ¨I–G•÷4»²£÷ì¥6à¸Ü7å@3ï-µ­?Fµ‚úÎîßOºµZ›‹r«!Úx™‡B¥3´á°™ÎÕÆ…—uíJÖI¬,äºx죽x ‰ÞUW—ËD*‡eýèãù®ƒVñŽâ ò÷­ ³¹½mNîÌiÐ[)dI`2 ³.c¶Ý»‹$ü¼Þ¯$×Z°Ö¥ŸËÕ-ÚIíáVhË‹²,¢íJ PT*ž8P¤l/ËÛi;y±<ñâ2wÆ›·8õQ±òz ­èjÄÚ±o-´SiWÑÉu+AnnàË"¶ÆE|Ìå rkqõ¸lü&ðCåý¢w–+È%žÖÍÛ2+È1´–Mª  ¬·” Tž£Xñ¶•¦xÏ]šÖòïUúœÏ5ÄÐFé ®mÓËÝg@·¶#Uèß(™ßX^i—’YßÚOiu7Ã\Ÿ4e×ä<à®MÂúLjàÔ%Òlgºû K,‰ O#6çT ¡AËr[*9íUïµ´éš]šGi†AÀdi‹Ÿ˜ïb¾X-…8E\€›¡ghº¥ùž;]FÐ[<ÐF$x±,r†YCdĆ7gœ`€SIÔ¦ÒæÕ"ÓîßO…öKv°±‰Žñ€~eàžãÖ‡šûW¸´¶K‰UÖÚ£íœ*"(êX’p2ÌÄœ–$ô‘x“GŽÎ £Žú;«->ïM¶µeIãœÏ‡y²¤2‹“ÀŒ†òÇ+»åçôKäÓµˆ.e’xã]ÊÏ«0 ¥NQþYŸš6ÀuÊ’dX³Ð¼I¸lì´­U5{M³˜a·O0Uö¹z©ÜU‹[¯.‡«Þ[éûô‹¹GÛfdor|Áv±B±0óˆ6‘¼cWAŒ´˜¾Ûb'`Q´à¦ÿ”Ïëb_ _Å®jÚH_6m+íæHc’DQC7ʤ…$€á’£$c×a'ˆty>#êúÖûá¦j?nù¾Îžti†DûžfÓµ¤þøÈã8  »)5ø¼'¨ý’ÆC¢Êâ;˵°Vî‚4û7(ܱ»€Î8ç“Äž×¼<öVúÕµÜHmÐÛ‘Õ²‰Yp«JCÑ‹}MË=z µœòßÈâ’(aä.[%.$d;„«£nsò³†Jzê°ÚÝD·k¨ {{yQ‚ˆ£XaX²§$¹}ŠÜ„ÙÈùó¸aÖÆ‘á}c[µ¹¼³±œØÛE4³^ŸÉO*##)p @Ý—¦hñM®câ;»mâyôØöÞwG}Ûx,Ÿ+a÷ ®Tã ‘‚v4ÏhðiÖyñ¾³Ò¯4ÈRO,ùÂବÄçƒ9R€t·¸@1í¼)â »Í6Ö-ûÎÔù² ¸r³ €A-œrH%Ï„µ˜¼As¢ZXÝê–èDµ³ŸpR䣢¸0*:Ž ‚zËψV7>!°Ôñ?’u¸5k«h´Ûk/c³lóç¸`$`Êt$‚_åäô}KMF¾ÒõE»ò'¸‚íZÔ)gh–UòÎã„ &?>nÑò6xÏ—IÔ ¸û<Ú}Üsì‘ü·…ƒmŒ°àŒáLn í±³ÐÖÄZµâKÃzzѨD}·O:ípIäIƒ•Çñg€~úÂóL¼’ÎþÒ{K¨ñ¾ã1ºä2§‘AüjM;M›R{G[ÛÉq,’’U8'm¨¹êΣ½ÓRáSK’îXin‘ci$ä"– csgägh¹5õ½¯‡-¬ldÍÅÞéu•8ˆà9ê£gšH8c"‚3Oû'RßrŸÙ÷{í]’á|–Ì,ªìCñò±ÈH=‘cRYè·÷ÛŒv³ˆÖÒKÃ'‘#/”›•O˹Jnû¡º#¤ÅzjÝiªçR{K$’Å‹mgžÖXš)eÆp“„;Pe—jÄ„â,Èé·^'¶ºšÞKM54Ë›=––똚â9Œ›¸]‹5Ãí‡îÕAç$€rãIÔšÁï×O»6hŠïp!o-Uœ¢’ØÀ•”åHê*KÝ3ìÚu–£Þu¥ÖèÃØÉ22FFOMêC ‚¬½r®å·ŠáŠßF·Ý´=ý‘‚¢kr¨Î1‰b x?'Cšwñ+ðoö|ü]êWpÞ˜O 1Æâ6?õÓÏbÁ ¶ Ȧ€1ï¬/4ËÉ,ïí'´ºáž3®@#*yÆ«ÖÇŠoìõ?ÝÞX]ê·v²lÙ6­ ’å°Šö@ö±è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñßÚýw‡íçÿiWŒb½Ÿö„ÿ_áßûyÿÚUã8â³–å#ëßÿÉ>ð×ý‚­ôRÖý`øcÀ§ö]·þŠZÞ­ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFË^A^¿ûGÉCÓÿìþ–¼~¡h¢ŠC€i)hÇRÓ3N‘IŽ—4ÊPiX´ÇÒæ˜ ;4‹Lp4àj<Ó³JÆŠCÁ§QƒNÍM‰§Qfœ•T‰§ÅD 8›Æd Ó¨¥ Sce2`isQn§n¥cE2PiwTA©sScU2\Òæ¢Í(jV-L”5.j-Ô»©XµP“u.ê‹u½è°ÕB]Ôn¨÷{ÑšV9&ê7Ty£4X9É7Qº£Í½è°{BBÔ™¨÷Qº…í 7SwS Qº‰uÍ!4ÝÔ„ÑbǤ&˜M!j¤ŒÜÇHM4µ7u;¹Ž'Ši4Òi ªHÉÌRi ¦“HMRFNb“MÍ!4ÜÓ±“¤ÒfšM&j¬dä)4Ú3Išv3r J3Išfm†i(Í%;ØRFi*‰l(¤Íp¢Š(WÛÞÿ’yá¯ûZÿ襯ˆ+íÿÉ<ð×ý‚­ôRÓ$ø™~èúRÓµB–ƒ¨¦Ñ@sûû4ýï}-?öµ{íxìÏ×Åöéÿµ«ßª‘Œ· (¢™!EPEPEPEPEPEPEP†þÑ6QêðÀ–á!¾ž6þ#HÝÔ÷ÉU8>£s•ò ¯‡:íšÂfTV•š-¯©ûáºÄ¥ ö2¯–\ÀÏ̤ú×í%y%¬^XB«Ì·heÇΨ| Ê`Àà÷#Œà°>{â;‹É’ê;kkKï<\Ë{lf–`I¸±ØrIÄ{Hãå\X°ðËÍ:Çs< $šTú’@dd“’2©ù U<Ð!\0, W_¿öÆâH"x-îæFi ‰™™•Fï,òòÌ…|‚] $ð·ám:;ÝF-±™D*Tò¥ »dû¯óF]~^¸+œ½+E:•½ÅÜ×öš}»¤ost$+æ8bˆhí’Îq”ä‚@2k> }o|’éö0ÝM)žêêo2æSœ³b%˜•Œ"’y*íJ×&Ò­î-Å­¥Ô:KåÝF]Rd #@b¡ÜmmÈwÊÜ`åÿ†ÿ²ôí{íRn¾ÒµXtóå6cl‹ç æÁã‚r=á¿´.‚–’m’ÿO–öáæo’%ŽYÕÛ«ˆ˜àà@¨ï¼Qs¨&º·6–Œu‹Õ¾•€pa•ZC˜þlc¸ÃnàúŒÑŠ.`M%VÒÓ:u¼Öˆ|ÜA+H^9>lcÈ2›Xë’ïÂöúsêòÁf6åµ5NKª²† ¿e˜6à¸Ûœæ¬j¿Ó,ïî.olWìwsZm &%’"Á‚ɳËVÂ1ì®Àî]ŷޝìî•­ì¬RÍ"Hc°+#Àˆ²™Ã9fݾemÌr“Êœ+`SO\‹ ¸e´´žîí9oågtwÞÁþm’Ù!YÁ &Ð ý/M›V¿[HZ4%G’BBÇ!ws€NU›q€ À­ÏøBgrj¬éQékå¾w”$‹!•ATòüÇ‚D#fî7cfXaéz”ÚMúݱ¹ñ¼rVHÝ :pÊ̹œ‚ hj^(¹Ô4¶ÒÅ¥¥­€xZ( D"?8…RìÌAk‰Xî$äŒO 5ެËz²E¨iºœ/e* -ÆðqœÐ€8ë׌GªxnóIŠî[™ 1ÛÝ­¬n¬qu•/æBHãÛ±·zK褾ñEΠšêÜÚZ1Ö/VúVÁ†Uicù±ŒJã »ƒê3QëÚÏöŸØí yÚÆÂ/&œþò^ÆG€ªÎÔŽ4Ël @1ë°°ð½…Ï…ÖöFŸíRÚOt%1¯–c2a±_6e>_2¡Ø›Û?ꞸúÜ·ñEͶ––‚ÒÑç†Þ[H/X?› oó#P!Í—–RÃyÁ] ž)ð%ç…|=§Þ^[ß%Ü·s[Ýù¶å!•#dTb>|înû¬Q¶åW{qõrMJitkm-–?"Þâk„`âÒ,jÀóŒb%ÇÏ^Ôèa|>ÿØñßͨXÛɺ]©ÿÈK[õàcŸ‡Þ?õ µÿÑK[õ¡!EPEPEPEPEPEPEPÌ´wü”=?þÁQÿèÙkÇëØ?hïù(zý‚£ÿѲ×ÐKIEBÑE†-”´âæ–›KšqÙ¥Í4ÑJÅ&?4¹¦RƒHµ!ù¥Í34¹¥bÔ‡æœ GšPjlh¤H 85F .iXÕH”\Ô@Ó¥cE2LÓƒT@Ó©±¢™ j]Õ4¹¥cE2]Ô¨ó@4¬R™.êPÕêPÔ¬R™&hÍGºÔX®r]Ôn¨·Qº‹´%ÝFê‹púûѺ‹Úî¤ÍGºÔX\䙣5ê7Q`çºÕê7QbyÇî¤-LÍ!4ìK˜òÔÒÔÜÒfˆsM!4ÜÓIª±“˜âÔ„ÓI¤Í;¹ŠM4šLÒNÆnB“HM4š3Uc7 Í&hÍ!4Ì܃4™¤ÍÈr ÒQHM;ع¦æŠ)“p¤¢Š ¸QERQE2B¾ßð'ü“Ï Ø*×ÿE-|A_oøþI熿ìkÿ¢–€>#Š3Mͤ]ÇfŒÓsFhÏ ?f~¾(ÿ·Oý­^ý^û3ÌÑÿnŸûZ½þ™p¢Š(QEQEQEQEQEQEQEâ´%½ûx~ÞA*Ì-õ ¢‘Xm_.8ä!—l…ÀÁÎyé^Y¦ø+O—_¹¶»]@Ø/ˆáÑb’7T,®fî(AeÛ „Ž7=#ö–º¸ŠßÖñÏ*C7Ú|ØÕÈY0a#pèpy¯ ‡Ä:ݼɱ¨Fð*¤,—. j¡•Bx;ŽØw4¤tÓp«¥Çv°*gºu-+~pª@F>L¾9ùš·,ô=. µÃý¹µVŠK„NÜD…†ôŒ¦&(C2Ê~s啈–çÏÛ5;É¥>}ÝÔ›ç•ÎdvÀ.îÇ©À ÄŸBMh[ÿÂIÿ½ßÙ¿µáóGÚ¼¯3ìžfWñònÎμýßjë,¼= Úø§RÓZÛR)¥¦¡iyu"%ÄR2ZÜbD\'–á¢.ˆY³ƒó™hí<'á§Ó^½½žÏLž(L6Óܰtw’å0fŽÞMßñêÍ)~þ3òüüšêÚö¤öVK¨jWO[8ÎåUÔFcsÀeÂíG¡¦Áãk-e¬4¸¼A©knQ­íVežKÁUù• 8ltËÞ€:KŸ‡º\Z<ÒEw|n¡ŠåŒ’§–®ckÒ§Êe Ÿ%ƒ¥‰Ý0Ðô+{˜ôÝNK«Í>÷ì7` ]Y°ùbL(±ÆpåÎNKrñêÚ”VâÞ=Bí PF³0P¤8#Æ1,£ôÑÿ¼r^jÚ–¡oko{¨]ÜÁh›-£šfu…p…P0=¥jxoOÑïlu»X_ Z%Ôd‘ÿßGBOÞóGÌË‚v¿Ý­„ðLJdðâ^ù´´¹¾´¶-$®‘Æò¨FT€«çÉlÈdŒ.I)…ù¹{{ýcI³’+k»ë+]F/Þ$rv9fÒí‰>þRÖíh ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(çO¾×µŸXÜiz&¥}é‘£Ikjò¨o6S‚Tœqî+Êÿáñ‡ý šçþ ¦ÿâkíú(âøA$ÿ„ÅùñJëŸø.›ÿ‰¥ÿ„Åßô*ëŸø.›ÿ‰¯¶«þÏ ÿhÿgÂA¥}»Íò>ÍöØüÏ3;vmÎwgŒuÍ´gÇßð„x»þ…]sÿÓñ4ÂâïúuÏüMÿÄ×Û4QÊ?k#âoøB<]‘ÿ®¹ÿ‚é¿øšpðO‹èU×?ð]7ÿ_kÑK• V‘ñOü!^-ÿ¡[\ÿÁtßüM/ü!^,ÿ¡[\ÿÁtßüM}«Eˆ¯¬Hø¨ø/Źð¶¹ïÿé¿øšwü!~,ÿ¡[\ÿÁtßüM}§E.D5‰™ñgü!ž,ÿ¡[\ÿÁtßüM(ðgŠÿèV×?ð]7ÿ_iQG³CúÜü‹Oƒ|Y‘ k˜Ï?ñ.›ÿ‰§Ââ¿úõÏüÍÿÄ×ÚQìÐÖ2§‘ñü!¾+ÿ¡_\ÿÁlßüMð†ø¯þ…}sÿ³ñ5ö…½š×jvGÅçÁÞ,ÈÇ…µÌgŸø–ÍÿÄÑÿoŠÿèW×?ð[7ÿ_hQG³AõÚžGÅÿð†ø¯þ…}sÿ³ñ4Ââ¿úõÏüÍÿÄ×ÚQìÐþ»S²>.ox¬²ámsƒ“ÿé½û4¿ð†ø¯þ…}sÿ³ñ5õæ¥â]F¸[}S[Ólgd±Ý]$LW$d ã ŒûÔ£Ù¡,eEÑÿÂâ¿úõÏüÍÿÄÑÿoŠÿèW×?ð[7ÿ_hQG³CúíNÈø¼ø;Å™𶹌óÿÙ¿øš?á ñ_ý úçþ fÿâkí (öh_]©ä|_ÿoŠÿèW×?ð[7ÿGü!¾+ÿ¡_\ÿÁlßüM}¡EÍ×*vGŧÁ¾,ÈÇ…µÎ¼ÿĺoþ&—þßÿЭ®àºoþ&¾Ñ¢Ÿ³BúÝO#âßøCÚGÄßð„x»þ…]sÿÓñ4Ÿðƒø»þ…]sÿÓñ5öÕùEíYñ!ð?‹Î?â•×?ð]7ÿGü Þ/ÿ¡W\ÿÁtßüM}©x—AÑ®ßTÖôÛÙ¬wWIɈ8È#>Æ´ ž«x®-åŽh%@ñÉWR2#‚ç4X\ìøŸþoÿЫ®àºoþ&øA¼_ÿB¦¹ÿ‚é¿øšûrŠ,.f|Eÿ/‹ÿèU×?ð]7ÿIÿ/‹ÿèT×?ð]7ÿ_oQL\ÇÄ?ð‚ø¿þ…MsÿÓñ4 âÿú5ÏüMÿÄ×ÛÔP>!ÿ„Åÿô*kŸø.›ÿ‰£þOÿЩ®àºoþ&¾Þ¢€¹ñü ž0ÿ¡S\ÿÁtßüMð‚xÃþ…MsÿÓñ5öýøƒþOЩ®àºoþ&øA ÿ„Æô*kŸø.›ÿ‰£þ_Щ®àºoþ&¾ß¢€> ÿ„Æô*kŸø.›ÿ‰£þ_Щ®àºoþ&¾ß¢€îÍÔÛq FwV#殇Œ§¸¢ÃIÔµWÙ§i÷wŽ\&ÛxZC¸«0(<íG8ôV=tí‚ø“WñŸˆôûëCgkz×B9–Y¢šrªè„d€YwgÜ;œV_…þÇý½Û|¾TÞOÚ1åý£Ê#~ï—o›åçɽò棳ÒuëÍêâËOÔ§Òã}÷2C ´ ȤåÈAUrrz>µrÃÁ$¾Ö-´Ïìkëy§»K=÷²"G#(|9ÛÆïüC”‹6#s¹G…áÎFnkžƒCðû\Ï«Ú6§§wc5ªù§y„ĸC埘–` •ÇÌ x×MñwoiÚ<×¢áLÈ ûEü¸8cÎÛ¸ÇÔ7 '?Ã÷Zjx+]²Ôu[»¹½²;-"Y^eU¸$i(¡''g‚,j üC¦Zí#‰Ù.HæmŠÆò>Y£@9aóÉÆw&ìh¶š4Z;Z_Ç|/lÄ“ÄF[Ïš< tVÆr:ç¶(¤»ñ¾ªj7Åå­ô7Íi¨ÚÃo F~Òn]]œN ÉB¡G~ïà9úŠlÓÆš³a-õõ®“Š$7ˆ!?èáAUøUb…½‹·9iá¢Þ‹]“VÓa·•æ‰bv“Íó£ Þ^Ї%•Ô†A”åÏŸZ4K:Á7˜²Ä$N‘I)C$ˆ¨ÙX¤ùÑ™2X ËÒ¯ô+ÄBH¥ÔŸOk+›YnóY¦‚H÷¬[ðóå2í'#;Aý±¦Í¢X‰gÔ Ô4û)¬bŠÙT$Ë#Êûš]ÙQûöRp\nò¡ð|±¡º›WÓbÒÊ#E©7œb”»Hªª¢3(9†aó »<ò»¶5…ú­©Ö®ìRGÓì®.Ädr3I:³™?)HòßåfV;x_™wSÓ¼Qa§ËỀ³´Ö:}ÖŸt¯mˆ¢VŸ(f"\ ‚J0Pvc8l‹‡ÅÚ]Íé†òæîM=-Ò‘j"”‘Êý•G÷¬‰/˜¿9y˜L=_ÂÃEžÚ+wJv¸ò]<–™ñ ¨faååW• IÜ!b:ê:ò½ý…ž‘¨}Ši.çgÚXÊcÝ'ú¢>Tv… TŸ¿¹ûf£suºvó¥y3q/›!É'ç| ÍÏ-“Îu âMûB×Q’;ïµI§6åUSd‹3h]9̬A`ù`m+–ݽkÿ Ÿ íí•üQ]L¶34$©oæ ²#GÖTna’ž„‡¥é³j×ëi F„£ÈòHHXãD.îp ª³`N08s^Ô,î×L´°3Ék§ZdšxÄo.e’RÅ0\JãqÎÜñœ‘µí6ÇÃ-¨]Ü^[è÷¶©a)‚6¸’æ6v3(û][o–wN@9ð„Î,äÔYÒ£Ò×Ê+|ï(IC*‚©åù‡ˆFÍÜnÆÌ°5_ Ťx]/nõ"Õ“Pº²žÁ·³„Ä ©T)¸f'~Ò¥pIÈ α¦¼^s>¥ úU¼‘ÎmÕQ· åš3›‰™,WäÆà¥lZøÏOgÔ¼ñ%°ÔžÞâLé–÷énñ,ˆ!Š)˜(‹lƒiÈ1…á‡ÎpßÃ/$º,VÓÀßoÓÞùæ21HÑ_0°(v,M•PùØJ–ܬÂ8³“P}gJK_(­ó¼¡$Y ª §—æ<!7q»2À;½~ÛQÒüF·Mv/5-NBU1_<8‘†À'ÎU0Jã x“^°Õ4èÒÚ[é.¤”K;M qdp$(qs .ÿ¾eG;ŸvíÀ'?cq¦j76‘ùwV²¼3&àvº’dppAé]&±àø-µÛ=;KÕí.üë(îåoÞ!>Ì“É#nr›K²… ÛFÝÁ§ÿü%ÿóÿ„gþØý³ý_ýñþ³ÿ÷¬ûOìì}Gí¿nþÓýר<žOÞý盟›îãnÞýhÕ´—Ò¥ƒý& «{˜¼ë{˜7l•72ª°Ã£¯Ì£îädN¤> Ô® ÿÈësÿ^ÿ£#¯¨ôßõb€ÇðGüˆ>ÿ°]·þŠZÞ¬ÿÉ?ðßý‚íôRÖõhHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQQ‰ák‡·Yc3¢+¼a†åV$)#¨«{í>”A<7Vñ\[ËÐJã’6 ®¤dGÎhJ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<+ö”¾h´ÝÇɉã¸yäÞÛ·#'—‚¸ tv õõæ¼f͵i«'LkØn…ä’²HMÄã$;üÿ.–Ú›œd·ûMÌ­ÿoûF¼¾×DÓ5 ­ 9ÞêÞÖmêîfcyáûI$|«¸8cœ»°^ ’Ãí±Ç§Ø½­Ì«:ÚÌŒñÃ*nòÙAl¶Á#€®YHo˜7b÷Åךö‘º³±•¯nç¼Fh‰û4“àJc±óQó†+´*ß5W×´û;EÓnìñÛj6†å!žA#ʼndˆ©pª&"ÙÚ1»ã'€:I|es-ÿÛÆ›¦¥ÜÏ#Þ̱¹kÓ"2I¼—;,’dEå›#P®~µ®M­›!%­¥´vVÿf‚+XÊ*Çæ;€rI$ÜNNbX–=§Žì´x4ínÖÊ Ú>·œRÁl¬p¸¸ýÑ!CÊÊ!MÒHX–È^2òeèZ]¶‡e«ßø‚ »û+‹kh£ŸLK“™%rZ ™± ȉ ¬ üúÑŸÃVz'Ø--n$¸[•2y®Ò .SHÇ >àõlèMã+™®¦¼]7MŽòå'w+—¹y¢xÝØ³‡»mŒ"䌩  t‡…­´$è s×$·¼¹¹-d’ÆâÖiÛ|Cm³<±l3m %ÉßÃM`ug“J6?Ú*4°d{T0LT\~ì}£Ësh_™º½æaÀ8û^A¦[éÒYØÜÚÛD©sÄXY&‘%#v”ÜJ6¶Pƒó+b¤ÕmP*î`FÖßó€pzö´uëøîÚÂÒÈ¥¼Vâ;S&Ò± D'{±ÈUUëü õÉ65\ë/«4–––ãT½Žúu€>¨² ®æ$39 çœcb»Ètß kvïy$–-¦Gw,–6ö–mñ[Ekq;Ã)ÛžÃe°r$b3þ±|ÀÍÁø¢Ü-í¶¡ñÍo¨Û‹ˆl£´;UÞ"òˆwDßtœŒÉ t ãØnmõ+íJäÖ.öDvcjCr$,¢V”ìIä~#.q·Ì Ä?KÔ¦ÒoÖîÈGã²FèQÐàƒ†VeÈ ŒäpkrÏCÒçð»\?Û›Uh¤¸HÔíÄHXoHÊbhò„3,¡—ç>YX‰n^€;ñ¥«èwVZ Œñ™m¾ÇfLâ xãûAl0”HX½Á#s0ù›  \Þ*¾»·½ŽúKÉn®&ºÍZfLè,ĢnÐSiæ°è  È|Qsi*¶–™Ó­æ´ Cæâ ZBñÉóc–A”ÚÀ?\€A©x¢çPÒÛK––¶áh €9ˆüâK³1®%c¸“’0@VsVÔ¦Öu›íRácYïn$¸‘c(gbÄ ’q“êkQ<]xk'ØìZh¢óLÑ÷0ˆŒ7;¾Uò‰OÝì'†$°Vý¡«jϪËú4¶öÑy6öÐnÙng fc—wo™ÞÀÀ KOêVz4z\pZÝ­Ã26í¬·JOÞÆq{/oáOCžnŠëâ¤ðÞ ±ÓQïžInæX[|óI мŒwu+pçhÂ)ª®X54ñdïç ý:ÇPK-îVãÍ_>dÞg1º±“lޤ‚gsš¹ú(Iæk›‰gqy»ãTPIÏ  À;VâøºñR3ö;p¶g%Ɉ™%ŒÛµº‚wavFÄ A!K‡ çè  Ë\Ù\i²›KIÒÂÊ{ŠPûeŠS6ðûXþýÀ*GAøÇkâ³Ñç°O±2K@nÊ0“Ê-¸©„oÏ!”í ‚‰·й¤êShÚÍŽ©n±´öWÜF²T²0`8ÈõcJ×&Ò­î-Å­¥Ô:KåÝF]Rd #@b¡ÜmmÈwÊÜc.Šé/fY·…lÈ_î…Q¶«éWÖúV{t²oÔ®"’ÒU?¸GI#ÁÜŒñ…çï3eJ¦ìz(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñ¿Úýo‡íçÿiWˆ×·~ÑøwþÞö•x‰5œ·)l}‘àù<9ÿ`»oýµ½X>ÿ‘ßö ¶ÿÑK[Õ¡!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPã}*ûZ¸Ž :ÚGx,§7$ü«w• d°ͳ™–Ë7ŒöL·6ñN‚@’ uFÈÀžU€*}ˆw©( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ÿÿi¯ù•¿íïÿh×…SPA¿ºÀ²$1‰›lk "@£<†®y¯ý¤g{{_²ElÞgÚ¢g•UÝAýÕlã§Þ#gž{Ÿ ¥Îá¦i i]µ—y ùÑ Y¶+$Hޤ·“9üÐØ wo ̤ži’–Y!M‘+1!ql/ ÜÌp;’{Ñ<ZÜKoqÏ”’9«#‚<‚¯@‚ãO¸ÒmïídðüôöñIt×VöþDq‰®–R!e1‡Ú¶‡j'˜Ã%Tî|ìx–÷ÃSůËom¦Ý‰î5žé¯íÕ¼öžo$¢ùMpãoA‰Äg?6˜hËï5mKP·µ·½Ô.î`´M–ÑÍ3:¸ ÂŒ(ƒÒ®Zë¾$}b}FÏUÕ[S–&ó®a¸Ìñ¢îmÌâ¡Pž_jØñíÒ­õ½”úBÖ–³Ë&˜–í¾ãÉU”—‹;~pãb•NmÉÜsüSþŽIà‡ÎÓï¡Gže‰7½¤¨ »£,ÀrGZφÿXC¹³†îùt‡•~Ñ Hâò»”|»—‘ž~OjõmJK‹K‡Ô.Ú{$Dµ‘¦bÐ* Cœ¨SÈíZ–~DþÕco°‹«}BÖh‹ùI9’e)8w]ÞNTd¸šë_™»öôÝŽ3×è }—ãiú\šKýãNóÖKfæ9QC¾bUòƒ¤•Qê gÛ%„^ ¼€>‡/—ææè´eæ`HQ±Õn•ÊÊñŸ/…WA™˜ro«jR\Z\>¡vÓÙ"%¬3PååBž@ÇjŽúþóS¼’òþî{»©1¾iä2;`2Ç“€ü*½r=[R‡K›K‹P»M>gß-¢ÌÂ'n9dÎ ùW’;J§EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅx×í37‡?íçÿiW‰ößÚ#ýo‡?íçÿiWˆšÎ[”²|ÿ"‡?ìmÿ¢–·«Àÿò xoþÁvßú)kz´$(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¨¦-˜Õ\®æÁ#„÷úQå?üüIù/øPƒþÒÑI3ø]bä`·ŒB©$*ˆ‰?@'ØWϵô/í©ÛµŽmæÊñÊn“ÎEÞžQ Ûr 0Ï ªy)´øN‹™«Áysmö˜£Ýº,DweHÿ–±ÈNyCÓŒBŠØñ¯k­jÜYØýŽ5ˆFcÛÉœþæ—¸ê¤ñ×€.izlÚµúÚBÑ¡(ò<’8Ñ »œpª¬Ø“ŒNI«i/¥KúLV÷1yÖ÷0nÙ*nd$Ua‡G_™GÝÈÈ ?Äúm¾§o8ð펟³Ìi±{†š"Ѻ,Š%™—r3,‹§r.zÔ—ºÆƒ¬x—N“ZŸY»Óà·1]ß*¢Þݶdev Ì27$|³|‘ŽG 3ÛñâZêWZÞ›n÷vïq£¬æWUwXŠZ6,;gÞ{kËk;BÆ §Ýö˜evSddù§n7c?"|‚¥Cüµ±a⤶ðºé÷:¾«sZOnš9·U³C&×/æ|Ì'š ŒÊ asÄ~1Ó|JòFëY»KËÓu‰‚“¥©Y3¼ÄÝ"?u¸@£Œ‚€oá9ã•d}FÅt·ˆLº¡óD ¥g™¸¼r(]›¾Fll«?û%ÓGþѸ¹‚ÝdæÚ wy— 6ÖdH ~f* V X«Ú/a =¤Zçˆ-D€Ë­ÀƒíwmNq*yóªäÈØ'á#¼ñíî™4 _ZZˆ®á‹Bˆ±o:I$c¸hŒÊTÏ0!sò€rwúö›£iúÚÇWï"ÃïÞ‹neþË*Ï$ãI4­êV÷s_ÚiövÍЯ˜áŠ £¶HG9Æ>S’ êkþ2ºñ‡­lï–¾]Bâòy£±‚3ÌH€;‘A,JÈ[×äÉ;FØü/¯C¤[ÞÀÚ†¥¥O;Äé¨éˆuU,y‘Ž]XüÝb_”õP ;û3Q¹°¼Ëºµ•á™7µÔÃ#ƒ‚Jè/| †±.—?Št5º‚Yb¸í*°˜ÕËeŒ Sh ¸–eÕ;»ÍQ:ýì–—vw—]2Ú×gÙáV—I8H ´G ÔñOŠ“[Ó¤†]_UÖ®¦»[q©[¬?e8d‰VIW.¤´)8pãq¤bÎäP6€ææðûÛ^[YÜê0]>ï´Ã+²› £'Í;q»ù³ä*åªú¶’úT°¤Áuososí’¦æB@uVtuù”}ÜŒ‚ ëèâŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñ¯Ú#ýo‡xÿŸŸý¥^"zW¶þÑ?ë¼9ÿo?ûJ¼N³–å­²<ÿ"‡?ìmÿ¢–·«â¨¼_â{h#·¶ñ± 1(HãŽúUTP0°¨>6ñväiÖÿða/ÿT¤.SíZ+âøMü_ÿCN¹ÿƒ øª_øMü]ÿCN¹ÿƒ øª9…cíj+â±ã_Ÿùšu¿üKÿÅP|kâàäiÖÿða/ÿG2 jQ_ÿÂkâðyñN·ÿƒ øªCãoÐÓ­ÿàÂoþ*Žd>Õ¢¾)ÿ„ÛÅÿô4ëŸø0—ÿЧx¿þ†oÿÿñTs)ö¥ñ_ü&Þ.ÿ¡§[ÿÁ„¿üU9|kâÿúu¼ØB_þ*Žd>Sí*+ã5ñ§ŠÀÉñF´íþ_þ*¢>6ña')×1ÿ_òÿñT¹Ðr³í+âóã_ñF»Ÿ}B_þ*˜|kâïúu¿üKÿÅSæAÊϴ诊¿á6ñnäi×?ða/ÿNÿ„×Åÿô4kŸø0—ÿŠ£˜9O´è¯‹G|]ÿCF·ÿƒ øª_øM|]ÿCF·ÿƒ øª9rŸhÑ_ÿÂkâÿúu¿üKÿÅRø¸ÿÌÓ®àÂ_þ*ŽaXûNŠø¿þ?©ø¯Z9íý¡/ÿIÿ ¯‹OOkø0—ÿŠ£™´h¯‹á5ñn?äi×3ÿa øªpñ·‹±ÿ#>´î!/ÿG2)ö…ñwü&ž/Ïüßþ %ÿâ¨ÿ„ÓÅÿô4kø0—ÿŠ£™)öñwü&ž.ÿ¡£[ÿÁ„¿üU/ü&~/ÿ¡£[ÿÁ„¿üUè9O´(¯ŒÆž.ÿ¡£[ÿÀùøªü&^-ÿ¡£ZÿÀùøª9rŸfQ_ø¸Ìͬÿà|¿üUN-ñ`lk„{ßKÿÅQ̬ûŠøìøÃÅyãÄÚßþËþ5ñ‡‹»xŸZÿÀùøª\è9öEñ¡ñ‡‹³ÿ#F·ÿƒ øªOøL¼[ÏüUßþ %ÿâ¨çCägÙ”WÆßð˜ø£oü:öïúÿ—ú7þ/wñ>·ÿòÿñTs ägÙtWÆËâÿçŸkŸø/ÿV¿á,ñNüUÑ=ÿÓ¥ãÿ£Ú!r³ëú+ãæñwŠÀñFµÿòÿñTßøK¼VzxŸZü/åÿâ¨çAÊϰè¯WÅÞ+=|M­à|¿üU4ø·Å»¹ñ6·ÿòÿñTs¡ò3ìJ+ãßøK¢¾<ÿ„»ÅxçÄÚÐ?ö—ÿФ-ñväfÖ±ÿ_òÿñT{DŒûŠø÷þÿÐÍ­à|¿üU ñŠÁ9ñ6´íþ_þ*hƒ‘ŸaÑ_x«þ†mkÿåÿâ©ÃÅÞ)=|M­à|¿üUÑ#>À¢¾?ÿ„·Å]¼O­à|¿üUÅž+ÇüŒúÏá/ÿKÚ ägØWÈ â¿‘ÿ#>³ÿòÿñT§Å^,íâ]kÿÿñT{TÍŸ_Q_ÂYâÐp|K­à|¿üU/ü%¾+ÿ¡›ZÿÀùøª=ªF}E|}ÿ o‹?ègÖ¿ð>_þ*…ño‹Oü̺ÏþËÿÅQíPr3ì+äâÏwñ6³ÿòÿñU"ø«Å‡â]dÿÛü¿üUÕ³g×tWÈð•x¯8ÿ„—YÿÀùøª_øJ¼WÿC.´~—ÒÿñT{TÍŸ]Ñ_"x¯¿‰5¯ü—ÿŠ£þž?á%Ö¿ð>_þ*jƒÙ³ëª+äaâ_?â§Ö€ÿ¯ùøª‰üR3k'ôÿ/ÿGµAÈÏ®h¯ÏмR?á'Ö¿ð>_þ*øJ¼V:ø›ZÿÀùøª=²fϯ(¯ÇŠüW×þ]kÿ¥ÿâ©?á,ñ^qÿ .µÿÒÿñT{dÍŸ^Ñ_ Ÿø³·‰µŸü—ÿŠ x«Å¿ô2ë?ø/ÿG¶AÈϯ¨¯Oм[ÿC.³ÿòÿñT‡Å^-ÿ¡—ZÿÀùøª=´CÙ³ëú+äâ¯gŸk_ø/ÿGü%ž,ÿ¡›ZÿÀùøª=²fϯè¯?á+ñ__øIµ¯ü—ÿŠ£þ¿ù™u¯ü—ÿŠ£Û äg×ôWÈKâ¯øIµŒûßËÿÅP|WâÁ×ĺÏþËÿÅQír3ëÚ+äøJü[×þ]gÿ¥ÿâ¨ø³nG‰µ‘ú~—ÿŠ£Ú äg×ôWÄRøëÅë+øJµÁ†#þB2ÿñU$>>ñ\k#7Š5שTS¨K´dIùºŽÞüçŒH>Ù¢¾ ÿ„ïÆô5ëŸø1›ÿŠ«üEñ|ÊWþ=V<¶ìÇ}0#–8ûÝ>l}}(íz+âi¾!ø¾S)$Õãó6þo—ð2üžžÂ¥|V`¼ â=cÌ”¦Ûé@œ§w¶=úñÈÙòÿ¬ƒýóÿ šÇÔu´æ ýŸ–ÍùçùçþÌݹ÷#ãøü{âô}ÇÄúËðÀ¿”ã Œýî£ì[+Él.㺅`i8À“!È#”pTõî=úК–“©h÷ oªi÷v3²Xî¡h˜©$dã Œû§W5-N}Vág¸ŽÑP ¶‘[®2O+¨'ž¸ÏOATèSÃÚl:¶· ¥ÃH±’FØB–ØŒûwD`íÁ‘†Ô³p¦¬x£H¶Òom–ÓÌXî-ÄÞ[\%ÈŒïtÂÏ (ù3¹%ÌR/üHóÆ÷ºÍö£ oÞúêIcuthÜ[Œ£ºäÀ1Áš"ñ[Å®Xj?ØúT¶ö46úlð´¶Ê¼C±fùäwù˜àž8  Ø\ø]odiþÕ-¤÷BQsùf3&[ófSåó*‰½³þ©ê9ô=]ßR‚êîÎØ\dšiå¥]²ÞT`w&,,r1ß¿‡ÚŒõŸoâ‹›m--¥£Ï ¼¶^°6$ßæF 0B›/,¥†ó‚0»d‰"X[BÒ…»J'ºdK¹U]U˜,ƒfß1ÈX¶/ÍÓrMJ³ñ®³¢=¶¥|-of¶¶Š˜à;#gÝ$“22¨ULŸ” bÊçü":9ÑçžÞò{¼Åu<¢T‡rÄÒÅ£)šEq&E;S{nÿTõNãÇj½Õn§ðÞŒçUu’í](wÎNDÁ°ÌÀ•ÎÜÆ‡h* S,,ÌiÖ1È‘Mmm:ù¥ímå.^Ê•>l£.Æóód)ø‹H±Ò¢ÑÞÂòK´¼²3É3&ÅgÍØ;?v1»õ!s´Xð¾‰eª[ÞÜÞ,’‹wŠ5„_Eb§xs¸Ï2”lÀï6âGÕ_ZñzÍ…•¢èšmˆ²O.-ZrÂ=îå™+ HÍœg Î8ªúV´tÛ{‹I¬-5 ;‡IÚèÈÌ@ÁÝ ;Œg1È$+êÖK¦ë7Ö ,’¥µÄ¬’Bгb2Q¹Bq÷O#¡®ÒûáêO:XèÂw¼[¿³ó¬þr„‘ÚFŠ4ó-˜‰ò4’ª FÀòïâ+‹ˆ5±yicwu«Ê³My5¸3Dá˱ˆŒÜI È㊓XñEαo4RZZ@÷WîöXCĹˆSûÉ"üçŽeÏÃË=.úþKÛ}Wû:Ö+&å…“¢Ï ;Í#“j«Æñì ÌY‚‚Ì0Õïüa¦Á¨ÛIq<×Vßl"äMx0<ªZe•[ÊæTm‰½³þ©ëŸ_Ní*ÞéÖ7Ö²Åkæªn·‹É‰ó«n »?6Ó¼œp1$Þ5Ô®’i. ´ŸP‘'uFÇìí**«ðÆYy(HóÂí5]#EÒfÐäûeÝåÝ“\O$(Èë4Ñíw*„Ä 3@%Šg÷uOÄš}ž›¨Ç  ž1žÎâA$–’dƒºª†lb6‚¥¶¹ jyw\ðøoF…ôÄhí¶5ÑÚŒdldÌH!åg e`¤0Æ+ŸÔ¯`¾¸YmôËM=1Z´¬¤äüÇÌw9çqÀã®@)ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEèÿX/Œî™Ž°|Ÿûi}eâH“îÊê:²¡"¾kø?Ÿã àÉ[]„C,@×Ôi6ö×BW ´šñÿ÷PÞ/†æÃ£ œÿl«Æ;u¯Pø×Úëvöqñ7›£êMyŽe-Ë[¦•ç«1õ£aã$ö¬ù,Vòý¨ íS´lF)ûÑp²§ð ®O`h¨°îp½9ê=íü·Úy"§(W®1íN(Ü>œQÌ %o+=©LKÓõÅ[P3Ðâò·%.`å(y'Ó#ÔT‹ž¤V¶«`? <…8…áÊT0.î´ï'Ó¥XhÓq”à€¡Ö“r”ü‘‚Îi¾{ÕŠ:R*¶rüéó1ò¢¢ÚŸzS8Å^Àû þ4äcœÒæ)A`ÿõSŒ5t[¶y¦ºm=>œRçR¸‰±ú”½ÔTè3÷‡Õ(1†Îï§9 D©|ßwÛWJ»(ÇLR(Q늶’ÇðÙÀÀÎhS!I-̳`sŽçR>žªÃ&ïAW!EûäòzqšœX:ÇægpíÛÉÔ›I_e'v)Ö6Q¾`¼ôÛšÐ6é.X¨õÏ#†Ú,…ó£\ú“Š\ÃP3$³…OË&ãêEBm×§ð­f³TR|è[èõ]£@ùOÒ““¬ax‹îö€ý*êé6F-ͪDŒ{2“Ê– >9bfDÉèO"¦¸Ó Ž2ɨ[Ⱥ3ŸåO›MPœQKìVû‚‹¥w`„V†ŸA‰AöÚEEC;wzÕ··óp Ž¤šÉTÖÈ|†tÖPí]®¶ÜƒìˆäŸAÒ·®,ã89QÜ­V’ÞÖúV稔Q˜¶€!÷=*µúš×€¹Þ¦´D0ÚàçÛ—8ùLñj9?Zq‰³‚ÄVŸ–Ä Ì ö4†I¾]¤ãŒþ”¹˜ìf­¸nOÿg­N¶¦Däd£8«Ñ'šÀ3òxàV™Pɵ¤#û óMI’цÖË‚©Ï½Mýž%€J “hêÄ*¼|¤|ÆoBsS¼-<[¶‘Ž¡s©§Ìº)§@x߆ÇfùÓN– ‚OašÖKedÚXúàšCj¡O84œô‰–tÕÛ¼)Ûõü¨kíºêTuέ´$g.¾‡nißgbÃ÷¹õ8£œ9LèìeDÏÌsèó¨ä¶gs»ÿÕ[ýJÍÔŠ€í¸Œ·½K¨5(ØñÜZŒYr0¦kh¢°9Àÿ€ÒÏ`¾ÜTûF5ì¸'*1ïÍ8X†Ç̼ö­G˜ò@úP‘cÈúQíÊe?<ä`v‹a—8­‘l8ð¦›,‚Aì)*¡ÈŒµÓP©<†ì ?û0ô‘×à>ù¦È¡°6¿6¥ч*1ÖÙX•ô&ž-6öãéZ«Nõ5"Äû€#nMч)†ÖÁ‰ÂâŸölކµ>Ê»‰Ã} (µSÞh>C+ì‘„ÆÃ¸R tÆ;}+XÚqä{bš-c#9Éõ¥í•ÍvõëíVmì£U,ÛIè2qVDH;¿:°–ëå’ùö£Ú"2d±A’eÅ1-rOÊ8­O#'8Æ=©Þ^Ó€höŒ\¦cXã Xg“œzÖ°‹ØµL±¨m$Ê—´aÊŒ#¦óÕIý”JedSížk\BÍÓhÏ­0Ûî {ãŠ^Ó¸r˜§‘Á ùS>ÄA9¶Œ Î?<ÓL`žWæõ¥íùQ‘ö}£¡m·r¶¼„+ž ïQPLg´ý£Ddý˜‚F²œýÀ ÔÙ9 1MÄ$÷&hÇÈg}˜õØ)ÜÿÏ>kQBùNG½HJPõÅ>qr˜¦Û?ÀEeþòœ}+TªíÏ#4,c1Qíš9ÅÊf dþá§dîÖDlàÒ˜”ƒøG;)’- ÉÏð {Òh‰^# wÁ¦í)ʲ(öÊf‹P(Hö5¶ª°»`ô­Mžx’â/ÝÝ·¦j”õæ—#SGoçZu•™Ò¯5;èî&† á·Á(‰‹H²0mÅ[€"#çwQŒ7ƒ×þš7ó©4ýSPÒgiôÛë›9™v4–Ó4lW ã*AÆ@ãÚ½U±Â÷7›Ãv‘´^­äÖ—W‰$ Eå,`QâÁ;ÙùÆÒÝßš4Ò »FB¾_™£ÝݳF,ñ5Ó ñÏú¥AX±êš„Zlºlw×)a+o’Õfa·”Î ùWœv”.©¨*Y¢ß\„²böª&l@Äî%9ùI Œr3LGUgàÛS¡C}z·©4–‹u°0A·rp “†ŽÕBžÛ÷|Ãå,Ô|#a§Ý0Ü]Iö{Ù¼Ü*Ä¿fyÇÝäâ c#iç-œ~ãSÖÂ+Ü_j.QZI_©iUˆÉùgœêÒæ —TÔ'ŸÏ–úæI¶ºy3Ú勌ç8bï‘ßsg©  t[õGÉ•œDMpá–(šB œà˜Î3œbºù<7¢*ÃR¾é–Ÿc‡\JË$,·%\È>~XxýØÊ‘óp7pê.ì$µ»A=»œMo0ʆ :7³)Ô÷nëv÷†ò cPŠè«!™.]\«9vÎ ’Äw$ž´ÑÝxOI¶d±YïÞþ[;Û¥•ã" g¸ë ùuƒIR„ç-¢¦·¢èÚm½¼öñê3$7 èi°lѺ´`ÛËòœ%SóaÛÊló«}vž^Û©×ʉá²6ݹ¢ï‘ÐîoSR^jÚ–¡oko{¨]\Áh›-ãšfu…p…QÀô”Ú}ƒD±×~![j6ÞGc¼@a’(ßE+ˆŠ«ÕPïP0Ãn<~³MMFîIíþÇÄöÒ0I’ð6Ø‘TŽïBCaˆ†çpV?öî±ý±ý¯ý«}ý§ÿ?¿h;îíûùÝ÷xëÓŠ±åë>ßo¦Îº5´¹¸º†òÞláL²r7áTd€ ±`Ã}ž§­/Äík¥Õˬݼ¨$”(b¬JœµÔ]øBÃCñEÆšÒÏp­¥j2FäGòËn.c,C+¬m™€dó Jnn>k cFŠÚòkKëï"o³Ìñ¼BxÙpÛXãr•|pCz’][^²Ö~Ñ6¡©AªZ¼‰æ<γÂŘÈ2Nå%ɬÙêhrßÃz<ú>š<Ëïí;í*ïPݹ0ù pqŒn}ëÜev›/«ËÍayogmy5¤ñÚÝnû<Ï .Ó†ÚdžÁà㥠xž^Û¹×ʉà²7ݹ¢ï‘ÐîoSW$Ôµ-^ÃIБdš;Gu´·Œ3³I+‚p2NI 6®ÆæbÀði­åù»ßhêQ`•PX.n«rVÛ`?Â_q §biº}íî•:êW·qYj7‚öÞEŽ(VÙî#]ñ”rC=¸çzÿ­ Ôe¹{='ÅQ_ÝhÖZ~²—7ÜÙC ¢@¥ åã8Û)\‘ÒB:76"ƒÆ×Z4÷ðÅâ ´¹^k©®fhвK#0ùI+½YmÀ÷ õíÏLÓ¬îàKïø˜~úœ 1¹çîVm[FøýèT<1áï}«ìRlû6Íÿè—3çvqþ¢)1÷OÞÆ{gó_Þ\}£Ï»ž_´Ê'Ÿ|…¼Ùì;gï7ÎÜž~cêj½X¿³}?Q¹²”æKy^&;2T~W‡NŒÀ5±à»;{ߤwFŽ;K¹ÃÜ!xÑã·’DgPåVU%v¶@Á8àšd™âŠGHS|¬ªHEÜ-è72Œžäõ"}³O–Öò?>ÚC‰í¦\¡;X€èÞ̤dt*{ŠêÃó;cä8(2OM¾Ôéèþ›UÖlR+Ú¡â@a–“>ãûÛAOGom$VÁüÝ>kœËzŒ- …ŸìÑí;[™‘'›Ë®ë}‡ÍÕo¤þÏÇØ·\9û61/Ÿ“W¦>èô©#ñ.½©6©·©&¡2l–ínœJëÇ ùÉ*ðOaé@™«è¾Òî¯tH­`òç´ÕæŠÝ`V’7·–ïË‘§u2Þ%£ ÅX¶D¸zΣéÞÑ®ü:tÝ]ཽ]âÚw’åR\Ë"º(Ä|¾ÎQC(>gïñpßëèw6pÝß.ò¯Ú!I@ÒWr—qòò3ÏÉíUῼ·û?‘w<_f”ÏÉ ùR¹uÇÝo‘yü£ÐP¤K©xvÃL’¼Üj1[ÍÀðõ¬ï2,—qÈM» ¬Jv1ݱ[«8\}EeРÕlµË-+ýmͺGof‹%ÕÀwC:I´4PÆà`&ÔcÀ‡2²áÙø—ÅFþêâË[Ö~Ùp›îd†ê_2U ËrB¨''  ªðø—^¶ÒΗ·©E§”d6‰tëVÎá°`ääcœší_Úî]™Æq¸œg§ ©,üK¯i÷WZÞ¥m=Ûï¹’§F™²N\ƒ–9br}O­eפxîËGƒNÖíl¡€Í£ëqÙÅ,É Ç ‹Ý<¬¢Ý$…‰l…ã/'Ï<×WÜ\K$ÓÊåä’F,ÎÄä’O$“ÎjÅæ­©jö¶÷º…Ý̉²Ú9¦gXWa8Q…ÐzPY X§‡´j÷[³û-õ•ݤ&ÞòÅd•’Hçs¤ÈÈŒÅ#>c/Ê¡ˆÝÔjú/‡ô»«Ý+X<¹í5y¢·X¤íå»òäiÝL@·‰DhÃqV-‘/™Çâ]zRmR-oRMBdÙ-ÚÝ8•׎ó’>UàžÃÒ«Ç«jPésiqji§Ìûå´Y˜DíÇ,™Á?*òGaé@Ʋš‡¼9£j: º6¦b½½¶Íi,s˜!IXÂå  Ê®ôÿXDŒcÔõ%ÓõÁΟc XÅާ‡o0KÞ»F ;aÜ÷[º°·Ü­‚TðfyšÝ-ÚY ìécµY€ @è  žûG¥\µ×u‹F}FÏU¾·¾Ÿws ä’n;›s“’9êh¼×ü9¦ØÅu£Øˆí5+„¾¼’µ[˜Ö;içZ\¹ lØÛ.OÎØ &|ºˆµÐdÔN¦®¡¦Þ‹9-n4¨ãK?2;… ´äÜå†Ý?ÌýýÎkVÔ¡ÒæÒâÔ.ÓO™÷Ëh³0‰ÛŽY3‚~UäŽÃÒ‹Í[RÔ-ímïu »˜-e´sLΰ®Âp£  ô @šâÙµ—ÑÄz5§‰ H,Þytt’ eÝ)ž!Pºù¡äŠ0Áá!€}¦¼é¿Úž Ñml-Ÿ²þ}0‹Uqu^{ EÛ"„ ¢<£˜ö¶7;5mJ;‹»„Ô.Ö{Ôtº‘f`Ó«œ¸sœ°cÉ9ïDz¶¥—6—¡vš|Ͼ[E™„NÜrÉœò¯$v”NŠ( Š( Š( Š( Š( Š( Š( ÿáßgñ|ó‘‘®óôE_PÁ«Aur&‰²›@Éâ¾lø søòxePѽ‹«)î<ÈëßßÁöñÏä­ýäpI’#Iã¸Î3ßÖ€Ô®R°ÀBžqŠvSvp1ô©UWvõ52Æ™è8ëRä VP„åPœ1È\ýjëðz¨ª3Œ }¨Rˆ6àð«Å)P_®*e>[ò¹§¹‚Þ‡!ؤg9ü)ÁZ—ãjƒõ¥ “ïíNâåªÝ.½9–P£r¨õ*ƾ¿­9ˆ />ù¥qد‰1ü zÐÈíŽzúTÿ!P °ü© ÏAEÇÊ1 ÌšyÆEƒì(?|ì) zƒEج 2)ãi>¸«‚æØª†9ÂjšGrMXE³ÀÜÄœvõ¡0jâÄÑoÉuÔíŒÇ‚~´›|¾sEÐ ý‡¢\Só¤Þ ûÝ}i7®>à'ÐQp°¦ByãÔÓ.œ´jœ‘JÅGE¨î$_'hR9ô§Á­3½ÿûúêßÌ×Kàù"‡Iñ,ÒãLñY$–ɨ˜wyë2cC1%%FU°•²óW¿ñÿsÿ][ùš—MÒu-fá­ô½>îúuBí¬-+È!A8É>⽸ìy¯s¸‚óC›Á $š~›%ÄÖ÷{+\Û@Ét^O/d">ò2ÅÙ°†®\Ýxn÷^×GÙô8"³Õe‹GXR4ÃEtQ˜ô’32[d&5 –2V¼ìi:“X=úé÷fÍ]î-媳”R[²²ƒÜ©Ehk×´+û;+Ý2íg½HͲù<ÖtFعPYÔ¸V8n)ˆôD¾ÒžÚÈ]aê:Ü:|Ql‚{h"_´Ý´ª<èšßp&º»›;‘Š–-ÍëW–V¾I4ËO6§} e<©î"´mžZáÀ—âGA"…\ †åφµáqqntMKÏ·x’xþÊû¢i†È,H \ñšŽmþÛN¸½¹µžà»n%‚EĸbÉ»nÐË·•$7Ì0Î:Ë94­þ¿¼‡Fš1¡_GqÐ<ñ­ÐŒJˆUƒ`Ã3ņEˆ.4û&ÞþÖOÁ¯Oo—MuooäGšée"S}«hv¢yŒ2UNçÏ6…¬[ËmÚUôr]JÐ[£Û¸2È­±‘A3ùHƒÇZ±ÿ'ƒµùŠèwÒEÿM-¤hÉü RWé•ö  OhpŸøÊâÞëM³ƒLÔäHìšA’«NÊ1‚ ‘Æ+ïJû&§j?o±›íÞoú43nšßcmýêãåÝÕzäTcL¹:3ê¦9¢Ü-°ÄûYÊ– >Ý™ ‚ÀüÀ€FHаð†½¬éÚXÓ.íçÔ.Þ¸ÑK#mŸ—8CønzP=oJþÄÖ'Ó¾ßcäíÿI°›Í…ò¡¾VÀÎ3ƒî t·V¾]RßP±¸º{IàD›SZÆÜ™DX]ôŽL¤|ÎàLJ†µéµI´¸´MIõS|¶‹jæT^9dÆ@ù—’;ZŽ- XžÍo"Ò¯¤µh¤fKw(cŒ#†Æ6© ÐgšôjË4ú§ö úU´º–¶º†Ÿ1¾·2H».KÍ$ŒGÃÍb>ÆC£ÌÇ‹ñôA|u­\%Å¥Äw³ÜÃ%­Ìs«Fò±RJ1ã§q‘Íg¿†µèíí.DÔ– ×Dµ‘­\,ìã(ã XrÎ{UËx“P—T‚ûíZlI-űµ“ÍÙUT(\î!·q•V=¨ÅŸØÿáo3û+û[Ê“ì¾f7}Ÿ-æoþ;9ò÷üûw÷û=eøzѯµ¸mWRN¤Š÷2Ælmë–e\²å@fPÅ€$MWeÉÑŸU1È-ám„†'ÚÎT±öìÈdæ2@4I®Ýtû³:\-«Æ!mË321䫽NÓé@øÒïtv‹F7=¤ºU¬Ú½¬E}«sI)o.W9c+–pvyjR²õ}rÞãVñn»mö†–îkM1È)Ì“<’*7ðìÞ…vðnwd0ãï¬/4ËÉ,ïí'´ºáž3®@#*yƤ:N¤¶ ~Ú}سtgKƒ ylªá†Æ ʤö,S@h‘iÓëG«KåXÞcù­>S™b”ŽqÑðê,x’ßF¶ÔcMãϵ1Í缸|œŒ¼ž˜ãiúž‚¼º±Ø|Ý*ú?í }‹u»´çòøùó¹zgïZиðG‰-î­,ÿ±¯¥¾¹´7ŸcŠÖFš(Ä­]6åyLúa—žhcD×ôtð»£Éi< §åÝ/‘òoµDP”1–,‹Ž7µ$ÀRìÕ¸÷[ë>Õ5[íê{m2â×jjP2ÅtZí­×÷2f$RÐáÔªÇòá“oWEzdK¥C¥ÞØYA£ bG´»k6Ô£ûÇö¤%d•Ù%$…¼³#eÜç*ËÕõË{[źíµÿÚ[¹­4Äw ¤2LòH¨ßózÛÁ¹ÝÀg“°Òu-UöiÚ}Ýã— ¶Þî*ÌÊ;QÎ=cRE¡kÙ­äZUô–­“¬Énå q$pØÆÕ$z ó@õÚxFÚI<+­\ÚZèÒ_Å{f±Mª4 ±+%Îí¾yÄíiÝ댨eæåеˆ~ÃæéWÑÿhcì[­Ü}§8Ç—ÇÏËÓ?xzÕˆt/Iys¡Ã¥j­t›g¸°Ky ®ÊíàIÁ#øýècRþÇŸCñDzWØE­¾·Úy}‰9µo=HRø•×ýFWœu rkRÌè+«XµÔz4˜y º kß&O$FÎ b ûrT„›÷“^wZšç‡µ/^Ëom"¢\Mn—E;DåÆÄ À0Ç·|P`ÓiòøåÞ=7O’]ö ¶ßÛ´Fw¶St‘¤p)!£'ËÓ'ylgéÆÈøá=\$ŒÒÊñ4¬ù¡B¿Ý*ñ1‹…W^faËéÚeΦ÷ mŒ-í乕–'pˆ‹’[b’p2pa’H“©5ƒß®ŸvlÑÞàBÞZ«9E%±€ +(=Ê‘ÔP:*H`šåÊA’¸Fr¨¥ˆURÌxìO` ­¼=©6­>—qm%•äó\I Ú4l«-1J¯s‘ۚˢ®G¤êSisj‘i÷o§Âû%»XXÄÇ øÀ?2ðOqëWf ò9޵¡qà[ÝZYÿc_K}sho>Ǭ4Q‰Z<ºmÊò™ôÃ/<Ð?EX[ ÇòöÚNÞlOàÕ12û}ÍN°¢·  @[…a'•É>lf¥àt-÷|Õ{{hß“2þÐÓž£ù£¸FcÆ ƒŠµ±,l‡8f>û‡5Ø>YçÕ©ãåP¨s×+Í#Û+âd#¾0åš{†Ã0ü³Àÿz…Ûƒœ o”£§>œñ¤ÈÍC)F‡êäZ°›6dYÛ6?Û'ÿfªÿgÑ[ÌÆz‚@ü¹©ã±µhË%gô €~§4ÄÉ8\2Ú!BF?ZzÚBå˜Ç³uªæÆ1ÇμúƒüªXôðùÛò©pXØúç5r+ûûA¾8ü³þïŸöh—?>¢˜UB•@Z¥'ÜM#RMZöQóì]Üœ{)¦»¤q¸mÇ qJc¹LÑú䯴…μÅ@YÊÂÀâ6ÅC^äù£uÄgô§™ÑÀ88¦ùxÈ+ƒÔ¦‘D@v÷Í+Aå×h"B1íH²)†‹;H°8ãä F}ɨ~T)š2;*ß4X BÊäzq“rmã®EFFÜÖ¥VŒŒ:gÝlHqíH’„{L« w©RË"}2AªWH¯· §ëI!QêsÞ£20ÙÏ8Áâ‘›'å'ð¤î‡*L:äSËàr§4Ðxû¤¥co íMº?ºÈ5" ‘±¾„ñPÜ‚¨ÊOzqÜÇš_ßÜŸújßÌ×CáoZéZv¡§Þ*;©aœOý›þÓ‘vùS£>i;ÁÈÛŒÇ áŸð—ÝÉ$MäÚj"O Ê›ÒÚgRQS†Py¥.¹vu?è÷óÛXÇtÚ…ì,ö–PÛnEŽØ¨"%Pp]ºúšö£²<ǹ¡{ã¤Ô5K™ÍóGŸ©ÂñÈÊØžèÝãWþ[E¹‚®v.§Š´«mbÃXònÍà²[ Ñ¢ŽH¡E´6»Õ["bFÙ6¶À0Pî ¹xº)ˆï%ñ~Ÿ$Z ýI]û2Ñíôë{e`góœ4q:ˆà¡È[{1?Á\Ýž¡g„µ]2c:ÝOwksnR0ÈÞZ̬¬K¼M@o»Ž3šÇ¢€=?Ûj"ñ ’ý­Æ¹©““º Õ¸Ü]‚‹r„)`¸B7(Á¬?_EÓ´ùüåÓôóo+yÑË󛉤ÎèÉNVEl+6ÝÛK1Rk—¢€6,õ 8ü%ªé“Öê{»[›r‘†FòÖeebXâl‚}Üqœ×I7¡oêzÏ•wróxŽ×V·IÜäÀgÄlÙ;NÙ#Q€@ú ðtPi£øƒCÑíï´ËynþÉpðLo.´«k¶gŒJ0-ämˆ›·±ýÙìä-}Ķڿ†…²]ê_l›XºÔîaš4ò˜Ê).¬:„ëå¨ýã`>nNŠôFñ®‚%Ö'H5/?[½{«¢È›mÖX.¢tA».PÜî Jù˜Áã'ßVÑíÞïMûV«.™s§‹/µK4‘bán2oÚ«¹6íó:³>yÙ\½¹¥¦¯†µ­5V¶º³RQ¶12”‘ò¸;fpS’½xܵñâC}§NÖøfŠoí9*æyä…­Ä¥X‘6Ô"L>7I,ü'=¹âf-böØÁ,’Ákn ÚÎ@F÷s¶FÔs݉9lŒí^ƒMñ®›gáXt¹ »3¥”–å•næMEAûÙÆobíü/è3ÁÑ@€þ4ÑÒûU¹‰/Ÿûvî[›ÕhQ~ÇæCsXÎóçcílr|¼ù`q»+$3Ðíô›}Ü]Ãi ¼Hnn´ËkægŽk§â"†9ÎâSi_œçÎè  Ë»ý+U:þ£¨Hê×w{-­-!i|ârvž6(ÏqTîÿ±ÿ±ôï±}»ûO÷¿oó¶y?{÷~V>o»Û»ô¬ú(¼Šë© ø–ÊÇUÖlt››Û IRÝL«åà‘ rA8;22r)ø›Å6zî‡$pË} ÕηwªÜY”@ó¶…ÃåÙpJõÓ7Ez&­ãëMBüÜÇ5Ü)yz×—1[é¶ù¤‹µ˜nÀó˜0 u ýæRšx—D:ŒÑÉ-÷ökÅ”{¥†B —ÔÈ21  ¡i6mm‡¢€,_Üý³Q¹ºÝ;yÒ¼™¸—Íä“ó¾æç–ÀÉçºOx®qüLù»wÕ5ˆ¯mÚ|Æ· ¹8!eŒ2R3ÀÏ'ElxcP³Ó5£=ùmd´º¶v‚1#¯›‘ YAÁpq‘Òµ-¼W Vú5¼†í °ÑïìŒ|\ FqŒKcÁù: òtPIà[Øtï­Ô÷ÒX"Y^sãck(R™eËî#hÜ2p23W-üC£Ûël[ï›L²Ò®ôß´}Ïç­ÇÏåy›FÖ¸Æ7œ„ÎFp8ú(¬³ñ›—g$¢ïûBÇLºÓbbS«?ŸûÆ“p(Wí ò„lùcæ¾\ýwRÓuXmn¢[µÔ½½¼¨ÁDQ¬0¬YS’\¾ÅnBlä|ùÜ0è “Âúæ›§[ÞØk²Oatñ9F¬êÀ½Ðm|?¿U¶±‚(Ò¾ÏÒ<‘ËvßêüÄX]nûÄ©]¿?ß®Šô ÿˆ6zŒÔšo—©ÏöÄ·;C¬QÎò¥òîÞ]çÑÛœpÙäü5©C£x«HÕ.F‚Êö‰0 G @É8¢²è  ÍÿMþƾÒ5Iní๸‚én-`YØ4K*ì(΃LNíÜm9ž&ñMž»¡É2ßCus­Ýê·e<í¡@pùv@œƒýctÇÍÇÑ@Ö°5£¨‡ž9Òê(¤€áÒI ’4`r1†u9ŒqÍtšWŒôø<;i£Î$„GoÉpÚe½ðÞ“Ý8UŠf ‚·CçÈ ¡!³\Ò]ëöÚŽ—â5ºk±y©jpê’¨áŠùáÄŒ6q>r©‚WPxØø¯i·Z§ˆ­ì5 ½Iïõt÷"ªF°ùȉ ÌB²à7Ë€‹ÏËÁÑ@Q@Q@Q@Q@Q@¡ðþJŸõäßú2:úPðì3ø’Úüíòˆ-"yÆ1þ}½ëçï€6âãÇ·;¡M9ÜÇ_6/P}ké/²¹}ís;r¿á@AûDŸßxoésÿ´«Å3ìkؾ>ºÉ.€¾aCrŒ2>SˆN8ö"¼wmc=Íc±«¨ùÓ\™Y˯@MUØÊAÜ*õÁD…ã ò1 ‡sƒžø¨lfïXI«èiÜV9QœŸ|S@ô5 ]«ËÒ‘€MIbdÈ ìÀàR˜ÔòNM*D23ÓÖ•ÃQD‹ÐsM'q8ÆjbFWf=1@1 zÓÕF)Œ}©UŸ¦(IÉ¥‘š@>^™¥ÏŽiµ9[qû¦“#ƒKæsÀ• °§ƒJSÓy_Æ—j÷¥p³Éï€}ªtÆÞ£Z¬W‘È5'”X€Õ,jäøRÞÔ¿ ^qUųn9’”Ú€ysS§p§PO"8'’úSLQ/>`&šyìqêi¤ƒR_0T~´1a“¥4º28íÅ!(9Æ)Ù·z S÷r[ŸLS7g¡4q·ïàýj¬&=ÓÖ”È푌ÔÅÀþ#Oó[‘» Ú˜ Ÿ^) 0äçó¤óxr#HzncøRlÙúÒˆ ÀãÞ¡,ǦEˆë’}¨°®MårJþu*DãSŸZ«¸¡³ô§®O=n)†„î[!ÐÇ"Ÿ5£ÄpYcÝñTbŠyʬG|.jÙ¶™SýKr Uô° xHöäŸÖ¢ktì3è”õŽir©féÆ(þ̽‘Ь‘×8ùÑf6×r!Î2çè´ ØÃf¤]>éG#h÷aQ¤ ““È÷¤Ð&="ÆX°?…^ƒM×s‰[ýÉcþ¦¨< À|Ý0Ôè,ÚBß8P?Ú¡ Ó:e’ç÷ͺ®á¿2´‚Î%vQ9lwЧ&›"Þjí>ÆŸ®0|åÈ(b^¥¡¯ÛŸz …lØÇf¦{9ïS‚~\0w¦ë¸XUÜ£aÀôæ˜ór?t¾üRÉ“)&FóÄšPH*¹Àúæ—0¬˜±ÉÏîºÓ¾Ô›qåþáB7½©ÌòÙº’yÝ·‘B~ab¸;ù‡üòœsƒô=) n8+îi#rFåç¡9â’eƒžÂžñ>àÞôSU ¿Îø÷§°C;{Hb˜& í céJJÈ• ²m8i4åVY¿,Ñtˆ\vLSV¤Ë fÒ¥•ûÌ}Šâ¢8õÇáI´,sEòº2žµ'éïR‘…äüê2£ÛQq¡X‚:R(N¤­/x¥>øÁ¤;V‡¹ˆ©Ñ¬v€ë#öHùU]c;d]°G®i§`±¡ÒOßIAÿ|~Ýò|áùV|pÀÌ7¶r*д±Ïü}°ôù3Ö´Œ¯ÑÒó&òt2OÍ8üiÂÓF?vyWëÿê¨â°µÉ)¨Æ?ß‹üiÃIƒªê0Ÿ¯jý—õó'O1ßdÒ;^8>ãÿ­IýŸ§·MA‡Ôbì¥b6_Ûõ§61ÉY­›ñ¢ÏùP]wcFbOˆÿ¾M5´ë0 MB<û©'ö5ßd€û†¨ßD½8ùW>»Ç4œ_ò×r¢Â¥Š™ ¸<’;(ä܃?\:sh÷ãþYþL)¦j¬ xõ¬ù%ÕÍãd²:1ŽÙÏòª"Ÿ%½Ô|:2Ÿz…£œž„Ô¿B•» Ë€1Í8’£ïð*’Óð&”ƒ÷L+'¿¥HÉÆϘÔR0Ú¹15%r cêië–PDdç°9§`axdSžâ€Á5ZÁ¨Å5Ýsò»ëH"/N݃cúÒ¬ÒF¬±Ë*¡ê£i†VbÞaÇÌ3üé®sÔGïòü±OaÚf…²³ºs‘ÅX‹RºUØ· Ž£r©þ•–E9FAøSžGuÄž[wÎR•º#Þ\Ê»$1Ÿîš€)#œžÕ.A;zv IȯóG½'w¨Ò±0ÎN=é' ÇZ.À£>¬)pñÈ œÿ*V{…ÈÛy9<~¤;n 1ØV#ŽYŸ”ÍžøR\«E…ßçû§8§f+n•›#oAó‘Ó8ëÓ­ `8f3ƒòç4X)a»šdòQqôâÁúŽäPrÈ .}Å ‚'˜©À*¹æ¤iØ®ÒÄýiJ¶Þÿ…Fi,O¸§~ÀH²¶8sÔb™u/îˆQÛœŒSdŸ½žøû´vÌÈ@ÎzqÜRØæ|2ÑŸ^$“Ai¨Â<Ëo{i‘Af!FY€äŽ´ºå¡Ó<£ØOsc%Òê³2Z^Ãsµ;`¤˜™€ÉFëèkZðʼnñ¦©§ùpÁ¥ÿhâ9ç%Q‰“ÆXJ©ƒ­§“xŒF’š™ØÇî‚Äa^ÂØóYÁÑ]§‡´›ÍRKKiŒ¾ZÚ4¢TŽGoà$€Aì Ò [C§ «˜BjfÎa+…ÜÀzãš.8Ú+º¸ðd{D¶ñ¬¶ò@n!’Ý™ƒÆ ˆ<®:ô¤¹ð¼?kŒÚJ‚)u´;y øçZ.+5Ýj~ 1kkö é°Ââà³m¹^»ÕmKÂÉúÁ¸|ˆå?;ï@ÝϽI+±¥wdqÔWNÞgËãØšaðòùgúšÏÛD¿g#›¢ºOøGÔSÿ4‡Ãêú³ùš^Þì¤s”WEý€¿óÌ©4ŸØ+œl?™§í ÊG=Et?ØKÿ<Ïæi°¶<³ùš=´CÙHçh®“û?ç‘üÍØ ÿ<ÈüMÚ!ìästWJ<>„‘³õ4Â?>çêhöÑe#š¢·ßB]§ ´ŽäšŸPðØµµÒe GÚàó“ÏÎWúU*‘d¸4s4W{qàÛS}}h‘4dÔ`³iBAóN? U gÖVSÉm´ÁpðËY@P:]@Ï^™•MØI\äh®ßKðbj–6ÑFª——+3Äìä Dè¾>ëøS$ð¤rÏo-º}•ôó|Í,ŽcÜq–=¸‹ŠÇEw7~ “kU¤·Mc ¼‹n›÷0—ã®ÿ®›á;}:}kε“uµ¼Æ=ädÛÁ?V¦Ew¯àËX§ÕÝö¤v0ÛLRC!eäì°>ù¬Û­ Í4]NúÖ34V÷i JÛÔ…u$§˜äQp9J+¹Ô<žúä‚ÕçlÆb ~Q"ƒ¹±Î+Ÿ:R–'ËÛÉùrxö©rKr”[ØÆ¢¶”½‡ëIý’Æ?ZŸiû9VÇöHì?Z‘íúÓö‘FcÑZßÙ>ƒ?'öQþáüèöˆ9•Ej,Žvqõ¦ÿg²hçBäfm§ýœ?º:wö`”<ŒŽhö‘#2¨­Q¦¦9_Ö´%ðį é·–¶ÒË5ÜòÄjX±R00>´ÔÓØN-ÕÙÝxjÂÏ£KÈHàIáÌ‚)ˆSëÉǨÅ3Rðl–GžÌ{{élîž2X#¯ÝÐÍ;ŠÇEu á’ú ¸H$7QKVBà2¹ç85i<)o'‹¯4¨Æèàó¸ z¢yÏb(¸Xãh®—Cðòjz’[²nS²pÇøP·ô¦hÚ%¶«{o§²Î“ÝJ© ±ÀB=(º íÓé~‚}utË‘+Ló›x¼±”i#æ#3ŽEC†®?µ-mç·q·¢Óxc6ð¬w¢ácž¢»)¼5§ÙY_^^™R+]bK "RÅÂŒìê1õª·ó´=/R²€ˆîî%†FÉao½>SŸzwËÑ[އ.—©\ØOµ¦·ÆåIÆEUûû5<È|¬ô¿ÙëþGëî3ÿ¹?ôlUô£¨cÌ‚(iÀÉBz*âsØvÎO`~Kðö³«øVþKíçì·2DagòÕò„‚FÕGå[ëñ?Æ«³n¯ØÅ—6ÿ)9É»àœŸÎŽd>Vv×m·‡ãÙ{èyJÛŒ|BpÇ»s’}O~§É¿ÕÖ|O­x‘m—W»YÖØ¹ˆ,ÆyÈ£9 u¬£ô¬¤îËŠ²4%[™® yNÀýÜ p¶º?òï'ä+¦Ñ¢ŽuŒJŽWÊykNÔ-ŒàúzUµ–ÄË¥Ïþ/ÿX¥uï=š•©6יȋK¢ãÚ_È!±¹'›yOñ®ÈIbÀÿ¢]àBÿñÏôÿ.·_ø¿üED]œ‰µ¸ío)ü¿Æš-®ÏüºÉúWb üúÜÿàBÿñbÚÊÖúO*8ç…Ž0í(p9 Qž¾´{¨¨FS’Šêpÿb»ÇüzÉøãüi>Çv?åÖOÒ½ºçáRX„7>"·„>vùŸÎJœ|™Ô­FAämÿÙÓä—òÿ_y\´ÿçâû¥ÿÈžö[œqk'éBÚ^Ï´Ÿ¥{ü* Æ×"2… Sìü€{ýúá/­,´ÝBêÎ{›¶’Þg‰Œv¨Tíb23(=½(örþ_ëï Cþ~/º_äqßgºU9¶“ëþ5ËÜœŽÆºÖ–É•…¼·M ÁĶ胨‘JÂÕÑTuP š‡hÕ†ãd¤šiö¿ê‘Ÿò“R†ŒSPžãñ¥T 9nŒ>”mùsÍ5v àãÖŸ¼œÔŒ‡qÀ4üJq³8ö4»·t§«:ðÅ0°ÕŽRÇ$çÜÓžÉáqõ§fS‚N)ÛÛ™JZ…ˆD F~\}iÉo×'Š GwÞýh1íç4õ‰<¤Ç߯zŒ€rE4œwüié!Û€ªÇéBLb 22}¨#?uIü*XäpßêP¾r|ª„g:Ó°ˆÊ6Üí8úP#b9Àa<Á!VË3rA柳sm8ÏÖ‡a¢¶9äŠE^¹p*ËÛ¤iË!nølÔ&Þ?ï~µ7  çò¦çš˜Û “`Æ?Z.‚ÄycÀ4୎߉§ˆÓ¯?…8F{(¢é ÂF²g Œ÷4ý®H$ÿ5çVÈëS¬ÓíÇ–[Ûš®`µ†„Ÿ¢äý¦2NÇ\ŸL”´½66MÒ¯$°?­+¡Ž[K­›¼©ç°qšU‚N›yúÓä?ÄGãR+É÷CñChi1ßcœ€V2Aï‘W-´ Jã!™qT‹JFÝíLÔ‘Ü\GÄ«þëIJ=BÒî]Ÿ@Ô RÒª€OÍUⲓ} q;¨\LÇј‘üéñÌä€ó2ûžqIÊ=”­«,$o*øúR¹ù}¹¤R¹â©ÛÒ­¨·T®¥$÷HAÇæis>‚h­‰åæñŽI¦mU~KqïŠÖ‚+$½ÍÞÝùf¦h´œ~îI õlñO•½n‚þFbK‘Œ~9Å+nèS‘þÕ^òmÑþïJ$Š,›É÷Pó©³’ç?wõÍ78êÑTôÀ¨È£7†*3 àcÜÔ¡LáF{c&¢éùÔ²3‚~•*ÃÌaW8_§JEdBK*8ô9¨÷é¸ýsJÈã9õ§ÔDˆê\6ÝÉ©|ëpÙkE#ÓÌlT`J?ýU4?fý#Î'ýŒUʼn‘¼°ËÊ[ÑÉþuë|éÎxùñúUÓ&—Œî?Ú¦¥·üüÈÓk]Ð/B¨{<àÅ!Î?˜|–•J¯¡<ÕÏ/L~ÓÿŽÐ"ÓG!®>¡j\|ÐסHÅlNTõ4‚z¯ó«ío§6?(ú§ÿ^„²Ó˜ñtøÿ®ýz\’î‚þEdµ„™öûç5ÚÄ[N;‘ZÙ–$`^cê¤S?²­y?nñüj½œ¼…ÍêTM=yÅä_ð&#úTƒN8'í–þÙ“ÿ­S.!Êß[þ-ŠUÒ¤#ÍÿÀéû7ü¡Ì» ñ,Ç_0S$¶ž5ÜY8ìëV?±®Áëýö(:EÖÒr§’ñ©p}K̪²Ì:1ØÓ…ÅÎ%qÿ4±ÚÎ͵P»ÐT§O¾ÁÅ´€}*RŸAó.¬E½¼òÖOΚÚà'·çM’ÊíÞ¥G¡CH,îØ’±1÷ÛMsù…Ѻ…ÌŸ9?WK«„cô"­ý‚ôuÿQ˜nWïÄ@÷>~ œJ¦VvÜË–¦­Ñ ÂíÅM"·B½=zÔ-ÏðýqPRæl±>¢œIÙÓÖ›åª`îéÛÇ ç9 P¤îãêi ´}C!úrœ­Š›r ѧÜhÓÉ cèi¡[Ì9úSD±¬¹1E·ý Gò4ÖXebë".;+7õª°µ2™ ,‹óëNM„}¯ú¦j¸ÙŸžYýÑšA4[ 3°=ÔcùЮ2vX£p¹·uØA¦‰?)pOb*bFr?Ý¥BÄýìaIî >öa‚¸ÊŠfR î0*bÑÆ¸,îO¡£3ŒãÐ A'<3É¥vf ã™lò@ü¦4¡G9ϱª³ ˆ$*rTõíCO»’ïO@ä’~´玿J[…QŒžØ¤3dnV#Ú”G@}}j?)Øí ,ÑÔ Xué×¥Oöݨ¿2‘ýÑŸÖ«bHŸ”ü”¶pZÝ1ô5Vód_FˆBû-DÒZÈJ˜Š£{Ô,Ñù‘½‚äg©<Óæ !þ\³‹ûRïÉXL pÛDG@3œ:p([û\Á¨ÝÅq •.èÐtU9È^OŠ’+h¥}¦E㾩„{HûG#°éZûI™rG±ÿjG<ϳ« ¥M(¸pÒÐ1œS`ÒdŠ8ÒÚþþ ²yʈÄ—Þ0ß{g­iE¤†Ç•s¹±Ÿ•€þua,/cRRø/±jjSê&¢d\iw²<×kZ‰º–# ¼ÎûÞ3Õ Îvût©oí5­j$K‹¦ŽÉmâ€ÚÇ3œF e'ñšÖŽ=XFvÞ ÇãT®.µhÜú Õó´µ¹<‰™v°`û<úü¶ÁB&¸v` …ÆqŒÇ°¡!¼^Yæ•ö…Ý),v€2{Åi ýCaTøZEÔ/[0!R?»Åg)_«-FÛX§‰0IaôÇZB1ÇËî1S<ìØ±éUÙ³ÀQÀôæ²»èÍ-ÜI9c˜ÇSWÀüi:ŸqHÄž§EØì‰r±òQê8§G-¨ËnÎORÍËÝQûˆØŽ„ŠXÞÂųœ«à~UIŠÈ?q’Póî)èmò2’9$§?J’1§ÿÏ ÀõßÿÖ©’:BH’u=Ç4Ò%ú 7ÃïÆ²ìç4ÖhÈ'j)öÕ¦²± òÉ('¦æÐSE±m ÈXö8üxª´‰ºìW"ù\ŸPV™²7ÂŒàuŒ⦚ØÀųÿÀj«0BHÈêËŠ–ŸR´èA•gªiókw0j“Ïskj­ˆÎïùf<¼¶î9ÍC¤C£Ý/ƒ-.åWÒ_VÕ7”ü²·ÊäpÄ(÷Î;ÕrNÖlžh^é4m¨Eyöø5;èîö3¥Ã 6€]ÙÎ0ǵ5Þô›¦:æëµÛrLí™Ç£óó~5ÓøŸO¼Ÿ i ÞÙOgc$ׯâÎ;%‘Qñæ$k# Àq‘[¾#±¶¶³ñ Ýh–V:Du¤¶ºŒpâCrÂ<¨9ç9l¨ì3ß&T'µÊç‚ÖÇŸÛl5îµi¨j $!Ýâ\0|1Ú¡›99ÆÒ™}¥jvkÅü2¡ºb´Ç.ùçqç<äzæ½Å–×W†|o:E…¦› içN’(Ô›˜„ îcŸÞêGr3ÅsŸ.ãÇ÷¨ñÁà ¸SJŒÙ‚3ó÷±œ ôQ85¶šr²G!±=©JœqÖ¤à±Æ)åç5…ÍìDãš?Þ⟃èiØ tÏÒÙ6"ÜÿéNžäqíNØØf›·cÉÇZjMlKIî[ÓeÔ, –+NòÑg9"vA!÷Áë×Þ£±{ý.idÓïï­%”þñ­çd/þö?7ìótFÈÐËx‹¸»|Ý:üÕ|ìžXK‹ûK¹îaÕu(.§šU•äí09?Ei5æšû3X¿²iHó~Ï3Æ_Æv‘ž§ó4»®ÄgHêzdSZy¼±ºÙHŽf7K­VÎyæ³×ïá–ryb¸‘SÏ,AÉ<ž¾¦£ŽûZ‹í µ}Ú[|ånY|ÖõcžO¹¨¼ð¹@ÙÖš÷1•FZ9¤.T-µæ¯§[½µ†§{mo!Ì‘Á;"±é’©´­gRÐÞ‡Ê!6îÐÈÉw¢ç¸Õo´ÇŒ ó׊<ØÏ¸£‹•Kw{8•g»–T–v¹’2ÇcJÝ_oMÞø§ÙjZ®–Ò7Q»²2}ÿ³LцúàóK”#¨¦žÔs1r‘<²K+Íq$“LçsÉ#f>¤žI¤ÊOÂ¥Âþ2'oåJã±cøO_jfÑÇÖ¥(1i†2[ÿ¯LLf$R`;ÓÚ69àÓ mŒóLóFãhÇü»Kÿ¢š£ è*ΪÉ?ñí/þŠj‹(³4@ ‘œRSF_ø²Kuñ¯—“Îûlß.Ñ·ýaïŸJ÷øÂx}.T¼‹ÜÄÝQìzŠð?ÿÈÛ¬ÿ×ìßú  Ë9wܺãoþÌ)šÌj|¢=é¶ñôøþïþÌ)úÂ’±sŽMrWøþGt?Wù#+bá&…`¹( {FV#–À¨ÊÎÀ .Äž)qž€ãéLRzp~´ñ4ʬ |§¨è× î†o€)wœ@ÛŽJàр犨¡˜÷â‚ιÃS–ÝóÖ¦)a´àéÖ•Ðõ+y’†çÚœ^BqVV4^Y¹úSÜðsøSæAÊÆ(Èçš™"i>áçÓ4åŒ2îÖž«±²qSÌU‡%Ãr£$rqD1,ªÍ摎>µ«gáëûûH’nÀwlðHç }*aàý@‚âÐ{oqÿ²Õ¥äK—™Œ ŒHªXà ç¡÷§Tc÷IŽk_þ«ìóqgŸPïÿÄÓ¿á ¼òógø3ÿñ44û20ÝÉÈ•/"ºøC/ÇÚm1þóÿñ4ïøCnñ´YÿßOÿÄÔY•ÌŽiº`ÓóØzWH<yž.-?ï·ÿâiËà»æ?ñõfûÏÿÄÑÊÄäŽqsž@©” üù÷ÐÂ|T“uhÿmÿøšCàûìcíV‡êïÿÄÒåc扂 ž8Á¤yf<,’~uЯ„oä\YçÝŸÿ‰©Wðû—ƒýÒãÿd§fG5œ:†'>õ+ë·~k|øWTo¿ulàoÿÄÓO„¯‡{Lû³ÿñ5->Ãæ]ÌÁ?2ñß)0‘õbkq|'}ÚkOÿøŠwü"·ØÁ¹´ÿ¾›ÿ‰¥iv ÄçÔ€{ŸZšÞëÉ|µºH=¥lÿÂ)}œ‹‹?ûéÿøš•<3©Ær·6€öŸÿˆ¡) æED¼”Ŷ=/›øŒlÇó4Zß "O£®jÿakFëûOlJü㵤U¿ì EŽZ[\ÿ×G?û-)ðýþ?ãâØŸ÷Ÿÿ‰©å]¿ßÌ t[£Ûë÷…)Òf#oúIVÛÃÚãíÇ×.ÿüM(ðíî9š×?ï¿ÿK•vüBþexôi°Ò¡ú¦5£[ü¦âßžàÿõªúxvïø¤·?Fþ&œ<3tAù ÝîÏÿÄÓå}]w3R ÉÍźóßÿÕVF™o¡Ú¬§†¯ÁäÚíö/Ÿý‘¼-©J}Ÿï?ÿBƒ¶±¸œ£ÜªtËRy¿ŒÿŸ­0éÖjOútgèµu|)ª¿fn;³ÿñ4ƒÂš =-¿ï§ÿâi8¿ä4˜¤Ö–ì:Š`t ¦™öRy¾ˆÿÀ ^o jl:Ûþ ÿüMD|%ª“İÅÿøš\¯ùCš=È ¥ºp/鵿¡–^Rtsô#úV‚ø?Uë¾Û?ï?ÿJ¾ÕIÈ–ÿlè4œ%Ò#çs'ÊÈÀÞµG dàï…nêÙÿ[oŸ÷›ÿ‰¥ÿ„?VïÛøñ5>Ê}ƒÚG¹‚›©?J“Ë*3Á·ÿ–ª;Ûgýæÿâi…5a÷šÜ÷Ÿÿ‰¥ìªv´sïÉçÓ4…d‚0kpøWSç&ßóþ&£ÿ„WR-ÿï§ÿâi{9ö<{™GAË}A"•®î8į´¶ki|«:ä=©ìÃÿe§Â«ãµü¿øš¥N§D/iæ"ÜÜÈÌ= N…Ò$>Ù=+gþ [<½©>ûñ4Öðv¦O[Sÿþ&Ÿ%_0öîeZñzHߤÍáà¹?ïsZMáLq›_ûéÿøšŒøOT;íï§ÿâhµo1sÀÏ{ùòÆ[Ô¨¨%¸NU2}ªþÔKQÿþ&˜<5x?奡ú»ÿñ5<³{”¥(HIþ,znÍ5ð„zÜMèG´ý‹êÇþËLoÞ“YƒÛ.üã´ù$ÈÂ1““Œv9 Ž&M¢&Ï\¨­cáËâ~k›Aë‚ßüMÃ7dœ]Y/¾çÿâi{9‡20…©rWs× þU^TòÛ ÈZéÓÂ÷JGï´×÷bÇÿe¦Íá›¶c¶M=[Ñ]ÀÿÐj¹%mƒ_s˜ŒpTŒúŒTŒ…~ꑟCÖº¼/tóÍ¿íáÇþÉV_ÂòÂÇj¯Ûÿì”ý”˜ùÑÈäã;S‘X÷ëšèßÂwª2Õýusÿ²Ðž»þ+›oÁÛÿ‰¥ìäº:î`îÂá”7á“Nóv&Ü úšèÃW™æâÓ>»›ÿ‰¡¼-|3™¬È?í·ÿSÉ.ÂæFš:•üJklnBçë[ãÃw©Çkÿ}·ÿQ¿†/_Ÿ:Ó>»Ûÿ‰£’]ƒ™ù1çƒ@™ c¡õ#º|3{Þ[>?Úþ&˜|/väæK0?Þþ&©AõAÌŒ€Aèß•>6to‘¹öµá½5¯ýöÿüMO‡uT?%ů¡f#ÿA¦ Ã2^Ü”ÁbqíQ éA¸ZÝþÀÕOV²?Vþ&šÞÔŽÜýˆz†þ&«–BæFJ ùhy俬E<+†{t-žÆµ¤Ð/\ž,”£sãÿA¦ ^·Í´‡-ÿÄÓäk`æEsu@|­ƒÔ(&¡{ÙxÞíèÑãõ­EðÕâãý"ÌŸrÿüM+øjþ\/™¦~,Ãÿe¦Ô™7‰FÚñ"?:ÚÏž¥”š¿ÇvxŠÔq…ldRÅáKÐv¿ö{iÜgòZ·ÿ«€ÚÚîõ[—ÿâjá­É”¢ÆÔÃuqÀüW6s .·˜O'м¾¹ƒýHXXŸ½ö‡ÇþOoj;³öˆ3ßs·?øíko".»˜oäç|rÔ©æ©ÈfŒàÀŽ€ÖõÆ…¨– +ÚÀ†qúìªÏá»Ýü½ªç§ÎÿüMe(>…©#¦d$'Óž”ÓvûBíÊŽØ­Ù|1~Ã+-˜?ï?ÿLÿ„[PÆ^[LŸöÜìµ’èW4LQ*mf#ôg $ƒq+ŸB:ÖÁð­é^&²Ï©vÿâi¯áKÒ˜2ÙØï|è4rKªh”„0eWb{fñ]±©”Õ¤ð}ê€~×dÞÛŸžÚ–_´€›»/Á›ÿ‰«ä}…Ì»•M„);™ÚF(J´^dsœõ¯¢|©ŸœÞYmögãÿ§§„uˆ—|WöÀúïqüÖ©Sï\×Fc>p­–9÷9˜ªâ9T²ŒŽ½kz_ ë?yyhÀò~vÿâiª]ØãÝÛÿ‰©”<ŠRó13#mÝ>ñæ•ËdlçÙ³Š×¸Ðõ(»Ëgè£c°?3ÃêE8ø{P.lÁcÉÞù?øíO+Cºg/$yÉ}Ù÷Up1å3ß8®¦O ßHšÌÿÀßÿ‰¨Ï…ïÎ žÏï¿ÿE¤;ÄåßL¶a»`ü1¬ v5#é]IðµðÁó­1ßçþ&“þ‹Ð>y­1ìïÿÄQi…âroa Æcàw©¤y¦ÒaÒÝÔØÁ;Ü${@!ÙB“ž½®”øZ÷i+5¦=w?øí0øZø¶DÖ_MÏÿÄÕ®tKäg,l-ΗíÅ(³¶?)ŒdõâºsáKâúEž}ÿøš?áÔ?gíó?ÿE¤ Ç¡Ì6›n˰ÏÍZÔZMcQ{íIÄ·,‰eP£¡Wìnß““qgŸ÷Ÿÿ‰¡|#~sºæÏþûþ&çaZ79FÓm”–dv§ˆ%Pƒ¯¥t§Á·Ìp.m?ï·ÿâi‡ÁšˆëshGoÿøšV“Ü/s›['Ûš >6æº?øCu?ãæÐŸwþ&øFÿ‹2G«?ÿG+ds¿1À¥Žq•#Ñ _=‰'ý§ÿâ*ßÝéÖR\I-³¤xܨ͞Xê;š9X]!˜ Á@‚ÅFB¾™«FÏ4‡iÀ'"š L˜<Þ›ç.HëïV‚¨vÉàô¦ù12 ôˆFÒä`|£½9]w#”Ž ?ËRx$7®)žVÌòx<Š.'`ϽW“…=Å<˜Ê*ª†©ÇùçÜTYš5ÉPÍÅ;÷mp8Œž^(»-FU°<À¬:ƒÀÙ¦(FSƒ°–ãž)ËjŒAIWktç}ÅN‹åáV!•ùXœ8çÛü*ÕÉ!Ú°~¬¸­0 ±„qÎßJ• ýî2vŽÀñøS>ξ$ @þ!ÁúQfæ•ä¯@qPXüØ úб$*¨2_ùfçùŠk2Ž6ÈNáÁ¥`ewŠ6<(T&%+÷yõ©Y7(r@ëéMR@‚} †˜Óƒ·ð#éNVÁ#úô¦’ÄôÎ(¸Xg–G|Qµ€ûÜÓ÷ÜÒN0HfN¹¦œŽÁúÓùÇPqM-ÏÌ4C˜sIæ0îy§’1ÒšJÓ=EÍž8÷*n‚EÜçf6äŸJ¸4Gü„ôì×þµSÒ 8ÿ—iôSTk#t¬Û4µÍ ?ä'§ßÿþµ4è‹ÿAM7?õñÿÖª­0/½+…5Ñx?ñ1ÓOý¼õªUÒ&La»³šO/åXgºƒžÞ•’—¨üë[DÏÚäçþX¿ò£G¡p“„”×MHŒºÓº;ßÈΜ«A \ú|üSÖ½ÿA)¿ðb¿ü]ggœfœYF 4¹¥Ý—Ïùö¿ó,Áý©jå ºò‰êRù?\=O,Ï3³Ë¥é +¶æ‘§RÄ“’I2Öcäÿ…DW8ªS’êÉr¦ÿåÚÿÉ¿ÌÒ¸ˆÍ¬:^™cs=¼ª\(äã÷‡ÓÒ¹­a~HÈõ5ÐiëûçãþXËÿ 5akIû¸±êx©“¾­„¦šQQI.×ý[ìbùNÃ,F(T·(ù¹¦:ͱ$5FGå»±ïN\j‘NAÊãÒ¥²ìEåàãõ¦˜7ã&¦üáO.ÛyÇÐR»ˆã· ןj{Dä ª?Z\çúäâ¦RÀ.åô\,@mBŽri¢ñùÕÆvÁ! C¹ÇP¤ÅÊBP€@ pÈàuö©yÏj|döÚ>´\v;– §Ìs‡ÿÑ[ÑiW³F²%¬®¬2 æ±ô§@µbS8áÿ¦@ׯ…„–¶Ó¤ Éÿtóƒ^¶õ›«ìŽEgJÖ[š×–W–6­<Ösc!@ÛË1àõ5jën­>›*ÈFJ¨éU¼?}w«ø–Ù.Э,´øô»4Šg½‰»‰<Ÿs^ÿ±ÀÆðQn_¯ßú>×&¤ä”O¸Ê³Óî/çhíÓs*î# `tÏ5|hmÿI¾³‡ÛÌÜGà)ÚB‘}=«uš" žøãõ›qz‰i+£U `jó0xHW‹”žÇ¡ˆÄJ›Iig¤ªdÞÍqŽÐÅ€j-FÖ +¨ü•v‚H–DÞyä}?•aèú»¶w\`2£ñú×RaŠûJ°™ÛiUh‰çk«ÄaiÆ‚©MnM*Òudb˪Xغ ãR\p§ðÿèb±GUs²†Œdð â]@±Ömõ]²Þºª Œ¬Ê nfNF@œõ­-/â Æ±[êsD!d¸@ qÎ7án:{Ö úª«©èÙN ¯åVæ°±·òÅæ±¦ÚÌñ¬ž\²í`§‘ÅsZˆ-ïÑV "¹dÚ³µƒm>…óÓPw¿7NÅ™¾ À$ò쬮®\}ÿ” _Äõü+wJ×#Ö#- EÐPš¥á[”:D—3G„È‚¹#9Ç­upßDÖŸjù„j¬NåÁëÅi.]H”ÝÌ?øC§ÚAºƒð:‚o ¼Û¯¢,¨\.NHéEï‰Mì^Q€¤{ƒadÁ`;þµj‹–¼ÒÌòB#f‰öà硪öq<Ž5c’G ™˜öòëBßÃZ¤ç%DJ{Êqúu­oj0ÛiRG,Ÿ•ö+(ëëT$•tÍV-Næêg¶@vÚ0ïŽ>£¹êÂòåFŸ,nÍ»„²Òì’óV¹PÊÛa É/û¨:sÅféÚ¼:¾©2ZÛÜ ­ Keeh#ŠP³JÅÚ5ÿ>ÕÕR„iÓn×g=:²œí}Õí„ýܬ¬pf%”,¹S‚=*®¿¨j0Ûéd½ž(¾Ì_b± XJÜ‘ëÅ6U¶¦¡u`ÐàJë+í‘ñrIȵ´<5h|Ûɺ e”® ³á²­§\íΔãàÊ|3[æáwÈñ™#`»aRŒ5ïÇv­ámLe7{§¦>œQ–Q,2rŽ8¬þ[¶qí[¾*ºŒ-¥Œd—-æÜ “îIý+'ža ²³»ð޵”⓲4„›ZŒÀ§mÜ1Ú¯`êÄǤŸ•!Ðõe!M¤€Ÿ¥O+23ÌC¨¼Ãàá9?õÑj{‰,.¼E%í’®x=€qŒã×üjF§Ã÷„ŽOýµŒÒFmœˆŸ›~GzaN22 S/LŸ­Y$…fõö¬ Ñ)a¸SvÉ>¾”ýŒ2Aæ—ç'ùÐŒPÀä±4þüò{nþO^zÔˆwÈÆ@ã=è° 2?J²çy€qéßÔU™‰,§ê)û0ËnÁA4!;G¨‘w´vüÇoCíJ‚ 1F?@TüßáRžw&?1°0I<ïM–XÔ1'ž…*„0¨Þ½B3×'Š6Ì A:z?šFÏmZcù-ŸÜ…ã qEÆC$jÆïš'¹àZ_—nÓ¿qÎj-„‡#Ž)~9ÈïLtíL"EÆ¥+$Œ¨«¹˜à*Œ’}1 ç8Òýi]&Ù]Y$Cµ•†#±ÒÙ9Æ=hÔ@xþ´ÃëNÝši>ß…0ŽLÔm÷¹éO`?JaõäÐ"3ƒÖ“óœÓr*„zF’9þ¤ÿÑMPc=ñV4˜Îá“ÿ.Ò趨„Xç5ƒfÂmÇJP‹Ô‘š6š6œRGÌ}«SE^Iÿ,_ùVjŽ0zÖžˆŸé²uÿRÿÊšÜÆ^ÀOó·ã4\àŠ“`ì*n2‚˜@ÅNÃþ½3jžÔ®&°–N匿úV° GÏs]UÀ_ùc/þ€kW#l\¦†ô¹‚{Rä'îñì*È`y?Jpœ©ùT ”ʱÄÿÝç¶E++*r:úŠO!=ú FÜýM'b’d# âŸLÜäqFÃŒjdÊŽÚWåˆ*óùS‡~´‹©4ázzš–1»ØžÔÀ4P>é$Ôjy§¸ Àf’8Ù›—bÞ˜®q¸þ4“B=A·‚=ÐK)Ýóä/?ÆÕÍ\^}šy8$•D„„d ž}ë{ÃʰmŸÿF5W“ÇÎy>ÒêY‹`¨â½ì³OÌç¥Ò<ìMNÖ0e× šÜÝX_ê6wª†DŒ€pp3ǹ¯K´ñ¼’`Óïš=£Ì¹<µuÁäóí\eï‡&’ÂdK’X¡Ú ޽EmX^ê·}»ÎÉ…dhùSùÖõq´\¹¢ÿ(КVe½L™n.ÀÈéëòŠÏ¼³Žñ`žÞGÍ™A‚)—šL7W†âHÄঠþU¿5´w6Ï Ã1ºí úW!{ý±¢87OhRLnDZò˜š5%QU¤ìϳËëSptj5óÙÜÆ×u»hl&Ó ÒoZéÆÀÒäl?Oâ®Ïá/‡n¬-ngºUK¹™$MÝcPsùŠÈ´ñšáfŠ5>½Húw®¢ÞþâæÁ¬ì {{y¿ãâåÆAýÕÏ8÷©Æâ±xªUŒ_½»nÿåeäŽz˜*8i:‰«ôKþÜê<3}ú•øŒ—2‡ý ¼Ì`Öõä0ÃkÉü yQŒ“jóÙ öÂ7³o.H°PŽØ©µ=SþV·’úá´Ûøc11*Z †sž>éãé^Þ_>í:•.§‹uT\髾Ä]Ȇ Ù¢ˆºËu*™w|ª¹äã®qWu=rÚú]Þ܆&öÈlàg½:ÂÎ×MÒÄ)yo( \°uÁ'¯z¢‘é–·"[ pó”9&8ϨퟥzÕ<ÕdõWµŸ#Í”qmASòºì]¾šAâGxHÚ“¨ tbN1\޵ {«»[ÅÛÊÛ¶ŽVõÃÉ™ÎìÞŒ;š¯u¦hòj“ê)$Fçæx£Œ¶Ò@Ý‚@ïšóp¡e7dÏK ;8îŽ/N¾ºÒ5²ÞüÈà"2—‘Šõ ‹í x°`¹ Ç£.?˜¬ˆìôLïm:îësÎ|ÇÝ­‹{‡[ymìt»{HæÆæRÅŽG$ÿœÖÕ+ÒöN”n×B#N|êoCÆÚX¸™dbae|î3úU/j¥|6‘6HIN ƒGç[šÖ•yy¡ß[–ÉxXÎrq\§„tkû –|bW*¤r29*ó+BR§h­nvBIKVv¯ª 1 sŒ3ëRÛ]$–sDóm`Êñ§÷Ï þ˜¬ÅÓ®ÈȆcþðTúþU%µ­ÌWJò‰7OÐ ç§F¬d¥#IN Ymñ9ßÄö­ 1%NÅžÝ ët­JóìÊï¤J3°J¹ÿõT^0hìïío$#ÆÑœ6AÖ¨Ùër•ÚÂþàÿ³Áù¶+ërê”)á¹§RÍôôù\ùüu:µ+¥].ºÿÃ&½¦jÓxfãPŽò_-rÑÅËþ÷­pÿ$½†òä\+˜.‚JLJuäÿ3[ú€ñ»¦µ‚Ø¥¥»Y¤¹;Ž;*Öá[ËG±ÚŒ?f²ÉŠSFI$“Ô×>?B½>TîúXZ5iÊíYzö­ý—.>Æv–9!ÊŒòœ~N*]¬‘Í"Æ {éÊ»pÌsÇ$ÿ*ѻҴ½B h®Õäû<ÆXöÌ’ xiH¤ôGž†eY?´ç™z©fÜ?ZÓ¾€Á¢²¡ÜmÑYI<’˜#ùTšBCÍÃù%¿wÛÜìÈÇ+×ŠÐøqáý+@Óõ F©ÞæV’b› p9¬MRÇK’ÚYžÝætRB„“X^ªÜÚ®§{k2wù*ÜŸ¯¥v,E)ÂN^醴ô9]°’Q÷½z|ηÅ>,SfÒ´T.„âIOCþ²¼…]7ìxsÎÒ„p~•­­Âw[IŽv•89ÁàÿC\݆•¨=¶­bª·ñlÇo•ØWs2¥Å’Å*¨fP[hèÞßo‡ÄG ^5WOøc,FXФúìfXö"ÙÉIãÜzŠ™ü»HžFÌ“0;@“ô¨Äs@6.xPÀþ§áI²iÁDŒ =NЃük¾Tpó“”k%NNíu<øâ+ÁF2 ÝH«'m>ýŒý2".ã'¢)$þŸãùW]á}gI¼ð´z©åì[O«Ê¼+`õ`ç×5ÏÚ$°\,e!'9^¾)š–‹k©8•Õã™8Y¢m¬¦kÒ´e‰æ‹M4¶7ÊiJ8nY&šn÷.Þø{Ãv†Ñ¬¡’q³‚ŠNwO =s:¦àwZhúTw[)y®|ò#P;üGúñV—Âñ3â{ÛÉãïI…?\u­OìÛ5hìƒÄ/A^wµKcÑ&fizÒ h¬Z‚wG™LCvƒ§¨åEWñã‘âPüøÛèÓ¥xQŸSNÔmü-«\%Ö¡eªµÊÃNbmªvŒtN”îß3HöG”MY³÷¯Y“BðK.OÖ µ)Çþ‡HÞðuÓu“ÿmOÿ[sǹŸ,»x/ð¯´ÜÿÏõÏþ„µï„…RÄ€$žÕã‘Ç£Ùivºvky¼É)’[O¥vZ§Št]ZÂK)PŽ)p$ò£ÁeÏ+ŸCÒ¥J<ÏRœ]–‡ã}6ëQ’óÆÚ%¢ˆ`Ä%†C\ÆÏ&ðÿ¸É¯Mð‡ˆl|KáËkë±®Ðÿ–L+þ{Uñ–ƒ°¶[{M‚?#å Œc˜®oÃGÃÔ®îôÉõEŠë—¶d0sÁ¨ÅW<{“Êû¼uνÉìËÓýæ®{“ojѤnìË"®ÜpÊ23’01ž}«­ñ&«m¬jiql$ˆ‚1vœ‚Oõ®/UžÊÞFKÇØ ,ÑdpFg .v‹’|ˆÍkÂóiö¤„¦U0x@H‡N¸úÕ”ImⳛȀy¾fùH}ÈpÁ·‚­ëíUµkö!§ÛM©Ol?åŠ0E<çƒ=y¨Z۷݆FNwÎ2~¹cý+F×VDSèz‡‚WÍñ¼Õ¸ÿwÖ·ü{àÄñFœ%·u(î\œåOµq¾ Õ‡e7:²Í34e@·Œ6ÂHúqÁ®Þ?ˆ¾~$žæÿM-dþ€ÖJ0”\^ÇE,E\=XÖ¤í$WÐ4½áí½½”÷£íÚƒ…i$?ëØv_ñ®%gæLFCHíÓ¹c[úïŽ4Ë‹ô1]@mâW(·~‚nõ”ÿ´Õ¡6J©£#ûàÖs’¸´GDÔ«Z¬Ÿ4žú•çû5Ü-Ѓ 2‘Áˆtì«[  Ùý– âóf½ÀÉ'¢îìzô§É0™Ì±ùqLÖ|G=‡WNKspÍ.T*‚qÔ`ž=ðzнäã{S©ìfªZöîshÓkžºûeýÑ»RbˆÜ® à€{~•“á? ™®nÄsFNTŽþÄÖ´z¥«¸—VœEsöxŸ¯ûÇ©®–ÚÆÚÚ†ØãQ€3U)rÇ•36ÝI¹Ë©Òè1¤ÖªìF;xúVõ¥”eqm9Aæ—#`áCvÉXj#NŒÆ°É(g¹f Œv<ÖÜ>)'iÿ+ÿÄÖ°’åF3‹¹ÌK¥êË,FÊvòŽ *äê=k©Ó£»Ãû.ÁWòÛj‘Ê®÷§Ÿ±iϧڗü*Ljd¸,?³%_•—þ>TŽF2F9«rBåe:æ 6âCuæÉo*eÛ“ž£¨ük¦µ¼iôñugo0~ù°µqÒ\ápPgéZºwˆlm´£gwÒÍ”HÁ©ãc°ê^üos¢7Fü71¼™wšVÆp0F=p gkúÍÓ¯,–B.ˆQå˜È'zãÒªÇâ{ bÏi¤J¥º¶U3ùf±µ=@jZƒ\ù>I`>]Û¹q\ø|#ö—’i ÉØË ¹$!TŽqƒ\¦¼'ÖnVhÝÄ'×»gùV½í®5dhw$w;–èá~`G¡ãªhÊ Ü85ôP”i>e«g,¢êhôG;¤xhÛŸ´Þ$ÿ§¿_ZèQcÇÊÙzSÊoÎNÜõÅH!,Ã:zñYTœªk"áÇDtö^Í¢Âå7½¿îÚA•8‘ò1êGJ»«@¶:¥…•¤fi]ÎXã1Ç«-NúÝ!d´aú²ñ#ç=Hõ4صaµ9ï‹De+äï1®6N)© qlôuY-#e c ®;ƃmõ Ù‘äìíP'ˆõXPG  ÇÞ%<þU¨ê7Z„Ë-éÝ".ÕÂ…g=¾µ3šjÄZw3.†aO“þ[ÁÓþº¥<¯P?,ÓneB“ÿ=àèéªSÌ»‡CX›†öâÀ–·u9ûÑÊ2¤þƒî*{Ÿê©-¢Y8ÜþñYwA—“ŽÃ©«M¥ØêÉj–÷ ¹ÚêdÆÏø "·¤úÔEtq$3HešN]ÜüÌ}ê;æÔ¾ÆÿÙ7¦Î÷.p3·ž1‘øÓu-û^·[[õ»E\¡TzƬ’sÒ¢zJè¨k ÿ çþ+&ðþµFÐøÿ<ø»v:~ìé]!o@i¾`Ï Ñí$‘9³Ï_1õcü+Ò|+<·š½ºËquqr¶{%’i7pJñÀ'µsbEìk¦ð3¯ü$C‘þ©¹ü¨Sm¤ÁÁ%s¸ŠÎsò³J\ï«öð˜«1a×$äÔÛ—Ô~t×|#A WABm{L‚A]!rqµy5åþ,hLjïóÔÉÓðªúžŸ¯Üx¢G²‹|)+.€wŸ^Ô¾$ˆÏ­\´Ÿ,›†~¸ñŒb¬ÇE¶ÝÎ{•ŽêUL©B0ŒñÚ¡W6šC‡-‘Ü­mI¢-ÂÏy$«ÂvˆŸ?:ŸâÔTðx&öòɯ’kU³‰Ky)éŒg4–ªàÖ¥].Q&\äïSkéŸ^aº„ÿÑ‹O±µòíQWx–-ÁëLñaáÛÀdÿÑ‹\õ¬ÞšÑŽAÁÖ™™W¨æ¥ÞvàÇózÔ~iÁÊšæ:™dfÎÐ? ÛN1š~õÇC“M2¦qŒb¸ÝûŽSN¶Þ6Œšqt#$sëL`ò ÀBNá´sŽžµ(•ÖXå Žxµº’ÙC‘›¦Út „¸ /õ¦K$ "6æÝƒœö#4ÿµ¶ýÂF F2Nx÷Í> 0IùÇ÷Jç5+$F0x%ùÀãÅ© NÍ"ÒYçòøªÄñ^Ù¦ÑȲÆÌ’FC+«`©=$õŽïWÑí5YµùbÒå‚úßWH£’IÈfYH+ƒÂõ#±jµÿ‡4ôƒI”ÛE’jâÂæ;w”¡æ@G#+Ç¥rW:Ž£y%Ö¥y2Fþb 'fÚÝr2x>ô²jºµÀÄÚµü™u“ç¸só/Ýn½GcZsDÏ•>¯¢éRÙj«¦éòCsc«‹$-9o81#<GÓ©4ícÃv6úTfŠ˜õe±-䙓iK–c+Ç5ÇIsw"J¯ypË,žl¡¥oÞ?÷›ž[ÜóRK«ê÷é>«}"¹RÁîÚr½OcÈ£š!ÊηXðþðëðiš|Üé·ÐA5Áo;Ìb»H<C×ÔÕxrÊËA[ÁlÝC©‹9ÒÑåm*I °#_—šå$¼¾—Ïó/n[í lÊÇÍ`r sózO›XÖg &Õo¤V*X=Ãvœ¯SØò)Þ"³6¼W¤Ø[Ù[j<fK+F“,’y¥€ÎÙú0ç§Ê«Wš†£©25ýõÕÑA„óågÀöɪ¹ Òo°-ŽßMÕ$Œª†t‘>ë¡ÁÅjbñŽ>ÙuÿOøÑEs&Φ‘"êw§þ_nïë?ûFûþ.ïëRmŠÈ†ãPÔ|³å_Ü+z™ük]W\†Õn šŠ+éòEó$ýR8ñ:= VZž¶ò ê“•îV5¶ußùü¸ÿ¿§üh¢¼üîË’Iz$¿#L?ÂFuñÿ/·ŸùêßãHu+à?ãöãþþ·øÑEyfã_P¼ò_Í»¸dÁܾa9s×·j|ã: (¬äÙQEdEô§ùA (©¹b2^µÁE®4HœqNóÚŠ()g$S°ØÆqš(¢Ú’Ø»ÆXÒˆÇz(¤Æ)M¸ç4¨ü¿•R@vú“¢ZÜüý?ë£V‰Lsš(®Èìs=Î;Ä:/е-b>úÊÖÚÙ·B†WËå¾\LtÇÖºËo?ì±ý©b[¿¼1+Ÿb@8¢ŠÒ &;²\ri9íÆŠ+.¥ˆ£æçì€Ý?Z( ù{ƒMðzQE7°°G»!P*P Ž QPÛFXrÆ-IÁz(¥pÁÕ&}vÐQW•¥U¸•SRŠôØJ4”µK×ç$*g¿äJ(ªŽè—±GÀº‰´šbêÆöÎRd ²»K““È2qž¼ú×t ÷F(¢ºÌ’Ð}(¢¨BöªÏh¬OÌFh¢¥¤÷Åv²äd©Ç¨ÍnøàF>ƒQY8¤;²„ƒÔ~tä²yßñ¢Š•r®Ç=ÉS†›Ÿùh?*(«P‰<Ì_ìåþÿéN|@rXÑER„{3ö3’¤Ÿ­/Ù!î~´QUÉ»²Àú±ùÒk|«¢Š\«°Æ­³ÌfÛÙ»`RGBFh¢‹!Šc·bëBÅnzDáEY ÁäÛƒþ¬síHRØË/ÒŠ)1¤4µ¨ÿ–?¥4½¯xN~Ÿýz(¤;"½ä˜´—ìVñ5ÖÓ剘ªní’2qôÅx_Dñ^“®Osª^XÞZ]¶éã¾Töd鎘ú (ª[Ö§v­jN|“He³$ çüûÑE$‘V)k+túTÉ£,+zÃlmrÄ"µÀ9#Ò¹_ø_[Òåš-nM>úÚRdšTsÉûÉÈ>™÷¢Ši+Ö§]åÇت€ V Ô88=)T`ýÑϽT¡²Vˆò@ÝõªÄó‚𢊠SƒÀ,ŽÒ`Hr ÅP@ä R¸Õkí I 2>´QS&4ŠwÒ(FÎ<ø?ôrSŒÁŽ1š(©*Ã3É {ŠL@Ú9QC§áqH PÐJ=ûÑEhÇAI£åã=qÅQpaÈçs~tùÎöü袘 %¸Úqô¦°aÎìÑE0¹î£v6Š(¦$Åó=EgxÇü#ׇž‰ÿ£Š)=†·83 g<ѼwQX£qN=JoðòåE"zÁ_º!\¥Pgq “ïÍ*’¬¿çEúˆy˜ïè2;Ôñ]þ^}0ÿëQERad?ÎM»ŠÎ~÷LXå¹i_AE «sp°©9#µWyz(Ï\fŠ)½ `“’j (©Cc6íN¼Sq´æŠ)'Óq†÷¢ŠC•ÎN@¦†b=9¢Š¤„7Í<P[wQEçÿÙdanieljprice-splash-4d1f09c/docs/figs/renderplot_xsec.jpg000066400000000000000000004572531477365367100236740ustar00rootroot00000000000000ÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀV"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô¿x+Lðv‡mmmiÛ<°n.HÝÈçŸOjêwCùÔ9ÿgõ£?ìþ´_UÖm4[AszìªÌg‘ÏEU“\¾©¯Iwªi³$ú•¥”$É5¬p8’fì‡ÊÔnöÅCãé.m¯tkÈ`ó6™<,Œ«´þAÿ:æ.W¾…–Y˜ª W­ƒÂFPU=ËcÎÄâ\dàzÆ›ª[jÖ)yfæH_ A} [Ü}çX¾¹·ŸD·[h¬*!dme#üúÖ¦ÙýkËœydÑß sE1n.Eµ´³È$)`€³` œÉ>±­‡óª¶÷0ÝÛEslé, ’9²®¤d{‚*Lÿ³úÐ¥ö‚O ’[¥ghzþâ=15*çí®ÌÆW•8<ÅñÕÕÏööVž ê´Ÿb€6à0&FÈ€#sƒƒŠåc7Þ»ñ—{ak§Ûêºl·vpÚÜ´±¬‘D@ D䯖ØÇbs@­¸úÎÇÐþuäžþÉÿ„ß@Mxö/ý°É3;ò†ß7'ƒæ`{gVg„²ŸåÒ%x„È¢ûlÌÒ o)÷‰< ù6äc;qÖ€=fÏÄV—ÈZ$¹À¾–ÃýY?½Œ°bvç ò˜àtîkWqô?yM£þËÆF|kz_øù«> }jw/¬˜Æ s¹gqö¹m‚0N|¿/Ç黡üê¡Õm¾ÏmX`p½xÅz.ÙýhmÇÐþuªøŸOÑï౸’]MJ‘ZÚË;Rb#S–}kK?ìþµçž.¹µ¶ø‹¥=Þ¾t8ΗpÈ’Ü|ؾLʬ¼õéž>´èv·BîÖ+„I‘$PÁeFÇÕX±CKñ¦¯c§]Û%ÈPFxwFx®â2ñ<ö®S½Ð.üak&»}æ”ÚZ6™#I¹&›Ìa#&Î ¸Ù¼úU_ ªÉ§ü:…×tOkv¬¬xaåô4ê]Eu Ío*MdŽ@ÊppyàŠ—qô?p -ôÛ? 5½¤6ñßE<±ÞÆ„F¸Pã¨ã¦{WmŸöZ‹SÕ-´6ãQ½vŽÖÝ ’¸¶¨êp9¨Ÿ]°[ƒFköùàkˆâçæHç§çK¨ÙÅ©i—V¦b¹…á÷Xx´Z–£k Aã)mõ æ-)—2…âoÎi¿Jö‹rÏQ•RÕ¦7›‡òÜ!òäòÛæ#{§<€HÈæ´7Cùכç]ÒtÌ’mü1tŽw}çæú““øÖw…ôètÆðÝ µês‹™d•˜Ì>ήªÙì¤ €=+RÖ Òä°K…”›Û¥µ‹g8r¬Ã<ð0¦¯î>‡ó¯ÑäѤO¸a'‰N¬§TbÌel—p—Óæû öf¥¿{]š´’99ÎÛ%Þ|ÿ/ÎXEÏúŸ+¯ðã9æ€=§qô?¡üëÆõØõÔõÓÍH¹“ÄP•$WHÿ ü²+¼ðd†÷IŸZelê×/v›ºˆŽ/ü†ˆ~¤ÐQ¸úΪjz¥¶¦\ê7Ò4V¶Ñ™%p mQÔàrj\ÿ³ú×/ñ ÿÅ·ñËÿ.OßÚ€:+ÍZÖÂ[(®dd{Ù¼ˆ ÜûY±ÇNõô«›¡üëÍõ"ëO×<#,úæ¥~­ª]y;Tùœ‘©ÏnN9¬_ Å,ž-Ž{ýWM´ÖáÔçûDn[»˜Ép±òØhö•+…ÀÚ1Þ€=OHÖ Öôñ{j²ˆŒ²Å‰8;£‘£ný2§ð«û¡üëÆãkì .©(ŠÁµ½LNÍ)E󼑠 Œ.qžØÎx®·áðmõ¥ÓW: Ô[û8†% lMû÷7ïÆ8ë@¾ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´ã—þôH渇Ϳ²…ž Ú'Ø÷Q+ÊC «ÁiŸð‰éÿóõ®àö÷ÿŽÓ|_ÿ [—þbšwú|†·±þÏë@ð‰éÿóõ®àö÷ÿŽÑÿžŸÿ?ZçþoøíncýŸÖŒ³úБüEóô-7Y‚ÂÿSXÄ/›¨O++5ÄŠÛYܲä(t®§þÿC?‹?ðhøšåþ.Ƕ³Æ?Ñ4ïý*–½²´“i+¤›w<ïþÿC?‹?ðhøšËÒ¾Z_j:å¼¾%ñ@K Õ·ˆ®¦rTÛÃ.[Ž»¤aÆ8ê}b¹ÿÈsÅŸöÿH­jyŸr¹WcʥƇâßhjú¼Ö°Ýi,“_Iæíšdóu ®CùqÆ+Ò¿áÓÿçë\ÿÁíïÿ¯?Öäªx›þ¿ôýzæ?ÙýiÏ £ÔÃÿ„OOÿŸ­sÿ·¿üvøDôÿùú×?ð{{ÿÇksìþ´cýŸÖ ³ÏõX$ÓoõM:ÚÿU[i?±¾þ§pî¾mô‘ɵÙË.ä¤t®“þ=?þ~µÏüÞÿñÚÀñ'üŒ—üпýDe®ïìþ´‡ÿžŸÿ?Zçþoøíð‰éÿóõ®àö÷ÿŽÖæ?ÙýhÇû?­sÚ¹Ó¼_«ØÃs}-²ØYÌ©u}-Æ×i.Cdf#!§ ¬oüK‡E¾]/IšÖ[ô“mÓ\$ï¸Û”ŒKŽNõ¹iǵ—þav=ÿé­Ýeøÿ§xÃùÍßþ™Ç@™ø³­(Ë^ømug¶ÔTrL\WwàÿjÕÆ©a©Ãf·š{Å™leg†T–1"2–ç¡«ž+#þýo*1ö ó“ÿLÚ¸ÿ„ö—kþ£5œÐÛÝ[iñÀÒ®Ó'—jˆÌuÏCÞ€=7qô?yÏŠþ-ÁáËóko£ÜÞ¢Èñ5ÃHaŒÈ‡¨vÅIúW gýŸÖ¼Ç:¥½ž£gg2Ê·Vz–¥4ÑÈ!&pѰ'‚9àÐ÷ü/ïú–þ ?û]z‚¼]Œ´&Ô¢µ{b“4/I» < Œ0í_7&¯n±¢”—*)àuFÉïùW´ü“Íð®£0BMRW\ñÁHèÒ÷CùÔ×öב4¶·O1Fh¥ ‘ÜzRH‚Xž6S†N­y/„M¬xWX¼žÆI®­o$aåK²ð0ÛW‘“ӌȩi™/Ä6êÒª gÇB0Êsƒôüºb´7CùÖ6ƒ¨išžœ.t«Èï cóHŸ›9ÂOR8ëžõ§ŸöZ›qô?fê¿ØÂy1›‡Y„rÆó(ØÏ=p3ïW3þÏë\¿ˆ¢-{ÔÅ1¿–^Bß¾;°vöão®Iú¦Þæ;¨x̉ÆUƒu©wCùÕ;9 –p±¶6ùAû£“ÛŠ›?ìþ´Ëx»ÆxjGw‘cűÝä2àÞ OsÖ¹?ø\‘ÏY¿ðT?ù.´¾!hRëéW6ößgK)‹O¼‚7] Q±X’KŒzWž¸տçâ/ü¾ÿäzõßøÂOÈŽ’,H³mŒ‹ þõÁL;ޕּ¢(ÚIÔPY˜·õçt)t°Ž[›{Ÿ´%ìÁ Þ­P©ÞªAA+ÐóþÏë@ÿöö³«|Úµ?vòùÙUýÕ äŠ@þ8·ýäŸØ—ª9ò¢I`oûè»Òšèþ‘§†2ÚÒ¼›#Ý”Ï/QüGË÷nêZדäÚéÑ¥Þ¡t» Œ?ʼŽGD÷È$@é:êjRIm-¼Ö—Ѐe¶˜òèÀôe÷¥jî>‡ó¬'JM69G77³×7OÃHG@ð¨É{{’I—V‚æïF¾¶³“ɺ–ÞHá—y]ŽT…lŽFE2óÄšu޹e£Ë1ûmØvHվ⪳nx)Ôý4¢'…&…ÖHC#£åX„ÔW…ø{AÖt/‹šjkûîå™fo<¹N<— ÜœtÁöíŠõ [Mgá»X§‰Ñ·H듹¤fE9ç!JŽ}(qô?TÔµ84› /nؤ1íîîÄ(< ’Nî@©sþÏë\ŸÄËû7áî©whÞUÄ~IGÀm¤Êƒ#=ùàõ‘È­)Su*F vÒûÆšNòاñwAÓ,–ææÚø”ƱFðÈçË|²F9#9dsV´‰ºf³â(tX´íR‰fš–TŒÃæD»C«p1Ó?xv9¯žu_¶öúÝåí¾Æm÷1ui¬ª2Xàï`p~cÉÁ­ÿ†#Êø£¢B²Å$b7YŠkb[¯ñvnÙ^ÿöD)á¥:ŸMé{mæMZu?tšžçÓ{¡üê‹ê˜¸’mn®<0€BŸNH«ÿgõ¬XÒæ[bÎÏUM*ýî·Çtñ,»*~ã€G¶kçiiOÿ@½Cþù_þ*m©}¢é­Í­Ì2*o>nº^]áø‹Lø™{«j³Ã}„Ÿíí/³ù¿¼BÈÉ'þ©€N1œžþt–ãÄSµ¼ë´42­P ¼{šÑ»Ö,¬^Eº¸X¼¨æRÍÄq¯VcØuÆzà㡪־'Ó.íï'K Ù'›p·1IF„«€v8Ǹ5…¨XÃu¬x–ÏQ}žûL‹a‰K?–¾`p€K)`ØœºñÍb-ž±wÿ &«¶]HI¥Ge¸²0} ƒ#>"lq×ï@ã jž+Òž9Ëp„h¤¶•%ÉRÕÜAUc:)ô5;ëúzJˆn2cs"䢉–è7•Áé:o‘o©Û­¾©¨Ú‡´û›Å– –˜£FÈÎB¶Å\|ØÓM¸µÔì<=­hÆ&âÞhRAPgb‘ÀQ¿ˆIÀ'`@8€=Cqô?¡üêFO®hÏû?­fj~*Óô­I4éÖú[·‡ÏZÚMpBgnãå©ÀÏÖ¬âÞ)ÑdU‘"”`Ï*pAö<Šá5K;»ïŠq¥¦§q§:褙 Hܰóú1Xcè*K].Úÿâv¯-â4íggc$!Øí™¾}£ÃÙ4ÚYÞ¥õª\B²ˆß8#FÜr¬*šø†Áõÿì@ó}¿Êiv˜œ)UÚ FÓëОµ‹ðñ‹xN-–9—’é«Ö~£®éüVÒ`—S²I£Óî`xÚá,$ŒðÄÔö ªoØ[ë¶Ú40½¹ c_)ö)cóãnp:g5¡,é/4Î#Š5,îÏ€ rI=…pž)×t‹/ø^;½NÊ‚K†•e¸E1†„…, ã'žµsÆV6ú–‡â;==Uµ¹´²­1.Ñüû=Îð?ÛÒ¼O§k3˜-^áeò„ȳÂñ"'Óx—8äzQIgâ‹ Býmmòegt[”¶ÀYs¸y»vö#9Æx‡ó®[Æþ Ó™þµÁÝëcd/4íS\ûpÃfêv–'>… ÀLW¤øwZ]{Ãöz˜@†tùÐ*ÃóÁ\ÕÔ­NŸÆìsJqŽç§ïŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñUÊxÄWz½­Ýž¢wÞXº©—LˆÙÚÄzðAúWW¾´Œ”•ÖÃM5tçÿŸïäüUçÿŸïäüUèßLa¾ùñ—þþGÿÅT½õ•Ť¶SùSÆÑ>Ù# 0qó{Ôûèß@ì­ÚÂÆ Hlfòà‰bRÒFN`gæô¦®‰¤Úé¶–7E´b(ËËm£¦Nê½¾ôoŸþ|eÿ¿‘ÿñT›¦Î~Ã.}wÇÿÅRï£}&é¿çÂ__¿ÿFùÆqc/=~xÿøª]ôo Ý6sösë¾?þ*—|ÿóã/ýüÿŠ£}è7Ïœý†\ÿ¿ÿK¾ùñ—þþGÿÅQ¾ôoŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñTo£}!yÎ3c/>xÿøª]óÿÏŒ¿÷ò?þ*ôo ß8$ý†^züñÿñT»çÿŸïäüUèß@ùÿçÆ_ûùÿFùÿçÆ_ûùÿFú7оùñ—þþGÿÅQ¾ùñ—þþGÿÅQ¾ô›çÅŒ¼õùãÿâ¨Ý6sösë¾?þ*—}èß?üøËÿ#ÿâ¨ß?üøËÿ#ÿâ¨ßFú7Ïÿ>2ÿßÈÿøª7Ïÿ>2ÿßÈÿøª7Ѿ€ óÿÏŒ¿÷ò?þ*“tÙÏØeÏ®øÿøª]ôo  7šp¾¿Óï&²¸ól$iaÛ,`e‘çæç†5t<à`XÊûñÿñT»èß@ùÿçÆ_ûùÿFùÿçÆ_ûùÿFú7оùñ—þþGÿÅQ¾ùñ—þþGÿÅV~¥{qkóE²G>k¤ ÈÏ`x4¶w_ÚwvwÆd»ÿT¨£w¾xãèþùÿçÆ_ûùÿFùÿçÆ_ûùÿPÚÌò[#HFþAÇN+›ÓüuÝظÓn--oeš{§‘ 3Å¿p`W„b2;PU¾ùñ—þþGÿÅQ¾ùñ—þþGÿÅW?¦ø–óVK{»=á´Û†]Ë̈̄ÿ¬ØNvãŸR;UdñºGÉ—L¹ŽÐê-¦­ß˜…|àH\â€:óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*²tïÚ_xe5é3mhaiŸÌ<¢®rN>†³áñ‹bÂâ÷I¹³°Ô$Híîd‘Ìÿszƒ”ÝÛ® â€:móÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*¹†ñ^¤5¥Â99º0€>×6 œçÔŽ+bûXO½Ómæñ1da#8ê­_ß?üøËÿ#ÿâ¨ß?üøËÿ#ÿâ«›´ñ½õ­äÐC)kmLi¢3€drÊ¡‡û8mÙôµ"×,þÌÓ]\[Ú¨–XÇ™p„,NAÇE$Ž£¾0hC|ÿóã/ýüÿŠ£|ÿóã/ýüÿŠªrkZd6 .£h–O— :ˆÛ=0ÙÁª:oŠ,¯4«JæX,í`»žÛÍ’q°ˆäd ¸à ØÎ=úšÚß?üøËÿ#ÿâ¨ß?üøËÿ#ÿ⪼:••ȈÁw¾r"òå ½A²àò#‘ê)aÔlî†î pZ’$©\uü(}óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*²ux鵌óGwp–þr:°2 Ü~µ­¾€ óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*ôo |ÿóã/ýüÿŠ£|ÿóã/ýüÿŠ£}èß?üøËÿ#ÿâ¨ß?üøËÿ#ÿâ¨ßFú7Ïÿ>2ÿßÈÿøª7Ïÿ>2ÿßÈÿøª7Ѿ€ óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*ôo |ÿóã/ýüÿŠ£|ÿóã/ýüÿŠ£}èß?üøËÿ#ÿâ¨ß?üøËÿ#ÿâ¨ßFú7Ïÿ>2ÿßÈÿøª7Ïÿ>2ÿßÈÿøª7Ѿ€ óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*âô›®Ø^êÚ_Ù­âky–x.#–@’(h¥I*$RA)Ž£­Uò¼iÿ?šWþ Ïÿ%ÖæñFñ@~W?çóJÿÁYÿäº<¯Ïæ•ÿ‚³ÿÉu¹¼Q¼P­xG]×"º{Ù­%¸”[Ûf !•¤Ã!‹n,AäqYð®õ?úøKÿqÿñúô­ââ´F•ˆtÓw<×þÞ§ÿ@ àŽ?þ?Pé¿ üC£[µ¾—uŒ åÚ;YîâRØ$-èÀ>½Cx£x¡Õ¾é ÙÛ©çv_õ¸n/nç»W¼¸’ÒU™•¥Ã[Ëæ)2á™ó€¿|`Šê<¯Ïæ•ÿ‚³ÿÉu¹¼Q¼TÊW-+~W?çóJÿÁYÿäº<¯Ïæ•ÿ‚³ÿÉu¹¼Q¾¤g)sá½zùïnnî­Íìßbòž+0‘ÇöiÚa¹ Á-¸± ¼Uÿ+ÆŸóù¥à¬ÿò]noo  ?+ÆŸóù¥à¬ÿò]W?çóJÿÁYÿäºÜßFúÆÒ´íbßW½Ôµ3Ô×0Cn«mÀ¨±´­“ºg$“)î: ©©øÃÚÆ¡%ý÷†Ì—RãÌ‘g\Ž2vÈ2}ë¤ßFúãÿáYxO<ø]Øz5Ù þZëcCE"FŠU^0€ Ôýôo |ÿóã/ýüÿŠªWÚ]¦¨Tê7e>ïÚ6ý2N*îú7Ð7ü"Úý :þ[ÿiÚÛ­ºÛÚi?g…~ìqyH£èb¦ßFú7Ïÿ>2ÿßÈÿøªÌÖôK/Ù]WEk˜†Jît܇ÕHlƒô­=ôo  }J°ðͧön™¥Koc!Ô—'©Ü[ž0+\K1ée/ý÷ÿQÞH ¤„Œ”רŠ[y÷ÊЛî?çÆ_ûùÿL‘$›g™§HÛ:åãဠ½îjâœá¥ÿ¾h®ûùñ—þþGÿÅQ¾ãþ|eÿ¿‘ÿñUkþù£þù  «=.®Vâ]6s"íé:…m§rîPølHÈ8<Š·ºãþ|fÿ¿‘ÿñUkþù£þù  «}=-nZâ-6q#në:•]ÇsmRø\ À<š·¾ãþ|eÿ¿‘ÿñUkþù£þù  »î?çÆ_ûùÿTtÝ&ÛHó¾Á£¼sn|H‡§E~dáFÉÀ­û泤ÖìD·Gq—6ˆYá2*ž™êN>§ ï@ï¸ÿŸïäüUî?çÆ_ûùÿK&¡g 5Ý´Nv¯*ƒ“ÐuïÍDú½ŠjX}¦¶$bO$¸‚ ïߟaÍË$rI¦3¼LZ6fŒ”$H;¸8$} ©7ÜÏŒ¿÷ò?þ*›ý§f–ñKqsmøÕðó/ºsœ¨àÕ°A‚¤„Pm÷óã/ýüÿŠ£}ÇüøËÿ#ÿâª×ýóGýó@wÜÏŒ¿÷ò?þ*÷óã/ýüÿŠ¥þѱß¶Zâ1¹Ïš¿(Î2yàdGö·IþÙkä¸%$óWk×88Á ßqÿ>2ÿßÈÿøª†[q;n—IóËùDÿèT³ê±#éþG•ú-J ÈF#•wÃ{zM÷óã/ýüÿŠ£}ÇüøËÿ#ÿâª×ýóGýó@wÜÏŒ¿÷ò?þ*÷óã/ýüÿŠ«_÷Í÷ÍTeÎ,%98xúÿßT0bÂÂ@Ç©ß?øõ[ÿ¾hÿ¾h®ûùñ—þþGÿÅQ¾ãþ|eÿ¿‘ÿñUkþù£þù  »î?çÆ_ûùÿI™¿çÂ^¹ûñõÿ¾ªßýóGýó@wÜÏŒ¿÷ò?þ*÷óã/ýüÿŠ«_÷Í÷ÍT 8éa(ïÃÇÿÅRï¸ÿŸïäüUZÿ¾hÿ¾h®ûùñ—þþGÿÅQ¾ãþ|eÿ¿‘ÿñUkþù£þù  …§=l%=ùxÿøªŠâæKxŒ²i÷,«Î# !ü’kCþù£§÷h‰|4d1ù·AÆr­làŒzäqÒ/įAÉ$Óª°È>Kr?È®câ–”k–WV‰o¨#,ä¡^O¹Üqw:X1Çn K.C3óµ9ç>ÝzVnvv)FçwðçQŽò÷Y•7)+àNpy[ž*Ñ[Xw0¢ÉqfìDdãz67O~ü+–øI¥\Üj~$†;˜âòM¸ËE¿p>f:0ÇJõøG¯è#þŸþ.©®ei”Ý9)áÃ\Ø›«?³Ûéw~yİÑO»1ôÍtz‚hš-¶œŽÉS¹€À,If?™5­ÿõïý¡ÿÀSÿÅÑÿõïý`ÿÀSÿÅÔ”a±½|]Jé)lŒ KTÓ5+—{if¶¸•¦ df9`Ê9ë“‘ëKyk§¨Û•½ÿõïý¡ÿÀSÿÅÑÿõïý¡ÿÀSÿÅ×'öumízÞÿ2>³RÖ¿‘—¬Ù®¯¤ÏbÌÌ«He'ñ©Ùy6ö^MΙv'G‘Iö`1]ü#׿ôƒÿOÿGü#׿ô‡ÿOÿ[b0°¯g.‡,©©n`hZiÓæ¼»‘rݲþìv"çh$wäŸÆ¶|ïz›þëßúÁÿ€§ÿ‹£þëßúÁÿ€§ÿ‹­©ÁSŠŒvE$’²!ó½èó½êoøG¯è#þŸþ.øG¯è#þŸþ.¬d>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ>w½w½Mÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐXõH,.æ’VBÆ "3¸îéÏjÁÓ%Â^'Œ$Ö÷:f¢˜mˆo²ÊNOLá­tç×m×P€ýmOÿIÿÕ×üÿÛÿà!ÿâ襤êÖÊUR[ƒÉ®OÃþ‚- J9† ßjEó. ‹ÊïÊ.âªJ°ÉóÍw÷€`j0ÿ^§ÿ‹¥ÿ„z÷þ‚0à)ÿâ膱¸ñ-ž‘¤hÑé’Å=œ¶ðÏwÂÐIn„#-¸eGM¹ñëSh^Š-F÷PÔ¡•§œ÷6¨÷£PÄíFÐØ'’2=«³ÿ„z÷þ‚0à)ÿâèÿ„z÷þ‚0à)ÿâèÏô» JãÀ­áKí"òÍä´–»i h”¶ì–BÄr?†¬]¦³¯iz~u¤Éhcš .îžHÌx‰ÕÏ•µ‹Å@œúWqÿõïý`ÿÀSÿÅÑÿõïý`ÿÀSÿÅÐ<Ö·'Ç1ê^_ú ÓZ&á÷̪ØÇ^€óŒS|_k{ ±Ó#Y5Y¢ºµF`¡¤G ŒœFGã]ü#׿ôƒÿOÿGü#׿ôƒÿOÿ@{¥xZûNñNœØVÓ!³†Yœ°Ë]ÆN§+&ìãQRÚx~ìÝéòÉ}Zþê@ì¬diLmŒóË)õñŠïá½ÿ Œø øº?á½ÿ Œø øºóÈtOMŸN¼cÝGg©j}’)#$Ò1ŽEÜÁx¦AÍ6×FÕ--ôÛ¹4°ÿcÕï.ßOŠT9IL› !I]à€qÁ=è¿ð^ÿÐFü?ü]ð^ÿÐFü?ü]y¤ÞÖÿ³ÕºÛ^ϨÜ:Ûù‹þop›qBÉ€O#5¯á ëHÖ®ÖX–=6È<:Xîå2N:ŒŠ3ýßJí?á½ÿ Œø øº?á½ÿ Œø øºå|ZoZeÍç“} Ì‘(UFÉ;¯'·oq]wãVed$Q±•ö8$~F¬Â={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ;{ÿA?ðÿñtïGïSÂ;yÿA?ðÿñtÂ;yÿA?ðÿñtïGïSÂ;yÿA?ðÿñtÂ;yÿA?ðÿñtïGïSÂ;yÿA?ðÿñtÂ;yÿA?ðÿñtïGïSÂ;yÿA?ðÿñtÂ;yÿA?ðÿñtïGïSÂ;yÿA?ðÿñtÂ;yÿA?ðÿñtïGïSÂ;yÿA?ðÿñtÂ;yÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtïGïSÂ={ÿA?ðÿñtÂ={ÿA?ðÿñtRêlYÏÏü³oåPé³ïQÊÓ|G¦Þé>Õµ/¶Á/Ù,¦ŸËû9]û¶3¼ã8ë^kñÊþÔ4KfǬÍþôœG+ü4ÿûæ¾zOÚ'RAøGíý·oð§ÃEê_ô/Yÿßöÿ úþù£þù¯Ÿ?á¢õ/ú¬ÿïû…ðÑz—ý Ö÷ý¿Â€>ƒÿ¾hÿ¾kçÏøh½Kþ…ë?ûþßáGü4^¥ÿBõŸýÿoð  ÿïš?ïšùóþ/Rÿ¡zÏþÿ·øQÿ ©нgÿÛü(è?ûæ¹½KN¼‘¼AV¾`¿µÄ2P7Êí9 ‚N9éï^Aÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþë—Ú$÷Û¯öXÞ[‹†Ý‰\– ù'ŽJõÇéVe²»]ZyE¿˜—zÁæ_‘×yç'<î#5ã_ðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@¹k¢O¾¸µŒzB[ÅNÙ9ÊõýzVΛm4Z ¬äÇ2[$nU*Á@<ò3šð¯øh½Kþ…ë?ûþßáGü4^¥ÿBõŸýÿoð rþËú ÞÿßkÿÄÕ»h ¼[ ï1ÎwJA? à_ðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@¿Ðøe­f²ÎÓ´¬-™óK+N )äöǵW¹ûjÉ BÔ\ܬó„ À#m'»±‚pqž•åðÑz—ý Ö÷ý¿ÂšhA™XørȲýÒfl§ëöšMêÝbS–é¡ ¿¹‘À’:g–¨ì-µí›[»ÛGÂÃ4RÑаØçoËüY9=y7ü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPªÿejhwšrÛH-1 ÛCrñ™Ë.å$ dç­mXؽ®·¨L°¤vÒÅÇ·»ÁàtêµâðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@í=ƒÍ3H/îbø#e >™¶ö ÂC}s(Á#)ò¼#þ/Rÿ¡zÏþÿ·øQÿ ©нgÿÛü(Ü5›k›ä¶²‰ÛM(û[î’¾§qxìMG«é^ºÏÛDðÄëA®HÆyèqÆ{}MxŸü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øP®\hڅ΃¥éÁÄW0Ư2@ÁqµBžIÎßLßjKT“D³‚ëB24ch‚OÝ1ņìsžy¯ÿ†‹Ô¿è^³ÿ¿íþÃEê_ô/Yÿßöÿ õé"ÖàÐôÛ# ·22í¼– PHª@]—$ô-ìO\ݱUKQm~ʪ¡V·(Aò’?#^ ÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó_>ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×ÏŸðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPÐ÷Í÷Í|ùÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó_>ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×ÏŸðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPÐ÷Í÷Í|ùÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó^Sð÷â½÷ŽµË½>k;2+k7»{‡f¬ŠAÉ\›9Ïjï¶lèjÐñßþ;@OÅöýæ‹@..Óý_5Å[IËn p`ÛÉÈêN: ê¾/$å¼;7Ú`¹ŽEã’Þ=£º9ÉfŠäbY^0¸"¨ G¨×-WiGTw?Ê=÷‰^<…"×å'8?½¯a¯øTÏâB øöàÛZöZ鋺¹ [@¢Š)ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM_WÛþ;ÿ’yâ_û]覯ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¤‰ldøszñØF·jvŠ÷lÛÃÇtJ¯eL"p2I’FвxŽk{hü/£Úÿf1ÓÌÈaùÒîáVF“‚dÂ.Xc‘ÀPŒ¸|K¯[igKƒ[Ô¢ÓÊ2Dºuˆ«gpØ0rr1ÎMIuâmcWò ×5}WR±IVF‚kçlヴ¾à­‚@lg¡é@x–s¥êpÅT²/ jRE’H\€0f‰Ÿh.ý aFzh:jÙ$³é÷w×wZ¡¨ C¯‘j¨—.øÌlX‡ˆû× éÆGÍÇꚔڵû]̱¡(‘¤q‚8Ñ" ’pªª¹$“Œ’NMêÚ•µ‘²ƒP»ŠÐ»9&eB̆6;AÆJ¤÷Ž”ÐI¥iSÍáhd–KH51·K+Æ«æiâWw¿ºóY‹neL€NÕ¬}sM‡I¸¶² !¼Ku7ÊÄb9˜–Ø8RŠÁ¹+Ž€U9¯ï.,í¬æ»žK[]ßg…ä%"ÜrÛTð¹<œu¨çžk«‰n.%’iåròI#gbrI'’Iç4è–±i’øCI°0À×w%íÛDtØG˜ÑÉtD†ì9YD@„«lU$+1oZÛºÇö?öGö­÷ögüù}¡üŸ½»îgoÞç§^k>€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=7àš,šç‰Q¤X•¼;t œ(Ý'œ`M{Gú~¡ÿL¢ÿÆ¿û,¯Óþ˜ãþš ñÏ€’ìñÕìFÞ9ÖãL’ŽOºTÉsÁÈã¥} ý‹¦¬¡Ã:8ÏB Cÿ²Pš|N”Â?àyÒEnᜠÙ$œrMp¦H‰Ak3‹Sï^—ñvÞÃö³}žÎÖa…UÄcô¼Üÿ ÈìÞG*¾J…ç;—׎+–¯Äk¡èÿvý¿Åvõ¶û½?å­{xìörÞ$ÿ·oý«^Ý]؉nQEQ!EPEPEPEPEPEPŸümÿ’C®ÿÛ¿þ”G_ W×ÿäë¿öïÿ¥×ÈRâŠ)ÁE´Âb—RâØ1F¥.)@¥rÔDÀô¥ 1ȧKŠW)DM£ÐQ´z pà)\Ñ@fÅþèü©Q 8=)àS‚ÔÜÑSCkýÑùS„kýÑùTiÁi9*K±‰1÷ò¥XP ©À늓ðµ.F±¢»Sû‹ù p‚?ùæ¿©BÓ‚Ô¹3xÑb!óÍ!J–Ѫ€QIÚ9©‚Ó‚Ôó3UB=ˆE¼_óÉ?ï‘Köx¿ç’ß"§ N SÎÍV=ˆ>ÍüòOûäP–±**˜Ñˆ$¨æ¬§¥Îûš,4/~R¿Ù¡ÿž1ÿß"—ì°ÿÏÿ¾EX K¶§÷4Xh)_ì°ÿÏÿï‘MK8ULhÄ Ú9«{M.Ú9ßr¾« ß”­öXçŒ÷È£ì°ÿÏÿï‘VvѶ—;îWÕ¡ü«î+}–ùãýò*8-¡kh‰‰ ( %G¥^ÛFÚ|ì_U…ïdUû,?óÆ?ûäQöXçŒ÷È«;hÛK÷Õ¡ü¨«öXçŒ÷Ȧ¥œJЦ4b•ÕÍ´›ió¾ä¼,/~TUû,?óÅ?ï‘IöhçŒ÷È«[hÛG;îKÃCùJŸf‡þx§ýò)«k¢© íÕ½´…j¹ßr¿)WìñÏ$ÿ¾E7ìñÏ$ÿ¾EZ+M+O™¼<{¼_óÍ?ï‘Lè¨E$ gš´V­R›1–;ت`þy¯ä)¾LÜ_Ê­¦ªRfR£Åsq*`…B´¸«%i¤U)ÊŠìW1/÷GåHc_îʧ+M+MHÆT—b ‹ýÑùSÑÀéS•¤ÅRfNš"Ø=&Ñè*B´ÜU\ÍÀaQéMÚ=*B)1Næn#0=)1O"›Nä8Å&)äSH¦KBQKIA6 JZ(„¯ý™æiÿ·Oý­^^ÿû2ÿÌÓÿnŸûZ˜Žÿ\ðïöÿÄ;ÿÜhrùUŸü…t¯¶ãt·_s÷‰·§=sÇLs¿ÿ7ƒÿèSÐÿð_ÿIÇÄ=cþÁVú6î·7Ÿj‡+2”nŒOøA¼ÿBž‡ÿ‚øøš?áðý zþ áÿâkoyö£yö¥Ì>SÏ|Iàû=6æËP°Ó|9ik«§lX4aÊæê8œ8$Ÿàèqï^“\׋ØÔÔWNÿÒØk¥«‹¹-X(¢Šb (¢€ (¢€ (¢€ ÇñCj) ÊÚ\³Åp%„¼–ñ¬’$>jyÅ•ƒ0~Ö$ð8±Ep~ñ6˜|bt ;Y»š!ní%–­æ%ÄüŒ‹ži!™Ûq}¡W÷•^úÂÏS³’ÎþÒ »Y1¾ã#`‚2§ƒ‚ü*H †ÖÞ+{x£†$qÆ¡U à8ÅIEPEP?ã¿ù'ž%ÿ°U×þŠjø‚¾ßñßü“ÏÿØ*ëÿE5|A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@“ðJv¶ñµÌÊ»™l…õ>duïð¾³,†qzvù`¯ÓÖ¾~ø(3ãK‘ÿNÿ£#¯§ôØÆ8 /ø¯s=ԚɤѥÀ`:˜±­yÜ¢Ét—¹”ʲáP[מvõ¯IøÏû©ôXÔczÜ|ñ]xô‡ÌÃq±@Í8Þf‘vW=—öÈ›ÄÙÎsmœúë^×^'û?g‰ è~Íü‹^Ù[Çbe¸QED…Q@Q@Q@Q@Q@Q@ñ·þI»ÿnÿúQ|ƒ__|mÿ’C®ÿÛ¿þ”G_ Ð4QKH«(K@Ò \P8 ›–¢  Râ—®h¢¥—à)\ÕD@)ÀR…§©lÖ0-8-8 p-›Æ@§§§…¨lÞ4Æ…§§O RÙ¼iŒžœž¡³xÓœžœ¥³xÓœžœÚ¦æÑ¦F¶¤ J¥ÈÕS# K¶¥ JÛô¥ÌZ¦E¶—mLžß¥/—þqK˜¥Lƒmj,ÿ‘J"9è*\Ãöhƒe*Ç’È£É?äQÎ>DWÛI¶¬ù'ßò¤ò¡ü¨æ³E}´›jÇ—þqHc tý)ó³+í£oµM·Ûô¤)O˜—Lƒm!Zœ­4­>c7L€­!Z˜¯µ!Z«™:di…jÁZiZ¤ÌeL®VšENV˜V©3 S!"˜V§+M+V™„©•ÊÓH©ÊÓJÕ&a*d%i„TÄSHªLÂP!"šELWŠai˜ÊDSO)€mɃT™„ãeq1M"œW=\Rmõ®i™43ð ÒõÆ4c­Q†)zž¹¤ëÞ™"bŠZ(„¯ý™æiÿ·Oý­^^ÿû2ÿÌÓÿnŸûZ‚YéWÚÕ‡Ä=KìÚ=J²ÝöW…|¼KuŒù²'\öÏCœqž£qõ¬,ãâ­ÿ`«ýwZÙ¢¹êJÒ7„o}ÇÖÇÖ ÈõdzŠŽrùNoźÑ¶_Ù¿gþÕÓ¿Ó·ÃäÿÇÜ'§™æuù~ç_nk¸®CÅDeÚsÿ1];ÿK!®¾º);Ä¢³ (¢´3 (¢€ (¢€ +Åž%‡Âº úŒ–ò]J©!†ÝS+$o) FìIì§œ)Ü Š( Š( Š( Š( ÇòO;ÿ’yâ_û]è¦¯Ž—B7'HŽÚ@¯yg%ÔÏ)ù"Xä˜;p3´$[ˆ“ƒ€I€uÝ9nCáM‘‘TDe»Ú¤–Ÿ99ä‘òŒÎXu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“¯aàËYmµI¯5Ûa‡OKË; '1L¦åaf D\(mèAUmÛHrk  É5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚ wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s“U°Ól|;¡ËWgP¿·k©ei×Ê 'š-‹Ìç÷jw=O˜t°u›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“$šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆAÔÓ< ywàKÄRÛß2¥¡¸³[–•'HäiB|ØFcµBïäà0­ÄMq’@7̹ä €q߆€6»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9ÌgY°6s@<3¥ $ß¶q%Öø÷FÑçmùrÈ?tgqÉ'‰ôû=3ZX ÖÖKK[”Yä:ù°G)RÁT#8+€7$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ25Ý8\<§Âz1FEQ–ójNX~ÿ99ä‘òŒÎpè  ƒ¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸ä™$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ2u烯ü)/Úo>Ãoov!‘cy69 "àð´¼§?ºcÀ(ÌLkºp¸yO„ôbŒŠ¢#-æÕ œ°ýþrrÉ#åœÆu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“¹¦Ãaqm-›Hö¶ëujÒX)%Y%$Y#݅ݳp0«ø^æo pÝÚGvHãrà»($®ð¾R¾ˆ\€0§rn$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ25Ý8\<§Âz1FEQ–ójNX~ÿ99ä‘òŒÎzK…z¦¹¢Ûkö[;ÝB+‡L†'|þíY¢Úìv¸ ôX)ð÷ÖñZ^I7°^ƸÄðùðU¸éÈ=9  ¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸ä™$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ2 ˆ|©\x~bí9mÞãÉÂEU2ðr»rVÚáÆHˆ8fEjz—†ï4¿í>Hû+P]>}ŒN雂¹+û–äàò8ë€ »§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9ÌgY°6s@<3¥ $ß¶q%Öø÷FÑçmùrÈ?tgqÉ;‡Áúa×YÁ‘´åNà@‰5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚ wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s™5ÿÞx{íbk˦²»ûÚÚJ_Èï( *Ü#sò’Wi¾Z±¨xN( ÿÈësÿ^ÿ£#¯¨ôßõb€<ÏãJ†ŸD%K`\d/»è~¸¯-ÖtÈÚÒ'…·˜d $Aqœó’GOJõ¯‹ž[ßè´J· ®>èÿWÃ{^Õæ‘ý"{ÛD¶™Òæ/.Bÿ/?Å´œÅrÔøÍaª;¯€[<Ïùg+þÛóÖ½¦¼WàüG·þ¿ö­{UtCáDOp¢Š*‰ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<ÿãoü’wþÝÿô¢:ù ¾¾øÙÿ$‡\ÿ·ý(޾A ¨…; Z’Ò P(ŠFŠ"KŠP)ÀRlÑD@)ÀRN¥³hÄ@)Ái@§RÙ´` Zp¡sOU¨lÞ0žœœ¥³¢4Ä N N O PÙÑcBÓÂÓ‚ÓÂÔ6tF˜À´ð´à´àµ-›Æ˜Ð´à´ð¾ÔõŒžÕFñ¦Fž¥XIíS,'Ž*ÍTR+ˆþ´õ„úÊ­,ô*Uƒ=«7P­ k~*‘`Njà€“Ò¤cµfêDAØO[P*¾°`go4¾Iô¨u@  ±¥ò~µ|@Ojp·õ>Ô ÿ úÊ úÊ´¼Ÿj<Ÿj^Ô.fy>Çò£Éö5¥öqýÚi·#µ?ji·¦˜=Aü«KÉ>”† Ž•J¨†ÜvTf ñÏåZ~Iô¦49ÅRªY‡ê? aˆ÷ÏåZoÅDи­@3Š{SJÕæƒÅDПJÑMâ™P­0­YhÈê*2¾Õ¢‘œ©¦•©ÊÓ Õ&a*di…jÁZaZ´ÎyS +L+S•¦«Lç•2´Òµ9ZaZ¤ÎyS Å4­LV˜V­3 @ˆ­0Š˜ŠiZ¤Îy@„Ši)Zii˜Ê$dRbžE4Ši™8ŒÅ&)ø¦‘TdÐÒ)¤Sé)™´6½ûöfÿ™§þÝ?öµx ïß³7_ÿÛ§þÖ¦CG¢jºÞ“£|CÔµ5;+7J²òþÓ:Ç¿ÝgˆÎ2?1Zú~«§jÐ4úmýµä*ÛKiVE €q•$gqïU&8ø‡ªØ*ÇÿFÝÖŽñï\5ä”Ú:èŸ"]ÃÖ ¼¿³Ó­^êúêñ¾iä‹“’x?vñïFñïXóšrœ®·âŸj6ö–:î™us&«§ì† ¸ÝÛp“€OŸÂ½"¸Ÿ°:u˜ÿ¨®ÿ¥×m]Øvœt9+«KS—ñ¦‰>¡£Ý\ißÚ­©ùBާ-¾Ì¶ ©2-†Æí¡Ibâëv–Z]•Ü>dº8C×rHìöÛp¹”?Ï€C+³ÈFXc{!y§øûR{;_´ŽÒT@-otï8BÃ9(É$g Á!·r8 Qaá¨m¬4ë{«‰.«µÄ£c¸ºgóvNyó º®v©l•B»˜—4ÍOûW͸·‡þ%ü {’ßñó×sªãý_M­Ÿ›’ݬøþþÔKŸ[êúŸö…Ä:®U‹ÊDF¶Â"nmª»ÈêsÉ$’MnYé°Ø\]InÒ$wæ5¾G–²KºŒd',3‚Fìnf-¦}‚ûV¹ó¼Ïí µ¹Û·^!Š-¹Ï?곞>ö;d€rwwÒø*ëÇj7pÝ )u [u|Àm™"†Hˆ+’¡ °ù÷ \Ò_xOÃzä——þÒ®î¤Æù§²ŽGlXŒœáYwÔ¤Òî´(5kH´”–X³O2gtqÈ%¡COݪa±ÏY@ˆþi:¦‡um§[}†èióÙÙ­½Ì¶ÐGædcˆ…*_¾S» à ê,l¢Óìãµ…çxÓ83Îó9É'—rXõîxéÒ¬Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)«ãx¿s]+Ë‹~à5kRça íO3st8À;¸# Œ€XÖe²»ðׇž Fº´´{YìöH$Bn'6Jl+µ×£g'§ZçërO ê1<(×:12¾ÅÛ­Y°io˜‰p£ y8Àê@ ðž¢×¹Ñ·¢+’u«0¸b@Ãy¸'å9äqœdd>ËRšÆ×Q·‰c)n-å,B‰c—+Ï]Ѩç<õàf¸Š'š8Ü+K b¨ ûÇh'¯Ÿ@kPøjüYÍtn4¯.-û€Õ­K„ƒµ<ÍÍÐãîàŒ‚3$žÔbxQ®tbe}‹·Z³`Òß1áFòp3Ô€@ÜÚ]kªÖWQÝÁ•¿Ÿº«´VÑFÄ ØÜ‡¨‡[ƒÂz‹\<çFÞˆ®IÖ¬ÂበæàŸ”䑯q‘˜Ï†¯Åœ×FãJòâ߸ ZÔ¹ØH;SÌÜÝ0îÈ# ôVäžÔbxQ®tbe}‹·Z³`Òß1áFòp3Ô€Aá=E®s£oDW$ëVapĆópOÊrÈã8ÈÈu¿ŒoüP­eöXnnÖi& &#>mÄ™8,vƒw&p ®2AÎyðÕø³šèÜi^\[÷«Z—; jy››¡ÆÝÁfI<'¨Äð£\èÄÊûnµfÀ¥¾b%ÂŒ)äàg©€W×5(oî-¢³YÂÊÝmmV@³9äà¼$›rÛwí…%¯ˆÏGžÂ=>ÄÉ,M»(ÂO(¶â¤¿<†tfS´‚ &Ù„õ¸xν\“­Y…ÃÍÁ?)È#Œã#1Ÿ _‹9®Æ•åÅ¿pµ©s°v§™¹º`ÜF@,]xºòãQƒS†ÎÆÓSKµ¾–ö‹I=À;„½™Wæ$•@¨IåNÕÆ^¥~º…ÂÉ¥”H U`ª2IÉbÎÄ’NY‰èhIá=F'…çF&WØ»u«6í-ó.aO'8HÔZáà:6ôErNµf Ho7ü§ Ž3ŒŒ€X´ñ®¥g£G¥Ç¡-ÚÜ3#nÚËt¤ýìg²öþô9Vñuæ±§\ÙÍgcÚîÒúêhb"IîH ŒÅÞóX•@GÊ«–Ísá«ñg5ѸҼ¸·îVµ.vÔó77CŒ»‚2Ì’xOQ‰áF¹Ñ‰•ö.ÝjÍ€;K|ÄK…SÉÀÎR’oOqâSV—N±eÕw}¶Ë÷¢rë!ç~õýâ+ðã‘»òÕ1®Mý—ªXIkhé¨\ErÎ#1˜d~ j…QA¸ÚTŒÀ«Âz‹\<çFÞˆ®IÖ¬ÂበæàŸ”䑯q‘˜Ï†¯Åœ×FãJòâ߸ ZÔ¹ØH;SÌÜÝ0îÈ# .ñdZö£ªgéÐXØÞêzûw™./崛°? µr烅Äw0–óTÕnîô6x5K…»¸²o9bóÆìH¥dï$ãvßœñÂ⼞ÔbxQ®tbe}‹·Z³`Òß1áFòp3Ô€Aá=E®s£oDW$ëVapĆópOÊrÈã8ÈÈ7Н®íïc¾†Òò[«‰®„óE–†Y€:„ËQó)Û´Úy¬:Ø>¿s]+Ë‹~à5kRça íO3st8À;¸# ŒÉ'„õžk™_bí֬ش·ÌD¸Q…<œ àu  :+pxOQk‡€\èÛÑÉ:Õ˜\1 a¼Üòœ€r8Î23ðÕø³šèÜi^\[÷«Z—; jy››¡ÆÝÁdŠÜ“ÂzŒO 5ÎŒL¯±vëVlÚ[æ"\(žNp:<'¨µÃÀ.tmèŠäjÌ.0Þn ùN@9gⶆ¯Åœ×FãJòâ߸ ZÔ¹ØH;SÌÜÝ0îÈ#2Iá=F'…çF&WØ»u«6í-ó.aO'8HŠÜÔZáà:6ôErNµf Ho7ü§ Ž3ŒŒÆ|5~,æº7W—ýÀjÖ¥ÎÂAÚžfæèq€wpFAÇ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠòï¬ë¨x{Ëݸ‹m¸Ï–:ö®CIÖUI¶Þ+˜âEÝÃ)‰a x&µ¸–Þâ)!ž')$r)VFy1Q×Aâ¯ù‚yÿòþʃíø÷‘Óøöû?OÇæÝ]$vÖPø3Hšê×FŽÊ}í®&f‹írÜ nVßj“æàH"‘@#!ÉE€pa¸þÎûy¦_%]˜ ÏŒ òØÎ3·rç—5ë¸o±ÿohw‘ý›ýˆ?³¾Ñ/íTŸw~ÝæçÌù1×÷x­‹¹,~Ãjö÷^úÚCö©¾Ílm‘×~wɳËi}˜|ŠÎÀf=êI _V.¬n,¼ƒqÕž%š& ]pG>Œ¬§=SÄ«á«(µû;}/MÄw‚NÍuo C8žaH¼¦¸ (ƒ&Xû6˜kƒÿšyþ“ÿA_ôûõþ•ÓþÜþ÷üøèŸ«¶7¾y·rÁM+ ¨ƒ¹'’BVeQ’@=…¶ÿgjcþÊþÙóaò´þÏåýŸy¸ûGî÷nò?ÛÆqÆê±®ÿgÂ=©ÿÂ=ÿ ÏøH%ó>÷ú‡ì_æû¿k÷þÿðÐ']\Eoo“O+„Ž8Ô³;€’O¨ëØ5;­3Ã>7VúŒv^%ŒÙ¥ŠC1ŠÌ<¿h2*n`ßêˆ|Èr# ÏèÈ#×/¾Þþ–úh£ÜakKaÈÊ,‹öI03"2¹Ü :þ÷?Øn?³¾Þ#ͨ—ÉgVkã 0®FqœnÚØÎÖÅzê4O+ûGÄŸê?²³î¾Ñö}þ^ܳìßûÍ¿hû63ócïqº¹z±ö Ïíìï²Oöï7Èû7–|Ï3;vmë»-þÎÿ‘sì—˜ûßêwÿ¢ýïŸýÙ½ÿ½òî®>€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX (øìvÜø}°Hç úå^l×èëj»HÈù}yéß"I®4%#,~ÑŽëžxï^g ioníó*·Ê—•ÉY«Œô߀¬\kîvá¾ÍŒÛZöZñO€ º_|¡ãÛ ÏZöºè§ð¡Ïp¢Š*É (¢€ (¢€ (¢€ (¢€ (¢€ (¢€8ŸòHµÏûwÿÒˆëäP+ë¯òHµÏ­¿þ”G_#S#ZhZP(œCgDb )àRO¥³xÄP)ÀP< †Îˆ@§ªÒO¡³ª)Ái@§PÙÓ\ÓÕiTSÂÔ6uB˜iái@©ÖmP¦4-H©šr&EODÖr‘¼ab4‹wz²äu©cˆŽ9«QÃŽk Ô,®‘qÖ¬¬ç5+žU@àõ©–/˜sS„î*dŒ’+ TºEךœCÀæ§HñëS,dÖ2¨"¸‡ÍH‘ñŒÕ…NƤXÈ5“˜\¬±sÖŸäûÕŸ/>´åLqPæ"²¦8§ù>õgË !`Vò}éDdU½¢—Ë¥Î+•6j6j·åÑåÑÎ*l>Ôß+žµwˤÚ(ç ”üŸzF‹­[*i<º|ã(ù>ôÖ¶jñ\S<¯­R˜|¯z‹É÷­Lô¦2cëV¦;™ÞO½Bñuæ´Ìd Ô.œZÆ o=j'ƒŽZÓxŽ{Ô  ë[F Ì·‡‘ÍWhzóZì}ê³E×­o€d¼=Nj³ÅŒœÖ¼‘qÞ«IËÞº!PfY^i…jóGÇz®PŽÕÑãr±ZaZœ­0ŠÑ3žTȨÊóV Ó«Læ2» a; ŒŠÑ3–p!+Q‘V¨ØU¦rÎ$S©ˆ¦V™Í8‘M"¥"˜EZg<¢EŠB)äSqT™„¢0×½þÍ|QÿnŸûZ¼×½~Í?{ÅöéÿµªÑÏQhz.¢qñRÿ°U—þº«9>¦±üIe=çÄ;ß#T»±Û¥Yçìëß™nºùˆÝ=±×½idz׋v¬ÿ®‡£„W¤¿®¤Ù>¦ŒŸSPäzÑ‘ë\¼ÇO)G^'ì¶<ÿÌWOÿÒ¸kÐëʵ»)þ×auý«wäÿjéÿè{bò¿ãê×fþ¼ýî¾ÜWª×±€þõÿ#ÊÆÿzQ]Ç QEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢š¾0þÉ”ÚY2ï’îùÇÙmbŒ»H›™7qܺíU“†Î>]ßgøïþIç‰ìuÿ¢š¾N´ÕËSÓüD̶ûØ.@eû<Ÿgkq”n([ ß2gåb1"ðÞ»>§.™‹¨É¨B›åµKW2¢ñË&2̼‘ÜzÔ¯á}afHýßÞ  õðÖ¼Ïd‹¢jEïнš‹WÍÂ… L||à)#<Ô–¼»Ôm´ëˆ§³»¿‰NYá*·LäÀ'Wä+ò»±œ.YzËh1x”j¬u-—šì:ÝäbÙ3nÑXCó?z LFó³s´ç“µ²þÝñ æKùÍ¡•¦»Ô®S/%þi¤Ž[‘òî%™‚‚Y†@1êà¶¾Ó®w³‘Êác”Oo¹c—$„‘XŸ‘¾Vín85&»©ÿmø‡SÕ¼Ÿ'í×rÜù[·lÞå¶ç8Î3]ü%–pj: Ü }?ö ÜONà ¨Ð†,øÏ—'Ȩ1¼ÄiŸÝà÷þÖ.¼Cs§[Å}«ë1o}E`…æxæÞD€‘’ø$~bq¸a›?ìÅæý£öKéôË?Ü}§Ëv† ¶í›¾êüÒg¯ï]“XxkQ½²¾¹žãJºÛ-´éeÄ7°‚ÊÄÃzH²DD‰Ã¶äž:·›Dh·ÝÇv–÷Vª%´¶¸–eåbïxëæ)ÄìU>m§K’ ½å¶µ§èÖ°_YÝÛé÷Oö«SqnUd;@/0èT¦vœ69Ú¸ÐÓôßiÝ µ(縷ŒÈÚi”IË!X’] 2VQüAŒäV…Þ±áÍSÄÄú‘‚þõõ;ÛW˃r‰@ 33–gòĸM‹m;ˆZzW‰ ñ,úõôwú–ž,àkHf7ÆÅ6G¶!ÕbÂ… ï¡kÙÝ^I¥_%­¤¦ ™šÝÂC vƲ@Áç‘Zž#ðûý2ÇU°»óe·†+ų `È­å"ípÒaÀó‰É$›~"ÓaÒìä”]ÿhXé—ZlP,Jb•góÿxÒn ý¡¾PŸ,|ÃwË"x“GþеÔdŽûíRiãM¹UTÙbÌÚNs+D˜>XJå·oP v¾ñUѾEÐu$žÎÝ. ,å:´‚5 »rI;Ò7?ÃYöÚÔ]æ§ggvtÒ†Öêà[—ƒ ·ärA\ä¡ä6Â0@5ÐIâ-­áÒâ”zyÑÿ³e¹h‘å /MϘ±îPCaFÒÃnãó>Ü´‰ã+ü8–Vë=´–Ö—6PDlm¦wŽW”å®ÙD‰1R¨˜m§ ’ Þ«g1··ÖZîKÈïÝ÷Ï.DŸhP­*¾I$ƒ"°lÁÁá·*×ÓtKY¸k}/O»¾P»Gk JÁrHPN2@ϸ­Kø•ø7û>~.õ+¸oL'††ãqúéç±à…[dSG†5[ ?íPjrN-gØZ5´Žê9È*Ñ»!VÃJŽ®€°*öëìï° 1jeó™@ÜøÀ,G-œg;w61¹³¡¬ø}ôMñ˨XÍu ¦ «X]¼ËiFr¬@l`Z2êäü˺®¨éž#Ôï®o—Róc}=e¸ILÌò ”à3¶Ìà*ä಩ØOYØc¼jº§ö~¡my:“ö(áÎmâ3e[* Œ~éÎ@1ÿáÖ-)_ù–Úts½Æ§¨-ÓYŦ[òC¼*oˆ.[2¶ž¤©/òáø–xs¥éËãK²Ï4l^F’Iœ2V•“p$6ÍÀá†)ÚèZÅö>£g¥_\XÁ»Î¹†ÝÞ8ö͹€ÀÀ œôröÊúëKÓ®n%’Yä·&ÊÒrÒ/0<‡o 7$‡$‘+¶2 îhÎ-­²^<ðßX蚌 ”X[|W2+—'%‰˜Æ# 2v¶ÿà1J¼ÓüDVI,åÓ?²o 3ZIöVµèHÜLj&Pv†ù6Q˜svz-ýöã¬â5´’ðÉäHËå&à_åSòîR›¾èn¤HЃEñŸáøHíígUçi,žC4eA—ÊíÚ]€Sž2FA­HüE Åªi Ô“O³ÑîôÙeh‘åf›í#ÌTÜ?~§in9]ÍÍ¥¦ËáTÓ/VìOiq=Ű„.ÙZd‰0ìNP!„7 ÛòWäûÔN÷Lû6e¨Á7iuº0Åv2LL‘‘“Ózà «/FÜ«LO2Û½ºË Ý]ã v³(!I ˜Ûqõ­Ëø•ø7û>~.õ+¸oL'††ãqúéç±à…[dS\ýXûuÇöwؘµ2ùÌŠ n|`#–ÀÎ3»›ÜÙ¯EQEQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅygÇ ^x”$\àâÿUÅyMÝÉó6– Áê_º`9ûF íþ®¼q¦ÎT…ùºœs\Ó^øÑð¡›Ä{}›Ÿ_õµìÕãÖÞ!0–Áû6Aì{^É[SøQSø‚Š(«$(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šà>5ÿÉ#×>¶ÿúQ|+ëòHõÏ­¿þ”G_$¨õ¨‘ÑE\P)ÀP< ͳ®1)àP<j[:a¤ ͳª*@( R*Ô6u«O” xZͳ®ÄQR(¡V¥DɬÛ:¡¡jtŒâœ±tâ­Ç+LÙ+ÅêÌQa‡Z’F:U¨âÎ+šuF‘sÞ­$yb ´Ò¤Õ‚£°¤)žÔù‡ÌWÙŠiLÕ’‚šSž5!©Šb˜S¹«EzaOQT¤Z‘P¦MDÑóÍ^)è*6¶+E1Ü ÉÎj¯^kA¢ô¨š1Üt­c1™¯NµE×­i´]N*Û­mŒË’>;Õg‹Žõªðõ⫼CoJÞ5eK=ê£ÇÅl<9*«Â1ÒºaPfCEßš–µ:UW‡ž•Õ‰«”JÓU—LTLµ²fS\Ša;-0­h™É8Ȧ0« µ-Zg,à@˜ENËQ•­9')„T¤S«LåœHˆ¦R‘L"­3šQ#"½çöiûÞ(úZíjðr+Þ?fœîñF}-?öµi’²²=W |CÔ3ÿ@«/ýuOÜ=k7Å3jQ|C»þÏ´µ¸Î•i¿í-ßÞÜãóßÓñ«›ý«çólD¾_’=L½ýu&Ü=hÜ=jþÔoö®.s«”§¬°0ØØWOÿÒ¸kÓ+Èõiõ#}§ÇöK_°ÿjéÿ¾ûKy¿ñõü³òñ׿ӟjõÊ÷òÏà¿_Ñ6aüUéþaEW¢p…Q@Q@Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)«â ûÇòO!ßÿoj›¡mñŸ¶I”lÈ烆#>„úÐM¶¾2ñJ\=Âx—XYA}(fU$¨'vH›¶ãëL>,ñ#YÍf|Aª›Y·ù°›Ù6I¼’û—8;‹19듞´EnIãOLð¼¾%Ö]á}ñ3_ÊJ6Ò¹_›ƒµ˜dv$w xÓÅKp÷ â]dNè¨ò ùw2©%A;²@,ÄÛ­aÑ[Åž$k9¬Ïˆ5Sk6ÿ6{&É7’_rçqf'=rsÖ¤“Æž*™áy|K¬»Âûâf¿””m¥r¿7k0ÈìHï@tVàñ§Š–áîĺÈÑQäòîeRJ‚wd€Yˆ·ZŒø³Äg5™ñªmfßæÂodÙ&òKî\àî,Äç®NzÐ=¹'´‡Elx‘¬æ³> ÕM¬ÛüØMì›$ÞI}ËœŘœõÉÏZ’Oxªg…åñ.²ï þRQ¶•ÊüܬÃ#±#½aÑ[ƒÆž*[‡¸_ë"wEG_˹•I* Ý’f vÜ}j3âÏ5œÖgÄ©µ›› ½“d›É/¹sƒ¸³ž¹9ë@ôVäž4ñTÏ Ëâ]eÞß5ü¤£m+•ù¸;Y†GbGz,ñ#YÍf|Aª›Y·ù°›Ù6I¼’û—8;‹19듞´EnIãOLð¼¾%Ö]á}ñ3_ÊJ6Ò¹_›ƒµ˜dv$w xÓÅKp÷ â]dNè¨ò ùw2©%A;²@,ÄÛ­aÑ[Åž$k9¬Ïˆ5Sk6ÿ6{&É7’_rçqf'=rsÖ¤“Æž*™áy|K¬»Âûâf¿””m¥r¿7k0ÈìHï@tVàñ§Š–áîĺÈÑQäòîeRJ‚wd€Yˆ·ZŒø³Äg5™ñªmfßæÂodÙ&òKî\àî,Äç®NzÐ=Q@Q@Q@Q@Q@Q@Q@‘ðOþG[Ÿúðý}G¦ÿ«òçÁ?ùnëÁÿôduõ›þ¬P~Ðd‰¼¿ëkÚ+H|#žáEUQEQEQEQEQEQEp?ÿä‘ë[ý(޾J¾µøÕÿ$“[úÛÿéDuò`œÎ¼2º`H ð+&ÎøDP*EŠ*@*:¡@§H¢¤ Y¶u‚Ôi©Vm°€©ÐH«“Y¶uˆMZŠ#š"‹§¥\ŠÆ¦Xý*ENøý*PŸç‹˜†,xã"¥HÖž«Y9ä1RžúSÂþ4ðµD9„§…ö§…ϵŸ…!N=i:cS*”üi¥¥ZÛþÏéMÙïPàZ™T¯ãM)Vvÿ³úS qëSf‹R+ã¥0¥Y)íúSJûSR-HªÉQ´}ªÓ-1—е#E"“GP¼]J¼ÉŸÿUFÉíúV‘™fsÆÆ xºž?*ÒtöëíUÞ>£=«xÌw3Z.ØYâíÇåZ¬ñúUW¦ èŒÆe¼–ŸûZ¼(Š÷oÙ³ïø£éiÿµ«XnqbºwùÇÄ;ïûYÿèÛªfóíU<_{qgñçÈÓ®¯7iV™ò!³ÜõÞë×Û=*]ÇÖ¾k2vÄËåù#ÕÀ+ÐÏódÛϵϵC¸úѸú×1ÙÊWÕ•Ó‡ýEtÿý+нR¼oR½¸:ŽkýuäÿjØ¥n‹Ëÿ˜Mûúñ÷zûs^É_I”ÿúþˆð³?ã/OÕ…Q^¡çQ@Q@Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)«ã½~ÓH°h ±ŽôÏ$P\3O*E’%}˜ Xù_M¼n?bxïþIç‰ìuÿ¢š¾)½Ô/u)–[ëË‹©Uv+Ï)r$àzr:Óðþ‡¾—6±ÝGo¨#ÄñµÄ!òw”·åw$„Ži+º+a¼; Ì‰™Ô·ßY^êVSÍ*04ûc’0§{²Ûœ°uÈ>S·æåìõ)¬-XÒK„òÚ|1c ‡E9À ã$ ¹ÚÌVÔ¡ÒæÒâÔ.ÓO™÷Ëh³0‰ÛŽY3‚~UäŽÃÒ€;‹?i§Ä·Ö—K©6ŸŠ"С•$T,®gRw ºì‰ˆ£¸ÃêGM7 º\wk V{§RÒ°'ç  cäË㟙ªÄ^%סx-oRíÑK§5EeP¼ðÈàÐ;æ³çžk«‰n.%’iåròI#gbrI'’Iç4ÒYèz\þk‡ûsj­— ¸‰ éLMP†e”2üçË+-sÆ>Ðô+{˜ôÝNK«Í>÷ì7` ]Y°ùbL(±ÆpåÎNKrñêÚ”:\Ú\Z…Úió>ùmf;qË&pOʼ‘ØzT’ßëߨténï¯üœAelÒ<»3… óŒáF  ÒëÚž*ñÖ©sŽŸa¬5¤0FíåÞb †lXHÛ°~ðÆ/VðÖ—£¯ØJê·—ÓÅuqÄQùb4†Y£Ä–ì»ù31.»©ØCcÚë¾$}b}FÏUÕ[S–&ó®a¸Ìñ¢îmÌâ¡Pž_j§­©C¥Í¥Å¨]¦Ÿ3ï–Ñfa·²gü«É‡¥tž0¶ÑâÕl¦°Ñ¯ ±ŽÒÀÝ‘p…[̵ÕC€IÄ6æ ÛF©5]JÓõŸÝ_Çwsi§kÂ8-dŽÙ˜»NC’#dÚ¨Ì1´.'5ýåŵœ×sÉkk»ì𼄤[Ž[jž'“޵r?ëÐê“j‘kz’j&ÉnÖéÄ®¼pÏœ‘ò¯ö”Öj¾Ñô»£¤}ªúmLÚj~!_²Ër>æ 7˜¶øÆá°œåó´rþÓ,õ}hÚßÍ<6«iupò@¡|¨$aIòƒŒŒôÈê)Ë>¥eqöy¥»‚{T’×ËvehT–GƒÊ‚]Á_ö›=M\·Ð¼I öfÒµXæÔ"²yvò¹Œ§Ï³çRÎ26·<ÜŸ@Ðm4HüE,:”š}ÂB"±[´Yciå2ÓyD0dcÿ¬?.Zæ¡ðúÏO–é›Ró-lb½Žê]Á ¸…®U00B©1Z†RIæ0ï¹8um{B½)¡©i÷vÈÖ¥Rg‰â]åš>*7ä•õÉëTÒþò;6³K¹ÖÕóº!Ù(NW§&8Éÿq}XдÏí¿éšOäýºî+o7ní›Ü.ìdgÎ2+r h|i{y¼‘éòÂñý‚Úi€·¶³ÞÁ×;rJoY±Ê¬ò6O'—’ ¡H^X¤D™7Ä̤]År¾£r°Èîí[—:õæ¡.¥¨[Yl½º‹~¥y,Fæ+#/h–BèÔ’ªUÇ@÷ÿcþѹþÎóþÃæ¿ÙþÑ3ËÉÛ¿nÆ3Ž3]Åÿ„4{X¯cK-rI,u´ÑZâ)Aw!Yh¢òÇÌ8ÛËÞIp$5pf –Ý.)ì‰!Sµ™@,èH ¤ŽÛ‡­hO«kËon.5 H@öá LûZDäà  2`p78îEnZèvž%¾Òdóæ’ßJ»qp f9e[y%"²6èY@r‚²RBŠöz—?…ÚáþÜÚ«E%ÂF§n"BÃzFSG”!™e ¿9òÊÄKaÛjÚ••ŵŦ¡wö¨RÞH¦ehT–$!* w$ïSDz¶¥—6—¡vš|Ͼ[E™„NÜrÉœò¯$v”cÃúl:®­ä\4‚íî.¤Ö^R€B– ·v3œ`ôø{Ãm§Üês&«©Ò—S·….#wL^}•¢f1€Û!À3÷dÇ<\Íkqż²C ÿÈësÿ^ÿ£#¯¨ôßõb€<¯ãœ^mÆ„6©;nxoûg^=´éys8‘z·85ëߨ%LJÉ#þ^8'¯úºòK©¡šÙ 8fÚ2wcþuË6ý¥žÅ&¶g«~Ï â>Aìݺ­¯p¯ýŸ /â@@ñëÓþÚ×·WD>–áEUQEQEQEQEQEaßøŠK]fM.ÓDԵⷎâVµhQdiAóeBNb~€ö­ˆ$i­â•á’t ÑHT²>éÚHÈéÁ#Кæõ'A¾×5-FóQ¾·¸µ´Š;¡¡5šGù’,‡c&å;ßç$¨ØÀ`«ÕÏÏ5χc’Yd™>Ñr¶ò»2[¬î°¶ã˃B’XÙ9Éç~5É$Öþ¶ÿúQ|œ}cñ«þI&·õ·ÿÒˆëääVÏ$céÿ׬ê¸N£À§HH¢°lõ!Ê)ê)TŠ+6θDrŠ EZ ͳ¶œ¤QH¢¦UÍdÙÙ®MZŽ.z~”‘Æ*ìq Âs:6¸~•n8òz~”E@àâ­Ç1ŠãœÄ˜Ç¥ZŽ.?úÔGsV’:åœÄ68ð¥YHú…*'N*ÂGÒ¹¥1 Xÿ/¥L©Ç¿ÒœJ•V°”„݆ªûTiÁyô©ñéY99 øÓÂÓÕ3R*qéI&Ì܆*tþX§ª~…H±Ô›=«HÀÉÌŒ'N?JxLT:SÄcÓª“™Lž˜ü)Û=êPŸ9Sž˜­s"ÛþÏéJð©¶{Òìö5jóí÷£o½M³ØÓ„`ûSä9ÃþE&ÃþEYÙïA=éû1s•¶ûÑ·Þ§1Û4›=.Aóüi6ÿ³úUžÔ›=é8 L¬SŸJi^zgð«&>ýi¥=±PàR™T§>”Í¿ìþ•i“ž™¦”ü* S*ãÖ£dÉôü*ÙN:b˜ÉÏLÖNŠe6^iŒ•i£j6N¿Ê²i£U2«-FSüâ­2Ôl´ÔTŠŒ¾ÕÇÇÿZ®2TLkU#DîQtÁé‘ôªîˆý+E“Ú«¼`õüëhÌ£5ãíŒþYÓ±¥i¼~‚«I#¥tÂc2e‹Ûôª’GœñÏÒµž?Z©,<’+ª‘4^ߥTtÁÿëV´ÉÇCTäŒWd&=Ê µ °ëЉ…tE˜N *&a…FEh™ÇRr*2*r*2+TÎ)Ä…0Š™…FEh™É8‘^ëû6ÿ¬ñGÒÓÿkW…¸cÐõ¯tý›Ax£$t´è?ëµk Ï7­²ñ/ü”;ÏûYÿèÛª¯“ëPø×TÓô߈wn¾¶µó4«]ž|ª›±-Îq“ÏQùÕkMBËPˆËewÌa¶—†@à¸ÈïÈüëåóU%Š›¶š~Hõ²æž*úëù²þO­>µáëQ\Þ[YÛµÅÕÄPB˜Ý$¬FNI㩯5JîÈïjÚ°Ô Ý¦óÿ1[ý*нr¼:M{G½¼Ò­íu[æ}VÇlq\#1ÅÔDàž€×¸×ÕdÊJƒæV×ôGÎæ­:ÊϧêŠæõë"×Ú–¯ªÝÛø~ÒÉeòm.$–D24²3E‰Ù° Aù²¹ kSBþÑÿ„{Lþ×ÿŸÙ"ûgÝÿ]°oû¿/ÞÏN=+Ö<ÃBŠó¿.æóTÕ¯µMÅÞC^ȱ½¦¤ñE â-Ëw ìËi~X·3 ‚Ýe׈¬ì|‹»©`F¸‰^-OÎǺ*°ÛµòUŽTí%€lQYö·WšŽ<ñÛý‰¤ÝöCr…›n>W’?”®NN̆یíbUy}'TÕ4…º¶£u{ý¥©é¿Úln'L žç Jƒò¯È>Px”ÜQ\½Í³ø^[;ø¯¯®¡žî+kõ»¹iŒ†V¤ˆ¤í„®™ ±63ü¤„äþÓ®n%îuò9vëWˆ “žeG°Ôj^%‡Oñ>¡-¼“O¨¼äR6ÛªÆî¥ûåÌlqŽsò`îW'®øÏWñ†°¯wépíãÔn"-Á2" GHião üüÄ7Y@Q@Q@Q@ÿŽÿäžx—þÁW_ú)«æ?ìŸð—é[ÿáþÈþÒ_#Íû>ï±äïósÇÜÛþ»÷›±·æÝ_OxïþIç‰ìuÿ¢š¾  ßMº{‘©¬xr f a†Ú9’Ð[­²ù¾`V›1ÈÛ¼œ9f‘‡F#q«·§A:&´šTz2éââå­¥•Ñ¥dÞÂ$) JûvxØÇ«¯30óº(´ñy²mÅ­ãÑ¢!ÂÆ–OŒP/ßVŒ+„9_’äW †beÛ_ÀæÜ\^,±é­#¢ª=ÛÛˆrê·@Âà|¹L¤‡åÚʾertP¤yÞONØéRæ+¯´L·‘DzãÌ“Éò’Xší”/Wk*Þš“ûRËEñ®“©+ø}4;mb7°{x¢’ál·—XÁl„Øs8óC`¯Ì¼ÎŠí4Øÿ⮹·ÔæðûË{¦]Fâ1j¶ðËöy< @…zÄw!êØ-’¤ӿ³?áƒöWسî¾ßæù?kûvfò6g÷ûã×ý_É÷·ËJáè ãÆ7Z=ïü$BÊßJlõµ‹N[Dßnßh20#™”ˆä’p µNÚÃðüۥνws[鯗o*†K›†bc‰Ç?&Ô‘ÛŒ\©pkŠ’y溸–ââY&žW/$’1fv'$’y$žs^™¢º[Ù]ZÞêšQ¼Ô>ÔÉtšŠ¿ÛËÙÞ(–v‘Ï”Á¦T8ˆŸ5·+2å|¾ŠÜñ,ð¹ÒíVX纱²×w°u’A$„ÿÆ6Ž=Ý?w…%B“ÔGmeƒ4‰®­thì§ÑîÚâfh¾×-À–åmö©>n‚!¹2”\/Ô’O4É K,Ž¦È•˜‹¸¶Ðnf8É=è´¶6/„$¹žÆEM*îIf„wb[§„J„ü«¾HOïB ÎT5jZê‰g%õ”áõÖo´tKŒÅfÖ­t·À GÙÔ}T¤)`3™¯3¢€;G¼† þŒc°½»y¤x#Y$„&#d1wG\¨ÈD›P X³“JßáËûÈti£ôw1ÏÝĨ…X9 1Ã1Á XdptP¢Aq§Üi6÷ö²x~ z{x¤ºk«{"8Ä×K)²˜Ãí[CµÌa’ªw>yA ¯Ž¼CoopÁ§r‘Ç…TQ+¬ý7VÔ´k†¸Òõ »Ù 4–³4LW à• ã { §@¹im£^kP‹_Ý[ï»mh5¢Ú]7úC!WR¶;§eH ‡5Ÿkª%œ—ÖP?‡×Y¾ÑÑ.3›ZµÒÞ1gQöuRB¥€Îd¼Þæ¶rðK$NQ²1RU”«;$Ü*:é#ŽØø+Z¶i³Oi©ÛI À"K,EfG1— +¡"·u*95Ø<ž†òú[¨|?=Š=Óh‘)„oµ·;Vo(‰7–û(iîÎÒuy]éMÆtöw~V‡öû½<¢ÂÎ&Aq2oXg_³ñÂLcËvÊ•`B|þÿÊþѹò<'Í}ŸgßåíÉÆÏ3çÛŽ›¾luæ«Ñ@’ZøT<"-gYd/‰Ki1)UÚyQö“¸îÚ0qÁ'<`‚׿humgYRŽ4˜‹ÉÜ ý§·'9< s‡Elo ýŽf®ªn†ÿ*3¦G±°NÍÍçår6ç vä»2IkáPðˆµe¾%-¤Ä¥WiåGÚNã»hÁÇœñƒ‡En _ ý¡Õµd@J8Òb,['p+öœÜœäð1ÌfÛÃc™†«ª›¡¿ÊŒé‘ìl³syù\¹Â¹ nÆN=QEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅxÿíH¹ðÞÐKfäŒÛ*ñ9$ÅðR9=y¯jý É[2œöŸý¥^En’B…Ý#‡¸¬dí+…Ïdýž™Kx“iÏü{sŽå­{}xŸìøgˆY7oý«^ÙZCá*{…QTHQEQEQEQEQENóIÓu ‹[‹Ý>Òæ{Gßm$Ы´-r„Œ©Êƒ‘è=*åPñ§þI.µõ·ÿÒˆëå +êïòIµ¯÷­ÿô¢:ùMEcTôp*éŽQRMQR(¬=zq¢¤QH¢¤QY6vSˆå"ŠjŠ•V³lî§ʵµ"®~µ“fNB©qÈÍ9Wž*eN8ªŒnc) T©qÈÍ=SŽ*E^+xÀÆR©ê)áN)ê¼Zx_ZÚ02r§õOQš'OJxÕ9õ£hô¥È>b‡͞Ƭ•ô¤Új\¤V)éÁ¦ìFjÉPi¥9â¡À¥"±Nxâ˜Sž™«$Ö˜Tš‡E"±^)…9㊲TcŠ—ó¬¥E"³'_Z‰“¯m”gš—ò¬eXȦS¯ÔL¼ÕÆ^y¨]úÕ„£chȬËQ«,¸ëQ•üêS6ŒŠÌ¾Õ GÛm—Ÿz‰—ò­##TÊ.†«HžÕ¡"úÕwLðz×D$Q˜ñœr*¬‘œôâ´Ý3Áª²¦ ô®˜Lf\ÑqT¥„óÇ­kËER•=;×e9ŒÇ’#éUÙpkJT<ôïT¥Nk²¸5r« ˆŠ°Â¢a[¦sT ‰…X"¢aZ¦qT‰-N£aZ&qT‰î_³úß}-?öµx{ ÷ÙÃýoŠ?Ý´ÿÚÕ½=Ï/­Lê¼XqñëþÁVŸú6æ¨oõsÆ ˆw?ö ´ÿÑ·5¿Ú¾?7•±³ù~Hö2Èß ŸæÉwz7z‹µý«Íç=R;¦}0ÔVÃÿJ¢¯f¯¸lÜécó°ÿÒ¨«Ú«ë²|4¿Äÿ$|Îr­]z~¬åõ‹_]ëˆñiúUÞ•o²KxgÔ$„¼ÃŸ2E8;N6.pÞrÛ6jFuéM’HôÛtß ¿]æ;v¶Ã˜NwÈdèÇmùµ(¯lò|Ûø¤K5 ½±{Y¥w]@“ÛFÌHaÚÉ#*áD…€èJ6ÒGð½ŒÖöšlÑÇ.‡gnæțãb£ÈXŸ0*…Ú§€rÇsl)¹ESÓlæ°·ky.ä¹ù .L‹Ü’\ƒòF7n`Y²í¼7æxWTÐïäýÞ¡-þ÷¹Xî&•Æ x,ƒ±ÅtP>š~±©ÞZÿm‹µ±”L‚ÒGay +:2©;ÂfB!Þ<¿Ÿ ¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM_WÛþ;ÿ’yâ_û]覯“'ð5äúìöTÐݼ{vUbïÝKí_˜˜âvÄ{ÊT€ØRÉÑ]ºü>6M«Å­êpiïm§Çyk$Ñ\"È­p‘d0™‚]pUX±BLšÄ·ð¦¥sokqȸ²šôIómEŒNJ1ưµ”¨ïŽ£œaÑ]ÅÇÂÛOi [æIå0È<™—Ép!4cÍÂÇ!ýÏ™œd²n¯{ðëSÒüù5+ëX|’n.ÄÑnY|ФDщOÍ ®6nèØ)–}bþÆãLÔnl/#òî­exfMÀíu$0ÈààƒÒºðLï®ZèßÛ:RßËv,f…žPm®@ÿwó|À®è÷ 8ËT^ŠèÂÀùÒK®éQZÛùi=Ö餎9Ÿ~!ÊFÅ›¹Ü£Âðç#2\ø+R²Òî¯og´¶{k‰mšv$Ëw§˜ªbò¹Î€TîMÀݹ®x^ç@·¶–æîÒG™ÌQ— ªÀía½TJ‡k2"éÇÞù—tz‡g×¾ØÑÝAm œ^tÒJ’ɵ{¶Ø‘ßhåöí^ ²‚Eu‘|;צðüúÂGAM «È¯E„Ž&E0€6?@NÞÜ›¤Ó|ø·KѵfÅZ]A,o¡…ÜMlå°cæ<3d2†Mè˜ ãè­Í?B‚óV¾³R´ºK{)îRXšXÖs&B´YÈÁ$2¨; 2 þ¹¹ÒÒì]Ú$ó[Ëw“óf‚=þdŠB”yRðÌì8+¸Šè5ÿÞx{íbk˦²»ûÚÚJ_Èï( *Ü#sò’Wi¾Z¹7ƒUmÝÛR´²ûA¨÷’6"ža+ª"¢%Uv–YñµKNŠé.üs§ir_j–›jb¸¸³’Ýäv•n!Æè°¨A$0!(22’Pðœúf|ýFÄùke·Í?a™·|²|Ÿ7ú¹9‹xù<®@9ú+´‡áÖ¡¨ê×Vºt‘Éokok+ÜÇűž"±ÃæÃqå\m,N eÞøFóL‚Q¨ÞXÙß'šRÆiO™*Äï•`¦>9Ã1O”˸Ÿ¢ºOøwOѵkK]nÒxî-í¤’M³~ã̆7.Ùˆ„¹e ‚ŒŠ.|*bÖu»y¯m4ë=2õ¬Þâéä•D›œ"e˜‘Û|§;I€stWQwà=RÆö«‹ï<«‰VÇÎÝ3T› *6y.Ù,³£— Š( Š+SCÓa¿¸¹–ñ¤K +vººhÈ Tªƒƒ‚ò4qîÃm߸‚Ð]$ò,×ÊÇ;–X£,U?tn$àtä“êMuðîý5ÅÒ«¥¨ 6fIdt‚wßå+‡;ü¶ÆÝÛq‡Øx >ŠèÂÀùÒK®éQZÛùi=Ö餎9Ÿ~!ÊFÅ›¹Ü£Âðç#"øeá±×Úòx#¿Ò2“YyŒ$B&Ž&|„hÝråpóÈ`~Š’ ˆ¥xcÃ4R àºvpzpAô"´5Í6 ‹ilÚG°½·[«V‚ÁI*Èx)"Éì.훀…eÑEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅx÷íBÜøpžƒí?ûJ¼wí * \JõïÚ'>o‡p;]í*ñ8ÜmùºÖrÝÅcÝÿg°üHŠÁ€û/#þÚ×·W‡þÏ ¼NLÚÿíZ÷ ¨ìT· (¢¨AEPEPEPEPEPEPñ£þI6µþõ·þ”G_*¨¯ª¾4gþ6µŽ»­ÿô¢:ùZ0qÉû VS/WLx*ŠbŠ•Es6{tâ9EJ¢š¢¤QY¶vÓˆå2­1G"¬Dë3¶&M]…=*8ûUèPóÒ¹*LÐ’$>Õu¹¨ãBjÜH+Šr$KÀÅZ‰y÷¨ãN™«q§ÕÉ9*-XU¦ªô©Ô~•Í&K`«S*Ò(ãëR(Ï“f2bžL«Çµ"§Õ2®y«ŒLe!GáS*çžÔª¸©Bâº# H@¼óR*çéJ«Žj@¼s[Æ&.BÏJz®)á8•"® Ú12rÖž©Àô§…ÇJx_ZÖ03rg¥?i§*öàžµ¢CŒs@T¡@4à¤Õ¨äDš]‡Ú¥Ø}©BzÕr‹˜‡aö£aö©¶z6z|ÌC°ûRŠ›a£aö¥ÊÅ|HWÒ¬2ã¯zfÁïRàR‘ ¦í•9OJk/cPàR‘\©œñVJúS ‚k7ÔŠ¤Ö˜ËÎ*Ë/cLeÇ5“‰¢‘Q—ƒéLaÇh¯µŒ¢j¤VeÏõ¨Yxâ­•äÔLœñXJ&Ñ‘Q“¯¥BëùUÇ^MDËMa(FEB;‰—Ÿz²ËùTdv5šv7ŒŠ¬£ð¨1ô«Ž1P2þu¬Y´]Ê2'­U‘9>•¤ëÇRDù½ë¢(Í•ÍT•=;ÖœÉÁÍTtÆq]p‘FD¨yéÞ©L‡=«^T<ôïTfCžÕÛNc2y5 »4}MUaƒ]qdM\®Â£aS°¨È­“8êD®Â£5; ‰…j™ÃR$,+ÛÿgõÞ'ÿvÓÿkWˆ¸àã­{oìâMâĶӠÇüö®Š[žF=Z™·ãí:Æÿâßm²¶¹Ù¥Zìó¢WÛ™nsŒŽ:ʪî5¥ãRGÄ;ûZÿèÛšÉÜ}kä3–Þ2i¾ß’=Œ¦ ê‘~¿›$ÜhÜj=ÇÖÇÖ¼»)Nm:Äë:]÷Ø­¾Ùý«aþ‘å/™ÿ1½Œôãé^ï^!&óJÿ°­þ•E^á_a¶ðÎï¯è•Î⣈Víú°¢Š+ÛB¿|÷ Gמ;ÿ’yâ_û]覯‘5ÝM³‡Sm=î‰Óµ³Ü>nÿ4‚nß(ާvs„û´Z/oe’='NK)­þÍ-‚¬‚)#Þ$Ã04Ÿ1U·oÏs´m©WÆ:¢è÷hòsù º&ÆŒHÊJ R~õB€[‰Æ1!¨ô{ 7ûûWÕ"»¸‚Úâ e·µ`bÒ¬­¼»#Œ vó¸Œ`ôš¯‚4}.èéj¾›S6š…ÇŸ„HWì²Ü¹‚Íæ-¾1¸l'9|írøÊæ[ÿ·7MK¹žG½™crצDd“y.vY$È‹Ë6F ¡Zw¾ {½:}>>ÆÊÎYa”ElŒ6Ä |ÌÌÍŸ9É,XýÐU¶4ýÍmíô‹ÔÿLš)5{¦@7Ço«ÏHä|­"–-ØN7+%ji^Ò »×L»¹´uÔ--縆CûoÙ\6øY$'–Ç…ŒÀ«jSk:Íö©p±¬÷·\H±‚3±bI8Éõ5¸ž65Ë]gûJkø®ÅôÓ2JMÍÀÉ?ï>_˜–ÛÄ'R#>•iðÊM:C©_ÞÏ—M$l„@ë´4EbR>GRNKU-4Ëxl4B9>Óvë¨^I [ÞÞØB^ )*]¤…p«åœFJ˲ׅŸÛa}*ÆæÂîU˜ØÌf£®à…YdY>Q#¨Ë†ç$,IâëÉàÔ ÅŒ·×þ`žøÄVFYÌ`UXFß1$BÊví#bmè!🆗íºåìöÚT~B[ù·-¶c/‡Iã·r눃 ÌÈÛZ2¾³¤iv~ŽÊ×N¾¹ÔáÕuàQd…`fg„Ǽ(Œ“°°Øw’Np9ýOÄ©iÑY >ÆÒ5”Ï!¶Fd¤[k1XóŽV0Šp¹DÛ‰­ãΗd:IœdFŠE9WI"tu#'€Ø< U#sÆÚÏs§i³N©$p]4ZÞ7vvDHˆ ÒHA(JîùHÚ»pè  MG\›S²·‚{[A,I=ÒÆ|ÙV4òã I!B  „ »¶â0–óTÕnîô6x5K…»¸²o9bóÆìH¥dï$ãvßœñÂ㛢€: Ÿê—šŒw÷>D·KiujÎSÅÁœÈÄìÜ>1€0¼psÏÑEQE©¡êPØ\\Åx²=…í»ZÝ,` HeqÈÉI96åwlÚH k.·<59Õ59¢Žq¥Ù”†E ¯#I(H9+J¯´‚fÒ0ÇóưÜKMèŽUeŒ0WýḃרÚj?ñlú¶•¢ØÃnuS©ˆå󉸕YÌ//ïN|Æ8BªK‚‹žy®®%¸¸–I§•ËÉ$ŒY‰É$žI'œ×®ZZi‡Ä#ŠâÂÅ-tBæÖ̦ †8VÒù†å Øx˜I9_¼71 oe¯ ?¶ÂúUÍ…Ü«1±˜Ì#G]Á ²È²|¢GQ–9 ÎH\mrÙôíjê{›»­k[B—jÖÉQ“p“ÒĘÀÛ±@Þyù@=%ޝ¥>“­êSKŽ+»{{¡á{}­Ë2˜ ×%y`ÅŽÅíÀó¹æk›‰gqy»ãTPIÏ  À;Pk5ÄQ<ÑÀŽáZY@OÞ;A8xúZæ¥ ýÅ´Vk"XY[­­ªÈb –g<œ‘¤“n[ný ¢®x.ÎÞ÷Ä©ÑcŽÒîp÷^4xíä‘Ô¹U•I]­0ACÄúzkú š<׎žÒ´PZª¼î“Ïq #je"jƒŒrXåˆEzF•e£¯…ôûIá‚YµþðÆ¶Éæ,Л¢²´Ì¥Õqj#€$1l ‰OÙhðiÚÝ­”0´}n;8¥‚Ù!Xáqqû¢B‡•”B›¤±-¼eäóz(¯HÒ¬´uð¾Ÿi<0K6£¢_ÞÖÙ<ÅštVV™”º® Dq°†-‘(›Ñ]G„4W—Z´¸Ô-|›­/g¶¹»Œ ðÁ#†û§ÌTuRÊg ç°¸þÀ¶ÐSÅÛÁI°7Ošç2Þ£‡Ëh!gû4G;NÅVæF$HäôVÇ‹,môÏk–qùv¶º…Ä0¦âv¢ÈÁFO'µcÁvv÷¾%HîŒ v—s‡¸Bñ£Ço$ˆÎ ʬªJíl‚8 ýØxŸOMbÿA“@Ó§šãQÓÚVŠ UWÒyã.!„mL¤@íPqŽK±ØÒ¬´uð¾Ÿi<0K6£¢_ÞÖÙ<ÅštVV™”º® Dq°†-‘(›Ñ^‘ã»- ;[µ²†6­Çg°[$+..?tHPò²ˆSt’%²Œ¼œ>©ÿej)4ý¦ÑñÝ¡m«sAhÉÁÆpleX+ 2‚;‚ò:Üÿ׃ÿèÈëê=7ýX¯›>éŸØŸµÍ'Îó¾ÃÅ·›·ný“"îÆN3Œã&¾“ÓÕŠñ¯Ú$f_ÿÛÏþÒ¯³.É·nyÜ21^ãñþ,þ,NÕûNqÿl«ÈÒÑ+\üŒF6sYNJö{ìôѳx¡bqk»#þö½¾¼[àâ=Êm’#þZ×´ÕÁÞ%Oâ (¢¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(‚øÏÿ$ŸYÿzÛÿJ#¯–TWÔÿÿä”k?ï[éDuòÒŠç­º=Œ±]1Ê*UÅ0ÊÙîÓˆå*ŠbŠ•GJɳºœIdŠ·y *r*üH=ëž¤Ž­‹)ÇJ»:T1 Çz»Žk‚¤„I ÷«ˆ§½G‘Ö­Æž•É9’%銰ƒš‹Àõ©ÐW$™-ŽU©•iª9©”V2fRbªÔÈ9Ç¥")À2qéN19å!Us×¥L«Ž{Ò*ç¯J˜ WL"a)©üjE^}éQOãS*öјJB犑Wž´å^¤QŠÞ11”†…ÏZ)ãÒ•G<ÔsÖ¶Œ œ†€OJx^ç­=W4ð1[(™¹ OÒ°{Ó“ô§…ÖŠ&nD`Ò—iô©'¥8/<Õò“ÌDÖ—`÷©vz6z|¢æ"Ø=èØ=ê` Òm£”9ˆ¶zB¾•6ÁïFÁG(sm>”Ò3Sí>”„v5.%)ÊzRGZŸ`÷¦GZ—”ŠÅ=)¤v5a—=)Œ½fâZ‘_TeNx«,¸éÒ£+XÊŠEfN¾µ.~¢¬²çëQ•ÏZÆQ5ŒŠ¬¹úЉ†jã.*_þµc(›FEV\ýj^ýêÓ/çQ¸8®yDÚ2*2ç‘Ö eüªã.yj\}+šq7ŒŠ¬¦¢eãÚ¬‘ØÔL;Ô&tFEGSÞ«H¿•^aÞ«¸äšÞ,Ù3>E늩*çZR®AÍTp@®˜H¤fH„gJu<ñÚµ$QT¦Aï]”ä3"hðsT¤\Ö™ P‘NzWu9 ¢Â£aS°ÅDº¢Îz‘ aQ0«¡aZ¦pT‰ öÏÙÓý‰ÿÝ´þsWŠ0æ½³öuÿÿ»iü箊?ãf*ÔOˆvÒÜ|C“Ê¿¸µÛ¥[gÉXÎïÞÜuÞ­úc­QÈõ­_>!Ïÿ`«_ýsX»‡­|®nÛÅÍz~Hö2xÿ±Áúþl—#ÖŒZ‹põ£põ¯2ǧb»[Ký·¥Oöû/ûVÇýìÿˆ‡]»½þ÷_n+ß+Â2 þ“ÿa[ý)Š½Þ¾»"m៯è‘ÏclJôýXQEìž(QEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢š¾&’îæQ0’âWH%”3“æ8νOÌÜž~cë_løïþIç‰ìuÿ¢š¾k–-ÓÄ71j¶šLi¡(Óà¶–ÀŽ~%a¸.eû?«’6„ €ÓumKF¸k/P»±£Ik3DÅr R2ǰ O©Eoop%»HKk›˜(R ’5=1‰IeóÓŸ½Ï}s%Œ³Ý6‘k [k›-Ã%ÕÍ”ð˜ó7šC4ijþ=xŒgó“.3nµ¾ð3év·:0Ùê’È*­å0„Ãä´‹ç¶æG\Œ°]¢Bª9{ËíQõa­ÜI·ré³A-•Ûêr\´Mzú3J–ýùý˜’Ÿ'ÞÝÿ-(“»þØþÇÓ¾ÛöïìÏÞýƒÎßäýïÞyYù~ö7mïÖ¤Ö§×–þêß]—RŽñ½ÌwÌþc2¦¸~I Äzãƒ] ñBÍñK—’M¥-­·öo™2Z[¢&`€K¹•@ù`3þ¯oË·yýõ캅ä—S$ #ã"pˆއ=zÐÅ·Œ5;m&òË>t—rË3ÝM<Î᥌Ç#l/å–dgRì…¾s‚1—y«jZ…½­½î¡ws¢l¶Ži™ÖÀ@Na@Àô•NŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+CDº¼³Ö { ´ÜKºÜ[ì/笊chð¿7̬Wå!¹àƒƒYõÐxWþc~Gü„?²§û'þ;çõãþ=¾Ñ×ðù¶Ð=üI£sK²4•ÕWÏY° 1WÿyFQÅnI®†“o$^ ˜Kné¦FË3o„ƈGt1à¼mÆx®n½r=SM²Öùmf;qË&pOʼ‘ØzU:(âêÚ’¥’.¡vÁËÙ¨™±nŃ?!,ÈÇ#5b?ëÐê“j‘kz’j&ÉnÖéÄ®¼pÏœ‘ò¯ö•—E$Íkqż²Cùmf;qË&pOʼ‘ØzU:(åæ­©jö¶÷º…Ý̉²Ú9¦gXWa8Q…ÐzTš6§ý¨¦£>eݾ$´bØX¦Œ|Ûy!x¶çr‚­ŸEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@GñöWŽl}¹ûO^Ÿòʼ]Ût[œ(#ºŒ^ÅûB“æøxÆ~ÓÁÕW‹ìq rÀǽc%ïÏrýŸpÄiòe~̓ùk^Ù^û;ÊÒŸ3ý¢ÿ=kÜkHìTØQED…Q@Q@Q@Q@Q@Q@Æoù%ÇûÖßúQ|¸¢¾£øÏŸøUÎ:î¶ÇþG_.Fâ ö®jýk)ÕH•EJ¢£QR¨®FÏ¡§ê*h×$Tj*Ä+–ë3º BÌ)’1WâN: ­ Ž+B$ã­qÔ‘¡b4ã «‘ èF*ÓÞ®D‡ž+†r4h*Üj ¨Qrx«h½±Šãœ‰‹S ü騼 •5Ï&g&=GµL‹íô¦*šTñP•Ù„˜ä_þ½NŠ3LAúÔ긮˜Dç“Wò©•}i¡sì*u^õÓœò¨§Óš•WÒ‘TŽMJ£‘ÍtF&b…ÇJ P£iê½ÍtF&-‚¯sRªúЫÜô©ÏJÚ12rWÒ¤ (©ê¸ëZ¨™¹ íÅ<( gN ïZ(ØÐ¼ð)ÁyæŸéJ5J$9 Ø=è H¾õ\¢æè(* ?o½}éòŠä{½I·Þ“i¥Ê>b-§Òš@51ëIéRâR‘OJiNPöæ›éPâR‘ Pj2¼ò*r‡·4Â2*KL®Ë¥1—Ò¬2ãÜTeNx¬¥E"»/çQ••a—š—ó¬eXÈ®ËëQ2û}*ɉ—?…a(›E•Y:‰ÇµZeüê^:W<¢m™}*\}*Û sP²ã¯Jæ”Mã"£/­B@ÅZu>œÔ =¸®i+1eVZ…×¶*Ó)¨\uõ§tE”äJ©"uÈÅh:þuVT÷®ˆHÐÍ‘@üjœÉ×ZR§^=jœ©ë]”ä3.dàð*„¨2kZdàóYò¡ÏJí§"Œ·\1¨U¹Sæ=ª» î‹"jè®Â¢aS°¨ˆâ¶G H0¯jýããÄÿîÚ9ëÅÜq€kÚ?g@Âï ¶;Ï]4>#ÃÌÕ©ä¼âý’Þ s¥[nóg1ã÷·Æ³ßÒ³7 Ùø€Øø‡/ý‚­ômÅ`ïö¯™Í¬ñrÓ·ä['_ìpwïù²]¢ßíFÿjó¹OP…e¼:ö’Ÿgƒì¿Ú¶?½óÎÿøøø6c¯{ßÚ¾ƒ¯³©éó±ÿÒ˜ëß«ê²O÷w§_Ñ!Ÿ+bV½?VQE{ˆQEQEQEQEQEQEQEsþ;ÿ’yâ_û]覯ŒæÑµÉ¼›ÉôÝEþÝ*ˆ¦xý¢Gäb>fn£&¾Ìñßü“ÏÿØ*ëÿE5|­ŠôxN¤â+ã.«ró\1TÛ ÉÌLgç)öÀ’»ñŒ&2@9ȼ7®Ï©Ë¦E¢ê2j¦ùmRǪ̃¼rÉŒó/$wµ™]¾—â}'M³¹ÒRêùìŸÉxî®ôË{ fbQm¥m‘©3“ìr¤ÿËB”Õ¯ÛUÖoµ2»¸’vóKe˜·%UA<öP=é@&ðÖ½lá'Ñ5(œÜ-¨Wµu&fPË#ï• …êAá­y¯ÞÁtMHÞ#ª=¸µ1Yº‚¸È%U˜áIè+¤ŸÅÖøÇNÔ­g¾º±¶Ò“MòÖ<Â>ÌmجEÝrL› ‹2œgq\ñ”W¾¼Ò-n.Ù%{UWÙÆñFn]”ÃÊ£|è@Ëä©bG 0ô ëÝ­ÍåŒæÆÚ)¥šðÄþJyQK€@bì½3Q¯†µæ{$]R/~…ìÔZ¾n(bcãçH9àæ» Kƺ¥¬ÞjϤ³›}NÒÖ%D ¶å®]$vÝœƒs° ·8ØlMñKºñ-ާ;Ý¥¹Ö#Õîmíô«XŒmvX÷©prå|ÇdÀÜÅX¶‡‡Ãº¬®Uì.áɵ Ïm!¤‰>U'a#þîHÉ$WN¤Ö~º}Ù³DW{ yj¬å–Æ,¬ ÷*GQZš>­giâ««Ûû«ë‹[ˆ¯!{£yßΆHÄŒ…ð[.þ¼š¹mâ¸b·Ñ­ä7m†dcਚà\€ê3ŒbXƒÉÐàdëBÖ,tè5Í*úÞÆ}¾MÌÖî‘ɸn]¬F@$c¨¨ôÝ'RÖnßKÓîï§T.ÑÚÂÒ°\’Œ3î+´ñeî™?‡µ+ȦÿN×µXuCÚa“Ê]—£Û1]†e¤ØÏ»ˆ×cW7£ßé¿Ø×ÚF©-ݼ7]-Ŭ ;‰e]…Ð`‰‰Ý» `ç "ÓSL¹Òíܰ.Ž4ëyå‰cií«tYÐ3Q†là2@ÇŸR†_ éúZ¬ž}½íÍñiYP9ÎsgŽã¯` º(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÐÑ-o/5ˆÂãì×n¸Êy ™L¯Íòª–ùAn8àV}nxjxsªi“KT²6É4ŒRE’9pf‰Sq .ýÄáN@2ïåIõ™bmñ¼®ÊÞBÃI ùhJ§ûªp:+¤_ÞµÔ–ÿÚzh{W’=@“.,dH¥•’OÝüÇlŒÇ¼e:ò¤òóÁ5­Ä¶÷I ñ9I#‘J²08 ƒÈ ñŠôñÞ›e¨êÚ•ƒjIw«ÜO|äF±›)šÞê4XÜ92÷Yß„ G¤œ~? [Kosv¾(ѾÇnðÆ÷&;½¦I…P#vqqŽG$ð9ùãXn%‰&ŽtG*²Æ+€~ðÜÁëÈÔ é,üo¬Zi:®ÍgUM^þîÖV½K§ñÅÊUŸvã÷ãÀä|½°+—  b‰4í/P7_h²x¾ËîÄ~KÄÉÁÇ@û‡ßó7œ¸õÐ\įÁ¿Ùóñw©]Ãza<40LjØÿ×O=ˆ,jØ+"šç袊(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñïÚ ÏáÜÓÏþÒ¯‘й¸ô¯oý¡¬¾#§úHÿÑUáÓ|Ä0Ǹô¨{ŽÊÇ·þΟøIíö_ý­^ï^û8á&Ïý:ÿíj÷z¥°0¢Š)ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šàþ3É)Ö?ß¶ÿÒˆëåõ¯¨>2ÿÉ)Ö?ß¶ÿÒˆëæˈÝîN½Ùz’-JµÔË\lú:h‘J· ò8ªñŠ»äÒ°¨ÎűnäsW¢N:Õhw«ñè+‚¤€±{ÕØÔƒëUãNù«‘ŒW ä"h×'Ò­ ¨‘}*ÂŽ+–l–H£Š™Fƒ½Nƒ‘Å`Ì$Ç¢þµ:. bjGN+XD盋ÅJ£§Š=ªT^‡Öº¡žLr¯lÔè9éÅ1W:ŒñÒºažLUêP;š@¹ö©É®ˆÄÆLU^æ¥UïH£žœT fº# 0'"¯aB¯j” Vщ”¤ v§Í9WiÀzVª&nBŠp§Á¥­Hl@)@ôà™üJµ#Áô4`ú’ŒJ|¡q›=è+z“ÐуèiòŠäX>†ŒJ’Š\£¹4¯z›ÒšWôœF™) ƒíR‘ëM+ÍfâRd$bšTSê)¬½ÅC‰i•Èõ °FEFGcY8š&@ËÜTLµa† FÃÖ2F±evZ‰—5eÇ ¨˜{V‰´YY–¡eïV˜sš‰×­sÊ&ÑeFôâ¢eÏ«$s޵ nkšq:"Ê®;Ô¹«n9éÅ@Gé\ÓGDYQ…B⬸æ¡qÖ°Z3¢,ªãŠ®ëÁÍ\qÅWqÁ­¢ÍÓ3äÒ©Ìœõ­Aôªs'=kªœ‹FlÉÁæ¨Êœõ­I@ÁàU”nk¶œ†dJ¼ôý*›ŒV”ªA5BAȯB›ج¢"§aPµtD䨈Xu¯hýÿãçÄÿîZ9ëÆW³þÏñóâ÷-?œõÕCâ<Õ~çæZø›s-·Ä6ò¬ç¹Ý¥[gÊ(6þöã®æ§¥bï>Õ½ñãâÿØ*ÛÿFÜW7“êkç³Dž*Zvü‘éäëýŽýÿ6M¼ûQ¼ûT9>¦ŒŸS^)ê Ô§Ä<c›ËþÕ±ýþSgü|FznÝíÓô澊¯ž-‰þ×Ñùÿ˜­þ”Ç_C×ÓäÿÀzuýñùò¶%kÓõaEW¬xEPEPEaø³Ä°øWAŸQ’ÞK©U$0Û¡ edå#qá@H݉=”à…;”QEQEQEQEÏøïþIç‰ìuÿ¢š¾5Õ4ô›x%šâÝÚUVòаe Ü H§k|ñ–^:ò¹û+ÇòOѾ‚Î(æ;”Í*…ËFF\ùž`Ü6€ÒEññgi¤Ól|æ»‹Í ”‘ï•% ;1'8yC˜ð)€ª³ÏéšœZš·]Ž£ ˜>]Øqµ†pCFÈã‚xÝ´ä @QªxCKµX´ëYo›S6——‚âqåÅ"[Ëp¬†¡âc¹nY°ß)QËËèº=ƽ©‹ W&1K(iå¦#¤l±áxCÉÀõ sZšu-NÔ,ðZ â“G&¢ˆË<‘Ë,’ÈŸ{b†i_%UIRW;IŸ†5k}Z7·Vßi‡ì—P˜NpæH$Ca”íËŒàƒŒãš¹máuþÖ[iî㸴›L»¾¶º´,a30 :†Ì…”†Px8àƒUíü/ss¥¥Ø»´Iæ·–î &/æÍ{üÉ…(ò¥á˜1ØpWt‘ø²xµ‹kÔÓ¬E½µ¤¶QX~÷ÉXeY®wù‡&i%ò p@íüQsm¥¥ ´´yá·–Ò ÖæÃ›üÈÔAóeå”°ÞpFh†¯àø-üE¦é:V¯iy%í½¼ŸòÔÙàŽBNèÔ°b䢠g# ·y põ%ô]Eì乂ᗠ¼;†%YYUу)]Tñœ`‚n?‰æ˜Zyúv›<"G,’ÀY®cHü¤G$ü¡cùAaà1%ÕXSÖ5gÖ/w¶‚Ýc‰!Ž(wˆ£nvglæ8(ª€ŸEPEPEPEPEPZš› ýÅÌ·"XY[µÕÓF@b …T‘£vnýĦ²ëSCÔ¡°¸¹Šñd{ ÛvµºXÀ,Êã‘’’,rmÊîÙ´Ð|ò,×ÊÇ;–X£,U?tn$àtä“êMjx_Fþß×¢ÓöO&bšo*ÜfI¼¨žO-88fÙ´Î0rça¸–$š9ѪË`®ûÃp¯ P*Æ—©M¤ß­Ü+Ç %dУ¡Á ¬ËAÈ àЧ‹4K=êÁ¬&ó-ïm>ÐÏùL%’&O5UVL4GæU Î`5}*ÆßUÓ¯mV=š•¼R]ÀêÇ÷è€#`xQ^@Ü}Ö\1dÛ_VÕŸU–ôh-mí¢òmí Ý²$ÜÎ@.ÌÇ.îß3½€4«ë}+N½ºY7êWIi*ŸÜ#€$‘‰àîFxÂó÷™²¥Sp=Q@Q@Q@Q@Q@Q@Q@‘ðOþG[Ÿúðý}G¦ÿ«òçÁ?ùnëÁÿôduõ›þ¬PþÑCø{wý<ãÿ!W††Ïíÿ´X̾äþ“ÿ´«Ã2OAøÔÛPg¿þÏQ4Rx—qý—ÿ¶µíõâ?³Ù þ$+œ£c?öÖ½ºˆ|#{…QT ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(„øËÿ$«Xÿ~ÛÿJ#¯˜TWÓ¿³ÿ §XÁï¶Æëâ:ùŠ0ÁFâ õˈÝþMðËÔ•EJ¢£QR¨®)KM!çÞ¯À¤°íTà^æ´ ‘\µYÒ\9«Ñ¨ÇJ« Ž•v$>ÕçÔb-Dœu«‘QUãÒ­Æ3\Sd²uò ÛiÐc¼þõׇøŸÍÿƒó&ø§{igñý*ê7éVû|ÙçÜgú×3ݵÔeíî"™ÁhÜ0ÓŠê¾'>!Ÿû[èÛŠå7Zñ3$¾±.ú~Hôru/©Ã]5üߟèM‘ê)“\CoK4ÑÇõw`üM3põ£põ®»ž£½´ ;TÓî5í(/­¥‘µ[,"L¬OúDg 5ô­|ßbAÖô_û ÙéDuô…}UobíßôGÇçÜßY3û+óg?¯¥ìk¿›]ŸIÒ,­<æ{8£yæBâHŸå nÜ—Î~Z-u=GJðöq¯Ãóý’1ª\†_ôi¶.çeQ·ËÝ»s)Âðq³s%}b×Ä—zâ³mqi¨j2j›ÌvòE3™·HÌHBì³;p:—>¦¤µ±ñØõ{]>;é¬aÁÔ…‹4°a i<¡PUˆbHàh¬Oh2ê:µ›O©@š%Äö—“‡IMÃ%½Ô‚HÓjì­OÈY²×<ž½§ÙÚ.™w`'Ž×Q´7) ò ,K$EK…PÙ1ÎÑØç2jSøªÚËM}R]f+CnɧµÓJ¨ad Â-Ül(T¼@éYöÐjZÍŵ…¤WwÓª··‰ZV –rFN2]ˆ¤úÐ垇¥Ïáv¸·6ªÑIp‘©Ûˆ°Þ‘”ÄÑåfYC/Î|²±Ý£à_Û_\ZZê³ÜÍ¥ËÉæeq¿&ììëÏÝöªòëºÄßaóu[é?³ñö-×~ÍŒcËçäÆÕéº=(¨Ö¼!g‡,u=.ËUŠêûì~M•Ä‚go9ïclh[p·ˆ®ñž¹¡­xúJê§UŸíãíÒÚF|Ç.ÞY££H ¶|†%̨q%pŸ7sâbébÍôñȶ’YË,r¸{˜ä–I\Jsóîi9ààdgš®úî±%Õœš­óÚÝÊg¹…®¤Ò w\á› žxÚ]ø+A:¶µme>¥ähw³ArftÝr© ÌØL.# Z”ÜwîÞjãa§¦x{ÃWvw:Íì·Úv˜¾DpÃy3)gÌ2³Go'˜£ìíÿ,—’Ã?'ÏÉ[R[‡¸]BìN÷ tò ›sL¤•œä¸,Ä7Q¸úÕˆüK¯CªMªE­êI¨L›%»[§ºñÃ>rGʼØzP}ZÉtÝfúÁ%’T¶¸’’HZ`¬FJ7(N>éät5ÖZéörxÃ>¸‹ ϱÉxöÒÞi®P:ÈIVÿV³*9+‘´ÈÕÉǤêSisj‘i÷o§Âû%»XXÄÇ øÀ?2ðOqëZ’ꚦ•g¥s=¥õ´[ôëû[„[H]™O½ó»ò*LˆÙÀb/ :÷Vû6«5¤°Yù_jŽ)&’A3y¹òÜ"âyxb ¬8çSÄ›¥øhépi÷wzµ¦±©Z›Ø@u€@YÚ1m2BïùNöÉ—ÓµmzRâ÷LÔ5$Ô&Iyí¦q+¯úÉ 2œ‘ò–$údôªpßÞ[ÙÜÙÃwà `u\7/s«jW–ñÛÝjsÁF‰³3*ª'(wvÜqÔÕˆüK¯CªMªE­êI¨L›%»[§ºñÃ>rGʼØzP¨hw6·ººZÃwsg¦\fº6¯A¼¢ŒÆXºÜ玢¶Þ!Ô¤{Û‰îd¸¾¼A·Ó»I?—´« rx ¸Rzír˜58oï-ìîlỞ;[­¿h…$!%Úr»”pØ<Œô H¿ð·†õ/^ÛCô6©âTÒ®'Ž ~Ðóm1(B#XÌXÁݼ`þï¥ro£éº†su¢A©I<7¶–1$¬®× *ÜÁr¤˜“±’76Avúî±iy%å¶«} Ô²ùòM뼘a¼°9-‡qž¿;zš5mJ;‹»„Ô.Ö{Ôtº‘f`Ó«œ¸sœ°cÉ9ï@Ò¼k¤Y¥Ôš›Úë°i·Ð|ì’33.çßn©Ý1n—x, »—Ï<×WÜ\K$ÓÊåä’F,ÎÄä’O$“ÎjÅæ­©jö¶÷º…Ý̉²Ú9¦gXWa8Q…ÐzPä:fŽºuî»s§j«¦,°Ckkö´YÌfO8õ”5»®O_”ççG¼Ž]I¡³¾{]>_.âYmŠrÅWÍ"6$ci=r2jHüK¯CªMªE­êI¨L›%»[§ºñÃ>rGʼØzU8oï-ìîlỞ;[­¿h…$!%Úr»”pØ<Œô  ‹øšx7ûB~nôÛ¸lŒÇ–š#sŸúçä0ä•‘W!cQQøjsªjsEãK²7) Š^F’8PrV•_i6ͤaŽ)ÞêiÓ¬´è!òm-wH¶öyœ(’Bp:ìP`UêÛ™£Òõ)´›õ»…crãx䬑ºt8 á•™r#9¯<ó]\Kqq,“O+—’I³;’I<’O9­ÏÙÛÞø•#º0,qÚ]Îá Æ¼’#:€w*²©+µ² àáÎak‰ZÞ9#€¹1¤Ž•sÀ,ã¾}O5­ÄWòÉ ñ8x䊲09È óšé_äªÑ»x}Q@Q@Q@Q@Q@Q@Q@‘ðOþG[Ÿúðý}G¦ÿ«òçÁ?ùnëÁÿôduõ›þ¬PŒþÑ+ºO®qÅÏþÒ¯uW¶8¯pý¢gðçý¼ÿí*ñ-¬¨r>•-ê¼þÏŒKxÓìßûV½¶¼Göy9_ `³qÿkÛ©Cá*[…QVHQEQEQEQEQEQEÂ|dÿ’U«ÿ¿mÿ¥WÌk_N|dÿ’U«ÿ¿mÿ¥WÌk\˜Ñô9'Ã/RU©“­D½ªdê+ŠGÓSE¸:Ñ€cF­uäâªÍ‹õv/éU¢ê*ô]+‚£j.•i:T¹u«Q÷®)²I”w©Ôw¨b§QŽ sÈÊL‘:аŠ:Š1‘ŠOjpG4Ù2^Õ:ǽD qïS •uÁ²dоªtê4z™0+ªç“ c5(Õ52õÓa&9W°©@ÉÅ1z™Æk¢(ÂLp8©TtÔ©P f·Š1“:SÀ⚣šzÞ(űTdý*Nô”õ^õ²D6*®>´´w©qõ­3lj®y=)àÒŠ*’&áE(RiûG¥U‰¹&ÑéFÑéE‚ätSÊúSHÅÆ•ëL*EIEKC¹5—=:Ô¥})•-™1—Ž•;.~µfÑi‘u¨ÏZ”Œk3YI&@ãpNFF*&XÉÅ8¡aÏÖ¬0ëžÕ þÏ$m@Ã’DÃÔïÚ¢aÎkžhÞ,®Ã" aÎjË}ãP:ž•Í4oVeìj«;Ô,§®Y£¦,ªÊqŠ®ÿz­¸ïUŸ¡®I£¦ ®ýêjÃŽ*ª"Θ²«ŒæªÌ1WdéU$\äšèƒ6F|Ý R“­iJ0 Q–»i±™“zúÖlíY—ÓÖ³¦ã5ßI”g8ÅB¬H0j®Ø™TD-Ö½“özÿ¯ÿ¹iüç¯nõ쿳×ü}xŸýËOç=uáþ#ÀÍÿ€ýQ'ňgþÁVÿú6â¹-ãÞºO‹–éqñ w´£n•o.gOùk?]¤f¹]ƼœÁ/¬Kåù#»&¿Ôá?Í“oôoõãFã\\§ª]ÓØwEõ²ÿÒˆëé:ù‡M·Câ}ÒïþÕ²ãÎ}¿ëãw;Júz½ü­%EÛ¿èŽÏ¯õ•~ß« (¢½#Ä (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWÉ^!¸Ón­õ‘oŸÙµEŽÈZª©hXM¼ärà•Œää.@] â¾µñßü“ÏÿØ*ëÿE5|k¨xoWÓ.ímn,.D·a>΢ýë2©Ø¹°.Ðñ@ü+ÿ1¯#þBÙSý“ÿóúñÿßhëø|Ûh³ÿ’y¬ÿØVÃÿE]ÕkM[ šÏGµ¾¹Ôl%fÍŒù‘”|ohuÃc¨3ƒV`ºñZ>« 7“Âö–óʱMo2Ü}œ,¥çŠEòðáþEtBUNÒ[-^3À&òå_XœÆ»v¸’4s¶Ahí'¾è¡ÛÐyƒæ=êêZ=® ¶RXµ½®•©iÒÜMt2ùuä¤Q2¤‡qš"Òªt8ýØYAãÿ枤ÿÐWýþý¥tÿ·?½ÿþ:çêÅÕõÅï.$ܰD°Ä¡Bª ìàd’ÇÕ™˜ä’H¤[µÐñLjãŽ÷–¶³éóA1Ò¯ ·´‘žÎE"22–Råwòï·ÝR<ÎxZÚâXÆ^7(Æ9ÔqÃ)!‡¸$ÕQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅxßí Ÿµxh-ÿ b¹1;£èrO†^¤ËV#¨§¨®QL½n3øч¨ªã +B’+†©¡zH«ÑŒqUaÅ^Џ*2KQt«J;ÕXÆ*Üc5Å2Y2Žõ8ê$©”f¹äc"tê*xÆI ïVS¨­ ŽY²T¥Nƒ§½B•:ö®¸#šdȾªdëQ§z™: ê‚9¤Ç¨ã50¨ÀÀ©”d×L„˜ð1S“Šbu©Tæº"Œ$Ç“Š”t¦(9ÍH¿zº"ŒdÇR(ÇãL5(è+h£&(©ÀÅ"Œ­9A&¶HͱÈ;Ó¨ zV‰±@ɧ…ÒŠ*’%°¢ŠP ª”Rí>”m>”XBQE†4®y¦ƒŠ–ŒÒhi‘ÓYsÍ=—JJ–ŠLŠ˜ËŽjWæšFF+6‹L„ŒŒT}êZ† dÍQ5 ­LýFâ±’4‹ aƒõ¨[©« ¨ŸµsÉÅ•Üc"¡a‘VsP¿S\óFñdÒ o¼jÃGŽõË3x•Ÿ¥DÝjËõªí÷k–héƒ+7Ý5^A“вëÆW½\“:`W~µ MNÝêktĬã9ªÒŒU¦ïUfë]7Eº£-hȸ÷ªS šë¦Ê3eëYÓ®1ZRðk>aœW¡L£:QÞ«5Y“¥Wn•Ý'± u¯dýžÿãëÄÿîZ9ëÆß88 Ù¯býž‹Ÿïe'e§Ýï?½vaþ#ç³à|п Æ?èoÿ£n+ŒÜ}k«øÅ’|CḛãJƒ>X^{?]ÀדêkÍÇG÷ò~Ÿ’;ògþÇnÿ›%Ü}hÜ}j,ŸSFO©®>SÔ/élOˆtOû ÙéDuôÝ|µ¤E'ü%zŸi—gö­—î°»×ÇíŸ~µõ-{™jµ'ëú#ã³÷|JÓìþ¬(¢Šô(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM_ê·¶7ðÁé×ÿkW»UG`aES¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(„øÉÿ$¯Wÿ~ÛÿJ"¯™V¾šøÉÿ$¯Wÿ~ÛÿJ"¯™W­qâwGÑä ½IV¬E÷‡ÔUu«0õü«†GÓSØ¿o­i@0g[‚HúÖ”=EpU-—¡ê*ôUF¢¯E\]A•f>õ^>•b>õÇ"^ÄéÁ©ÓƒP¯Þ©×ï Áîa2tf1úTŒV½tA³dËÚ¬'z®½ªÂw®¸³&N‚¦QŒ …: z×Ty§Z•Îj$9©×îŠê‰Ï"DéR§JAš” Vñ1‘"t©W¥F*Eé]0ôæž:ÓS½H£'é[Dͧ¨ã4Ê‘Fm&-H£˜:Š’´‰œ‚Š)Ê;Õ"@ riÔQVHQESHî)ÔRhè§0Å6¤¡ÍGRÔm÷LŠˆÒ3QÔµ Íš"7ëLoºjVéQ0Ȭ¤i&ûµ}ÓR‘Ú£#µa$kÐÔL2>•3w¨CXHÚ$Ú¡`sš†GÒ¡~•Ï$oûÕ]úU†ûÕGË3¢$Ö«·Ý«.;Ôq\³GD]úÕwèjË3UŸ¡®I0+8#5ô©äè*®~§T¥UdŸjµ'J¬ýëh bœÝ Q—­^›¡ª2õ®Êe"„à‘Ç­fÍÚ´å¬ÙÆ®úCFtÕUjµ?_«=wÃbg± W±þÏñ÷âo÷-?œõãÖ½ö{ÿ¿¹iüç®Ü?ÆxÇû»õDÿä¡§ý‚­ÿôlõÃ×añ¡æOˆpù1ÆùÒ Îù ã÷³ú\Fñï\8Ø¿lßõ±Û“;àà½6OEA¼{Ѽ{×/)êšz7üŒºý…lÿô¢:ú’¾QÐä˜ø¿B_.?+ûVÏæóïõéÛ¾õõu{jO×üŽÏÝñ+ü?« (¢» (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM_WÛþ;ÿ’yâ_û]覯”âð®™=ÅüJ×h4™äŠè™Tý«d3ÊJ|£ÊÏÙ˜s¿`<íÃq”WomáϺÛßÏö謯mV[heºX‚Êeš!Ýy,˜ÀÌ»‘²ëååå“ÁÚ®ˆßjÔnãÕ¥·ºº‚ a•%U…åMÄã'ÈmÌf]›‰ „Ë€ptVçƒlìuè–¼—wW±A,I/–X;ûØ'#8Á# NF¥°ÐŠì"ðöqgÆ—Éu§ÝêvÒ5Â2A&|Dëåƒ#n~pÈðvü¸kž7ðV›áû[«­:{²^ýŸeë’¦[¨ÊªóºÍÛ§ITq°³€ptWA i6wzuÕýå­õöË»{(lìeI$“ JÅ8òˆÚ$¸äcŸ‰tØtojú]»HÐY^ÍoHAb¨åA8gÐP]êx/E{M_Lh.íÓNÖ>ÍsªÜ8eœ[ÛÝÉ(‹lYˆ7”¤Þ•܇ ´ÃEÑ­¼J«§KöÛ þå<äwUt·¸kÉ~f0Á‚ 7”Éáè®Ò×ÂúxNÞêëS‘ukË+‹è!A+±4«·ËXX0>KeÌ©´1%HO›CLÐt/ˆÚ~”Ú~¥r–:ìZmä“:=½ËCåþìB|£¿rî—nHÑ]e–‰¦ÜÛÜj§HÖ^Íî-­ll#¹_>f”J7‰|’n·uÚ±ò[Ê݉|) ÚÝÅ¢Û‹µ¼‚ËRxçíµ¸¼`eÀÌ®ëÌü›6©ùÇÊ<Ίí-4+Vo ÛNñÙÁ.sww2®Òâ®Ü–!Xä¬Awmb+`)ÇñF›¦i×¶Í£ÝIqgsn&Va! wº®ñDdLî$¯%I tWQg¡ésø]®íͪ´R\$jvâ$,7¤e14yB–PËóŸ,¬D·HžÐTêË-¶³³F½žÎktŠ— µÔ­åþç÷guºpL˜wà3¢½[ðVƒá›[Û»ùõ+´·¸ŽÝ!Ò#+y·¹.U¶Öž`ù[¶ÿ¬úž‰£x¦É¼¹çÓµÛ{4¹1…b¡nÃc©PÅ‘žÃ®(“¢»Oø_CЭîcÓu9.¯4ûß°Ý€%ufÃå‰0¢Äs—98l!-£Øi¿Ø×Ú¾©ÝÄ×Z­½¬ë•emåÙ`HÛ·ÀäcŠï5ý?JðÏ„ï4ij’}Iµ‹Í>Kö1á…³BTª´lÑ‚$#êsÅÆy¿ i–z¾´moæžU´º¸y PξTH0¤€yAÆFzduôWie£é©«Z\[Á!³Ô4-Bò;{¶YšHne¨bàí\d«“^ÏúlÚ]œr›¿í í2ëRŠu•DQ,îÚ=¤¹o³·Ìqæ”íù€9:+¼×4ïÄšzYéz•žž–Vr^Í ”³IFvD6«#;áÉøC´¡æüI§ÙéúŒcOý’h„±4² U×$nI®õ;{¢2¶äe „ z(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX ý¢Öøw€x¹ê?ë•xžõ‘B‘·•í´SŸÃl;}«ÿiWˆ¶Xd¯^â¥î3Üÿg%Øþ'\ôû/þÖ¯v¯ ýQQ|F@pÇìÛ·tÿ–½+ܨŽÀŠ(ªQEQEpö6yøFÒ}MÞ/£)m']™Ã¦vpmòX9óEwU=6òkËv76’ZÜÄæ9¢l²î£àB!€pB°e(¢Š(¢Š(/RñŸ¥\-¼ÿk–rÌv–S\²)$Â$b ÀÆv¶3ƒ‹–7ÖúœwV²y¾@%JA!•”à«*@ ‚Vœðé~'ñ Ô¥Ž#2G{ ÄÌEªF¨É¹±Är,ŽÀ|«ç©Î\Ôž ù¼>òŽc›P¾ž'$îåtu=Õ••AÄøÉÿ$¯Wÿ~ÛÿJ"¯™W­}5ñ—?𪵌ûlgþ¾"¯˜c ÷?ι1;£èrFÔe§RÒUˆzþU]*Ä=*à™õ0ØÒ¶ÿ Ї¨¬ûoð­zŠàªS/CÔU誌=E^Џ*½J²ƒ«GÒ­/Zâ‘,™~õN¿xT+Ò§L~5Sže”ê*tç5ub/½]09fLƒ?…N€Š‰;Ôஸ#–D©ÐU…ëUÓ « Öº`a2eû¢¥_º*%û¢¦®¸œò%©j*–·‰ƒ%§Ž”ÊtÑ=;Ô©Þ¢Nõ*w­¢e!㨩*1ÔT•¬L˜£¨©*1ÔT•¤HS×¥2ž½*Öä±h¢Š¢BŠ( Š( =)•!èj:™‚˜Àç4úkô©e!”ÇëO¦?ZÍìZßtÔu#}ÓQÖR4‰êj3ÔÔ‡©¨ÏSXHÕ¦¡nõ1êj#ÔÖ6‰ P?J°ýMW~•Ï3¢$,9ÍDßxÔíÒ o¼k–fñ+¿J…úÔÏÒ¡~µË3¦$ ÷MV—¥Yoºj¼ƒã ®êCFtÝ Tz·7Ý5QëÐ3Ø…º×±þÏñ÷âo÷-?œõã2‰ [*úî\ÿQ^Ëû<>'ÞÊNËOº1Þs]¸ˆùìå¿`Õº¢ŸÆcˆqØ*ý=p;½«¸øÛ:Áñ ÁÎt¨~ìlßòÖA\óí\¸¸¿jßõ±èdÒOŸÍ’îö£wµE¼ûQ¼ûW7)êš gÅZó³ÿÑé_V×É~¸Sã,>ïí[>|¶Çúô=qŠúÒ½\j›õ>;?’x•göVQEvQEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢š¾-mcSsf[Q»cdAµÌì|Œc9ù~êôÇAé_ixïþIç‰ìuÿ¢š¾6û?‡·Ä?µ5M¥±!þÎ*¸<çòsŽ8$çŒEâMv N]N-kQP™6Kt—N%uã†|ä•x'°ô¨#Õµ(t¹´¸µ ´Óæ}òÚ,Ì"vã–LàŸ•y#°ô«ëkácpêúΰ!¥iQ-“¸ûFnNrxå†ÛÃc™†«ª›¡¿ÊŒé‘ìl³syù\¹Â¹ nÆH\Íkqż²CÒwÛF8$çŒZøWí­¬ë"ŠQÆ“bÙ;_´à6àäç'Ž@0è­ƒm῱ÌÃUÕMÐßåFtÈö6 Ù¹¼ü®FÜáNÜ7c&I-|*³¬²Ä¥´˜”ªí<¨ûIÜwm8à“ž0@0è­Áká_´:¶³¬ˆ)GLE‹dî~Ó€Ûƒ“œž9ŒÛxoìs0ÕuSt7ùQ2=‚vno?+‘·8S·$ ØÉÇ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñŸÚ'ogþžö•x¢žØWµþÑ_ë|9ÿo?ûJ¼B¡îЮRæ=|‡g à­¯f¯ ý‚ù¾'*0Ùö­{VŠ¢Š*À(¢Š(¢Š(¢Š(¢Š(¢Š¯uag}ä}²Ò "Už:0þ\‹÷]sцNäUŠ( ã'ü’½_ýûoý(оe^µôׯOù%z¿ûößúQ|ʽkº>#øeêL•b¿•VZ³_ʸf}==+oð­zŠÍƒ¨úÖ”=EpU)—¡ê*ôUF¢¯E\^¥YC“U£éV#ï\r%ìX^µ:ýáP/Þ©×ï ÁîsÈ´EOÁ5^>¢¬'zéË2t?­N§#éU×µXNõÕsL™: °½jºtaz×Ty“/Ý*ýÚ‰zT«÷EuDç‘5KPƒ‘SWDL-H: Žž½+x˜²DïR§z‰;ÓÇQ[DÎD•"ýÚŽ¤_»[#&8u%ER/J´Cœ§µ6Š´A%€æ–¬¢Š(¢Š(Je+šJ†R ºÔ•}ãRÊBS­>£'&¡–†·Ý5HÝ*&û¦²‘¤F¦£=M>£=Ma#TFzšˆõ5)êjïXHÚ$oÔÕwéSž† ~•Ï3¢$mÒ o¼jf=ªûƹfo»ô¨_­Lý*ë\³:b@ßtÕyjÃ}ÓU¤9¹&tÀûUwëSÉÀú×7SªUi:U™:Ug<ÚBا7CTeëW¦èjŒ½k²™H£-g\u£-fÎrEwÒ(MÐÕG«3õü*³×| žÄ-Ö½ö{ÿ¿¹iüç¯nµì³ßü}ø›ýËOç=vaþ3ÀÎÝߪ3~6|C‡þÁPèÙëÏ7ï¾9O?íüÉQ3¥CÌ{=yÔs$«º9Æq• ÖX˜¿hÙÛ“N?S„o®¿›'ÜhÜj=ÇÖšò¬jYÝUGRNacÔm%vlxu‰ñnÿa[?ý•õ¥|‡á‹¨dñ‡Ñ'˜ê¶˜ ÀŸõé_^W£„MAß¹ñÙôã,L\]ýÕù°¢¹ÿßj–ÖéòA-¨ZErî»’K˜£(£ ÈvËÆ0[rtÔxEyüš–¯q¨êW·Þ#ÒtØîäˆË ­¢ÛZƇ`fi£2º¶Ñ!‘T¢‰0HÌ:ÍK[‡F¸VÔ¼»m5Ð§É Ç&OË&p¬N ʤ p J+>Ööò÷Nžê;)Žãi˘ÚEÇÊdI‹qÏf ‚@l¢óöúö©iðãYÖn¥‚ëRÓÿ´ˆ'dn`šeA°…Â(ÆâqÔ“ÍvW/rš—‡%³½›]¾Ô­$»ŠÖ⸭ÁQ+ѓʉá#Gœœl/Ámµr é×7Î÷:Èy»õ«ÄPIÏ ²€£Øj5/çøŸFЖÞI§Ô^@ò)mÕcwRýòæ6 8ÎÇ9ù0w+Ö|u}â[]bË^¾µoµ¬Ó(7–«o,J"/²µ‰QæHÀ9®Â€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWÄöÿŽÿäžx—þÁW_ú)«â (¢Š(¢Š(¢Š(¢Š(¢Š+¤¿ð¬u¼—gÄmý¥µìvwM¦¬²4eÄ„2ùˆ‰ ÄO­ƒÇ89®n¶..¿´tÍFÓ­çy"ó ªn3]K&2˜É9-×r‡$’OTÓfÒoÚÒfÈD‘$Œ’²Fèd†VVÁŒà€r(N¤Ö~º}Ù³DW{ yj¬å–Æ,¬ ÷*GQZ%žézd2Ç8Òì…³ÍW‘¤’gŒ‚¥dÜ ³p8a޵í6ÇÃ-¨]Ü^[è÷¶©a)‚6¸’æ6v3(û][o–wN@9ÚxOÄ’Ek,~Õ^;¼}™ÖÊB&Ê—>o”ã°'¥XÓ¼âMR ©mtkæò-#¼ öY MŽ `)Ýœ³ÅQÈ?-uÞ4ðÜzãjr&ª²]x‚ß\¹ l#òüö0 Þ7a¥Ì$dv)\?/§êÖi®Eu}5®«B÷Æ óÿ¯Ža#F_ Ìbüo'' cL¹:3ê¦9¢Ü-°ÄûYÊ– >Ý™ ‚ÀüÀ€FH/4KO·µ¸½Óîí »MöÒM "̸(Hà 09£Ö´#Ô´ÕðÖµ¦ªÝÂ÷¶×VjBÊ6Æ&R’>WlÀî rW Ïx³Ïª½ãùâ7—,Šdf%¾Ö6ȉö•x/^kÛh¼ùÞÇý<ÿí*ñÁ©`{ßìó*H¾!ظ!mwqß÷µíõ៳®3âRû/þÕ¯s¢QE@QEQEQEQEQEQEpŸ?ä•êÿïÛéDUó*×Ó_sÿ «XÁï¶Æëâ:ùŽ=؈'Ô W&'t}HýÙ/2u«}áõ]jxë‚GÓÓØÑ„ô#Ö´­Î@õ¬Ëº+B‚+†ª44¡ê*ôUB ~:óê]C…f>õQ?JµÅqÌ–XC“VäÕtëS¡Ç5ƒÜÂe˜Î9«j²*Âu¼Ë2Âö« Þ«!çéVþµÙsL: N WCÇÒ§Sœ]Pg4‰“­L§µ@¤š™z×LY„‰“¥L¤‘Í@‡œT¨{WDL$L*EéQ!íR/ZÞ,ÆDªy§Ô@ã‘R‘[DÍ’ƒ‘OSƒõ¨”àýiõªfMÒƒƒMS‘ïKZ" h¦+c¯J~G­Zd4)Á©´S¸‡äzÒäzÔtSæ -znãIE+…‚Š) Àœ Ž•›?JJ–ÊHBp*:Vlý) ÀÍfÙi n´ÆéKQ±É¬›5Hk}ÚŽ=¦7ݬdi2x&¢= HÇëP¹"°“6‰­Dý*GíQ1竞LÞ$M÷ªyÏJ™ºÕwé\³:"Dý*=êgëUÛî×,ÙÑBäç]ú°ýj¼‡’+’gT$éP?J•»Ô.s\ës¦$/Òª¿z°Ç­U›­o¡¦èjŒ½jäsT¥` uÓEfl~u›7j¿/&³æ8ÅzÐÌùN*¬ÕbN•]ºW| žÄM^Çû=ÿÇ߉¿Ü´þs×¾pp@=³^Åû<>'ÞÊNËOº1ÞzìÃüGÏg/÷óFgÇù(pØ*ý=yÆEz7Çù(vÿö ‡ÿFÏ^qYb?ˆÎìÿ±Cçù±r(Ȥ¢±±é\ÕðÑÿŠÃÃÿö³ÿÑé_\×Èžÿ‘ÇÃÿö´ÿÑé_]ס„ø©òYÿûÌ¿6eëúlÚ®¼ º^Ú\ä¶+ˆåaÀ<íB¾:u«CRû}‹ZIh,ø¼IQŒ…v¦6†ÆA žAÜ¢ºO çÍ¿ŠD³Z ÛµšWuÔ)=´lĈÖ¬’2®HX„£m!ä ØÍoi¦Írèvvé :l‰¾6*0 …‰ó¨]ªx,w6›”P=6Îk v·’îK˜ÑÏÒäȱàa]É%È9$cvæ›.ÛÃ~g…uMþOÝêßïx•Žâi\`‘÷‚È;‘ÜWAEsé§ëå¯öرK[DÈ-$v’B³£(ª“¼&d!ÂãËùú ( Š( Š( Š( Š( ÇòOÓ%ð…•ùóÅÝΟqxÒ‹ø[kG$À(´ ç2‘ÁÚ»™ÊŒ+›×5(oî-¢³YÂÊÝmmV@³9äà¼$›rÛwí…r?Omdšuˆ¸¶´–Ê+ÿÞùË ­!uÆÿ,äM"ä¦@n 7†þÙ>˜ÚdŸè—¶3M;d@С7!öáÚÒo-ã8,ÀUËÿ¨‹LF¥i5͗ڤĸóæ<ÔL",J_vù›î+2åé^$¼Ò-M´QÁ4&S&Ù”¶¢x¥@AVD|>Ü1Ø„T¹?/¤6íoe¦Ú=µ¸´¡·Ï—™#˜ðå æbAgQ†'|›À9ùãXn%‰&ŽtG*²Æ+€~ðÜÁëÈÔ Ž¤žEšâYRàGrËeŠ 'îÄœœ’}I¨è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñÚ,âo ÿÛÏþÒ¯幯oý£ÖøoþÞ¿ö•xš© ŒZ–¼þÏ ¬|HTcþ=r?ïí{…xgìéŒø—ôëÿµkÜèŽÃaEU(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šá>2É+Õÿß¶ÿÒˆ«æEë_Müdÿ’U«ÿ¿mÿ¥WÌk\˜ÑôY'Ã/Re«ÕuíS/Q\2>š™¡nqøšÑ‡¨¬È9QZíÈÅUšPœн$sT"ê*ô]+‚¡%øºU¥=ªš68jÔ}ëŠhE¥éS)íUÔäÔêrkžFE”ê*Ìg${UHÏsVþµ¥6sM—½N½ª²ö©Ó½uÁœÓE¤ïR©ãY: N uAœÒDë÷j`r3P)íR©ãÓa$N *`psUÓ¥L¤‘ÍtŘIŠ”t ’G5"·jÚ,ÆH”Šzœ­D½iõ´Y“Dµ"œŠ‰NiÀàÖ©Ñ(85 9¨È͑ҴLÍ¢Z#¥ `M-Y$8¥¨©A#¥UÅbJ)ýiwzwDÙŽ¢£ÜsÖ‚IëJã°âØÈïL'4QI»”•‚šÍŽZ±ÀëL¨li1›=:R³c¥2¡³D„cQұɦ1ã”™¢BµŸ¥9ŽFN95„™¤PÆ9?J‰ŽOҞǩ¨‰àšÂLÚ(úš…ŽrjFo^õt®y3x¢6$*=ªW=ªrs\ÓfñDoÖ«1ã+ô¨\ãšå›:`ˆ]¸Èªï÷ªf8þõF/ÇXÖOˆvÛ‹ŒiPý×+ÿ-fô5çY¯Gøçÿ%ßþÁPÿèÙëͳQˆþ#:²‹,$ZóüØìÑšnhÍccÒæ4ü1ÿÂmáù2û¿µm8Þqþ¹;gõý|…áù¼?ÿa[Oý•õíwá¾äóÄ–![·êŠ(®ƒÆ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWÄöÿŽÿäžx—þÁW_ú)«â (¢Š(¢Š(¢Š(¢Š(¢Š+Ð9*ìN}«‚¢¥J´š£1W#8¸f‰-¡ÅX^•UMN‡&¹¤Œæ‹(z ±ÉÕU<ÔèGçDÍ4[Nõ2öªªGÕ:‘ù×\Í$[Nõ*ƒÒ«!{TèFkª æ’,‘š˜j•O®˜3 "u85(89ªèxÅJ­ž½k¢,ÂH°j@{Ô ÙëÖ¥B1ŠÞ,Å¢qÒž§5œõ´Y“Dƒ­JFjsNSƒZ¦fÑ(85 9¨Í(85¢d4INëL”µi“b@sKQS·Ÿjw&Ãè¦o>Ôo>Ôî‚Ãè¦o>Ô„æ‹…‡“ŠioÊ›EKc°SY±Å!~x¦Ô¶ZAMsڂޔΕ›e¤àS É œÓŒb²“-!¬rj6nÔæl}j&<XÉš¤#~5 Ÿ¥<ž¦¢'©¬$Í¢†9çu4ö=sÞ¢c\ófñDlÝÍWsÚ¥cÎ*#9®Y³x¡Ö«±ã#t¨\Œæ¹fΘ¢'aÖ«¹çµ+ŒUw9ÍrM0DnzÔ qš•Í@ç4E0D.qš«1Ï5;·cTæë]0F¥iº¥'Zµ+ª31?vÓE&8üë6cœUÙzÖ|ç8ßI ªç5 ‘ºT-]‘1¨Æ7ZöOÙëþ>¼Oþå§óž¼eóƒ‚íšöOÙßwÚ×ÿy8ÿo³ôü~mÕÔZÝÙÇá &v:Ry:%í´—‚ôȤy.‚ ó9WóåV;——‡Öío,õ‰Òþãí7í¸7Ëùë"‰L·Íó+ù€nyäU#ÂúÆ·ksygc9±¶Šif¼1?’žTFFRà€»/LÐæ>›ªC§]j2Ú ë–ÉVé—läÃ#Y»nÈ`’¨Ëâ5A‘·uuåœi÷jðõÅž˜‘ÏdëaRLnn˜ 2EE1rùM¤‡¯™Üh·ößdk9’êÐÞ$~D„CqßÊŒ®Ô/¹r»{ä)ÉФ/,R"L›âfR®â¹_Q¹Xdwv  /üßíŸ?Èó¼×ßö}ž^ìœìòþM¹é·åÇN*½tøNyt{kÔÔlMÅͤ·±X~÷Îhbi¶vycòBð ~€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€=#àŸüŽ·?õàÿú2:úMÿV+åÏ‚ò:Üÿ׃ÿèÈëê=7ýX ý¡­ä¸—ë ¤ñëþª¼FhѶ¹Äƒ¨Çݯxøú¡“D €39ÉÇúºñ9ÚÃýöÇ%†sXÎMJÃ{Ñû;†SâPNGú.9Ïüõ¯q¯ ýœØ³x›=?Ñqÿ‘kÝ+Xìp¢Š)ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šá>2ÿÉ*Ö?ß¶ÿÒˆëæ¯§~2ÿÉ)Ö?ß¶ÿÒˆëæ5ˈÝöNýÙz“)©”Ô R©®9IM–¡<ãÞ¯Àp³c8«Ð1È=kš¢:ÖÆ¬ÈÍ^†:ÖdÈÍ_‡­pTB4cJ¹zφ8«‘19®¡2òœð*À=ª¢0íVTþuË$D‘aTñ·<öªÈx÷©óŠËfsÍÐΧR8öªˆJ°‡§½tAœÓE•>êt<ãÒª©íS#t溠Îy"Ò¶~µ0=ÅUVî*u8<ž+¦29ä‰Õ»Š•[¸¨â¤VÇ«¦21’,+w 9]NµJ:VÑf2DêÝ©êpjnã­H~5´Y“DÀ÷§†üêÄT€ç‘Z©´IÞžcš„1§õ­ˆh–”1b)Á½jÓ%¢PÞ´»‡­F=(ª¹6%”TY>´¹>¦Ÿ0r$´nµsE.`å_ž)¤äæ°ZnóRäRCÉ­FXšLŸZioJ—"’N)„æ“4ÒüñY¹¬ØúÔd÷4ÜÔdäûVRf‰79¨™¿*V<ÔlÝ«3X¡¬Ùú ‰›4æn¢'°¬%#h¡þU ‘Í9ϽBíÁ®yÈÞ(k 8§³zÔ }ù®iÈÞ(c±ëP¹íOv¼T Üuæ¹g#¦(˜ã5žriìÞüT.yÅs=YÓ1ÍW÷©\õªîqZÅD2ƒT¥8&¬HÝp}jœÌEuSE¢´ÎpzU)\ûU™œàôª2¹Ïjí¦†T˜äæ³ænF*ÜÍÎIª2x®úhd-Q5HÆ¡jé‰ÍQŒjöoÙãþ>|Oþå§óž¼]{?ìñÿ>'ÿrÓùÏ]T>#Á͟ñäÈ>!ÚìUoø•CÍùk7±¯7¯Jøíÿ%ÛþÁPÿèÙ«Í*külÛ+Ó ŸæÅ¢’ŠÈô.jxXÉÿ ¿‡†ÕÙý«iÎî×'lZû¾>ð¯üŽžÿ°­§þŽJû»pÿ óÇñ×§êŠ(­Ï((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM_WÛþ;ÿ’yâ_û]覯ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¤³¼ÐcðUö›=椺…ÍÄWARÉ%h–uTÞf æ‚[o˃ÃTšÜº>©c¡iúú­åõ¬_bX¦°HüíÓK +²W;³(P¸çÏjåè  ÏÏt½2cœivBÙæƒ+ÈÒI3€FA Ò²n†Ù¸0Ʀ™âM :ѯ#¾7ÖzUæ™ B©åŸ8\•˜œðg*Pƒvã÷Et‡ÄPÚÅá‹‹!#ÞivòAsÄCÈ•LòÉ´Ùtu˜£© ÆG!¸Ï×õ(u-QšÉŸn‚ÞÊ9 °§ X€í˾8.î{Ö]ÜCâû8¼!e¦5îªÿgÓî-$ÒŒcìsI$“2Ì[ÌûÉæ£Ý“º%äpÇ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šô‚ò:Üÿ׃ÿèÈëê=7ýX¯—> ÿÈësÿ^ÿ£#¯¨ôßõb€<§ãÒ†ƒHÄägëx;¸åG#Ö½óãŒbY4d'˹=3Ó˯ŸåÏ8œ•ØßÂ{§ìæAm¢ðíµ{­xOìáœø›,X¢ã?öÚ½Ú­l&QE0 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€8?ŒßòJu÷í¿ô¢:ù}M}AñŸ?ðª5œpw[éDuòäyÀÜA> b¹±£ÜÊ”‹ jU5š•Mq´}6XCÒ­@ÜŒ¤¦¬Bß0íXͱwF´/Èâ¯Dù¬¨[æÖ„OÇJᩚq?µ]³íY±¿µ\‰Ž5Ã8ˆÑ…YFÅQ°}jÒäš-£t©”Õdµ¢‘$Û½©A£ ¥ÐÕ©bLŸZ\ŸSQäúÒîöªæ‡äúš2}M3wµ½¨æAaù>¦ŒŸSLÝíI“ëG0Xy>´ÝÔÜúÒÞ¥Èi$æšX ilûSIõ5E(ŠX“éM,4¶}©¤úš‡"ÒxäÔe²x¡›>Â˜ÍØVNFª ÍÚ¢fì:ÐÍÚ£'Œ¤kƒTlqøÒ“Q1ëÍa)Å fíP»v§3cëP¹ã­sÊFñˆÖnzñQ3cœR³ …Û½sNFñˆ×=ª»7|SÝJ…ϽrÎGLQ ‰^iÌ{T.Ø©Š:"†;UiÍK#úꬌ÷­àQתLÕ4ÁçJb}k²œJ!™øH8àö5í?³¦ï?Äûˆ'm§AŽó×Uïi/ÜØÅøõ â®CéPôRå¬Þ•湯Løñÿ%×þÁPÿèÙ«ÌsQ[ãfÙkVÏóc³Fi¹£5•ŽûšÞÂqáäÃgûVÓøN?×'~•ö-|wáOù|=ÿa[Oý•ö%vPøOœÍ¯íÕû~¬(¢ŠÜòŠ( ŠËѵûyõ5°iiׯc32íTU,¹¶3Ç ã#êPEPEPEPEPEP?ã¿ù'ž%ÿ°U×þŠjø‚¾ßñßü“ÏÿØ*ëÿE5|mÿåöø—ÏÒó+m_øšÛ`Éó>Q€y8Àê@ 4VÚøSQ{‡€\èûÑÉ:Í \1 aŒ¸'å9äqœde‡ÃWâÎk£q¥yqoÜ­j\ì$©ænn‡wd z+rO ê1<(×:12¾ÅÛ­Y°io˜‰p£ y8Àê@ ðž¢×¹Ñ·¢+’u«0¸b@Ãy¸'å9äqœddŠØ>¿s]+Ë‹~à5kRça íO3st8À;¸# ŒÉ'„õžk™_bí֬ش·ÌD¸Q…<œ àu  :+pxOQk‡€\èÛÑÉ:Õ˜\1 a¼Üòœ€r8Î23ðÕø³šèÜi^\[÷«Z—; jy››¡ÆÝÁdŠÜ“ÂzŒO 5ÎŒL¯±vëVlÚ[æ"\(žNp:<'¨µÃÀ.tmèŠäjÌ.0Þn ùN@9gⶆ¯Åœ×FãJòâ߸ ZÔ¹ØH;SÌÜÝ0îÈ#2Iá=F'…çF&WØ»u«6í-ó.aO'8HŠÜÔZáà:6ôErNµf Ho7ü§ Ž3ŒŒÆ|5~,æº7W—ýÀjÖ¥ÎÂAÚžfæèq€wpFAÇ¢·$ðž£Âs£+ì]ºÕ›v–ùˆ— 0§“œ¤ ê-pð z"¹'Z³ †$ 7›‚~SGÆF@0è­ƒá«ñg5ѸҼ¸·îVµ.vÔó77CŒ»‚2Ì’xOQ‰áF¹Ñ‰•ö.ÝjÍ€;K|ÄK…SÉÀÎRâ·„õ¸xν\“­Y…ÃÍÁ?)È#Œã#1Ÿ _‹9®Æ•åÅ¿pµ©s°v§™¹º`ÜF@1è­É<'¨Äð£\èÄÊûnµfÀ¥¾b%ÂŒ)äàg©ƒÂz‹\<çFÞˆ®IÖ¬ÂበæàŸ”䑯q‘ :+`øjüYÍtn4¯.-û€Õ­K„ƒµ<ÍÍÐãîàŒ‚3$žÔbxQ®tbe}‹·Z³`Òß1áFòp3Ô€@0è­Áá=E®s£oDW$ëVapĆópOÊrÈã8ÈÌgÃWâÎk£q¥yqoÜ­j\ì$©ænn‡wd z+rO ê1<(×:12¾ÅÛ­Y°io˜‰p£ y8Àê@ ðž¢×¹Ñ·¢+’u«0¸b@Ãy¸'å9äqœddŠØ>¿s]+Ë‹~à5kRça íO3st8À;¸# ŒÉ'„õžk™_bí֬ش·ÌD¸Q…<œ àu  :+pxOQk‡€\èÛÑÉ:Õ˜\1 a¼Üòœ€r8Î23ðÕø³šèÜi^\[÷«Z—; jy››¡ÆÝÁdŠ( Š( Š( Š( Š( Š( Š( Hø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠùsàŸüŽ·?õàÿú2:úMÿV(Ë>8^Ág{áó:W+“ÛýVkÈ5O Ζÿn°}³ ̨w2è¯Jý£?ÖøsþÞö•yF“®]i¤*¹žÙ¬ä–ÌöÙÑ6Žåׯýµ¯s¯ ý\¹ñ)ÿ¯_ý«^çW‰{…QLAEPEPEPEPEPEPñ›þIF±þõ·þ”G_-©¯©>3ÿÉ(ÖÞ¶ÿÒˆëå¥5Í_t{9[´dL¦¥SP)©T×+G¿NDêjd8"«©©Tô¬¤Žêr/ÂüŽÕ¡q÷¿ZɉðG5z'ã¥rÔ‰¹­q÷¿Z»ã¾ˉøéWb~¼WHˆÓªÚ?>µ›ûŠ·þÇ8‰š·©•ªœmÀÅXC\ÒD4ZSS+UU>õ2šËc D¶‡§52·>ÕQã­LÀô­¡#žQ-« TªÝUVÅJÖºc# D¶­Ÿj•[>ƪ«zqR«~º## D´­ŸjxnÕ][¿J>Æ·ŒŒ\K ÔðÞõµ<6:VÑ‘›‰`ëO Ú«†sOëZ©8–ô4¡ˆ>µl 81ïÍZ‘$á ú€6O¥8>:V¤K‰0b ;µA¸úÓ·ûUs ”—µýª-þÔoö£˜\¤»ý© gÚ£ßíMÜhæRBÞ¦“#Ö£-ž¦°õ.E(-Ÿji>¦˜\öâšO<š‡"”G³vÂ}M0¹íÅ1›¾sPäZˆælû c7aM-ŸaL-YJFŠ"–Á¦3w¦–Áõ¦3ÿú«HÕD»š‰›¹¡›Ö¡w¬%#hŨ˜ñÖ†o΢vê+žr7ŒDcž*lÒ³ãüjsŠçœã®xëÍDÇæ'Ö¡fâ°ÝCXúÔy"žÍUän½ëX£x¡’5T‘½êY_Ž¿…TwëÚºa‘ ¯“ÓÖ©ÌÝyýjY_žµNgö®Êq(‚vàóŸÆ³äj±;ð{UžµÛN# vËT,iìj&5ÙcRCÔLiìj&5ªG I c^Õû:ÿÇljÿÝ´þs׉±æ½³öuÿ_â÷m?œõÑGâ<\ÉÞ‘‰ñòDâ¦÷UΕ2qÿ-f¯1YÆQƒPs^ŸñëþJ¯ý‚¡ÿѳW˜R­nvk—¹}^=µüع4Œás0w4QYͳ[Â3Æþ7ð꬈IÕm8 ?ç²WÙñÏ„¿ävðïý…m?ôrWØÕ×Cá>4¿¶Wíú³Ÿñ]ö©ama.Ÿ$BÚ…¤W.ë¹Ù$¹Š2Š: ‡l± P‰4J.R]>í4ùŸdWm ¹á_'ånì}*t!ÿ„ÿì'þ–ÝW?@GÓ$ÏR:B›åeRB.à¹oA¹”d÷ w¢&º¸ŠÞÞ)&žW q©fv'9$ž1]¦‰¯èéà-wG’Òx.O˺_"%äßjˆ¡(c,Yn#jI€¥Ù«‡  Öšeä–wö“Ú]GðÏ× •<Œ‚ãUë ñ—ü‡-¿ì¦ÿé5ÏÐEPRA \ÜEÃÈáÉ"¢‚N9f (÷$Þ£¯HøƒÿÜÖ7“iÙBáuÝ -vf½C…L¾\6‡¦Cu•‹yÜðMkq-½ÄRC#[YY\kVÍk£ZɰWM‡Nh™–ܼß3Ë%Ýä²à®H@ªDš…ü[ã téô9õ9µ_:Ò[É­eí¦g*Ó l›~ûÇÌ0â€<ìÁ2Û¥ÃE Ý‘$*v³(€= ”‘Ûpõ¨ëÐ5BÂûÂ÷º^‹s¥C¥Ùê·ÒÆ'†5›ìÌb6þ[:ùÌÌQ”•Éhª? Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Hø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠùsàŸüŽ·?õàÿú2:úMÿV(Å¿hÒ¾ÿ·¯ý¥^wmÉ5î?´gúï ÿÛ×þÒ¯aŸZLG¼~Î.\ø˜“ŸøõçþÿWº×„þÎ?ó2ñøõÿÚÕîÔGbžáESQEQEQEQEQEQEÁ|gÿ’O¬ÿ½mÿ¥×Ë*kêoÿ…M­c®ëý(޾VLàd‚}†+ Ç­–»&N¦¥SPR©®Vrœ‰ÔÔªj5"šÍ£ºœ‹(Ø"­Å&PSÒ¬Fç¥a8Ü닺5â~:нy¬ˆ˜úÕèXóÍpÔˆÍHœg½\ýë27"®Fþ•Ç8ˆÑ‰úsгsYñ¿LÕ¸Ûò®IÄEÅj™Zª+t©ÔÖFrE•lTÈõUNjE8æ¡;Ê%µl}*u`GZ¦¯ÇµL­Ž½+xÈç”KjØïR‡ªªÙëRž tFF2‰i[Ö¥V㪫gƒÖ¤ GÒ·ŒŒeÈ~*@ÃÖ«+cžÔðÙéZÆFN%žך®qOŠÙLÍÄœ0ëšvãëPnàÄVŠD8“ïô¹¢  Ï4»Ç½W9<¥þâÇÖ¡¥Ü}j¹‰å& sͽ*ÇÖÇÖŽ`å%Ü}hÞ}j-ÇÖ’Ž`å%,:曼{Ôe€8¦—ô©r)D¿=p)¥‡\æ˜I=i¥€5.E(/èqL,4’i…øâ³s-DqnÄÓ¹àñMfîj2Äý+)HÑDs7çQ³~tÒÇõ¼"hG+{UI®NjI˜÷ªrIŒã5ÕŒŠW={Õ)¥äõ©¥c޾µFv<óÚ»iÄd389&©;Ò¥–L‚*³í„l Øc‰=DktŽJ’Æ¢cOcQ1­R8jHköÏÙÏý‰ÿÝ´þsWˆ9àã­{oìã»ÎñFâ ÛiÐcþ{WE%©ãæýÙñïþJ¯ý‚¡ÿѳW˜W¦ü@ßí2[*.ŒGüµ›Ò¼Ã55W¾Íð÷ùþluÜÑšÎÇeͯ Èïáßû Úè䯱ëãO ÿ„ëí–Ïö­§ñ®NÕö]tÑøO2mÖWíú°¢Š+cÏ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWÄöÿŽÿäžx—þÁW_ú)«ãoí{ñøG4¼#neó.q Á?¾é’9œd š+muÝ9nCáM‘‘TDe»Ú¤–Ÿ99ä‘òŒÎXu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw’^ãZ½»Ñí4¹Úµ´È€ýš1"ÌÅ|À»Êîv;Kc'§JÏ­É5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚ wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s :’ šÚâ)ÐF^7¢HÕÔsʰ!‡±õ¨u›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“$šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆAÏÕ5K½fý¯o^6‘÷q$J"€¨€@À¥S­Á®éÂáå>ÑŠ2*ˆŒ·›T‚rÃ÷ùÉÈ$”`sÖl œÐ éBI7íœIu¾=Ä‘´yÛ~\€2ÝÜrH=¹&»§;ÂËá=0¹•e¼Äƒi[3“ŒxÁÊŽqA®éÂáå>ÑŠ2*ˆŒ·›T‚rÃ÷ùÉÈ$”`r‡RA3[\E:ËÆáÔIº’yV0ö ƒÞµ³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’d“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È óÏ5ÕÄ·É4ò¹y$‘‹3±9$“É$󚎷»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9ÌgY°6s@<3¥ $ß¶q%Öø÷FÑçmùrÈ?tgqÉ ôVäšîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆA»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9Ȱu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“$šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆAâ·»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9ÌgY°6s@<3¥ $ß¶q%Öø÷FÑçmùrÈ?tgqÉ sÏ5ÕÄ·É4ò¹y$‘‹3±9$“É$󚎷$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ25Ý8\<§Âz1FEQ–ójNX~ÿ99ä‘òŒÎ@0è­ƒ¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸ä™$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ2¸5Ý8\<§Âz1FEQ–ójNX~ÿ99ä‘òŒÎc:ͳšá(I&ý³‰.·Ç¸’6;oËAû£;ŽIÇ¢·$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ25Ý8\<§Âz1FEQ–ójNX~ÿ99ä‘òŒÎ@0è­ƒ¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸ä™$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ2¸5Ý8\<§Âz1FEQ–ójNX~ÿ99ä‘òŒÎc:ͳšá(I&ý³‰.·Ç¸’6;oËAû£;ŽIÇ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ò> ÿÈësÿ^ÿ£#¯¨ôßõb¾\ø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠñoÚ4f_ û}§ÿiW‰m9Ö½Ïö…ˆKsáµ8ñó×þÙW˧ªB6[¨¨5”擱-ê{ìæáωqÛì¿ûZ½Ö¼#öoe'ÄÛAû/_ûm^ïZ-ŠaES¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(‚øÑÿ$›ZÿzßÿJ#¯•T×Õ_?ä“k_ï[ÿéDuò’šÆ©éà“'¤SP)©T×;G±NDêjE<Ô jU5“Gm9©©Uªºš•MdÑÝNEèØúÕØXóÍeFÕr'<ô®z‘76"cëVã“5•œö«±KÏJá©‘¿ŠµäŒVdOЊµ™úŠäœDi#U„jÏI3j³×4¢"âµJ­UUªUn•„‘œ¢Y Ï2¿ÕTÔŠÜÔ§cD¶ùTªØúUE~x©U»ŠÚ30”K`ãéR+céUU»Š•[½oÊ%…lô©*°lÓÃÙHÍIJþðÙéU•úâžÖ´S3q,†çšp`MWWãŠpZÑHÍı¸úÒ†õªá4ýçÚ­L—m€sP‡õ¥Þ=é©‹”šŠ‡x÷£x÷§Îƒ”š“p¨·z úP椅½)7yö¦³w5.cQ$'ÒÇ;ÿ’yâ_û]è¦¯Ž¡ñ-Ô/nâÖÍ¥Ž?&Y2Zâ/,Åå±Ïʾ[ù6“Á$° 5føy©ZÜÞCw}ciö[D½-t&‡}»Iå4^0Ãkñµ€fãb¾FjAàùn-ÚUÕôÕv·¸»µ‰¼í×PB$Ý"~ï&@”o—23x E§o‡¥G õ ´Ø‹0òP8“*|̳o Ù¿Ý 0£m-‡‹¯,4åµ[;]-'±Žæh‹I¼ÂMѯʹ|Ò»Æüœn)• o‚béz6£¬Ø«K¨%ô0»‰­œ¶ |džl†PɽcsA9z~…æ­}g¥it–öSܤ±4±¬æ8L„!h³‘‚HePvd’ëÅ×—Œœ6v6šš]­ô·°ÄZIîÜ$mìÊ¿1$ªBO*v®#·ñ)´ÖÓQ·ÒtØ¢Kym…’¬‚#ˆèᛘĉæ.HàG†ï.,á¼I û,–“Ý4Ŏȼ¢AÛY òÀ^þt]7ŠÔ×< ¬øBÞÛRÕlã–¸X¦†H§D˜-å–*ÁãtLü2¤áìÞA¡Üéøµ¸•enNF:¨çXˆË rbŒÿ«š–¸|Ap¢æ×M²žæàKy~±ÈZi 9‘ùr£,ÌV%Ps÷NÕ¾¹¦Ãaqm-›Hö¶ëujÒX)%Y%$Y#݅ݳp0«‘øFò]ÛP[Ë×V’Þ[Úy§Î’8šA)ÆÜ.Ñ7Ì@a–`TS×5(oî-¢³YÂÊÝmmV@³9äà¼$›rÛwí…©'‹"‹AÒ쬴èõ¶Ÿ5”—òïóe–bê€>¦9Šå“p,Ø# @g@R4ý*5ûNæßûBêy™‚ÚAå´ as¸y8™ˆ Ç*ª+’_´Ey&½¥.™,I"_âàÆYÞTTÛåy›‰‚S÷6ázòŒë꟪ÆÑÿiÛ[ÿgÝA2±[¸<¶ˆ®6'°XaYIfbš~4†ì¥¦¯mim¦Án©m ®œ'XäŽI^&(Ó b¢yGÎX6FõrKPuð¿Ä6¶…Û$n–Op—̲$Ë#‰<¿-@1Éò»+¼/Ì»°î¬mî<=¯g”Ðʶ—°†%UÊf9nx\¨ÎÖŽT:¨ÐÖühúÝÕôói6&Iå¸ky¦ $–±K+Èѯ"6Á–L3!`[ ‚n}Õõ½¿‡ Ò,äóZiVîö`¤+8LG ÏîÃË–ÜÒ0ÃV éZ)Ô­î.æ¿´ÓìíÝ#{›¡!_1Ã@#GlŽsŒ|§$¹&‰ý‰§jžn㻓M‚Ø¿Ëç ýó–CÏ—º< €Í"œ²£)§¥kGM·¸´šÂÓP³¸t‘í®Œ|Ä ÁѲ¸Æqó‚@"äšßöÞ¨[ë»’îMJ ’Ÿ/œã÷ÈUfØðpB´j0ªìÀbÏáÛ§‹lôGU±0V=6ù­%g0;³l\ì ³ˆßn7m#l9§øUµ;Ëøíuk-lbKx‘Ü2mÆKXŒ¡G9rF9#rîÐ×üt÷~!»¿Ðì Ó#}WûM]UšIeGsÈÝC.÷á0¤±È gÛx¤Zê+u…¥,qì0@‹4~C¡,®²¬‚mÙf<ÈzŽ0‰´;-.Û}KN)ê–I-ÌRC(‘n0 ±ä˜TW‘]O;Y~}é··,µHl­õ-D¼mª^¤¶ÑG B5·YÉ€a‘ž5Enfù6&ì:ê.|7gmã/X<“ÿdè²Ü™dÜ<ÆŽ9<´\ã†w1¦à¤)}Åp g¾Ÿχ¯µÈÄlÔ#·ÑHÿ¹YW2Êv™¸l9p"çü% }â][QÔm#ŠÛYIú@ØÈ1C±9YU%Û¸+·!N+é7ºH l#wÞSËB"#w ²¿.Ò6&Øî¯­íü=‘g'šÓJ·w³!YÂb8Ànv\°Ææ‘†"±±£x~ßUðö¥¨M¨AbÖ—vÑn\ˆÂH“òª³³n bF*I¢biڅƱo›¸îäÓ`¶/òùÈ?|åóåî 3H§,¨ÊrãÔ¦‹F¹ÒÕcò..!¸v î Ȫ8Æ%lñØtï±y¯¯ˆmõTÕ8.'½›T¶‘¼´–A™bÀÉÄ›cÃÛLj8Î$ñ'€u¿ iÑÞê1mŒÊ ”yR§•)…Üè«'Ýš2ëòõÁ\ÉàÕYñpêV–šf©›žþF݂҄8D%Ïîˆ!Tžs¡Šåë> }o|’éö0ÝM)žêêo2æSœ³b%˜•Œ"’y*íØZÝůÏ ØÜÝjº„¦gX•fÀ¬¡Ã”2W–àaEgânþ×Ñ®müoMó¥_w›å®‰¹Ûò¢¼q—ç,›yúè!Ööÿkë77~·©yÑ ©·Êó×JÜmù‘ž0 ¾ÍòMÜýQEQEQEQEQEQEQEQEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@?ûA;$¾*é9ÿÈUãò\ª9]Ê>ñãó¯\ý¡Â´þ 2?Òö•x›6÷U •VI²Yí¿³‚loûý—¿ýv¯w¯ ýBîñ1þËÿµkÜëe±l(¢Šb (¢€ (¢€ (¢€ (¢€ *½óÞGg#XA÷C#žc7#9`¬GþéÇZÇûgŒ?è¡ÿàæoþE  ‡‰ôÝ3Q6‹é.–%™’ÓO¸¹ÚŒX)&$`2QºúÔ‚e¹·Št‘¨’6FŒò¬Sì@#½s÷:&™«x–öí5 JßT‚ÞmF Èñɳ…”#Œ¸t%qʹá‹ë‹ýÉu'›47wV¦B 3ɳ¸„à’pàs?ä’ë_[ý(޾R¾­øÕÿ$“[úÛÿéDuòrîÏ$ô¬ª#¿+&N¦¥ ¤SX4z°‘:š‘M@ H¦³hì§"u5(5šx5“Gm9–A©ã“QMJŠÊHì„®iE/=ªüRóڱ㒮Æàžk–¤ hß¡j7üÅeE&1W#|â¸çhÝ3V‘º~•™ªÒ>>•Ë8Ñò=êunk=~Ua¹åv*·åTÕ¸ö©ƒb±q3q-õ©zÕUj7aQkJ%°Þµ*°Ç5L6"¿«ŒÌ¥â¿OJz·¥TVäzÔ½ke3'ÖáNÇXIéN;õ­TÌÜK!úÓÃ1Uƒæœcšµ2 !†9¥Ü=j¸~—yö«ç'²¯Ç»ÏµV ëK¸zÕs“ÈXÞ}¨Þ}ª¾áëFáëG8r7ŸjBçáëFáëG8rî´…½*çÚ‘›ŽjyÊå&Þ}©›‡­E¸zÒn5e(o>ÔÂÃT{‡­0¿Ô9–¢HOsM/Ï~x¦óY9š(g犛¯­FÌ3ÍFÏÛµc)šFË}j"ÜÓYª6jÍ£ìÕl}) TLÝjÔMcÌß•@Î:Ò3~U]ß÷­cÒGÇZªïŽMøäÕg~æºaß¹ª²>Iô¡ß¹ª“KÉé]P€ÂY¨Ë/^éÒ¾AÍR•‡¯­uÓ€ÆÉ%Vs“JÇ­Dƺã'+!ÔdÒ±¨ØÖ©s˜Œj"iÄóQZ$qT„ÔlÔâj2kTŽ9Èi5î_³úß}-?öµxSîì@úŠ÷OÙ·>gŠ2AâÓ ÿ®Õµ5©æbåxXÆøÿÿ%ÓþÁQèÙ«Ë2kÔh"ÃâžÐüJ¢êqÿ-f¯-ϽEEï89~å/ëqrhɤϽ÷¨±ÕsoÁçþ+ŸØVÓÿG%}™_x8·ü'žµm9Ï?뒾ϮŠ[>=Þ¢ôÿ0¢Š+Cˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM_'Zi°]jz‡å¸û5ŠÙÿh^J2<æíq“…b0‡Ë6ß™‚’̧ëÿÉ<ñ/ý‚®¿ôSWÆÚÒ‹K%]ñÝØ¸û-ÔRhÓs>Þ;‡mÊÀ‚2ÙÏË´¦¾ðÿ†ôû)u•–ûPÓÙãŽ&0òÁ"i`b³‘_ùæê:f›‚­íàÒ5'Õ“SÔ"3¾ØÜ,+7›F` ùwü„;dƒÏEâMv N]N-kQP™6Kt—N%uã†|ä•x'°ôªßÞ[ÙÜÙÃwÛì°!W†HrŒ%A×ĺò½“®·©°B–l.Ÿ6êT)óò  p1F›­Ía¬¶³'™s©#™àžY Ûq¸0•ó’ä°à¶ n«G®éŸØž!ÔôŸ;Îû ܶÞnÝ»ö9]ØÉÆqœd×AÿœúŽƒißAý½w@ó "Ö7!J¾1æIó«Œl3ã÷ 'V&¿¼¸ûGŸw<¿i”O>ù y² ØvÏÞo¹<üÇÔÐQeý—â=FöëQŽ{[6Á§Z%Ï‘ !‹á7'UnåÕCŸ1ÝÔƒºäžÐítFûV£w­-½ÕÔK ©*¬/*lx'>Cnc2ìÜI&_ŸŸÅ:—ö̺Οuw§jWH~Û=¥ËGçÈ͹˜mÁPÄ+ɲFsãÕµ(t¹´¸µ ´Óæ}òÚ,Ì"vã–LàŸ•y#°ô ƒXðÕ²ë3hZ5¦¥.¡k©-æ–Dh.e,Ȥ«ä–d$#È'æ2Ö-í|3¨E©¬‰vÖú&™‘ÜYíŒÝ¿ž‹.ðÉ’ç!à¤j›‘È+\øñ&µ‹u}Rîd¶·–ÖšS"јÝ[!ACŽ1ÛW³Õµ->ÞêÞËP»¶‚í6\Ç Ì‹2àŒ8 0Ä`úŸZé"ðöqgÆ—Éu§ÝêvÒ5Â2A&|Dëåƒ#n~pÈðvü¸m _CÑõ/Û%†™}gc• ÕÛ‰‘Õñ§‹…@DJGÈ Û›síà­qqêÚ”:\Ú\Z…Úió>ùmf;qË&pOʼ‘ØzPº¶¤©d‹¨]„°röj&l[±`ÄÇÏÈKr1ÈÍw‘èÞÓ´‹Û»U1Ýø~-B8g¼ŒKoÖ,£˜?‰B0m¿u˜ržžÒmü8©^Ïo®Íist–¥%ß’ò¡FˆBÀóeŒ©³$•Â|ܺëºÂj1ê+ªß-ô[ü»‘pâDÞY› œŒ—r}K7©¨ãÕµ(t¹´¸µ ´Óæ}òÚ,Ì"vã–LàŸ•y#°ô  Køšx7ûB~nôÛ¸lŒÇ–š#sŸúçä0ä•‘W!cQG†4Í.ûíRê¦ql޳}ž7•³µsŠŒvœ ¤%Ô&>÷SûNe§A“ikº@¥·³ÌáD’×b€£*¯VÜÍ›«jZ5Ã\iz…ÝŒì…KYš&+pJq=…Is£ÞG.¤ÐÙß=®Ÿ/—q,¶Å 9b«æ‘1´ž¹5Ú]évÞ'¸³±³‚=5±m¦Ë ÚbA>žÓ ôlÜòØ3JòŠF7½qvšÍ厨é–ï¶ßQò…ÀÉù–6Ü£Û÷°sÃ`ÑÞjÚ–¡oko{¨]ÜÁh›-£šfu…p…P0=¥t¥Ÿˆ>ÛªÜi÷ÒÚAw§i„xÖo9£EsîÇ–A7;HXÙÝcZðާ]jòÅy9±Òå½³™$•<ãp’²[…qµƒFÇ8$Cr@ùs÷þ"¼»Ônuyg³»¿‰ÓQh&*·Lä™ Wà²r»³Œ.s濼¸ûGŸw<¿i”O>ù y² ØvÏÞo¹<üÇÔÐaâŸi>ó$Ñu‰äÔô­AmgxŒ§ ø}ÆÖ ‡œœ7ÈKaø–s¥êpÅT²/ jRE’H\€0f‰Ÿh.ý aFiˬ^_}† ZòúöÆÏ  rw¬e·ÈP8 1QꚔڵû]̱¡(‘¤q‚8Ñ" ’pªª¹$“Œ’NMuG…ôÛ­.>ßRžîãG¼ÕEżʱ[,>rªºذ/·¯úÀ1‘’6› \Zøp4‘ÛÇ£¾«;Ä@7b{¨Ù² ¬±œ`; ¦F®Lñ¥¥Böð\ÈÖŽ“ƒjîÆ-ÒÂгì û€~Gnca§Æ<Èï4×ÿC»†B{ÚM¸H‘‹+ÜÀîvt¶µ}8]Ãv³ßør÷PPáGU¹(Û]Q£…HèrᕆW{]6o‡:kA¥]Ë«=íè7J¤mŽ;wbÈ#ÜQPœ ÃiÞÙ àa®»¬&£¢º­òßE¿Ë¹$Må™°ÙÈÉw'Ô³zš¯ ýå½Íœ7sÇku·í¤„$»NWrŽ‘ž”±qÿOÿhOÍÞ›w ‘˜òÓC$ncSÿ\ü†œ’²*ä,j+Ÿ­ ÝOí:u–>M¥®é–ÞÏ3…HN]ŠŒª½[s6}QEQEQEQEQEQEQEQEQEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@9ûC`MáÒÙÇúO#·úªñ”àY3·ž?•{íY&ðã©Æ×?÷ê¼^ñ måp¼cµc5vK=·ör9>&8ÇüzñÿkÝk¿g#óx˜z}—ÿkWºÖ±Ø¦QE0 (¢€ (¢€ (¢€ (¢€ (¢€2õ/ h:ÍÂÜjš&›}: E’êÕ%`¹'°'$ãÜÖ„Cko½¼QÃH8ãPªŠpb¤¢€8_òI5¿­¿þ”G_&ƒ_Y|jÿ’I­ýmÿô¢:ù,ÎgfÙ2`iàš„ţф‰”ÔŠjjxj†Ž¸HMJ¦««T«6ŽÊs,©ª¸j‘MdÑÙ –ˆïV£”ç­Q¥WÁ¬¥Q•ÍX¥ÈÕ¸¥ õ¬ˆ¥éÖ®G.ErΚé&FsVRRqÍdÅ7ô«‰(æ¹gqÉÇ^jÄrrk1%éÏZ²’óé\²€%“ò©•ÏãYË'lš°²÷ɬ%ƒú‘[Þ©«Z”>kZ-‡ü©áª²¸§†ã­fâfâZÔñ'¿5T=<=+´fàZWõ8§‡ô檇ǽ8?áV¦fà[ÇZpsŠª¯Ï\Ó„Ÿ…Z™ üóÅ.ñëUwûšx‚­L—ÆñëNÜj¶ÿj‡ßóªS'³¸Ñ¸Õ}þæþæŽpå,n4ÒþõÿsI¿Ú‡0P&Þ=i ñÁÍC¿Úšdõ©s)@˜Éޏ¦ï÷5|Óøô©s)@”¿ñM/ÇZˆ¿¾i…ùô¬ÜËP$/Ï'Â皌·Ó Ô]³EBÕ=0¿åL/MDÑD{5D^š^¢i=kEEìþõ ¹õ¦<žçŠåêry­c‡¼™ïÅWy;“Ly{dš®ò‚qœWD`1ÒH{šªÒdg4’K“ÖªË0Åt %'¡ª’ÉךF—¾MT–nO&ºáLa,¼uª®ä÷¡ß55uF6&R°ŒÕ S«TŽYÌF5&•š£-Z$qÔ˜ÒÔÆ4¤ÔlÕ¢Gä!54âj2kDŽIÈF5oúÏ}-?öµxA5îß³gßñGÒÓÿkV°ÜáÄ¿tÅý ä¡ÙÿØ*/ý5y]zŸíÁ~!Ùg?ò ‹ 'þZÍ^WšŠ‹Þ:0²ýÒ_ÖâÑIš3Qc¢æßƒä{ðçý…m?ôrWÙõñwƒXÂ{áÅç?Ú¶Ž?×%}£[ÓØòñ®õ QE¡ÈQEQEQEQEQEQEQEsþ;ÿ’yâ_û]覯¾ÏáíñíMSilH³£Ê® yüœàcŽ 9ãìŸÿÉ<ñ/ý‚®¿ôSWÅ—:N¥eKw§ÝÁH"g–P®WpRHë´ƒŽ¸æ€/­¯…ëë:À„"”q¥DX¶NàWí ¸99Éàc–o ýŽf®ªn†ÿ*3¦G±°NÍÍçår6ç vä»9b šÝî) ê SµY* è ÄûO¥\} XŽÎêòM*ù-m%0\ÌÖ0­’<й%¯…CÂ"Öu–Bø”¶“•]§•i;Ží£sÆ-|+ö‡VÖu‘E(ãIˆ±lÀ¯Úpprs“ÀÇ4íô-bîòK;m*úk¨¥ò$†;wgI0ÇaP2ç~Fô5^êÂòÇÈûe¤öþ|K<>te<ÈÛîºçªœÁ  m῱ÌÃUÕMÐßåFtÈö6 Ù¹¼ü®FÜáNÜ7c&I-|*³¬²Ä¥´˜”ªí<¨ûIÜwm8à“ž0sãÒu)´¹µH´û·Óá}’ݬ,bFã†|`™x'¸õ¢óIÔ´û{[‹Ý>îÚ ´ßm$в,Ë€r„Œ0Ñê=h@ZøWí­¬ë"ŠQÆ“bÙ;_´à6àäç'Žc6ÞûÌ5]TÝ þTgLc`››ÏÊämÎíÉv2I0̼ÜzЄ–¾‹YÖY âRÚLJUvžT}¤î;¶ŒpIÏ µð¯Ú[YÖD£&"Ųw¿iÀmÁÉÎOšÇ„5í þÎÊ÷L»YïR3l¾C5¶.Tu.€ÎŠ®žÕnu›½*ÂÂîþîÕÝdŽÖÚF`¶–(T:Œãï(# !¶ðߨæaªê¦èoò£:d{ìÜÞ~W#np§nH±“$–¾‹YÖY âRÚLJUvžT}¤î;¶ŒpIÏ9ãIÔšÁï×O»6hŠïp!o-Uœ¢’ØÀ•”åHê*¼0Mrå ŠI\#9TRÄ*©fÒwÛF8$çŒyàšÖâ[{ˆ¤†xœ¤‘È¥YAäxÅhIá­z(oeÑ5$´™7Å;Z¸G]†L«clVlŽÀž‚€, _ ý¡Õµd@J8Òb,['p+öœÜœäð1ÌfÛÃc™†«ª›¡¿ÊŒé‘ìl³syù\¹Â¹ nÆM{=þûqŽÖqÚIxdò$eò“p/ò©ùw)Mßt7R$G“©M¥ÍªE§Ý¾Ÿ ì–íac73ãüËÁ=Ç­hIkáPðˆµe¾%-¤Ä¥WiåGÚNã»hÁÇœñ‚ _ ý¡Õµd@J8Òb,['p+öœÜœäð1Î<Muq½¼RM<®8ãRÌìNrIÒwÛF8$çŒyàšÖâ[{ˆ¤†xœ¤‘È¥YAäxÅ\›BÖ-â¶–m*ú8î¢iíÝíÜ cUÞΤ™BüÄŽç¥\¾ûC«k:È€"”q¤ÄX¶NàWí8 ¸99Éàc˜Í·†þÇ3 WU7C•Ó#ØØ'fæóò¹s…;r@ÝŒ›>ñ&¡.©:5÷Ú´Ø’[‹ck'š7²ª¨P¹ÜCnã*¬{VXÓ.NŒú©ŽAh· l$1>Ör¥ˆ·f@ °?0 ’4$µð¨xDZβÈ_–ÒbR«´ò£í'qÝ´`ã‚NxÁ¯…~ÐêÚβ ¥i1-“¸ûNnNrxæœÚ±o´³iWÑÇuOnïnàK®öu$|Êæ$p=*ÅŸ‡o&ׇwö:¬›c·¶¹„¡y›#là¦àxb1’¹Â’Êo ýŽf®ªn†ÿ*3¦G±°NÍÍçår6ç vä»2IkáPðˆµe¾%-¤Ä¥WiåGÚNã»hÁÇœñƒ— …åÅÍä6“Ékk·í$d¤[Žs'žµ¡¨x}ìtã{¡c{R¬"ÑÙ¾Ï+*¥Š…|ùr|Ñ—_ó‚¹ZøWí­¬ë"ŠQÆ“bÙ;_´à6àäç'Žc6ÞûÌ5]TÝ þTgLc`››ÏÊämÎíÉv2qè Š( Š( Š( Š( Š( Š( Š( Hø'ÿ#­Ïýx?þŒŽ¾£ÓÕŠùsàŸüŽ·?õàÿú2:úMÿV(Å¿hÐKøpãöœÿä*ñM¡cKW·~Ñ*­?†÷tiïÿ\«Å$Ú\")ã¦9&³“ÔLöïÙï‰ýzÿíj÷zðÙ¹vŸúõÿÚÕïkb˜QEÄQEQEQEQEQEQEp?ÿä‘ë[ý(޾J¾´ø×ÿ$\úÛÿéDuòJäu¨™ÓAØ„x5“GldL H¦ SO¡£ª'¤ SRPÑÕ –ÓÁªàÔŠÕ›Gd&Xž ž fÑ×–U±Vb—ž¿­QV©°k)FçLesN9yëúÕÄ“ sÓÞ±’Núõr9xëú×<é–kÅ.W¯ëVc“8çõ¬ˆ¥ùzþµf)xëú×,éˆÖYxÿëÕ…“òúÖTrñÿ׫ /Ë×õ®y@FšIǿ֧gÿ×YÉ/|þµ2ÉŽ3ú×< 4ùöúÔªýÿ­PsŒãñ©VNŸãY8 ÅÕzxj¨¯žÿ­–ŸûZ¼×¼~Í9ÝâŒúZíjÒ;œuÞ†7íÿ%ÏþÁQèÙ«Ês^©ûB¸_ˆvY Ī.§þšÍ^R0È ý*&µ:pÒ^Í!Ù£4™¤-’@õ&üÆïƒ?ä{ðçý…m?ôrWÚ5ñg‚äVñï†Àe'ûVסÿ¦É_iÖÔö<ì[NjÝ‚Šâõûtxªh “Äé1ÙA'›¥ÛÚº«—›Ì-ç+;«ÛcþÎXga5Ømôm3RÉw¤On²I©>‘YT¤² U$³6d¡w2YÊnQYúf§ý«æÜ[Ãÿþ½Éoøùë¹Õqþ¯¦ÖÏÍÉnÖ|ÿ _j—w:ôZ´4Öº‚Å@¿$Hm “`'—Á‘¾bzáFtWq¬K૯Å­Ý”º•®ž±@`12D’f3&J߉>ñm¤ c¤¾ðÕ†¡y%ÔתHøÈƒVº…"Htì9ëÖ€+ëÞ-µÐµ;µžîêë…Hf6’pŠL² ÜçvÅ-å¾Êk ®NëB½´½eÓô=R´{/²´Ú¥ô¦è«;´‘¼¦HŽW O=F1¹¡iŸØžÓ4Ÿ;Îû ¤VÞnÝ»ö ]ØÉÆqœdÐ…Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)«ãjúí³Ú\]KpÛ¨¹Œ!O- 3  u±úŸ²ümKà/Æ¥C>—r »17RxÜñ_ÛøN[^×J]SN[ÉîE£Æï 0Lr7É“–w&å HžÔ¡ÒÓP¸¾[K‹Do²\'p­¾GžFå*ìx<ªgPnEâ›9,༽–ú]^ÛO»°È.>Ðg-3Ê_r°ûK»;Ì7|¹Kák뛇·Ó%µÕ.#E2Ac.ùrˆ‡b»I& ê;±ÍA†µë,êhš”ºxFsv–®Ñ\î;ÀÆNxÁ ÒÛÆž\mNDÕVK¯[ë—!a„~_žÆÆì4 y„Œ‚NÅ+‡óûù¾Ñ¨ÜÏö™î¼É]üû‰%É'sŒ·ÌzžO'©ë[Þ™§h¡\YÍý¥ ͧÚfó•’9Yn%•@!ÄdD0I AÏÈNÕøb¿iö–z¥†§oö«[½Nqq®r;ãªÉ‘nÚ7P–zõ„>k9å¾7‘Å$P"ÃÈ\¶J\$HÈv WFÜçåg —sŒý[ÄöÚÿh\OªÁ©ÅÔ ^^'K4…¤˜mÛÿ ¬‹)]ÿ/Enkº–›ªÃkuÝ® -ííåF "a…bÊœ’åö+rg#çÎᱩëú¯ªx–9fÔ Óõ]M5(§[DyQ‡û¶Í¿o˜?ð—æùxº(¼Õ|}­¬Á{$WqÀ¶Z¤fÛxuŽk¶º ¯ ‰¢ Øìèp+›ðƳý­D<ñȶ—QE$’I‘£‘Œ3©ÈäcŽkŠìÄ:=÷…l´ ÷¾¶Ž¢/sºL|Èæ»`¡ ‰•+t>mÀ‚˜ÚAÈпøƒg¨Á¨ÝI¦ùzœÿlKs´:Åï)Ú_!¾íåÞp-¹Ç Ÿ?¢€44-OûÄ:f­äùßa»ŠçÊÝ·~Ç ·88Î1œé4Ñ…¯u&º’ÓPÑ™kA:[öW-o"E“Æäe“?qhÉÁOEI<ó]\Kqq,“O+—’I³;’I<’O9®â÷Åz Ëê1f½CX‹X•áÙ…•g>Lm’A*1ìIòÁL?Eux‹M—Åͫ݋¸`»²¸‚â(bWû3Io$!aRÊ J ©+µ~Nv†hìõë|.ÖsË|o#ŠH E†?¹l”¸H‘쮹ÏÊÎ9z(SÃú”:V­çÜ,† -î-d1€Yh^"à»nFqŒŒät‘xŸG¶Ò¯¬-¯5Xöè‡J´m‘Zm×FåÌ€Kûµ9ò° åIcýÓÃÑ@z†‘âýøƒT¼†öúÊMZ[½Jâf#62}’ì*BÂOÞ¶ëŒ)>Y%Œ·ËåôPaÿ åÿdo¾þÌþÊþÍûgÙÓÎÿ¿µïò|Í¿{÷xó:|ÙþËRÓWÃZÖš«w Ü^Û]Y© (Û™JHù\³¸)É^ƒRbùïM2P1ÐÓL ÷ªP‰ËÓ @eÇzcJ1œÕ( ¤Ç KÉ J1œÔM/|Ö±€ìLÒžEBòðyT/7=j˜sÍk`NótéP4Ýj˜qÍ@Óy­ãLdÒMÇQU¤›äê*&ëU¤˜më]¦¯7EVy¸ê*&˜tÍWgç­tƘö$iMBÍMf¦­ÔLå1KTlÔ…©¥«DŽiÔjš†jŒµZG$æ)jš‚iŒÕi³˜3TdÐM4šÑ#–sša4¥©„Õ¤sJBM&‚i¹ªF^óû4ýï}-?öµx)¯zýš~÷Š?íÓÿkUÄæªô1h_ù(v_ö ‹ÿFÍ^O^¯ûCÉC²ÿ°T_ú6jòj‰ntлC¨¦ÑSc[›Þ ÿ‘÷Ãö´ÿÑÉ_i×Å^ ÿ‘ûÃöµÿÑË_jÖ°ØáÄükÐüo[j“¶Ÿo¦ßXJˆÈ·wnð¿!”l…Ã!HÏ —ä¡kØxjaáý;LÔ®#xÂ4º¤QVòáÎù2ǺiF(È^r7IEYÎgéšgöW›oo7üKø6öÅãÛ®äVÏú¾›W/ »U#Ò´Ù¬urâVŒ¥ýêÜDœ…ðņã®èØñžú J(‹»Ð5ã¥ßøjÚ4è7NФïvë<²ãÌcʆ‘cù‚ªˆÁiÏiEQEQEQEQEQE…ãgXüâ7hÖE].ä”|ᇔÜqô ×Ƕþ,–ÛWµÕWKÓšò ‘vò:HLó íóäa‰m©µIÆAõÿŽÿäžx—þÁW_ú)«æ]CA³ÕþÛ¤éÉÚìõU¶ŠX­ K†òñfYH®]ƒç»€qÖzÊØ\\ÜA¥iÆY[t&xše¶9TI‘¼FjÄþ.Ö/-åŠòKKÇ• Iswc× Ç3º2îÈŒ Û¹ðu‡4ëÛ¿›éä‚[UŠ Xäµó¢ã ›ˆƒ. Ót»ÙôYg»ŸPû=ýÔWŠê‘*Ú½Âìh¶’žÊß0cÌ¿0§¯C¯A¦éí¥iZTv¸†;˜MÉò¢.îCn’L®éŽ·aÇ!ñ<6ž ÓîìôëKË 2ßì¶¶šœHä\6çtÏV’I%Û¸í,$(®‘ü áùõíVÊÖöú ]P–Úê{¶Sç"Ås7˜ð-Y7bMÛƒ„òÎùÓ<3¯YÜi’I¨è÷¶á®mœÈx¼ÆW‹Ìx£. !Äccc4{¨“¢´5Ý3ûÄ:ž“çyßa»–ÛÍÛ·~Ç+»8Î3ŒšÐñüK-l4K–io{pËÇÚ&š!*³öQ mfP?Ez¦¥6Ÿg¬øÇQ¸¶Ó`M+XK xbÒíÎø ])ÆcLqæWRʪp[î77­èz]¥ÿ£ŠÃUÿ‰f a²{dßmnž{&'vË ¨9䃜ÐEušìšD#ÑhÑ¥¤šc»Z‰ˆ2²ÜÜ"™d'jn#n@!|±·n¥ªÁgñÖ}:++±›Ä dÖÓYÅ,bs´ª«© ÀÀ+‚B(Ïè«Ø^\YÜÞCi<–¶»~Ñ2FJE¸áw0árxëE”º…äv°¼ #çyÒòîBŽÏ=:Ðz+´¹ð¶‘ Y^ϫɩ^ÜY\AkqiFÄ+L’Hޝ23" ´IË -^ûGÐtß -Üðk'PkÛˬÑÙdu*ÅóB´YlœëŒNŠì-ü>©ö;"ûͱ¼ßä½Ý¬±Lvp؉™yýA—hÁ}¶-¼;‚´íNóW0=Ä2ÚéŽÍ,r Ñ"]ÀYš>aBU°XåÍè®âîÆßþxV8öØ[K5ˆf-öW·&W<ÑÂc<ó•c¸Æµ…ƒ¤T¿µÔ¡Ûß‹‹‹Û¸µ’A¬&ÝbB¬Wpc€ØÉ&€8º+ ñb—º°½Y –ÖòÓͶh´øl›`–HÎø¢ùCoGç-•ÛÏaÏÐEPEPEPEPEPEPEPEPEPEPEPEPEP¤|ÿ‘Öçþ¼ÿFG_Qé¿êÅ|¹ðOþG[Ÿúðý}G¦ÿ«ã?´PÌÞÿ·Ÿý¥^+‚q^ÙûC¯ðçý¼ÿí*ñ€2+9n;Ïû7›Äçgì½íµ{Åx7ìÚI>'Ïý:ÿíj÷šµ°‚Š(¦EPEPEPEPEPEPñ³þI¹ÿnÿúQ|Š+믟òHµÏûwÿÒˆëä1IšA§LPo<x5§RÑ´dJ <„x5-ÆDÀÓÕªiÀÔ4tFdù§ƒP椡£¦& R)ªàÓÁ¨hé…BÀ4ðÕ]Zž¡£¦ ÔðÜÕpÔðj:cP´²:Õ…“åïTSÕ«9@ÝJæ¢KÛš²²üíc¤‡<š°“§5„©”k$¼w« /Nµ’’ñÞ§Iyk Sª’uëS,˜VZK×­L³dw¬%L 1/­H’f³D‡¤Y>^õ“¦#DHI§‰1ëYÉ/=éþiõ¨tÀÐY2yÍ?ÍúÕ&i|ß­C¦/y¿Z<ß­RY2qÍ>•PÈAëMyN*•0-³’*/7>µ[ÍúÔ~a­0,™20j“ƒÖ«4¸ê&”í=kELe‡“žõËÁëUÞ^{Õw—¨æ·0,¼½:Õw›õªï7׊ä5¼iŒääõªÏ'&£f'­F[ŠÞ0±.VÍÍFZµFZµHÆU¦HM0µZG4ª Z˜[šija5iÓ¨9FMÔeªÒ9§1Ū2h&˜MZG4æ)4Âi ¦“V‘Í)4Òi ¦“T‘„¤¤4SIª1l {ßìÑ×Åöéÿµ«ÀÍ{çìÏ×Åöéÿµª‘ŒÞ†íø‡cœÿÈ*.‡þšÍ^O^±ûD|C±ÿ°T_ú6jò\ÔËs¢‹´ê)¹£5&·7¼ü'þ<ÿÈV׿ý6ZûZ¾(ðIÿŠûÃöµÿÑË_kÖ‘Øã¯ñQTbQEQEQEQEQEQEQEsþ;ÿ’yâ_û]覯‹ZëSÕ‹Owxc"+[rí&ÜàEçÂŒA_ixïþIç‰ìuÿ¢š¾d²Ô´½^ÓµLKk}f±x"ŠG[¿˜dT·òH20•ä5pöpß^[Ý[Z$OµMÉÂ0~}¹ùŠ«±àyà5#ëºÄ–wVrj·Ïkw)žæ¸r“HH%Ýs†l€ryàVŸ—¬'4æ²›N“\{ˆZÓÄTsî5ù‡<);r¿7Ìs¸ Íwû;þOû#þAŸk—ì{ýNó³ï|ßwyõ  ÇÄoí§¾y.u(é3y“ÝŒ•eÜò.ÿ¼2TÈ2Aq› ©ë7Š$Ôu¨o¤×íöIj âH¦Lr8q¹¶® ©ÀÎÜîPUº K›;oèFá±£Íáù-íGš"ÜÒÛÍ«½Ù›·œnqµsŸ¸X¾>ÔŸO¶×®¬m&°ÓÖ&Âñ’ɸ¸}ªñ[Ü 0[vrNâÍ»oZŸÚô{K+ˆwMe˜íçVÆØK3´l¸ù¾w,‚70;†Ý„—X,´¨"Ò›éZ„“\­3ÊvÖÀÊʬ­òÃŒ,lá”0+µF£Éáèo/¥º‡ÃóØ£Ý6‰˜FûQksµfòˆ“yo²æ‘.ìí!·P«x²i|U}¯x}õ-{ç’Iü»òÌYܻȨBgoÊsÓ©í‡ ýå½Íœ7sÇku·í¤„$»NWrŽ‘ž•é5Þ…5Œ7Ïg¥\k·6‘4±yÖV‘¨\«³ÆÐ#m[_”*¹pà¹<|ú$Zšø—VÒæ±‚ÃL”H–¾{³´2K±|­ÊÕr€³?2ädâ€ñgŒ5 ËX£ñ¹st%fE½™ÜHÀ Ø3Ä1^9;ˆïW-µíKGñ­®¥âû}fÿPÓ^)#‚îí¢•XHŒˆçg$íÀÎì‚;çøFxmüEO,q£ÛÜĬ$gÑcv8ÚŽÌ›+´1;—‡Qu…ï&µ·Ö®í-ÒÉc¶Zƒ˜ c4ÎR9 Ÿ0drKœ4Œ3ÆÔæí#ñ%„5-ôÛåÑ5(\^yy,±Éòßsýf9ûÀŒ0l{«‹/ ÜGµg‰f‰ƒWCÜÁÁO£+)ÁH’ãKƒA²’Ùô¯²ÛéZ…ªß ý÷‘—–ìG„²–W ,`l¬ß&N?þiçúOýÐ?ï×úWOûsûßðã  ú^»âH%´³Òu]V9t°Ú\H󈪉‚’Rz“Éñ5ö—s¦Du+í/Jv’X­äk‹[cóåþBP¾wÜsÖ¤ð¯üÆüùeOöOüwÏëÇü{}£¯áóm¢ÏþIæ³ÿa[ýw@õ¨5æxuMv-H½úŠîù_7 pUßyðGµIá¿øI?´dÿ„_ûWíÞQßý™æyž^Fsåó·;}³ŠìÔg³ÒnͤΠ½Ô„lÑ,a£u‹8Ú„¸F$’N £vúvúî±iö?³j·Ðý‡Ù<»‡_³ïûû0~]ÝñŒ÷®‘îa½¾ø‰wou%ÜÛ¼‘ÜÈ¡ZemB܇ sŒ½Jçït9¬¼?¥ë-ui,‹Î‰R’ˆ¨a ÆêÀdðAã4NúþóS¼’òþî{»©1¾iä2;`2Ç“€ü*½lxzßB¹¼+®^ÏoðQ¸9Ý Y1Æ1ç¡Ú>aÔjñÁŽ©ikáK[qhÿÚ0¥ÌW·;Ÿg’ûÞsòyylc Hl EzˆfY8ªÁ©áªNˆÔ-¬¿7J™eã¥Q N ŠÍÀÕI3M%éÅL³àôëYK&*U”qÓŠÊTÊ5–|öéR¤Üc”%¥Y½1Íd騒óÒŸæûV`”dt© úVn˜16FqG›íYë8céOó~•Ì ë78Å?Íö¬ß7éNóÊ¥ÓCÍö£ÍöªzúÊ=}GåKÙÍö¦´ØíTLã¶?*o›Ïjj|ßj<ßj¥æý)­0Æ8ü©û0-™²sŠkËÇJ§æý*6”Ú­SÛÍÇJ¦ùOQ¦ÏLTM('­h©Œ´ÓñŒT//=*©›¹ÅDÒg5´iaåëÅBòôâ¡-“L-Z¨ä‘#?ZŒµ4µ0µh¢e*ƒ‹S SKSKU¤a*ƒ‰¦¦–¦V‘Ï*ƒ‹S SI¦“T‘Í*‚“M-M-Å0š´ŽyLqja4„ÓI«Hç”Àši4„ÓIªHÂRi¤ÐM75IÊ@M&hÍ4š£Å&›E%Q›a^ùû3uñOýºíjð^ýû3uñOýºíjhÎFíŸøXv8Çü‚£ÿѳW’f½oö‰ÿ’‡cÿ`¨ÿôlÕäu/szoÝ4f’ŠV.æ÷‚3ÿ Ã}1ý«kÿ£–¾Ù¯‰¼ÿ%Ã_öµÿÑË_lÕGcž¯ÄQEQQEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢š¾-mSCfN»Sz@µÌ <üã8ù¾òôÏQë_ixïþIç‰ìuÿ¢š¾>Öu{;í=#‚K·¸y“4‘¤`€•8ÁfÄ¥Q¹lîÜYÑü5â9®uø4[iç–†ëȵÈÊÒ,eÞ¬À¶A Å@xܧi—'F}TÇ ´[…¶Ÿk9RÄÛ³ X˜É׈4‹¯xžr÷ɦk¡Çöt3AºxçÿWæmoš=Ÿ|pwvÛY±êZjøkZÓUná{‹Ûk«5!ec)I+ƒ¶`w9+Ðg€æÓüAo¤ÛZϧ_%ÎëÛa-«aÂÇ—’6#îìÚX©Á ¥³µqŸ}ay¦^Igi=¥Ôxß ñ˜ÝrSÈÈ þ5Þ'ŽôÛ-GVÔ¬RK½^â{ç"5ŒÙLÖ÷Q¢ÆáɺÎü!<…$àqú®¥ ö¡ÛIJ°²kyK‚Æâir¼ôÛ"ŽqÈ?Rb? ê¯á9¼JöòE¦£ìŽF†B&;‚¶ÖU* .T»ˆ W_ kÌöHº&¤^ý Ù¨µ|Ü(PÄÇÇÎr3ÁÍêPËá]?KU“Ï·½¹¸v m+"@ª9ÎblñÜuíØ[øËA‹Ä£Uc©l¼×aÖï#É›vˆÊÂÏ™ûÐZb7˜ §8Õ…å‘öËIíüø–x|èÊy‘·ÝuÏU88#ƒV!°Ö$Ðîo!´¾m!%_´L‘¹d.æ.áæ`gŸŸÞ«ßÍöFæ´ÏuæJïçÜ I.I;œe¾cÔòy=OZÜþØÓfÑ,D³êPj}”Ö1Elªe‘å}Í.ì¨ýû)@¸.7 ùP ù¼5¯[8IôMJ'7 jí]I™”2ÇÈûåH!zA¢? kÓj“iqhš“ê¦ùmǪ̃¼rÉŒó/$wµÐ_ø£MÙÝÁq©\éñhãJ?h…QáSjÖìÈ‚F|Æ]»—%ˆÈûÆKè‘­¾šòß>™kh¶á¦°Šar<Ù¥mð–ß¿eY]ê`3ääãÒu)´¹µH´û·Óá}’ݬ,bFã†|`™x'¸õ¡æ¾Õî--€’âUDµ¶‚(ûg ˆŠ:–$œ ³1'%‰=#xžÂ}ñgŸU{ÇóÄo.YÈÌK}¬m)0xŠ29iÊÒ;oiém*h–šPG;î4æšI6”e*Ry]>o™À*YC@ìô/G®;-+UM^ÓlæmäÃŒ} n^ªA÷bÖëÄK¡ê÷–ú~ý"îQöÙ†™ÁŸ0]¬P¬L<âͤoÇÐCã-&/¶Ø£ÏœÞD‹<ºM½Ê‡Î,ÒW1¬gfù\áƒmdÚ™ú·‰ì5µþиŸUƒSŠ+¨8¼¼N&–i I0Û·þ>Y,0R2»þP ½cÂö…ge{¦]¬÷©¶_!ǚΈÛ* :— Àg ÅWOê·:ÍÞ•aawwjî²Gkm#0 ÛK*Fq÷”б®êZn« ­ÔKvº€···•(Š5†‹*rK—Ø­ÈMœŸ;†Æ§¯è:¾©âXå›RƒOÕu4Ô¢måFwîÚ?4 ~ý¾`ÿÀ>_›åǵ“_¶ðÅôVö2 &áî®E‚œ¡Ìû72C€7YëšËO¶jÚÙÇçÜÈ1´+—#sݘœ¥s]¦«ãèumf Ù"»Ž²Õ#6Ûìs]µÑyŒMfÀ'gC\ž‰|šv±̲Ok¹YàUf”©Ê?Ë"óóFعR@l€ "ðö¤Ú´ú]Å´–W[Íq$7hѲ¬p´ÄFA*¼qÎGnj¸Ó.NŒú©ŽAh· l$1>Ör¥ˆ·f@ °?0 ’:Dñ޾*K’÷ÃMþϹ³gKtR­42¡híüͱ®ùK·;ˆÚ"ãÙêqøKUÓ&3­Ô÷v·6å# å¬ÊÊİ+ÄÙû¸ã9  òèZÄ?aót«èÿ´1ö-Öî>ÓœcËãçÎå韼=hþÂÖ?¶?²?²¯¿´ÿçËìïç}Ýßs¾ï=:s]`ñ†•oâ{­rÝõ&}Rââ{»iaŒÁlfŽd8BÌ.Jyíâ0BGïÚãÄú|¾1Òï.5 f>ÆÝ :]½½Âƒæ7î£äŒn“æbF㟘*€qu±©ÃpÚ>›yuûÉb cl‘€«lŒè\ãs"¿Íæ3`_ºÿÄÎÖÃ[·ù¡6–öW ¼ýžhb*±ÿm"€æPISñŠ|=¬Ï¥½ý¥äöîÑÌÖ¢M±È¬UïE$‚:€G#Õ‹ ÜÜéiv.íy­å»‚É‹ù³Aÿ2E!J<©xf v•ݹã&mâ‰?µ|7×Úõ ç·þÐ~ìÊøtòäMÊÞ§#åã½G‹¬SÃíhîÙ>Ïq i.l®C!IÝšLïÌM»•Ïú<8ê ¯Ûo#·7[«d´Ó¾ÔE’Os€=$€vÂÂU®5Ý* bÛÞ»LRpYÓåA—†Ž@I@ÞOÌ›«¯ü#cÒƒÿj‹£ç I‡—±rqB:¶,¬Fì`2çpé‰t›Óws¬NÞÝ!·ÖÍ&žVß#4Φa¶UVŽ4mïµS#kl(7‚µ+Tš;©í Ô#Iä]=Œ²G:Êêʦ<)Š^ ‚|³€r»³ì|=©_=¡û4[Ý$²Eu:2Äc‰KJá°wUbB‚xÀà‚i¶žm6I ŽÞâÛì[{æÉåÜ͉YP:6¿0&pV¾â6ÆßÃù¹ÖežÍ.Òt•Õ¡³iAËj¹:’$9+—EàVÒ_J–ô˜.­îbó­î`ݲTÜÈHªÃŽ¿2»‘A6,ü>÷Ús\C¨X›¡“¥†ö3¤g¹·’ ôýªÖ·,UÖ9Y·¦2áÕJ?ÍC.ïÂ@kÚ0Çw?›'—i'–òfÙ‡,")‹Ì®ù—2Cමִ½6-{JoíX–K+œ\åc3BýVåmèÝT.ZÄ·š ͼèwš—٭܈,îl’%E#ævu™‹ÊÄ.ã´g ªªƒcÃ7‰>1é—zM•ܶpjvÍkf·³ŠDH÷íÎFKzd’NHEliÖº<¾Ö®o®'R‡Èz#¦ÉYœù—ï $…Á9e Ÿcq¥äsÍeìkœÁ9pG%[޼ÓÓŠ“MÒu-fá­ô½>îúuBí¬-+È!A8É>⤋BÖ'³[È´«é-Z)'Y’ÝÊã HᱪHôæºËÿhÚÖ&—w{¬ÚÙËqÔvñÚÁ,vmÈ›#DhP‰<ÒìÁ#ÁP0ä—z¾¿g}á(tøo5VºmVçP¸Šëæ**–”02H¡>ñEÏšý1órõ±¡øv}sÌeº‚Ö–;q$É+ïšMÞ\j±#¹føùqòã9 ‚oé‚òÙî,g×d‡výKRHVæLŽ8)"œ}ßßøQ³Ê=$oiw–úˆŠïF¶½HwMikk4Ÿ»+(XÒÝT:ÎAaóaJÊä.þÆãLÔnl/#òî­exfMÀíu$0ÈààƒÒºI~j± ÂâÑÒ‰-o]|À¶RÇI";ʤråyŸwŒîMÔõ-OGÖî¼I«^Ã}§}wö›¡dhS|¬Ò,¤€Ç @R sֺɾ$Y6­u~>×1ÔnY¢–Ò/.ÁZ˜öF›ŠÎ»w;„{ÊÃ21Pþ An"ÞÚEip5­ÛEpVäÌ\D©ÄeËyRã(Ùœá¶\Þ¸‚ Q$m—úL¬—Ö¬îÐ:ǽ\0R?ÚR7 Å:‰¦—Í>µ>ÌwF‡ž=GåKæý+;Ì>´¾kzš^ÌwF‡›ô£ÍúU9½hóš—³ÿ›ô¤ó‡¨üª‡šÞ´y‡ÖŸ³ ¢ëL íMóESóO­!žæŸ³Ñi¦Ï¦)¦lzUmþôÒõJrDæOLTeøÅF[Þ›º­D—Q¦–¦÷¦–ªQ3u–¦–¦¦–ªHÆUM-M-L-T‘„ª-M-Å0µ4µZF¨8µ74ÒÔÂÕIò¨8µ0µ!ja5iò˜ìÓI¦–âšMRF˜¤ÓI¤&šMRF2¤ÓI¤&“5I9 M74MÍ3'!sIIIš«¶ÒQIL–½ÿöeÿ™§þÝ?öµx{ÿìËÿ3OýºíjfíŸøXvÿ Tú6jò:õ¿Ú/þJ‡ý‚£ÿѳW‘R{šÁè:ŠmŠæ:çþ†½?µmôj×ÛUñ'¿ä økþ¶¿ú5kíº¤e=Š(¦@QEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢š¾IŸÀÕ²ÂdTS#4[Y%OßgX”²#¶ÆUòËØù”Ÿ­¼wÿ$óÄ¿ö ºÿÑM_Ýë÷2¥Ävöö·¢aq%å¸a4’Œû‹‡$œ&Ñ’8ápjÃÃ/4ëÌð$¥O¨¤FI0‰#*Ÿ‘°ÅSÍà2ÃÀÔ á÷þÇŽþmBÆÞIâyíí&vY'‰Y•™Nß,r’¬á‰LI]χÄ÷1xšmmí-fy’hšÕÈDRFÑÔ+TTmª  :SÄý„Ú}ÄDð[ÝÌŒÒA33*ÞYåä!™ ù»@4X ß΋¦ñ[|8Ö°ú]µÍåÔmit¶Žò}‚Èàœ/Í”ŠFÚ›˜m*T>åϯ±ðüºt-&ûÛƒsvB¬Q¡Ïú¸‘8ØFn%"G” lk^>7 Ônô2ÒÒÎòök‰£a!kµq*b\ÈÛIŽiTùe?Ö9 TÄž¿ð¾£ž ¸ibDþ\‘ïBJçdŠ®¿2°ù”tÈÈ ’ÖÆÞßÃÓê÷‘ù­4­ie bœ&d•ç÷aâœniå‚2šz•úê $v6–Q"H-U‚¨É'%‹;I9f' rÖúÞãÃÓé’yM ­we1RU\¦$Œ…ç÷"ÃíhÔaC³ ¶Ÿ£Å¡Á{b/ ‘åÙ¼‘ÞÆ7™QTyJBೂY€bcj<7 ÙkV:Üך¬ ah“Df%¦Ž2[dnv€äqƒ¹“¨ Œ{‹Ç¹‚Ò'[XŒIó±È.ÏÐ’.xP|d’li:³éRÏþÕ½Ì^MÅ´û¶J›•À%XaÑåa÷pr å¿…înt´»v‰<ÖòÝÁdÅüÙ ™"¥T¼3;ÊîÏÒ´Ùµ}RßO·hÖYßj—'±ôU˜à($€u‹¯>Æck;t"šÞň£Á ¥Ì‘¢#‚Ÿ6^¨HÞpFn=ר¯#¸6ð\*ä43¦äu ‚qO †A:‹/‡:¶£¨ÞÚÚÏÑÙíO ív,»$ˆÌ˜ä|k½pɸo†ž$‹G¼Ô&¶òþËç—‹Ë‘ò°³,§ÍT0¦98g vðåÝMüa,ï*\élö¨±;b˜•–6Þ$±UwQ¹È€Æ×—Äó\Ø}žçNÓfRHàºh µ¼nì쉑¤‚P•Ýò‘µv€a×Qqá›uñ§ˆtXgýΙöóšB¯(€9r£ ØMÄ í#*H®^ºñdïâû϶bf¼óüû_Þù/çFÉ'ñïdžàž00(8|/s7†Ž¸ní#€»$q¹p]”Wx_)_ ÄFή@S¹7IâÍË@¾¶†ËU‚ùe´‚f‰!xc“¾4X¹+Œ¸ÝƒUí|@öz<öéö&Ibh ÙFyE· 0ùä3£2¤Q6Ǩë“jvVðOkh%‰#GºXÏ›*Æž\a‰$(Tpw`Ü@ .ºÂq_Zý§PÔ`·ótû»Û[A¼Í:ä0! ó"`C2¶°9RsüSªÙë^#»Ô,, °µ“`H „Dƒj*– ¸‚ÛrØÝÍÔØ°ñu农¶«gc+¥¤ö1ÜÍi#·˜Iº5ù¶šW`Øß“Å2¤sþV³mªi6š¤ñØÅ}{Œ“=¼ø‚gÎÔù‘D¤í` e“ e”Çé÷w÷óiú¥¥®‹lñF/.¤šU2:\“²C“°Œô,?Œ®[Y´ÖMÓcÔ!½Kù®7-u:¶íÏ—;AbĬ{ç§Ê»sô­rm*ÞâÜZÚ]A3¤¾]ÔeÕ&@Â9*ÆÖ܇qÜ­Æ45jZn²t¹§´iŽåÆäv+¶Ù§Y+œ“løãºç8±¤ø^ÇP×<c5ÜE­¢µË±û¤ÝKÔœ±¨nl’Bãâ¥uqyu5Žš÷W)wžÐ±h¡¸24‘¦[ LìùÁb¹S–Ŷ8Øôû><©æ9¼íÄó÷‡žø=8^9.¯­íü=‘g'šÓJ·w³!YÂb8Ànv\°Ææ‘†"±¯­é_ØšÄúwÛìoü¿é6y°¾T7ÊØÆp}Á¬úÐÖõ_í½b}Gì6vßôk|¨S å\œg>äÖ}QEQEQEQEQEQEQEzGÁ?ùnëÁÿôduõ›þ¬WËŸÿäu¹ÿ¯ÿÑ‘×Ôzoú±@=ûAÿ¯ðïý¼ÿí*ñšö_Úý‡íçÿiWŒÖrܤ{ìÙ/›ÿ 1ÚeÏ¿úê÷šð?Ù¥÷z¢cúí^ùZQEQEQEQEQEQEQEyÿÆßù$:ïý»ÿéDuò }}ñ·þI»ÿnÿúQ|@ ER(ZPi´´ 1Ù¥Í2—4ŠLx4 Ó)iXµ!àÓ¦f—4¬h¤H (5iA©hÑH”5<5B 8zV6ŒÉƒSƒT Ó¨hÚ3& O Pfœ¥£xÔ' N P†§©hÚ5 ÃSƒTÓƒT´o„á©ÁªÔ¡ªlk„û©ÁªÔàÕ<¦ª¡6ê]Õj]Ô¬hª’î¥ÝQn÷£u.R•RmÔn¨·{ѺŽR½¡.ú7Ô[©†ƒy´r‡µ&ÝFê‹w½½èåhIºÕê7QÊ'T“u!ju!jv!Ô$ÝMÝLÝMÝO”‡Pµ4µ0µ4·½UŒ¥Pyjijajij¤ŒePyjaji4ÒÕIÊ âÔÒÔÂÔ„Õ$a*‚–¦–¤&˜O½RF˜âÔÒÔÒi¹÷ªHÆSM4šBi¹ªHÉÈRi3IšLÕXÉÈ3HM&i)ØÍÈ\ÒIšJd6)4”RS%°ÍQ@‚½ÿöeÿ™§þÝ?öµ|ÿ^ÿû2ÿÌÓÿnŸûZ˜™ƒûFœ|C°ÿ°Tú6jò×®þÑ¿òPì?ìþš¼ƒ4ŠOAÙ£4ÜÑšs¡ð)ÿ‹…á¯û ÚÿèÕ¯·kâÿÉBð×ý…môj×ÛÔÈaEP ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñßü“ÏÿØ*ëÿE5|«sáÃt-ªþlWFÂy 7–’²Èäf‰V$ Ü¡¤%K~LŸª¼wÿ$óÄ¿ö ºÿÑM_Üê7×[Áuyq<6ë¶å•™b ('Àéè(¦°Ñ,-µ™4Ùü÷½E»šã2°Ü¬˳k!û¨¬²n!†ÑU?±ôØtK,”ú†¡e5ôRÛ2”…cySkE·,?pÌ\:í §f [Q¶Õ§o¨]E¨g7QÌË)fÎã¼äää眚#Õµ(t¹´¸µ ´Óæ}òÚ,Ì"vã–LàŸ•y#°ô £Æ>Ðô+{˜ôÝNK«Í>÷ì7` ]Y°ùbL(±ÆpåÎNKeèMÞuyk}}²îÞÊ;DRI$ÂR¤1GÎ<¢6…É.9ÁÏšÿXÖb¶³šîúú;8›ìð¼(‚5\¶Õ9Ú¡S'¾‚«ÚßÞXùÿc»žßω ›É§™}äluSx4Ôkz5ž‘§x¶Îó?³üAœJFØ#p®Å'¨ãBhÖwëáˆäO*6Ñ.ïnL +ÍäËvänÁÈ b8àŠæÛVÔ™/Qµ ²—îñLÍ‹† X9ùÈbNNy9¡umIRÉP» `åìÔLØ·bÁ‰Ÿ–äc‘šë?á ³Õ4t½Ñžt¸¹Š;›{+‰„ޱîºÔ•@]šKxUU§D9$j>ðüj©c=õÔñKrö޲)ó-£wU•fÙã;>gI¯ÎÞYX‰n]µÝaõ5Õošú]žeɸs#ì*Ë–ÎN !…WÐTqêÚ”:\Ú\Z…Úió>ùmf;qË&pOʼ‘ØzPé°êº·‘pÒ#·¸ºF@gXayJA X&ÝØ8ÎpqƒÒKáï ÛxpxŠdÕM¬ßg6öIqñ½îãeiŒxëk¼0¾Í¼ï}·Û-öê6¾|_f•1sWÊ哿u¾F#¿ÊqÒ¤¼Õµ-Eç{íBîéçtyšy™ÌŒŠU dòUIž€( ÔôHtmÅ6MåÏ>®Û٥Ɍ+ vJ†(¤ŒöqUõýMÒ¬šêÚêIRöà>š¾b³}—fæ2àŸs¤y\®ø§_áŽÚ¶¤Éz¨]”¿p÷Šfl\0bÀÉÏÎCrsÉÍ–¥6§p²H±Åh#‚Þ DpF !N2I$’I%˜–$ uèe­ð½¥”–ð«Í*òôDm#o4Æn1)¹?½…—Éâ$Ë\‘æ¾ß?«‘êÚ”:\Ú\Z…Úió>ùmf;qË&pOʼ‘ØzPYâÍ/A³ðn‘.‹}cv«¨]@n"Žešäà;Ÿz(]¤Ÿ(‘@.w¹áêC<Ín–í,†vtŒ±Ú¬À t…PO}£Ò£ “ûM‡D±2Á©O¨jS_E-³)HV7•6´[rÃ÷ ÅîÐÙÚva¬x“ún›o«-‘»èÚšé·/4ªërÌ&ýâ(U1 À~R_ï›åù¹øõmJ.m.-Bí4ùŸ|¶‹3¸å“8'å^Hì=(¼Õµ-BÞÖÞ÷P»¹‚Ñ6[G4Ìë à ' 0 `zJë5Í'Gµñ‹ïï-gkm¬¡³±•-öù9R£€ª!#h_â¸2_øy´Õ–îå-ôÍJîæt@ki.£FÆÔf‚ A'— F9xüK¯CªMªE­êI¨L›%»[§ºñÃ>rGʼØzUxumJÚÈÙA¨]Åh]œÀ“2¡fC ã% R{‚GJê5 Ã0ë¶:}¼zÈI­à¾žG‘dòb{a3&<¹É›*îýÓmù°üI§ÙéúŒcOý’h„±4² U×$nI®õ;{¢2¶äe „š÷Zî±}¨Á¨Þj·×Ðmònf¸w’=§ríbr0I# W¾¿¼Ôï$¼¿»žîêLošy ŽØ ±äà? ¯EPEPEPEPEPEPEPEPEPEPEPEP¤|ÿ‘Öçþ¼ÿFG_Qé¿êÅ|¹ðOþG[Ÿúðý}G¦ÿ«ã¿´/úïÿÛÏþÒ¯ø¯hý¡×xwþÞö•x±Çÿ®³–ãG³~ͼKâVde öR wÿ]^ó^û8ÜËu7Š%™‹9ƒ'þÛW»Õ¡0¢Š)€QEQEQEQEQEQEÃü_°¼Ôþë6v“ÝÝIäl†ÌŽØž2p£“€ ü+åøA_Úî-øÆq¸Œã#§¨¥Ê‡í¤|sÿW‹èV×?ð]7ÿN ñgý Úïþ ¦ÿâkìËû=NÎ;Ë ¸.ídÎÉ H‚AÃ#ð«¹k4|Yÿg‹?èV×ð]7ÿJ¾ ñfï k€ãŸø—MÿÄ×ÚTQìÐÖ.¢>/ÿ„7Åô+ëŸø-›ÿ‰§x«þ…}wÿ³ñ5öu½’-cj.ˆøÈx?Å_ô+ë¿ø-›ÿ‰¥Oø¯jîð¾¸ÿĶn¿÷Í}™E/e¿´*öGÆ¿ðˆø§þ…sÿ³ñ4¿ð‰x£þ…wÿ³ñ5öM{”³*Ë¢þ¾gÆÿð‰x£þ…sÿ³ñ4'„üRQKxc\ Ž@Ógëÿ|×ÙRöö¥k쿯™ñÏü"~'ÿ¡c]ÿÁlÿüM/ü"ž'ÿ¡c]ÿÁlÿüM}‹EÂ%kWì¿ó>;ÿ„SÄÿô,k¿ø-Ÿÿ‰¦§…|RcRþ×`d 6~¿÷Í}E/aþÖ¯{Ù~?æ|wÿ¯‰ÿèY×ð[?ÿKÿ¯‰ÿèY×ð[?ÿ_aÑGÕâWö½~Ëñÿ3ãÏøE|OÿBλÿ‚ÙÿøšŽ ø¡ [Ãè!@#û6O÷këûëû=2ÎKËû¸--cÆù§F‹’ËIñ¨ôÝ[MÖmÚãKÔ-/ W(ÒZ̲¨l‚T‘œqî(ö'ûZ½ïeøÿ™òGü"¾'ÿ¡g]ÿÁlÿüMðŠøŸþ…wÿ³ÿñ5ö}^%k×ì¿ó>;ÿ„WÄÿô,k¿ø-Ÿÿ‰¦§…|RQKøc\ ‘ý›?_ûæ¾Æ¢aµ«Þö_ùŸ xŸþ…wÿ³ÿñ4Ÿð‰øŸþ…wÿ³ÿñ5ö5ý„CûZ¿eøÿ™ñÏü"~'ÿ¡c]ÿÁlÿüM1|'⢊[Âúàlr?³fëÿ|×Ù4Qì"KÍ+v_×ÌøÛþ/б®ÿà¶oþ&øGÅ?ô,kŸø-›ÿ‰¯²¨§ìb'™V}õó>4>ñOý úçþ fÿâi‹á”¼/®Ç#û6oþ&¾Î¢e^aUôGÆ'Áþ*ÿ¡_]ÿÁlßüM'ü!¾+ÿ¡_\ÿÁlßüM}ŸE?d‰xê¢>.> ñ_ý Úçþ ¦ÿâi£Áž-*3áms8çþ%Óñ5öýš%âê3â³à¿Э®àºoþ&“þ¯ÿЭ®àºoþ&¾Õ¢ŽDKÄÌø ø'Å¿ô+kŸø.›ÿ‰¦x¸(ðŠë?è7ÿ_hß_Ùé–r^_ÝÁik7Í<‚4\Xð2HWÓ5Ý[ó²u[ÿ'gÙ.]™Î3´œg¯¡§Ê‰u¤Ï¿áñwý ºçþ ¦ÿâi?áñwý ºçþ ¦ÿâkíª)ò¢}¬‰ü]ÿB®¹ÿ‚é¿øšOøA¼_ÿB®¹ÿ‚é¿øšûrŠ,.v|Gÿ7‹ÿèU×?ð]7ÿH| âÿú5ÏüMÿÄ×Û´Qas3âøA|_ÿB¦¹ÿ‚é¿øš?áñý šçþ ¦ÿâkíê)ŠçÄ?ð‚ø¿þ…MsÿÓñ4 âÿú5ÏüMÿÄ×ÛÔP> ÿ„Æô*kŸø.›ÿ‰£þOЩ®àºoþ&¾ß¢ ãú5ÏüMÿÄ×·þϱ¢ÂIý­¥_Xyßfòþ×nñoÇ›œn8Èéê+Ü( >>xk^ÖÒÓhMos¯[ËS´%Rĉ˖ò¢•*60*¹PvgéÿÉ<ñ/ý‚®¿ôSWÄXº–çPe– (<ŒÂ±Ù"ÕTœËŸ3ýöff˵ÒéÆÈøá=\$ŒÒÊñ4¬ù¡B¿Ý*ñ1‹…W^faÏèúö¸/ÑcX¬í业Y[j€‘¼›Aîåcl(äí'€¬EË?_ßhí °¤—Éi‰ m2¼¹ cUaI+€ eÜØ Ë \ÜáÆÑ–-@iiƳInm'’˜H˜”ùÄJX§>e5Þ…5Œ7Ïg¥\k·6‘4±yÖV‘¨\«³ÆÐ#m[_”*¹pà¹>w¥é³j×ëi F„£ÈòHHXãD.îp ª³`N08Ш-ÄB[ÛH­.µ»h® Ü™‹ˆ•#XŒ¹o*\e;3œ2ê&>¸ðü‘Å÷FGS"äê.ƒ{•ˆ0Ø€XÁUÀ²¶_fÐN ¤XØÅ»ÿ@šÈ$‘í°ßz8¢W\(Ÿ´3H'Ì5ÃߨÜišÍ…ä~]Õ¬¯ ɸ®¤†zTpA5ÕÄVöñI4ò¸HãK3±8É$ñŠê<$Pé>%šXtiž+$’Ù5ï=fB aÈf!¤¨Ê¶²¶Bˆ/49¼ÒI§é²\Mop÷²µÍ´ —EäòöB!3à ,]›Hk“Ö|/¬hZË©XÏoçIJ”’'F‡sÊŠ²k7’ìuç×ît-bΞëJ¾‚ß™%·uQ±ÄoÉÂìª}€y4Úx®æÈxWU´³ºÑ¾ÆúżšeµšÄ'û K)A¹Ž"Ÿ¼°-çur÷IÔ´Ôïôû»T‘äDiád ÈÛ\ ŽJ·v<¹áÿ ë'žx´›î<ˆžY8Õv£8RT3l* õl Ç¢´5ÍóÃÚåî‘~›.­%hŸ€ØèË R0AÇ ƒYôQEjù<4ué4³7 n›!a! «×fbuÜx$2U°—EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP¤|ÿ‘Öçþ¼ÿFG_Qé¿êÅ|¹ðOþG[Ÿúðý}G¦ÿ«㟴7úïÿÛÏþÒ¯'Šö¯ÚâoÿÛÏþÒ¯Íg-ÊGµþÍñˆÛÄø9ì˜?÷ú½â¼ömÿ„ŸþÝöµ{ÍZØOp¢Š)ˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*9ähmå•!’wD,±FT3>èÜ@ÉéÉÔŠ’Šçÿá!Õ?èL×?ïõ—ÿ$Twú,÷þ*’êßÄRY:YG‚Þžxyàd$ÆlËæùH®’²õ/éú­ÂÜOö¸§Éi{5³:‚H bu,,@lãsc94=JmFÞån3=¥ÃZÉ4 ù3²—$œdí+“µÕÓ-·qÔªö66úuœv¶±ùp¦H‹I%™˜ä³I,I$’I$ÕŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º£þjú7ý¿Óÿïïú/_û|û¿ð/à­MSK´ÖlÊõ$hÑÿw+ÄÁ‘é „0!”‚:TzN‹e¢E“}n—Ïå]Á¨ùÑE,*%FŠ6‰ßÚ®Y‘ðŒd𨓯–dú,š†ª–ï+j¦Ò9ng"K™4m(Ù¿ín¥„„„‰Åš –}m –«òËiÌ#BðÇ!'|h6±rW!q»©éZ)Ô­î.æ¿´ÓìíÝ#{›¡!_1Ã@#GlŽsŒ|§$Ô½¹Ñü@¾-×ïš{]J{µ¸ÓíÒTd-,¬Ò# nl&H`¼YAËðþ¥•«y÷ !‚K{‹Y `Ešˆ¸€ÅCîÛ‘œc#9$ð£Á¡ÿkO¬iQÃæÏo剙ÜÍÒc]ŠCn ¤:“#s© à[ñx¶‘ÞØËp—bÊî4i3i9Dm”Û÷r"ó7Âä²лñ'†ît] ËÕE¬PŸ3l~dÒE-ÛmëˆÕÅÖw|æ2¸Û'Þ;ŸÄ}÷ûG˶¾iûVÍÈœy¿Ú{sóÓôYÿuúànåâðEÔšõ¯ö•ˆŽÆ#,ó„¶J¶è–#2m*Á‹Æ¡p2@tÝÍÏ [\K˜ËÆåÇ"º’8e$0÷ƒÚ€;ˆö›uªxŠÞÃP»ÔžÿXOq2*¤kœˆ‘°‘üÄ+.|¸¸ü¹~×´mQ¹›YҾݱy*T¸tG"9€Äˆ>h`3œ6Ì`f¤?µS§ØCqi=ÝâyžL~fäMŒûÀ(<äÛŸ4`;p ,‹ÿjEăU½´Óí#e»ºŠá̆@Š#ò¼ÐO“/Þ@>Bs†RÀzæ¬úö¹{«Km¼×’´ÒGí›Û–#s1ääõïÆg×I{á«K?[ê­«Z}½¯nmžÕYäÝåùXÊ… abÛö•+´“‘Q¿†^ItX­§¾ß§½óÌdb‘¢4¾a`P2ìX›*¡ó°•-¸-sõÒYÞh1ø*ûMžóR]Bæâ+ ©d´K:ªo3†óA-·åÁáªOøBgrj¬éQékå¾w”$‹!•ATòüÇ‚D#fî7cfXs÷ö7f£say—uk+Ã2nk©!†G”XÜEiyóYA{ç0N\#äÉFVã¯tôâµ»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9Íi°êÚÜ6— "ÄRIa [b3íÜAƒ·FPÍš±â"ÛI½¶[O1c¸·ymp—"3½Ó <`$£äÎä”?25Fu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“$šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆAØÿ„gOOXêKcwwyue5˵kxÌee•2-ŒfWEXÃ1ÝÈ H_𭯆¯!‚ù'žY^ û›;Ø&(ˆÂ.M¾Jºƒ&X€[`*ÑÐX×tápòŸ èÅDF[ͪA9aûüää’GÊ09Œë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9'¨ÿ„ÄË%ðlXGE­W¶Œ™$iUUod\@ÎYˆ'ËÛ•v\¹|=—†>Ûso#ê$’¥ºÝÅ–ÉŒ’·oÞÈw&v…qfù‚gÉ®éÎð²øOFŒ#îeYo1 ÚFÖÌäã$0r£œdkºp¸yO„ôbŒŠ¢#-æÕ œ°ýþrrÉ#åœêx§À—žðöŸyyo|—rÝÍowæÛ”†6T‘QˆùóºA»î±FÛ•]íÇÐÁÖl œÐ éBI7íœIu¾=Ä‘´yÛ~\€2ÝÜrL’kºs¼,¾Ñ£û™V[ÌH6‘µ³98ÉŒ¨çRÃÂö>[ÙµKi=Д\ƾYŒÉ„Å|Ù”ù|ʇbolÿªzÃðö›­­ÃipÒ,E$‘¶¥¶#>ÝÄ;pdaµ,Ü)  ]Ó…ÃÊ|'£dUo6©å‡ïó“I(Àæ3¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸äÉü?¡Úk6öòEw'ÚíÄ°Û VÚ8ã;¤ Më/• ýØ#jã.P°hÈjz§†ôí;CÕnbÔg¹¼²ÕRËc[4co´`º¿Ì$>@;z(` ,H@ rkºs¼,¾Ñ£û™V[ÌH6‘µ³98ÉŒ¨çîœ.Sá=£"¨ˆËyµH',?œœ€rHùFç;~ÐubÐJØHòl[™SuüQÇ#4«…ŲnŒ!g2"ïc¸ˆ^¤èçS–3y< ÚUÅì©*]$qÎÀ „Q‘þàËÈ/åã*ì \ò,×ÊÇ;–X£,U?tn$àtä“êMGEQEQEQEQEQEQEQEQEéÿäu¹ÿ¯ÿÑ‘×Ôzoú±_.|ÿ‘Öçþ¼ÿFG_Qé¿êÅxßíþ»Ã¿öóÿ´«ÄûW¶~Ðÿë¼9ÿo?ûJ¼HœÖrܤ{wìàr|Míö_ý­^ï^ û6õñ?ýºÿíj÷š¸ì'¸QEÄQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETsO ²žXâBê‚‚ÌÁTsܱä@ž¸{u–3:"»ÆnUbB’:€J°¾Óé@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢š¾+Òõ t^ËR·Ti­'KˆÖ@J–F Áµö§Žÿäžx—þÁW_ú)«ä[Ù,ðɧi÷D–Ö¾t tÝ%º2• @rI'qàr(ž•®M¥[Ü[‹[K¨&t—˺Œº¤È$€ãknC¸îVãž2¹½:¬²éºh»Ôžc-ÊFá‚I'˜É·~lj!Y—å!D+_G°Ó±¯µ}R+»ˆ-® ¶[{YÖ-*ÊÛ˲8À‘·o;ÈÆ…ö é¾[¹àÖN ×·–)Y ¢²ÈêUŠæ…h²Ù9;× ú޹6§eoö¶‚X’4{¥Œù²¬i寒B…@vmÄ +Z:m½Å¤Öš…ämtd æ `Ž nÆ3˜äEÇ„tXïï­•µ$MSþϾ—p—í$ìÒª¬y…Ù˜·•VÏͳxsÃë¨Ìó}¹l(Í£=ÒÇ ÎåÂwä²üÞYÀ’8°DŠå Gp?}âÔ484¹4ûü«¹nþÑ 2;<¸6†òÕpˆTØ1ŒœÜºñ•Í۳ɦé¤Ü\}ªÿ1» évºï3‡Ëþ«ËÁ|ŒR¸wößcÔnmvξL¯."ò¤$|铵¸årpxÉ®â?èWWÖÐCq} 0y¿ÚLOîÚ(d•ã‘< öÒb"0êrûYÌL n •¤/Ÿ61‰dM¬õÈS×tÏìOêzOç}†î[o7nÝû®ìdã8Î2k¨‹L³“P°ðÕÄÓÛØ&”Ú¥äÖÊ Í1³{¥r¤ŒìVX–‡ ¡‘¨RñEΡ¥¶–---lÂÑAr!ùÄ*—fb \JÇq'$`€¬ý[R›YÖoµK…g½¸’âEŒ¡‹2IÆO©®¢}A´Ñ#ñ°êRi÷ ŠÅnÑe¤{”ËMåÀ}‘Žkþ° ü¹kš¯‚4}.èéj¾›S6š…ÇŸ„HWì²Ü¹‚Íæ-¾1¸l'9|íúøßÄá!X­Ú,±´r™i¼¢²1ÀÖŸ—,‡g¯ ?Nh-t«ï)!:†f32¸ÚdòùFdûœ‘ó|ÕrëÆW7nÏ&›¦“qqö«üÆì/¥Úë¾@ÎBK/ú¯/ò0UJèk¾Ð|=¥Î':•Ρ§¥‚’¤q;Aåí›IQûÀ |îäï\`îjÿ4{;Ë–¶¹¾¶’Ü#‘ÑžHâ¿(` +§¿Í´ç(Ú|²däÏŒ%‘ ¬ÚF›.–-5¼áEFVV IÌÓ™Èýáã…ÚMã]Jé&’ê Iõ x×Pda,qÎÎÒ¢ª° e—’„0àŒ.Ý„ÐtÛ][N’>î5_ßý›Qu™‘„7B6F€ŒDާopAèkŸ‚ÖÚOêa$pêvÑ; ²£pnîo_ÎY^Þm“ @WÎ|»zdV_ö±ý±ý‘ý•}ý§ÿ>_g;îîû˜Ý÷yéӚϠ¢óÆu©F=Jµº;’F„ÜbHZ3Cµ¥!c(Û@@¥@JàQkãFµ¼óƃ¥Ivem›–иHªD¡Žÿ:BK–#wÊT+ ñÝ–­ÚÙC›GÖ㳊X-’Žº$(yYD)ºI Ù Æ^O?¾°¼Ó/$³¿´žÒê ÿÈësÿ^ÿ£#¯¨ôßõb€ãI‚úÖM v{x¤ºk«{&8Ä×K)²˜Ãí[CµÌa’ªw>v|K{á©â×å·¶ÓnÄ÷ƒÏt×öêÞ{O7’Q|¦¸q·È Äâ3Ÿ›Ì4ærëºÄßaóu[é?³ñö-×~ÍŒcËçäÆÕéº=*Å®»âGÖ'Ôlõ]Uµ9bo:æ‰ Ï.æÜÀî*9àö­Ý*ß[ÙAo¡¤-ik<²i‰nÛî<•YIx³·ç6)Tà6ÜÇ?Á…?á xäž|í>úyæX“{ÚJŠ ± 2Ì$u  1Ín÷ †uG)Ú¬À•ô…b}§Ò®K®ë}‡ÍÕo¤þÏÇØ·\9û61/Ÿ“W¦>èô­ ?"ê±·ØEÕ¾¡k4Eü¤œÆÉ2Èœ;®ï'*2\Muž:›ÃÉ÷º8ѾצµŽ¥<ûÄæ06²ypYðA†ë+ãÆ­â«]gP¿†³©l¾¸J³¢†TÄÀظnûG¥eÃyogsg ÜñÚÝmûD)! .Ó•Ü£†Áäg¥z_C¥øÃÇ~—&†ÿxӼŵ’Ù€¹ŽTP| çi eTcz¨öÉa‚ï ¡Ëåù¹º-y˜lu[¥cò²¼gËáUÐffšêÚ’¥’.¡vÁËÙ¨™±nŃ?!,ÈÇ#4^jÚ–¢ó½ö¡wtóº<Í<ÌæFE*…²y*¤€O@HNŠ’y溸–ââY&žW/$’1fv'$’y$žsZ ­Ìú]­±óâÑ.b¡òo2DÀ}àZF ðpîàT&]¡c®ëd±ËaªßZIFx.2±–.PxRĶ:dç­W[ûÄòöÝξTOx‘¾íÈ=ï|އszš¯EI ó[9x%’'(ÈY©*ÊU‡Š’î rÇ]Ö4Éc–ÃU¾´’8Œð\»¬I*Êú­óH’‰ÕÍÃ’²w~ði$`zåØõ&³è  ×u„ÔcÔWU¾[è·ùw"áĉ¼³69.äú–oSUῼ·³¹³†îxín¶ý¢„—iÊîQÃ`ò3Ò«Ñ@ëºÄßaóu[é?³ñö-×~ÍŒcËçäÆÕéº=(}wX’òêòMVùî®â0\Ì×^hÈ£¶rË€ Ï¢€5·0°Ô#>d—š“ÿ¦]Í!v–=ë&܄ȡ™‰$íP6ÛéÍyqgmg5ÜòZÚîû¤z×Ç5ô:n«ÝÅ·Úbvè±Ý•#þZ#§|ò§ð8 ¯â-Z×Y¿ŽâÒÇìq¬B3ØH$ç÷1D½ÇU'ޏÀsKÓfÕ¯ÖÒ G‘䱯ˆ]Üà…UfÀœ`p*M[I}*X?Ò`º·¹‹Î·¹ƒvÉSs! :« ::üÊ>îFAìiþ'Ómõ;yLJltýž`ûM‹Ü4ÑÑdQ,Ì»‘™d\m;‘pËÖ¤½Ö4cĺtšÔúÍÞŸ¹ŠîùUöí³#+°fa‘¹#å›äŒr8PžÞŽ×RºÖôÛw»·{ˆ-g2º«¼xÊÄPѰaÛ8¨æðûÛ^[YÜê0]>ï´Ã+²› £'Í;q»ù³ä*å­‹%·…×O¹Õõ[˜ÒÒ{tÑͺ­˜26¹3ædi<ÐLdîU€ ž#ñŽ›âW”ê7ZÍÚ^^›¬L-Jɘ ,íæ&é‘û­Âdà ϫ#ê6+¥¼BeÕš e,è<ÍÅã‘BìÝò3c`-YÿÙ.š?öÅÌë'6ÐK»Ì¹¶³ @Psó1PJ°RÅXÑ|{Ií"×Ï ´„ºIÀ8 @] r9V§Š|TšÞ$2êú®µu5ÚÜ JÝaû(Ã$J²H¹u$  yIÁãhrxɰ]F_hɧºDÑݺ*æG…ïis•§'5NçÃÙé‘^Íâ-(}¢)&¶„%ÉyÑ$’0W÷;F汸¯lí­ˆ¼`ƒXÖd´ñ¹¡Ø\KµM>Ù^C*ÑÂŽÞr²2£ï6ãÉ$€L—6¶žÂñ 椖’¥ÚAáÔÂ3ÈÉó‡Œm w"´@77‡ÞÚòÚÎçP±‚é÷}¦]”Ù>iÛØÏÈ…Ÿ ©Pÿ-WÕ´—Ò¥ƒý& «{˜¼ë{˜7l•72ª°Ã£¯Ì£îädOYâ?é¾%yN£u¬Ý¥åéºÄÁIÒÔ¬™ŠÎÞbn‘ ºÜ QÆANÅÄ:Åí´‘Owvð[ˆ¥¾½P³Ý¶÷mò ÍÈVXÆY¾Xב÷@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@‘ðOþG[Ÿúðý}G¦ÿ«òçÁ?ùnëÁÿôduõ›þ¬P~Ñë|;Çüüÿí*ñÒ½·ö‰ÿ]áÏûyÿÚUâuœ·-l{ìà0|Oÿn¿ûZ½Þ¾!°ÖõmËý•ª_Xy¸ó>ËpñoÆq¤g?™«GÆÞ.Ïü:ßþ %ÿâ©©h'Ú”WÅð›ø¿þ†sÿÿñT¿ð›ø»þ†sÿÿñTù‰±öµñXñ¯‹ÏüÍ:ßþ %ÿâ¨>5ñp?ò4ëø0—ÿŠ£™µ(¯Šÿá5ñx<ø§[ÿÁ„¿üU!ñ·‹¿èiÖÿða7ÿG2 jÑ_ÿÂmâÿúuÏüKÿÅS‡¼_ÿCN·ÿƒ øª9ƒ”ûRŠø¯þoÐÓ­ÿàÂ_þ*œ¾5ñý :Þ?ì!/ÿG2)ö•ñšøÓÅ`dø£Z?öÿ/ÿQx°“ë˜ÿ¯ùøª\è9Yöñyñ¯‹Œx£]Ͼ¡/ÿL>5ñwý :ßþ %ÿâ©ó ågÚtWÅ_ð›x·?ò4ëŸø0—ÿЧÂkâÿú5ÏüKÿÅQ̧ÚtWţƾ.ÿ¡£[ÿÁ„¿üU/ü&¾.ÿ¡£[ÿÁ„¿üUÈ9O´h¯‹á5ñý :ßþ %ÿâ©|\æi×?ða/ÿG0¬}§E|_ÿ Ÿ‹T‚|W­öþЗÿФÿ„×ŧ§Š5¿üKÿÅQÌ‚ÇÚ4WÅ¿ðšø·ò4ë™ÿ°„¿üU8xÛÅØÿ‘ŸZ?÷—ÿŠ£™”ûBŠø»þOçþFoÿÿñTÂiâÿú5¿üKÿÅQ̃”ûFŠø»þOÐÑ­ÿàÂ_þ*—þ?ÿÐÑ­ÿàÂ_þ*Žt§ÚWÆ ãOÐÑ­ÿà|¿üU?þ/ÿÐÑ­à|¿üUÈ9O³(¯G|\?æfÖð>_þ*§1ñsùõœ×ô¿üUÈ9O°è¯ŽGŒ_þ*š|[âÝÜø›[ÿÀùøª9Ðùö%ñïü%ž-$mñ.·øßËÿÅRÿÂUâñ’|I­ÿ_òÿñT½¢F}ƒE|z¾,ñqëâmkÿåÿâ©ÿð•ø°uñ.µøßËÿÅQír3ëú+äño‹wcþMdû}¾_þ*œÞ(ñ__øIõ…öþÒ“ÿЧí¹õíòñ_‰ñÏŠ5¼û_ËÿÅS[ž)íâ}oÿåÿâ©{D>F}E|‚)ÖÇý¿KÿÅS¿á'ñPá¼Q­zcP˜ÿZ|è\ŒúòŠù|Uâcð•ëA½ò_纠oø´ kYôû|¿üUi#>À¢¾>+ñyÿ™—[×íòÿñTŸð•ø¿ø›ZÿÀùøª^Ñ‘ŸaQ_Â]â¼sâmhûKÿÅRø»?ò3kXÿ¯ùøª=¢F}‰E|{ÿ ‹?èfÖ¿ð>_þ*x¿Å`œø›Z?öÿ/ÿG´AÈϰè¯GŒ_þ*hƒ‘Ÿ`Q_ÿÂ[â®Þ'Ö¿ð>_þ*ƒâÏãþF}gð¿—ÿŠ¥íPr3ì +äñ_ŠÈÿ‘ŸYÿÀùøªSâ¯vñ.µÿƒ øª=ªfϯ¨¯¿á,ñh8>%Ö¿ð>_þ*—þßÿÐÍ­à|¿üUÕ#>À¢¾>ÿ„·ÅŸô3ë_ø/ÿBø·Å§þf]gÿåÿâ¨ö¨9ö òñg‹;ø›YÿÀùøª‘|UâÃÀñ.²íþ_þ*jƒÙ³ëº+ä?øJ¼WœÂK¬ÿà|¿üU/ü%^+ÿ¡—Z?Kéøª=ªfϮ译GмWßÄš×þËÿÅQÿ GŠÏð’ë_ø/ÿGµAìÙõÕò0ñ/ЉñSë@×ü¿üUÄþ)ÇŠ5“ú—ÿŠ£Ú äg×4WÈgÅ^)ð“ë_ø/ÿGü%^+|M­à|¿üUÙ³g×”WÈcÅ~+ëÿ .µÿÒÿñTŸð–x¯8ÿ„—ZÿÀéøª=²fϯh¯OŠüYÛÄÚÏþKÿÅP+ñ`ëâ]gÿåÿâ¨öÈ9õíòü%~-ëÿ .³ÿÒÿñT?ŠüY·#ÄÚÈÇý?KÿÅQíPr3ëú+â)|uâõ•Çü%ZàÃÿ!øª’x®5‘›ÅëÈTª)Ô%Ú2$üÝGo~sƤlÑ_ÂwãúõÏüÍÿÅU‰þ"ø¾e+ÿ «[vc¾˜Ë}îŸ6>о”ö½ñ4ßü_)”jñùŽ 7Ë€x~ÏOaRˆ¾+0^ñ±æNÊSmô GÎNÓ»ÛýxäíJΚûì¶–ñD‚[©#\yÀÀ³Ê;Ÿêkã8ü}ãØ·ü%ÓeJáµ ˆäŸ½Ôg#Þ¬‰>.VÈ×õ 0v¨¼› rH oíœ`ä` ƒŠúOÅðoˆd3–3éWgÌÛó\âäà‰sÇ©#×-òE•Þ£v––6³]\ÉÁwl œ(äð ü+¡ºø‰â›Ø.-î5›é-®c–9`k©J0~½[83Œ C6îzÎî[ ´¹…ai8À“'#£‚§¯qï@j:V££Ü-¾§aue3 uŽæŠäŒ€Àd}T«zŽ¥>©p³ÜGjލ kH­×'•TÏ\g§ ª”©áí6[[†Òá¤XŠI#l!KlF}»ˆ"0vàÈÃjY¸SVÏMÔc†ÐO ƒOgq ’KI2AÝUC6±ARÛ܆µŽ<».x|7£Búb4vÛèíF262f$ò³†2°RcÏêW°_\,¶úe¦ž˜­ZVRr~cæ;œóޏàq× 袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šô‚¬ÆwLÇX>Oý´Ž¾²ñ ¤I÷euYP‘_5ü‹Ïñ„ðd-®ÂG¡– kê4›{k¡ +„Ú ÍxÿÇû¨oÃs@áÑ…Îÿ¶Uãº×¨|kmu»{8øŠ‰ŠMÑÀÇõ&¼Ç²–å­†ÍFWœb¬ÇÖ„à’{Vw4±[Ëö 'µNѲu¤ ïEÂÈhNœ‚¹<ñŠ—t H¥+…ˆJ/ðœýi6’1е*ަ*.HÆ)©‘ÂiDc6¯¢2:ÑqX‰b y§ªp4ü`EIC¨lf“cDlX(Àô Æ6g¯½[L+µXÿxŠ ’ í 3íš\ñQ#f oOÆŸ%™U'r;ŽôýådÝœ?ªñJpÙ89÷4ù¢¢Ã¹Âôç¨÷·òßi䊜¡^¸Çµ8p£púqG0(•¼¬ö¥1/O×m@ÏCŠwÊÜ”¹ƒ”¡äŸLQR, zZÚ­€8ü(òàs‡)PÀ»ºÓ¼ŸN•a£MÄ` zS‚„lZNAÊSòF9¤ùïVB(èHªÙÈó§ÌÇÊŠ‹j}éLãxîƒøÐc‘ŽvsK˜|¥ƒÿÕN0ÕÑnÙäbšé´ôúqKœ9Jâ$nÇèjS ÷QS ÏÞ{T Æ;¾œPä5¤ió}ßn]*ì @1H¡G®*ÚKkÃg9¡L|…$·2ÌUÎ;žHúz« H›½\…ï“ÉéÆjq`ë™Às·o$SRlM$e}”dؤ[XÙFù‚óÓnk@Û¤¹b£×<ŒRh²ÎsêN)s @Ì’Î?,›© ·^œµšÍQIó¡o£Õv#å?JNLH"±…â/¸?Úô««¤Ù·6©1ìÊN?*X4øåˆ9™'¡<ŠšãL‚8Ë&¡o!þèΕ>m5BqE/±[î .–AÝ‚Z|!%Ûi íÜN=ëVÞßÍ‚:’k%S[!òÓYCµv¸>Ûpj² #’}JÞ¸³Œà|åGrµZKx@[èM[ž¢QFbÚ‡Üô¨ZÔoêk\BçxšÑÃkƒŸl \ãå3Ũ\`äýiÆ&Î Z~[70'ØÒ$Vùv“Œr3úRæc±š¶á¹õ7öx–(‚M£«qüªñò‘ó!½ ÍNð´ñnÚF:…Î>¦Ÿ0rèd¦ã~˜çM:Z€ =†kY-•“icë‚i ª…<àÒsÐj&YÓWnð§oÔgò¡¬K¶è©Q×8"´RБœºú¹§}‹ÞçÔâŽpå3£±•?1Ï Σ’ÙÎïÿUlôp m+7PF*w¶â2Þõ. ÔL£cÇr=j1fAÈÀ™­¢ŠÀçþH#=‚ûqSíÔLo²àœ¨Ç¿4áb2óÚµcÉéBEŽ#éG´)”tüó‘ØR-†@b>\â¶E°<àšl² g°¤ª‡"2×MB¤ò°4ÿìÃÐrG\ñŠÐ[Gœö©VÝúš^ч!•ýŸœž1M8àî+l@@û€ûæ›"†ÀXØzüÙþ”{F¨Ç[ebTFКx´ÛÛ¥j¬98GÔÔ‹îŽ=¹4{F¦[' ŠÙ²:Ôû*î' ô4¢ÕOz= ù ¯²FáH-Óíô­ciÆC‘íŠhµŒŒç'Ö—´TP[5ÛׯµY·²T³m' ÉÅY îüêÂ[¯–KçÚhˆÉ’ÅH`}—ĵÉ?(âµ<Œœãö§y{N£Ú1r™cŒdbažNqëZÂ.w`>Õ2Æ ´’?*^ч*0Ž›ÏV5'öQ)•‘O¶y­q 7M£>´Ão¸1ïŽ){NáÊb>žG/åLûä Ú0'8üóM1‚y_›Ö—´cåFGÙöŒ`f…¶ÝýÊÚò®x'½Da@I1œzÓöŒ9“öb Z>Ês÷ü+Sd`ä(Å7“Üš=£!öc×`¤[sÿ<ù­E[å9õ (9@O×ùÅÊb›lÿ}—ûÊqô­R«·<ŒÐ±Œ|ÅG¶hç)˜-“û†œm»ZA³ƒJbRàMì|¦H´ (4'?À1ìkI¢%xŒß›¶@§(TvÈ£Ú)š-@<¡#ØÔrÚªÂíƒÒµ66yàKˆ¿tWvÞ™ªSÔNš\Œ]L=¿\ÑÚ{ãetbŽ;Ä0,òH(åÝPÁCîÇ5VðbúàÓFþuz«c…îu–ž‹ìâ »MCí­§]ß»#[_$Ê›dB„ýøpNååÀÆG9Þ!²Ò´éb·±Kß6H-îKO*•E’}˜ 7¸|ß/¦Þ7[x³P·Òîìø–K©e•îfšgpÒ!ŽC´¿–Yº–([ç<çÍÔ5MCVgÔ¯®o&Uز\ÌÒ0\“Œ±''zb5ü;¡Zjºn£urn7Z°Ú"p  ó09SÉm±làãÔ´XtÍ;[ƒsÉq§jéfÒáBȸ˜ )ÌDýìŽ>Pk!&Ô,-Ô$—VÐÝ!uÃ2,ËóÆO£eLû¸õ¡µMA’ñúä¥ëºS3bvp/ÏÌA$ä瓚Úñƒ§éÿÚÂÁîöf¢,dk‚§Í-æ@åÛåÔîÎp¿v°o,®´û§µ½¶šÚá1¾)£(ë‘‘y’æmA½Ü—E/›í%¥fÅÃuó9ûÄ7˜7sÎáëOÖu{½wUŸQ½mÓË´Iª…Q–%Ž–$œd’rh¦³ð}•ç…¡Ô×)rÖrNIJ”Ü¢íÆÆÛ&SÏYAãfÖ±yá-*Ú+Ä[-mä²ÖSFiât]HV`Z(ü±óŽ6ò÷’C…Ü2¸äÕu­Å¼w÷IR‚5™‚…!ÁÎ1‰eÿ¦ýã™]ÕÞ%‰õ[æ"*‡ FÐ û¡d‘qÓá4.¿¦Ã¤j§ÄÒHð ÎHÙ;›|\ª*Wi$î~7m]K?ê7Þm~9qj±I)_°Þ7XÞ,&/á<ïÀîF9¹'šd…%–GHSdJÌHEÜ[ è73äžõb='R›K›T‹O»}>Ù-ÚÂÆ$n8gÆù—‚{Z§]'ƒî§ûyÓ¡‡MT¸q5ÅåÞŸÛ[A;Jʲ0sæòÔØãÞi:–Ÿokq{§ÝÛAv›í¤šE™pP‘†`r=G­F~Ù¦^Móí.£ß¨s®AGFFAe úhæ “kº¾³a¤Éo§‹ƒ+¤–ŠÍds± á ã^€¶ÞÑtýú+ý6æÎ;Nt,$ž[‡û$~[¼SF¨JÈÊDdí]è71=yœ7÷–öw6pÝÏ­Öß´B’’í9]Ê8lFzU.ÿX‚òÒ-&îú;¥•¾Ê–’8q$€!ØÌ©Ç'Px~Éma/ˆ.¥´6— n¶—qø~ÐȨÏt¥Ó"KÛ¹ó7–‚èj6‹¦›K+HÞâËUœZC•¡–ÞK½ö—O3`ñ¢¢•ݵ™Àådâíÿá<ÿ„¢ïìßð‘ÿÂCåµy^Úü¼.7ãçÛxû¾Õ^ÖÃÆáyþÇi®7‡¥Ý<ÞLsGØ~gl|‡Ié·Ú€; Vÿ@¿Ôîµ;)l_B¶ÔVÐ µI,s›VÌ`¼Ð«G—!FQÉ*.\¦¤ø~MBæãM7’¥‰žêËA‚áKHoJ…‚uˆD$²wa[>ãæ÷ž%×µ ‹[‹ÝoR¹žÑ÷ÛI5Ó»BÙ(IÊœ¨9ƒÒ‹?ëÚ}ÅÕÅ–·©[Ovûîd†éѦl“— åŽXœŸSë@ÿP³›X2éIö°¸Á9 ðÃ¡Â…çŒ b¶“å²ù¹ÛåïlìÏðïßÓÛ»æ€: › júÍÚÀd¶»µ…V[XîTtš4YQãVc1‡ÊªØÜNÇÏñ>†öž&ñ,zm„ÿÙšf¡,,èŒénžk$aŸœg8ïF“aã 3\žÏF´×-5xâýü6qÍëÚ~e_˜)Êxå}ª;='ÅGÃ÷WZ~³ý‹p›îd†~Ï*ÆIË6¤“ЃҀ=2}ÃójºÍŠEc»CÔ'Š ƒh© ¶·’"8X÷ϱ­¢.ÒÜC( 2ÒgÜ`[h)âˆíऊØ?›§ÀÍs™oQ‚Cå´³ýš#§b«s#$óyuÝbo°ùº­ôŸÙøûë‡?fÆ1åóòcjôÇÝ•$~%סÕ&Õ"Öõ$Ô&M’Ý­Ó‰]xáŸ9#å^ ì=(´¼²³µ×ù y² ØvÏÞo¹<üÇÔÐym>›&šnµm:ÒÖ}>÷ìi« ØJñ\•‚î{”læ`]|²1&ö΅݆ƒ¦Ø.»{uh÷âÞÕk %%ƒÌ™î˜7ÙeòUI†±•ÆxRYdw.»¬Mö7U¾“û?bÝpçìØÆ<¾~Lm^˜û£Ò‹]wX±ÔgÔlõ[ë{é÷y×0Ü:I&ã¹·099 ž¦€#Õ´Ù´mfûK¸hÚ{+‰-ähÉ*Y©# dz §EQEQEQEQEQEQEQEQEQEQEQEßü ›ìþ/žr2"µÞ~‚h«ê5h.®DÑ6ShÞ9ü•¿¼Ž 2Di wÆ{úÐŒüi.õ订ù¡’âeVìJÇœ~"¼Ó ¯cø÷am¦Cá‹[H„q ¹Âûe^9øVRÜÒ;à÷¥ ˜ uÍ)éëXš“$¶j5Ú*Rœvü©¥qÓ„84)—i' Ç‚AŠ4!“8ÀõRM8 hϵ£îý( O'¥(æ—æéŠWªœóœv枪©¦®âà •}ÉÅKaaN )¹Ç©hîy£r)\»2¹>ôà¸ä •N <ƒŒ\Áa˜ ƒqæ¤]¡qùPˆ-ŒâžY²ÜçÚ•ÊVSÎ1NÊnÎ>•*ªîÀ¦¦XÓ=j\‚Ä Êüª†9 Ÿ­]~UµFqϵ C±Üx¥#* õÅL§Ë~W4÷!ðB`{Ðä;‚ ç?…8 ã RãmP~´¡r}ý©Ü\£U[ EÀ÷§2ÊnUÞ¥X××õ§1qåçß4®;ñ&?„Z±Ï_JŸä*V•!9è(¸ùF"ù“O XÈ£Ðb…ï‚}…#áPh»fEžë…õ×+Ü–¥Óúü×IžÞ<ÈШÏQ lþU<(Pî7PqØH3Hg¿¸s%ÍÜw¤«ÈTé,›vyˆàtäb“很^÷Q·åÀ6¼æ«Ë´ãjõ«2$Žrª§=vð¨Œ3ó#¨=NÃIŒ‹Ê< •\ÂTçw>†¬‚ËÜŒu#©¨wKæ§Ó#–£D±8U*謧®zƘTüÄ.è:â•ÉÝ‚3{c’rirX)\c¸8©I8m’zå©‘ ¹Gaš™Õ!p«7_•i¤&69dˆõ ØÕ½ÒMÊT†¨Ï(rF_]楲“j²¶ìã¼Ð´bz¢ãAåÄ¢/žœòj¨L䈶|ÕØ y-Kç~9ÚÒ¨´¿u£¬üÕI ,Ž&_1²¼tÈb)dE ‘/øTÕ±ì¹NÖ§ê1Py»Y³ý?¥M­¸÷#2•R»Ûqš`ù½ ÷©wn8R:ç`ÏçPœÇ…fÊCr:5*Çæð£'ëI´‘ÉãÚ—lŠ>U<ô9¤4DÐÊ7c©è²œÒ2\‡ñæ•L£¨ •"¸‘°ˆÌOaNky“£‘O|ñP¬“)È8úS¼Ù°y'ëHcŒR„Ô›!¹¨Óä‡¥ß 9Û×Ú¤ä€oÄPÊ ¹÷㥠+g¡ã)=XzNáaúðOáÖ¦2£Äž1Œcñ¨‘ÉÜ¿ž)û‡pM+€†YÈä6sO<²D{‰ûÍùšBàð9æùR-äzhò„áŒ-âFÈüê»È±õëOe* ²8ÇQŽ•ýÕ?… Œf¤x\;ºô¨ÕNy,§ëJÉ.üe‹uX.sŒ~4í­Žr=Á¦1ãaÈïJL½Xb˜ ­ laˆõÅJ$psäå}*/6@0G°¥7rÚÊqéšCò8;„$~4ÐÎYL´`ÿ9¦pIÚÜúq”9å?3šwAa¥¹*ãߊR ðÌ[?¥F Ã#Ó."QÀíSèa9ÎáÚ†òXúSÕÜç8ÁíM`J€NAö£@Ô`Eê¬ÀRü™6sNP Æ: c9.Ìúœô Z<€Øõœcˆ©8» L£| ±ü R®IÈÍ4 qœE*ª»}Ü¥ ã?9T•È På‚xo‘ÀdçÚ±˜ðOÖ“o—Îhº¡ß°â”KƒÊ~t›Á?{¯­&õÇÜú .ÈO<`zšeÓ–€íAÓ’)X¨èµÄ‹äí AÇ>”ã¸5¡æw¿ñÿqÿ][ùšé|$Pé>%šXtiž+$’Ù5ï=fB aÈf!¤¨Ê¶²¶Bžj÷þ?îë«3RéºN¥¬Ü5¾—§ÝßN¨]£µ…¥`¹$(' gÜW·5îw^hsx!¤“OÓd¸šÞáïek›h.‹Éåì„BgÀA&X»6ÕË›¯ ÞëÚèû>‡Vz¬±hë F‘¸h®Š3’FfKbL„Æ¡±òÆJ×'Rk¿]>ìÙ¢+½À…¼µVrŠKcVP{•#¨­ cÂö…ge{¦]¬÷©¶_!ǚΈÛ* :— Àg Å1ˆ—ÚSÛY ¯ì=G[‡OŠ-OcmKö›¶•G[îÁ÷Wsgr1RʽjòÊ×ÁÉ&™iáð&Ô§•=ÄV³Ë\8ã"\Hè$P«‚°Ü¹ðÖ¼..-Ή©yöïOÙ_tM!0ÉAëž3QÍ¢ßÛi×·6³ÁbÍİH¸— Y7mÚvò¤†ù†ÀYg&•¿Ã—÷èÓF4+èî cž5º‰Q °r c†c‚°È±ÆŸq¤ÛßÚÉáø5éíâ’é®­íüˆã],¤BÊcµmÔO1†J©ÜùâæÐµ‹ym¢›J¾ŽK©Z t{wY¶2(#æ`ß)xëV?â¤ðv£ÿ1]úH¿é¥´?*Jý2¾Ô©ââ?\[Ýi¶pišœ‰“H#’UiÙ@†00B’8ÀÅaÝé_dÑôíGíö3}»ÍÿF†mÓ[ìm¿½\|»º¯\ŠŒi—'F}TÇ ´[…¶Ÿk9RÄÛ³ X˜Éׯõ;Keݼú…Ã[À×:)dm²òçs¿íÁÏJ§­é_ØšÄúwÛìoü¿é6y°¾T7ÊØÆp}Á®‚ÂÖê×Âëª[ê7Oi<“jp+XÛ“"È‹ ¸v‘ÃI€€¯‘¹ÜðãðÖ½6©6—‰©>¡ o–Ñm\Ê‹Ç,˜È2òGqëQÅ¡kÙ­äZUô–­“¬Énå q$pØÆÕ$z ó@‘â YfŸTþÁŸJ¶—RÖ×PÓæ7ÖæIeÉy¤‘ˆòy±ìGØÈq´yØñ~>ˆ/޵«„¸´¸‚îö{˜dµ¹ŽuhÞV*IF s´àŽ29¬÷ðÖ½½¥Ãèš’Ázè–²5«…œea‹@Ïj¹càjêC£_}«M‰%¸¶6²y£{*ª… Ä6à2ªÇµX³ûü"íæekyR}—ÌÆï³å¼ÍÿÁçg>^ÿŸnþÿg¬¿Z5ö· ªêQéÂT‘^áæXÀM½rÌ«–\¨ ʰ€IªãL¹:3ê¦9¢Ü-°ÄûYÊ– >Ý™ ‚ÀüÀ€FH“©5ÃÛ®ŸvgK…µxÄ-¹fbBÆF2•`©Ú}(Ð"Ÿ]îŽÑhÆâ´—Jµ›Wµ’¢Oµni%-åÊáç,c%rÎÏ-JV^¯®[ÜjÞ-×m¯þÐÒÝÍi¦#¹ ¹’g’EFþ›Ð®Þ Îì†<}õ…æ™y%ý¤ö—Qã|3ÆcuÈeO# ƒøÔ‡IÔ–Á/ÛO»nŒépao-•\#ØÁ™TžÅ€êhM-:}bõi|«»Ì5£ÇÊqó,R‘Î:#~E[èÖÚŒi¡Üyö¦ Y¼÷—“‘—‚Óm?SÐW—BÖ!û›¥_Gý¡±n·qöœã_>w/LýáëZñ%½Õ¥Ÿö5ô·×6†óìqZÈÓE•£Ë¦Ü¯)ŸL2óÍlhšþŽž×ty-'‚á´ü»¥ò"^Mö¨Š†2Å‘qÆâ6¤˜ ]š·âK}gÂú¦«}£]Om¦\ZíMJX®‹]µºþæLÄŠZ:•Xþ\2mãÊè L‰t¨t»Û (4a¬Hö—mfÚ”b‚XþÔ„¬’»$ $·–dl»œåQãz¾¹oq«x·]¶¿ûCKw5¦˜Žä‚æIžIøvoB»x7;² òvN¥ª¾Í;O»¼rá6ÛÂÒÅY€ùAçj9Ç¢±ìjH´-b{5¼‹J¾’Õ¢’u™-Ü¡Ž2ŽÚ¤€OAžh>»OÛI'…u«›K]Kø¯lÖ)µFV%d¹Ý·Ï! m;½q• ¼Üº±Ø|Ý*ú?í }‹u»´çòøùó¹zgïZ±…âI/.t8t­U®“l÷ o!uÀù]£< 8$½lj_Øóè~(Jûµ·Öâ›O/±'6­ç© _ºÿ¨ÊóޤMjYukºF“!ÔD {äÉäˆÙÁŒA¿nJƒ“~àbòkÎëS\ðö¥áëÙmïí¤TK‰­Òà#§hœ£˜Ø¸öïŠìm>_¢ÛǦéòK£ÞÁ6ÛûvˆÎöÓªn’4Ž$4cäùzdï-Œý8ÙÜ#Ç£+„‘šY^&•Ÿ8T(@¸Wû¥^&1pªëÌÌ9};L¹ÔÞám£‘…½¼—2²ÄîrKlR@ÎN,2@ÉÒu&°{õÓîÍš"»Ü[ËUg(¤¶0ee¹R:ЧEI \¹H"’WÎU± ªY‚‚Iì5¡‡µ&Õ§Òî-¤²¼‚Þk‰!»F•c…¦ ‚2 UãŽr;s@tUÈôJm.mR->íôø_d·k ‘¸áŸæ^ î=j爘eçšçè« axþ^ÛIÛ͉瓾4ݹǪ“ÐmoCRiZUö¹ª[éše´—7—²(“«ä$žœ@è­ËŸ k1x‚çD´±»Ô/-Ð<‰kg>à¤)ÉGEp>`2TuAÓ‹BÖ'³[È´«é-Z)'Y’ÝÊã HᱪHôæ€3諚f›6«töð4jéo=Á.Hb‰¥aÀ<íB¾:u«øk^›T›K‹DÔŸP…7Ëh¶®eEã–Ld™y#¸õ  º*äzlÒè×:¢´~E½Ä6î¤Å¤YHãÄMž{޽‹Ý'RÓR7¿ÓîíRG‘§…3#mp29*ÜØðhQ@Q@Q@Q@Q@¡ðþJŸõäßú2:úþÃW“Ä–×ÑMn ŒmX˶JñœñÔÿA_<|øƒ'8ÿBoý}A:7ï¿aíí@/ûDÿ®ðßÒçÿiWŠqŽõí´H"_ òO?ûJ¼OœVSÜÒ;6“íI´ƒÇ5oR¶{ Ùmß9Sî=j¨,OzÂæªÏQ„ÆÓIjŸ.NsLîNi\i Áî1I­JÜŸZf4\ÛšÁû´£4àO"•Ç`íÐ pQ›¡ x4¼ÍH ´Não‘ïJÈ£ 1ŸZ.4€€ëRúSCí(2dp¦§R¬ {Tw€Z`\œ“jZLåqÁ©$í=©ªÎ •9=MMÊLU ÜŠw–¤äsíH_˜¥Ýè@:ŒX lT.ÛO!CÅ&ÃëBUSÎÐ1ëQ°=?ODËóœT’¾XeHôëNã*ü§‘Ö”GžCøÔ„(W'µFyùziˆU'¶jQ cÕ Äû½ENU‚ò l¦Ôã%¨Ùv0ô§ì< Øö¦0ÚrI4&€ëJШÁ-L$ƒ‘ïI±G4ÀzD…ÀÞõ5cìñ#®Ü¦"BF_o¹©ÖVâáOáH p¬$ò¹#§ÍŒÔ¼…£omòf@ÚšsÃ4wÌxÁPqV¶%‘°ç Çßpæ£!Ë<úµ<|ª•zåy¤{eq¼L„wÆü³OpØfÿ–xïP»psMò”tçÓ‘þ4€9¨e"`c#ˆÐý\ëVfÌ‹;fÇûdÿìÕ_ìñº+y˜ÏPH—5}‡Žñðª23Êä²€{áqMDE;·9üiÂD²û’i97»—D"ÅŽùÔ‹nUKy±«ÿ*’¡‘òø |—@äm?˜ÿ R·3mû¿÷V6¸ Øæœ¬ ?Bh‘6crã4\ î¬òy7¿rƧ·ˆÌFòNBAþTÁË «R²à)eô¥Ì;\–1.ÀHü :RX`¦S¹\æ¡ÎxŽÜÒ±ŒËÓ¶M>mÔ¤0”#»SË´QíýÞïö¡RGãÖ¡Äx.r{òiØCÁaõ9¥ÌÂÃÌû£ (ŒŸö®* E²ŒG¶)~VV@}€4Ý»OÔI¶ÊI ϶E*ŒT°öÇâìGQôÅ r:Ö•Æ4´ç€XŠr³Ž¹§›‚£@ö \îm<{Ò F‰™y Óž”}ªN~A†ëòŠ‘nUA?ZC.ïà"‹œ¶)…8KžÜzÒ TÿíÁ»})X–Ä}i (9$5KŒsN` `¡4ÅT ŒŸj˜@ÅB ŽŠR¬>ñϵ!ÊÈéíJÞVÑ’½zµØ?éÌIÞIéÒ‹#y{±¸éšhh»–úŠˆ(ä±8›È<0 õ¤û”—>ÙæšîYó!ϾÚEÜzIéŠxyPôÿ h2‚ÝÓýž´¾s¡ÏÊÃÜTOæç f”ÈJá¸Å/œåŽ?Aÿ×§yòíÚÂ<ï06üm}¾¸ §Ë»“e4À—tŽ7 ¸ô)Lw"#)Ú?\ƒUö¹Ãט¨ !XXÜFØ¡kÜ‚ß4n£ØŒþ”ó:8'§ß/pz‘´Ò(ˆÀù¥aè<ºíHF=©E'‰IõȦa3ÇèE!‡'<çÐÑ`'iv|”ÁϹ5ʃ3FGeP;æ‹(P9\ïN2nM¼`õȨÁÁÈÛ€:Ԫё‡Lãû­ƒBB#ãi®=©ò@`)˜UcÔõ" *YdO¦H5JàÉöáTýi$*=N{ÔcfF9çWlÀî rW Ï–¾ö/·iþ÷íþvÏ'ï~ïÊÇÍ÷s»w~•ŸEw‘]xU4ÙXêºÍŽ“s{`aI"Š[©•cœ¸t"”AÈ'fFNE?x¦Ï]ÐäŽo¡º¹Öîõ[‹2ƒÈvР8|» N Aþ±ºcæãè DÕ¼}i¨_›˜æ»…//Zòæ+}6Ò ”‘v³MØs桼ÊSOè‡Qš9%¾þÍx£Ra°ÈAràZ™ƒ&F!¢”-&Í¢M±ðôP‹ûŸ¶j77[§o:W“7ù²’~wÀÜÜòØ<àWIâOî?‰Ÿ7nú¦±í»O‚RÖáB7',±€@ Fxäè  jzf´g¿3­¬–—VÎÐF$uó`’ ÁK(8.2:V¥·ŠáŠßF·Ý´=ý‘‚¢kr¨Î1‰b x?'CžNŠé< {╺žúKK+Ð.b ÉB“þ¼›ÿFG_Bê†[_¾Q¤Oï8Æ?Ï·½|ýðÜ\xöïçt)§;‚¸ëæÅê­}%öW/½®gcîWü(È?h“ûï ý.ö•x¦}{Ç×Y%ЗÌ(nQ†GÊq ÇÄWŽàm¬g¹¬v5u:k“+9uè ª»H;…^¸(¼ažF$îpsßU ŒÝë 5} "»ŠÇ*3“ïŠh†¤ µycšBr0 ©,L€y˜ SžIÉ¥H†FzzÒ¸j(‘zi¤î'ÍLB(Ê⣠Ǧ(4Zz¨Å1µ*³ôʼn2#4£r3HËÓ4¹àqÍ"ƒ v§+n?tÒdpi|Îxò¤ðiC z`¯+øÒí^ô®`™=ðµN˜ÛÔqëUŠò9¤ò‹ãÚ¥\Ÿ [Ú—ä Î*¸¶mÇ2R›P.jtî´ê äP'ò@JiŠ%çÌÓ@=Ž=M4jKæÊÖ‘¦,2qô¦—BFG¸¤%8Å;"€¶ïAJ~îKséŠfìô&Ž6ýü­U„Ç£`€zzÒ™²1Ú˜¸Äiþkr7a{S@sëÅ!FœþtžaÏ@¤iMÌ C €ó»?ZQ#8{Ô%˜ôÈ£qrOµɼ²I_Î¥Hœr sëUwÔ6~”õÉç¡íÅ ÐЂÝËd:xäSæ´xŽ # qû¾*ŒQO ùUˆï…Í[6Ó*©qîT ¾‚v/ #¾Ü“úÔMn€€]†}ž±Í.U",Ý8ÅÙ—²1Uò:ç:,ÆÚîD!Æ\ý€¡[lÔ‹§Ý(ämì*4²ryôšǤQ¸Ëð«Ði°:îq+¹,ÔÕ¸›¦›H[ç ûT!šgL²\þù£a÷UÜ7æVYÄ®Ê'-ŽàñTäÓdQ»Í]§ØÓãµÆœ¹¥ KÔ´"Uà;sïAP­€[ìÔÁïg=êpOˆŽààÔÝw »”`ì8œÓnGî—ߊY2e$ÈÀžq¸“J©W8\Òæ“9#ý×ZwÚ“n<£ŸÃü(BC†à·¡9žA ·RO;¶ò(OÌ,W#pÿ€âžSŽp~‡¥4 Ãç}Í$q®Hܼô'œS¸?QÜŠYϸ£aDó8W<Ô;ÚXŸ­)VÛßð¨À í%‰÷ïØ VÇp:ŒS.¥ýÑ ;s‘Šr “÷³ß ¿vŽÙ™ÈÁïN;Š[φZ3ã Ä’h!ó­5Qç™bMïm2(,Ä(Ë0‘Ö—\´:gƒt{ îldº]BöfKKØnv£Gl“0(Ý} oë^±>!ÔÕ4ÿ.4¿íG#|äª1 ’xËéU!ðu´òoˆÁÒSR³;àýÐXì+Ø[k8:+³´ðö“yªIim"±—Ë[F”J‘Èíü=#šCá‹htáus¨MLÙÌ#bÅp»˜\sEÂÇEwW h–Þ5–ÞH Ä2[³0xÁ ±•ÇCž”—>·‡íq›IPC¥.£ö‚ço aãëEÅc†¢»­OÁ¢Æ-m~Á ]6\\m²+Ó·z­©xY ¿X#·¯‘§çcè¹÷¡É%v4®ìŽ:ŠéÛÃ@ ù|{L>Qÿ,ÿSYûh—ìästWIÿúÊãÆø}@ÿV3KÛÀ=”ŽrŠè¿°þy‘õ&“ûs‡ó4ý´ÙH種‡û ç™üÍ/öÇ–3G¶ˆ{)íÒ`'üò?™£û?癉£ÛD=œŽnŠéG‡Ð’6~¦øGãÇÜýMÚ!ì¤sTVûèK´áv‘Ü“S궺L¡Hû\cryùÊÿJ¥R,—ŽfŠïn<jo¯­&ƒìšŒm#HH>iÇኡ¬ørÊÊy-¢aö˜.c ( BK¨ëÓ#Ò©» +œÛé~ MRÆÚ(ÕRòåfxœˆwÇÝb džŽYíå³·O²¾žo™¥‘¬bB»Ž2Ç·QqXâè®æïÁ‚ÒmcÊ´–é¬a·‘mÓ~æãœuÀÿõÓoü'o§O­yÖ²cN¶·˜Ç¼‚ ›x'êÔÀâ(®õükú»¾ÔŽÆiŠHd , €¶Ó¿5›u¡Y¦‹©ßZÆfŠÞí!I[z®¤‚TãÓŠ.)Ew:‡ƒâÓß\Z¼ãM’ÌAÊ$Pw69ÅsçJRÄù{y?.OÕ.InR‹{ÔVÁÒ—°ýi?²@8ÇëSí"?g#"ŠØþɇëAÒ=¿Z~Ò!ÈÌz+[û'Ðgñ¤þÊ?Ü?Ñ#2¨­C¥‘ÎÎ>´ßìïöMè\ŒÍ¢´ÿ³‡÷OçNþÌr‡‘‘ÍÒ#äfUª4ÔÇ+úÖ„¾•ô6òÖÚYf»žX€K*FÖšš{ Å£š¢»;¯ XAâyôib™I <9E1*}y8õ¦j^ ’ÃHóÂyo}-ÓÆKuû ú9§qXã计|2_D †àj)jÈAܦW#Üç­'…-äñuæ•ÝwTBO9ìE mÒè~MORKvMÊ`–Nÿ þ”ÍD¶ÕomôöYÒ{©U!–1¸èG¥Ac¢º}/ÃÐO®®™r%ižso–2 $|ÄrqȨ`ðÕÇö¥­¼öî#–ôZoìfÞ€nô\,sÔWe7†´û++ëËÓ*Ek¬IdJX¸QF>µVãÃ~v‡¥êVPÝİÈÙ,"mà"·§ÊsïNâ9z+cQÐåÒõ+› ö´ÖòÜ©8Ȫ¿bÿf§™•ž—û=Èý}ÆâW'þо€Ôu y@å`M8(OEQüN{ÙÉìÉ~Öu ßÉ}¢Üý–æHŒ,þZ¾PHÃ:¨ü«}~'øÕvmÕã²âÆßå'9#÷|“ùÑ̇ÊÎÃãZí¶ðü{#cÝ)[qˆN÷nrO©ïÔù7ãZºÏ‰õ¯-²ê÷k:Û1‚8Âï ±ùg$µ”p>•”ÙqVF„«s5Áo)Ø»N×Gþ]äü…tÚ4Qα‰QÊùO#m` Ú…±œOJ¶²Øùt¹ÿÀ…ÿâ+®½ã¢§³Rµ&Úó9itOü{Kùñ¤67$óo/éþ5Ù ,XôK¯ü_þ"™þ€åÖëÿÿˆ¢È‹³‘6·­å?—øÓEµÙÿ—Y?JìA±ÿŸ[Ÿü_þ"¬[YZß?•sÂÇv”8Ð(Ï_Z=ÔT#)ÉEu8±]ãþ=düqþ4Ÿc»òë'é^Ýsð©,BŸ[Â;|ÈÏç%N>ÌêÖ£ ò¶ÿìéòKù¯¼®Zóñ}ÒÿäO û-Î8µ“ô¡m/?çÚOÒ½¿þ†c ë‘B†)ö~@=þýp—Ö–Zn¡ueqsvÒ[Ìñ1ŽÕ ¬FFe·¥Î_Ëý}áhÏÅ÷KüŽ;ì÷J§6Ò}p?Æ ù{“‘Ø×ZÒÙ2°·–é¤8–Ýc u1ïéXZº"ÊŽª`sPãm°Ül”“M>×ýR3þRjPуêjsÜ~4  "Ç-чҿ.y¦®ÔzÓ÷€3š‘î#Ÿ‰N6gÆ—vî”õg^¦±ÊXäœûšsÂù<.>´ìÊpIÅ;c;s!éKP±ˆÏË­9-úäñAˆîûß­=¼æž ‘'”˜ûøÀïQH¦“Žÿ=$;pXý(IŒA€FOµgî©?…KŽýOãŠÎO•PŒòZvFÛ§JlG8¬'˜$*ÙfnH<Óönm§úÐì4VÇ<‘H«×.Y{t9d-ß š„ÛÇýïÖ¦ã!`A<þTÜàsSt ÒlÇëEÐX,xœ±Ûñ4ñuçð§Ïe]!XHÖLáqžãŸµÉ?à&£ÜêÙjuš}¸òË{sṴГô\Ÿ 4ÆIØãk“éƒR–—¦ÆÏãIºUä–õ¥t1Ëiu³w• \ãv3J°IÓo?Zb¼‡øˆüjEy>è~(m &;ìs ÆH=ò*å¶©\`¤ Ó.*‘iHÛ½±éš’;‹ˆð#¸•Ýb))G¨Z]˳è„ ZUPÉùª¼VRc Ï¡¡î'uK‰˜ú3?>9œf_sÎ)9G ’•µe„ã_JW##/·4ŠW­ž)ò·­Ð_ÈÌIr1Ç8¥mÝ r?Ú«ÞM¸`Q²?ÝéD‘Eƒ³y>êþu6`R\çîþ¹¦ç½Z*ž˜Ôb¦ã°ÅFaœ {š” œ(ÏldÔ@ =?:6FpOÒ¢åXyŒ*ç ôéH¬ˆIeG‡5âý7®iP9g>´úˆ‘K†À#û¹5/n-h¤zyŠŒ Gÿª¦‡ìÀ¤yÄÿ±Š¸±27–yK` z9?ΣÝoƒ½9Ï>?JºdÒñƒÀÇûTÂ4¶ÿŸùmkºèUgœ¤#ÙÇøS’Ïò©Uô'š¹å郯ÚñÚZhä5À'Ô-Kšô)­‰Ê‚>¦AUþu}­ôæÇïåTÿëЖZs.ŸõÏÿ¯K’]Ð_Ȭ–°‘ó>ß|æ¢{X‹`IÇc’+Oû2ÄŒ Ì}TŠgöU¯'íÑþ ÿW³—¹½J‰§¯8¼‹þÄJiÇý²ßÛ2õªc¥Ä9[ëűJºT„b9 ø?fÿ”9—rc"ž%øëæ d–ÓÆ»‹'ƒƒýjÇö5Ø=cÿ¾ÅHºÚNTãÒAþ5.°)y•VY‡F ûp¸¹ÁÄ®?àF–;YÙ¶ª`z ”é÷Ø8¶¥JSè>eÕˆ··ƒþZÉùÓ[S¼âVüé²Y] Ô¨ô(iÛV&>ûi®0º#—P¹“ïç'ñªéupŒp>„U¿°^ް?à*3 Êýøˆâ‡ÏÔ‰TÊÎÛ™rÔÕº!¸]¸©¤VèW§¯Z…£þ®* C¼Àí– çÔS‰#:zÓ|µLÝ;b˜áœç$ ”Ü}M!¶¨d?CQ®S‚U±Sn@Áš"TûƒMb9$ } 4 «y‡?Jh–5—&(¶ÿ´þFšË ¬]dEÇefþµV£ÆS!e‘qþ}iÀɰµàTÍW3óË"ÿº3H&‹a¦vºŒ:ÆNËqî"Vî»4Ñ"gå. ìEBÌHÎGû´¨XŸ½ì)=Á"GÞÌ0W¹QLÁã*A=ÆLZ8×Éô TbFqœb“º$ç‚Fy4®ÌÃdÜb“-žHÆ”(ç9ö5Vaq…NJž½¨i÷rQ½éáÈ’OÖ€üñ×éB` pª1‚3Û†lÊÄ{R‚H语Gå;¡Oåš:€á+½:ô©þÛµæR?º3úÕlIòŸƒR–Î [¦>†ªÞb,‹èÙpÐ(_e¨šKY STaÏz…š ¿"27±àP0@Œõ'š|Ád?Ë–`±j]ù+ Q®hˆã(xSÇN `ÿk‚x5¸® A¥ÁÝЧ9 ÉàqREm¯´È¼wÁ1°ihäv+_i3.Hö íHç™ãÖua4  ¥@: óŠlL‘G[_ßÄO9Q€²ãÆïcŒõ­(´Øò®w63ò°ά%…ìjJ_ö-MJ}DÔL‹.öGšâmkQ7RÄaw™ß{Æz¡9Îßn•-ý¦µ­D‰qtÑÙ-¼PXæaˆÔ̤àž3ZÑÇ«ÎÛà ô8üj•ÅÖ­€ÀŸBc¾v–·'‘3"ãNÖ gŸQ¿–Ø ˆD×Ñì¸Î18ö$7ËË<Ҿл¥%ŽÐ0O`8­!¨l *ß Hº…â+f*G÷x¬å+õe¨Ûkñ& ,>˜ëHF8ù}Æ*g˜s=*»6x 8œÖW}¥»‰',rãŠjá8'Sî)“Ôð(»‘.V>J =GèåµmÙÉêY±ùb¢[¢ª?qБKÀÑâXX¶s•|Ê©1Yî2J}Å= ¾@fRG$”çéRF4ÿùá8»ÿúÕ2C§HIN§°8æšD¿A¦á}øÂv]œæšÍíE>Ú´ÖV!>Y%ôÜÃú h±¶-´ ÃV‘7]Šä@ÿ+“ê Ó6FøQœ¸QœTÓ[¢–ø Uf@ÉYqRÓêV'‰8åG"›q¥ê*ÖÝ%ègAöHæWÉFmnæ RyãmmU±Ýÿ,Ç—–ÝÇ#¨tˆt{¥ðe¥ÜªúKêÚ¢FòŸ–@6ù@œŽ…ùÇz®IÚÍ“Í Ý#†µ¯>ß§}ÞÀ†t¸a&Ð »9Æö¦»Þ“tÇQ¼Ýv»nI³8ô~~oƺé÷“á­4Û)ììdšøÜYÇd²*><Äda€ƒÎ2+wÄv6ÖÖ~![­ÊÇHƒN´–×QŽHnXG•<ç-•†{äÊ„ö¹\ðZØóûq­†½Ö­5 A$„ »¼K††;T3g'8ÀúS/´­NÍb¸¿†T7CÌV˜åß<î<眃Ï\×¢x²ÚãJðÏã‡H°´Óam<éÒE“s”ÌsûÀ}HîFx®sâEÃ\xþõ8#Xa· b‰Q›0F~b>ö3žƒŠ'£vÂNVHä60'µ)SŽ:Ôœ8Å!ܼ氹½ˆ€aåOÀ 7ÎÇ4ÀJàfÐç#žô®d’ íÒ­ÙÜêÖÖ‚ =cR¶·.A‚—Dç©ÚU¶ääú@ÉÇÌy8ëMI­‰i=Ëzlº…„Åc©ÞZ,ç/äNÈ$>ø=zûÔv/¥Í,š}ýõ¤²ŸÞ5¼ì…ÿÞÁçñ¦ýžnˆÙšowo›§_š¯“Ëéqiw=Ì:®¥ÔãJ³²¼ƒý¦'ñ¨­&¼ÓCÿfköM)oÙæxËã8ÎÒ3Ôþf—uØŒãiOLŠkO7–7[)€ÀQÌÆãéuªÙÏ<Özýü2ÎCO,W#Jyåˆ9'“×ÔÔqßkQ}¡aÖ¯£ûKoœ­Ë/šÞ¬sÉ÷5ž"H úÓ^æ"2¨ÃëG4…Ê…¶¼Õôëw¶°Ôïm­ä9’8'dV=2@56•¬êZÂÐùS¤/æÁÚ2ô\à7š­ö˜ñžzñG›ãws±r¢)nïg¬÷rÊ’Î×2FXìi[«íé»ßû-KUÒÚC¦ê7vFO¿öiš0ß\ir„uÓ³ÚŽf.R'–Iey®$’iœîy$bÌÇÔ“É4™BéøT¸_†Díü©\v"l ëíLÚ8úÔ¥2 0ÆKõ鉌ÀŠLÇz{FÇ<a±žiÞhÜmÿ—iôSTa½YÒA'þ=¥ÿÑMQeàVfˆ3ŠCêhË玔Öç®I¤ù˜"dÖ†ŠemDà|¿úÖxÎ3Zz1?nwÿBZNÖ6Ãÿ«ó=ÓÆ´ñw‡åÓîUD o‚R2cqÐý;é\Ñgÿ}?ÿQfW29¦é€sLÏ`qé] ðUæx¸´ÿ¾ßÿ‰§/‚ï˜ÿÇÕ˜ï?ÿG+’9ÅÎy¦P3óäÜWAÿMñRMÕ ý·ÿâiƒï±µZ«¿ÿK•š&  @.xã‘å˜ð²Iù×B¾¾C‘qgŸvþ&¥_ jÃî\Z÷Ký’˜]Ô~pêœûÔ¬®Þ=ù­óá]Q¾ýÕ±ÿ¿ÿM>¾ í3îÏÿÄÔ´û™w0SüËÇ|T¤À:BGÕ‰­Åð÷i­=þwÿâ)ßðŠßcæÓþúoþ&•¥Ø/žwRTî}jk{¯%òÖé ô9þ•³ÿ¥ör.,ÿï§ÿâjTðΧÊÜÚ?Úþ"„¤ƒ™òSØôx¾oâ1³ÌÒAk|d ,‰>ޏ«ý…¬m¯í=±+ñÿŽÔñé:Êðº·âíÿÄÖ›ïÀKë¥j.rmÕ3ÿM*Q¡ßó†;ÿëVÓ5ÎÚ¾{üíÿÄÓΛ¬õþзÏûíÿÄSQ‡fMßs5tKÌ|ÒB?àDÿJiÐ.wgÍŒý ­OìídtÔ-ÿï£ÿÄR;YïwlàMÿÄÓµ>Ì/.æoöÆΟC¹ÿg¶áZŸÙÚÉñóoø;ÿñ4ÆÒ5v4ð¬²ñ4œaÑ1¦û™ŸØ×küþûïì›Í¸Øœú‘Vÿ°59imsÿ]ÿì´§Ã÷øÿ‹bÞþ&§•vüG2ÑnŽ7l¯Þ§I˜¾té%[oj´[\»ÿñ4£Ã·¸æk\ÿ¾ÿüM.UÛñ ù•ãѦÁÿJ‡è˜Öoò›‹~{ƒÿÖ«éáÛ¿â’ÜýÿøšpðÍÑæƒw»?ÿO•ôAuÜÍH7'7ëÏÿUYd8¾„j²ž¿“k·Ø¾ôFð¶¤I)ö|¼ÿüE ÚÆârr©Ó-Iæþ3þ~´Ã§Y©?éÑŸ¢ÕÕð¦¨:ý™¸îÏÿÄÒ j€ô¶ÿ¾Ÿÿ‰¤âÿ|Ñþb“Z[°ê)Ð2šgØmIæú#ÿ5y¼)©°ëoø3ÿñ5ð–ªOÀ?ÿâir¿åh÷ 6–éÀ¼O¦Öÿ †XyIÑÏÐéZ àýW®ûlÿ¼ÿüM*ø?U'"Xü ±ÿ Òp—Hž=ÌŸ+#x>Õ“ƒ¼~¸|«gým¾Þoþ&—þýX¿làmÿÄÔû)öiæVn¤ý*O,¨ÏVßü"Z¨ïmŸ÷›ÿ‰¤>Õ‡Þkr?Þþ&—²©Ø~Ò=Ì#¿'œLÒÁ­Ãá]Oœ›Íÿøšþ]Hpd·ÿ¾Ÿÿ‰¥ìçØ|ñîd ,AõŠV»¸ã¾ÑþÙ­¥ð~¬ëö¤{³ý–ÿv®?Ž×ðvÿâj•:½¤{˜‹spHc#0ô,M8jHxûdô­ŸøD5lòö¤tûíÿÄÓ[ÁÚ™=mOü ÿøš|•|ÃÚC¹–ukÅé#~k7‡‚äÿ½Íi7„u1Æmï§ÿâj3á=Pïµÿ¾Ÿÿ‰¢Õ¼ÅÏ=ïæwËoR¢ –à99TÉôV«økP-Gü ÿøš`ðÕàÿ––‡êïÿÄÔòÍîR”L¡!'ø±é»4×Áþ=ëq4 ¡Óö/¨wû-1¼;xzMfl»ñÿŽÓäs#ÆNN1ØäT‚8™6ˆ›=r¢µ‡/‰ù®m® ñ4 Ý’qud¾ûŸÿ‰¥ìæÈÂ¥É]Ì\l'ùUySËl/ }k§O Ý)¾Ó_Ý‹ý–›7†nÙŽÙ4õoEwÿAªä•¶u}Îb0IÁR3ê1R2ûªF}Zèbð½Ð#Ìk6ÿ·‡û%Y ÈS ¨>¿lcÿ²SöRcçG w“ŒtíNEcÜ®k£ Þ¨ÈkTõÕÏþËBxfïø®m¿oþ&—³’è빃» †P߆M;ÍØ›p3êk _ ^g›‹Lúîoþ&†ðµðÎf³ ÿ¶ßüMO$» ™>hêWò=)­±¹ Ÿ­o Þ§u¯ýößüMFþ½~|ëLúïoþ&ŽIvdsäÇœ d-Ž‡ÔŒVéðÍïyløÿiÿøšað½Û“™,Àÿyÿøš¥Õ22£~TøÙѾFçØÕÿ„RôDÖ¿÷Ûÿñ5<~ÕPü—¼…˜ýšƒtdÉ{rS‰ÇµD/¤ â=kwûU=ZÈýYÿøškxR;sö Aêÿøš®Y ™I(d+å¡ç“š±ð®íж{Ö“@½rx²PzÏý˜<5xFß6Ðz·ÿO‘­ƒ™ÍÔEò¶P š…ïeàG{´c£GÖµÃW‹ô‹2}Ëÿñ4¯á«ùp¾f™ø³ý–›RdÞ%kĈüëk>z–RjüÙâ(cQƱ‘K…/AÚÿÙì}§qŸÉjßü"®kk»Õn_ÿ‰«„f·&R‹lcRv ÔÇò5\Ù΀ºÞ`u<ž*òønæõ!ab~÷Úú=¼9¨îÏÚ Ï}ÎÜÿãµ­¼ˆºîa¼S“ñÈR§š§!š3‚7:[×¢X,¯h{Ç벫?†ïwòö«žŸ;ÿñ5” ú¤Œ™PŸNzSMÛí ·*;b·eðÅû ¬¶`ÿ¼ÿüM3þmCym2Ûqÿ²ÔrK¡\Ñ1D©µ˜ŒÐœR€’ Ä®}ë[·¥xšË>¥Ûÿ‰¦¿…/J`Ëdc½ñÿ ÑÉ.¨9¢RÁ•]ˆIíšC NÅvƤvSV“Á÷ªû]“{n|~{jX|~Ònì¿oþ&¯‘ö2îU6¤dîf¦~sye·ÙŸüvžžÖ"]ñ_Ûë½ÇóZ¥O¼Is]Œtù¶XçÜä~b«ˆåP Ê2:õ­é|/¬ýåå£ÉùÛÿ‰¤:¨wcwoþ&¦Pò)KÌÄÌŒ@·tûÇšW,Ty‘³ŸfÎ+^ãCÔ£ ï-žw¢ŽÀüÌ©ãáí@F@¹³'{äÿãµ<­霼‘ç%÷gÜtTYÀÇ”Ï|⺙<3|I"k3ÿþ&£>¿8&{<¾ÿüMï—}2Ù†íƒðƲ€}ØÔŒc¥u'Â×ÃδÇÿøšOøF/@ùæ´Ç³¿ÿE¦‰É½„'Þ¦‘æ›I‡KwScïp‘í‡e NzôºSákݤ¬Ö˜õÜüã´ÃákâÙY}7?ÿV¹Ñ/‘œ±°·8>_·¢ÎØü¦1“׊éÏ…/ˆ?éyöwÿâhÿ„OP8ýýŸ·ÌÿüM7‡0Úm».Àõ^N÷òc(ªª§çŸqQf6h×%@7ïݵÀ\â2x=x¢ìLµVÀó°ê{f˜¡NÂ[Žx§-ª1%]­ÓžA÷:/—…X†WåbpãŸoð«W$‡hBÁú²à´À&ÆÆ;}*Vƒ÷¸ÉØz;ÇáLû8bø1ø‡éE˜?šT’½Å@Icó`ƒê*Ī È囟äj)¬Ê8Û!;‡••Þ(Øð qP˜”¯ÝçÖ¤edܡɯ¥5I ô4\VcNßÀR4 Ž¥9[ëÒšKÓ8¢áažYñFÖïsOÜKsHH=8Á!˜=:æšr8#ëOçAÅ4·?0Ð faÍ'˜Ã¹æžHÇJi+LLôM?6xãÜ©º sœ˜Û’}*àÐ òÓ±ÿ]ÿúÕOH$8ãþ]¥ÿÑMQ¬Ò³lÒ×4N‚@ÿžÿÿúÔÓ¢/ý4Üÿ×ÇÿZ¨>´À¾ô®4×EàÿÄÇM?öñÿÖ©WH˜E1†îÎi<¿•aœnê{zVHV^£ó­m?k“ŸùbÿÊ…ÂNS]5"2ëNèï#:r¬u%séóñN7Z÷ý¦ÿÁŠÿñužqšqe$Òæ—v_Xh6Ÿ1ÎÿF5oE¥^ÍÈ–²º°È`3šÇÐ Õ‰Láÿ‡þš5^¾ZÛL"+$oýÓÎ zØÖn¯²8q+Ynk^Y^XÚ´óYÍŒ…o,Ç€ÔÕ¨<;®=º´úl«!*£¥VðýõÞ¯â[d¸pñi° ÛŽVùTŸ§&» [­B »ù.nVhf˜=ºÏ$ÚßÏ&µžF\©™GÚ»8Ë‹I­gh&ˆÇ"}ånÔ[YÏtÌ"U ³3¨=I<VuË‚ú­Ü¯Ó ŸûäVuÖ ÁjÜ@£ÌdòÑúdþ9ÐS\ùÕp] §YB̸¶¶ª:½«±î#“n}7ÇãQÉ Bãs#ʼl[èEI&¨°éé#%¸`HòvÛ{wšÞuÌsK É·u\Võ0k^Wª3…we'³,žX ØÉÆIªÖÒµýÌÂëq<®¹çÐëO˜¬F†b;äsý)“³\Ä`’ìDXaK¾1øñ¥Xz¼²7éþ~‡© ±y£>_òý itØc±Žh5)LÌ ÆÄ`}8~4Ë»–É®'^%;|ØNF}Áå_­s·^$žÊÑî6eSµI0QÜã¶{Qà{äÔµðlÊÁ=Ú1¹E9GÁ‘ëÏíæTe #ÄRI8«´Öë¶›?¼ð0Ueíý•Gtô½ôõÔß2#6ëÐW Ñç¹”+ºB}¯â+CEÓá“X¾©ÙnäGœrà*íüóâ;˜ÝOÖ¸0“£ZÎnÉ­>gN*¼èÍEGN¬â'º q$0Ç$»¡m»A ã½T—Uò¦Š&Dß#ªí ’2q“Ž•Ñh>—¬Ku6­%À pé±%ÚŠî=úÕßø{B´²ÓãÒìÒ)žö$î$ò}Í{þÇÁE¹~¿èpû\\š“’Qý>ã*ÏO¸¿£·MÌ«¸ŒÓ<Õñ¡´gý&úÎo3q€§i Eôö­Öhdˆ‚{ãÔVmÅê%¤®Œ T-€}«ÌÁá!^.R{†#*m$i¥ž’©“{5Æ;CüI¨µX,®£òUÚ "Yyç‘ôþU‡£êBîÙÝq€@ÊŒÇë]I†+í*Âgm¥U¢$c­þ¯…§ ¥5¹4«IÔq‘‹.©cbè'IqŸÃük¡ŠÅUÌvÊ1“Áü+ˆñͤV–×É’²<Ž„üÀ®§Ã·¿mЬî Ýû¤\g«tþ•çTr§cª)I»šÉ¦Û¾Wþ˜þµ•y³º1ȸS؃ÐñZå¯.§ç)ÀƪZ†Ù ‚p¬Ì2ŒOAŽF?Q ¹;1´‘D:J@EL÷ÆsPÍ$VÚbj¯ }<¾Çž#¼Gî@çé^yˆ5ÇïÆ«{il³i`cä(‚H t­ûV‚K^æ×EifºoôY¯\‡ÈÀub}z°U*+Æ-œµ10ƒ³v6$Ô­Œ÷öÑϦmïlJ…SèÂ@äMYG-<À˜‡½bÝ^kCû0ƶÑý€qò—3>1¹Ïö)þÔeÔ£¾k«¯´Ü-ËyŽF9=€ìÈü)âð¨SU&’B¡Š§Vn1w:¶–?—n¾³È±ÿèDVN¡ã?hîRó\·Þ:¥¼-1üÕvþµâÏ Ï«ø¶K˜¯%ˆ\EÛcàä ÿß@׬x £¾[(îg¹ÔZ34ªFáË9íí\*­O‘ËS±Ò¨ãÌ‘è6ßô)î`†Ú×S¹2J¨IDˆ*“‚ØËµ×O4ñ\Iô©ãÒ¼+ÃÚ6¡gc5ÖŸq \pÆ £È–3Ñ”õõì:†¡5ç…“PH<›Û‹(ÈÉYᇿ̦´ö‘“j/b]9F*R[—ZöXã2=Äjƒ©lb™}«G¥Mlº¥ÜVPÜŒÅq*“ü@8®Âúޱ}g}öÛEln ;mã‰H¸cÓÁÚ*ö—áÉH±‚ :¯#›|÷où3÷#8÷5´éºPç©tŽoì¬mZø±¯dkh,¯$™&Ú.¢U6Ò'®[òÍkÙÏñcðª‡LÕåÔïn’òg¸·0C qîHF1òçø­YÑõ¦ÑíMÆ_(Êÿ?®k’ŠuÛä–ÇG,¢“ks Sñši³ÍÃvþKª3¢»ˆÎ3ž¸¨añ¬×%^ÞÊýâ\—>Päc±ÝÅr‘ê–ãâ ÷wiæY½ÙIŒ€¿wpϯTµ²ŽçÎPVS»È”mU÷õ8®ùRPj/ªßWú~¨ãuj7îØæ­üsÍÄqn—Ì` °\ þ5¿öÉÈáŽ}«Ÿñ~›˜l®!Œ³:ŒW|O{ÿ–È”s$y*¼•'ýEEzQ‹\ŒÞ„å7i"újR23*Ë7¥C6§&Õ1Ïü`18›‡/'–µ¹¶“ÇÈÁ8êO?þª“Oð¦¥wp¶R\X%ÛL/r¬à¿(ɬ9e}EP¢¢ùçfh.¦LÞH™·•ÝŒõ*_µJxóó©õ M Çm©\Γ"?’é# ýóþð_ιíPÙw¥¢²ïRÌXõç:ºXyÔš¦ž¬âÄÖ¥JòޱF±œ¶pÌÀu=E3ÏÉÀ9úSé>I-cº¿-32îÊ£é\ÊëË©^\Ùé>Šñ¢ÎÖVÀã$⺣ƒ¦î“nÝtGÄÔ²m%S¤[—h‘ƒáÉ¥ }´o5ÝËE ¸ƒÉ'€õ5Z÷Dº·ÒRíAŠD@ÒF•Cßi5RÖÚTÚ\Ë7…ô¡8öæ°©‡Tí8»«Ûæk îwŒ•š×ät«sM½ØËãåôÏ×$qÏtàCÖªKÜÓɪ—Q\ÏuoÀG*¹îª¸þy­¹®Dpp ƒëYU“VQ[è87»fmãIgo,ÆòÝÄ@– “ϧNµMu ’7#Œò*+Ë¥šx-ã\¢6@{žÃóçðª:þ­1´[XÀC6C2õ :ÿJ¼5)ת©EêØV®¨Òug².m—$ !ÛÓsà/ÿ_𨤿V/nã¿•ŒÃÖf™k“æ¸Âtòqý*õ½Ý…ž “Ob.¡†…ŽãŒuï^¯ÕpnR¥)8îô±å}o£²QŠ–Ë[ëèJŒŽÕ·È õ¨.o-í½ÌÑBž®ÀU]+PŽ;éíÖm¥&HQ›%9éŸÇô¯3ñVƒ¯é°/‰®Ò;» H1¤Ä ç*1üj—…nPé\Í"B äŒ çµÕÃ}Z}«æª±;—c¯¤ ¹u"Sw0ÿáŸiê Àê ¼.ð#n¾ˆ²¡p¹9 ¥¾%7±yF‘î …“€ìúÕª.ZóK3Éš'Ûƒœ †«ÙÄ\ò8ÕŽI$BfcÛË­  j“œ•)ï)ÇéÖµ¼=¨Ãm¥I²|ñÈ@m¿1d}z²ºŒ€†S#¹ÁöÇ¢Šò*âe8¥±¹ÆÝ[OmpðHQŠçT.$ÏQè+Ð…é¶Š7½V"L’Û2ê*¦«5…Ö…y=²BΊ>aI#ÚŠxÞgfŠä•¹­¡Á“.Ö%:t§íva¸¸äúT;ج£¯­P’UÓ5Xµ;›©žÙÛhþ8úŽäW«sË•N|±»6îËK²KÍZäYC+m„l/$¿î ê=Ï›§jðêú¤Éklñéð&7¹ÜîäðN8^3Ç?ZãµMjm]ÍάÍ$Ì[dJvmûr>‚µü%-•• Ž)BÍ+h×üûWUJ§M»]œôêÊsµô;W· ÷r²±À qšD–P²åN ôªºþ¡¨Ão¤}’öx¢û1}ŠÄ)a+rG¯Øn5ýVØNš…ÕƒC+¬¯¶D?ÅÉ' ñé\Ê7FÜÖe‰"o-öy˜|ËÀªÏe: F11ÍuZf™xÖQy×÷R'Þ-#œËÎA#8ªž,gAœ³ù?yÎOßjSŠJåBM»­ÌR‹tÂç÷ð}Ö¥<«dæŸy4†%U‡Ÿ^åªPòç`JÄÔ’ÓOžúå`·MÎy'°úÖÐðÔ¡óo$vèL1–P~¸9ü*φʶs´:SŒ‚@#*=ñüÍo›…ß#Æd‚í…J0X׿Ú·„µ1”ÝìpZž˜úqFYD°ÉÊ8â³ùnÙǵnøªê0¶–1’\·˜Gp€O¹'ô¬X žy„6ÊÎïÀ :ÖSŠNÈÒmj3œQ·pÇj½ýƒ«ÿ’~T‡CÕ”…6’~•<¬|ÈÏ1 ñWt«o/<©ætM¤åy«Š7eLn6žý‡ë[ú/t3G‚Í-Ú%pT ö>ñ#©ç¯ZЈ4òy"è[3ÄU¾C»è8ý)ò çg ¡¦\º‹K™pá$cÔƒøU|@øzóƒ„äÿ×E©î$°ºñ—¶H¹àöÆ3_ñ¨òÎ;Å‚{xDñ0ò³) ‘Ÿªš¾«!%¥!œõ `Vr¶£¡ÝËq§Cåœÿññc)Àcê§±®,>*4ë¹ôeâhJ¥.U¹¢ñÙLT¤Âm™dÊ&Ó;ôãÑGaQ}‘¬ÿ´5k™ÜÃoní#; 0©&Ÿ‰tWù¤Ñ5HæI|Œÿ½·5Jþ]GÄòÅÔ c¤BþbYÇ’eoï9ïø×}\eS~Ïw¹æÑÂb'R.«Ò%,±éÚmäù6etüH¦^i0Ý^‰#‚˜T'ùVüÖÑÜÛ<3 Æë´ƒé\…ïöƈâ4Ý= 9I1»ÄWÊbhÔ•EV“³>Ï/­MÁѨ×Ïgs]Öí¡°›NƒI½k§K‘°ý?Š»?„¾º°µ¹žéU.æd‘7u@9Ïæ+"ÓÄ~k…š(Ôúõ#éÞº‹{û‹›³²ííæÿ‹—y÷W<ãÞ§ŠÅâ¨}V1~öí»ÿ•—’9ê`¨á¤ê&¯Ñ/øws¨ðÍôsêWâ2B\È^ö‚ð?1ƒ[×à a¯'òåF2N=«Ïd3ÛÞͼ¹"ÁB;b¦ÔõOøIZÞKë†ÓoáŒÄÄ©h&Îxû§¥{y|hû´ê>Tºž6-ÕQs¦®ûiw"/fŠ"ë-ÔªeÝòªç“޹Å]ÔõËkétk{r›Ø_!³žôë ;]7K¥å¼ 1rÁמ½êŠG¦Z܉l-ÃÌPä˜ã>£¶~•ëTX8óU“Õ^Ö}ü6QŵOÊë±vúi‰á#jN Ñ‰8År:Ô%î®ìmoOo+nÚ8 [×$nd;°Kz0îj½Ö™£ÉªO¨¥ü‘Ÿ™âŽ2ÛIv ¾kÍÀV„y”Ý“=,D$ìãº8½:úëHÕþË{ó#€ˆÈ>\F+Ôt2/´)àfÁ‚ä7Œ¸þb²#³Ñ3½´ë»¬}Ï9ðv¶-îmå·±Òíí#›™K89“þs[T¯KÙ:Q»]9ó©½ oi`x^âe‘‰…•ðG¸ÏéT¼ ª•ðÚDÙ!$e8<‚AnkZU忇}n[%á`9ÉÅržѯìl&Yñ‰\Hª‘ÈHÈä¨ükÌ­ J¢µ¹Ù %-YÚ¾¨X0 Ä1Î0Ï­Kmt’YÍ͵ƒ+ÆŸß<ƒúb³N»#"ûÁPèGùT–Ö·1]+¸ ªÊ$ÜI?@+ž±’”%85dy·ÄçÚ´p4Ä•;r{uü+­Òµ+ϳ+¾‘(ÎÁ*çÿÕQxÁ£³¿µ¼DHRpÙZ£g­ÊT k ûƒþÌ;æØ¯­ËªP§†æK7ÓÓåsçñÔêÔ®”atºëÿ tšö™«Má›B;Èm|µËG,ûÞµÃü8’öË‘p®`ºv +דüÍoêÄZîšÖ b––îAf’äî8ì@«Z…o-Ä_j0ýšË&(!LrA$’OS\øüM ôùS»èuahÕ§+µdiëÚ·ö\º<ûÚXä‡*3Ê>qù8©tb²G4‹ï§*íÃ1Ï“ü«FïJÒõ-¢»W“ìócÛ0NJ€AàñÀô¬\ÚêŸfB‘ÃÁ?4ƒuîrz×ÏÃJuJ‰;¯Äõªbd¨¨GFŸàXU¥þ¥mk%š[Q$L ðxzýEh‹'±±¶´ÞòÄö³°b|ØÏ¦ck¶zƒG"Ý#4NUnÖ"­Ç\õuÖµ¥Ìù5Ê9–(Ýðz{WgÕèÓƒäŠG7·«6”¤Ù‡¥Ü5¾š–‡†ŠG‡G ~˜®¥¬eƒ˜ÁùEq¬±Øê×1¬£™¼Ä’Aô×5Û§ŽíDiö-P¹¨Éu®{òÕYÄëT¥‡tvO™}Ö9°QŒ*UU"õz~% ½L[D—.˃… Ô£¦²‰.âBL~g›ÿeÆïæM6ò]KSy3¥Ù[Äí»lò™1øй¦[ydžþhå‘‘QV(¶*ŸzSú² £MZ]{ÒXÏ_„æŸÀ¶#9¸Ÿs1'§z'ðxÒ ¿º¶‚WäÛü9Îw0ÏaÌR26ÕpOã5?‰<9娘Ý+B[ÍݸxëŸJÒ„å$ù¤"“ÑBxb•dþÓže꥛pýkNúŠÊ‡q·Ee$òJ`åRi K7ä–ýßlñÉüMhJm$…ã1·Ì¥NZ¹jJNVr½£mê0Ê.-c™~ìˆ~#5äZÀðþ±a›¨é×÷3êR[ÜÙÅi¶eVbK?7Ëêx«ºiji£ÙØÇi,×0B±9T-ÊŒvúU)¼M«ÞÜ=Ä:BÇ#Œ$!2=ñƒ].InÌRlô/]YM£]ØI: dC°g$0åN=@¯&ÕíÞê;{ûQæÇjþZ˜<²ÄGCÇÒ¡Ôl/G¸ò#g–n<†“+ôò®.îæxnÅ¥ÜÑDÉG*l,G d*Œž%%¹ÓZø—Qž&ìQ¶¥4ùÏ;JÁúV¶· Ým&9ÚTàçƒý svV övÚµŠªÜoÄq³¾Wa]ÌÊ—Kª¡™Am££{~5¾5xÕ]?ጱyb(J“ë±™`wØ‹g%$qê*gòí"y2LÀírOÒ£ÍØPºuáCøŸ…&ɧ2€õ;Bñ®ùQÃÎNQ¬•9;µÔó㈯ʃu"¬´ûö3ôȈ»Œžˆ¤“úå]w…õ&óÂÑèz§”g²Am<®C*ð­ƒÔƒŸ\×?h’Áp±”p„œåxzút¦jZ-®¤âWWŽdáf‰¶°™¬sJÑ–'š-4ÒØß)¥(á¹dši»Ü»{áï ]ÚF²†HÆÌ )9Ü <(ôÌêšÜIi£éQÜIl¥æ¹óÈ@ìñëÅZ_ Äωïo'¼m&ýqÖµ?³lÕ o²B #ü½yÞÕ-F4™™¥èCH¢±h Ýe1 ØV ž£•_ÇŽG‰@óãmÿ WL•áF}M;Q·ð¶­p—Z…–ª×+ q9‰¶©Ú1Ð=:S»|Ìu#ÙQ5fÏÞ½fM Á,¸M?X-þÔ§ú#xgÀm×MÖOýµ?ü]mÏæ|²ìA༾Ósÿ?×?ú×¾K’{WŽGe¥ÚéÚ=­äðK$¤\rIlt9>•Ùjž)Ñuk ,¤}B8¥À“Ê—<®}J•(ó=JqvZ?ôÛ­FKÏh–Š!ƒ– s?<˜Ãü>ã&½7Â!±ñ/‡-¯¬BÆ»B<#þY0¯ùíTWÆZ vÂÙmî6ü”.1Œzb¹¿  xWR»»Ó'Õ+®^ÙÁÏ£\ñîO+ìZñ×:ôc$³/O÷š¸iîM½«F‘»³,Š»qÃ(ÈÎHÀÆyö®·Äš­¶±©¥Å°F"|ÅÚr ?Ö¸½V{+y/`,³DLBA‘Á<~uœ$¹Ú.Iò#5¯ ̧ڒB™T`8Áá n:ãëVQ%·ŠÎo"æù›äE!÷!ÃÜ@^ ·¯µT:կ؆Ÿm6¥=°ÿ–(Áóžv õæ¡honßt9ß8Éúåô­]YO¡ê _7ÄòwTvãýÜZßñïƒÅp–ÜÔ ¹rpg•>ÕÆø7T>”ÜêË4ÌÑ•Þ0Û #éÇ»xþ"øuø’{˜Oý4µ“úY(ÂQq{±põcZ“´‘_@Òô‡¶ööSÞ·j¤ÿ¬oaÙƸ•œ?™1 #·Nåoë¾8Ó./ÐÅu·ˆe\ bÝú6=»ÖSüFÓV6„Ù*¦vŒŒïƒYÎJ>âÑR­j²|Ò{êWŸì×p´SB l0ÊGT~!Ò?²­l-ü+göX'‹Íš÷$ž‹»±ëÒŸ$Âg2Ä@Wä Å3Yñö>]9-ÍÃ4¹Pª ÇQ‚x÷ÁëB÷“ìeN§±š©k۹ͣM®xjëí—÷FíIŠ#r¸$‚î=úVO„ü,f¹»Í9R;ûZÑè:–®â]Zq ÏÙâ~¿ï¦º[kkhV`cFÍT¥ËTÌÛu&ç.§K Æ“X\B«±íãé[Ö–R5•Å´åš\ƒ… ØW%a¨:3Ã$¡œ>å˜&1Øðs[pø¤œ¦7þ¯ÿZÂK•Î.ç1.—ªC,±)ÛÊ8,«G¨õ®§NŽî?ì»_ËmªG*¸8Þž|VÄ`i§>Ÿj_ðª7!’à°þÌ•~V_øùR9Éæ­É •”të˜4Û‰ ×›%¼¨U—nNzŒ~£ñ®šÖñ§ÓÅÕ¼pÀIûänÀ8>ÕÇIs…ÁAŸ¥jéÞ!±¶ÒÜHw6Q#~¤WŽÃ©{ñ½ÎˆÝðÜÆòeÞi[ÀÁõÀ5¯ë6N¼²Yº!G–c žAëJ«‰ì-‹=¦‘*–êÙTÏåšÆÔõ©j säù%€ùwnä uÅsáðÚ^I¤7'c,6ä…R9Æ ršðŸY¹Xm£wœ O^íŸåZ÷¶¸Õ‘¡Ü‘Üî[ ;…ù‡ŒV¨£(\'pà×ÑBQ¤ù–­œ²‹©£Ñî‘á£n~Óx“ÿ žBý}k¡EŽ7(ReéO)¾79;s× „³ 8éëÅeRr©¬‹„cÐ[ÚA{6‹ ”Þöÿ»iTâGÈÇ©*î­Øê–V‘™¥tc9cŒÄ;v¬Xµ;ët†’Ñ„?êËÄŒWœõ#ÔÓbÖ5†Ôç¾-”¯“¼Æ¸Ú=8¦¤Å³ÐmÕd´”1Œ‚¸ï ·ÖƒfG‘ÿ³µ@ž#ÕaA.ƒx”óùVv£¨Ýj,·§tˆ»W œöúÔÎi«iÜ̺…>OùoOúê”ò½@ü³M¹”y Oü÷ƒ¡ÿ¦©O2î bl:Û‹ZÝÔçïG(Ê“ør¸©î|Wª¤H¶‰dà8wsøÅeÝt>^N;¦­6—c«%ª[Ü,çk©“?à$ŠÞ“ècQÑÄ’4Í!–i9wsó1÷¨ï›RûÿdÞ›;Þ<¹ÀÎÞyüÆGãMÔ´ì]zÝmoÖír„mPyè=ÿ²IÏJ‰é+¢¡¬l`/ü,CŸø¬˜À?úÕCãüóâíØéû°¥t…½¦ùƒ<ƒG´rDæÌ~?=|XHÆ?Õð¯Ið¬òÞjöë-ÅÕÅÊÙì–I¤ÜYÀ+ÇžÕ͉±®›Àοð‘Gú¦çò¡M¶“•Îâ+9ÏÊÍ(s¾¯ÛÂ`B¬Å‡\““Sn_QùÓ]ðŒA] µí2 mt…ÉÆÕä×—ø±£#¿ÏS'O«êz~¿qâ‰Ê-𤬸b`yÜ}{Rø’#>µrÒ|²núàSÄB1гÛw8yîV;©U2¥Àn3Çj…\Úi¶Grµµ&ˆ· =ä’B¯ Ú"|üêˆQSÁà›ÛË&¾I­VÎ%-æ<¤¦1œÒZ«ƒZ•t¹D™s’?¼EM¯¦|=y†êÿF->Æ×˵E]àX·­3ć‡o“ÿF-sÔz³zkDpF9ÿZfe^£š—yÛƒÍëQù§*k˜èe‘›;@ü(3m8Æiû×M4Ê™Æ0iŠãwî8=M8 rÛxÚ2iÅÐŒ‘Ï­0qƒÈ$S ;†ÑÎ:zÔ¢WYc”‚9àÔFêKeF>n›iÐ82à€¿Ö™,4ˆÛ›vsØŒÓþÖÛ÷ 1É9ãß4ø$HÁ'çÝ+œÔ¬‘Áà—çŒS¤-;4l|ñŸö”Ê«©# )>R0SÊ®Ïi?Ë #©mݿƫ=° 3#*zþ~”0Ðf6³nŽ2Jäsòj°$ä?…Zh«¸È¼•#·­Cå¶ ^£9\‘Èô¢`ø‹IeÿŸÈr?àb«Æ={f˜ G"Ë2I ®­‚¤t ö4“Ô;½_G´Õf×å‹K– ë}]"ŽI' ]™e ® ÔŽÄuª×þÓÒ &SmRI«‹ ˜íÞR„dg™9Œ¯•É\ê:äH—Z•äÉùˆ$›kuÈÉàûÒɪê×j×òeÖOžáÏÌ¿uºõiÍ>Vtú¾‹¥Keª®›§É ÍŽ®,´å¼àÄŒð9N¤Óµ ØÛéP\}š(ncÕ–Æt·’fM¤A.XŒ¯×%Í܉*½åÃ,²y²†•¿xÿÞnyosÍI.¯«Ü#¤ú­ôŠåK¸viÊõ="Žh‡+:ÝcÃúCïÁ¦iòCs¦ßAl×¼ï1Ší ð=_SUüAáË+-o²Cu¦,çKG–A´©$f@2ÀŒe~^k”’òú_?̽¹o´0y³+5È-ÏÌAèM>mcYœ0›U¾‘X©`÷AÚr½OcȧxŠÌÚñ^“aoem¨hðAý™,­L²Iæ–;dWèÞœW(R­^jޤÈ×÷×WEÏ•ŸÛ&ªäƒI¾À¶;}7T’2ªÒDû®‡ª5‹Æ8ûe×ýý?ãEÌ›:šD‹©ÞŸù}¹ÿ¿­þ4ÿíïùü¹ÿ¿­þ4QI¶+"CQòÏ•p­êdoñ¬Yu]p>U¹ü&j(¯§ÈTeÌ“õHãÄèô-YjzÛÈ3ªNW¸iXÖÙÔoçòãþþŸñ¢Šóó»,BI%è’ü0ÿ ÔoÇü¾Ürç«!Ô¯€ÿÛûúßãEä]›}BóÉ6îá“rù„ä~uÏ^Ü}©óŒ è(¢³“eE‘ÒŸå<(¢¦åˆÈzÔ{R¸Ñ"qÅ;Ì j( `¥œd‘NÃcÆh¢‹jKbì#cJ#袓¥6ãœÒ `sòþTQIÛè N‰hKsóôÿ®Z%0Îh¢»#±Ì÷8ïè¾*Ôµˆn4ûë+[kfÝ _,{–ùp}1ÓZë-¼ÿ²Çö¥‰n6þðDÄ®}‰âŠ+Iü(˜îÉpqɤç¶?(¬º–"›œS²týh¢€åî 4sÁéEÞÀ"Áì„P}@©@*8$QEClaË<µ'=袕ÀSYÿT™õÛAE^T>”QTà` zUMJ+Óa(ÒRÕ/\b7œ©žü’=(¢ª;¢^Åè^&ÐZhu‹«Û9I2Êí,nNN7 È=Æzóë]Ò€GÝ¢Šë2KAôt¢Š¡ Ú«=¢±?1¢Š–“Ü{ÚË‘’§£4=»ãú QEdâîÈZQùÓ’Éä|ÆŠ*TUÊ»4ö&ANnå ü¨¢­B$ó1³—ûÿ¥8iñÉcEJìÌwØ ÎJ’~´¿d„¹úÑEW${ ì>ËêÇçHm­ñþ®Š)r®Ãb¶Ï1šCofì I ¢Š,†)ŽÜu‹­ ¹é…Qd+“nú±Ïµ!Kaÿ,¿J(¤ÆÒÖ£þXþ”Òö½á9úõè¢ìŠ÷’bÒ_±[Ä×[O–&b©»¶HÉÇÐWá}ÅzN¹=ΩycyivÛ§ŒJùSÙlc¦:cè(¢©lKZÚµ©9òM!–Ì’<ƒŸóïE’EX¥¬­ÓéS&Œ°­ë ±µË‰þ×äJå|á}oK–hµ¹4ûëiI8fiQÏ'ï' úgÞŠ)¤¬KZw—cb¨P:0*6~4QX4_R<ààô¥Qƒ÷G>ôQR†ÉZ cÉwÖ«Î_Š(`N~4²;I!ȃQ@ 1JvàñE#9Oi¾#Öš}.îÖÒÖ&XÈË#¸äg pÖº­6äÒ¢»Äo”aÞÜ–G÷ä lQEtÙXϨÇnxéJŸ¼MV/CDr>!ѼUªk0Üi×Öv¶Öͺ2¾Iî[ ƒéŽ˜ük¨¦q5Ú ¸ÇïLJgØ(¢­ìˆ[’£‡BNEA40Í,I&9ÔQE+Iq¨Úªz(Å<«ŒÑEHÄSÔæŸ—¥PC÷£Vyb691‚GB{QE;pc¸üi›T·#8çš( þìŒüÔ ¡,ãéEV£Ë'ï?ä?Æ¥6À‡'ð¢ŠvB¸å°fYpjq±ŸªÎ?Z(¦‘.LÚp™y¾µFàኟŠ(c‹ £摲OΊ)tÝÜTÂ?°âŠ)&1þyÚT®iâàþ­IéœbŠ)Ý…©pŠÇ0«^õÊx¿Nñ¹$Pi7Vöv‘‘#™Ã»ŽGE8µV‘dIhtZ]Π4ØSSòMâ HÖìv?¿ `ûU¯´1$0ÈúÑEL˜Ò)ßH¢8óàÿÑÉN38Æh¢¤« Ï$€1î)0 häQE œg…Å 4Q@@M(÷ïE]£&6—ŒõÇQEÁ‡#ÍùÐKç;Ûó¢Š`4–ãiÇÒšÁ‡;³EÂç¸Ø8Ú(¢˜“Ìõâð^z'þŒZ(¤öÜàÌ€œóFñÜQEbÅ8ô)¿ÃÈ•P‰ê~è…r>”Q@ Ä‚O¿4ªJ°>ÿSê!æc¿ ÈïSÅt7ùyôÀ#ÿ­EI…ÿ96î(O9ûÜTM1c–å¤=}P&¬ͤäŒÕ]åè£=qš(¦ö5€nNI¨H$ph¢¥ ŒÛµ:ñMÆÓš(¦@`œsMÆÞŠ(W99šˆ<ôæŠ*’ß4ðqAmÝEPŸÿÙdanieljprice-splash-4d1f09c/docs/figs/rendersubset.pdf000066400000000000000000002706271477365367100231700ustar00rootroot00000000000000%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x­Ë’É‘®÷xŠ\‚f"„¼‰ÙÍØH3’I§ËL Q ° d¡»ªP  ÔÝï34¦Ó½=Ïrþß#Ü#2“]¤Â)™D”#ñ¥§‡‡‡Ç5¿¯þ\}_­ñß~×WCWWçCõ—ê©ú·›j·Úmš|?n›Õv[WÛM¿ê‡¾ºy¬~ûûzµ®êêæÃâ¯ÕòæMµªåéMõ¶éújù—§·÷Ç»ÃÿUÁ鬟þqwx{{z8½œíËçýùz¼}8\~ófßoªååøøüð“þärx8Ü^õ¯ëýA?ž®Çsø««–ϧëõøô1|»Xîχ½^¹ºÓÏçÃå¢ü£6-®¦=.¸ž"³x½ðÑ4Õß§‰Z«nþXýîæÓFì·«¡ÙVÛ¾]mÚÅȆløAnY·Õòãùôôí×Õ2‹7ä_ǧ;<0¯úqõ¦âý¿v?-´®^m¶“Bã ÿ8j|Þ¡Ý.–(·»ÃSø‹÷ÓO×û£˜­ÝVËÇýÓÓAŠ”ÁÐr nÿp3Rüt¢Ùøéáôô1]þr9Hað› žxÈs,I^u»¸}yØ_§§˜íEqsÿbêÅ9„g²çÓår|ÿ`ÐPR¼&àõq_.r£/*¹f·Ú6cï§!OOðU¨Õ50¸-jÓòòòþr ^">}ÐOÁ}å’Ü›äªwËÃê#Ÿ•l5 8¹G„Ýï Á¸a¸3Txúñ7¼Û Ô;*†¯G€ãÇ{Õe}9^Yׯ:½{ÿ Šü+} .–êz{TOZV´·Ï|Âoà›?Ä_„þ"ÛÖÛÕvÓÍ«Åï_‚Ñý{(õ*N~ݯ†õnŽË#Õ¼vÅØÂ/òÂAÍC8¹½=ï¢WòŠàQò)„$~ü{0ÀþáE<")"©¼ŽÈ p¸´Ô!^ôýËÁŒå°ýX~ò‹Ë˜WżBÈÜæÜÄÐ\-ÿçMuóí¯F¤v³[ à?{öbÙ­†UÝÂ⯠‚½×mµÙµ«¡owc«ÇŸ®xaS£…¸Þ葉Ö;Ô ë¨Ó|X~‚¿ÒXCéo*üÿ^Z~w‹°÷ûIxYÄÈÅôj!~ƆͰYuhñô‚Û´fE´d±p^±D[oV-³BÌ ¶’4„”jƒZùxØ?EG¢–¹Q¢Få÷‡kœ|òóaTþx…ý‚é$îñ¢§S00Ÿ Ùá dsÁ˜ûª#Åæi3Ô«a7|¢ê ÂíêšZ nß¿À**¹ÑjžÑ†C%è÷¸/”x¹BcùÑy‡ |4ÑŒ$ÕEäZz|¶p¡x ž$?œOú]Æ;>¯Çýƒ}Uƒ#¿mv…7¡%«‘ø iyRÚ{ºÜ-Ô‡û}öÜÁOçï¾¸ÍØ Šíºöæ<Á2P¨e¸¼?Þ2 7-Ó˜QƒŒoqÿÇØbâ¯= ]§1„˜ÓûocžÄ¿bÓ ¢„ŠVÅf4Ül±|/ÕJ¾ µ1¤OBc«ök:E8˜ê¼m·˜(j:QÑ©©5šv}jºŒx eIÐ’.æ9¨ú'þÝ ÛOÄ™G4>ôô¿g1úýþö»Þ,à‡ûóÔ‘¯‘aI(AÖ|—šñûóẇ[„„‡aì¶°õ¹¦Hnkè&*ÜiPù+ãk»êpÏZnúäÐÐ^+h„:˜“ð‘“P+D6¼æ*¼(67zµº ¿J®Â¿Bi†ŸÀ»ø!w•T,ŸèèSÖè" ú”Ò7X„¨k[Û€ÊÚ†¬¡A%”Ú&ÂýíýUêg± WáâŸødf—2@HéVú¡¼D›GR|ág¨?Ù5Ñ("Q?qs½´ÍúáRiññŠ!Hë/Ì7ô)ã}ö…ñw½f7áã°??CkÀ¢¶ im?¾ùlž'[íÐ:ð_š(ÔízÕöƒýÚÚ6ëÒ—[h#Î"¦|¼cUz¸|a]é·à¬ëøð©®TRWzðC]ùSÖÕ£-br+w4¯xtè”…ÅhÄße~ò%NÞ÷ýjÓ4Ÿ(››¬¼A?èúr¦§7üœùN³A¨ šð›ÛÙ†].Œ‘ÿ3ŽRïhtC¥Ú„ÂÐle±¼þô|@¨{%UiêݪCOfLÐ}èÒí‘ö†€Mý¨8ké‰Ú@,„ë¿j¹éĺÛÙ­Bjõ¥~× Hn·[ûõ§ün³ª¥ôH~¦Å꣄xÄúfbv< %=#/ i3(°dS,a…˱‚óñ–]Óx)šAØéU£„˜‰¤¹ï0€aü\,€èÅŸê*ÀiS^(Þo½ˆÐœSvyFwYr ©èA-Ø6~Œé¶\òùÂëšU7ÀOFj¢ðBJû™ÞFrVH·Æ?6'“ÎÅâ?MvBï°îNʨÉ4.lb\X,ÿO>rÀgÔ>´áµ(#W¨›lP‹£ŠµÛ hò‘ë u>1æÂQƒÐ.6JHÚņÂà¼!ó“¡…PÙÿ9 ÒüBÏæŽOè&ìá…ãf4¡õêzÕ¬;ÓþŸ­ª†µûµ=û¸‰x÷Ft†Jÿ«ÊÇÖ‚†fÒ#3tJµâCÊC£ª"îžìѳ[€G£äcâ¯c¿ˆb€¢%™ú|I]…YÐIìןª«tD"ˆÄó)ŒUñw óiøJD¸.ö\ä7ÑÓxez˜È c $çWŒ}:öQ„±?ŸÙCæØƒaGß—a|;¶ ªŠay×ËhØ&|)Ž÷Mã/»ÍbÙ3ô·k„ÚЗcÞ#—ÿA>u¸Å^Ÿ&rzÁuÿtã9°Hsÿê e¬ò07R¾ÏêøQh›ä¾[ô&Bèæ§h~̈ãj†¾eÐJšÒÏ|=ìsL®6Ô é7ƒýz^ZiD†jíÕ˜Ô,ïÉç(ÍðîôȬA._,8^¥ïÈÎCvÑã n®ÑLVˆ2üj±¿Lµn‘Q•ê=å=¸cíc÷Hñ‘ëí0’ÜaòPÄd=ê=‹R½çœÇ s=­ìDsÊaÝ"GÐAfRfncõqf¦2¶qNÈ6â&ý9r(b2'»®{„*VuC«ÈKîZÖ–9мämƒÉN€‘#b5Á"pbò6œùËL¡"/¹AóÓo¤ÐÄCyÙýv»B’kE^ò€Ö|@ÎÑ*s²ÛºÃ/m­e¨/¸k[Ô÷‘ҭʼìm=¬8(¤U™“Ý…öÖ*¡üíe6Hn‘idêvQä%so'VÖòëTäE´Ü#FŸLDNr_wÕoyÉFÿ×ètf–Æ€H•±‘¸ÖýM¬úԚȉÖ@ŸÈ*ñ‚-ôk^»"?ÒO´ÝhKb ÏöD~³±†ùÄU‰Óä3²/î'-î«WØO` ñ™Î**3‡ŸÆøDVIØt¶Ÿ‘}A?¡5Àgh9µŽ1_ËÏòM[ïIY•”éjEgá=#û"~ÒÙ"¾YÂð ¬Ñ=©¬’2c$°ÆöŒ¬¢2t_owÈë«£ü ‰J¶ÈøÑw.å6’¶[µÌ™1„%#©7nn »ÁÈé!ºÇÒ’âá E¸ÍªaçuëSÉlŽ!ÃÈê-Vo Qjá1%ç˜D)/9åÊÈèj#5(UØ,0$o1Ķ0B€ÎD)y‚!yÀ`KopX"g)ƒyNf΋™Â‰ÏS É5f²0h„*è)µ)FÈq×åfXX–A2ª«R(5@FVpÕâd‹;ÍëuÝqgB¡Æë0^[oÑUEH.­!Ü"ÑAÍ éhXCÈq—âá²ÚÖ:d˜Ljs¹ª9ƒÌÑÛ-#(Œ)䆶ÎËS²óØ@K]dÆÚë-¯Gجzæ…ªšQ2n¯¸•Pl€Œ,áÈbKv ¹±ž9çE¦ÍÏ0+äÈtÔÏ…\õhwL!×êŸk†hŠ!Y"ާÜ2yÔ\.&†,ó1“Ä`YX%¢z]5THI“Â]m9Hƒ½Ü@!7b×cf„@¥à FÈ!_õª“=ÅË®ÇMá¥*)9ÆÑaQn Œ,œ­< Õf‰€!9櫬—t§½Š!9¦¬9‚å„BnL[Ü1\Í[õ bŠ!96 ¨ŒžÒ›b„Ìæw ÍœB2ª«r(5@FVp d‹@1qõF )†:džèŽóbe>ùrLhwùœ±‰0ÅÞr¹Ü£šLGw&s²±ÈLzmÙ¼ng2»Ý¡ïÂ\=c'zL˜®.µI»Á*Œ¾äh9µnî?³‰L¨ão'³æ:uîLKXùÈXÜsõ@ŽN2'›kb&~'ëdDæ+¿¦A]D%>± jÇ>\fi9É.áÃT`Ž6™“ݲÒfÄ6™“ÍÅ0#®£ÄW‚ÇS¶Ø>—Ù#É|:÷mÃee#­“ÌÇn8Êô"×;É|l ø}ŒS»IàZ4dÑ>5þÛZŸÂ¶Ec}"'‰Kg‹ô芬‘¿ÎÙ›-gÆÊm­:*'·É€§;ìÐ/k¥aïhåùgt]á3’+_H=ç½é8’Ücß6Ê–›d‚!+-à×^ð˜B.VÈbv,áñCò>0KU§´Çᆜ¿)^Iý&œœÍú²u˜CÙÊIö`T©q°ÏJ®ìdØTï<ö˜pÈÆ¾ÝŽûvѱ¶ÅìùW~=ç ÿàá®Á”"\veœ\©5À 2ki`)5t$+&ÙBãJ1X,ª)¿°©Ò™S£ü&°ÑçæRoî;ç;l|tæÕ`O8d#gbþË^FyMœPÈ…'£'çL¬g!÷\üàL¬Ac2²¦Ã…ާdÅdÖЄ¸˜L£ÂÉ”C4ö'nq–S&Gb=çÝ eâ±(ãÄš{Ô[ì×Ãý¦j0U‡k°‚“gAµÐ®ÆWë]?è.õï¡/ú÷<]•gø¾å÷}¿­Z$ }5²ç¼ÃyØtþÛ?<ÖÕ¿Ÿ°§Ü±þŸÙéΛêÕ“pukØ· ÷;¬cÂŒBY™)!`²Åö.0vÄýÀ98Šô1ÊtNhå$¡ÞE•±“=”“³áȲκŒã0=ÈÎZbg2Dí®tF+JéOed¹Àí¶Bç:'™ Íe]˜Ä™#É-znrÀäö¨1¡¹vøžÚC9dGósô+Jµž`HŽ.Sãý=¥Ô A¢ú·™3ÈÔúè5À”C6cˆÚºÔ8›㓆,‹Š.ìs4Î 3"‡XZ¦3Öžqê0U_.¸ÁX?mÐ×.?rdJw@/ÑÍe‰ D–É)_ ±ÂˆXXœ±¸˜¥ÖSĸÁÞ8Ð¥|Ÿ¨•Z¤‹ÄgÉBaÌØÏgÌ0$˶a7xL![1œ…]–SÈÅp-½×Wp#ˆP£›)õL pp ¿ùY”4ˆ¨‡Nn¤$+Èû5J§EÔ”’•YéÃâÈŠ^1$GÿÀL"f¬KÍ0‚ªµÂ‡SÈQS Tß †ä1œ7¦€ƒ¯ÏÍ‚#÷Ñ÷Çæ.EÑ¥ -1p 𡋆°ßŸ G _f‡0QÊÅÉÁˆ1m˜Ð"6 dQ©— ¤"†AíM‹RM3DND8/> "é( ûB7œâ/^L ðC2ŽxB ¶>ËŽ ¤¢€NÀâ}LåÆS„+g͹¹# ¸Ø Âs×½v˜bHÆnáš½¡Vε-õ³)FÈX .VüÃÔ…þ»CR •ë@ŠûÉxꀔ‘B¥.ÖWÍi±a'gÿòc£ØÙ¦êÌw¢2aŸ ¶Æ–©Œ}‚R¬Å–ru.`7Y1zÂ!H+CØÿP|6Ñ 2æ°¤oì4˜s„÷@°ºº/@1#26•¶HX(¹5|ÝÏd å€meXËîèbÏSWˆ’Õó|ñ9GØCè¸:€cHÆqÌ3œæSÈÅPŽýA/á¿4rL)䢷b8Ç眜]>D‡dÑf@ë7È™†ˆØH¡²ëê,&_C]a?Œ\DfŽ¥m`"-  SØCðº&¢§˜¼è¾Y²JA¤õ.4ÃPg -ÏÕ8ÃŒ5èñ·,N•'RqÊ ö_»¹ É0m͆Õi‰ †d”#—×!—sœ›6ì¨ ®RèËS̈†BÜä€É­SËË3Ûdˆ!YMßaIKyv;ç­ÓáPªâÚ Cr¨'NîBªÖk¯-¦°-Qô•à#däwXX  ÉzÄæ 3"»j vº²EãϽÑäFæJ‹g¬°¦_^/²éñ6ôõˆU ½)íýM)äbȇjoøÖÕâ•Ù3̈Œ39»_“†‘#lYù¼Aà/?J(Âå¸B¾œ.Tnf,iÍ1$#oAâÙcÝ>ü¤ÔGRÑåãaë^î2N€LÙgˆ …\„$œ(9 M–Úa jÈo{¾Q<üÝF”œ‹4Ù? ÐJn…P¿ ÝÁÌ`QbÀ\`¨ÍŇ›¢ä3uÕN%÷ç–Y½ë²çµƒØ×¤_Çt†yÛ„€ƒ ŽÚ6ÌȞdF!s‘ÇÕåyŒ!™€ôM†žqÈFÄîtñz„œ@úØÃáfñöuà<+1Æ 2ÑÉ•)Q×Ú‘FÈ2ðè›%xDɹžµ‰(™%b­.‹cfˆ¶˜.æDoeÀc 5Þм58íY¤ÒYq1E¸—kDŸ6¢bÏàR—Ãû>A²+#*àl#ïxÊ”;hXw yL)bßàÔ_‰’~ê‹dœÑâëŠO)Ô7ZÜ5x0¥«Þ5Ž2ÃŒÁQY›â$O0$ÇJç´Å˜Bn Ä®a”)E¸Ñ×<]CpG”œëéÌ&®Ž Ø¸ºßSJVn¾!+~ŬNâå˜aHÖúá$O0$Ç­QÚÚM0 k ò•ß„BnLº]ƒ'SJÎuÕ OAdc'¸S”xOj¼ #ìÄk¿(y†OfšG¦`4Û7|2¥ä\×àIÛØ Ž] {}ƒ'3 uÆ®NŸ»Æ ¦q79ûÁ7ÈçQÈÅnJQ×ÓKC„Š¡@NH8Í€ýU9ä-–s5âØŽÁ“)E¸!™už€;¢ä\ÏèIâêèIöžá“F4–¹)DŽâŽ-΂—€ˆ¼7ˆ £<ƒ'8”ƒ†:kýˆç|›[¦”Ä­±úŽã—e-Ü\]¤i8£·'(ãòý7-ÞÝ LX‹ …1œŠñ.ˆ\Ý®D¶~W"»:^8…[Ø© ö¼ø&)¬|i½}¯9Û ¢§¸:I¬lå÷u¸Ú÷ꑞ ÃÀ•ÀÏ0ÐØÌîêrÌ0 clQÞ›à›ÇLÇÍ,±³r‹%ëõÖD…µdŠ3ù<ÆØ7‘=¥€‹L¢ÆaG{æ±g’¹ýBÈž3`j*¨>—‰<°F­Á|Ö3Œ‘(VzH(|P~\U¥°ÅYDfWoi†™õ¤k`zyŠ™u¯"OÏQXQ„ƒóÐ2{H(Ø|» q†ÑÈÜÂÒ®ÎXˆÍfDöÔ•“¡¡)µþX&òtÈdÚ [á™ÅéìLäéÍ0°FàùúcÂíqV\¹"rõÈ2´uÉpp£ ä™Ïža¨5¾{ç³§páiÂ4öLhLͱ_{‡wÞ™¨¬rÏ0 ó­xƒÉŽ53LˆHâdWÒÑ1c\Ë)äòtLÅ7tÌk W¿DŒ’Eäé›ed휅§`Ü•½¬üf–¶ Œ×å½³1ƒLlc[‡îZùäökh°œå¿ÅiÜ\êòXíPCÐ}GK‚"Ë—åÏ0 #kÆv{Øa‹ÝÅ+ψA#GUü@c¸ÀS ¹ºfÌe‹FÈX;ÎåKjù2wzÂ!¹‡œO±Å^©âE;3̈,#P¥:›~BÉ­Ô™Y VcDŒãƓᨛ1ÈŒÞ6`ë`ñ¢)%ÔÔiDM8Ô ë4ކ!¹Ô R¡ÅcÉ ±£iÑÞ¹Êl×àL’<(€Œ-º8¥ dW­›a@Æä V¹kp¬’´ÚK6_r¼qU9a¬™DLÄ‘£ÊeàXåÒ#øŠ˜Y•»w5: g£ V€— eECå«S Ȉðèé¹+`ð„}15‚—ÁÈSg±†¸ 5ÇÕÝ™sÈæxc©;–Ÿ`˜lÚèE ‹ÈÑ­œRÔ’×z:ÂÁFK.WÞq¥§= ÅM8ïë«yS ÈR=oÇa†™UzàüºÃÂhcçLÙo.“žBËæØÈånÖ˜³ð:𠃓•94²eUc†!YÔ”ž׌N &¤l8^ 1&‡yoŸ„̳Ш!–‘ÌNz6õRh)dÌl" HiR!yŠk}bßÁ’FÚ|³†¬ZÞN˜<+Ô9`¤õÔI8úøFzhžQ³)Æ0®#O 417³óX×°dÀd£›Zx!À•Ž_„’S˜â#!´9æofů¹YØèf4ꢀ‹Í Õ9" +[˜ÎqcL…q{žu!ãBK§”ª9<)ô¢<•x†Á.qøîg‹Ú#”Uâ°HV‚¥æ˜ Çìò¾N!yŠÎrˆ©;Ë žF´¯ÚÄä&C‘§µ›a¨²’]UC–4ãÌFꬱ²ÆÞô°Ós”Ùy†ÁD/ߨœQ’åÅÏÙxÌÁóm·îÁ½pLn6^2ßÒšhWM™b@Æ9=EyWdÌ€¶R%9Áç G‚á_ÄÄš=ð.r¨ÙFk6'øÊíêY/ÚÉñ„R§á ¾B㮛ІÚp_c÷²‚)Dç²z7àìx&†lÊáËÝ8CYŠæ <3­Q“CŸ§ál_1z‚Ö²3I§ÖfWM4’\.'çÙÊÐjWhÍ3‚Ì3Ù7ÃÌ£nÂlj±sŒ˜ç1Âkpâ2„`ð3Ãpœ§ðq¹ž‹,¯&‘}C–/£Áâõ-3ÏÀ:²!L­ãÕãŠá+%ÇI|:£´ « Õá™™€‹T©žp-ŽXqýxµÆßò{ÂÕÚƒ®ÃÌ-S]¼Ïþ·xlª?UÆùC,N@m°B|]ã_ô#wÖýÕ\‚¼íj½_¾óCUWÄÿ¾ÅqÌ&¶= ®qÓì£1y×nèyS}‹ëb‹óÛ¤Û”dÒ{,®+ŽôÊNØ•†X@ãD§—Ý«Š‚F‰ÁBö(eNllãd&1YÛL2`Ð[|[ŒâýWáeò&s²qŠ™¼‚'C«ÈKî0z*ƒ¦tE^ò ?ÏÃìvú˜{BÅ¡À‰m°`Çf¦P‘—ÜÈ9@\§e¶hTæe÷ˆ8t*GG‘—#ûâ~ÒÙâ¾Ú¢q…ý֟鬢2sXñiŒOd•”Mg‹ðÙôZ|†V‘Sëóµü!ß´ÅÖõòêŠøVtÞ“Lä5ƒE|ÓÙðÍÝ“Ê*qjl±=#;Ã=€sm½uаªHÞÚƒï •îqغ#´ÉœìÝkŽªçj›ÌÇnwèÌrL#c'– bž£Ô&íp$F9ZEN­Ûa3ÂÊßN&¶!ò˜§\[ùÈX€ÓÉÆ6N2'»ç˜òØï“ùʯi°Îjd•øt®áoìKe–6‘“Ì3]ø®÷m2'¯]”×ål“9Ù5ƯF]G‰¯ùZ.L®Žª`’ùtî±1QNQÊì‘d>vƒn+¦››¼“ÌÇÖ€sÐïf×*¶Îñ/¬u -@'‰kЮÓXŸÈIâ"[¤ïû–g'`1Œ¶Nkhì7•“À§1#}‚†¿|ÄäÔ.®ExgY㻕šE|g©Åøž4-€“ªÁݰIಎ Ñ>“ÄGÖ¸žÈIâ#‡¸n%ã¼ÓÂÓMßLâÒ×"º‘3‰‹lñÜÈ™ÄE–÷cóÀÆŽ/ƒÅ¬@&Š…i•eù3 ÈxWæ·$3[.ì?Ì0$ã5‰\é×ñͼ¥I¸P¸V)R"7HÐba÷N©Ê|3=vÚ¢åüú'`›l‡%ï|9l¡¡1©9‚n‡]$(5€ƒ _£*Ù%Z|¤,t ãªÈIÖçîkŒ,Ë~XÚÀ½‰MQà/4ÅŒk`y-~´`cްü…ÁÄ Ü”0Þ¼‚µ*cÕ1Ï9bVÕ8dsá£È°J¬ühSL4ŸcµšÅ lĨ\»­‚9¸Œ‰ò~ÉÁâE03 Èt¬ ™3ý¥õdŠ!Yffz7™¬ PA–„Xùç´Æ2–¯Ôz«',­ÁÛ¯ÎÐ÷kËÍ0#²«¢dèÈ1k@k_íæH-A”©3$I fűÃI`a°›b@– …µN²`p¸‰b@fRÀŠ^sÌ8`3-è°DÑY†‚ÁªÅÌ·'£Õ¶ÐZhjá`TÊ8ÊÙÀÕ6Å©AbGŽZ„²Æ ·ô”êMËn$&Ø8øËÝ$šzâ´î€èk.ñ‘9yKÌ ã*IÖLÍüÎîVj:2<㨱±=­Ç2Àò“Ù‚gšškX±.ÍîV¨5k:³Gœ)‡©3ɳT‡ãÅï„B®¦K,[(-CM—"`K—œQÂE…ưœF9dkºÔà¦×nväDƒ0aâº9ÇK•ƒAB”C´¦LXC'Ë8 ÕžqÀ¶l§Æ¦=GxšqÈÖ´ÉËÖ¼I9`[Æã´ÉŒ¶&=Z…æžbòÇç€)ÅQΈíª8;rÌ"Œ,®ÚnéSªîš÷¸ÂÓBÏcW€©“FÂÂ"œqÀ–ÊäÉɳ'å€miË ¸–:ùÊÏR§T~–:i˜-´´¥7Ê¡Öl…™:5èî—wɧµ‡ä€ØyP¾ö7Ø•‰Ö ‡e¨‰“32Ñ÷¤5oQçjôÁ¶v¸Å·Å‰Ó„B®¶æ8)–.nCëUa@3`€¶ö¼Åvâ ÕZî@!WÛòQå+ }DL4†´äX‘ò†>¸Œ‚µÇ´Å×úˆ%Nqè£Á<.o,¬…3ÙÚŠ{ÙÚŠ+lk}}™b@¶Æ×UˆJÞʺÜ.5²æv¹¨¼¢L)f ´ÝZ) }ÃoåhùaÔÂŽ´õPÅ Ùzkä+ÔxÆÛZo'ÛZoå€mí®Ë ¸Öz«å íaÍ·rÈÖ¡Wx¶&Ö³IÛˆ7 —ªl)@À¨5Øv7ØCQ¾C3µÝÊa jÛ=ŠGÜ©ÄM<hÀ0QÜ÷ôo7"û‡ðËø/•°µg—¯š~·¸Áާß#ìcÛÒ͇ê¯Õò÷Ç/çÛêm³YWËþ_ð©mñéw?îŸì‹Ó½ä|xº;œOß,Þ‚X-_.ü#NO?éç½~¸¼¼¿®úWB]ï#±|ÞŸ¯ÇÛ‡Ãe…ËpHµüÏCRëü-ïu&Ž¥Yþÿ4ÕR~Nùåðp¸½î¨Ÿ#WÃЦÀ“~2ªåùøñÞT¼ß?õ·êæÕïnªWíŠwå´X>7³ëåx´£6ÄVøoØããóÃIîÇÏfBþ‘]óxz¹…:Ñ ëÅòþh?ýåù— ÅOú)g«)ú”xf—ÕgKW·Ø³)[àp¬þìQÿût¥’8d…Êï¯xØøÙÄ¡|Ž'Z^¾»;=Ù—G“^ï½âqÿôt8++ÉßÓ¿ÄEïpJ8Ãþåæ.}N>œ—ëùx{Íîù~‘ï©Ê«Œ‘ÛÍÞ-÷ðÚ¦]àÆ!ŠœCÁ©)<ì/Ç\ø×õ¼¿ýN¡±ÊPþ_ûçýÓÇãþ‰uŽšá!`o p–ÓÃKô Á‡`ÄJ´â‡çýõöþ ÍŠM¬è ÎͰ=n‹Èˆÿß_Þ½YA[ìQFd“'†©3Íp œÖËoðÕõOñßÿŠÿþküW¿ÿOüÿp u˜û½˜—÷¦Y¤;\ñþø Ή?ù]j&A”‡*ÿÚ*âà%/{ÖG•Àù®Agþ’F?Øß-«ÃŠ>+w?¢Éxf»ü€×ǘH]އwopí92Fíñ­iZ,oáIÁG†¤0ÙŒý Õ“¢üJ¥bòGŠFÛŽxdùãü^âŽ\ª6æÏO¡mâçg+Íó‡©:ò;q?~}“/‡§~ƒ‘Rï>á’[ømÔ-Ô>ùÝþÍB[=,>&› )F»Ë«ìÇñ$sÎ{À‚Ágq´khËËóÃþr¿z8>¯(Æ›o?×òÕX9¼Áé›ÇÅ8£ø!k@F$±LÚíËás ËvÂb í°$>j÷?¯jÄÕ|TI*eIcj·âŠ –ZÅÆ¼A ’â»Ãu| ¶ /YÛäzóäOËq»"ßÇ2##”YÈH¤L) á0|BÙ£Q !Y ËSn$ÚÄœ$I£ø£Øv†èH´&øNµ‘vM”yúQõŽYÅ«^¡íWúö½U«…¦‡Y¡¦%#[ü“~|†šòïŸüE*>ÓÏ?ý"aâØjð‚³Ô5^£;>é“Pyù±+~Lm#:®µÖhDÈTýÑ+ò7ï2B E›£M¾ºJ¥çµbA~Èžò§woTó^À²û[:úe1 ƒS[3}…æD2s-IÔsçù­¸MhÉpçC¬¨X††—ý)+ ¶?#ÖçÇkBü ÂÇ}tM~><½ˆãà³æ¼ü‚PbÏ"ù*å/!Hò3ˆü‘BjhpAlnø‰Åú·Å+‰u‡}5ÞjÍãC¢U^‰R‹_ËÏ»ÐuÊ1šeUK„(íó1އ£l±e;„# ðYö×­0z{ÕÈÇ«åÍ]A;Ü~³J¥â‡ØùáÇØìáSòj†®÷ðKŒ™-O/Å)|Dn{Œý0¹ååz` Åzý«ë5Œ€…p˜´'íËo_y~¬ºÅÒ+ýù?Ž1}\£MÒï½@0ÆFˆ×Íßà¨)ìÇúBœÊ;×¾A(¿ù–Ïþçÿ\õü1 endstream endobj 5 0 obj 12099 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 595.276 841.89] /CropBox [175.3405 252.9492 420.959 451.1328] /BleedBox [0 0 595.276 841.89] /TrimBox [0 0 595.276 841.89] /ArtBox [0 0 595.276 841.89] /Annots 16 0 R >> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ExtGState << /Gs2 27 0 R /Gs3 28 0 R /Gs4 29 0 R /Gs1 30 0 R >> /Font << /F3.0 9 0 R /F5.0 15 0 R /F4.0 10 0 R /F2.0 8 0 R /F1.0 7 0 R >> /XObject << /Im2 13 0 R /Im1 11 0 R >> >> endobj 16 0 obj [ 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R ] endobj 13 0 obj << /Length 14 0 R /Type /XObject /Subtype /Image /Width 201 /Height 207 /ColorSpace 31 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xíÝŒµé}ÞõgœîjÁ–M¢àÈ!/»]²²eccË8`å-«,©+Gmm­ k¹lYbËŤØl´añÊ[W†FmCÒš®jêÆ”FiõŸDU«RªQ)UøS«…RhÕB)ÐT^>ç¹æüÞßÜÏsž9ï»»´sfF·F3gÎü9÷ó½¯ëúýîûœ™¦Sx{Í4õñ5Ó”ñÀ4Îã¡i2þ¾izí4½nš^?Mo˜¦¯¦¯›¦¯Ÿ¦o˜¦oœ¦7NÓ›¦é›§é[¦éáizdš¦Ç¦éÍÓô–izÛ4}Û4½}šÞ1MwMÓ»§é=ÓôÞy|û4ÿô~¼ošú¨Ûs·|‹ï5ü?Ê4üd?ßoñ»Þ:¿×o÷7|ëüÇø“üa·æ¿ÐéOõÓü—ûã=ÄÃ1<.Îð0 ×£6<ü SadZ¼Ï,å}æ-ïk2óAŸçáãS iñ†ÇX³‘É)´2™&v@ëW®f¸r•ÃÕªàоcšŒÛ‡Gî;6ß^˜c¬3¶º:`è*ÀÐÕC×X&d° ºLï0áýÓÅŹÂ7ôÇ•—hemšÃ%W8´,yk¿ëU¸rMqUbE^@jЍÂ韙&ãñy|ç4-G¾ä}îy{æÐ·# faÌO6ÆJĶ{SS°Ð+ÀJ¾^À–Ó^·\a˜.þéõˆòÁ’+ª­UÉ W.®\s«ù`çê³m¹îD x@Åí=Né‰iú®ýxÿ4õQ·»‘û3?ÄX2v߀y,±Èæ1]¾â«€™¨ŒòÇæP‘÷5·ù ¾úþâ%ºªŸ ­~f£»áªd™ÿ7î#®nù*zt¡q±êPá$ØéWÍãÓTã»ÛÇnÌ‚\¾+˜c¯,`—Gw°ûóÇšÞë@×¥he.ݰKVYá£s`~óÞ‹+b…+bu{¯T*DÁEœÇ÷LÓ¡‘;¸g+Ò`¶Á¤Í‹)§¿§g0çck À˜ã=ùc&ÍûKåk˜ÿúôªJUû»ë±äƒ¬¦¥du´ÔM ZVt—¬GWo›/¢«é²– ÞÞG)0€ªˆÂÒ¯žÇ¯9›Œùjîé[V²3?°“Çü®AÄ–€½u.]7ãòƒ?`&ÁxÃZý˜ðà}»?ºÚ%ºª‰ÖÒ M2´Ì|—," b-¹r•“ÒŸ˜@Bd*P§ŸMOÎã#gÓêÈWÝ-ìù.˜uÆÀb”°AÁ¾mߦð7_ ˜EdxÈ¡Ëʲ¾ °Cþº¼`Y³yßÍq¸ >=·þ êÁ.U«£5HV¥÷o/)pÉÞÑô*\ÉÞ%V(,}ïÙôÔ<>z6­Ž|ÕÝÒ‚Ù!Æ`ì—nööÖë€Qà‡tÀBWÉWÛ¯.Œ`5á>èâÐN=ÒB+Ó²tÃ É WïÚçöÎUÄ*JEy€QDaécgÓ¯›ÇÓgÓêÈWÝ-à!-˜-#‰Ü6"¶ .³ :`—Ê×vý¸-_Ks¬9èºêªu Z+k“ðhqQ„Þš$«[¡ W¹=zU\™x_d*DaéןMÏÌã_>›VG¾êniÁl`¬‹Ø°Ûû æÏ+ÀdÂŒêvùzt~tïÌãM‹9–?Ò®#åëHºN­ÌÕÐ2Ð2¥A‹švóÿX« ß=_µÔƒÏ>8pE¬ð¨B–>~6}bŸ<›VG¾ên†û#-˜ Œu£œsÝ `KÀÈl[ `4 ]0 Íœ¯ ]'‰V¹!º´H–Ù3“ÐJ€/Éâ#Iï®ÉÒe…¸âGÅt݉GÃñH0ƒ¥ålúþyüÀÙ”ñ©³É¨OóUw3Üßw-ó“KÄ*‰°AÁªŠ¬f¾ÀîÉ#_æÄ(ºL…/s”T ‹Ô0¥Æ¥Úu­ÐŠ­mÉŠºv¸Ò|\Ü+‚ӡŠ~p¿ál2>ÝFnñÞŠ7¤-ƒk‰X’Ø*` §``Çû£E®É—)*ùºoºN­¬¯¢) Z¦åÙÑ’²–’Åq±h®äŸèŒXœ(U  KŸ9›ŒgçñCgS¹1w@]aæÛ;cÝ(“Ä.Œ´ŒÆ¬XäëëÇÇôW·ÍñRºbÞ÷Hòh ZÝ M¸Ü›Â§¸:© É+üàÌép‰;W±?¨¤çæñÃg“ñüÅ‘s÷t˜­2VF™$¶,ݰT‘i´ZK‹?òôø#ºÊ‡x/dvùê•c7GKÒØëÖäÄ—t]C´LZ-sûè>À›ÿwîSV$+Vè:âJn—‚¢W.=®¨ wÃFA…¥ÏÎã…³éskÃí†û¸g‘Ì:c%bIb€Á`=áoø£µó¶ý°ã嫜ñ^éºVh‰¦&êZÝLD\a+IY±Âí¹„öp±";Àˆ@N/žMŸŸÇo:›–#_rŸ€×1ë:–<Ý$±°„ü'çHÚó§,Œ| þ8È×[[wÂÊZ]¾*ØCëžèºnhõ Å ̪ 7Ü,W3\¹Ê.wqÅÝ¢T K_8›þíyüæ³)ãGöäS_uÑÌÂDýÀ.b~Ѱ„ü ù“|Õ%+ëÓ{téÃHœ~×Ùô¥yüî³i¹ÝBÒ‚YgŒÆ(“Ä–€ýàöFE?¾¬äë#ûxoi òUé+½¯žíc޽¢]GÒ­Ð5×UW-®ÊZÝWÑ2o&ð±¹g ZÚYDïŸ/Šåï2‘,ÖC"b…äù¹¾ë\Ñ„*,}ùlú‰y|ålFnw‡ ‡´`†±Ò±2Ê0¿WÎ÷M„ÌŸùXüÑ_K¾(íR¾¬—'.ö¾Òº÷Ài—8’.²o…J­Æ²`ìtZáÊ{jœ ï‘ZPAËT”jå´ñ/7LÐên(º¸LOïÓ»K隺¸d„ž¸îô*b „*,ýÞ³é÷Íã'Ϧaävw0ÜiÁ cÈDÌÏgµô«öÜ0ÕħöüòÇ!ÞÅcè̱G¯ô%›£‚¥'3Xƒý°Ù/º‚G0ÃK[Àxq`Ûò•ÞWµ&–Ñë‰}Ù¸¤«jFÉv ‘þPè*[<¸*kù t=°¯+k- !h‘wsU塤abß­î†J0…¡”É*+$).=Â<"S!êOÝšþÓ‡wã?ûåFnôUxÁ¬+ó3Éà‘Ä3Àxqä `埛»¸KùúÄ¢ñu)]f£œ]2ƒ‰ZÒe&7è2ó'ðö2Ñ’.ÄŒt´´L~Ü0þ‡æ«V’åâê3|eÁ!BKpú3ÿèôsíÆþ– #7úª:w.Æ 0”&‰ €%äLÆ#›%_=ÞiŽÇÐ%&w….á]Ríú–¹q©-^´4^ºjUSËz´Ía¡u{HÚ© ¹á§ç$C¤¬HV¬Pn',| ¨ ? A fàô_¾uúùl7þìÛ/ŒÜè«Aia¬Ãg¹d– &Ôá`Àä+é ü‡Ìq5zñýÜE»ÌŒ´P;Aè"õèº5ÓU¡‹,C[<·KUk‰–¥g BK†7ß>£¥hÒÑJÐzzng•ªÈ’²"Y¬Ðåâƒá $P Tˆú¯Þ1ý×ÿÄnüùwŸ|êvÃ`Æ °ˆX\2€Å"“ÁüFÞƒ½•r)]ÒfÑu»m2V¤'õéE,«Å!Ï_7´ª_j~:ZOì3¼|k'Aë¹9´P}¤—æêLŽdQK†+r„äüÏ¿jú«Ø¿öÏ]¹ÑWC]g –`Éù ù~WùcäKú’÷º9]1Gá°º^â"ùõpº*Õ[PÑ.‘ t™Ççꆤ߇-®x«¿šµÕ‚Ö­}¿TYÝËÃdøÎû;\#m‘¸Üû¸”%Y$ÅÕ§3አTˆúëß3ý_½ÿÛ¯=ùÔí†;À,Œ­‹L!IF!ùï _8ÌqèK¢«rWèò¨Ñ¥„É>#ÿÜ©ã7«t=z±EŸj±7hé1ONwjä–ïÛ!· XYdBþ _KsèRbô²1tUî ]éw‰‘ÖŽîJoG<3¯,‘>¡+{@]BWõ"Vm‘p¡«Ûâ Z¤¾wL¯Uü™9Ãë Z/ÍûÂjø!3{\eq(‹Úð56G‹0³ƒ Kß?˜îô‘}õ"c]Á*ƒ¥ŠŒ?b¸ÒW̱¢×]_Ù;cèòXÐ¥—‚®ì=·§«"ý2tõ^DÙ¢ÊÚÂ,[0ªÍ•<¯;}oY« qP- !ª•~iÐRY°|Á<[Î/ÌWAGK9/½Pƒ¸¡JMì‰dÅ qÅϹ ~àô¯Mw~Ã~|zÿ[Ün¸ƒ»…±½ˆ`=€•|us¢×¥t¥#‘n*‹G—¦ º(3º¬#¡Ë£î¡ë-ù²Å·Ï½AÑ"‰kÈó'‰Öƒûíé ´ª_Jç ¾rZr¬rIü¨ Ÿ ¥SšÚÐEu\ÙHV¬pä*PÁéߘÇMw2ò©ÛCÚ`•ÁÀâ~KÒ—\'Û§¹sLôJ×K\æ.1ÚUt±xtdtY>lу­H_¡Ë*C—9é¶(Ï›®açÚ"Õ]l±òüµB+Ç,.ó°DKvU€›[KØZ~q¶/Ξ"h‰1.7t5…j—Øåf… 6;¤W´ˆ.*8=7Ýù7/·¾³5À*ƒ±WÄ–|•9†.`“Í®A»’êýå¡+½z‡v¡+íqº,®g.ö"zµXMÔCm®[û<ÕÑ*7ôÁ×ÌãY²×òôrŽ=t´h»¹JSKv}º•‡µK ¥èhéxëOê„Ç é†KìrËEÈïr…ä êßšÇ ¿ìN¹ÑWX‹K–EÎþùBt“¾47˜c^ÛtI†èª^½G.¹]\^èBW]lQ¤?d‹T½š¨„+¶x(ÏG¸®'ZœjÉ¢…V5µä îò0¾‚–Ú°ÜÐ%Žda`—Û'„à*J§Ï=tç7¾ne¸=°Á¬ë 6°ÈWÒW™c袖ʇû.]‘Үꦆ.]_Ú7ê+Ò[A ]ƒ-. ­W‹Ççù×µEKu­´âÕ×Ð-ªóÀ&¤«Ûµ`(:Zš“© ¹¡ËJ@"Y;+ƒà®¨~Ó×ÞùÂ?x>þ7ÞýØíA.Œ°n‘‘/öú}ç Š2GÑ ]‰^«t¥]ºÒMåãÙ ÑõåýáçŠô&[Lèzv^V¢¦ö [¬jñÉ}•pQø´¹*Ï;=2äy‰ ]Wýí!>´iˆT«ÐM¡•¦–¥šÎƒ©VF™&â¢$hѵ!7tY]bAè\²À@vèU¸ Tpú‘oÞßòìF>ö¾0 c¬ä ŸñÇÔÍÑoìÁ~ ËßÖ;ì]|¼š]Cè²pºØ"º¬¦T‹Ý —Ò&yÞ±Es¥êòüj#âú ¥ÓRYk@«ú¥ÐJçGˆ"ÊCË\–[\©tJE踡 ´KY$ d§¸ TpúmîÆ¿ûæó‘O ³0ÀXdä Ÿèjêǽ9VôÚ «÷»j'(»Ø=ÒWèòèºz/"¶H¸,1 ©ëí_Ö2»?ÉóˆkˆÖ£s±Lµ¤PªNÞ¡eÞª©ez­bºÄëB$Ã'h)ÊÊ ¡]Ê"Y` ;ô'€ Tˆúñ·íÆïøÇÏG>u{g,€±ÈòÇ$ü¤¯½9VôJÙ¸Ô®l]iGø›ÓŽè‘>¶˜ÐuÈ#\e‹.¶áJžp™À÷î·­Mié ^[´ÄƒU´,Øê<(¿27K­}†ÝZjCn(Zß•,0â*P!êß{×n¼ôOž|êöÎW嫊ÇÃt%Õ“ÐêwùóÐUÍ®!Ò ]9:èAQc®T‹e‹´ºlQ&•½Åäy P(ýî‹§¹J¸Ø¢â¨:¨'Öë÷OBŒ!Þšwê=üŽ–¹úð¾_š¦–ºÉ„+Õ­ñÊð Z冻_’Ev„vœà*P!êw½o7þý_±ùØ{·c,R‹EvùêÙ¾¢×'Îw©ei×’®ÞìJÁ¸ºº-öjQÈüá}Õ*+áÊ‘›—6W„‹à§QÂeVK¸®Zoš+†ØÑzb^†AKº€–¹•lM¸u-ú *l…ÅØ’´ÔþjÃ*â$"òÉÑ‹«õå3ñ¿òüŸ³Œ‚`%_=Û÷`]þ¼jG$Ò/CWõ"WÙ¢u$¤Z,áŠ-f÷çé90$ÏG¸äySdz±XԮ댖ÙÈÞtvyÒŠ7ŸÏ·ÎCÊÃdx^#h©ýeés7”ˆ¤,’… '+Áé?øÀ8ÜÌ–€ùöÈõã­›t ©žv Í®!te(®n‹êß²EMTy>MT3PyžpUžêây¥â†pÝ eéA‹ÔCË -´ÒyHyèÒh–VÐâGçnX’… \q:z®þÃï¹cüä‡.ŒÜ¹%`%_iPT嘾ÄB»Ðõ‹=ïÕkÞöfWEú„®U[Ì[$\|_µH¥K¸b‹Ï^ìÏß«p]´òL±Á»jAËÔAëÓs”µ~¡õåùyZCJ-þÂk´’\G×tç†RO^"YâS¸BN ú©ÜùOÝ>5›;`=€ÅºD¯4%.æ®%]=ÒWèJÕC ½ê‘ª r5Qåy·çù.\ÉóiDD¸äùK×µEK9´¨ºYÊ"ñÿÌÜšNS+>¢Ô¢Ô AË5ݵ³¸¡‹N^"Y¬^<ê§ÝãýK»‘½[ëtÅïÉW̱«Ú¥vðÛ÷ÝTœ§ÙÕ#}…®ôQûÑ'-zÕ¢$©Zd‹]¸,+UÌ!áúؾƒzi⺆h麈ñAK³Šk°¡å˜–•. »F®—ýó ¥[7€ x°9À 'Dý‘OÜFa¶¬ÒWºÇÑ%ò c…®m[¬&j„‹-ê´¬ —µ¦´Y —׆péq]õ·K7zÒ|è†-2´”Ì-[f&ðÙy»Zij¥ó ®ÆÒˆ4:Z» ¥6dR<óJz'YWì_½ó3Ÿº0ÜØ¢c¬ËWÌqƒ.ç¸4Ÿ{˜¿¶h½s®M…½0ª^heQÞÐíÑùIS+K~w†q%Zm7Œd±¹è~BÔñÛïô‘1Ö+s\jWõ»Ò«/ºzèºh‹ªŒªs–¾Ž:ËóC~è –p ÍùÚU<æ« ÑÃü £õÐþߊ½aÿºm鯧ù-§AVÑúÂe -M-1XçAñu^ÚváJòOjC’¥0”²H9 Wˆúùß¹öK»‘½w;Àº|c‚}èJªO»]„‘v¥•šÐµi‹ý\DÚ\yŠÙЈ¨ÅCÝ.­8m»`*{‡NÚðDSš0ƒVTK¯æãûcÐÊ.êɺNSËÚ×5:/9‘‹› Å ‘‰HVç Qî÷ÜÅXt `]»Ñ%È….ÇW麘çÑåxFÚ\Éó ]ž¯FDm,F¸–¥â†pÕI›tæŸÜÎBÜ 5 õüþT¼ D!D%%œ¸"B‹+u^Êð:Zæô„¶pÃH–EŽ¢WáêÏÿÞ;}„´ˆXÉWE¯Á›n*ºØî2t-m±µ¹j÷g[¸†R1Íùá8„’yÙ>Uõä—.D…y[å‰W-ÿÐÚR¦B¼'CŒjü eÍf—'h±ÕÖyç>$ÃÓWÜÕç†ìLÊŠdq=!ê~jÁÌW·éRi’AĆ.ÂØC¤W…+m®ùy@Ùý9$\•¸z©˜æ¼VÞ¥íÓêB<½x6YêÄxâ5Aëëæ—_>”µ,º%Z2­Ù¶-¢Ó¨xg+®”*lר¬ 6$8RV$ 6áê¿ýé;ÆÿGÎG>Å›¯¢‹-F»Ð…Xtùù=t•-¦Z\ ×'wûPÕŸO#bU¸ªT´|Âöú)Aµá‰ÙR´OÔ;­WÕ‰×-êÍ¡eŠx£Zª!Ç4¥ -[$é—²˜ÝîaÊÃdxVEX` ¾&>E²ð¨¾ú3wj„1·¯ÒU¹+tqØÐå燮²Åeµ¸hsU#b)\Ë—åÓO •#‚KO4]剷êz§'ð6¢§ç/ ñjAËlBËB¶Ë´,|Eý®ó`‡%å¡ðê´â†âS¬°¸ú‹?{§˜ €ug ]é¦VÁ8Øâ¡j±tíóü¶pUs^×ÎcìÂ¥QlY)_Ú W=…_Z°fK‘'.ëÄ´ ªwzƒVGˤEµjoZ…îØ€V¼Ñ-'uØò0>A+nH²˜]çêøwú€YD `‘¯îŒéH¤›Z¶˜ÐUÂ5T‹ÝtP#\½ÇE¸jWQkeµ ¡Š©0ùÅö|ŸŠ[Ýk?1-ˆ´´”B9Q£VÒðéhíú¥AKçA–N†OÛ!nH‚˜lðƒ"Pýå?}a¸%"ùèª~º–¶8T‹«m®œsž…«WJÅÞœ¯]E‚¼ìBäˆ`óƒ'~fó DZ’ü ¼½R†Há©V¡%r@K ¥žÒrivýRgˆƒÎƒò0>A‹—Å ÑÒ¹ú+?w§ÀŠ®Jõ½±´EÂ…®T‹s5ÏwáÚ—ŠiÎç°MvsJpäÕ0?xâom/k×½S{˸uƒÕRàä9…–˜­ìMCën+Þ™©Æî!ÑH†—·aÀËÊ 1½ÕÿòóF0X§«R½Ÿº€:Ø"Û]ÍóC#¢'®}+ÍùÕö©‡V'mæ{g>ž8Ô‰=némùÚñá‰'ðöòU«Ð"õŸ›_{ª£%ñ­]+~@KÆ–·aÀËÊ YxÂÕ_ûswú@Ú’®Ø"íJ¤-¦Z¶¸ls-…k8±?ƒJl ×jÂC«#‚õ¤ŒÞસO¼§¸uhyEWõ¶Þ2Ý®WÑb TKeþïîò¤_*<󣔇ЂAwCŠT\ýõ_¸ÓÌ¢cîí*[¤]‰ô%\~,=¬<©p =®ýÔÞ>­0Œ'ö¸ÅûÓ1¬Á¾U­uS§ êiû7huC,Õ²Z¡•52IÐÚíòT¿TçA'ÓåvéƒÙà#YøAQ ú_ÿÂŒ|:ÐåþEWBWl±ªÅA¸%®á(W;‘.ÄækK1ž˜'YwO܈[}«zµ»•$Úh9 ˜óZ«ª•ÿs±VŽ=@ë|—'hé—->åÒ‹F ZÐ*ÉRˆú›éNFºJ¸B×Ò‡6WuP—¥âò°Mo^„ù¡3OÌùÀŽVB,ã–À¸¥½ÜOAô$ƒVÐÊk‰ˆñy¢©#þT+烖½ihívy¨H“¦–K´(L‚ýas%YX*®ê7¢nIW:]G ÁìÍùCaþ^<1½Ó:Q-ˆ·¾°ïnUãt#Éߨր–¤ZhÙþ€VŽ=Œhijñ&J’òZd§Ü0’§¿õ?]%_]e‹©+Ï—p ‰k£ ÑÃüW³©Mu¢Gª‰7´å{ܪòsós?Õ^ÊÆ&ìpâ­Ž–ŽMÐúÒ¬ZÐÊa-í =íó Di9ýRh¥ó ¦“Àƒ›£HÑ«põþÕ;ùt «ÛâªpU©¨^@rJE¿z)\½3¯ qч:1›s‚KÜJïT¯<±?Ó§?£6+É;çV=y[fÕ¸AëÞÐr½‚–~©F´Òy€V­ŽV úÛãœ.Ÿ ]K[\ W•ŠÕãòë ­.©oèÌ÷§üÌž˜Ýê¡wZGO·ãVm&ól&ê*'ÉW‘Xh©µk»ç­ õô¬í]µr0žjå°Ö¹jA+»<- ¤<”á-f+¨ú(ùèª&ê \Õãªæ|ó«ù~¶9uâ¢wz¨1Ä­Õ$ŸWIª"1§kž™{ÎCÿá­#ÑR¼ïŽ=ؤsí²ËCµª©­ÊðqÃâêïüïw2ÂX„+Úµš¸R*V«w!üº.\Ýs¶¹<±ŽÙ\<Q-ˆ·jÇg@+I>EâÛ«$ EâиQ-O»èbW-OB”µLlÆS-bDK–V¼,¤ó ~­¸!r‚Vqµ¤« W%®ô¸–a~Õ;Zå‰ö7«wzYÜZv·z’¯"Ñl@ëÇæ}Љé?ØKÿ!ª5ônTk©Z-»·[h)ÜÒÔƒ°T~@ë—þö£èê¶Ø…+‹ž¸Q'ZéVÜÊ©æOì:'Úò·ª»UIþÒ"1héÉ«t‰é?Tk+çäŸlÇMoЂ– 9¤ZÐʉ²½iª´ªó­­’¬@Uï;]=ÏKh®„ù¥'ub6}*É÷ýÄÞ–¯36sܪŸ:±‘äsž9=yª•"1ý‡ ¥ÿ@µôêLàjÕóË·ÑÊÁxëýü°VС³ËCµŽG+Ú•‚±£ÅFyb¯uþWãVG+q«º[ûŸߪ'‘IòuÀ†,*k»§úÙILk+hõ®éj½uþÏï÷ƒVkQ­B+­x:ÓËCªE "VÿÏ/ÝÉȧKá*O\Ö‰½wzLÜê;>“|¡%4ÖXö©¡Õ“|µ¶ò„ý¯ì3ÿøÜL®Mê¡kJöÓ5­ç_Üâª!jæ$Æ3Ä ª5 EF´”‡ ZA«¸è„‹jʼn[‡ŠÄÄ­*Å­:8°©}ꎖ$ŸóÌ9XEb?¸5´¶Ò5 ZZ[TK×´ÐÒ5ýàüd–´ŽAëü9²VÐʉ†Xh¥_  …œU´vÈÅ­:!nåŒMЪ¸µº™8‰ѲiåÐì¥ý‡¨–ƒÜ_Þ?cèš~f>Z´tM‡½ž´î-9y@«Zñ‡Ðº3¿•p•'®Æ­$¿Ñ8zòZzòóˆ_Ü ¬£ò‡TËY5g«kúÒÅg÷¼07äoÐzÃ4mªy%Ѫ¦VW­på}¡5Wßôéç54zãô˜"±ú—¡U·†ã¦Q-çr’¹ïõ- ùl#Þ¨Ö1âµ.b©V¨‰j¡¢£…Ÿ°Th…® ó=n I~hœ*‡žü¡íž£ÑÒð lRGµòúHÕÚêGknÐÊæáó1Gï_µ¡•¦Ö!´VãÖ+…–ížþryÆ¢k*ku´V»¦1ľ×ÓUË^O¶³C]‡ú¹š›¬uúhim]<ÿðrÐò$;C}ƒÖ«’µ®ŠjÝ õ2ôÐ3zŽ4D§Œ´eÑÏÎdö_ŬõªbÏZò C¬ qÛ{Öò|L͇!Æßâ«‹VõµªùpãÛ˸½ ©ø{è[ÿî¨Ö­Õ¾VUˆ¯vóaûðÃe͇ü³•êÆWŒ¿©_N…¸4Ä:¯uÔFO©Ö*ZˆÊ[¡U-SµäòÔÖÐ2]vãsH¾ºñv3ór”­Ã-Ó: Ø›}±÷µnZ¦¯¸jÝZ9ùíéÿß6zéY}ò…æÃò4à+ºÑóùýK›ön¼°Ú[¦žŠxo×Ðr^kØžÖ¡ºíiß•=ÄCÛÓýYc÷º=½8Ãü nO×óÅ:Z7ÛÓu¨fÛïž2޲¤á( <@ÂãúQÀø ÷Õ‡gˆ«­xG¶´†C5vÃýÆChmÕôg^ä¼V|¸9TÓõöUU­»håi/ç”)º®66=•ZË£€‡vy ­Oê©S¦Tëæ(`çgããW-GG*kåÉbŸvÕÊÓ.r6>ªÅ³C ¤ˆÕ!É ZqC»ÞQÀœ2Ý@k¹Ë³ï—R­B«`^!°žåzs€9¼½|´òši™ÞZy²XG«Z[å‰E—"YGº¡ÂÓOîOEŒ.ÑNÔP­áØÃÍÓ.6„ióK¯Zyb>CtŒüüÉbyŠ+ëÉS\;Z/ábÕ —ÍR„w´Žx¦X2¼ô¸úœ‹Õ~im ǼÄÖÍó·O>XkõúZžd'k™Ì U/‚tð•j •Wª Z‰[Z®¨V¹êÏ@ôCê©Ó½6ì§â»d-ûðG­”‡OBÜxÎ…5/\<¬å‰ù7/'²ü=ùo-{ú«hm½¾ÖòEJ¸Š® ½ê›;ÜðdA‹.Ï-¯¢ÕŸ&¶x.OZuæZ´n^éP–¿¿¬å_mv´< ØÎEGKš½äUkô$ yjÓã–®B„ N5Ü2puH²RMøemØÝP†_v´öÿ jõ%¾o^ºíQuû+‹–§Ÿ3DO.´òZ¦ÖþùËäj¹¦õ‚“õ²ÐÒN'®Ðœê}«¡Ÿ”Éò“«u¨ ßw¥»®u´† µú Ä:óà¤ÖOÌS!ÃÿX{-‘Ïî_ðáSó!·C/_WçJðê¡å‰ Z.ÊÝW`†V^&·özˆL½Ä`R'¢¨Ó•O݇ôŽÉ¼ÎC:ðKɺ4À¯¶.>GL\ŒªJ-‡{ÐÊ!ÀÕò°^¦&h /øà_ׯÛ+Ž–§ÝQ-ëZõºñ;´Ôòžðî:ÖSµ1Å!"Cmà¡.;A <(Šv*ï;Wƒú^\­JÖrß°¿hÛp²4ÏÇ'Y‹¶CžÙZgi*hú‡õ”üÕ'\䘇תgåŸðfôˆµj…½0$kõ…†ŸWl{%þ‘ ´*hõרé'µV;7ÿ£§ÿ«Mb¡å5 %u¬üg1h9üP{=U$&n•p±ÅМ ª«jd•F²àš^Ö1’•NiíÆ /aÚ_çáR7¬sË=hiú=\†¿A«£%6t´Ì-´¼£g¬³×e÷ÿIWQˆA«^:Þþ•¸Å×"\Ì.ta©†[Œø ½rÏŠXu~&’U/ï0†=eÕ)š+­W=Š^ü?qÃzM­^rÃájòôChqÃ-‹qÈðõÊÞ&öÞ^¾!zÝžÍÿ{z@ËÁ’{þW›¢x„‹-†®àTP \UÄJUˆ«j8¬žsX}]š´³òÔ°Ë|:¥9þwä¿Ú´â†Ë>ü3óFƲ<¼ùW›KÕÒ´‘W¹ÕÊÿžvüòî?Îÿž¶˜ÿ¥"Që?$É£|-ÂE”B–j¸Å(½rÏê6ôFÖ`…Cû}h“ÖIøz5­ö\éþ2€Ù7¤ÀC§´Îh­¶†ŽÖssc¹^Vk5h)oÐТó…–ú(hYÚ’‰šýî¹ÏMk‹=¹î< ñD¾ábv¡+8u¨âƒW½*Ì‘¿²B¯"ÞÓûòtV=›u/Y^ò(/Ô¶ñŸëIJ-éáÿ§xì冞ð[»ÒÇ­þ·æL“ñà4ùÿ=÷¤ q@Ë L9(®íc™ç ©Z~÷ æ´¶R$Jò`ÐÝ‚G [ ]ËðiAuˆ«ôÞ+\}æNmÖË–¦0\“¬Õß÷ ‡§KkÂiÿÒ¸K74K«/¼ÜƒÖíHZí°Vš«h}ý4}ã4-·§évÐòD'/·bÒ,L¹B“ÐôhéfŸïõ¤kªÿàL‹ëîÅÀ_‹p]¬ òi â›î†C÷ä²Ûí²Âô>†íya%YÃIø: 5øþ2€¶º¤‚CnØÏÒ¬­ï¸Ak-SÍ)òúÞj+Ýì» yõ~ŠDV•¸O,áb‹(*Àòñ6W=bÁWÝ WÏÏlJVEÜüKÏ¡^oyù\i-—rßäµÚìÚnh%®-m ö}W­ÕòpiˆÛªe{"ª%FµÌ*Õ*´òëηÓ5ží°HÔ’|âV<‘þ¢Ø"iXn9¤WÅÕ±zïÝîÒÐpXHVžVg•ë9øW=‡z•¶á©a½ÉjÃî†O_|Z«Zú]Ó-nè‰xWýíGË+’}ál‚–Yÿ¸MÉÿ­Ëõn¯§Z[ÒŽDͪhK<±„+t±¼°Tïc‚Kô=º“A?³"Öp”´?m§÷²öí÷z掵°LY«’ÕŸ¿3x³ñâ\ÝTm¸í†O7¼A+Y+ª¥ûGµ -3ìpxþÛ¦p’½jpþ ô\b2"Éc Ô—R‘-†.Á)ÃÇ*wË1¿ ®*b­V…‘¬–ÞK²òÂuÎáÉêO²¨@°tà ð‘¬á¿‰•ÚŸ½êoªåì!¾~š¼L(‹BË$hi;ó‚B+‡ uÞOk+E¢$/Åoa'€ ] c5Üb¤/Z\ù.±ø DÝ«ÛPë2+Ìk,“¬ü#žÚŒÞNYyòNÿÇš/µÏ /•¬µ¯YnøÞ«Ö¢<´=]â¥hyøTK†jZd?h©¾7óÐÊ^:ËU;ï?p¢$yq«<±„+tA(,QTTnƒ«j¼÷ˆ•íµôî‹F²,½¸~4+…ájÊ:R²,½z•øM%Yy‘ÒrÃ÷œ(ZšZÆ6ZBËó›:ZŸŸŸ­ÙÒ¬NC>]Ó]ÿÁQ(»*¶W·0@d¨ á¢?±ÅÐE¾úpc‰Õ1\Uã}õPÖÅÿîT=Òù³–í÷agg,ñ²÷Žð^6ÒÔ†ÜðÝ×-µŒ9 ZÏÌ@ÿ‹ Zú„9Ãì\M¶•í®”«¶ë?(íª$n•'&Ì.BÎ(w…¥"Ê-IV%VhT >½ W~~qU{:· Ë k['’Å ùøð_xÒËê…á=I–M|µüujC’•ÚК}×颥ŒjZ´½Ð’. %rä\}‹]ÙžÖÖy‘H1¸’ž¼„„yÂ…“Nú€\«â*õ`òÕ*W~QçêâvaÒ{žX‘WWî=ÒÚ1¬ö{=Ù°†÷!YnOh;¡ÚdqCOó¼êo«1>»<÷Š– ²Ú‰hå iv¨³×ã¨Ï‹Äl÷¤»¥|ÓæBƒ.ÎHš¢`EÔªXUŸAf[rU:Dò@ÄêV¸Lï9äÃj¿«|k3Ú vv†Göjs§xn(o\õ·—%7?T«ÐÒy†–ZÙëÑ×5UÂß-‰JÜÒ‚ˆ'ƒì„®hWÃX ·¯ÄŠÊ¹¿ï‚å6W96S]¬¶ -û ¬žÞÓ#Í?IÑ “­”Ú1ì…áñ)«x)ËNÙ YÜðíW¬â=©VÐòo ¥üq4Zöúí }eßwQÒÚb4ê¯ó$Ÿ¸O,áÒã*ºBQ¹JV«âŠîé3ô|UzU\ŽXÕÈ*+¬Ã3é‘ZÙÖÉ!‡’,Ëg)YjdÒýÙ³I½lB´û–mÒeÏÁ掔E²¸á·]W´Þ2+¶H kZz€Aë…ý‘-sž†<qäa‚pžäµ¾õ*u·x"Wý ]‰9Á)D%®P1Áp…ÏôäöK¹ÚŸOfÐideOG­Q¬²Â¡áPÏ4T[>Õ~¿tggØ4\í9,nø¶k‰Ö£ÓTh‰Ð2ET+h9hjµ ?H¶iȧµ•"QNÞ%y/>É•8I)á";8A-*À0V#PùR‰U…«Î“Mn^õÂöT!b UáÒ “Þ«á kG²xW9ú¾j…Z(¬°Ò{5J²räOzÿ|{Áa3º§¬ Éâ†ïU»Õ²²"ÕA;Z&óù¹>⺦–vZ[<…¿$É3 ]ÜÒÝâ‰%\¨`gl0èËÉ×0ܘ¸^PE¬Ò¼Âg¶žÓgH=¸ÆUE÷±ªAJ]Ë E,n~(½G²¤JV¿e¹c¨ý¾‘²ºd¥M*e™Xnøæ«Ö}Åø%ZÊ-m@ý@heÑ*N×TâUU¥HÔ”“Å­»žèÒG¸PAvBg `a,8ùØXB±J¸"€›\õîèÀU¤áJÑÑ«Ân…uÞ¯§÷’¬JïÏ.ž¶óѶ³S…¡6iÎ9X§IY‘¬Ç® Z_×N™Zj j-jïx›j¨£¥ç£ÿÀJ‰IòÄAÜž]å'êÊBI\ð]´ˆ|,ŒÁ)DùÔíQ*v±b‚ÙÔ¿òÓgÈVÎÞ/åJ¡Q«ötºz,±ÂôN´mIÈœ$+;†Ï\l¿½¬eÊ"YßzƒÖ|t ZJi«ZæS|•7„†¼K`™k±:@äqëÜÕ‰Â|„‹ÚÀ#ta9 K> T¾j,ŪBûq\å8ÖÐÅÒ«nC¤ÙÓIU˜FV¥wV(Rz¤±Â’¬j8Ÿy¦¡ÉQéÐö¼ždïe9šU’Å ¥,’uÝÐú¦iú–i¢Z–•HÕÒFv<2hå\5k’Ó5MÿAúM’¯¸ÅŒÎ=‘¤Ð0P›¢KîBNÃXFUP¥,±b¬)³“¾èü4 UCÏW¹s%öè®ñžnCE¬¡*,+T—é½$+ ‡§Îv•N^-¤Ÿ&í’Å †‘,“|Õß.ñ¯›ÏkÅ;ZæZù‡æªÎÕ8ê&f|nß5Mÿ¡’Œ+¿%[9ÉíK½ZF÷j¼§Ûˆ•iU…e…}»ÐcWÈX_±ÂÞ#d™«ïºxÈÁ Õ#í’e†¾Nh}Ã4EµVѲ³˜†|Z[µþƒ$埸%'3 Ô‰ÂüN¸0[,ºrưœ|êöUOìøl&(´‡+¿¥N5lsÕ£û¡ˆå¥Aºj…‡Ò;É’Þ¿{q.Kʪ†CRÉÂÕ­ÓEëÁý¡šR­U´tcrд£ezYƒµlòõ„Þ$ùŠ[ñDWY˜ß —R1¶HsB—ÔDŽÆÂR>L%VIh«@…Ï‹&Xýöê3ÔÙÑä«®W¸ÊF¡’°ö sl&÷D,µ‰ˆµj…•Þ5a*½[qIïËé{[áR–•‹+™öª¿ÊZÛh)a˭в$U@OÏFÀÒP:YàŠD…•$ì’‰1ZFj|žè*‹Ó$e×>-ҜЅr„ŸåˆLTî_É Ÿ Ìþ`ÂJ=xˆ«* •´‰îéb^\¥ñžˆµ¬ »ª”‡ô¾l8 =ÒA²¾ùªƒ5ÿýE××Ì/ÝöÀ|zùx´nïw¨ŸÜwM…ØçæþƒˆëBT’'â±D<ÑUŽp Bç¶HsЩ‰ê#7&S¹[ÄÊw*|ί\±Š ¦ì[Ï\ÑÕèUqÕ»XØÃIÄú‘ý‰,©Ò:ÂUY!É’9sŽÔr[Mï½á0¤¬[³d½é¤Ñzh~FÏ`ˆVÅ.Õ"éA+{=Û·¶Ò0ÿ¼Ãb€·Äc¾£NüêwÜ. œÛ"ÍÁ _ ` E}¸%2屿U%vJH¬zhír¤ûÕK¤W«œ™ÁUî=b© Óm`ý,®ª*¬p™Þ{Ã!Û:]²X¡IkOàm©Z®%ZoœõÃ3Z²ºZ*è'æmD‰Z&6ýËY#ÑÿÒœä9‹j+ž¨Ntq©G„ `@×N»(Z °0V¢Ö âªƒXÅ+\e'ývíµlå$_-¹ª’0ÝQW–‰ô8tèógf®R²Â÷Ͻå¡á`«á Gš”…+’eªOàí>Ð2AK´Ô>”_'ý³­HL’—{·t·tŠx¢ž¤‹[Â…"s.òÀ06ŒÈ”;Ìö‡Æ@•öªXÕy†p•~»¿¡¸ªÜÎéÕ’+W‰îCãÊ–Õ ]µB «ïñýv¡õx¨á@²pE²nЂyOC¾Z[ú ‚Sh$&ÉËÀéniAĉF„‹O B®]ªW3"Ç€P¹qî*¬BUÉ*b¬p%ãWé‹úc±ªAª±¾RÆ ‡Þû¥é=’õ' Y­kZ1~iˆ_;Mš–¹fˆTK<´L©ÊH·0E¢4Â>*nQƒx¢_˜pñ)¶ˆ.Tй‹þ°6€gg‘0›G>u{É¡sÿ(•o/L²ŠX W·«ìãÏm®ªÕðÅvf†¿¸?ŽÕ#V¤¸ L“óžNªÂCVx(½“,\™íxÛ0DOêIŒ‡Ö×ÏhYS·Z„½òZ[™ûJ¤‰ŸÛÇ­t·´ x¢L¶aF.—`ˆvÉ]hÁ ÀÂÌúp£¯.¡J/ÔÏI{±ƒX ájàJ•! &·ËW‡¸êÑý3‹ˆµ¬ Ë oÏ+\í‘Vz·~¡e¶OàíR´^?MZîU+h¥kj‘>9Ý¢¬ìaQKò*)ÑWV‰'º‚ZFj±{")ètÑ€EÁBQ½G]—©A©@U8ˆ•Â!bå÷&´gŠ¢}àêËséáo.½J«aàŠ2‹îýØ +´¸zƒÔžŽ´€+±ù+ú?¤÷HÖuCË£ŽjA«¶ÍXG‹#¤H´¨%ùÄ-×(-Ê *»¬.Wœ-vºd$úÃÚƆáöån„Îý£T *üêÜ^H²*±êáêWÊâ*¹]V¸zn. ®Xá2bi…Ϭ4H+Ä•ó'ðv¼jB˪´<µ¶,X3¬Jk%ùž›?.ˤ~g4ª ¥wS+¥Ó ¼mâkç‡éñ ZoWbÐz|>‰”"‘ApŠŠ[.+Åbx\ÂE@\tW¿è’»ØTŒ-‡Û¢|—LÎRªô¬â€µÝÜ+Áe¸*®¬U­ê£¸Rê.}°s%aW¢»l°ÁÕªJY•ÞO-Œéš>Ðþ%A©–u-ŸjU×ZoßcN‘hÙšç$y]DÝ­´ ≠ó%\®µ<ßéÂH B‚ÂX0CZÔɧ¥QîVP%Si,Tq@Íÿ8`%öÞ¹Lkw®”·Êâ*}†¥^y¼ÕuWVÙí—g…$K;ñÞJµ‚VèzpþoÛh¥!/Eè?˜L#I¾Ç­gçD<‘p ó.—X7Iœvõ‹.¹+æÀÂÌjN%SÛP%®WÛjC¬z¸Rzt®,ÎUêAùŠÞWýxí}U¸LïqÃkˆé.Õ2Wv+ -F iXÂæ5'Fή*¹W®u¾Ø _Å a£"–Ù¾¶hiÂZim½gŽ•äÙ„u-èJ&®NêÄ/ —«<Ð%wÁ$P!Aa ?!-§hT'Ê÷ÊTe*UC êÉj¨ùõ`‚i^QÝ+^oáôzðýû3"JyYJ¤‰î#®Ê -ÒpÕIY$K97bUCÐZf­R-“`B‚Ö#í@ jJ%ù!nYìñÄçæ*¾„‹QÞäºSÚÅù< °0Ìfø88•FQ¾—úù!K¨â€%V ºT¬º *u­þ®6¹W®Hz¸Ò,®4²Ò 5“ôj•«ë†Å6š™1?…VŠÄoŸ“|[剮”Üòü\Î'q¹¾l±è⌜ ð(À`Ãà R–‘O½_% ŸeQªUï±÷dµ«W„+í¾+ÓE¯:WfrÉU¬d]+Õ*´Ò5¥íB©t ­$ùŠ[º[<Ñ2'*¯äá.=®óüKsèŠv…®ÈWãn¤,£néUDù JƒCPu„7ýdÐ=YUçji‚OµbÐCûî¹ZÙðÁâÊäЫDwÓ…«Þx?$Yáê¡°Ãæ†l‘ìÿÕ¦‡Iœ-% £5‰ïœ“üûæ3ºæ\wKa|„¡ó]¸ô¸äù.¹ ãnHËȧ¾d,‰òdª¥Rª×—É ùbUM†p¥TáûvdËÛûþUµÜ·¹"øÛ+Vˆ«kŽ–ü  ö$_q+-ˆx¢$\Â¥_äÊÒ ®$ó]´‹3JõÀ 9Lãn(Êȧ¾d”FQ~B‚ºû ‚t êbªC‰}®èUqå‘Wï™ûÆÖzÅ -ÆD¬Cѽ[!®?WúKº€€ÑŸ0³ò©/îãžî¢À¨(!«ýªŠUŸÝoܨ)ʇd5T‚´·LЃ²jb‚¸J“Wø‘z®E¬n…fþTK¾ê£g­­Þ5…–P ­$y.Pq«<Ñb×b+.Ê×só6 )ºÀ@g"_CKÏr§(ß*DQBAŽá²¿*¿7Pu<$V½sU&X᪚W¸¢Ø|P*¨>Cåöîƒ\-­ÐÌ?põ ±såãU´,(1>hóê?<¼G«â–9¿=¯n—ÃzO˜ÿØÜÊvc‹œ¨Ó0 ¢£?TÈ€Ù0r»;1¾’)P‘©@Uö¥ T«øÌ~ï¦'««ÌÇ9ˆÕ`‚=´¿²\Å ¯!ZË"qˆ[²³°ºÙ‡Ðë®§æË§Tüäœç‰õp¹]÷ÏÍÑšÂ$z0´P¡è~úÈíÁ)Æ™*ïÛ€ê÷»ÌþŒÏ´÷^èGö{Í•¬±Š öpE¯Èµeõ–¹œylŸ”ÜŠ;F¯¬ÖA¯:W'¬ZZ"Õ2 Tk@ËBË”ò‹—;XÎÂ-O|bæK¸\G4¶8Ðs$8¡`hÁX0ÃO¹½pŠL1¾T5Âós¦êJ¨hf ª;9…=¨ðïïÕ¬VÅj®j'\‰ UòÁâj±Ì|ÆU·D&ØGâ-³´Q3VI¾Ç­÷Ìù–'º(ƒpIÈ܇-t!‘/P°0ÌVÃ-aÉ¥:Q40P©¨â§ç®Â*T²_ ÒyÕ‡÷OGÕŽ‹ö¶ÕªXYGÄÊ‚¢WV–°Äpe­]Ê•:p•ªÐBÎW.ÄUë\ùøR´z‘hž'6Ý-¡áz|î+ºRI\”!y~ KþA‚n@FÁƒ± eÔ-¾ºJ™ò£üÀ@õ©Ùþ¢TÉê~u J¬}s@ËÞúã{{!ɪ‹®Êq*óðr¸zè"WèºnhYqAK’¯ã¦6OT'.…‹ÑPºøQ´ëæfˆLF|ˆXtŒ”!ÍðA _rŸÒ¨å'*2¨hcÙ_ ªÆB ê±±Õíý†!Yu±Lðž¸ÚŽXáêz¢•"1h™Rk–)XÅ2m„«Â¼‹E Mò<º8éè½€À BÄ¢c¤lùRpBcå'”÷u¨<¿.P=ÕbUjÀC(.z—Š•5½Zš ¥'6˜(+Qа$øà‘\]´huvÍŒùIÜ2u‰[ƒ'Z׌£ —ÜBØâ@%ùø,,<+ò Æ‚x†áö©ÒÔà}~l‚:¨L*A{þ¿(V ò˜;¶XîO¬î‰«tJ¯puòh­‰ñÄŽ–õK¸ÄZÂår¸(V½µŸR1y>¡ëÉÙ£]èŠ|q®⃱`ž>r»;”ëaÒ7v™ò3£TPõXuÈ-@å ɪÄjÛK¯,Ém½*®®3Z¦ˆj-ÂÕ=Qšå‰®B.åÕãûª *t}h.Ê8#1áS0ˆ|I_IÃ Ì†áÆ°T8ù®hTåg*¿¢º 3ݪ*›XU5`w@\*ë%‰Ý܆ʄt4Q1ÁpõÚy7–þ§ä©qõšéÊ¿y}Dн·‚òØË…³dº EíÍä!ár]—+E¸\;ÊÀw¸Ï@Ÿ‚AFÁpÆ`ÒÀ–‘[¼w‡ ¢üÌ@¥p€qeª‚Ê_âïÕPr@Jµê€ùR®U™àËçê´Ñ ]K´Ì›94™A+§ i›>„Ë5r±Ê;]œÑwé©Jä+€‰F1Œe ­Fݪ|^ÆW2uÐ t±*Œ^YŒ í$ëžô*‹ýÊËÖaÕ*´:]& Zƒ'&Ì?Ú—Ëäb¡Ëåã8$b «Ì1€QYŒÁ,¤A(#·xËÛ ÊOFïg‘$•’^W**JKýU°÷ç* Ár8Òß4'‚*z¨ÌL7Á—ÃÕ ¨–¥‘5’÷݃[ìhòÄ[s%Î8Þ|1ϳÅ%]˜/=ÈÛŠ‚uÆ`Ò Šr cyƒF ÞççoCµ«ŽqÀ ±Z†«ãóU¿'¦ZZèÂÕZ–g<Ñ 'ÌwáªÒ]l]1ÇXg,F ˜Œ QªÝ'8Á2í©¨{²¿[k‡÷<È’1¶cÕ1hmÖ|Ö¯Y[ѹñ4ôªÅðHkL‹‘5˜õxH¸BWl±B×#{ízó~‡Qô‹E–Ž¡%j†œaäK§®QQ~ÑF¦zx-«[‡ :F¬J©|yËûšÌ|0Lõði]‘“ù`x€>­ è ZKá²ÀÑåê,éztNõ¡K°wÅÀPÁÂ0V˜aæÐÈÝÜßNïÜw¨@Û‰z˾úûÖÔ^@åög*!J±zeД.ç¹nY²ôÿ}—i endstream endobj 14 0 obj 21298 endobj 11 0 obj << /Length 12 0 R /Type /XObject /Subtype /Image /Width 1 /Height 400 /ColorSpace 31 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x ŒtÇñïãm'7ÅPÌ[^ʘ·ˆIÜ$;/ÙU7ÅFIº‘!Cu“ìÊÍ;Å( ÙU7o»êf ÙÑM²+1"że‡¿ç÷|öªÄªà«C˜¾&ÔŠ™àkñøºP/6ÿ04ŒÀ7†&±øæÐ"¶ßmÀ·…v±=øÐ)vߺÆnà»CØüÓÐ;fïÏÄgÁ÷ƒìØü@x.ŸÏÇÁçÂø’á‡Ãâpȯ£ãÃ5ÆÅ× ?Þ˜ß0ü›F^œdøÉÆ”8ÕðÓŒ·ã ÃÏ2Þ‰³ ?ǘçþ=ヘoøƇñ#Ã/2 âdž_lÆ%†_j,+ ¿ÊX?5üZc]\oø Æq£á7_Å-†ÿÚØ‹ªà¿©Æw5´8C·?ÀŽLÝU[w?DI]ý¾žþØ€ÒGtO#ÝÛ˜}Mus=ЂŸZé¡Ç´¬ ‡ÛéÏíµ¼#G;ë/]ô×'9Þ]+zèo=9ÑKOfé©>œî«gúéÙlÎ ÐóƒôïÁ\ÈÑ‹/è¥\.Ñ_֫ø6\¯Ô›£øŒÞ«•¯rg¼Þ› i")/N"ù)¤©q:ÉÏ ÍŠï’üÒÜ8Ÿäß'åWÓº0SÕIõõ“†ZØ$-yT—µÖmÓªºæ ý¬[Z÷”®ÏÒÏû¦ÙºinÎI[suÛP-‘¾­Åãtûëigžî~KK¦¥fjélÝ3/íË×ý õ`A:T¨eËôÈêT¾VnÐc_¦ã[´¢H/NìÔS%zº4ý¹WÏÔóeéŸr½xL/U¤+'õê½öWºqAo]ÖÛÿ¥Ê[z·RSºÐ`¡- endstream endobj 12 0 obj 641 endobj 27 0 obj << /Type /ExtGState /OPM 1 >> endobj 28 0 obj << /Type /ExtGState /BG 32 0 R >> endobj 29 0 obj << /Type /ExtGState /UCR 33 0 R >> endobj 30 0 obj << /Type /ExtGState /SM 0.02000000 >> endobj 34 0 obj << /Length 35 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.> endobj 36 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 33 0 obj << /Length 37 0 R /FunctionType 0 /Size [ 256 ] /BitsPerSample 8 /Order 1 /Domain [ 0 1 ] /Range [ -1 1 ] /Encode [ 0 255 ] /Decode [ -1 1 ] /Filter /FlateDecode >> stream xkhÙDÀ€ endstream endobj 37 0 obj 12 endobj 32 0 obj << /Length 38 0 R /FunctionType 0 /Size [ 256 ] /BitsPerSample 8 /Order 1 /Domain [ 0 1 ] /Range [ 0 1 ] /Encode [ 0 255 ] /Decode [ 0 1 ] /Filter /FlateDecode >> stream xc`Ù endstream endobj 38 0 obj 12 endobj 26 0 obj << /Subtype /Link /Type /Annot /Rect [ 192.571 471.399 199.545 482.466 ] /C [ 1 0 0 ] >> endobj 25 0 obj << /Subtype /Link /Type /Annot /Rect [ 451.712 483.354 458.686 494.298 ] /C [ 1 0 0 ] >> endobj 24 0 obj << /Subtype /Link /Type /Annot /Rect [ 283.636 495.309 305.554 506.377 ] /C [ 1 0 0 ] >> endobj 23 0 obj << /Subtype /Link /Type /Annot /Rect [ 245.914 540.514 267.832 551.582 ] /C [ 1 0 0 ] >> endobj 22 0 obj << /Subtype /Link /Type /Annot /Rect [ 284.481 552.4691 306.399 563.537 ] /C [ 1 0 0 ] >> endobj 21 0 obj << /Subtype /Link /Type /Annot /Rect [ 129.362 597.895 151.28 608.743 ] /C [ 1 0 0 ] >> endobj 20 0 obj << /Subtype /Link /Type /Annot /Rect [ 368.892 702.656 395.791 713.7241 ] /C [ 1 0 0 ] >> endobj 19 0 obj << /Subtype /Link /Type /Annot /Rect [ 85.33301 714.611 92.30701 725.5551 ] /C [ 1 0 0 ] >> endobj 18 0 obj << /Subtype /Link /Type /Annot /Rect [ 78.135 72.561 100.053 83.41 ] /C [ 1 0 0 ] >> endobj 17 0 obj << /Subtype /Link /Type /Annot /Rect [ 99.415 141.457 126.314 152.525 ] /C [ 1 0 0 ] >> endobj 42 0 obj << /Length 43 0 R /Length1 39 0 R /Length2 40 0 R /Length3 41 0 R /Filter /FlateDecode >> stream xízUT\k—-nÁ= pw‡àÜ!h( €Bª  îA×à–`A„àÜÝÝÁ.çüŸ£{ô}é—ûp÷~Ùs}Ëæ\ë{ÛŒ´ŠPˆ«ž§3ˆ—“—‹G  ¦/¯©bÄ®v²tƒë@4 ¢jœ: [7eW #àÙE‡‘Qº‚¡y +H ÊÍÇÃÍ#ŠÃƒ:{ÂÀ¶v®€b>~€Œ³³#èÙêäìæ ‚q”!V\ Äv…ÁV  ƒs€ŽŽ€¿ãà‚¹ƒ¬¹pxyÖ`+W€%È Ááþ«Oeˆ  ú/³µ›ó¹ƒ`ðçn,µÇúœh …8z¬A6ÏqnŽŽ@'€å_œÏ¤€À3/€à/bŽ@à/r`«ÿ t;zþOÁÿÕÛô7s]ÐY×êú_ÏÿUCbû, '¯ — Ï¿ÃÁ k-°«•ÀèýË®±ÁÁþKíç(žÇüs¦g¶r€€àpÀ¿ÓžÕý/< ÷7îÿûlÿVK þ×:þ]é?Öð<¿å|Φt…=&<\<<¼<ÏžÏï?Ÿfÿ¥¼Ä j †Øø…@ èùìÎûŒÞ¼ð3IÈã™:7êú\ð¼,¾( ç¯ó¸Yþ|n«?€Ûú àýÜà€€Ûñ à†üDÜÎÿQ7ìðLŠþŸè¹×ÿDÏMxþþ»Ì²²P€7'¯(€“Oø™æ_òˆò øþOšèº>ß Ìú‘žùcY¹Á` ˆëßËÿ\sµî’•b¾,«Â—¦ÛyŠqÿ‰Ý¾•æü¤ìÚÍîj•Ó] h×â®@ò%ÍR(&ÍŒ‘Œr`öÁ7ëòû;*¾E‰Ízrë³7EÀLx)¿ –Ó*ʬ¤íÈ»âi2çï¦á'_ëñ½äö¿öP1&osg¯ ã¼Û!ÒXbmW_­„§ÈIJÛÑÖ£ˆˆá¤³„GWÓ3èI799Ú\ŽÙpP’Þ ¾ñÏ\« - Vm³Fî”§Ÿ(L-3÷)IÞƒ ÄÉØíYU®KI1—çSǽK©Í»5¥Ö£ –~x)­ÖÚØó¢ïR®S¾óŽe’¶ôµî µÌ†9sL3.¹HÒpóØ¢»$KþtÇzƶWãgÏŸQi0›7¢2à¨Bœ% µkü‰—HìÐÆbIhk¹ÆÝÃ:=#jÝ•#uãj¿£Fñª:2™Ž–«!c;'±*qÕ-9{Qf §A_÷M– …û÷žI÷Ê]ÙÑV0/*gí]¿4'>\ÑßíP*°ì(`½ÆÒùi”SÁ§ÙJBfɱþB¹šm&úñÂI)eþR ²îá¢NzàœÉç*¾fÆÜÍÄà"Kz!=íA„‰œí’˜Nñä5KêX}vÔtškšl\ÿióׯŽP~V‚¡ ‘ÞüãÞì¬äÁºªé&<@:ÜqÅ@ó8¦†_ñ¥4,‚­ÚšÁNwr´Òs¢£Œ2*DÂâº<©™aµg°³úƒ•친.’l«mG|À-mß´I¸Aßl¯bÒGrÑX{(ºTJ¤<¼²vì®P¿ K¸ éú­²@/Jk+£ÜÁ”8åJ¾’…H€1~R÷mc ‘¹>lV” þ¶;Cѹ}âE'ìžøŽ*$2hƒO«Q(©Î_ò´ŽGrOù¦†"c8=5æL¯éºÁpå‰Û«Øâ½SÕ-‚ÖøAÝ:ã²áø¶ô)\—vÉñ"ë‡9AVm_0ºêµÙʺÍ0Ä4W*JHÙ5!X€ýFìOèl1Ûsß®ˆŒ hDȤðã•0ùgB0¼ª*Jލý‚1ÁµeF–¸×(øãý° ¢«§¬…–ðïOŽƒH•3¨zå<ÊGw÷¦³$²”ƒûË ²›µÂ¬1÷•Ô™j ©¸Î4ƒ±G…y~×ýðX€¿eÎU>ŠÊÇ3ÈÝlš˜ ¾ÎŠÆCw'ÑÝÙÌ¡\dëœa»÷Ñh¿cªá‰Ói›ÿ7¯dÞ4,qøùo.’³xÿkh=˜ü9®ñÛóû$íÑ,ÂYuõÏóLC7¥C5ýÅy¨‰wLrýË®• ÓÁæl«[SÐ;`{*ê*FzýÉ/ U¯'²ïâfLàHSö¦qGTpQÎÝñ Œ…QzÿÀ’{v„ J¦³¬¥ôÅÊÃC@-5ÆrÏþ|‘Eƒfç4ïÒe[Ók˜üùýkºÇPp´Ži`Rh(;øÅ9ùöbO´…kš•ö'3+l2}™öÖ¢Ê^]:÷<†Û€æ1Ùøã÷·¥:[âÍ“_RÞÏûÙ+Œ6(Ö:¹GáÕÚ.­~9lc1{ºÎ½ÇÖ¶G$ÍÜudÞ4ÚPénì¾)WÊΫ8¹U»†õKHZúƒÂÍ%jZ\Ûe`‘¶B‹3$…p§6>šjþa(’(CÐÑÐ^bWÏç#ÙÝ­LNÛÃc-Ë€y(0ŽÊ2NîKç®}á;Sßs‚O¢O[Néh©>:4AkzçÄÕ½Á½—ÍAÄñ7ù.&úm,"(wiWÀMá“o@¿Ñ†'±,™„®‚Ϻ,ëè£íwþ®t³ Âp¾äÃûqïúÁsºU–‡=A™‹43êVóÆõé\¹rñiô”ï¢V‘cñt/"Z¼1½Bš] Þ«7Ì‹ºÐ¾œ00T`£’ß죕q2êHZŽÎ“¸Õ‡(®:•u=â” laÝ»’I|e—EÕý¼¼AIª0´Ì[·f}ùF£e¤-$ETç]زŠYV:G“È/¹ êL½Ã›v.W¥ð1Ãü,œO,ÎoYãó\$K®Ë~ ‘þ°’|)8Nmó+ÍI`Ëõ=-§cÿR‹ W2ùr²0BºŸ om´¤C-Òõ•SA㹯†Ï xlóU®þÎb Óš¶)‘­³RAúÓ,rE·fƒRˆÏý#ÃóÕœ+K!……ïÝjþ‘¾æmS<ɯÛÞ*›Õh+z#iöwn+ÙÀ~Æ8x)aÅÙâèèr2¢½±®%ÌÉ)™‰çÍ\Dà,àÔOFLôL…ðÍ»=Å |iÞyñ5ÁôVõ¸Ùk­ƒ9!cÀZÎzŸ)µË·š—L@#ópZ•)i‹46HziÆãÌî<þ'® ¨/ŽÒçžq‘÷ê_Žu#þlí\ø<ŽÓͬï= H“?Ñ }²Ÿæ“Ý7«ŒQwl¡h@áZ(…Xãá¨Ê.BRÅuÌη×ÙxœoD³'Ö¥3'¼¢Ô‚9bFYD.kkVÞ³œæª¸Ø@EžË÷®çsbÖá„ÇÓÖÀ!Å‹hgDŸ:G$2BMöëËÒücó—L_­õ´µß# ÕHŒõM1›>O}—¼9ûøÝŠjÌÔÚVÌÑ©›z¾´³´q´å¬[P^Éÿ]*¢⣡ÑD)®Î©Á£)-6Éÿšµ[lïƒf¤ü»Ùr:Žì*`ôZÆéˆm.›¢³ è&YÎÌÐþ#<’KY£¡§™[ªrùŒ#‚Ùϸ§À‚Ñ|µÜ‚±CÌ¢ÜÌx3wY0‡w  ñíàg(œêLPvcrš¯úvÜ“ƒ[<ã9uäú˜%ß Ûa) %±ÔÚ %æÏõ' I×±Š5,P‡L|î.1ÜëÁÜ£hÅàÚÏÐß~ÌÛ¬ÂÇûéìݶ)å“(Lëxú®…*ÄžL g•ÉÐÚ•7°š!Eýýâ˜î·qz{lð›ƒQ³ï'þGf„ØHF/9¾ˆ-_Ì¢2'²í¿ü$PÍçî¹µgiéåŽO˜¨0—qÆT1òrÁwÎ`›Ž)üÐîb¦mlDB6ÇýÙ´.HkcH¶Ë>‘¾‹Êe·¤ÉèGG}'!YtÏâ÷É-õ¡˜·#±Ú¾Ótl®Ÿ næûÔ›)ÎëJJ»>°ž½dNÊu&½&™€XÖQiÿ§z ûiۨ魂bsν–%hD(!B¨”Phr%rýÓ«ZúzÂd½¾y­MË3úÕÚú–÷#ÍniÕ×Ýx¶g²Fùñž’" Y‡¬f »N8Tì jtnúÒÅ)ò1Æò­f¾¾ûâ©<¶²m…¸'NF|£3ÞQöqßì0r¢ ing Úªè4XpÚØâ·ºÅ7šðÇãÇÄóOµ-,$ã~0ù3ô¤ÁQ¢‹oL+na<| Žy)õ«gïjE4!ë«s?*©¹°œJ¯#ƒj ä•–¬Ä8Ae2ò§ÏÑ{ªq$´^ï¥øº¥ø‘ޱà>³/$“h¶äãýNÑ7´™¯~‡¡ÂE’„1ô£_Ñ÷³œ5qÒÒ&ûUhjÂ-Pýh”ñŠ ­8ksࢦ‡#ËÆ§ är;¨Dhø”Å+'磨9ÅøK•L…×8eã²~B.ºDI^®Â/«{D㊋±:—Cs\…ßtéÜ]îÚåE>•6)'ª2´Ÿ¬ç‹Ò¨O¦{Ôd —FóÁå4h/Ò‰j±ø–ÿ.NÆT•&A&G"0è´ÖyFjj.?zD rÜ£þ¢31¿WÑr0L I$äŸÆ JYQ9ºt½ŸŠ¸¦ø(ãf¿Í’½§¥ $ñ¿%û: o4(°ûž$¯Ã0»5l¾Ä®âχa'†RP‰—^Ê=W³gä»[¼àŒì,sÿeVŸz¨n$‰ö×5gÒ@³ù·Ú¸R ÊzïJ8§clËB5f¾†Ÿ—ÅÙyؘ¥¶i|f$V¾*ÿ`ÑFî•SMã¾4‡Ì0¤ûôÛ†¾¤a.É)—›ÓíΟ„n$&¤'6ݨ¹Rêïòê¹Ð>…ûåÕhL)O8)¤‚£ÆP¯ h£®êL#›o›ÔÛ?•JÀ¾ÈÝó*ÿúé§Ý*N%©¤w:Ά %i’<$û¥„”/Ž­ÄÉãé£cL£À mÀ¿”gâûÇÐ(kh˜Ø?j&&(¡¸Vho Á¿lë˜ËbPÿy­ÊYÇPV'JèR„[R@GlªÙopôv5Œw¶ÿqe‚ê²å†•{Ÿ¬èàÇRk…u¯Ô™¬û„%Õ&Ö5aˆMÓf Ïê‡h\"”® 1Iò}ïjÓÑnY4Íyeê6ÞƒÚ^”ä¸aV. ž“9£„q>0áQ\Ë'×Ë çèÕ‰˜|m8gñ鷺+Á×.f¼äÈŽWöÏ8)ߤë_2•N´rb\ѯ#ò!eUTdæž9¾Iåµ?çz©ð"æ¾=¯ÜoGÓ÷‹AXï»·ŒvH #„óþõO>ÛÈ£C¶ ;Iûƒ{e“¡xΆ4ì“® ½GäVg°¸3 Þ’f 6®9»¦RT˜ÇE³a~®à€ý™`©Èëè‡? /È=hW&¶óœ]6ærNãF5…ú+çSö!힃‚tò%sùqº{²­Â«¯kÇÎ(™ ‡Û¡2/}9îê))ꂃ/0n WÚG3ä9ø'8( @({gqËç.XÚ”æªc%k0äBJÌzJ1æ \oϳº“ÐKv³[ŸC°òAj‰É2îWÓvšYFÉ;(s’’:Lú("œºÐ¬åÔJ¡ M «|~÷ &wž¨c^ÊQ›ÜÞÜ!í›CXÿu(ù‘Q“ÿÓïñ½»þŽŸy§±\¢UÇ‚w-ÕOøTz&f¾× åqÕìÈóª’ÒÔ/_J:Ì….–²Mv¾8³.,®$(Â4ØcCúÏÓözi|ÄLV~“‘»wæšCè’óY‹Ó–l@éK2žëgqdD$çù†ÔG/ê{Y>xïö6Hív·ë»ð‰‰u'IÍ øb…±Èã©R®:…@¿ö¿Êdi×úb1 \‡ºÊ2ÎÌnâÄÈÊIì_ÒÚyƒ½@áõéæŽ£1¶þìcZ®ß ö9Íö¹Å,n"¸({ÀîîìºFÈÕ«Ob Ê…$€7,Ašw{Ø…·eŽ¢¢ oGÓÜ“†`ó+ayÜŸ¾)êM+r/Æ™£ƒï¼¯Ç^ÊIó‚4Zí1RèõtÅ\ep§Z*¿4Äê:ݹyN™ËíÛí9V×cÔ­yøÎRÌ K8x0$åw~nfᙼ]».åÆÂx ý4²­IX‘ÒüöÑMÒ\IÖbÓKÈsX²e}@sÛ½!hHä— ÿnÌÊUOh2Ãb95ãïÝŸ÷´7aj÷¶j]“øß«Ø•å"we[BŽDð7Ëq…Õ³VüY ›}w7‚wôaáߎN<ß_JjÄaÎ܇%vJl adý”èú-ò {wLýz¶ƒAÁ“5|á• }ªû7²j’|÷fò‰ „—þ9¥Â&k-hS~ïöi³4Ã}°#È%Šœ-H—CÁo¹I0,rމØÌ1r‡Ñ­›s¶ºgWµŸ^9ß7MÙkPR§!.ªoPoOP#Sâv4Æ)¤®HÚ,O KÞ5üÆ'/6ÄŰU$BPFbËòòþܹî€Êß„æÛ¾EHè¥ÿ–“ŒåÞ.HSoÊé‘ é5Å!Šôä°ëa¸ÐÙwÍÚ¹ûöQö´Ÿpu±—%ðD8&~Éì=:iyMo*Õ×ïÉ…²#í¯Qu›µ:4ù½É¢v+ e–Ã>¦I$1è#G¸ÉãáÄ2H S²)*I×'…¶ÔÊÑ-6¦*¡gÍTž–Š­ë¶(—'òƒ‘‹;Á™íÒA.ý`—ǜ̕"Ÿ0ƒoÈËzÙÈf¦¡`Dõå)'‰±äÉ!ïÚ‡ <Ëw.ƒ¹oÞ€¸v~m-vŠ¡—šµ5äѧ–Œ~õì×ÌÛ,øz*Ë™(YcÜß|ê´Ž°ôî5z#p.ìÑêËÄ5ŠÀŸ2DôHX.ã? ¦!S~‡m¤Š?п¬È,L/pÖuÚYìÒóq{¯ë†¿¥ê³k É( yOÊÇϪOÝ€ØÝ§om½myâžXKªÁóþë¡ôp*f犕½¥ „Ý|¤†<Õ“3¶ð0³5]Ðûâèè’ŒŽ Ÿ»^ŽÃëá“åÎͱä¥Û€Ñäö_­i¤5 `É÷ø`Ä–©¡+'åוv‰Æ+J‹$8tF íM‘øˆ]›Âݲ+˜KKŸ¼b¬ñ1?ˆeŠßÓ1ãˆDCÙÄá“ø¤ñ½Fƒ£èP2Õ©L[ ßpe9úŒ}Ï€%>wê'Τ|vR{³ 묄]Uæšs"ÝòT„Zá B Œh¶‚¥äNiôp¢]3ç+´zœ°yý7”µîÐAÙ+Â@3PŽ »Öö6ÆÒ·QþÇï9L|žVú (d Ãìöêïë'f/X~mÎJäòv¯æž¸S4?⦑÷;¹8ãî9`AÀˆêY××µâDÌ ÑKŠÙÍaðXŸfRÊ•˜_*»éŸ¹–¸¥sZRFÖ)_T‚iáVß OoYy( ˆß)(…¼å·p]ÈwÙŠ´>'MNý¢BÂØHÄ%šíÑ+<Mà š…Š4UHV•gwö±fòìfŹۚñ%Û`q#Ãòûªas ·<­è#á‚k“þ$lWÁýÖµ“E33—ÑͰ¤Kí…­P˜ƒ–P_‡Ã~ZH‚ŒâW9-’·]™ x6ìÕïQ&×"¡ ?¹ }Ä¡ùŽ­%©Í“ú%«ë‡xìo|Ø$¶i œo&ÞõPì 1~<y‘‹ñþÂb,øëa7òx/ÛìrÈ‚Kž==]“©Íš øÒ›Ïagª'Þ;D¦ŠäùÖ)Z¹íÌœÑÞ‘B¯šöPiæï9a‘V»î(û/ÓVñªÙp\Ïoõn8úö&Œ¼ÛËb¬šþœö›¼$ÐMÆašeõ±§“ SoŠ ý­Š•dñ^„¸PN÷£·‰ á/ñ:oƒ°mÇNÙ…X2ͲXš^D´ ô˜š¤ŽBØû?7}˜ŸœÄ"¸ó0Ê ÑAÁŸ*¥ƒ9K¾Ìù•]u) ¯ Å/†¨ßÌÛ—#µOdEÁŒn¬ÏÜ'7†É×쬋Œ§ÔÒé;Ï ¾¸Ιˆ¾G§ªcÔòÞQ(ÂI^ 7±×{H†]Ü¿tζÎë Ó_‘œ2U+ìÓ‡YLë­'IïªËñÓR¤ |}ÍXRް×ô¹ø©¹Éñn˸²1G²8Œ¯HNl„`·;@V.=†®ÍÏô¡°-×S©²‚[ló&5K~¯ÎÀŠp‘Žî`úuv)ûDÅÊÑ(–ŽA2ø„CK/)ö}3Do#“»Á¦ò•V¯R8ö³<“C’a Q#'£¶ÿ±¶uO…;o•wlY§Å‘º¢TéúBî¢à )j]9>¢¡ô¢¤zcKzZº‡œÁùD\õýÈiç Ù ¼Ø¡ Yÿ>ѵ—Ðdsu6fÜe­Ð8“³ÇS’¼šO!dí§¾ë lSð#£ßymŸ³º7ybǾ!üÆ–iȉ»2¤.¬T³¿«¾k !¬eþ‚ÓZžn™VÝí’è•x„ï¦|þ¡gHHÈóCmøóÔb騮ŠSʲ(Öë’Pj7„%¸ «*Y+Ñéý´ÙWö0) ìþD'D¡™ì”ùÍǼ½·;½· »x¾¾Ê%ŠõÚœL!j»õ’˜ëõÞ 0N´KMmãPŒ ôOpí~×]¦x,ÀžÎZ¬$EÛŸ-¹Ðô¥ÁT§;6ÍeJKò‹¥Fcå³w$…ߨo¢¢º8âñš—&Ø^5¼ùi®ñ#ký¬ãü<¥àë7tîGºå"ìûìÌßG5ìŠú3ïYMÔÔ«‚}%¾MÞêªßÅ߯óBlÑþáP*D¨ѤÈAÓ«"MüÉ~KIqºâ#AHÂTë Õl¦9Sš´Éåö+1Ä; Bú¸…’bD~r̾:Â&ÍCNRJ+c¼y1õ8ÒÒK˜Á)ÀñEb¨ƒd ìh&z@–“ûÜñI¤¤§•šF)Cóï#tB§±ñ]"m„Õ¢7>Ðp¼›½ååÖÊ>ÆÙƒTmÎàòƒ§DI†ÓY»HxéÃ_ØŒï+òÈ›Õð³'JÓäC¸ ´Ìð&þdò:3rŠý`­a;Äœrôs GüɆBùÕ²õôÖeWÕ²:Ì{Ç[ûúC¹M\&{Êç69ÒÿS²|CZ‘ô—ªëçúÄååóÉä",H¦q ¯½ÿ×îî;Ãêß°ÂÏ~jqñÀ+?<1+¡vda¤µ¼Ä¦ÜÈz—¨ãáŒÖ `šÝÄã. Oû@j»j\€àR}vêÐcØV|ÔÓ&2á8É]ô0î®ðçñ¥?»–øzoÝÅáb1Èa““i$gà Da€°4²YºîÎéŽÜ=L9wõEÔb1o¬ƒ×v‰ MìÙåàD>éôBo%ïšÀ§:7ê„*¿pÈŽ2—p-™²œaS®½~Uh#25›LlH“ŒMpÞ@2+PÑuN ¾–t.½d ½iònRÑGTý cÚŃu…Ìâ›p,g¦°ø••5…̹Uš0Í[ç.ÚPÚÄÉœÞXg‹E ½¬t·¶(j¸OunKˆ×=©FmilÊiÔ¨ùJÐÅÙ8ïŸæXRÅL/uÖ¹ðÑ]€ä“æ|1->² 4QxµÙ q¾DኾHŸí]ȤÏaÔh¾f’½ð¾¸gKº±\ eé‰cG¨Þ‡È.ï)G´{«›€6m+^#wVWWÖƒç‹õó+îÆt!õºù}–g{c7zòK×ÍÔaaŽ¡ÝXÞqšÛ|/#—×ök(¡ºt)òÍcçín­µ4Ø4­4ŽôدÖ2 ªUŠSûÌS‡ â¤r8%2!m’wæ„#ëÜžð€oSšu$B&þa¾ØŸ5¿qÙ c“XÿJ°J ÆoŒ¥Èþ¨ôž –>¿ÏøÙ=M‚ÅÀRÉ7A.’6…4_Ì2Ѭ•`íÊǕȥK˜ß£‹™¾”jÀƒ¢Å‰æ°ÍIªA2yuËÖå¿{¨‡©ÎÑ^MY x§Ò+ ª~Õ3ãË’NÈ©LH‹¾^¢Y{ ýü]ûªÜòç cÄð†p± *aeŸ¥Ô…Ùxï+×í±Gžÿåƒó¿Œçùÿ xþ_ÐÀÊ„¹>ÿ²sÀù?*6}¼ endstream endobj 43 0 obj 8872 endobj 39 0 obj 950 endobj 40 0 obj 8163 endobj 41 0 obj 532 endobj 44 0 obj << /Type /FontDescriptor /Ascent 924 /CapHeight 821 /Descent -270 /Flags 96 /FontBBox [-200 -301 1041 955] /FontName /LUDOJY+NimbusRomNo9L-ReguItal /ItalicAngle -15.5 /StemV 78 /MaxWidth 1241 /StemH 23 /XHeight 616 /FontFile 42 0 R >> endobj 45 0 obj [ 500 0 444 500 444 0 0 0 278 0 0 278 0 500 0 500 0 389 389 278 0 0 0 0 444 ] endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LUDOJY+NimbusRomNo9L-ReguItal /FontDescriptor 44 0 R /Widths 45 0 R /FirstChar 97 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 49 0 obj << /Length 50 0 R /Length1 46 0 R /Length2 47 0 R /Length3 48 0 R /Filter /FlateDecode >> stream xíuUT\ë²5î`n;$hpw‡n¤¦éÆ5ÜÝB XÐàîA‚Üírö9gñŸ;þ§ûrîZ/kV}U_Í9kŒÅH'ï sÕñ‚Cx8y¸@¢@#E5iCvUð1’02Ê –®öÎ0YKWˆ(P„›Ä 0eœá^{[;W`/Ä| ‡;B£Np7W‚¨³æZÂÀ@{W$ÐÑÞC:#@KGGà_uH ‚„ Ü!`.loí ´‚ØÚÃÜÿLfã ùgìÿwÊ‚@>Ndùk>ÖÇ–`g˜£ ±y,tstT³t‚YþÉâ¿å-ì½þuâ_£UÁì?êCþ"Ç¢ ³„kÛ9»þgÞ)oï kØ»ZÛ]nN  {læhƒh8#íÿ¡ô ;{k‰üWò¨Ñ°x¤ÿ׌Üÿ¯%QÔ°´ÿ§kÿnüoþ¥Ácµª¥+ÂÞh z4ñÑ˿޿?Mÿã:9˜µ3Øf äZ"–^²äæ‚9»>Þ|´ØhãŒüà 7‚°wÿ#üW„Èmù7àrÛý øÜö ·ãß@Èíô7zlù7r#ÿ"@n׿ÀWLZÚÙèÃÉääå ññ…A ¿ÿWm×ÇÝ´D€ÿ&ÿÈ ÏÚ €À\ÿZÅG[ÿÂ6ö› xB¬‹óÎÖbÁÐô¬ ×Oäyc²­*͹‚8pÏ Û—ñ†¡qÖW¼Ø`<‡¹%:…’lE´"Ÿ“PgVðùøÙ˜:NV®i” ~ˆûäºß¶-!¬Ü û6¼ÓÅö’^.Ùb}g|Øñï9ÇUNu+zHÎkúZ^&x- ¢1êZ겑Ùq‰ btöæèSÑÆQïov+©y·#öŸõwË]rñ«µ£˜£¸¸x•ñ™¸RÖvü›´iÉGiB4hM6åâ—ÖÕj‡W“Ÿ/=6èÝØêwà›Å‘4–ù½£BSý‹"þ†î_D#6g›M“âçõ¾,šn¹(’¥)Û(Òàõ¾ †o9ˆÜ—øàÔ‘u¾P½וúÔÉž¯Ÿÿ»2‚¯„ýË]/6®‚õwªG—kÞ"Ûîlfãý^Ð9®†¯KDÏ…‡»”Õež²/ØmT4(fiBñüK5^š”kîÄÎñA=Ê É}ÙP=^& zvÅ?•Yª›¬Ùo¬$­1ÑÜë…x ƒj :¥Dt>$>KÌ“ R¬ï¶µ{4øZÞ²)F«›A]%j' w±³tt²ì Úe”¡i°áoŒ„X²LÐÉy‘ ~B^ Ê¡åîæV èÙ\¼ìø{Å›fj¬)÷A4¥ÐذD6Jã–pÑwä|Ì‚\,ŽðÓ¡ ú|B[öÛ@êDú2”Œ¯×¦ñJýyà'¬Ó Ò·¿¤Ùt—Ý?oø ùu9$Ç!Îíï=Dbñ÷$ ìšÃßÈÊL|pÆ£·Ô2EG+¤QS®®®¦Èk{‡!àk•z³äXúU‘£¿UÎAjÕö‘zÅöµ˜}lÂÆ˜œüºýUĤÎïúâŸA]è„ÂaçÛôE†âÁOÜaÇK%X™ŠVØó»_¸ï°µäp‰8ØâÇ"#Áõ“)M‚Z‡˜ó¿t,9(ÄšÙû=Œƒ:JÚ¢c@g*¿9æŸ5K4ýºôÃ8¦‹ü˜nöÁÆ1{ëÜ=ÆöL7דVbñ`*³Ç‡Wô0ã¬oª_ôÇ•N“YÉ BXr½>cÆ5»{€RBjµBÎþóéÙú’-{ò$öÜ“ ç±ÕA%¹U4[áÑf°%ëÓ|òEóo eÕ—¤þ¸ªäÎ$¬¤œJŠ_¯Ÿ§7 #Ìâó÷•ÊÚIÞO=:ý€BZ/0åÅÏDd,P¾%L{¬$:ľ¼Òy Y">ÆQüþ@RÎÁ¼ÇÝäDÜÃÇIb.Wúà·–ážµ ¬cnª×iR…XZªŸ÷ÙÒ9¤§{x-©µh8éro½H¦§WjpTPÙ0;ìöl„®ªnGEÿ£Ûß×у-í •\~<ß<Ï/§®n FäBjÇ=Š„RܱT_Ñ Òêž_šqÝ‘x@dS¿ö(^>øI®ö`OÂS±½Œúۿ¯W–u¿±÷½`Ž?ÌÞ6’0ϼ_šë·ÌíXÝTFî1&ñ ç‘†üù&fó­SÜ:ìÕ½ûñçsO[úwê#rM`Qc¾bnïÐNà:¼/·0@BÞcü‘½';¶'0Í×£~ºw§KØ%²0•…³„º†òi_‰#ÀbṪ,å“· v¡lÆÛd*âvÇIáöÐh½"…†û5f©DMͪ›ÂoG>õ ´Ü2[ä‚g¿½Ü¦PÞ_ÝЪO{‡ÛãW['×öÓø`LˆßÀ­¥î!þÆ$`à%ÿˆ,àÇxYÕ¹v¥dR&ÏÙu¦X¡­ŠËÌ<—껑•hâæì6"l¡»;ôåá-'Žþçëx¼vâµI5%œ3(¹³‰¾~Ôáï›°÷T?§³« Y¢ÄÐuúC»W´Õ^”y2¦ˆijúM1UÚnÜùAÛžß@Ü¥æà'ÂïÂ=B¼®qÏfÐ÷ŸÌ%õßt%}—ú®®³G™E­ƒþ¥›7‘fB$‹ F î9ë*U½]¤ø ʹ妟Ç|êM>÷\QµfY$p•I7Ö™B©9@z4 P”É5 ïR¶yÜÿ2¾ëh§¡øÖ9ŠÝÇšiå!Õफ(½k¶Ü-Ý`ë«FŽYçfqP~lÇhmúÞ%”2/´fJϘÅÀË`½b1ȯ7åÖÉx;p“´h21ªDæšf`b/AEZ !Sm3>¬Ù#‘0^fT¹|¥Ò/ÜFHÒÿZ„?ßÔwÍþT |&D˲ÍW× ìŽ;¹Õ¼÷:J%~Gv21Ýtû’D±Ù®ô6üÜ«¦dö<ÊÊuL*›"â­ï¼PW{ó:ØÄ2€lqÉÕÎ÷ºèТd‹þ 8;µýƒ¥1¤¶LüS¯«â‡“îù{çW~¤¨ 6‚äˆScmóÑ?äœÐ·BŸ&ÐÄËæNSøýþ0â`$y›ó¶Ü«$ÌléMÜNð•†ÐyKáûwú,&«Ô`VÔªu®t±” ïž]¹´HÏm®¬Ì,âüºKî†(q‘>ÒV5´_e¸Çr­d¥´_{= «ëäyåŠ ‰GFòª:ªOEŸ¨&z2úÙYN¹c™p2‘¼q_õÄy2¾¼·×r$uL-¦'î¨ô…lB=IË™ë<™ï%:oÈ E'QÊ­Ÿ$ªWæéÆáŽ©-…¥¬>Ïïy៞êÔñú!|5To©hŠ<áÙáLç3ªßDwC=‹®G£]¥e§7¤æ*øT˜ÇÄA02§C™¼B_o8^î æßIÙAsVs?ëd"O8£:ƒ Òd²Dà›½‘‰÷÷NW6>Ö8¶ ŸÕ³J¾Ê3I­5Éà?DS¡Y7uÊ›'~}!"_’cvƃgs'ž Ž©|zø§Ý-BÎm;ÙÒo’*ÉÈ\&ƒýÂMV9 ð§©Ys­lÙ¸5òZg8ËrõÁ€ÜfŸ¨Ò„3<ÿkÆHO[LL½ñÌ4=MƒÑÕ÷rX-í2¶ «PBƒ‹w݃BèžJ!oU]/›ÒbŸž:Mq_á›hiM°pZ¬”æ^3(6ÇedNáº\¸X»k^Õ>Û™øjŠð¨æÛ«³Wy'aÊVÓ³ð§É€Û$Â4sðK[œM –-IÔñÕž‰Iš"+îGZ…€¹Nu Š¥mzƇ¼$œ²úCâo‚Ÿ;”â1˜Ü›Ä~ìež>³™¸3x{¥ZÚök5ïfhãöŠlãœ9}vBa7VûÙG+6í2zM¯vOÖ} —$#‘JËô+œ U+=¦ÊÄ ‹¸ÍLšY?°]/øˆŠ–f¯´c2§Kâ¬FªÂä¥ÓëŠÒ+œ®ÞH°„E )®Ö§®l 3­<{–øVåî—5.9SF™¯‰6\ÚÿZ™ëAo¨yDæzž’gÚ^ðì9K}‹]ðuÆÔ«iOHb(é¹ÎÐXtá•vç.¤vgQ™¬Wr¹ø']†„[ÍÅZÊ»`‘“TÕ¯3t/+|@,Å¿yýÐQGñÈݳ²¼}5'¼éä¡HOõ>T!”2‚_Áj&u‰»r÷ñ ›©3‹–Šñ“ü¯©®"Ô†‹0kK—Búž@ÐÄ /ûfÿô ÄŽÆ«Íæ$#:7 ´mi¤¦Ðù[4w¦;æœÇ\»r¼ýZîßX\>ç.ÌœZ ê|‚æÂaÚºø ³`ìXÙ{¢cé|t@<Ê„ Aª&íYe!Ý"æm±‚èê0â Þ²óå‘¥›p}qýèÝÔñƒƒWͺ»ãC»zZT"žè7Ú¤eýå]ÍY7__ê»»peJ|;ÑAöJÆ,Þk>]j+ Ì£ó6Ÿè–Þé!†üWQê úPS˦<¤Î2¯B4ûk}ýY)?}ðX^’ãU’hv„°h?Ñî/Ç_PÁ¯ÓcœßôûM¦²fÞ{òPÅîrLïú6êÿBžâ{º Û.csÏo¸¤+”ÉŸ Œ Ð ÈÐØá¹õ‡WÕx”íÌÏclï’90EWüŸÚH1cVŒŽ¼Ù$3ìªQ?ëÒ¢ëÍmï5³}"WýZU ÝîHø€øîî)éŒé%>hQuJsUÁùŠ#i&þêþg ßà¯n]©5Ý¡ì‰B¹ò{Ifɶ¿+TƯ>¦°tìÝb>a›Òµ×n(¢½@¿Pu2-ÅÍôæb€`[w²u«7öTEÑÉR‰iÙ“ùy©--·Id•gOgºÄÅN[âµfjÂ'ŠŒbY¦jJž×Móë¦á®µ¥Sq@(=ˆ†Y~úõ7“‘ZçÝË…½á¹!=U4ßoW³ˆ!ÌjÆ«AÅ·XHêÿeبn†s·ëGÞ@'qI‡|š® b3%í)üî(•|¹˜Ä$è¢ìÂC^$^KwšWë©y€å!ÌÄE}ÎÜ,8åë½hÝ$’±Yn©-zl[¾î¾1“éþUsZ›MÞºLk“;çí“îBÉ¥·¡­³Ì4 P4Ýš¼NÔ“ Ø"KÐlçÅCí˜ûv¸Ç]Ñ` ˆCÛ}EW,Iþõa„—팈‰X°ohèV´Ê˱2¹¤¸òʱìh2¼><ª¿ØÌ‰¤Ùø*JZÂÏ¥=›äñjºõ1s£Ýv×Ï0Ìk4ÔJ Mî` IÒZ²Õøé¢y–8TM¡$ÂçVÒ–U LEê²õËbž½Í:ÛB]rÁ¶ÔHàñbŒ3¤ÃŒ™V"­¼OîªZCΛúûÆ_Ùx– š×&X‰šüTÖo£—Ûy3ŽÅÅ‘¾¥Û¨šò]´¶«xÆìÞÍ~¼—ö Hœ €Jrä#‘½·ÿ §rªß¸Rnáý Š8¸ÁE)YàzR5úE›;˜ÈÜNe×?WŠfD´äÞ‰ˆÐŸÃÇßʨ-j»¥f¨0rè÷GØ\©*Ä^=Æï²@³ü‘%lÛËà0Hñ ]{·ãgì5Ô-»±ï8iî¨(T P_[ÙvÎþǤ±›+@Kl·r¯¬Ýo]¢Bi÷W5ؾþÉçžéa¸É±½å÷3s¥ƒã²¸ûÜV:KÚ ‰6­óíŒöàDDø-cνœÀÛ,Á?UE†°Ôk Þ:ööqÚ¶pÚb[˜Ôœû½BMÛª×T=çÞq?í’Ф –³Ì\`¯%çùêÔÚ1ix‚Ëú{æKKm¹Å%žîWmÂðÕÏñ ë3ýnEM¤Ñ¨[tüysÒ…f°”®ñ»zÈù5ê§®Tz®yf[À­»5ë¡Ót& !eŒ¥4sJQˆÈ{–%t:ÇíĘCÂ[ZÙ•`±s|¦¥½?ô´‘ÌB~„cŽOãshE^Bxç£':­Ë'¨èîßÈË & Á"%ä+ŽBh]êœÕ^ó§ Ômqë{Wº{Ei]>é{/XážnâÛÔˆžÌFų I<Ưߚ Vô]$R¦äz¯¿ïNu Ýñn¹bw…%¶¡¨¿aábÜ8–šî~pi²ëº»ÆôÂð´W)qΰ0K.ÂÁçÄÎ*}k/goZÝyåÙлæCõL,\çåª/%ÅãŸ,ÿgLB ¡â°=üÀ½§¶ Q!¢ ”öQ¹¥—[ÀÚK—*‚:–ÂÎ碲)zd~x ¥I‰¶%VßMK“"/C©Ì/å/ÍeÏdrÇçL¾6ÍÎI‘¼Ùa©Z^÷V ð­‡ß˜Ú‡æ‡‹(TLSW«©$Q“QoX\¼aí—ä¤OL“ H,ä »»’÷ [ìô¶î ë9(í*µpU§MÒ'Nˆ2T‚:ôhä`ßIæ©í‡ÅÃéê.5ÂEüa‰¸ýc¿¸uá°|þ®çd2ˆ%gB¾rV¦öm•ÚëH»¬ `~ 9ª­$´•²¼á$9;çYn{µ}:‘!¥;Àz‚L‰‰ÜìäIwa‹Ë‡f˜S#œ•À¦–9I(@7w<6úFN±ë!P”{bXpø³„ì“Ðù–¥Œ žÆ&®¯LŽòîÎíIg¯*%\G“Ï}R­›ê6az«»L!jn8zúØg6팊ñ#ÏòÞh7ãMÝGE”œ¾|ùö&m0`nc¸hÓÚÎÇð]+ñŸE~Á³yhë[‹ïîå(¢3«þ,ž‡ˆ³u³…Éq®„eúV¨È|Yc±ÐÜ+i¤ºç–U;‘wXqF“æp¯ry¤Éé²xc M9'Úý½LÕö!wÆŽïE Þ$¹A,þX¸Ýöž•P®ÏYi—`~½Sè(L¿ MaÛŠ¦ÛOuagà¤{;‡Œø¹Ö6Ê Øt2·¼ÆÅ¬§flp»r¹`‰ðÉ0:,iNÔ†vcº8%'QÓdíD$‚‰š‚·¿n)ÙAæ-ß]®HºÔ+K_ Æù–j±pŠt†ëÆØ>f‰“?;€åÞ’ÐÔù Ñ ÖhéGú•òÈŒŒEö¥µ[©ª5Ò*¸tíøšE 5±ðÖN—É”® W¥'GÓÄ(ª¹8ºgR¼JÍPé«{«eN®™ÅU—F@‹C6¢~½AVü.ÿ<¦= žàù¹P…9j‰•`Õš²L©7Y؇€ïLµî*ÁX­x„ᬠ‰êÚð½n©Èî¼°3Mb,ăØvoH²Ž\ñVá&añzC*û­­šöZ ºmýãE9µˆgöçE¹Œ'Ë(Ýß0è‚ïX ’bûg7ÓÁcuÕŠÖìZ“DÏáᦫ?V‡3÷B”]½ŠY”´o:N‚·©‹M{[Áž‹Å–b>†Œ‚A*ja»YF< ¼Ì®Btq9#ªßñá|-8ŒL{ìr¸?ÜÓT‰ –óà=ûÄÊ)‡r×ýí!á …ÂQ׎œL(Vq~9´‘ÈÉ—ð-^vNuÔ%_ eT%u‰Üåeôξ•õfQ3 ߟÐÐýæQÐþ|Ò‹ÔñŽgER7làáV%Œi„ì>½=Ñï*íìP] gº ];˜9ñôˆá¡®ô1ÕçðQ¦×λWe)¸ÙàhÉJºí~Š I»*@õoílïVÂ17€7Çô>ü!Àh§ÃU Þ<;ûìQ\q f–=Ì ³cöûÔ'ÆÑYT4‚ªñvãÏß}Å©JìMm_‘,`9¹SecÏóò ÷œ¿á¸ó‚4DîuÉ]Hwމ<ò«½HD‹© ÂÔ°BI3ñ|m§¶.‚1öÒ“ü$Eål‘6¼õ–I}‡§å4 æ[cÀïl ìMtT›Æ30öœ¯Ôճħvæ¤Â?_úƒtÈß?ÍuŒ Ö×éN(6ÙÉ‘/<øÎáqº§É°ÃòÝ8z@¦‡‘dà\UûNÕLÕ9Œ²]¶<£­ZW0yy´âK! uÛœ’ zäßÅ«ÉÍç-ï•1XJh)™C¸ Itü²<ÌèŠOí×wÖ‹t7ÊË«5äj€ ádÀ’‘ê¼7بì°hl×ü91iØo£1oƒÜ4cˆéã~•N¦õ:ÏR§:Ö+7Â0T³Ø1Y¢§å–ܯ-ÂÈÏgDMÍJÜïdÞ’Ê¥]ß™Ï4ˆ+F]ño*'ŸˆŒ Ö½O—0® ­û“ZÃW¬—íÓІ~áönÑ#bbcÔÔòõÏ|•x ¬ZuY* •CêÚ³ëÆ¡bQO5ã2¨×_Š=Ñs”#f8C \–˜ñt»_+¡$¸ñ;?\i4îçyÝC^®( "ú¬1“G>w f¸ßUâ,Ìæ¥8ò?¬/›âXó›[MÎ+·n^»ZÔÓçtlàwIK¾aÈŒRquÛ–ùeí…õ-X*[±t^òúÒÕѨN+í)*ìÞûböÄ" ‘ØûŠ[@-9œ¾|*”\+ÛŸº¿¬Q—\õAÄàšB-g}'Ék\A=‰tÀT£SÈ*Œ/×ìh‡H¦úf‚þ‡àXú¿ ÿ X;B,®ÎN–ÀýÒ endstream endobj 50 0 obj 8049 endobj 46 0 obj 821 endobj 47 0 obj 7409 endobj 48 0 obj 532 endobj 51 0 obj << /Type /FontDescriptor /Ascent 800 /CapHeight 711 /Descent -235 /Flags 33 /FontBBox [-35 -266 762 831] /FontName /ZTINBY+CMTT10 /ItalicAngle 0 /StemV 69 /MaxWidth 797 /StemH 61 /XHeight 533 /FontFile 49 0 R >> endobj 52 0 obj [ 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 0 0 0 0 0 525 525 0 0 525 525 0 0 525 0 0 525 525 ] endobj 15 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZTINBY+CMTT10 /FontDescriptor 51 0 R /Widths 52 0 R /FirstChar 46 /LastChar 116 /Encoding /MacRomanEncoding >> endobj 56 0 obj << /Length 57 0 R /Length1 53 0 R /Length2 54 0 R /Length3 55 0 R /Filter /FlateDecode >> stream xí»UTœÍ¶¨Ü-AšàÞ¸»…àîNã®»»Ü=hpw—àîÁ]ÖZgùÇ>c_›sqºoúy«fÕ3gÍQWoSJØÙ:«¸Ûƒ˜˜<1uy%iu:9 #'%;9;nY‰à}˜…‚BÔdèlag+fè âp3±™€Ü(Q;{wG 3sg@ È ¶··½?µ±wq9Ò¤l†¶& g'€µ…1ÈÖÉÎщ`hm øwœÀärt™0¢03L,ŒF 3 [¦9JÙšÚ¸ÿóØÄÅþ¿†\AŽNï6êéѼ/ahbgkí0™¾Ç¹X[ËÚ€ÔÿÉðž¡-à='€ à_I¹Øüo!†6ÖîÿSП­úwÆÔʶ†öÊævÎÿ}ÜÂI 2Q°p66˜Z;þ#¦jkr´¶°)Ø9Yü«šf 𿩘[[Ù‚œœìÿ½Wï¿%ø^˜»2ýÏçöïJ(Züç˜ÿk—ÿ:vÀ{¥ÿ]ª÷•d -Àm #È |Ÿùþýç§îÛZÜÖØÎÄÂÖ ÀÂÎ0tt4tŸÎüNìOf€Å{‚`üž6£­óû€÷Fð˜Ú9¢üëø˜L ÿzòo`0)ý¬&•€ À¤þ°˜ ÿ“Ñ?À `2þ¸L&ÿ7€ ô¼'Åôoÿ(¼;˜ý{—0ÿKïé]Ãò/½{Xý¥wë¿ônbó—ÞUlÿÒ»‹Ý?Äòîbÿ—Þ]ÿÒ»‹Ó_zwqþKï..éÝÅí/½»¸ÿ¥wgsGÐßüYÞ}Lí\þ½+™Z¸þÁúnåôÞÿu2¬ï^N WÐß,XßÝìAŽvÿ©ñÿÞ""v`€'3€•ðÞØ@7Ðûj eç÷kÁÐÑ䟎zoDcGG­ó¿o÷¾Gù_ljñ~©€@`1Êïy;cÞ ËÔôïÎÕxÙý£b­2ÍYìéÁdf¥÷qš!±Æ,ð&ˆVsK¤’áXRÄPyžW!v4&óq³ÑÙÖ_õºÉTï1ÙüÉ7¬’#¤õ%9{ê&.ì¸)eQ¶9Bì:ª"—) yUÔe‰Gðs6wÇOÙÝ'Õ(0s7W—Ò©ž*6FÎ)%½O1{%Ⱥü~-çb8¹¢÷:™²Lå[¸;dðöòß°ÂÇ0ŒÉ\«–wcÝÖô¶Ç»/s@Q¨ùªÒâš3òpÀtôdª"‰ÅçÔ>#öëuUÚd؃KHãÁAÝb—;œBËÓß &x(°ƒã—Oüº m¡ 3LÁyªïYn âé¾¥özúD¢¡ZUýÒHÞ†}J¼"žÌ…*Ê‘zâÛ ;#I3ØÿöíöÏÚð´ˆÀeSÊ’tŒr4@ÝEl¢ù‹ð½JÆÏÄQÏœsg{ž¾“…ÐéD–±‡ŸK²ŸÑÖŸ™¼1»'ÂÌÊX+9„´á‚€\W§wEÕ\> õô:™Øa¤åÁÏîç*´±bc/ÛÔ=ïìÉÔ“Yh"Eðý(¶+cPì«î‘l Ár… x&,Z§ßÅ’ña?ê×HW5?ëÏJB2׺¢ôPS]FÄ# ºrkÁ¼–ñ–—¼Ð?‚*Õg˜_GåÅ‹+‘oJ;¾§V ª¬Q‰ÃšS£ S‹ €7¼õXôÜŠTºfú"„0 â8_6WNæFà×â˜ÏktlLÙö"T‚EŽ«ÆAzñ‡PBWÖ/5X!ü. ¦ˆ+Ž×™x’ùmO÷öRYŸ+™K0 7?kP9å'sDÑ%\àCÓ{¼öûî¯;Ú´ØoÜPw_˜æ‰ Ú–žóÓQž{ÛØóT¡O AØ$™è©d%KL‚6 S! â‘°U‚ñ™9Á'X¿¨˜„oß=VÌ…  Yb¡¾¨!Û”Œt| Ý43ô›ùh§°Kkv:s §ˆ.ÁsYÖèÑÕoÙå5幯Ù¢¸— 0©Œý*ßÚM4—;O­¨”ÑoêÂ)VæOuH1ÓÛ1:á ­§H :7}Œ ¿œ^RèäÐŽïƒ!¥t ê9üº•š°Ä4Éò0á¨}EÙÇÙ±z4Ì·þ"{h)üâ·QÏ4xÿŒ âíÌ¡3e£¢MÕ<´‡ÿb¬¡S,{Ñ,÷E¾¥u{41ë:²4;=ôAí qÌÿ K±&t–Ю¦MŒìÈð›­ß™éë7eá?b.óý\ØR] ¨M#Tý©³¥‡›ÙÙ±qÔ)dûΦ‘sµx$™0Ýza Χ6 c$,±zÀr‰;†mÅÕ!YÛw=AÆENcX.¶£\ONG Wgš¼ŒZC<ª3Ûé„Mw ¹‚5uÏœ%Q‰Üd0Ä/Ξ­gŒ2‚ö„€­.ˆzÏ.Æ”ò•„£oèyãë:]å\2a¸£$Þdææ“×ù.ôM1S ÛªÀjÁÄH–t( ™eJ!تµ»2þç×°SÇÞŠü¥ñ#³ª¥?ÏËHr+Ö»Å1ËVìÊݳQÌþakqÕ&g³¹Î‰\wýB-Œ³H³4Ì Ÿs¨:(sÛê†égˆãÖ×1ßõÊ=vÚ wªUµoAg®uëÝÉ„úV:I±?ÐèS™tƒÈÌ5.öUžÖä׿ê minï4o°ÕÉ>VA#Qy´áA°¤ä[ªÅ½Êo /ç‹ŽÄ Uµ›¦Î×ò¬¡DÍ=Š6>§êLÕþ™bGípº×˜>ö•i €±û&˜ u·¤9 WšWUX5¡Õ£f£ïç¶BdÑ‘Ž+cjH§H\¼ÇÙ뢚áv£fÒ‚ýÆ!Ì"ÞßÅÈž E‰¾ä,‘}êÔGdÖ¥nµÌùòöPÄJÿ•z^L[³ÉûœÎ4‰E–° »p}ƒA«ªqRyÛ…YÒ{/ÖSY‡oˆºò¡úNà»~SÆY}ïHQ¬]43Íë×… Æ•:â¥MÜÏövEW8Üì?ÎimGYù¯d‚Èçì”-âRâ6ŒëJ¦ß#È) çGÑ“æeÌ¢D~oÁQ{¡q†ôÕ‘³>,w4;î½È¿_ɪŠ9©­*ÖX<ùv*½Éå©F–’äá‹ ¾ ŒÚ¼Ü^ö: EbÄó¹ 9(ÑíÄŽš22²ZdÁÀœnyÄ&S¢€ùtñ²ñ?ñqí(Þ½~–>ëÓÚ\£íЩ½óÿ¸&÷ÇD»lù–ö֌绚‡Ü‘Ä|ê8ÌsûÎ$wPÔF¥üÕ.O͆üò˜2´¡õrúÜI.Ò|»ÂXpx•ÇKu˜ôdü¼Š©lŒÏõÕ‰å L{j ó®6ðŠõå˜6N $…R•h¾7%=^¥°ÕM÷±c²> ºUK3yž¡PãK×´Å«Éó«/G»]Ïþ1Öeéÿu8Ɇ=’fî³,yÓĤ-FúRý0–(åZÀî‰ ¨½c÷aêõ0h£‡…a9qÂ/&kïzæ?êÄ cáæÂJ²è)‰Ås–À¹!EÿEújúãõ€ò—¦ÕÌáTh7u+a:8« ®0e›(®–ƒ+·)ÁOƒ^BuLCèsRò ¢bñÕVyÌôÕ±ÌÞñV&èl´>þ¨r–ALÛè¢DSü@xuŒ­¾ú©Bh9çŸý™1Óž>fYcí±É$?RêEf·IÑ-²œ$£I  Òß °#i­±%#[~ô&ýʯ’:‡g B„^% 4OêyÜФÅ­4ýÆúØ™§f)®úÓžaªd›¢4g7¥ï!ç†Å¦ˆ^›üé‰=܇YÛÑ&É’—låZžíÔ:ûù§i§$YéZEuX—_¢\/ºP¥Êä ”"ûUª]N”HÏÆÀFû/÷¡ÞŨáÖkrö_d)ûJ¥1GB£¦IR¹Q«]9S@ÙòÂaçÅÂü`™ÀÍ«‡9µ;9˜/É=?'þ4Ú²+¸x»Eâvq9|cÿ¬Gˆöµ¹>Ý#Ÿ§¢ðư:ÇÛ‘Á“xs3ææ{ðñEÚ°žQÉVå— 5ÁŸÆ4É~Ê’9?‚˜^¯«‰Ú=E¡§)—%ŽXô*Þ›ÿF©?ßí^Iꘈ*÷̪.ŽpPCó쥄 å¾ orþÊKXž]ìY†¼Ä"Ô kXÀÁ˰ ÔøFé/ eyÛ'f‚eÕÃîf$n½€ý —™ÉX½ÓО V“ÀEþñÕ(Ô`8·Â¦ia˜G­J%ñw›/÷Jä/ÂS~°V_÷Ýè#Ð#LVn”ÈÔ+/º8jk;Ì]ãþ4Œ)ë?šß”N дw’V7 -S•µôÔ‰¼[ÂBrö¢´”j8NQ¬]}Ñô»‡4\ ÿ8{GÂûëIUéRèá Vüô-n>LçT&/ˆg‘ÈçÚÌŽA§Hó‹‹g¾0†ªXbUØÁ<úïmùÐ×F=»«}=2aöºÃ(.`Â÷î¾½azóçÓúŒ&²1^rU¡ð6Kæ „$Ç|3>,h6H6V’åÞ÷µlî€Ï*‘ÎiÉãCÿ£H¨òÌ+—°[¨mS!Ò¦y}¹œ=Zr¯ºXj l„ÜÖ¨„ýùÍà×Äsüb!ÆÍx»ÇÄæ/NíM=©[[Ûe°ìño£¯%KŠ ž'°¼¥^˜,·ö¼šœvöçq…cß‹bÁWÕxžbÂuà$  ûÐ3tFn=í è–šÒ'‚9ôpÖ²¹õ™ ƒÇÝÊ@,$(]~ºê¶lH”óÆHkª««:£P}äÇMŠÅÌ[M©«>&c§øbäÔ]-*å¦VWˆÏæŠù(¹–¦¹Š÷×îÞ´;‰©ÂmvqÅHT·“—ÌìªDª+g­HKþ)m©n<†ók8üu¥Å+Ûl¦ -`ÿôU}Îl‚ÈÐËPim4^w2¿ã-- »¢n2ÆT¿tøžpúû‚è8Òä›Tt««ßkB.ƒ\X1ÞEVV¨M ŽåÁóÜj®I‰[ÁsÔNÔ˜LàìK4ÇÄÆ ¿­˜jõçW|§·ä„~º»ƒ 6åsÓC@DÌꌤG·v—¥@V1Eêrmé÷“•$»ESù —.8¦!qË‚°óc<‰• ´$¨ÐÂÝ~IhLüá*ZñÙ‘}IU \Tøv€ ¸"±NcvÐ0k[L3V‹Ÿy±&âž:Ï, îjZ¡BPh¡¦šÆSªvæá*NlA#°såWdõ‹™tÔq+ÝÚCdÒRõµïŒ!~8Õoš¢fûà[цVûÊÒ]ø©Œ˜ÒÉ;ÕåG—t¹äøt]CH¿‚ßcÇ6î}Lép³ªöµô£ô5âAϾ—Q‰ëYY±daàƒÖ5Ûg_4V”Y]ëÙ/á šñ­­WqMÔ6Ù w#oT~¾¯éÇDrñ¼f¯xÔt·¯óš,º÷’p¬ƒþšlò3½-ÚZ‘Mû;K%âa¼^B㟛óË~Ud¬LVmaV%½%Ù¨›ÎÄX”Õ¾¯y£ÃAþü7HLV,=°CÑ!TÁeü›~FÏM?ïò³3¾8b }¨,·Ê©?Vø.¿u®eŸî•¨j,Î-âÍoÓh‘× Ã›3&³]Ž»ü¢øãÊíøóbv½Ü—&_ÛO— 1AÖ̲ô"†íT\5á">Ak5ÅØÌSÛVļAîD½–Îá³TÄ] пhÕ;e–À‰mªIñFäþmÉD4æ„Ι6öó,ZˆõÙüóÏñÑÿ.æ÷Ï‹Q]ò‡ˆ¥þ.[ÒyLвØêK‰5YOÂ9z‰ŸÃh3„÷Ñ Ý‡1*Ç¢T“IÒB1%Ê©ƒè¸ì³¡e½ÕéOû”í„§…àÓêÒ¢¢sçzk Š"«‚&‡fYWGÑk)™5#aŒC¡Q?»¤Ìœ (É|aM}Å¥ãÈ©Ý<ÀR¬RC  é& ¯%®7]=`µwï¶€ÏF~šÁ·Jæ>³ö—ÀŒ°ì©õœ Ät}è·4ÖØr'ß?ãVÔ tB@ÂÚ“ µèq˜“nóùs×J¬Ah<Ë׉<3p¹#K¥!{£Ùú㌠VW¥³ªrz©HuÄ&ÌÏ”î™Wûþ–ƒÊ&îäÑ$IŽÞÊ1Ú:r6"&§Ù;'+|„ìtáÖ’;Kçtñ) ¤5¯X„‹%Šz㬚W3xMÝÍ=®îï]Um'=»ÍWl‡ P©8–8RµžZÝv¶y'Ö™ž3â Æ¦ž‹¦š]ûJg0®U„&®J.E„ØZ§£|AÊûðˆ×Ú9v«úíQÿ¨~“ކÒx Ýrø«ÚÇÑx+É£¬KrYé—ô ÁRÕx w÷]°wÙ §ž‹¾¤J<á ÖŸ`ÄÚŒf¦ù䃩œj="®ñ;âÁÇëdŠD·ÅüšöOa~Ë‘=ò‹Ýñ`ÿõnõëÔ·½ý¥X®¯6ñi¥B#—ìWi³¾í2y­Èoƒ.äm*'QJà7SÒng¶Ì]à”¾¾Z¶Ù hK̇rzàáÙ£ü­yßJÜT5™€SJöEgÜÄ÷{LÝ6œÕdýäy‘Þ¹¶rH-^…:-·'ž‰j>µ79v“#Z6íÍxé¤' oÐRER»ka*Ml]Íq§-”hnç+¦ÂÎéús´„zs¦V4ý6¢IY¤:ëP¾g ò'wOÓýLåð_¼¦rÁ=ƒ7£•Â] úŠU±À”YôöæNlý¯Õ¡8ÊSí?ê#ÃO:ROSq‹­ÞŽºÉž~sS:€êJ`rÞ*e,€Ùõ˶ß2Ÿµš1…xè·èJz>ˆpšO3Â@R>@JÓ‡Á[½ñúp–0Т/:e-Ì?ž!9šþh+c‘PØ_K߃fÓ¤&XÄÍ)à¬]|Ѹ5>§égÔ44)%A ]vöDËÉŽñó1äÞ8û|® ÁU4Äßý™Â†®Žwää°¼M˒ᚇ£ÄH¼bšH;¿ εK3Û íFúÉ:~a]Ѓ Žú%™*­?-›4.Éø±üÐÀ¡ÒŒ¶:š”ÌûóM½\MM£³ÎÀ`±¸¦ÂJ4¨š2ZúÍäŒ5@,žm_u{gCw$§õñIªJC¯™y¢/r5ƒ°ÑcðlæÔ)œ§¨ÝΧ§H±âÀl—Oe®]Pš¾-¢9‹w—Oö~Çæn·',1_ïS¶Ñ¾ÉGlƒY¡;Z)øýåÒp´ ~רuê0žñ yô:ð·sv¦ÒB2¥²ŽÀ«–~ÁÑÍŸ´ƒÖh ý嫈d ƒZdýB>”vcGàzÐ'v cOÍR¼µ÷ †.q“žQnHÜÙL°U›J‚ŽÜÏfý<À¡b:¼ŽÍõ#½éEÏNÀ‡CÀ_~ý²7÷„fƒh°–šø$Ò–D¼5Ùí)hlNBÅ/ì֥倮—¹ ˜ôùa…2¾(,R€‰ ¢À$‡ªqêµafh¾„»‡I‰KÙeáìãõ5Üq}7Y\¨fñJÒC xÔÊe:·.!b ÑhCZ×µŠH9ºIÁÄ ÿ¡¿ß™¡a´—ÃD3‘#iÙ p‡9ž‰”G¬ê1s@(X(…ë¯û ×%LŽârüBY¤¡ÎAÐë…ˆJŽæLì-òmR®é3¸<ˆs3¿öv÷Äí \’Wë½u~{8‡Zçª,’@¨{Þhv_ýqè³ÁøÉó€¿i‡ÖÐt€’¶{r9y·ˆB;èð€qo_úÐîJFÐv†%÷ƾ92Š«m‡ÝmÒÉKÄs’f¥Éül¥fÜÓ¹_‹³‚{E¶!‘ܬÏÌ’"ãcø ¼W!'ȇΒ%õ€äŠehÙæAmljÃSŠc$Ë_Br+ËKÒrI!­Q¾Vê<ìS:ܯô›ÖÇù[[x³#>Y˜R$·(÷àÐÕˆk3c:±ucy'AÎå1‘KÅg‰v¿&+ý+o¬–§¢l¿2Ïùþã…¢ü%NažÎø!-êjAž®ÛUbýY’Vc\ðQ÷€ÕŠ’yÐÝ·z0·†^£ qFî¶×ÁøHì±mŸ‰öwøD²6¾q\sú¸6 r†„†ˆû <ÜMÁ¨»”«‰u³!ëÓž>ÒØ©þ?–¯¥¹X‡/7g*Ó-z°7‰qûýŠDèÐQ{nª=j±‡Š²¶^˜: *ji HHk]3¢\£Âm§ÝñÙîŒð[ h)3èmBزЮ4õVR—…¥Üc±Y•LöaÎJÓËèPË0?–w üMç$ƒ%9¶õÍ|3^ö{ÌÌö!ÜŽ¡¸×7r§¾|Êjj¨’´6áúÚ˜êÚÞùéô b`s¨w+ª6%à[ÿ>Fßü8EKN·v³÷ ¾_œª¡ø*ªÆÝ„œ9ÿ`HÔðÝ[Y¾~½wgD†¬žÑžùqhìžÛ–5¨ca^6d(ÿ~NBËV_&ôa5›ùÅ¿MÑr¿ËH¾-¾• n7† ©Fy\Ji§r $ˆm·Á~1ί)ÇÑç~­ýöCÒ¤Œ´O²h{¸ .¶‡S2ÙÇñ÷Ê®ýú#Çcdª€ŠjM÷  ÎÁô]RlcâCå<í_5dk ›ÐuI#?å(­îSÂë§o l- ¬ceùÉŒñ·™:´Pñ¼a7dÕE ,RÄb‹"›=h"ŽHô¾&IxØü*§¤4H{«"4þƒ¥eKLDå«>-Â?#Øèåg)î´2íKÓ _âù8@DYpÌíÆ©$%V@¶Σ'o§ëI…{d0EN.¸pÁäOˆn¯†úÕó'Áe„6Ä}¼¬¡çj#ߎd˜²Å§ š9ø`mü²"æõÖ'íÒ÷¼éŽª '_¥#ߨù™>&w„=Qê_´/KØkœZ¤P±áÖEŽnY{«I·!ë_T>5¼¶”%­ &¦ n“üøfÇÊœ’ª„ºæ‰ßÌ\ß™õщW4Å1–mè'á®ñ¡‹ú¦ï¹”>êO²µ,FŒDßÃÝÄñ7Šßì? ›eŸ*™fH½ÑE?Ògû]Š"oçSJÜ  ¹#šbþ d¦«öÔùE§•ðáØ^•¡±'wÉËÛµàdEœ  +‡T»ëÓžÅÔ5u„ °íàUb_0¼ës6L:¹¡aðK6Ò(¹T-غöâ!ç²-Å1×À—-<÷bN51œðÍ<¨s+››O]⺢ÍòbBî8Mdãv?óö^ªç“<ñÃ%qOÅ/Œi>.ñ#~š\eˆðkø*Ôˆ5ÔÝ-L@6qà µÕp8Õ^ÑÈiQ˃À9œCý‘®ûÕ (÷&ôʼn tΰЃJpSã†Ky ¨¾è6ÜvX[àß%˜ƒb>µi<£Hr…š ±áÄHV20¿` Æ¿4Þô¸ïœSÂÆfœ3÷N¿ŠXSk$KÊ?PHÆh` °(èI\­Íwšôeñ{jÕƒæ¾iã4™4çÌ dž\D/ôÜ”Ÿ’ÏfoÆ3®´š0g¶"ÑËÁ,Ï_mö_€ ¨}Õ– 09VLööÁëSå`6ÙÖ—þØÙNÊ]³=nJ°]βð¤’ã¶Öh¹ÅJ=Ó¤ÓŸx< gy”À•±3éËäÛ*<͆zZúç!L‚£l¯ò?s[F{¹¹V9­·¨Ä(<çĪ&:jL£k@Á|T]BñXúä®1ZÝpÅËN¹xvÙ‘(µðò-l'âØÀ²1Dº½u‘p]»ýâý‹…†Ÿ U±:–s²†œAK^ð£)Šòbœß­»f^½°Qä Öžá}ù¬àHz'‹±«j. Ç“¦¾Í2 õät„Xñ[q ;®b¨à¾ô ¡vUÅŸ)Ü—GÖ„šT’‘GJkàò,µô¦Sß”kÃõlÏ%: -ù%é`òé BÊ|³ÍÜÄ!ö±©–½h;d[=zÿPUåùY+›r½û;/žÐ“lÎ~ Ì'°†¹éÜËrg¸àEæc¨fÍ%´ÆÞéR¥±B}ù'™(ðž¾¼ˆ\j¢›ö hJC4šbn©¹Ã˜¶OÞ‚t~dŸB‹¢bõUIÎÆ ¦s2ðöš›Dg«Ÿ,²iÂ*\П-üò«-!y-r²~W²jáGIØ<Q¹uCbûÊÉ‹dÉHÓ£Tc<ؤƒk¡û¬Y­,»N úÜí³?›o]¿>óöÔ:Û‰¾a@ó.\mó`ˆÔ‹~ÞÌÒöÙ‡!o!á„úqy¦êº¡ví$G>•(KL‰ø(¥öšQBéá°å[[7!IáX  ó§>Wú¢øVC‰† nßÀZÏ %ÄŸóÒà(K †ô9‘>¾(¡Ì·õ&:GèQ»È¡ÎgI 0´ ÷NÖz£÷ð?ÉŽýü^YµØI_ZW¤¾†ÌŠ»5>*ø¶Ã0s€Û8”ªÛyxa>Ö\ŽíFÛ†ÁOÐYK6p g´<挪åyZ¹÷´¬ƒ_’nœ©3µ¥‹Hõ‚Æuä•'ý<œQD1œåÌ€9Ѓw8©ëd¶{ÔG}0÷>%Ø5Îã4çÜ7NGàB!Ë rú•o,„{@¯õøF«°äxÄ;Ë®ïÛè#ˆZ¿Þ…#A¼ºǾ_H×,g¿A}Ø›Í*^¦€h^¸{†’DºÃÔó O”ãNùUJ7#´ABá ˆ½­ê4âY9?—6ÕœVÍ0•eŠEëZþ"lã÷=6s|12Œ@¨MG½?zî°Â—5§ÞýÝSLàÝ* :iƒuG«ü”jåV‡ŒÃZoÑËÍÄAwÁ¼KòÖ‡Ï9Þêo]'ˆ4ëÝSt¼Žo_æÖo` ׌<,޾d ) º^_«&°‡˜[ãC¯š@oþ^×X!¨:áßI¶Ô9Ï4ËE¿)Øém=)nŠ‘åÎ\ô^xL¦¡6Wœ[îÍåg^H[‘(›F¯üPÖ‡`Dÿù¶þè3ž¥1NËñÙ]”ájúÍâ»L=éϽÍU„/|Û@ ïÏzÂUNÝ/1ãf;p}RX͉¿à€ù^ ³˜uÞ&ABgr¼Y+`6ä$ÞŽ)¤+6]ÉýÐP8†<¼†¾¯¼0/e?‹ ͒˵F„ƒDž‰e¾¹‹ÊYûõšîSŒ*p~3¶.Ð:Öô=Jþràßl(g&þ)+—xˤWÜ'WfÅç©´|)(uô]U‰L›§Þ#¸Bè_.ü“ÀÔóyñYâäWîÉy¹õ+•oMtKjmÓÊKÕÜm5vÒr²ÔÝ yØÇ1Ô&û`ŸPWuàÇø¡þR|ÕpÃÄ> ÷â#(r®¼v¿qí­.%Ú¹^*6ÉÐèºPÑ’.‚Gä=¯–Éì(í!K?÷dRܳƒ«Ã!Çtö!än1üÔÓh<)•‹óü¸ñ.L½I~ÄY/lñ7PdEÀ3ȼ8•¾€Ö±,iOp] ‘£%V ímÖ±n&þÂçñì¬ ©™Ü‡2mÎTÒ @Žªëþ‚†rÎg$¹ Ñu‚pŒ÷û`í¾À ¬2"‰EéþÄ ÌŠŠ>|¨¯)[ÂXÿ²öýÇOÿн_ŸµNï®ÂÙßðè³øHÎÓÑÔè7)÷Å”üÇiÐw;ì~:yjä'èµÑùjþæ3Е-$¬´¿2lÑ¤Žƒõ¾ê6”[8K§Ìzh[-àX%ºP}Z¡ÁcSÙÁŠ«’ìÏH1 ——íΡ@lg ™ž$ÅèàE«9ÙÆÃÈ=2†‰¤2éˆ/R$énŠãÎê:Gì bÞ‹Åmþ€&Û_àíÊÒ×AÂ4A/eÍÈŸ•]ÁÏ+án¸î€ðuJu›(|m~M8ktj§k&{x¢Ñ/YÓJÚzBÔ€ [ó'o~V †Ù¹‰Òù›ŸZ†oTòc¤èÀˆa"·î6¹]Uš¨¹›l›™Œ qÀžù’¶ÞS¬tõÜÈì'Ba\€\…ò¢À£!ï€E-ü7ÈE©‚PBÙjO›Ž—‚Š \£7˜7m[Ãá²GIÝŒgÏj;wÜ,QÂE#¿àíBÕÚi€—ÅÊl9 I¶ó‰‹GãìrÿnÉÅ´ô9i7œ]dL´à$ÒòHÓêG¡A½&×ZN‘¾Óv”TH‚”û½óR‘¡œ,£|ÉÑ_Æá'ä?çsÚÓºâ< í<|y…\m¾ 寨ý®!uq‘çÇ]F¨{‰Ì)%æÊÄÅßÀ£zpwŸ·ƒ´€µ­? v—x‰ÐùÖ#®p0 ºXKýzEšäs:]s¢N^ä&-4óuÅK—‰£`éêmú#|ƒ_ÒÍ\k iÿF*Ôö15½MþHðI<±.PèŽØ’L9äÔØnÉ=ó´E5›pè6%`»>yÀï~1™—6*ƒ§~»´YCÞó÷a-˜7‰HYm_‡|ö^)×$¥¶ 8g=Ü&Užõ'a¯¢ö 870u‚Z)ö88Œù‡f£R6Ýû«epð38otëå„0L¸Ï¤õ´ ÏŽî±³WHæ¡•äPOã .MI—CLAúàÌs`-ÎÈÃÝF(<à ²·%'Õ5²ÚP‘ßh7òÔ)á¦MðôoFž9:—çíÁ¹ICË"lé ´ ¼QSuŠãÌu@ÍÁùÖVGøxÌ6[½Ù Ú,Û6uñ‡Õªy¦Yo“7£¥±ž";éY{Q›HWÏ=[¼}5Þæ,þi„YüÜ*ü!Á·ÚvMßl±•4þeá³1ÑîqÜÕiIÏÈüxVˆÇ Z^ņbD¶Tv”¬˜K_ ¦Œ‰WºF‚¦ÒŠÖ,E¸‰-§Íû,Ö=äo¹'½“A‘Ð"¡AI—Â#¾í¥?N¸RqèI›V¸¾¿QûôAù?Š~þ ü_Qck¡£óû­Pþ?xú:† endstream endobj 57 0 obj 11821 endobj 53 0 obj 1211 endobj 54 0 obj 11003 endobj 55 0 obj 532 endobj 58 0 obj << /Type /FontDescriptor /Ascent 960 /CapHeight 853 /Descent -341 /Flags 32 /FontBBox [-199 -372 1031 991] /FontName /DWORKW+NimbusRomNo9L-Medi /ItalicAngle 0 /StemV 140 /MaxWidth 1230 /StemH 33 /XHeight 640 /FontFile 56 0 R >> endobj 59 0 obj [ 250 0 0 0 0 500 500 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 0 722 0 667 0 0 1000 0 0 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 0 444 389 333 556 0 722 0 500 ] endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DWORKW+NimbusRomNo9L-Medi /FontDescriptor 58 0 R /Widths 59 0 R /FirstChar 46 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 63 0 obj << /Length 64 0 R /Length1 60 0 R /Length2 61 0 R /Length3 62 0 R /Filter /FlateDecode >> stream xíxUXÛ¶.î—´ñ`Á!Ð@Ð`AšîÆé†¦q— Á]‚Cp'Ü îÁ=8!á°×Úû|ß]ç»Oçå>ܪ—šcÔã—ùP³Øž*#à(=O'˜¯P ¯¥"'gÈ­ ¡k$<„ˆÙØ00ÊW£`q~A ?Pœ˜  €pòDÚZÛ ¥‚@ @ÎÉÉöutrEÁ<U8„†C¶(€ƒ-wA ]x`À_u.$̆tƒAùˆP[ ` ³¶…óÿ –*Ü ÿ; uuúOÊ †ty@à|@÷졊€;x 0«‡2WM°# Àù7ƒÿ‘;Ú:xþûh  0$üŸ¯Àþ¢Æ© ;éÚ PÿÌ«¢ÀœäàÖœy„ù€ÂC°uQ¶õ€AµlQ€ØÁöw\þ0ÅÁÓB¸ØþKNð =[ˆ=æâòï ìAºÐ{På/ðüÿ§Oq×ÛþmåÿÇZÀƒ´‰óP­F!m=&@> ðÁà¿îÿ~4ýÇ8%8µ…[ED`$ìùP ð°x ly`4ùùàÔà Àƒó¾+’ø_~ ø]`¿¨>ĉÿ'yy„À›WPÀ+.úÐY@@ &&âûƒ¡‹zØM`$ô¿q=Œ$€¸"‘08ê¯Íó ñ¿×V¶¾À`0ñâ<"b—–™Žª¡ÉU4lUÿ”-ŠçÄãÄb]vg ù%ˆ %°Ÿ[zªA‘¥ÊˆQà}ŠxÝ››ÎqP3ëaÑ¿&q d ^³O‰Ü™Jƒrw  ®"Ô©åï๲"oôåÏS ª9Ëp׿;Ñ®†³öorzÖkˆ±æ./ÎAiÞzŽ–¨T:ßcò>e–¯ùdHK7Ò>+Á©BÛžÎY’}Ò—B¸qE¼cê?ô+z(~Ööµ°Æ{~Å`{Ö碶á“Åêì}o@ÏK+frÂÀrÆ›ÔuZ€}Gµ6Øóö=A<nÿäë`^ÔÓ¨gûþ¹JÍÇ"ßšF›5SêŽM+Gˆî÷J3žZë÷Ô·}îœK[ ð/æXø6ËyÁµëÏ%¯bW7Á9bC+®¥3Nj8PžK™íÑ{*‘:±õ U  qý²œ·”û/0?ŠpœfgÊýåT¤ÖÞ7×5mdx†Ýßi¯*c¸½è¼NíýVâw üúBž:ZÌ]ðfbÊ÷ƒ`ªNµ× §ìK—¸U&'ðIªÄ¤ŸÎ*ÖSûˆÄ”†Ïœz_na£`¸ºs©ƒŽ²øÞF5FÁˆ"ÎNlóD¯ÒnJ´ŽU¤88tÆ6Æãå÷Ú*ß²òwÇwÄà1Äé|®ˆz˜É¢åSM½„ODóP¯¤Ð­=뇹/$í2(¬š9ÚÑþ24jZ´‰3©t¹Ë¦Â_ú~<Ÿ^©oÁèX5ÉŸ›p1; )®xñÍÜû?™‰¶ëÉmoâO<ï2ìZ„£ÍÝhžžDp1殬ÑMòàqü-D¯^œ÷òn»ý¤ ßG ˆtsÿBª|”yO‘Ë^{õ1:ºø~Õ¦!®¬¦Ö0›±óSÅÍùn-Ñ·À‘9Ýô˜ì^hÅqÏX$ï„ÚHF…G‘>ä‚×]0*ႽݽàåÏõg®~ÈÍß%ºÐÚpÃ÷ÑË­~Äc!´çy¶ÎÁmõg‰_½±“ø°5<ãf¥puÞ1ö§1 by2ío²‘ò‘{ú’`ÆHÞà{~‘¾ôư{âC•WŒp áo9UÖ—š÷¼”j€Î)ìMa" Eã*óN^µ¾¶ÔùÔ‰çh꛹ -žd—V<ñÂf¬³ÿôoÊ ïÀ8R(¸ïHðIÝò23г ç_W‡½Ö‹ä¯ëe®ÆoWÌ… VƒD Áåš¼¹fdƒ&ÃoÓš4ޝ//YÆ„ºžñ®w÷‡E/ßÔ¼Ô•›’¯7e'ŽãÒÚÔ < ØÍHOæ·Fl²ƒk˜Fš™OÍú{±FKÁÜ=˩ɞí{R]š³÷)Å÷ý蹕¯É@ùÜjvï`ÇüGÝç3qî8"î”vÄvç‰tìµ¼W Ó[È\k "ÍþY~>¼…ËÊêßÍñD/cjBw³íO?&ò)’ˆ>+ÊÏVzÌ:Bz#ËŽ$0˜jÛË4^Qÿíå3qßV¾llãéÕ?Å_Þó¦‰ú­ñUL¢èÁ»A!ÃÅatg/¯¥#½ìûgÃ;Š7-‰õs_ÝÂòÅü_Ð+ ÷±±I’ÿ21fñ¶£šº­ƒ‰eÄóçÌA"™&dÎ|©*š¹S‘Îð«hm±õ•äwdþSsf˜ Œp7Ç88²¿æSh¦¯Igy/aÊ)t£û>ÍB}£ ‡§ˆ`Ša†NtÖ’I/І³‚P4uMjcíÇt|šIîà9רb£"¦—³ ^ÅåÁ€­€Çó¢èkóµ»%'+u"G¬µñè cúwÊi8îy§Q¸ÖL½ ú„/dq£v_ƒÂá¾,ºšm´æ}¯z'€¼G *…µG>\c”I™RÒqªé—&q¡ÊP³JÖs8Æü M\@P¦'oS â†LlÚ,GUëÝ&Y Ȉí $Qxuu9¬<ùømYÏ…Qts~ò(ûþ =þ:Qúü‡½°N2B-W·i7mªÿ>Ü D}?ôˆXvÖË­•hýqß¾çTÅõ{Ñ,¿ñ£Åo°Áèå8—6tõ Ë Ó™¢{~ ߀¾Õ¿t×àøÃƒ€d?2$Õ¯„iIÞ¼L7¾µó¦Ó†ZLwç$,’eÊ‚ù­4Æßæ, °’˜ôRÂ"w{Ë•No M_Ù„¹s—›U9Z“˜´`ڞƥÍbœrÔ»‡ÍLY_Œ[PÏ€^a3®ÅOúÉÑ÷jšÚQœn«sZÎŽAfLF—œÒ‹2¸esº‡ƒK¾§^ŒfSls)öG͢γ‹nÞï26дDZ?‰wyxb½cW"AîÑÉOš•º–ÎìjHŸ$§¸š\KʘÅK J,Ô<úi$3¡÷µ3ðžHô)ôËrUQ23oyëÕª„ph°N5m¦ãýê`˜ ›ã^Fœr­(¯&‘’,üùÊa^¡TÒ¹VR%óçe m²è…ô†ç°yé´GÛGãþÑE~®Õ:~¼1ÖÆ þSt‹Å7ª›û=DHúoq(¿‚8t…‘;Žå·ƒW<;Ž•Ó<‘{/ÂiŠ¡oÄ`Þ[u×ìö© *7P%X-L'̉rÚD¯¦…BC°s²[B>A([YçˆöÂͨ6|˸´ª:fº9:·–kµ>}Þݲô:;O÷ZÀ8¡Î Òhkð+ô3|³OüíÚšÙ¾¶®Ê\nuöÅÎȳ·z¯ŽL‡Í"À7.ò#Xënƒu/Š:Zð÷ðP‡(Æè¤™v¬ÕÑÐYºëÔ~ ÂêE”Iø"H3­ŽTÖ}±Ó]1hú?â#]!±]ód©-d>7×”Κª8¤dÉbÒm«­ë6Žˆ-4eÂK˜êgÏé#F·ŠñðèÛGf˜ÄîT‰–땘õ”V¨{OºÞ(Ŷx~Wã­âz«¼æ:—¼7ãBJ[o~ ¢ŸªÏDQ¢SNƒ›„]ÕKý1 übÓägøŸ8¸*—ååSý©¸Ü.A˜ø#-´ýŒ˜qðëtà–U"6ñêo,"0ë%±zxŒ+;Ï5&mìB®"–¨¸q×xm øÃ#3\ã’ñ„ñ)ïúdˆ2¦d‘5’i†I6¥d%çsÖ8RñgÙnëô :fôJ~Áœ¿¡vSqCÁ„_¾%Ñ·q ›ð'K!ª¢•@‚ÍîóÝtmkÏËÌÒêDl½ÍR¤aˆf+3“™þr@YùG3áI4©á?€<Ž\ZŸ¢I¿?A /uÅóÌupËå<¾‚¿oPš¸g/ÖíXçÃQµ>–ëÈNM¼®öÓ|¢Ü±qßâ1Õ8Ž)/w¡W/Wri‡+†¬â2R.„ RÓU_ó%Üo#™“r$\N·Ü¨-­Ùm'øMd¼Cètœ³NLõ~øU ¿gáÞ]ž^Šò4Ñ•½’H”ìbš®¨vÑ9"Ú•¯àa´_rWšæ¦ÚY ,á˜Ænð¢/˜-¯co.äl Ä3Ue¦Þ0·Çñä-Õ<®±zú%ãÀ¿}ë݉ã‘%GÁZf Tå}rh#¶‰|Q+¡ÉëI¼ïp2*)WvÉÆ¡ð+Ú ª5¡1À]$nÀ¼ÏiD¨ o_ió¢ìßt±rSÈ6ÿ|HzD&Éó-r ÍÛgØ2§$—ΰw!‰þuLS²ø¨}¸ã|Òç,Ò \×wñÉیۿV¾2'ÙLâ>=@~m/|ä)ë¹¢Brý"TÒÜXò˜×pD͇à™Nߙ鹎å¸dź÷ÊÎ^·4 ƒOV“Gb9—õÈÜdà—ž‘íc]é_aª7<ÃßâRŠ}ZdÑØø¼KªÞúÑWdľÅ)cL§ãì9u‹Y¶móÂÜ„oj<èFyÖ¡°´öZ;(2¼ú‚ÓGƒaöÀ Å'Ã}à” Ë ì¸RAïÙÄè°Mµ¥7tã¶S•Ú6cš†Y¥m”ôÏê›6!Ø2Ët×•Ž£šƒ †wíxªë#ƒ³ú§jMé_×Y6c;ú{rKû8 ›G!,Ø¥#íÎÌä¿@þ\å()—xL¥_L³Kâg¬FG¬\(ŸäwŸÈá0p¾ ýéêD×ڊõì€×êâ¬ÚKþDÿèä Œ`ç±TF, û3ß'ˆ`1ÝYK„ÇŽéë~ÄÈW…¦f^ÉáD‹ˆO-š)ÀAÖ8:}\DZ»¬ü©ÛxA5TéU6·ãEšqž÷r‚7ù.bW¸ó5¬üBhàÝ‚mÚ1ˆŸ¼–.Á4N/ÿS!ä—Šà Ľs¬Z>]iÓÄ šÔÜ|uÙúüTŒwÏðq?åO´T,"Vc¨5Ù ˜•\ÈG¸‘­t²|΂µDOŽT¨ Ž¥×P> 0©ŽãþXíh(›ñXÚ¦ÇVügÝŽWY$ÐüA°Ù#­¿cëöšé³Õ|QK¨ö~έ ï½³¯/ ÆëJÙ,ê•­çS{ÔiJŸÃDZzŠ‘h¦Ó6-ƒ†k_]FÌ¿›£VK’èªeê¡—’– ÇÎ%éêçÿŽŽå›7œ, qèõνþw÷‹jò=Ÿ/±—¨Š ±J,f;L¬í užìÔÓúž\qê6ŽáEÐYnºQî¸ß¸ä7·îö­Lû|^Xѧ£›6rSF¬gÖ¼™¬h½Ç°šàœ3ºÐåò¨8ʉÛwþøkµ™P[B­pùD‹zEdü·„µÍFy×jl4‰7û…8cò«SûAUé¥c ÞA‹Ÿå†/6£B}»ó‚è¼€¸¸FIR£Y¦¯ ¥7B˜½™Ô Ë{¨ÇÇð³^|½†Y½/qôˆ‡<ˆž_]5]å7#õH†uògi+¤ÿZ‡öË×Û7EZljϧ¬²ìg gϿ㧹±šÒ…'j°l?÷WVÜÏt`»**²Ó2¡]ÓA¤í± BÜz}¯F¸œ\ˆä†Ë4oíF0u[ õ¨ä¦™wÓ]â(B“ÊMÏ bn lÕˆ¯§BA„]ÖŸ: D2^GÇ6´´÷¥%–i]Tæ\¯Ùˆ4V}ßbD¦^6Y—ö%ólGcoU¬Ló3骼L'¥¾Â*Â{Ä"Kf§x"â-³&‚*ª’ÀþµoHŒtþB“j ˜­$ý&Ws3Aêv¶CŽ{ÓÄüÑ6¤÷ÔÞühdpˆ0ƒ ‡Â­4„ä£B\qKúÄgŽŒÐÀ¯w”ýR ¤“ýÏO<¡•Yt¥öj‰QÞ…Óü[fÐQþú¡æ Z¬3Úø[U’{kãÑ_&‹ÏÅK$<­ä±®S—Ê#~KssåÅUWš¯’Z†bk@íç܇@ Z‹¤†¿IšZúS¿Úã«‚<%úWáŠ"5ÐÔƒ æVÉn÷å£=â…Úòßeý!Èr²ÃjcpÛûR3m “.¢¡ä%f7(Øí„Ãè¯ýÄüDidY.Q Xº_ÅZ yúÌã"R oÏ:ªÍw^’ú$UYáHE’ßA9! ‚ΡÛVÉ‘AͤäDš;Z÷¾&ø¾Ä›ý6˜Ò³6íœ /6ù~¿–ÿjÿr³›l̤TNfÚp;aí«ÄÂoy¾€u>!ì=c˜ ²>4 ³É­>Ó"¥ÌÑ´¨¬£«ˆÑqÿQv1ðçΔ'yõ᫹o,Œ€ö=…jˆ“ÏîHׂ÷Ë–ÝWÔÈ¡÷Ç„³8ÇEB“ù,ö¥umAsmXËhèF=ÔÏiƒþ¬nÞÛå,(=ÏÖÑÑÂícUè²Î§êéM;f:,TPGEù7鵓nÔk MçP¤¯¤V®…<ûYVøLZ œ@•ß¡…YÚ¡Gxp?¶Î\ˆ å6$ î­dλb×¾´…õÙ¶Ù§x‡~Ä¿ÆÆÐ»JÏY ²è— sú\¿ÌãànQ,\ÏS‘ 5 )¯-ðþ1\òUÚFÉ]ÐÁWåìÚ•Ib^#Êr.KqØbïz5ÀÑïPîÞ3'3¢ö `C€Cà1M´Þ±lgb#gãË0¦†Ð€%6ÿhn¦ø‘.ßÑö­{îÅË÷E§õnÓÁò‘¡—@s‡Ë•¦:ŸZ¡‚޵°µú;ÞDÖН(&$KçFz^Ùèµ9YtB¦kÝ,ƒZ2Â$!HáœpoÜgT}ØÈå¬îeK!®¬Û êµã¡Ž˜¾çKÜÇ·³gá!h-¶‹ÂSÙ_êÅÆ”°§lÜŽ=-üñî·Ÿf.íXUuýèÞ ȱ3É Bs+ZÓÉè»û"ö" ‹"¢—A©ëèõ»Ry³ÜâGǼ¨il"‰p@ÜÚJŸémúâ’Õ8âÊ Z”P䟫cp£Ñ ëâl0Åý–Es¯[^î—] îa€¸n+LŒH±¤ ¶Ðâ÷(7Z¥f­ÕÐc5q÷VCᘈ‚ß»ÌÔJ9¬¦š.ëò„s7{Ž)?T–ƒÕ¬3RöR©š?T\zòdú<7e¬VÈuΛ>´r«›¡S‚HîèH½>{[›äaV‰Ðb*j iµ6à°@ôcÒ*Ja~µ…ÂæÔ×î= ƒOLX¡œ¬µI"ùý­2ßO”ù…Èï+è+#šÛ1Oè{•=¤Éös7c>oêsÖãöÖ‚Šõ Å#í„§Å«MÖ€r…ººå>¿cSüVpÄAþ&ɳÆ+þnTªìÕåÕ¨q.ÀnL©2q쮌'CÄdP½8ߟ `{Tèv¹¦m³|<4™hzx‹/%˜CfAÝE88 v•GÜÌÍÀ³e¾ØÙjÊ„¾<«hŸK‰aÙºÇYjݪ†¤ž¾¼Þá^ äù•JÈés$Ú±S:’/žÐä?”Ï©ˆÕh2[øÏ2Ӹȋƒ{EÇôëÑÀüèÙ\GÂŒH6”_x«’ïÊ´=&eÏ¿;½ÔÎPÐ<™-„ºiÊ›¹õ³ìµYéœÔRàuzÅÞ¹ê)YwºíFF­í üðSÅüzŒxVK( À¥“WÆþ¢¶ãmTi?ÖÏ„>k«íÞ=ÁÕ­§N*‰÷@õ¹ÀtÆp¡ü £ûCE#gð]‚´?v\áã;>Å¥å?®ï¶B„ïˆ4;#úÛÛPÒóæ„OZ#~ÈnL|+úÀ„§ÀžC=)êg @C>ØxŠM" LêIô:¯=. ¯‹uï VϺVš8îiƒ.îQ¢1OcûÜ›ÙÇÖ¯ÂçÕ˜Jø¶ø—òo†ƒ§†«v²ž‹Ü_Ë4}~¸+ÿ´ ½ÆcNGD«#A­Êçµ]²¥å–²ºs ¡­KŠ’¤õût ˜TJ¶µAQ;²¾[dÓ»7Iï5·•èâwY{F•ãÚÐHíSu­’ân4q[ô#Ž:݃ROFüÐe·ÔB‹ß˜ûtRгyãÍ‚(VKëIk¤˜¾„Aêêó›Fü¸öº"ý;¿ŶyÓ> endobj 66 0 obj [ 444 ] endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BPGAAX+CMSY10 /FontDescriptor 65 0 R /Widths 66 0 R /FirstChar 164 /LastChar 164 /Encoding /MacRomanEncoding >> endobj 70 0 obj << /Length 71 0 R /Length1 67 0 R /Length2 68 0 R /Length3 69 0 R /Filter /FlateDecode >> stream xí»UT\ÝÚ`MpîNáîîÁƒ†àîîP¸»»‡àîîîîîÜÝ¡9çô÷¦ûëÑW}ó_üU75—ì=ŸgɵÇÚdDb6ÖŠ®¶FLtLôŒÜeUE!a!Y3+}G ¼•¬ —4¼‘‰#೚ žŒLØÞHÏÁÌÆZDÏÁˆÀÅÀÌÈÀÈO¶±uµ731u332²mm->K­lŒìiÖô=kC€™`if`d ´±Òô,-ÿîØìŒ éᙘ†f}#3kx†9JXÛ¸þSlèhû_UNFöÀOå¿ô¨>/¡ghcmé 042þìçhi)«ge üO<€Ï€ô¬Ÿ1¤ÿ ÊRÏþÿè£geféúëõß[«ý;dJk=[S‡ÿ^o3s12”3s00ëYþc¦dmhdoifm$g4ûW:tLŒŒÿ­NÑÔÌÀÂÚ°ý§Êè3}ÿ-ÂÏÌüÛ•áÿ>pÿN…œžÙÆð?ïò_ãøLõ¿sõy%={3€#=##ãgËÏï??µþÛ­E­ l ͬMÌlì={{=×ÏæLŸÄpg˜}è0rù ›ÞÚÆáó€Ï™à 0¶±‡ÿ×ø1ÿUòo`0ˆþ,±€Àðý`0Hüìé€À ûpäþ.ƒÂ?ðƒâ_útÐûKŸúéÓÂà/}jþ¥O£¿ô)òïØþÖ§‰ÉߺOÓ¿ôébö1º˜ÿ¥O‹¿ôébù—>]¬þÒ§‹õ_út±ùKŸ.¶éÓÅî/}ºØÿ¥Oà?Äòéâð—>]ÿÒ§‹Ó_útqþKŸ..éÓÅõ/ý+/Ãeù”±±þ›6–Oç¿ê,ŸB¦öF[°~JÛ8þufýô26sú_Z|ª?'ìM#ÖO9 ‘“Ñßô°~ þg‰þÓæSÒÖÈÞÌæïx²~šØX~.Â}ÊØXYý¬ŸºvŽ6F–FÆ3Åú)ýïRC}Ëÿl~ÿu…ÏûOÍÿÖ…í3SW[ÓÿE’í3ŒÏ¥­ü;UØ>#±Õ³7²þßû~FóïÒÿv¯Ïþmñ·øÿÜ%„„l\îtLìœ:fN&ÀçvÃàbfõü¿-k‡ÏÝZÏÞðŸuþ¹„a í?¥þ½9*ÃÿO66ûÜëŒ\Œ à—l xÌS~ÿr¨ÂÌQm•nÎ`‡¶¥uñ#1)yŒQ Š6xb†2„µ˜_!EM“ Íu¿ ²¡2<\ˆ™‹Ì´”Ôî!QzDaú’úoY$…JéŠý²öU Ù0’K#¬³¾±i* ]'/æVR–ÆCÙmÍ[u‚<Œ¤½dölVÁƒÏßÝ\K¥¸+Zé;$ãˆ{ž£ô‰‘tû´­æ Ûë;!õ™§óÌø]íÒxúøîX bò鯥o•ÊzPï«ûZHc]WÙAÉ”}õ”¨1Lé¹ÙÁ;{ÓUp £±84.|úœäwÖoÍko{ àEº0&üDS¦¶Ïo†;–v„ŠÖ}±ß”ìöTIÿ¢Á ^Iôƒ§SÝu5KÐ(ÑB½·{ª|å¾›‹M…úº>mÐO³6Ó~F'²ç;¾“W‹‚HJTÕþ&ñ%7Å qÛRTÑÐÅùûe™ˆÕ Œ:q¼ ƒc³Ä«þ?b˜À§¹3hÓ³õŽï‘n» 0ÝdÏÕ4QbÌ7üâE¸–[Ó¯dþFÐ:H!äš\òü‚ï51Çö?Å¢Pˆœ¬g¤e¯Ð«¢,{¥éB¹&6‡ÊÊ!wÀ'sú˜¢ê”ˆNªÜפ×ϯ<ŸŠ·Y\m„Ûë^Übú’ "ïîm³—^5oý‰‡¿;cÛlµóâÝŸì¶¢H„JîaYhŒÙñ…°úÄf´K?õkPbÚqöÓE%@þŒ“Þ@{*عþS‰*ä¯÷FðÄî¡òò•ø ü^50¢ÃUÛ+àº)¶‡'™Pçqðjˆa]"(Æ6Ò`o'iE¬VOcõB×W8úÓ€^iRcïH4Wž ¹_îv…7sè1PíIXÝrêZÑsšCm}-K•Pç—žË[œ)¡ÃȬ½g£&þåľ,E£Ž^O‹“³ jÙoÍúå)>èËû„÷tÿH%É*qA—&ø9Àóåf¶âL¼Baì ã(=6±×Ÿ*L«éÀi}½?©}n)öt,m.æw £&cº».u@Òcø–VO ù+ ¼ûÜ!ã’§-½Jó(ßçi2c¼£Ñ΢¿”"ß——¨kÀ’‹*3›õ–œa1ÚªÄQz–bSmRÝu*ëØ»ƒÀÍÚò=ËTKéúÎ]F9µhêDl‰:¢5ä~¥'ºÃìX ^õ=§«ÌÞ¢œÈ’x›>œï¨@æß*k¤§¾Ç–W¥Žy±Ï¾·>Ü–0*H®K¹™ìûÔ À…èRW&{uмK÷7ŸTâïN§ ìö†Ñ”‰¹’Ñ€ù5‹ag68ÑlêÏDxå,ÄÅò{´%U‚ü<,*cØmýÜ"þßK.õâ$fv@þ¼._1€ú·âyÇï“Ø[k¼5ªæöùûhÕp¹+JjLÊîµô#ŽÛíYÞ;Ò’|S'©âÖ¤%}¢6™_Ež¹´ÀO¸ø$ß`ƒ'Üt-OÚ¦ÄaFG]Yòi žAŽÃ*èÆlGß:°}(\KáV§Y4:æs¿xWû6ÜUÝ ]u5Ø*L¡8©*ï›õJ»V ‰3³8Ö~i0§ÆJR”}`«àŠ®j›ÐcQá¯p¶HÐ-¢´À*p`Rò Çú$Å»ŽfìK¯Ü&7…ß`Ê4÷k˜ÆÜ$ÕS݆#Ž»«çûôÕ辋ƒµ¾ÒB 5î×2ca Ì8æãã᪇¯Øoyë,Ò„Q/Fk]ë3Õ§hÑO h±™‡Bg{ý™_Q½äßJý箳ò²Qó“.Ùðµ×s̽q ƒ¸…îϯªQ¿GHðc3D|=ó¥È]]ßÐ tíþæš3_eî«÷ƒ¦zôØ(ܤهË&ÛÊt_«âèÑGQRì¹ZBq~ËWK©cÆÊ ¬mš}­!cä!ÜžaÁÝ6꛼¤]ÃýÉ4b¡ìƒxNñ€÷ž _Hb.ñõ» 2PGî.ܾ¿Èlz`ëY°QÔ'Áùõ:s†˜h 3–ª Š^a´×£Wå–0ß• þ@‹¢?ó!ÏûÍyé•è&²«剔T¸åw ¹å[zv•2Ñ,O±2~.ÆÇoŵ• ÷ïú‰–,]F+JÀþŠ¿)_ÅýddÇœff¸Ý­A£2—%R£'ÏîP¢Æ˜/Ž Rí !ϨY:³~Ò û{´²¸TAVpPÿÓù›iL¨KÇÆ<µlÎ\¬SÝÊ3±Õ“U•/Ì"=ÚR`ôçú¦LeOU{m`­9W¯$÷oÊ“8Ïï $²ë c/åèömq˜š·Œ‚_ÉAa?FɰÜŠËsãÝÍ™… ¥¡½ÛÈÅýÖˆ8Ù·VpÍyT{ô+x\Àª,{ñ\bS¦uº×*°"ï¨Pl·Ÿö@ø09 ÆjÇð…e¹uÉf®\‰ëÜI¯­úÃr+€›,ÞbOÌàAVŒ nôfÓõ螪;(‚‹¦W‚%·Œ8^É/¼*iÏÝõй¼—’ œO·»ürzü_O1hõGÕ°”èD9ó@b¥2’vƒ¢7hqV“ôÐ v½lõ$KL[n/×¹ðµöø•p6ä‘1žº„ƒB†˜Ço°†•篖#–Å:Ëós¾8"%¼DÀ—›¼S1"7 R‡¥4K¾¹œz)œ;“jpñƒ—ILýâ8ƒ¨†¹¡§þµò‹>‹›‚¼;XgCÉPNt,"± †'‚ <ÚQӮݲ|TU½$ ÷ìœ)P¼q<,w]q ^š<¯f¸Ÿ«$^Ë+LD²GÖ¡Ù`Ìdƒ±L½ ‚ë ê ‹ åÁº«‰ˆ®»iR³¥.Ë}Àyàýí9°L"éøf:þAÝ5/&0;$9 ïM= O¬`»óö'͉=CΗy&´GÑÉtúæÍ!t–ß“ÅÒõ»éÊœOÄbÚur•Í•'Ã2:L¼á¥; ¾\‚’3ƒ ™ÉvÈÓ”Šp i÷qù<â\›Á ò&¸Õ/¦©åOäð.ò~4a¬F½¯îXæú­ªt1¹ŽÜÌ¥ZqX8•™Í2qt zû£ÎÓLWòºê;œð½½‰QÏ$Ì“w/½Ä­-+îYvV‚Ú(³]~±¿P„¼ö,ÊåA½'ªƒ]y=‹ÎÁÖ‹Òµ\,›CðËIÖg£}°„…•é pÖÄÌ‚Ætá›q,7òÊ™3"á×[¯©gl¦oc?ÆHڃݷ®>q«#@h{lûq°|–# Í1s¢°vh‚DÚ)^ÌR·~áê–,N¡(=ìÇà þ½¶íõ a¿\ $e´â}¹¡[©ñHnªLS¡sìa:9¶u7Qµ\}|â€ÝGñÕvi"¡Žýþ[·ªý\ÓpuËwa,*ó4Z.ý®ûcÏéT0“o§Ð½^ͼ&+âš­“ÀBHÖÖ+ϯ{ËšzÚvßÊmÍRæÂéK•ð‹ö:ów³ÎÞÎR4 êN¸pàî³P²§JË ®hñW aï;—i«&Ç ß ¡kÓ“+v?î|)ÖZ꺿J^¿iEç~«Ù·ú³KŒõ&2ƒØ#e¸–Rêá÷Ú¯/¥ð#¬C®'d×]Ú¬¦*ü®WD©:ïâ¨óÙ²Ð8ñ!6›1æÂ•È7® Ø*ô½«Z¨›A±Ó78´TEk§ú&£ ?³®Jªôó‘Ø=¿Q‡sWPâØF*´œÊN¼$¢9¤š½%Ù|e/g`«É¦ëäÕF5´ðÅš7‰ÃëÅ[¤™—ÈÀ!  ö-Y^ÎêK´b—MÊ»ø-}Õm<õEÛZ$m“ÍD8eèáúñ ƒWwˆµû²Ä}a[fYvM¾Ÿð·œÙ¡ÄœMPæ/ÆýM<Ø Ž»õõ5á ¬/txþR9á¶‹–‚P^#òœ„ ¦ÀpØN7ëV2*ùXþR Ô¢=ƒ ÆsOV  jÁx©O¦ ΋?8-eâç½omS„ô¤+ÿªëy¼Ä·_Jûq«îËibC- Úå.ù6R<ÂêŠÑBD Hfgü±„kÆÏ[¼ ïï[F½”íøEÚ«´:{¿Eé))ÍÅ_~‡•ëŒÊ(?GÀšŽÖà~€"‚ˆYцQ ³×‹ùáWJÕÞ”a+müu£»T¿ÔÎïfÇ­äZD];-Á•zÌŒ*vÉ÷`x¯>œœvÚ‚ˆ ÕŒq/PýzÛšgå-m2"FÜà1ÆüsŽH¼8 ¥IŸø8ižDp6Ãn/ú²âÇ«¡´2µ¢0@Ee4¯n³²Q gγr{nbOI8¹î…|4¯ó4Nè™?ýNú1=ºH±ÇÇwÊ!2ó€`.M6Y*”z:,1•,I‹>¶“¶„†,![QD³­aa1”É3¯1ò9æ¢çuÿiD'è(ôU›ê©Ôï~eµ8¥xÜÊ÷#ÓxzK#öiÿiRÊQÏ2µ¬1¸˜1@)Úµ"éˆ$•©÷|sÚçóOS¹tnácC4s†¢¢b9¢È ±ùu1H¹ÙxÝ5W¾´‚¥%…è§á¼œ›Ôë r÷½×ª˜ªd¬¼4óI “B'"¾ñ`IG»³ÙødÂ%Ý,ßfOq£Ú0ús+ÂIœ3%WpU¿K­y^´Ðã:afi¦­JIþÑ0 ¡WŠ¡- ë\PVx„˜K0×Ê1Ò¦_8t+GLúIÞ ¾cñ|Åïd¦Ÿz‡Ðö€ÞéÃ+­ÃObe ^;ç»3}°jv•Ö Gé„4èòЭýá,MZ•X4Èv‹UE6¡$ÖM‰jùŒH"-ñ$âÞ8ÇÛ¿ãc¶/àRäË#œ´DZ†ÈI°Ú`P’¯ž3lôÃo¬òX†2÷Xϯ•ƒ½È¤Ò‹¦U5qH•”ïå%,å?Îþ8ÇТŒ²]38äp**ô$~2aáñ-¶H,—Fèãv2 Hž= ô]˜„ª ›ðó,Q¶gGC’î"b—þ,ÚõÔFÕšökþÊ)A· æJÐwq³1±ôŒvO×ÅnÂg¦4qjß¡5´2\2ɈÛ6Ôð2xšäÕЮ4ùߨÖèÊu¬43N±øëJÉêÓ„DØ*4g䘎4¹_àŒ6ЗÅýb  N³³ëë¼1¢—;þÞó¯n)y¹Ük‰Ž¢WhPÕ:ah«xáé—“ÌÁÛºÓ)å·?lx ÚÜdóS©sóô);Þqb6ÄKP©Ã}%÷’þ@Å~|ÿmzŒ3VLiÍ7âÔ”Z­»(Qcj©ªã<–.¦ìÈÔÊz›Ä>³ÏØ9?›»AO,ЂußKHÆš0ç®üîF‘ØýußšŽ§ƒf˜ƒã#ƒ=¡–s}…\b½C̵œ(˜ç0Ѐdg$âãÇé_~»í¬­uЕò™ÕÚ½“–«–©¿dØÉÆOÌð&ÓKU¶Îx3!òÈFâKÚ|æ(ìiçׯ…dXÇÊáŸüQa)©Ÿhp&‹&aëü eÌÐsˆÖú­DÔb :úÙÚ{þã-~È£Ý}Ãn6y¹!ìËÂ(œa ~gøkïX+Û/5¹Q|ùÊËZ>›¬@›äJ2'ã¹OZªq60’‰àšK– `4x|¸¥Üv¸ánÐyÞRSÖßÈÆ¦Ë—ŠÂÛ¸oFûÜéúè^Ø,µäé1Wb+ÁYÅàûºzå—I©zñb0ÕˆÕ›­—ÖnÔÎÒ%•öÍ®fQˆõm"‰Šká™*{E&PW\—ƒ Äz^2<‚µÂÚݱ5–Ï›ííEZh—#tÑ¥ì –.‹D–’ Á6¼HE :»iV†2%wÃsÁƒÑ¼ÜGŠ‹œûó”H,}wå<‚ÍýÆCà×zY5 €Â901/»‘7£o»PD*ú…±Ã#!Œ¡wx¸ î$‡÷ÝP¹¶‚áBj)Ap öšWÞ OQ^YÔi%NVµ´¹Ï8У8b¡Ãâuì Í ;Gœ2$=²”¼Óüø³OnÚ0a­Lñ™ž+?ª€ÕÉîÂë%h†^…·r¯†Q½Ñv°ç:^FèµÞ¢')½õå­lV}uŠ$L#íüÙïþÎJÃí¡ü듾ó¥ÃVÊÙCßúWëÖ ú°ã¥½'•¨Çxg,—¸C\H Ü"‡?GoM!©Œ÷ÞIþ´ÉÇÈŸþÂ6fU$,µÚ0[­–ÏǣӤ¡¤6Wqn$e&.2^ÌçñT}ý_öuÒ縬1TÝOh✄‡” ²\¡}ié¡tç]Í•¿ˆ ôc\Ò<Ù O=L÷àWœo…bD£r¡ µ½> ,Z•«r³(Jw+Ü3T¢2ÀíPdÁ©ÖîõõZi±è3eŠlê£ò²0+ÂÂÏlÆ2Gþm¤îÕº¿ŒA,!^¾Ñ/[‚ª#ÊHü†Ç¼×‹Ý[Rk!²Ž»_Å*wƒ¿3±¸‰6 5,^£#›B„Í·F`؜󣥔•ÒÛó-1¡‰KÒ¦o9\D"Œžîíw¿WþÁéé÷ñR=ý«ä#tIÞ›ì;4¡V«@®1¥l€=ÔÌÅ׿[ŽÀ®TM固&.áä¦ïç?1VÝÉõ¤ }ç¹ÕĨcHW÷Œù ¬si§ÄH‰yG%œMÝ‘rV ~nOT”:ÕZ[ŒŽþØÌ-‘9¦l¼1Œ†áÜVls­¾tV´RÉ6OÚz—Áll„$'j÷lžëNQKâ“"pݶS@±–¾üÀþ|@ISZº­Í*áÒ v##1 6U“eÖŽždQÎVŸ“Ñ #ù’E,Æ{E½xÌRIÅë…ÆsŒúû bªÞñà ïX˜¹ý”Ìbxá(YÁÁ^rSÒ€/•Ìù•”÷Ø3ûæ´å0Zp¿¾…–›É¨˜ÞN®Ÿ#¦ºˆþ{«jØ6Ö»¤~B‚U¶_Ò›N­ÆM~Ñóoð÷ýWÑy+ ­Í,ÇsHûç_eyDÅQL^ýY“°ÝIoô:€Ž}iWÔRܽu¾,B«ñ‹ŽŽoo6‡"®ÌÕ}\~£óo+jP¹{« -ƒî©’¥„>ÑR27m¨KÃo¯Ú£™…š ø«Ôã\™è¼#°¨ê/‹š4‰Vc׫$Q)?BRAâ=HµGiRAÓàX Gy[µbx#¿1~3FÖÀ{ƒ»ÌqöaÂ¥ÀP™„!–ÃÌ{¸À2žÅ‹¡‚ή¦œ :µÑ“‚“ëÛÌ-šžow*³¶+ßú½]U ¡ÅH¡µ´/à­ùx+`ÚCîEáLœöRö­qgéeêÆ òåîöŒq‘;¼¨m`¶…PQÏòríhvKŒ}<º,àÔ†›dŠB«µ:V²s;ìjRU‹äùü߀ú‚éM;|ô˨ÍG̯ó¥ÝfŠ;Âp®í©Å‚Øî]ÈäÂàÍ£F]nîÌ*zD1 YOܹ _“_xÿhåß_JåIvy½†9W©CΪó³hÒkøßì«}?0:ÀΛeجÁÆÛØ®}OLäŒ8][Â*««¹ãX5DæèhuÁÊ®O€Ë£h‡8°ëÙ“-5ëBŒÊåÞTÓ—”=›ÅuÐ\f$cå1`ÕcFüb˜9åÆüâó¨í«Žî~!Ä‚n $ËV¾;þ4£Änç5c¹9¿]±½½¹˜ù3柙 ´‹k½‰O|ÑEc„U–Y°ã‘Y}Ê»ÞpPÉiyXÇŽ0bÀ൱» h/éÿ’·ÀÔ©—(RÅXg‹Í¡I vXÌ/FÄ\°Ì=GÏè‡)üåœ2 ùèTeŽy8J’†ØÊ¢lÉsâ.Fiœæ5!³ b("¤, ôj¿Óž‰Ënû°äÂΣy"ç¦Þ/èš•»p™åǦÅx…ÆÊ†«oMG(¤ EDU•)mÞM÷Þº•Û¿{7ßö'ÿr×Ý:LLxöá,Ë@”Ñ~]3ez‹kçÀh¿|sÛ¢¿÷¨ÇFdGgþY­2fNVJD{7‡ÃÀçg‡JZ¾íÕz¸1Ÿ­ëQBJ÷Jþk77Ö{/£>Úø¨Û›sاšêuÓ~oìË9wýË¿¤D‘ªÁ¯ël½d$f“ ›òêÏý¢—|©Db’ôô˜†xîk˜‹KÆ{îI(•“t¨ E+&·Ó™ˆ ½ü]ÙBjÃÊý|9ÏeV+F뮡 [U·q ë!éOZgÔ8&Š®Êa÷×è/c¦c÷Îàrxz¿¸'³^Ѐ ý ^X+«»7ie@å)&u =¥ÝI¢š{ò‘@z‹‚àh°é6‰}u¬ñËX¢õ%ê¯3ZÞ†CB÷žëÀºÅUǪëVŠßRÅVVïDx†¤ºÛª1Þëûë½á³ÏTî‹Wýú@( qÌËG•‚É ðw6¿?Jú‰‘%ÕØ'[ŸVVtƒZ¹¤1âb|Ü^8Ÿ_Ñé…¤§º¸Âá!v`‰-"U6„ÏÂlÆW³Á šòD¸9x#íã…yÓ¼ãv8Ò‘»ç)©s¿äíP5ý ®qtà(ºÿEPÇ˱eL¯ñ+ °ñÇ+ߢà‰ë4†d‹2ï˜úœöó82%Áó ÃdJÒ¶®¾²u6_€sj:y¿¤i6Ùà`ÐÊýåžYC†s—À#¥ðE¼ ‰_qI:YŠ˜|TÁq%¤ÅDŒÌAJ ü»üSCaÒx‡,d6©NSHK]ò2‚ã†`<)ÌKç0AT[RiÁÔÆ¸ ™–ÎpíQägû‹pyw«uÒ~-âß…åí‡*¡£”÷#…”¬ý"|?j¢G¦B3sü¥øÅþìÕRMŸ=b¦AÚèó8!Qˆàþ죀¬XýQ„øVø‹½²–À;âgÜ w.Cíû?x&f›, #ð§Ã¤«±™°Z;<‘Bt¯¢6¢„üD¢XˆÇÎ`¶àÇv“*Vc¹N]I˜Õû9˜+!õ¸GÚBÔ‹Uï Ù· \·Çm´­”ýÁ$G‹ÕŒ%ïiº~ÝúkgwÞ½€¼‚(°fÐòø:²ƒ¾Þú/’.n’NSàU§ÀJAíÂoi—AåâÙõu–í :gÃs 4TÞÕÇEœ)Ùy—([õºFÝý'>Nîéà0ÿÐyH5¥ÕÝ’”€Ö­Yâ_/ O²‡^‘—¬ÁÅ[Ú„d(‡¨P7‡ùåúK HM)˜P(’›‰c`¢Eo6 ægé…EçªÇ\5g¹isjá}xÙÜxIÖe Ÿm*¬ÃfyE¾1%È'Ïtb“ áßlä žô­Z9³MÈ“»Ô=£¤ZãaÊš¹›À~û€°Ùþ&òĽ½.M–þZ3ð–0xÕ†Ï!yb–¹÷Û¹ï5GX ökÏ;]…£¯ÂØÖì‡k»ú¶8DE.–¨¥UzÉ'Xç¹Zá2ÔnÑâX—/€¢Èh­–c‰8˜ÛéT·7¤¯òNH!e©?‚Éìr•ÌÔATri>Ã`vÀßÙÅêÊ.ŽEdåÛw-{YRvcCµ^%øxÝý¬ó DS}Kÿg¤lî~Ž·)ó§x¬IÓ'A2Yùày}Íy=Tæ'â]eІ2ÆìY¬Ÿ÷äê›ÖH’à—Ão}~.)Ëå%®=,¼>ÏÇØ<ôšÖ)Æñ‚$T°¸« U¾ûLñ~Y9q’Ïõø¥Ž3îmTàåÙÇxÍe¶ƒm:o&·?$ud&ûaÉ+™-?0BaÅö‚vg™F×ÔÐ+ø-‡øù •ê¥l(÷§§ëÇ ãnݹâãáú÷Ô7™ªÙÅ…BýGŒÒ#†9;¼RR«Qá@Œ,ûc E<Ù•A·½rÀž‚E…] ä(BØeSt\(cà%ø²Wå!J;ºpV0ÈRh¾”:y\«‚¯¤7­8GV·‰Ð÷\ñÐ+«Šã1­œAÚÂÜýk3§´+ŠÆÊô¯´}£›Îµ¯µë>ä¨ >agUó¨^96'P€Èì„Æ6&¸Ž· ( Dªa3øCó¬¸<ñ~uÄ$@)juŒóΕt¨^[gÏN>Ã¸Ø æ~¶\{hÈaÂS¾sÆRefÊ‘½¨Çk?lѹØKY3ò©•cRÆ©‘l,ýûèu<$*ëð(ï4Hy0ìôNunºš*8,{ðâ«ID×±¾Èƈ¬9àÊc@TŸeT‰ŸæÄ”ɱ¯ìV2yéD_•B>ZÁi)h6—/@p[VÈ‘Ë~hÅ/æ2îclùF3 ‘j—Õ—Qb¯èÇO™ïØœ-V õøû;:9V,#ÙœIˆ>¡Û¬Áqá+ûÌñp?!2ƒ6ƒ=­}Õ‹‡+ž× Ð3~ã„xu]î®é}Û8 `‘ö‡g¬Úù•zTƒàœ¬${îŠ]Žá┵BûŽ"ýÏH4Aÿo?‰ØÅ‚J!Š­¾ÔGvHà1eé(öÚ³ÏWTÎØ"“+'Ý\ØøÈB¢í¥úÖrØ™•~{£E¢XüÎzh*`m×a€(@E”Á+±>($`Éï šUV|gÄo N9­­Ç“©¿.Í£i Taˆ¢rH-aBå´ï˜AÆRÖ¾•ßᘠõ[å8ÎÏó’_ù$Þêv?AOwudò{—¿šxhf¢7až, •[&ê_]Êk/7‰ÈûX@”YÄ"­¯»µOÙs¬K%›ß—šg-osäæµ;½KÀ˜ÝûTßÐÜpcžûf=Ь‚í}®TôI c!œµW¾ÜhªpÖŽÙˆÒ¾¨q¢š~ÉWEma¡"tŽ1‰•¶ˆoD@9#!áµá« òæêù<Ãå0.çë!Hö…0®~'ºdCÙhm½Ê~M=szl×*dÚµðrõ®×&ðH‹J:¿~vÌF©yÐֺȃ}?}Ûä,,c.F&Â.Ê«Ÿ€½prë÷Å Ó}˜}9/j¹W5áÉEÃkË!†œÁŸˆïõÐÒ˜;§f‘ N;­ yùã½pAEsí\^…ÃØt³ŒÔBþ†y¦ß·¹[¶å?ó–¼PpŽl”i`®ÚÀT‘ñe¶ÖJ“èÇþ¬ ‹Û[ýÁ°%¿Ó{ˆDç=8¡ó§*á´Nìåi\'Å¡²`Tå•ËQÀ(ßO³-îyíkÅmË_ЫÃvx)‰º&¹ å½¥üµqž¿k*õy Ÿ0oåSM€…“ íøµ–xq;ÚnË'ï†x¹©t»)–e—Ë/§ó¯Ôœ}ÍX§¯»b+Ë·†ß6"¡¿ýL“ Ÿ kæT&äXU8îGßgb^¸PÉŠ¢TÍ¢Ýg¿äõbŒ4Ý·§¾2cmóuŒ 4qF¶¸oažàñ­òéi´ì·1œªy·/BŽæ¦A\À(¥§ÞC7¤o_ˆþb¾ðtâ"P÷wlûù§Ždß-bkK¾äİÌx^‡,¤xQÍ[´G㫆n¡iûy扞½Phó$2à®ÚÎQ ÓÓÚz‡'?CwÞg¦ØÕC¦KOÓj†xµ祇h"²?ÆduKô-±;RIa úvÓ?ÏþèKmØ‚³iK[qéÌû÷_/p‚‘ô_ù¥Ê£Ãoþhó׊gÚÉL®‚Ù³ÔsŽ4û8dãAü¹o_Å€ Éɽ‹"©ÝïVå0 F¯õõI°Ïãl.œÛDÚªÃ-õ‹)¼(œ` h[¦|LÂÕd/ôWlƒþ ©Ô7M SnŒ¶àð/ßäZ}K××½ÿj÷4šžKtJWÕü”À™s“ßšÙùA® ¹± 9šOW! ÿåI¿Ïi<24ìbp/­þa¼=„"Éfpo·ǖ…7OR´«¦t¸çQ¡×áU–%z±:›ml=^•½âÁ»Æ—ß¡¯/©£áûná°±-Êï'×}g²Ô–tf?™¹•Géw9bƘlQ¤BweOD7æo‘ÙU-¥x<æö)ÈSAåMR‘dÝ…A×e*hÞQöÖÉà¬ÉNäÒî9äpÆlB7<ƒ†“ƒü6!ÖÌZ!‚ÈÇWßw%áq¡ÍŒ-+ùLòÛ’õ_Ô6Íe±Ì3Ošt1âK(¿Ö¿?{a6“Ø‚‰A“؉aDË]áÉô„–î„p§õ'?ƹÖ/ˆ^!ä~ç/|õŒ‚qÀ\¥†tèî :M\BBH®ZÖyÕsH“@¶=¤‰g>¶;¦¬—£½J8+¨|VOQ!" iÆÅzrÒ­Éîí±'°ÖTâd£œ¶þºÀöAÙ/t¡ö¢% !î âÝI ÒH æéáhßyáqû¼ÍE¡@­3WÙŒ—ŽÔH?UÉ?'|Ä|ÑÉ= Éȵ%¹Á‡piJe©uLË:(ªMH©ZêùÎÊç먯£RŸŸ´¾²"×n­èÒµ)ks˜´›ôpñu¶ªJu‡ìáK@cÆ—õ8M±Û ›½¸À‡›¹_ãýQ =¦’Ù«l‘Z„ $8ùTŸñÄ®ãØH”›Il”…»ÆÌBéþþÉ[fŽÜ'3\ÖXm§^¢ÊÇ`Uô7èóëŒÃ!P¸³ËȰGìw¥³Æ9í\’—mÙkøæ¿ëŸæV$1Ft¯›ÐÙ@ÝŠ^‹¨†2bˆŽ¤æ·çPÞ¡†n~8p»*";ïÝP9ÈŠí+õ$=I0‚é\<žÆÉÿÝJÊ—÷°Íá•ë>ŠÒ‡f–|§É>RX£È.P8¨G»×öÀ¸±U/HÇ„KÞßx?ÿ+8s˜Qq¾Á±y9zRW¶ó=„}sþŽÁKsW3Öþüɱtħ¿Ÿ@͡΂Î@pàc¯ 8ľÂUX9ÙÕ¾jÉV4‡ZXJCÓM®‹ŒÉCT•›x^n$q>8mÐ$½ËPj³v£Ñ%ÿ-âe•§º—½'¿0¼G¸¡_§.I— ˆ&ž,Q}'/ô²8&‚8Ø¥M– g•Qòd¢ì¡+ ‚õm<첞2ßa{C ˜ß®îyڞúða¥yÂu 0²‚ÚþÈèb?nÑT5±jqœ±£VW\B~'’ôŸsS?eVw´Vðö§6t¾i…e›jdtˆOÏ E€]›ÚÌð´ÜSäš±‹Ùáí\η™AJí<3{Á•À1÷‰Æ¡À×9’Ÿo6–® ~È]¼ps_['óüe_ƒÿô‘žCÛå^Y‰B„=aê@ÙVÞÄyÎ`Þ hýA?óy*S/Œ‚3P3÷Gkh ש5=Œg>êYù]œ ß*EIvÇhE”ÎÝÖVH,¢#/Eh¸Rÿ]õnR}Fã¨Ø–B •¼ BxŸ”=Ò&SNúÖž†Âzr#DÛNÉ8a'Ø2¬_¼`eC-Ü8:(VK0ªvZ¾áü‹pv«`§V÷ASõàL2nÒá…Èf~2HŠà(æOÏ'­HíŸd ¦ 8&WL‚;Ò;B#-/dλàÍíô%>qo@ŸÞÔ/ÙÛËþq¯èG;ŠTý¿Žc„-%œ]šæ¦îŽüÄ–‹Ê›’$V2+¸Ô Ì™¥/£á› ÞÌ¿"\vc›Ë0é@ø_¡,ìÚ…´áµdð´E’ûgü ÕŸÙ„€#lZKW‚AÆ%RrÀÑOpùR–ƒ±gK䳘âaéúNðGšbW‘·]EÎXãöƒɾÇ-HºRÐRš‹Ï©á]ÓFس¼y;ÓfÀC²ãP²AUoù8Èýqª6i÷¶Ï®7/œq,8ÅĦӵۼûˆË7Ï*û‹d¡³Nk¸HåMNàﻺ’µyØ­ÄWŸúÝ €·{,\ti˜wŒþYyà˜é NýÚ%›ˆ&S¢·ÏõlÊÕ©w˜Ó—¢Ê…b,1!5¿d]ö‰f½¹’Ò?à“þDÎ~ÇwõÙt³¶þ¹"ÒJ/yA­v[vúv‚4,–¹úÏ£”3k™|$#X‘e “tCDi>ü¡Ü&QfŠŸRj%9ëšU^îÒA#Õ¡,ðA>ÎþlIxÕ–=YKË«ý¶½X ì,°dô@Ƙq3Ž«6íöoU˜ ŸAV€Û©K~f¤—ø8·V‰ô ]|”;ƒçC†+ÍÿûÀNÜÝuîBãE¡KKÔ^ ’†¢£¾xC뤹|¦pwáäßèÇ#ÂDàÁl•Œä· Wkz³Ì—Šà-–c6p‚?ýt)r1#çFZYì;Î<8¬ŽB†.éÏÃi('Dõ;‚×÷l…•kåeAV[¶P(×̘–¢Œ&eÜð1lß²ãkw¸ŽDüö°uBi™õUd²‘c¿Â›Hòs™_¤}Ñ1íÈ?ÏṊôöj‡ÂEAie‹‡üÈ\§MµÝB9½4N¿Ù…C=uså‰xVWÂa‡@6ácÙ3oœc<ƒ‡uuˆ –¾²O'Bµ€äîmàW}\÷ -Bööš¿ücãGkÅ-M°~¥k…ïY&½n\9ðÆ¥þ±íSÅZâꮢ±Y}SÞ†²êÑÕ&Ø1—êïÖâÍe|áŽx EN6 òùŽÞÿÓþÿ©÷gçÿÿÿŸÈ¥‘ž½ÃçËëöðÿnf endstream endobj 71 0 obj 15157 endobj 67 0 obj 1618 endobj 68 0 obj 14157 endobj 69 0 obj 532 endobj 72 0 obj << /Type /FontDescriptor /Ascent 924 /CapHeight 821 /Descent -281 /Flags 32 /FontBBox [-199 -312 1031 955] /FontName /VXTBCB+NimbusRomNo9L-Regu /ItalicAngle 0 /StemV 85 /MaxWidth 1230 /StemH 30 /XHeight 616 /FontFile 70 0 R >> endobj 73 0 obj [ 333 333 0 0 250 333 250 0 0 500 500 500 500 500 500 500 500 0 278 0 0 0 0 0 0 722 0 0 0 611 556 0 722 333 0 0 611 0 722 0 556 0 0 556 611 0 0 0 0 0 0 0 0 0 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 444 444 333 333 0 0 0 0 0 0 0 0 556 ] endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VXTBCB+NimbusRomNo9L-Regu /FontDescriptor 72 0 R /Widths 73 0 R /FirstChar 40 /LastChar 222 /Encoding /MacRomanEncoding >> endobj 1 0 obj << /Producer (Mac OS X 10.5.8 Quartz PDFContext) /CreationDate (D:20090920233725Z00'00') /ModDate (D:20090920233725Z00'00') >> endobj xref 0 74 0000000000 65535 f 0000092835 00000 n 0000012216 00000 n 0000036285 00000 n 0000000022 00000 n 0000012195 00000 n 0000012478 00000 n 0000092655 00000 n 0000076381 00000 n 0000047348 00000 n 0000068875 00000 n 0000034304 00000 n 0000035112 00000 n 0000012815 00000 n 0000034282 00000 n 0000056195 00000 n 0000012725 00000 n 0000037821 00000 n 0000037720 00000 n 0000037612 00000 n 0000037506 00000 n 0000037402 00000 n 0000037296 00000 n 0000037191 00000 n 0000037086 00000 n 0000036981 00000 n 0000036876 00000 n 0000035132 00000 n 0000035178 00000 n 0000035228 00000 n 0000035279 00000 n 0000036248 00000 n 0000036648 00000 n 0000036418 00000 n 0000035333 00000 n 0000036228 00000 n 0000036368 00000 n 0000036629 00000 n 0000036857 00000 n 0000046942 00000 n 0000046962 00000 n 0000046983 00000 n 0000037925 00000 n 0000046921 00000 n 0000047003 00000 n 0000047254 00000 n 0000055726 00000 n 0000055746 00000 n 0000055767 00000 n 0000047532 00000 n 0000055705 00000 n 0000055787 00000 n 0000056015 00000 n 0000068331 00000 n 0000068352 00000 n 0000068374 00000 n 0000056364 00000 n 0000068309 00000 n 0000068394 00000 n 0000068638 00000 n 0000076058 00000 n 0000076078 00000 n 0000076099 00000 n 0000069056 00000 n 0000076037 00000 n 0000076119 00000 n 0000076357 00000 n 0000091853 00000 n 0000091874 00000 n 0000091896 00000 n 0000076550 00000 n 0000091831 00000 n 0000091916 00000 n 0000092159 00000 n trailer << /Size 74 /Root 36 0 R /Info 1 0 R /ID [ ] >> startxref 92977 %%EOF danieljprice-splash-4d1f09c/docs/figs/rhoh.jpg000066400000000000000000004237661477365367100214360ustar00rootroot00000000000000ÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀV"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô¿x+Lðv‡mmmiÛ<°n.HÝÈçŸOjêwCùÔ9ÿgõ£?ìþ´_UÖm4[AszìªÌg‘ÏEU“\¾©¯Iwªi³$ú•¥”$É5¬p8’fì‡ÊÔnöÅCãé.m¯tkÈ`ó6™<,Œ«´þAÿ:æ.W¾…–Y˜ª W­ƒÂFPU=ËcÎÄâ\dàzÆ›ª[jÖ)yfæH_ A} [Ü}çX¾¹·ŸD·[h¬*!dme#üúÖ¦ÙýkËœydÑß sE1n.Eµ´³È$)`€³` œÉ>±­‡óª¶÷0ÝÛEslé, ’9²®¤d{‚*Lÿ³úÐ¥ö‚O ’[¥ghzþâ=15*çí®ÌÆW•8<ÅñÕÕÏööVž ê´Ÿb€6à0&FÈ€#sƒƒŠåc7Þ»ñ—{ak§Ûêºl·vpÚÜ´±¬‘D@ D䯖ØÇbs@­¸úÎÇÐþuäžþÉÿ„ß@Mxö/ý°É3;ò†ß7'ƒæ`{gVg„²ŸåÒ%x„È¢ûlÌÒ o)÷‰< ù6äc;qÖ€=fÏÄV—ÈZ$¹À¾–ÃýY?½Œ°bvç ò˜àtîkWqô?yM£þËÆF|kz_øù«> }jw/¬˜Æ s¹gqö¹m‚0N|¿/Ç黡üê¡Õm¾ÏmX`p½xÅz.ÙýhmÇÐþuªøŸOÑï౸’]MJ‘ZÚË;Rb#S–}kK?ìþµçž.¹µ¶ø‹¥=Þ¾t8ΗpÈ’Ü|ؾLʬ¼õéž>´èv·BîÖ+„I‘$PÁeFÇÕX±CKñ¦¯c§]Û%ÈPFxwFx®â2ñ<ö®S½Ð.üak&»}æ”ÚZ6™#I¹&›Ìa#&Î ¸Ù¼úU_ ªÉ§ü:…×tOkv¬¬xaåô4ê]Eu Ío*MdŽ@ÊppyàŠ—qô?p -ôÛ? 5½¤6ñßE<±ÞÆ„F¸Pã¨ã¦{WmŸöZ‹SÕ-´6ãQ½vŽÖÝ ’¸¶¨êp9¨Ÿ]°[ƒFköùàkˆâçæHç§çK¨ÙÅ©i—V¦b¹…á÷Xx´Z–£k Aã)mõ æ-)—2…âoÎi¿Jö‹rÏQ•RÕ¦7›‡òÜ!òäòÛæ#{§<€HÈæ´7Cùכç]ÒtÌ’mü1tŽw}çæú““øÖw…ôètÆðÝ µês‹™d•˜Ì>ήªÙì¤ €=+RÖ Òä°K…”›Û¥µ‹g8r¬Ã<ð0¦¯î>‡ó¯ÑäѤO¸a'‰N¬§TbÌel—p—Óæû öf¥¿{]š´’99ÎÛ%Þ|ÿ/ÎXEÏúŸ+¯ðã9æ€=§qô?¡üëÆõØõÔõÓÍH¹“ÄP•$WHÿ ü²+¼ðd†÷IŸZelê×/v›ºˆŽ/ü†ˆ~¤ÐQ¸úΪjz¥¶¦\ê7Ò4V¶Ñ™%p mQÔàrj\ÿ³ú×/ñ ÿÅ·ñËÿ.OßÚ€:+ÍZÖÂ[(®dd{Ù¼ˆ ÜûY±ÇNõô«›¡üëÍõ"ëO×<#,úæ¥~­ª]y;Tùœ‘©ÏnN9¬_ Å,ž-Ž{ýWM´ÖáÔçûDn[»˜Ép±òØhö•+…ÀÚ1Þ€=OHÖ Öôñ{j²ˆŒ²Å‰8;£‘£ný2§ð«û¡üëÆãkì .©(ŠÁµ½LNÍ)E󼑠 Œ.qžØÎx®·áðmõ¥ÓW: Ô[û8†% lMû÷7ïÆ8ë@¾ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´6ãè:7CùÔ9ÿgõ£?ìþ´ã—þôH渇Ϳ²…ž Ú'Ø÷Q+ÊC «ÁiŸð‰éÿóõ®àö÷ÿŽÓ|_ÿ [—þbšwú|†·±þÏë@ð‰éÿóõ®àö÷ÿŽÑÿžŸÿ?ZçþoøíncýŸÖŒ³úИøªÉí/n4›}GUŽÚá´Å,ÚŒÒÈžmÓÆåÙŠå@qÅmÿ ӿègñgþ ÿYÞ1ÿ‘¡xÇïtý.zõZÒM¤¬f’mÜó¿øTwý þ,ÿÁ¡ÿâk/@øeiªéÒÜOâ_+¥íݸ ©6Åq$Jy¨ ÷ÏN•ëÏø7þ@w?öÔ¿ô¶jžgÜ®UØòiq¡ø·Ä¾¯5¬7ZDK$×Òy»f™<ÀH+Å~\qŠô¯øDôÿùú×?ð{{ÿÇkÏõŸù*ž&ÿ¯ýÿGG^¹öZsè(õ0ÿáÓÿçë\ÿÁíïÿ£þ=?þ~µÏüÞÿñÚÜÇû?­ÿgõ¨,óýV 4ÛýSN¶¿ÕVÚOìo¿©Ü;¯›}$rmvr˹i+¤ÿ„OOÿŸ­sÿ·¿üv°•èÿgõ¯ñΩog¨ÙÙ̲­Õž¥©M4F2Iœ4l À Žx4½ÿ ûþ¥£ÿƒþ×^‡à¯Gã- µ(­^Ø¤Í ÄÒnÃ# ;WÍɫ۬h¥%ʤ xQ²{þUí?¤ó|+¨Ì…“T•×0“IJ#¤‹$,Ûc£ÆbÈ?½pAã¥u¯(Š6’Cµf-À½yÇÃÝ ],#–æÞçí {0h7€ëT*wªAC@ÇJô<ÿ³úÐ?ý½¬êß6ƒ§F-Oݼ¾vUuA‚G¹"?Ž-ÿy'ö%êŽ|¨’Xþú.ãô¦º?…$iጶ„Çt°¯&È÷eóËÔQòýÛº–µäù6ºtiw¨].è#ò…ï#‘ÑG=òÉ PúNºš”’[Ko5¥ô m¦<€z0=}ÇéZ»¡üë#IÒ“MŽG‘ÍÍìä5ÍÓðÒÐü*2@^Þä’eÕ ¹»Ñ¯­¬äòn¥·’8eÞWc•![#‘ƒƒ‘@ ¼ñ&c®YhòÌ~Ûv’5o¸ª¬Å›žÊ@õ?C(§IáI¡u’'PÈèùV¡uá~Ðu âæššþû¹fY›Ï.d%ÁÃ7'0}»b½c–ÓYønÖ)âtmÒ:ÆäîDi‘NyÈR£ŸJßÜ}çU5-N &ÂKÛ¶) {A;»± O$“€;*\ÿ³ú×'ñ2þçMø{ª]Ú7•q’Qði2 ÈÏ~x=Aär+JTÝJ‘‚Ý´¾ñ¦“¼¶)ßü]ÐtË%¹¹¶¾å1¬Q¼29Ærß,„‘ŽHÎAÕ­#ân™¬øŠ-;T†âY¦e•#0ù‘.çPêä tÏÞŽkçGÄWä-½¾·y{o±›}ÌA]ZD+*Œ–8;ؘòFpkáˆò¾(謱IäbšØ–ëü]›¶AÇW¿ý‘ xiN§Ä“z^Ûy“V¤OÝ&£ç¹ôÞãè:¢ú¦.$†[«†Ì §Ó’*ÆÙýk4¹–ÇX³³ÕSJ¿{­ñÝ"Ó>&^êÚ¬ðßA!'ûCûKìþo2Iàª`Œgg¿%¸ñío:í „«dƒ/æ€4nõ‹+‘n®/*¹”³qkÕ˜öqž¸8èjµ¯‰ôË»{ÉÄÒ¶IæÜ-ÌR@Ñ¡†*à¤Î1Áî aj0Ýk%³ÔDßg¾Ó"ØbRÏ寘 ’ÊX6'.¼sX‹g¬]ÿÂIªí—RiQÙB.,Œh Èψ›€uûÄ8èÚ§Šô§ŽF2Ü#Fá)-¥IrT°ÄewUXäŠ} Núþž’¢Œ†XÜȹ(¢C„%º Ç¥pzN›ä[êvëoªj6¡àm>æñe‚å¦(Ѳ3­±W6°äÓn-u;kZ1…‰¸·š@Tؤpoâp Ø PÜ}çFãè:„d‘“ëš3þÏë@šŸŠ´ý+RM:u¾–íáóÄV¶“\™Û¸ùjp3Ç5«À¸·ŠtYd@àH¥3Êœ}"¸MRÎîûâœii©Üiκ)&H7,<þ‡ÌVú ’×K¶¿ø«Ëx;YÙØÉv;CæoŸhãpǶMv–w©}j—¬¢7Έѷ«GJÌ>,Ò—Tûš]âqleòŸÉ‘ù˜Û»Û=xëÅf|.¿ÛÏ­¶ùýëyç ¶õÙåüÛºq@õçŒt‹Aìçš`b‘bše…Ú]±µ^@6©9OÆElÏp¶ÖòO)+h]ŽIÀ&¼§ÆVž]¿ˆ´m+]²yµ‰Am+`’èNêƒå!¾T +Tàd‚3‘ÞÉ./¢šHÅߨQnÜɆ|øcØ ïçë@èÞ'±×ú Wá<±"Éqe4(êzgP¯cV»§®¼šÚÔ^p!$F' äŽ+Œð­ëÁ®ßhÚ«ý³£Ûéé$Ë*ȶódªÅæ åJ€prF=ꆓeâ 7Çz"j6zkÝOm{-ÕÌWŽí1-æÁˆcEUé·ŒŒrê[¡üë+^ñ&᛽Õf’(U…J#ÈYÛ8('œ¿ŸöZóߌÇoá­&yˆH£Öm]Øž‰4Õi4Ñ5½A´ûK¹ùSy¶¹†H$+êE¦k{qô?y>¡ªYøÇâG†¯|:ö n&¼»…À¬ ,aˆÁbAãßë\Ï„µÛY> ønöÎM6ÞÿíP\ÛÃ,®û¶þí'wàɸ Ïæ(ß·CùÕ+=V;ÛËËd†éÑÂ;K"¹#9Bxaî+Á4K$´Ð<®Ç-Çö„Þ)[3!ˆ4’Œ.pÆOäÖ®¹&­ö‰ßÙFs:ß[îòIÞ"Ú7íÇû9Î;f€=ƒÄõ·†ô+­bùf6ÖÊA-‚@à;š¹öÄ_kmËÍ$žBã?ʼ álÓáçŒÛMÕ´Û‹+‹kiVÆÀÈRÙƒ€OÏ’ q‘×"½ªcÿ¤Ÿ/ü¸žÿìP â/†µËë[;+é¼ûµf¶[˘/]ŒÊÆ;è5 õÓ¬'¼–)äHP»$*]ÏÑG$×”|1ðŒºŽƒá}wRÕ$¹‚Â)ÆÅbXÒbA,×¢ð]À%y˜„ÍÎÕ\à ¨=3žôîð\}¢Þ)•dU‘…|«Fy¡ö©7CùׇJúLž/Ó“ÆîWFþ÷m4\HË“jï9úõíj§ãHÍ׎5mCPµÓ¬šÆ¢ÝÞ<ª±(PY¢*q¿w\óŠ÷ÝÇÐþuËxßÁZgŒt;›k«HþÙå“orÞŽú{VΛ#K¥ÚHò,ìУW€ä¨ù€÷ëV³þÏë@<ÉÿçÆ_ûùÿK¾ùñ—þþGÿÅW‘Úk}do5S\ûyËfÖvŠ$>Á\×[à\kÖ7V÷;êÉ™ví2#gkØðAúTF¤dì™ÑS Z”y§#¥¿´:£ÛOc6Öä0’<©ùºÖJøråS™oLž¿¸Û¦­gø·\¾MRÓEÓå{5<뛈Æ]cÉ/¡$}«+PžóC/´‹ýVyî– ë†™%^ãæ'oኗ… {7;3?¨Ê²Så¹ÞY[5…¢[Ãc6ÕÉ$ÉXžI?7Z³¾ùñ—þþGÿÅT7Ñߨ[^EŸ.x–UÏ£Gó¯7·×çñ=õÍÍ忥m§î"Ö šPtfeÁ$õ늪•£Í6bÜ`¬ô=?|ÿóã/ýüÿŠ£|ÿóã/ýüÿŠ®Ã^"¼¶ñOö%ÅÅÅՕʱµ–äæTuŠ–þ @'žx®û}8N3\ÑwCŒ”•ÐoŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñTo£}PÃ|ÿóã/ýüÿŠ£|ÿóã/ýüÿŠ£}èß?üøËÿ#ÿ⪠È^úÊâÒ[)ü©ãhŸl‘ƒ†8ù½ê}ôo  öVíac¤63ypD±)i#' 03óz ‡GÓWDÒmtÛK"Ú1e匶ÑÓ'u^ßFú7Ïÿ>2ÿßÈÿøªMÓg?a—>»ãÿâ©wѾ€tßóá/¯ßÿŠ£|ã8±—ž¿<üU.ú7Ðn›9û ¹õßÿK¾ùñ—þþGÿÅQ¾ô›çÎ~Ã.ßÿŠ¥ß?üøËÿ#ÿâ¨ßFú7Ïÿ>2ÿßÈÿøª7Ïÿ>2ÿßÈÿøª7Ѿ€¼ç±—ŽŸ<üU.ùÿçÆ_ûùÿFú7Ðoœ~Ã/=~xÿøª]óÿÏŒ¿÷ò?þ*ôo |ÿóã/ýüÿŠ£|ÿóã/ýüÿŠ£}èß?üøËÿ#ÿâ¨ß?üøËÿ#ÿâ¨ßFúMóŒâÆ^züñÿñTn›9û ¹õßÿK¾ôoŸþ|eÿ¿‘ÿñToŸþ|eÿ¿‘ÿñTo£}çÿŸïäüUçÿŸïäüUèß@ùÿçÆ_ûùÿIºlçì2ç×|üU.ú7ÐÍ8__é÷“Y\y¶4°í–02ÈÈsósúp0,eýøÿøª]ôo |ÿóã/ýüÿŠ£|ÿóã/ýüÿЍnd—$’@¼Öv™ª®¥ ë ©må²Ç<¢¬Š{p3{s@ûçÿŸïäüUçÿŸïäüUW·’u–XçÎT+à 23Î+WñªéÚŒGKº¸¶ÓbŽk¹âtýÚ>îB’ ÆÓœPO¾ùñ—þþGÿÅQ¾ùñ—þþGÿÅVøš[BæÓHÓ%Ô>ÈUn&,q«• ±IûÍ‚ ì29¨5?M§]}œh—SË€¿¸HåŒ4I’å°Ä`ô?Jé·Ïÿ>2ÿßÈÿøª7Ïÿ>2ÿßÈÿøªÉѼIk®\]Gj¯²…ÄÑÖXÄŠGàEP›Æ Zþ[ &æöËO‘¢¹¸ŽD_™9pŠN[o~œä ÐK¾ùñ—þþGÿÅQ¾ùñ—þþGÿÅW1ã-b²ºµÒ¥¼±¾xcµ¸ŽáHdoäuïZWšÜºw‡.ukË ckhžY-–Ev ¹'px  ]óÿÏŒ¿÷ò?þ*óÿÏŒ¿÷ò?þ*±‹4ñâc¢ÁŇۼüþïfìŸ\ßCRiþ#‚òÙ.fE´…¬â»-<È ,›°g+ŒuªCd¥jïJ·*F= fiZ€¹Ih&xXÝN?QƒøÐhZ§‡4ÿ°éZD@X¹jÌ{’[' …iï¸ÿŸïäüUN‡#øiÿ÷ÍUßqÿ>2ÿßÈÿøªd‰$Û<Í:FØá×/ ýïsWïš?ïš«¾ãþ|eÿ¿‘ÿñTo¸ÿŸïäüUZÿ¾hÿ¾h*ãOK«•¸—MœÈ»zN¡[iÜ»”>’2"­î¸ÿŸ¿ïäüUZÿ¾hÿ¾h*ßOK[–¸‹MœHۺΥWqÜÛT¾$pO&­ï¸ÿŸïäüUZÿ¾hÿ¾h®ûùñ—þþGÿÅU7I¶Ò<ï°hïœÛŸ!éÑF_…8Q€2pkcþù¬é5»-äÜA%Í¢xLЧ¦z“©è;Ðûî?çÆ_ûùÿFûùñ—þþGÿÅRɨYÀBÍwm£kÊ äô{óQ>¯bš„–i‡í‰“É. ‚{÷À'Øs@ÆòÉ’iŒï™£% î BjM÷óã/ýüÿЦÿiÙ¥¼RÜ\ÛA¾5|<ËÀnœçê85l@ ©¡[}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøªµÿ|Ñÿ|Ð]÷óã/ýüÿŠ£}ÇüøËÿ#ÿâ©´lpçí–¸Œnsæ¯Ê3ŒžxQý£d-Ò¶Zù. I<ÕÚÀuÁÎ0h7ÜÏŒ¿÷ò?þ*¡–ÜNÛ¥Ò|ÆÆ2þQ?ú,ú¬Hú‘åOìÆ%‘>FlŒuû¸üjÄ7¶—¼P][Ë$}@Å~ t  a‡þ€©ùEÿÅSâ·>øtŸ-±Œ§”èÔËÍnÖ îm¥·º0:#¤rƒ´³çÇ_Ò®ÛÝ[Ý+5½Ä;XÆá°};ÐDÎH&Â\އ||ãÔ»î?çÆ_ûùÿV¿ïš?ïš«¾ãþ|eÿ¿‘ÿñT„ÎH&ÂRAÈùããÿ¦ßÞ\Úh, Ê`—a* Lzî"ªE®™í¬Z'77ˆÒ$ ÀA™aÊþb€/o¸ÿŸïäüUî?çÆ_ûùÿOŠà0‰&Ã<ŠH…œã®1×µU½ÕE¿ÙE¬ñî$hÐG"•žIÇMO¾ãþ|eÿ¿‘ÿñTo¸ÿŸïäüU6kñi§}®ê#?rf,NŒu$à~4ý>ñu :ÚõbÜD²…n 0Î?ZM÷óã/ýüÿФÌÛ·}‚]ØÆwÇŸý ­ÿß4ß4S÷Û÷ÿgÉ»Îøóûê—tÿóã/ý÷ÿV¿ïš?¾j.ÔÓäQè1ÿ³S·ÜÏŒ¿÷ò?þ*­ß4ß4W}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøªµÿ|Ñÿ|Ð]÷óã/ýüÿФÌßóá/\ýøúÿßUoþù£þù  »î?çÆ_ûùÿFûùñ—þþGÿÅU¯ûæûæ€*œt°”wáãÿâ©wÜÏŒ¿÷ò?þ*­ß4ß4W}ÇüøËÿ#ÿâ¨ßqÿ>2ÿßÈÿøªµÿ|Ñÿ|ÐBÓž¶žü¼üU§=l%8ä|ñÿñUoþù£þù  mO[‹G·3ÞÙÞ$+Ë:Eæú•'bKñ/ÃpƲ<Ó„a|–9»B)VTŒz_?ø·D‚ËÄ÷Úm¤CbÌ$Ps¶5`L1éS&ÐÒ¹ÛZXµ­ŸÙî4«±8ÄP³1õÅiø[Em^ÜÌ«÷ޤÆv"çh$wäŸÆºøG¯è%þŸþ.øG¯è#þŸþ.¢£tuÖÇU­Ila_Ù“«Ã©¤&|F!–5ûÛA$õÁ'z“S1ßZ}žÊÎádq‚óÂÑ¢z“¸ ýkgþëßúÁÿ€§ÿ‹£þëßú Cÿ€§ÿ‹®ZÙuÕ=¤Œ£ˆ©’{í;+(-b?»†5~€`*ÂÑôØ´=ö³YÍ-º“äËFA·°!yt®§þëßúÁÿ€§ÿ‹£þëÑÿ1(ðÿñuÑ_ ÑQ—CšqSÜæáÓVC©ýíá¶ å k»°*N:€=}k{Î÷©¿á½ÿ Œø øº?á½ÿ Œø øºª4cF‘ÅEYùÞôyÞõ7ü#׿ôƒÿOÿGü#׿ôƒÿOÿZ”Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]Cç{Ñç{Ôßð^ÿÐFü?ü]ð^ÿÐFü?ü]U’ê8gµ’i#Y”–c€:×?®È"Ô£ñfžö²OŠ%±WS$ÐŽøÏß@®¤øvðŒFÿn§ÿ‹¤ÿ„jëþíÿðÿñtXjP_ÞMsnùI3ƒÁ^:Ø×1/†bÔü[«^jÊöEl"Œ\Žb›òüÀ¼0Ç5Ø]¯MBôµ?ü]/ü#׿ôƒÿOÿ@d_ÚÞ¼Ö£µÓ'½‚þá®í¦¶xóŒŠ º»/®A<⪧‡.õZÒãÄ 3¡Ña·»ò®|µ–}ĺ°ŒËÏO»]ïü#׿ôƒÿOÿGü#׿ôƒÿOÿ@m¡¿Ñ|K¬É…wqgtmü‡µ’ª©R0ò)#Ò£°LJmµ-6ßI’ýfºš{IÒHÖÓí®í%´žÞáxådbJ¨‚ŒÃzçÚ¶ÿá½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á¼ÿ Œø øº?á¼ÿ Œø øº‡Î÷£Î÷©¿á¼ÿ Œø øº?á¼ÿ Œø øº‡Î÷£Î÷©¿á¼ÿ Œø øº?á¼ÿ Œø øº‡Î÷£Î÷©¿á¼ÿ Œø øº?á¼ÿ Œø øº‡Î÷£Î÷©¿á¼ÿ Œø øº?á¼ÿ Œø øº‡Î÷£Î÷©¿á¼ÿ Œø øº?á¼ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷£Î÷©¿á½ÿ Œø øº?á½ÿ Œø øº‡Î÷¬m3÷W—Ÿw2\»‘øãúVÿü#׿ôƒÿOÿ^ ¬|Z¾ð÷Š5m8i–óý’öh<Âì»ö¹\ãœg(è;vÊ»Sÿß5ó¼_´6£ÀÐ-ý·oð©á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×ÏŸðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPÐ÷Í÷Í|ùÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó_>ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|×7©i×’7ˆ"Š×Ìö¸†@Êá]§$IÇ==ëÈ?á¢õ/ú¬ÿïû…ðÑz—ý Ö÷ý¿Â€=rûDžãûuþËËq`Û±+’Á_ dñÉ^¸ý*̶Wk«O(·óãOX<ÀËò:ï<äçÀdf¼kþ/Rÿ¡zÏþÿ·øQÿ ©нgÿÛü(×-tI÷À×±±HK`X©Û'9^¿¯JÙÓm¦‹A³µœ˜æKdʰ%X(žFs^ÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþî_ÙoÿA;ßûíøš·m·‹aæ9ÎéH'ô¼ þ/Rÿ¡zÏþÿ·øQÿ ©нgÿÛü(×àÒ µ¬ÖRÚv•…³ “>ie`IÁ#å<žØöª÷?mY4¨Z‹›•žbcP˜m¤ó·v0N3Ò¼£þ/Rÿ¡zÏþÿ·øSOí¨3+Y_ºLÍ‘ôâ€=~ÓI½Cc#[¬@jrÝ4!—÷1²8ƒ‚rGLòÕ…¶¯ý³kw{høXfŠ@ €±Vœíù‹'' ¯&ÿ†‹Ô¿è^³ÿ¿íþÃEê_ô/Yÿßöÿ õ_ì­BMóN[i¦![hn^3"€ùeܤ‚ Œœõ­«µÖõ –ŽÚX XöàWx<V¼Cþ/Rÿ¡zÏþÿ·øQÿ ©нgÿÛü(ݧ°y¦iýÌ@ÿl¡GÓ"–ÞÁ ˜Ho®eø$e þ@W„ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…{†³ms|–ÖQ"›i¥k}Àb 2WÔî /‰ªzÖ—çj¶—­`/íÒ ’ÝJ÷*U°Ä8Çâjñ¿øh½Kþ…ë?ûþßáGü4^¥ÿBõŸýÿoð Z—EÔnt-?OÜ ¹sý¯~ZßÚ£$à…=°µ\’Õ$Ñ,àºÐŒÚ …Ó÷D d1a€{çžkÆá¢õ/ú¬ÿïû…ðÑz—ý Ö÷ý¿Â€=ŽP—OÓ Ö ËyiÎÈ ‘Œ’Ã’÷>µ{Ãö—°µº`fŠV)|¼pqÓ5áßðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPÐ÷Í÷Í|ùÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó_>ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×ÏŸðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð£þ/Rÿ¡zÏþÿ·øPÐ÷Í÷Í|ùÿ ©нgÿÛü(ÿ†‹Ô¿è^³ÿ¿íþôýóGýó_>ÃEê_ô/Yÿßöÿ ?á¢õ/ú¬ÿïû…}ÿ|Ñÿ|×ÏŸðÑz—ý Ö÷ý¿Âøh½Kþ…ë?ûþßá@Aÿß4ß5óçü4^¥ÿBõŸýÿoð¯Hð'ަñ‡†&ÖïgÓ4x£¼k@³eƒŠùÜ]yùÔÝÿß5â^1e?µíõ`ëþ© Ï ¯W‹Tµžd†hrJì%‰à¼šò‰íþ"jˆÌ“Iû¦-vdyIÐ{{ÖU~£¹ô-QZ’QEQEQEQEQETpÏ Ê‚Xå@ì…‘ƒÊÅXqÜ0 ŽÄRPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_xïþJ‰ì+uÿ£Z¾ß¯ˆB¼¬êœƒÂ«Ê8YEsÿð‚x?þ…MÿÐÿñ5N?‡Mfæõ¼?£4[Ã[:-±²4…œqŒ°‘Aà}ÁÉíÖQ@ÿü žÿ¡SCÿÁt?üMaÝx/«ã­&Ý|5£L½wŒXEµ™eµ HÛ‚@föÜ}k¼¢€9ÿøA<ÿB¦‡ÿ‚èøš§©ü8ð­õªC‡ôkW[ˆ%2&J¤ªìœÃ*”>Ìx=YEsÿð‚x?þ…MÿÐÿñ5OVøqá]GF¾²·ðþg=ż‘GsèY”€ã‚sÔtê+¬¢€9ÿøA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâk ¢€9=3áÇ…lm^ü?£];\O(‘ôè²ågTäX öQÀè. àÿú4?üCÿÄ×AErv_<+mu¨Í/‡ôiÒêàKm§EˆEl^‘ŸŒrçŽæçü žÿ¡SCÿÁt?üMtPuà¿ ¯Ž´›uðÖŒ }2õÞ1aÖe–Ô)#n ˜Ûqõ­ÏøA<ÿB¦‡ÿ‚èøšè( N÷áÇ…nn´é¢ðþZÜetè±:˜¤MÀãs«óžPqÜ\ÿ„Áÿô*hø.‡ÿ‰®‚Šäõo‡Ôtkë+èÖsÜ[Éw1éÑn…™H0È'=GN¢® àÿú4?üCÿÄ×AEsÿð‚x?þ…MÿÐÿñ5OIøqá];F±²¸ðþy=½¼qIs&é™Tç œ’3Ôõêk¬¢€9ÿøA<ÿB¦‡ÿ‚èøš§eðã¶×ZŒÒøF.®±FÚtXDQ¦Åàñ¹øÇ.xîzÊ(Ÿÿ„Áÿô*hø.‡ÿ‰¬;_øU¼u«[·†´ci–N‘›¶«4·Aˆp  žûG¥w”P?ÿ'ƒÿèTÐÿð]ÿTï~xVæëNš/èÐ%­Á–X×N‹©ŠDØÜ7:¿9åÇYEsÿð‚x?þ…MÿÐÿñ5OSøqá[ëT†èÖ®·JdM:,•IUÙ8†U(}˜ðz²Šçÿáðý šþ ¡ÿâhÿ„Áÿô*hø.‡ÿ‰®‚ŠäôŸ‡Ó´k+èדÛÛÇ—2iÑn™•@.r É#=O^¦® àÿú4?üCÿÄ×AErzgà ØÚ¼3øFºv¸žQ#éÑd+ÊΩÈ<*°Aì£Ð\ÿ„Áÿô*hø.‡ÿ‰®‚Šàí|áVñÖ­nÞÑŒ ¦Y:Fl"Ú¬ÒÝ mÀ$*‚{핹ÿ'ƒÿèTÐÿð]ÿ]ÉÞü8ð­ÍÖ4^Ñ K[ƒ,±®'S‰±¸nu~sÊ;‹Ÿð‚x?þ…MÿÐÿñ5ÐQ@ž§ðã·֩ Ñ­]n ”ÈštY*’«²p ªPû1àô7?áðý šþ ¡ÿâk ¢€9ÿøA<ÿB¦‡ÿ‚èøš§¤ü8ð®£XÙ\xF¼žÞÞ8¤¹“N‹t̪sNIêzõ5ÖQ@ÿü žÿ¡SCÿÁt?üMSÓ>xVÆÕáŸÃú5ÓµÄò‰N‹!^VuNAáU‚eƒ¬¢€9ÿøA<ÿB¦‡ÿ‚èøšÃµð_…[ÇZµ»xkF0&™dé°‹j³Kt·ª ï´zWyEsÿð‚x?þ…MÿÐÿñ5NO‡}fÚõ|?£,ÛÍÛ :-²3´e\ñŒ¨€àýóÈïÖQ@ÿü žÿ¡SCÿÁt?üMSÔþxVúÕ!ƒÃú5«­Ä™N‹%RUvNá•Jf<‡¬¢€9ÿøA<ÿB¦‡ÿ‚èøš§«|8𮣣_Y[øF³žâÞH£¹N‹t,Ê@q€A9ê:uÖQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ž™ðã¶6¯ þÑ®®'”HútY ò³ªr ¬{(àt?áðý šþ ¡ÿâk ¢€8= Á~›Xñ:Ká­ÒM%kˆEû%»a~^æcܓ޷?áðý šþ ¡ÿâk ¢€99>xUõ›kÕðþŒ°Co4Ol4è¶ÈÎÑ•sÆ2¢6ƒ÷Ï#½ÏøA<ÿB¦‡ÿ‚èøšè( ?»ðv“¡øãÃZ¦›o¯¨IÙಷ‰}Žàœ2F$9+œ3‘ÏN=¹ÿÿÈsÂö“ÿH®«  ¾'øi%—ÄŸÅ!RͨM(Úxñqøá†}ëíŠø—â­Å·Ä?ý¢ bóu+™#ó®ô2¾g¨>´¹ ¶Rø?J_Øíe‘wÃ4Ñ5ظónZÝ T &Ê(9ÞJŽ/ý—Ãq_kwŸhÐÙouS>‘xÏ—†ðÀY~ìq™M¸d|Ú<ÕUÆ|ÝlnßËÙk;y±<ñâ2wÆ»·8õQ±òz ­èjâé:ö›{dë§êV·r\³a £´ÈáHŒ—WÀÀä:ТyvÑÜi<~{Û(yÓ–P¢·Ú®dÒí ŠÀgÚ»$Ù½43¨ÚøƒT³ºÓRßKtsrH ‘É/– *ãyE%r\‚.y5sVð¿Œ.õh>ßcªßê÷¶Ÿlxž)¥¹HÖFˆ‡Üê0WžqUî|/âK ¶§=ôZcݼS£E"¬rBB´|Ò²)';„ƒŽrOÆñ›O¤‘‡'eÛ„Žb ƒœ`¸1ƒà¦êë5‹]3Q‹Q´ŽãC¶¾2Ú\C‚(Ug‚ñ~éÙwÕ€f@ªÞ^ðê¼|º±Ø|Ý*ú?í }‹u»´çòøùó¹zgïZ¯}ay¦^Igi=¥Ôxß ñ˜ÝrSÈÈ þ4ê—1hÓêšÌzGü#í¥›}a¤È‚I^uûSEä¦DAÀÁ¬)ï$#@)wqs‡6“ª‹¥%º@’,-ovmÄÒì8ÜéDåˆ(Lªù¼îÂ\øjñ4øµ™tåîÖÝekPʉ||™)Éè>•cÅšoŠ´‘§Yxµ#[¡²[£/—´hÅ#ÞAE`:Ça@bM¥Iâ¼›Þá­#I·^XÍå¶÷Ì‹¾$³|/•˜ãÚÇåÃçV=Ö —Þ}.ÖçC†=BòY…U¼¦˜|–‘|öÜÈë‘– ´HU@Ç}ay¦^Igi=¥Ôxß ñ˜ÝrSÈÈ þ4-…ãù{m'o6'žOAµ½ vfM/…n§þÊ ÚUÌ,’£íˆ×:I·ËJ6°å‰ªæ£¨éúg‡æ¸[oÍâ=ö‹9Ž y£É¼ÜÑ¢fWÙƒm  °$ Gý“©o¹Oìû½ö®Ép¾KfUv!øùHXä$ÈDZªòA4) ˈ“&ø™”€ë¸®WÔnVÁ¨Ñ5H´K}3_µÓ—C0ÝÝ&3Å+º‰D˜aöÛv2É´G y™‡á±ÿoEöß#o•7“öŒyhòŸÈß»åÛæùyßòcï|¹ªöº±}§O¨ÙéW×0nó®a·wŽ=£sn`00'=\Óü!¯j:¦‘`ºeÜ«8rOªH§¸;yER‘œh°Öµ=?NðÄW1Çዽ{eªHÖö–챿™}æb5Q¢cµ”åg÷oW èšeæ©‹y¡Á¤ M^2¤žYˆ¹XV)4»L^Fr2]Š·Ÿ kÂââÜèš—Ÿnñ$ñý•÷DÒ# 1X¹ã5èZÄvwW’iWÉki)‚æf·pȱ…l0yäP ýûz/¶ù|©¼Ÿ´cËûG”þFýß.ß7ËÎÿ“{åÍvšþŸe{áÛ%ŸÃðjÒÛÛÜÍuq[Åå¤÷ÑÌT¢¨r¿¹R±†/°5æðA5ÕÄVöñI4ò¸HãK3±8É$ñй¨Xk™ƒR´¾‡ì;`1ÜÆëö}û¤TÃ}Ýß;Æ~cë@‘¯MáD±Ö“O±Ò¥·2ßï™o-£Ù//‘åGå4ì¡>ÎWÊeˆôl0×7ã]G캵”6–ÞTK{K© Y–K ‰7Ü o Cpiݹ¸ùàšÖâ[{ˆ¤†xœ¤‘È¥YAäxÅh?†µèíí.DÔ– ×Dµ‘­\,ìã(ã XrÎ{PylºŸ‹|Z!¶Ò®¦:€m9öÊ8£4¬Åt’ð  €V|¯£¿‡5ag‡ ¯›pñ1™%|o"8ñ"­Öà6’3åœ(‘faÃßX^i—’YßÚOiu7äÂo Iâ'{vUaeöXàÛ ‘WxÛò-ÏÉ–ÃsæÉë5扨ÝÙÝ&~Íw5™™òÞHˆˆÆTúá†@ÍXÿ„_X“ìKkc=ä×Q,¢hžI#ÝæWP8fHÚ@;¡ 8  ‰ÿ³¾Ãã_ìì?ìϵÇö?¶nûg“ç6ϲîù¾î7ç¸Ícø_ìÛÑ}·ÈÛåMäý£_Ú<§ò7îùvù¾^wü˜ûß.jœzN¥6—6©Ÿvú|/²[µ…ŒHÜpÏŒó/÷µ$Ú±o´³iWÑÇuOnïnàK®öu$|Êæ$p=(Ô.÷ÞxVí¿á¼Õìâ´æ²G³4Úƒ:(}°–ÆÀF[ï®ì+ŽÄ7ZeŸ…Ù´;} íåÕoà·¤2]¥‹òAṼ$I‡uÞ¸PCa¹x4mcí×Zé=ŒÉ—“ÚÝ‹ýL/(,„}í›¶äP 5N='R›K›T‹O»}>Ù-ÚÂÆ$n8gÆù—‚{Zë þÌš_ ÝOý”´«˜X%GÛ®t “o–”maËV¦%„WͨÚx~ç\Ù kse<ËæÒÆö¥ÿã߈†pG;„¹àí´k˽9o MþeÚYÁ ‚d¸‘$F |Û~PØä#ãæ¡wàYËeè×Ïuw•m’ÖC*e¥P¬»rˆ$`;¨Ï®;K-gA^¥ý ¤Q[YjñÆ.S*eû@19Fpé%¸ó±k° 2]I£0Cá‰m—X‰´˜‚9~ÇåÜló$NIßîÚáLÊÞw…¬Of·‘iWÒZ´RN³%»”1Æ@‘ÃcT è3Íè·öòéЛYÍÆ¡Ko‚@îЦÐToÝ€A]Àîç w‘j‰g«ë¶vOáôºÔ4È–%’+6‹ÎYã}Žøû6DaùM¨ûP•ü£îh´ï‡Ökno”qŽ>aÈ4Ü]µ³XÚ›|)/‰>ɼ»$¶ &»ŒH«˜?ÑF@Ü@ÊBXðï¥Ew·¨Á¥C Œ«²Ùfuk…w*>β ìª9;°Áqžk>úÂóL¼’ÎþÒ{K¨ñ¾ã1ºä2§‘Aüj½zÅ¢ønÃPñ¢÷:Qµ½»¹’Ê [ˆÒaföwÁUN‹qh—a•‚A”Îõñ Õ{Y-Òtn-F1ò…dÉ(ãnâÄ‘»s†ÙtPEPEPEP^õðBîâ×Á×Ëk,—λÏð.>kÁkß>¨o Ý×ûÿè¸èÔ¬äÖ-œJ.uêѺŸ¡5ãÿ^Ñüi­]Éæ+·’ª:ùHyÏaÈú×а/“Ò¾eø¬v|LÖ _'÷å**+¢¢ìî}WEU’QEgêzÞ£y_o¸ò¼Ü‘„gÚ«Ò6ÐvF¹°«‘’2*äÃuoż±Í¨9#`ÊêFApAæ¸ø­u{¿ø…bÔ#°’$µ{wX„­4ËWR6ˆ„ßjΑ³÷£U]ò6§ÿ¾™ªéPý–æ=ÖöZl-˜/pJˆ£caèæm@€›Ô€vNÃU±ÔÞñ,ncœÙ\[œ„”*±Lô$ÇCy ÿ O5õ¼÷×’È5qÍ™c¶Å”dB¡ 6LŸòÓpaòÕiøBÂÏLÔÿ²¬~Ãÿ_›cû7·úï/ï|¿Þùs^@ã¿ߨ¾ ê¶1½Ý­ÕëÃg$ß'Ú"O³3ÆC6÷'kù[0Dƒ=ä-ͼS $ˆD‘²0g•` Ÿbê;Û}B†ê?25–9€ÜF7YñèʧßñV(Ÿðoü€îì+©élÕÐWởG§Þ-†•¥Oj5]Gd“êrDíþ™6r¢œÿõã¥uö·šŸ‡®lþÑýŸ}shñyÖî_ìò2¹å'i9å'¨BЧ¤ÙͧhÖ6Wr^OooR\ÉÓ2¨ÎI9$g©ëÔÕÊ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*ž§©C¥Z¥Äë##ÜAnNéeX”òGœíž½*årÿ,,ï|*Ò_ÚAqkewm{0š0á!Šdi›®"dH$s‚ÔQ\]þý²–w>†ÒïKKq 2Zx’êÆ ˜mT·VB1œçŒcåsÃz>£§ê2KygäÆb*þ+Ëüœƒ.d :˜Ž   ,‚ûìÓ6}m§^lû&¡?•äÏ¿^6¹tÞÛ½W’†`§búúßN³’êêO.À$)bI *ªŒ–bH@$’šó8!]RãÞÓ|Oiwi¦ÜAsö[hZ+›x-J.ó!ÜwyhP¤m½ƒàÙk´Öµ QÒ|Acu¨yk¦Åºù¢Ïgû±*J£†¬ù—ŽT€cO×Þ¢,.ô«í2éâi¡K³ y¨…Cb‘ÀÚ]>ö3¸c88§oã®Öèé”Z]ÛĶú“ù>T‚V m@rÈP¸n ƒŒ}P›[ñÔ7 ¯hÚÔ:dé,š\%šXJ&iHp1·o?ykíjÖº†t¿h×ÑÃ{e:hµd¾X­åI”™¾GHábÛ£\•+µX@©EPE^ùï#³‘¬ ‚{¡‘Ï1‰‘œ°V#Œÿ ôã­cø‡þCžÿ°¬ŸúEu]qz„úô¾$ðªêšn›möœ…^×PyØ·Øîx*Рç=‡ñÚP_xïþJ‰ì+uÿ£Z¾ß¯Žü]á™ï|yâ©þÝcQÞOw¾we#rѳ—ª¿~ñÇÈ# ´Ïiö­yñ½´Ò¯4ØRO,ùË9YY‰Ïr¥è7n?pô^ ñ~kâ¯ooµHõ=B´\´iˆ#ònm×É"Fó”-ÎW&1ˆÔp+ÌÃðÿXºÐ'Ö­ŠOgK,o3mš(‹9b‘Î×es·îå”7€oTN«©é¯=¥ÇÙïàS.ë&Ë#—&=¬`—>Y|íùwddå߉<7s Úè^^ª,mb„ù›có&’)nÛo\F®.³»ç1•ÆÙ>ñ¯¯ø“G׿µL±ß&íVûP²UTgÚ6$9;6yjØ÷ä®SïV_ˆ´[M-­/ã¾¶FâIâ#-çÍ:+c9sÛ$Ú ”~²×«¼šîxZÑ„›˜ ‡qÝÃÌ,rØÚW0a@&­ãëMBüÜÇ5Ü)yz×—1[é¶ù¤‹µ˜nÀó˜0 u ýæS“ñ&¡g¨ê1½œÛÇAæÆ"]Ä–b«2Ä¥˜ŠÅw#h`‹Ðj/Š/t½æ ăP–Ъ¹’KuGC&ÕÃ1Ž)l{˜*T>óþ$ðÕÿ…õìõÃKš'òäzW;$Uuù•‡Ì£¦FA€liž$ÑàÓ­ò;ã}g¥^i¤*žYó…ÁYY‰Ïr¥è7n?på뺖›ªÃkuÝ® -ííåF "a…bÊœ’åö+rg#çÎà[øSR¹·µ¸ŒGä\YMz$ù¶¢Æ'%ãØZÊTwÇQÎ4"ð 캤rêzh¸kÔÓ®A2âÒé÷lŠCåòKFëº=ê òÀH_Šoìõ?ÝÞX]ê·v²lÙ6­ ’å°Šö@ö¶,<]gkáu³’Ïv§¤övóy@ªÇ!`¶íÃ+wvN8Ü–ü|­œôð°>t’ëºTV¶þZOuºi#Žg߈r‘±fÄnw hð¼9ÈÍ?é°èÞ*Õô»v‘ ²½šÞ6‚ÅQÊ‚pΠ Âãâ›=Ò¸±’$¿¸gÕÚ8U]ÖH¥Y 7.òì)|ü©nFÎ=î¹ ëž%ÓŸUµ»µÐà·(ðé±¢JŒæIœF•&•ÂŽÑ…æÉ65¯‡óZøƒQ±Ó/­.#¶½šÕcó‹JŒ­ lBíieX˜*¦~•¶1År÷úlÚrY™Ú=÷VâàF ß³0PàŽ (=UÐ÷ “Lñ&hבßë=*óL…!TòÏœ. ÊÌNx3•(A»qû†ÄÞ1°ƒQÒ5;o·]Ý[jßN“$vþ`Œî #¡"âL³þý‘ærÁ·˜öžûN[–Ôlmæ–Ò{Û{I¼Ó$ðÂ$.ÊU b̧+Ó?†^YtX-'‚Iµ-=îã"F"GV”yJ¥–nÜøÃa†.iÚ®ƒ¤ZëðXßk(÷ºgØá›ìè¦V2¬¼ v…PF@2d31þå~"ÓaÒìä”]ÿhXé—ZlP,Jb•góÿxÒn ý¡¾PŸ,|ÃwËNÃÃ/4ëÌð$’iSêI‘’L"Hʧäl1Tó@8 …pÀ°4GáÉt{mAo,w]ZKyoiæŸ:Hâi§p»DLß1‡ YPcCÖ4M }&úÝ/žÿÊ»ƒQó¢ŠXTJm¿µ\³#à1È5 þ3µƒV[Ø¥¾¸û= ³c·‚ÁJ4#8HAXÙƒ'ßýàYK ¢3«xN}#N¹¹—Q±šk;´²¼´‡Íó-¦a!ÚÅ#`Äà”fjž•¢JÞâîkûM>ÎÝÒ7¹ºó1D4vÉç8ÇÊrA 1 ­†¬²I©Ix˜êˆ‘²ï;ÌË’AÛŒ'9$W`Þ5ÐDºÄé¥çëw¯utYmºËÔNˆ7eÊÁ‰_3"p¸++19àÎT íÇî_Y,¶1Ûj]ùÚ%Ö¤Ò#ÉJñ5ÀÛèw , ê¹ÚÀ0ʚϛA²ÀÖZàÕ`“]Ï Z0“sà.#Û¸y…Ž[Jãæ (cXñ&…âŸɪêqÏÝÏ*@Tª\Ûî’T‰‚ÝHÌBLƒæ8ef’=3X¶¾ð¯ˆS[Ö®í^òöÇ)gHÒ¢%ÆÊó#%ýÞáqqŒ}sÂ÷:½´·7v’<È®bŒ¸eVk ê¢T;Xy‘N>÷Ì»«èZRê×WP´±¡†ÊâåQÈc‰Ÿ B0È […#r’ vŸÄK}RÖî.K;¹ö%,m¦,·Ìçý)Ç™vRª¼…8*\•¹¤x¿G> Õ/!½¾²“V–ïR¸™£HÍŒŸd» °“÷­ºã O–IEã-òññøFò]ÛP[Ë×V’Þ[Úy§Î’8šA)ÆÜ.Ñ7Ì@a–`TeézlÚµúÙ[´bwG1«“ûÆT,p .ÄmQÝ™Gzé-üC£Ûël[ï›L²Ò®ôß´}Ïç­ÇÏåy›FÖ¸Æ7œ„ÎFp$µñ¼>·°Ý$Wv¶W*©§[HeYZR[í. ‘ LÀ¢©ÈS†Rä®\>œÙÇy{¨Øéö­R4—>i1´¦O)cF`Α4ƒ» œüÀçÁÚ¥ž£…Ï‘ÓZ]]2ÎÁng) »6ïŒd¯<œ\:ý‡ˆ–ÞÕ¤}ÚÞâÆ&…p\KC%ÐFÁ.äù›XçcÜTÆ×<7wàIt„Ôõ[ X>ÇlÀC³]m–úRÆ?5—™cb2Ûhù¸sÉëÞ>‰µm6êIR)bŠÕ¤fhdŒ:Èr€(Ákýݤ1IðûêºuÞ ú…¤±E4·nÃA!\*«3«# CØñ7ŠlõÝHá–ú«nïU¸³(<çm ‡Ë²à”ë¦>hí|E¦Àšav^×L¼Óo‰p‹3\bHÎ¸'iÙÊcwÍ‘ü ·ñyðÞÞØÙ_ÅÔËc3HÒJ–þ`«"4}a•Fæ)èA6$øq¬ aô»k›˨.ÚÒémäû;‘Á8_›)µ70ÚT¨|)±¦x£IÓlîtˆî¯žÅ¼‡ŽêóL·¼ Æf%ÚV)“99Ç*ÇþZ¹zæ» Ý¬¯i,†ïV¸šóR‘ñ¼î”˜àbC·Í%«* k‹—µ;;«È//¬m>Ëh—Å®ÄÐy–í/”Òxà ¯ÆÖÛŠùäça¸–$š9ѪË`®ûÃp¯ P(Ò4éO¬C:êš•¬æÞòI¯(áto²L©’ŽÌá¤;ea’Íœï0íüC£Ûël[ï›L²Ò®ôß´}Ïç­ÇÏåy›FÖ¸Æ7œ„ÎFp9½/M›V¿[HZ4%G’BBÇ!ws€NU›q€ À®‚OK‚êG_Ñ¿³ Dÿl-2®$yÐa BF;­ÜªO ýÐÅ@$Ó‰¢Š+BBŠ(  ýODÓµŸ+íöþo•0웕±º6ÚFøÛr6U°2\0B× pÑFgDdI ʬA`P U$wÚ=*J(1+p÷ bwEG(Üʤ•õ bmÇÖ£·±·´žîh#Ù%Ü¢iÎâw¸EŒz|¨£O\ÕŠ(.i–ú¡Ôc‚A>ö‘PÏ!Š7lîtˆ¶Äs¹²Ê ï“ó6u(¢€ (¢€9ÿÿÈçþº—þ–Í]sþ ÿÏý…u/ý-šº *ž•ªØëš]¾§¦\Çsgp›â•:0þ`ƒAäAÁr±ü7ámÂ:t–ŸÙ-d”ÌÉæ¼™r'.Iè£ò  Š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈsÂö“ÿH®« ®Ä?òðŸý…dÿÒ+ªè(¯Žhù~noĺl:7е}.ݤh,¯f·¤ ±Tr œ3è(A|k©-þ«wäZª^›Ë¨Ê6ÖÜ“#Æ>l„e¸‘O;‡0#5©_®¡p²Gcie D‚ÕX*Œ’rX³±$“–bz€‰©xCÃú¯‹õõµ–{ ];U¸ŽëpUGs>ØÕŒJ¢Ù“8“!ƒòÎ]Ï…´ûFÏûKV³™í ·´´‘£v–fFÙd·P ¹D2dÛœ¡ÜÏÛx¯Rµðüš4f?!’DÞb+•$)ÎÍP1Òâqÿ- hEãëØµH5Ó4Óp·©¨Ü’%ÅÝÒnÙ,ƒÌà†‘Ûl{–åH M[ÀVv~&ŸN´7ÒÚÁ§êw’ÈHbŸf–ê8˸ Lž¥ÎÈÆŒ-´xµ[)¬4kè,c´°7d\!Vó-cuP B„± ¹ƒ6Ñ‚(ËÄaöØãÓì^ÖæUmfFxá•7yl ¶[`‘ÀW.¤7ÌЧ«jSk:Íö©p±¬÷·\H±‚3±bI8Éõ5ÜZÛèÚ7‹|s%æŸ%ñÒVµÀŠ?ÒÒ˜Úˆ’$ãäÚ¸8Pv”ǰð¤7©§:‹·I´+ÝRå“Dеʧn´1žì@##׌Ωª5Ìöqé‰5ïöÛé-"Ë=Âï(Á¥‘ü²Ü\ÞN×Ú¢¹ýWR›WÕ./çXÑæ|ˆâ$KÑQ'j*€ª;jÐ×`†ÃQ£Í¦;ÊÊ oµÜ.[ÔíU=€«.úÂóL¼’ÎþÒ{K¨ñ¾ã1ºä2§‘Aüh¨Ñ¼Wg§øzHnbóµí.l-ÑÛo28+æ™>\<²?8Û¼+0ç×neµÑâ#·ŸIFK{¨ÖR ­(ÉÝ€Uˆ*çœàcrßÃz<ú>š<Ëïí;í*ïPݹ0ù pqŒn}ëÜev›/«%¦…cªÍá;iÞ;8%ÑînîæUÚ\C5Û’Ä+•ˆ.í¬@ål ñx¢æ?Ï®=¥¤Ï2MZ¸qÅ$m”¡X2¢£mPm@éQÃâKÈ>Ŷ8Øôû><©æ9¼íÄó÷‡žø=8^9é.|- @ŸÚ6ÚZµœÏm½¥¤´³4ê6Ë%¸2€mÈâ!“&ÜåãXðŽ‹§jÎÔ¤¾´¸»ò˜0C# FcdýÙ ë"²üçË+,OÄ>+³Õ<<Öpźúúî+ýBo²sp© vÝæ9}æRxòÑv|¨7¶0ô­hé¶÷“XZjw’=µÑ/˜‚81º6@wÎ>cHt1𾇡[ÜǦêr]^i÷¿a»Jê͇ËaEˆæ3„.rpØB[/Ãf—}ö©uS86GÙ¾ÏÊÙÚ9ŽEF;NRê ^ûĨhpiriö1ùWrÝý¢dvypm åªá¨1°c9¹/Œ®e¿ûxÓtÔ»™ä{Ù–7-zdFI7’ç`e’Lˆ¼±ód`ªØ“ÁÚ®ˆßjÔnãÕ¥·ºº‚ a•%U…åMÄã'ÈmÌf]›‰ „ËØ»ðV‚umjÚÊ}KÈÐïf‚äÌéºåR™°˜\F@µ)¸ïݼ>ÕÆÂÏÿÂesý©cxtÝ7˲²šÂ;EÒ#žhem®œLÃvíÇ’[$çÛk“[èÒiki<{äx$š2ÍnÒ*¬…v’ʈ2Á¶ív·5©ã;;Ko µ–›=„wWžc¹`ò¾ë™ö»0DÝ• ƒ´|»G fµ,¼¦Þø:ßSYîã¼{)n—Vrý±ÔÚlYOÌrf ÀM®Íê~ }KNŠÈiö6‘¬¦y ²0ó% ÛYŠÇœr±„S…ÈÂ&Úú.¬ú&¦/c¶‚ç÷RÂðÏ»c¤‘´lÖVû®z]'Œ|/¡èV÷1麜—Wš}ïØnÀº³aòĘQb9ŒáËœœ6–ËÐ4›;½:êþòÖúûeݽ”6v2ˆ¤’I„¥HbœyDm ’\r1‚^^Aö-±À~ǧÜiñåO1Íçn'Ÿ¼<÷ÁéÂðyÍ=*xm5K{™å»‰!4=£”2ò»XýÂX»¹Î6mÙÜ6á·-mtð®­¨ÝéZ”vföÈÙ¡• ò)K¥`'1€´d’#91…Æ~a¡©øCÑíní.µ‰$Õ•/e€"K–[yfýRÂà†û;ÆeØ’L¸¥êSi7ëw Æä#ÆñÈ Y#t(èpAÃ+2äFr85©«xºóVÑãÒžÎÆÚÒ/(F–Ñر´ìƒ–9ÿ—œ±Â’Kn-OÃúl:®­ä\4‚íî.¤Ö^R€B– ·v3œ`õ—^ÑíôË XiZãÇ{°‹LIç´“Ér¨Ë'‘ó)[e!Dyo4Ø€eÜ|@Ô®®/.¦±Ó^êå.âóÚ-7F’4Ëa@iƒc8,W*y:ì5½ÏHÓ¼[gyŸÙþ ‚Î ¥È#ì¸×b“ŒTqÀ©-4+Vo ÛNñÙÁ.sww2®Òâ®Ü–!Xä¬Awmb+`)ÇÔbc»É<9áHÆ¥r·:•Åœ:dz„ nçý¥`h·K f@ŇpÛ!^rãÑ4{Mj)§†Æ®h$e¸Ý‹uS´¬$Œœà°†ä€6@Ýx®d¿±û’[; w´nòMÌn†9 O£"?”å#HÔ1(ƒã+’†ÜiºoØ[Ù4nñ[º4ŒŽ»œ³ÓLvÈ]O˜AR‡5…å½µäÖ“Çku»ìóSÏLõ•Ïø7þ@w?öÔ¿ô¶jè(¢Š(Ÿðvµªkš›­èÓé:¼­os ‹„w\eâ9;£9àä÷ln=PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP'®ÞÎþ0ðÅ£i—qÀš›²Þ³EåH~Åqò¨_<žªÊyéž²¹ÿÿÈsÂö“ÿH®«  ¾)ñž£}iñ?ÄW–×—ÝGª\ªO¬® HÊ`rÞ>œWÚÕñŽÿ䡸—þ·_ú5¨o®ÓËÙu:ùQ<âB6FÛ· ôS½ò:ÍêjA«jBÞÞÜj~EºJGç6Ø–@DFpC×<æ©Ñ@?ˆî´‰\”ûd-hö~D×¢™·2~êD;I,J“´î$ŒóY÷÷מ£sy'™uu+Í3ís±%Ž$ž•^ŠÔ¼ñ.½¨\ZÜ^ëz•Ìö¾ÚI®ÚÈ9BNTåAÈô•ëºÄ——W’j·Ïuw‚æf¸róF@³–\0xàV} uÝa¢š#ªßæ•ç• ÃâIJ;°Ï,Ê̤žH$ WšþòâÎÚÎk¹äµµÝöx^BR-Ç-µO “ÉÇZ¯E\¹Õµ+Û‹›‹½Bîyî%Ä’ÌÌÓ(*@rNXˆ@?Ý‚ˆumJÚÈÙA¨]Åh]œÀ“2¡fC ã% R{‚GJ§EXšþòâÎÚÎk¹äµµÝöx^BR-Ç-µO “ÉÇZ±­ë7ž Ö'Ôïß}ÄÛA9' ªFX–8U,Kd’I'>ŠØ¸ñF±q Úhnž-2Ú#Ùb•Ö9s+K¹Ó;Y·?\tUôÍS][RT²EÔ.ÂX9{56-ذbcçä%€9äf©Ñ@®ë^]^Iªß=ÕÜF ™šáËÍvÎYpÁãCëºÄ–wVrj·Ïkw)žæ¸r“HH%Ýs†l€ryàV}róVÔµ {[{ÝBîæ DÙmÓ3¬+€0€œ(Âè=(ÓumKF¸k/P»±£Ik3DÅr R2ǰªtPÈõmJ.m.-Bí4ùŸ|¶‹3¸å“8'å^Hì=(¶¤·pº…Øîéä6æ™I+!9ÉpYˆn£qõªtP‹ËûÍBQ-íÜ÷2 Øy¤.Fæ.ÜŸVfcêXž¦¤VÔ¢·ñêiB‚5™‚…!ÁÎ1‰eÿ¦ýãštPËÍ[RÔ-ímïu »˜-e´sLΰ®Âp£  ô¨íoï,|ÿ±ÝÏoçÄÐMäÈS̾ò6:©ÀÈ<¯EI<ó]\Kqq,“O+—’I³;’I<’O9«’ëºÄßaóu[é?³ñö-×~ÍŒcËçäÆÕéº=+>Šè-¼oâKH¯üfù.¯å†[‹Ñu ü¥uU.%püƒŸº½1YrjS>—œ‹Vèþd‚0AžNpîI䪪8 3€ 9jtPO5­ÄWòÉ ñ8x䊲09È óš±¦êÚ–p×^¡wc;!F’Öf‰Šä¤daTè  ’jÚ”Ú\:\º…Ûéð¾ø­f1#sʦpÌÜÜúÕ:(  —𶥍¼ï}¨]Ý<î3O39‘‘J¡lžJ© ÐHúî±%Õœš­óÚÝÊg¹…®¤Ò w\á› žxŸEX°¼}?Q¶½ˆfKyRUÙ2T‚>d!‡NªAˆ5©©ø³UÔod¹K‰,ÃÛ½«Gm4˜hÚI™™Ã;»ìÙ-ètPÆÕµ&KÔmBì¥û‡¼S3báƒN~r““žNh][RT²EÔ.ÂX9{56-ذbcçä%€9äf©Ñ@â]yžõÛ[Ô‹ß KÆ7O›… T 9ùÀRFx8ªòjS>—œ‹Vèþd‚0AžNpîI䪪8 3€ 9jtP‰¯ï.,í¬æ»žK[]ßg…ä%"ÜrÛTð¹<œuªôQ@Q@Q@Q@{÷Àùîÿëýÿô\uà5ïß?äW»ÿ¯÷ÿÑqлZÿ©ü+牰ø‹¬F9òÌ2?Ô§Zú"×ýOá_=|C?ˆºÓ³pÞHÆ3Ü¥e[á}!EV QEQEQEQEQEsþ ÿÏý…u/ý-šº äü©Á-½öœ±Ý‰âÔõgkIV">Û/Ý”®Æ?0à1=}:Ê(¢Š+ð¾•â#ž#]NÿûCB»”]éòI1/nÌͺ¤ Q…*2̰¢€ *1<-pöë,ftEwŒ0ܪą$u•`}§Ò¤ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ä?òðŸý…dÿÒ+ªè+“×u8%ñ‡†4åŽìO¦îÎÖ’¬D}ŠãîÊWc˜pž¾‡eñψ<-ªëß|U ­´ª°êWK#C#ˆÕ¥m‡j+1Ý‘ªxç $}_øï[‹þ/Ú·šûÚk(–Š…è˜ð¸ãåa“¹‰äã8PJ×BÕï´ùõ =*úâÊ ÞuÌ6îñÇ´nmÌç ªóX^[ý£Ï´ž/³J Ÿ|e|©ì#gî·ÈÜ~Sèk¦Óè—–ÚfsÃøSoÌNë×Z–½aeg%ìú#²\‹XžMì%a0¹$œ°*1íŠÇIÔ¦ÒæÕ"ÓîßO…öKv°±‰Žñ€~eàžãÖºKßè÷ž+ñMÆûäÓ5íÿ¾û: ÝÝ™ ‚ÀüÀ€FH’]ò5Ò¼´óäÕ"óm¢„výëÄûÅ£8=G~*Åž¡g„µ]2c:ÝOwksnR0ÈÞZ̬¬K¼M@o»Ž3šØÓ¼Qa§ËỀ³´Ö:}ÖŸt¯mˆ¢VŸ(f"\ ‚J0Pvc8l€^úÂóL¼’ÎþÒ{K¨ñ¾ã1ºä2§‘AüjA¤êM`÷ë§Ý›4Ew¸·–ªÎQIl`ÊÊr¤u¡âf-böØÁ,’Ákn ÚÎ@F÷s¶FÔs݉9lŒí] oþo!»h,4{û#D×äQœcÄð~N‡ ú„5íGTÒ,L»õgÎIàuIà—o(ªC3ÍeßX^i—’YßÚOiu7ÃÈähd"c¸+meRª`2åA9 ¸‚9´-bÞ+ifÒ¯£Žê&žÝÞÝÀ–5]ìêHù”/ÌHàzT“êPËá]?KU“Ï·½¹¸v m+"@ª9ÎblñÜuíÖ?4t¾ÕnbKçþÝ»–æõZ_±ùÜÄV3¼ùØû[Ÿ/>XnÊ€qöš±äýJ¾¹óÿÕy6îþgßû¸ÿª—§üóîœXÒx&µ¸–Þâ)!ž')$r)VFy1]Æ•¨éú÷‡m<98’!koÒH×6öâGŠ{¦«ÌêªnÇÏó(vÃ‘Íø²úßSñ–¹g'™ku¨\M í#r4ŒTàò2ë@ kÆâÞÜhš—Ÿpò¤ý•÷JÑ’$ 1’T‚˜çAá­zêâ+{}RšymÅÔqÇjìÏ 8JÆî•诋´/ˆ7—gQÔµÄqjSÜ,ÛVØÊ#Ž#æ‘"0(bSj¨!Np8ûmWM¸·Ö4íRûRh/oc¼[õ·Y§‘£/ÏJXLXçqóg .×BÖ/´éõ=*úâÆ ÞuÌ6îñÇ´nmÌç ©&ðÖ½lá'Ñ5(œÜ-¨Wµu&fPË#ï• …êA»ÏøH4Í{íÞ&½ÿCš;MNÒ;oµÂ~k´H´·šÿ5È ^7—YkÿÅkø¦Îî JçO‹GQûD* ›V·fD0#æ2íܹ,FGÞ røOÄJÑKáýV9ËÜe #Ìb‘äcø˜¤`sXõè‘ø×A³ÐSJ´ƒRdŠÉíVI‘2ìcÔWy¾PZò3· 0Ëm¸ÿêPë>*ÕõKu‘`½½šâ5Á]ËpHΩ åеˆ~ÃæéWÑÿhcì[­Ü}§8Ç—ÇÏËÓ?xzÖ…‚}0iâæ->Þˆ …¸Ê[FUÜ»HÞOÌ_=a¿…õ„ð¼>#û í¦K,‘yË•M…ælm YöƒžYXvª÷-ý·ÙÚÎdº´7‰‘ aÜwò£+µ î\®Þù ©èóøy´éa¾‹ì·w76Q«#ïó’4 $˜vyJÙwäÝýêÐÓüSg¦ÿ`Ý[Ë}öŸ¥_X¹ì’_´¤Ãçƒ8Ï®ÜÙ  8ü5¯MªM¥Å¢jO¨B›å´[W2¢ñË&2̼‘ÜzÔo¡kÙÝ^I¥_%­¤¦ ™šÝÂC vƲ@Áç‘]f•¨éú÷‡m<98’!koÒH×6öâGŠ{¦«ÌêªnÇÏó(vÑ'ˆså0x£AµQ¾ó̃,UG®H ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñü‡<'ÿaY?ôŠêº çüCÿ!Ï ÿØVOý"º®‚€ øƒÇòPüKÿa[¯ýÕöý|Aã¿ù(~%ÿ°­×þjç袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ß¾ȯwÿ_ïÿ¢ã¯¯~øÿ"½ßý¿þ‹Ž€=Ú×ýOá_3|Pt?uˆÛ&}s}3kþ§ð¯˜~)‡ŠzÒ¢o$ÂÔÇQ=€ú¦Š(«¢Š(¢Š(¢Š(¢Š(¢Š(Ÿðoü€îì+©élÕÐW'à'M†ÞûT‹O´MBmOQInÖºý¶^ñ’>UàžÃÒºÊ(¢Š(¢Š*ž£¥XêÉn—öÑÎ-î#º‡wXåFÜ®§¨ þ`r rŠ(®Åpø”ÙÛÜøZ꾆PÒî5h.ÈR\ðë°à©çilŒtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÏø‡þCžÿ°¬ŸúEu]rzÃã j‘iö‰¨M©ºKv°¨•×ìW3ã$|«Á=‡¥u”WÈ>&Ó­[≣–+æNâ2Ll¡ÔLÙ«S°Ž6²1#;“'ëêø§Æzõ§Äÿ^[^\Cu©r©rGʼØzV|M BòÅ"$ɾ&e :î+•õ•†GpGjôÃá 4Ø%•òɦjÛ¶£,ˆÂâK{KÙ÷cËRÑÆY79Ã/9šzw4ÖðÕ¾£¨®¤—Ù-ç–$XÆÜ_Jp ÃÅfOc&ÿ˜§“žÿÄÙé×—zªZŸ`šI$ û‚BùLxýÙvoÝÜzf«É®ëïó5[çó7oÝpçvï3vyç>t¹õóûÇ †«àKº:GÚ¯¦Ôͦ¡qçáû,·#î`³y‹oŒn Î_;FŒeÑ-ï´{ *{{;{Kk‰—ψÉ(š¥aæCnù›—Þ?*ªüµŸ¨ø£Äš†ƒkgu}}ý™ûȈódòî¤óLîÒdíyJ¤ž¸ÙŸS‡4ó\¸yå’W¨ر ªG=‚€ìØf[Añ+Äš{GÐ[&®¨$1Á9FÚªT´‹_ èmá;{«­NEÕ¯,®/ …¬BÄÒ®ß-a`Àù-—2¦ÐÄ•!>l;ëÿiž#’òþïU´×cÆù§’HîW(˘eCéTãÕµ(t¹´¸µ ´Óæ}òÚ,Ì"vã–LàŸ•y#°ô  tQZf…¬k~oöN•}äãÌû%»Ë³9ÆvƒŒàõô4ŸE\IÔ¦ÒæÕ"ÓîßO…öKv°±‰Žñ€~eàžãÖ¬^øk^Ó^4¿Ñ5+W‘$tYí] *.ç##«É=‡&€2è©!‚k—)RJáÊ¢–!UK1ã°PI=€&¬G¤êSisj‘i÷o§Âû%»XXÄÇ øÀ?2ðOqë@è«X^[ý£Ï´ž/³J Ÿ|e|©ì#gî·ÈÜ~Sèj1Ín÷ †uG)Ú¬À•ô…b}§Ò€#¢¶„üH¶s^ê¢ÖþlÆÊM‘ì$>æÆÒ¬z`ç¥g¥…ä’ÚŤï%Þ>Ì‹&l±A°Ì ñÜÖ€+Ñ[øOÄ——6pøU’ê×oÚ!K) Ÿew(\ŽFzÖ\ðMkq-½ÄRC¡¢Š+AQ@Q@Q@Q@Q@ÿƒäsÿa]KÿKf®‚¹ÿÿÈçþº—þ–Í]QEQEQEQEWàM7ÅšGö½—ˆï ¼³Žì2u‘ÞF‰²Ä1vfÚ2 ÌÀ†*žÂ€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈsÂö“ÿH®« ®Ä?òðŸý…dÿÒ+ªè(¯•|döCÅÚÓÚ\h‹©‹¹<Ùn`ˆÆ‘‹›Ÿ3r:Òäg Ò0.àN~ª¯ˆö&¶.n¼7{¯k£ìúYê²Å£¬)Fᢺ(ÌzI™-‰2†ÇË+^_RA<Ö·\[Ë$3Äáã’6*ÈÀäG ƒÎh¨ñÄA‡äoìÓq6˜ZâM:â‰ä3©â5Tb…, ƒ· °Á:êZmƉ¡éW+¦´CB¾3ÊáL«2½Ü&òsßåi0Ü Åß_Þjw’^_ÝÏwu&7Í<†GlXòp…W @Ôu«]cÆzq¼m)á‹J„@Ëmqý¬Ø&Ū…*³…]²|ˆRäV…Û[5©±—Â’ø“ì‰Û˲K`¢k±(ÄŠ°yƒýd Ä ¡d%—Ñ@ÅÖ —Þ}.ÖçC†=BòY…U¼¦˜|–‘|öÜÈë‘– ´HU@Æ?o“Mñ÷‡îå’¡P€É$ê¥ €Ìwp0 ;¿‡ sôPiáÝGíV¾)Ô.í¼>ó‹(ä·Žê XGž²Çƒ.HŒJJ¨ÚäêÛ€6-¦Óî|>³Ì4ai%•Ûê Çn—ø™ŒZàJ©ÿ¼D`nÏeptP¤|Aÿ„nkÉ´¿ì¡pº‡î…–¿»3^¡Â¦_.CÓ!ºÊűü+7‡Ï†uK?K:Ã>¡fc÷ ©] ärc”6Õ$np­ÇÑ@‰s©Mª¦¥¨kShÊá/‡Ú¬¯ÊÜÛHí3‹xãY1,O,„ )3|ãiÙ¡q¯éW>9ñ¥ˆáƒQ¸Ôe’òïP¢š_³]Ƕ¢ÆŒgo¼Íœ§Ì0wy¹Òu%°KöÓîÅ›£:\[ËeWÄ60@fU'±`:š’ãE¿¶û {YÌ—V†ñ#ò$ "ŽþTev¡}Ë•Ûß €Öx^×FðµÅíÿ‰®£”„ŠÞ+m2â ¶’9‹‰ŽR`1G$G’WÏV!IÅoig{i6¥¥]ØéÑ^ÙÚê–׆+µ—Ëb~ò9]òX$ƒdì7§g&žÕ~ßwc5…ݽŻÜÜÇ-´›¡EMÙu Jƒ•Ì sRiÖ5»[›Ë;Í´SK5á‰ü”ò¢22—€Ä=Ùzf€;O^ÁâGñNŸ¢i–’^Oâ4–§4³K|nÉ—iw ’€ŸÓǵY|-á]ZÏ^Ðc7sÞÙKލ³@Ì.•U]€H\ä›×ÍÛèZÅÝä–vÚUô×QKäI vîÎ’aŽÂ d6Î:üèh¶Ðµ‹ÉÖ ]*úy›f#ŠÝÙŽô2'+0õPHàPiñ7[Ó/o¼›K}6õÝîØ_Ç4$@ê.m“ËÁR*N9äcRæO Å$vÚf¯º}.+­uHã¸ZNŠñ¿šÃË7c—lJ ‚¼žºÉ~j± ÂâÑÒ‰-o]|À¶RÇI";ʤråyŸwŒîMÀ’­¤ë¿gÔ5KI|­þ%ݬ±Â^ÚãlAÁ(K3çH̘ûÛ€äë¬ÿ„P[ˆ„·¶‘Z\$ kvÑ\¹3*F±rÞT¸Êvg8d-x XŠ Á1‚;ëX§¸{»Èa…Ú9dܪc ­ƒæpI^Ü»€;MBëÂIxLZVŒlcKư2ÞÀþt"Ö-]!$R[ÈÇžæ`Ø wo#ŸŽoj‘XǪ‹HòÈ^ÝÏc0ºKó†ŒF^Ø` QºA =Xž_ZÐ/¼>l“PXÒ[»´•²Ñ1ã*ãø\4m•ê½ eÐP÷Pj¾×îßJ¶º¬qCE¤r,ÂD‹?;FÉù!x8šè5[«ñe•”ÖþKvÓãœIh–Íßýª™2Š¿h%bÀ Ë‚Xù½蚎£§éžšám¼?7ˆ÷Ú,æ8-æŽ7&ósF‰˜Xy_f ´2‚À$¬> K ë+S£yP¥â[²Iú‹ÇûÌïc˜,pI'Tq+ò:(×5 ¯ %á1iZ1±/ÀË{ùЋYüµt†4‘Io#{™ƒ`)ݼŒ½3Z„ZJ,ÛCTÕô@%Y­­Rr—Ç ÁÔEî# ´í B6 •'Íè  'a¸–$š9ѪË`®ûÃp¯ P+¼ŽëÃo}m,vö+6«æß•#YÜdHa¤q›’ìQòžP·,q¾¼þŠõI&´L»‡„nï¢Ð•ä ¤j/VõÈØ .÷XCd (ûW>b²îããš+ÿkO(ÓVò=NÚå10ÊQÖeF Sw“ò.BõÀ5ÍÑ@Éc>Æ _ 5»\NšD ÚÑì¯UÒ®×Ó ‘$ž`8Ý´²–æà6¿ð•YÆóéPêh—Ðß<A·Ú^”ŒB!F€|¤ ž~mÕçôP XM 'ÃõO°ØË1´ŸísMyr%Îé<­¨bk†Âùyl±“Ã`y†¼þŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¯~øÿ"½ßý¿þ‹Ž¼½ûàGüŠ÷õþÿú.:÷k_õ?…|³ñe¶üVÖŽ:ôDuõ5¯úŸÂ¾eø¡”ø£­¹£FÜGS7dÔ´QEPQ@Q@Q@Q@ÓÃlç–8º g` ³0U÷,@¹ T”Éø'L‚+{íEd»3Ë©ê(È×r´@}¶_»mŠ~QÈPzúœõ•Ïø7þ@w?öÔ¿ô¶jè(¢Š(¢Š(¢Š(¢Š(¨ÄðµÃÛ¬±™ÑÞ0Ãr«‘ÔU€=öŸJ’¸¿ü;¶ÖöH9|U§¦‘öy4ÿ¶+«Ó&Ýö;,6O”Ìï7Ï÷›cÅów¯joÙÉym‹ÝTÝE»>"xÀÔ#øU$RxýÙóe—åû»>íbÝøRïO·—ûBòÆÒõ|Ò–3H|ÉV7dr¬ÇÃG ¸f)òƒ¹w9¼2ó]h¶“Àòj¶‚u“Ìb¹ódB6” ¸yev(rÌ>BÅ•hbé‹ysp–3Ù@ÛwØÛ$%/ð0<ðSìãË?2m¶9ÉÏÍóÕøK4åÑþÏ&öµoõz\Û¾Çc†Éò™çùþól’/˜sæ/œ~)­Þé³^ÚJööW7#cÉv‰²mh÷£©F%$TÈC‚7+öþ¹¹ÒÒì]Ú$ó[Ëw“óf‚=þdŠB”yRðÌì8+¸roÙÉym‹ÝTÝE»>"xÀÔ#øU$RxýÙóe—åû»>íøÏL[Ë›„±žÊÛ¾ÆÙ!)炟gYù“m±ÎN~ož±õÿÞx{íbk˦²»ûÚÚJ_Èï( *Ü#sò’Wi¾Z±á¯iz·©^ê:¿ökZÝÚDŽé½$óL¹|Ê‘?6Ý€u  ð–iË£ýžM;íjßêô¹·}ŽÇ “å3;ÏóýæÙ$_0çÌ^‰¼_g%å¶/uSuìø‰ãP\áT‘Iã÷gÍ–_—îìûµ¡«|7µ²Õ§K{¬ØÃi©ÊÂ[èåí¤ºXöÇò‘{ˆSÕðF>\?xwMÓ®5vÒ ÚA¤êgM.åYØ™vH¬ª£BùR>\.· !ñž˜·—7 c=” ·}²BRÿÏ>Î<³ó&Ûcœœüß=Wÿ„³N]ìòißkVÿW¥Í»ìv8lŸ)™ÞŸï6É"ù‡>bð2ô? ÜëÖW—pÝÚA£¢Éç—É$‘˜mSÂÇ ®{áp¡˜…%ׇfÓômNâìÆ—–šióÛ‰Ih˜¬¤ä*À˜È?ÊC7&ñ}œ—–ؽÕMÔ[³â'Œ Ar?…RE'ÝŸ6Y~_»³î×?âbÏX¼Yé0X(êÉòpÌR!Œl:üÛÌnk ¹Ñ.&†ëRÓ_ì·¢ÆòHdyÕØ¶Òä' ¬nØMÅvÁ[å¢ç¦-g[·šöÓN³Ó/ZÍî.žITI¹Â 1ÆY‰¹Ý±GÊs´Æ›ã]6ϰérAvgK)-Ë*.ÝÌšŠƒ÷³ŒÞÅÛø_ÐfžŸâ›=7ûêÞ[èï´ý*úÅÌhd’ý Å$n<ÆxvänÍG¯ø*m7ÅWZ]¤ñ´/®-ÚW%¼›gH|.7‘løÀÇ#¦N,\ü2Ö­ïä´Zl¾[Ì(œ¤`Æ“1Ë:®kk„à' U˜¾›â-6+nÅÚAi£Þi×Jìcu†E,¡€ œ•è}³&™âM :ѯ#¾7ÖzUæ™ B©åŸ8\•˜œðg*Pƒvã÷?«i/¥KúLV÷1yÖ÷0nÙ*nd$Ua‡G_™GÝÈÈ œúôGñ®‚§^¸Š HÝëWÝÊ$--µÜ^ZüÙ`¯r§yÆáŸ‘Já´5¯h>$е•“QÔ´è'½ˆ˜â$–ekBàš  E““‡ކ¼®Šè5-OGÖî¼I«^Ã}§}wö›¡dhS|¬Ò,¤€Ç @R sֺɾ$Y6­u~>×1ÔnY¢–Ò/.ÁZ˜öF›ŠÎ»w;„{ÊÃ21_3¢€=OX\i“è²jª[¼H­ª›H幜‰.dpÑ´£fÿµº–Br$`$Ô~!Ûj‰=Ô‰wo>ËôKãFŠSt×Hód6cNJ0ùN ù;¢€:O^h7ZN—y©M>ŸnmX]Y$*êfš]à¬ÎAÌ¡vã±9íTü=¬Yè÷†kÍ& õ=ñ¾>ùC«Äs‘ñ¿O—iù†=ÜCâû8ï.s{ª‹©vãÄI:ƒ`¼ŒG»T±|¿{ݪÿð–iÍ£ýž=;슿ë4¸w}Žû-‘沺Oò}åß$¿1ãË^EwxÏLkËk‡±žöݲÆå! a‘ƒäŸg>aùŸu°Æ>ožˆ|_gåÎouQu.Üx‰#PlâW‘ˆã÷cÊ–/—ïoûµÃÑ@‡ü%šshÿgNû"¯úÍ.ßc¾Ëdy¬®“üŸywÉ/Ìxò׃boéympö3ÞÀ»¶Xܤ!,20|€ìçÌ?3î¶ÀÇÍó×Ewø¾Î;ËœÞê¢ê]¸ñF Øį#ÇîÇ•,_/Þß÷j¿ü%šshÿgNû"¯úÍ.ßc¾Ëdy¬®“üŸywÉ/Ìxò׃ÇÑ@ÄÞ3ÓòÚáìg½wl±¹HBXd`ù'ÙϘ~gÝl1›ç¢ÙÇys›ÝT]K·"HÁÔø•äb8ýØò¥‹åûÛþípôPaÿ fœÚ?ÙãӾȫþ³K‡wØï²Ùk+¤ÿ'Þ]òKó<µàØ›Æzc^[\=Œ÷°.í–7)K Œ û9óÌû­†01ó|õÃÑ@Ä>/³Žòç7º¨º—n@ ösæ™÷[ `cæùè‡ÅöqÞ\æ÷URíLj’0uÀþ%yŽ?v<©bù~öÿ»\=ØÂY§6öxôï²*ÿ¬ÒáÝö;ì¶GšÊé?É÷—|’üÇ-x6&ñž˜×–×c=ì »eÊBÃ#È>Î|Ãó>ëaŒ |ß=pôPq‹ìã¼¹Íîª.¥Û$`ê üJò1~ìyRÅòýíÿv¸z( Š( Š( ½ûàGüŠ÷õþÿú.:ð÷ïò+Ýÿ×ûÿè¸èÝ­ÔþóÅi‚üPÖFA‡Ÿûc}?kþ§ð¯–~-05¬ÿÓýL•ÐXÑE@QEaÞxŠHuIì,tMKS{tC<–HÙ²B$©óíˆÀt'ï Ô†ñ$ûÎeeÂÊ|´2âB².£u_ÃPMco=äRAIsxTí¾fè ƒü³Ú|‚6hü=ÿ!ÏØV?ý"µ íüaÂZÝ#R‹K»x–ßR'ÊJÁbm¢C(YÊ7 ÁpqrúçÄ‘ÞH¶V•=¨ÆÉ'Ôä‰Ûœ¨€ç?Ä}xé\¼ðÜü9µðLrÆuçÓ"Ò-¦cK+¯dE,àœ+üXùˆO¢P›ü@þÖšãBšçDžk[+»m'‰“íuíË´mò¦ôS·kyùm›3^‰5¼R¼2@îš) –BGÝ;I8$zRQ@ÿƒäsÿa]KÿKf®‚¸ è×÷z}äðø›U²µ]GA©DÅäÂð³s×’zúq]¤´6ñDóI;¢id ÈxídõàèIEPEPEPEPEP{ëû=2ÎKËû¸--cÆù§F‹’ËIñ«^þÆßSÓ®l/#ó-n¢xfMÄnF0ÈädÒ³ü3 ÿÂ7£1/gº·ŽY ²ÌsöxK©9b¨¸±'ŽÃ 6(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢«ß[Ëwg$ÞÏe#cÀº`ƒÀueç§ õõæ€1üCÿ!Ï ÿØVOý"º®‚¸½CJ¼±ñ'…e¸ñ¥¨!ÔäQÔvê ýŽçæ\HsÆ:ã“ÇLv”WÆ*Õ~Áãß[Ëem{k6¯píÁp»ÖY¶Q•²¸Æqór8û>¾ ñßü”?ÿØVëÿFµE'‰ežÃì÷v4ê’G ÓBCA³;""‘¤‚P•Ýò‘µv³þh4ˆ¥Óìe]2) _1¼øÝʸ-Ž †@¬7d…#½ÚËH¾Ö|2ðØÚX[>…{s‰•DµáŽY°¤ÊA‰ |¤6ÜÛ„ m|Y:ëÑêƒN±Û£Ù-¡óLf‰¢*X¿˜ß+ r@  ª¢;\Ûiih--xmå´‚õƒù°Á&ÿ25‚|Ùye,7œ…Û©â}=5‹ýMNžkGOiZ(-U^wI猸†µ2‘µAÆ9,rÇcJ²Ñ×Âú}¤ðÁ,ÚŽ‰xc[dóhMÑYZfR긂5ÆÀ¶D ~¥âKÍSû_ÏŽþÕÔPŸb‘¶Aæà.IÂþù¸9<zæœz”Ñh×:Z¬~EÅÄ7ÄÁ£Y@çÄ­ž;ûÏÙhðiÚÝ­”0´}n;8¥‚Ù!Xáqqû¢B‡•”B›¤±-¼eäåôm?GojZ¾¬/¤û-ݵ¼pZH‘ù¾jLN]•¶ãÊ![¡ù·(š‡u-KY:¤ÐZ,æÞòßj#ÛrÓ´‡–ÎA¹|sÙsœ×ñŠ.|Cq<­iid—7 wq p³NÄæFÞÌIùˆ;W-´ Íž“UðF¥Ý#íWÓjfÓP¸óð‰ ý–[‘÷0Y¼Å·Æ7 „ç/¢å¿ôÕŒ¶ÚÈKàÍv.%Ã?š¬ñ'ä*Ȱ³ðøÏ!¨‹Ò«,èÐZÛÛEäÛÛA»dI¹œ€]™Ž]ݾf?{3è®ó@M"ÿÃS@eÓbKm2î[èn- ¸’à 2$â3±7dÛæ fvÿ8Ez†« _êwZ”¶/¡[j +hZˆ$–9Í«f0^hU£Ë‡£(ä•¿­­íî´—Žk®®4õšîK ³´²l""‰³1Ü]À†çvâËÑ]…¿†ôyô}4y—ßÚwÚUÞ¡»raòàãÜûÖ ¸Êì?6_;W °ð·†í<} ´1_]Úé¾%·Ò®íãÅϘòí;B 8`wy€ç÷yÀòú+¸Ñ|1£êÖž¥%ž«kkÉ-#{”%ãX.¥“/åÛ£ `RÙ!önOàM7O½½Ò§]Jöî+-Fð^ÛȱŠÛ=Äk¾2ŽHg·ï_õ¡zŒ°Ñ]Ådž4%žÑa:©†)LZ„›K4L¨Îë,~X{fP„œ ×o˜UœÂÊÕâÐ4wñ¥…³×.´«¨šUMÙq<«‡ÃBÛTH¹PNQpèT2@8ú(¢€ (¢€ + ð]½ï‰R;£Ç¥Üáî¼hñÛÉ"3¨r«*’»[ `‚  _E¿ÓàòÖ÷O2ÊÞLpù®·E¿ËŒ+ü«Ó¹c–`^Š( Š( Š( Š( Š( Š( Š( Š( Š( ½ûàGüŠ÷õþÿú.:ð÷ïò+Ýÿ×ûÿè¸èÝ­ÔþòßÅ2«ñ{W/·nè3¸d©Ž¾¤µÿSøWÌŸaþ(k^tKv“Û÷)Ö¦nÈõ5QTEPEPEPEPEP?àßùÜÿØWRÿÒÙ« ®Á¿ò¹ÿ°®¥ÿ¥³WA@Q@Q@Q@Q@Q@Q@vºý׈/´0ÒE¨Y¢Jb•vù±0–?ï bP‘Ñ”ƒŽ3©Xú׆ìõËÍ&òi'‚ëK»Vó[°WèCFX‚|· £À­Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º®‚¹ÿÿÈsÂö“ÿH®«  ¾ ñßü”?ÿØVëÿFµ}¿_ø¦ê-+ÄÞ4”çÍý½ûƒ:G9Df¸,UNTÿ ‚# 0p±uâÏ_ylñ«qäJ³Ãç^Èþ\‹÷]rxa“‚9Þ%¦Œ.u;M è¥%ž­½$H§æE¹h¼¦`Ò…, Ê~mäƒÃøJkkmu§»…#²¼xÅÜhñ™E´¦<«‚¬wìÀ äâ€)ÿnëÛÚÿÚ·ßÚóûö‡ó¾îß¿ßw޽8¨ãÕµ(t¹´¸µ ´Óæ}òÚ,Ì"vã–LàŸ•y#°ô¯T•|#iª^ÿeÛiWW_êàO¶ÚE….n£Îë”’"ÞZZvóù;œµ9„.Ä•6§ž<±•´[ñÍøÇÈþÜÌ?aÄ¥ÖÏʱÉÚÆܳº €RU\º€~Šê,ì|*þijþT„CöÉWç¶ ‚Ñ—Ÿ—7žå{rôU·Þgg}®°ù¾Ù¼Ãåù˜Û¿oMØã=qUè  KÏëÚ…Å­Åî·©\Ïhûí¤šéÝ¡lƒ”$åNTAéYóÏ5ÕÄ·É4ò¹y$‘‹3±9$“É$󚎊¹ú·Ëwä[¡µ+6Ø–@äÇž€02½òýy®ƒÄãoj–×¥–³pú‹Ëq§Û´S:l; ulüvŸ—<V-£¼»ø[wj÷ÚjÄ—°][Úµý¼rD¹¿—¼9|´c‘¹€@2c°½×ì¢Ôu†°¶Ñ®!Õµ9nm"—R‰MÔr[Þ$’O e0ßǶ'1>Qóïrçz‡ü&ë×RþÜSÔ6æ+Ÿ8Ms•h—†ùŸ*΃¯ ËÜŠÏ:î°ÑMÕoŒsJóʆáñ$Ž¥Øg–efRO$½Ãz¯‡ü5ã} µ¤×wÚý¦{ MLyóœ:¬æ†ãòYÈ“?}7ª³ ó9Ì-q+[Ç$p&4‘ò®x€œwÀÏ   ÕµíBãL·MCR¹žÑÕ4èÖgv…²¡DC9S•PúAQÿnëÛÚÿÚ·ßÚóûö‡ó¾îß¿ßw޽8¯@MWLÑõÏ j„hvð[j–û*ÃpDä_-|À¤òÜ)™ ¡Wf2m¯¡ýŠÞóT“SC½Öäò EÍ„E$ÒDö¥¸€áo›®D‚€<ÞŠõ JßGE¶ž+ßE¸ÓïܺÊrò î–Ô&üNUXB7„RÃ"Lªápü^l›F±kxôhˆp±¥“Å# ÷Õ£ áWä¹UÂᘙv€qtWAá‹OÝ}«û~ïìûvy?éRC»®ï¹m6‡®ßǶ=ú[Ǩܥ›ïµY\BÛ‹nL§%Tž1ÉUú”Íkqż²Cd›<¿ùo÷<Œy»ÎwqæPROÖ·ÛÜE$3Äå$ŽE*ÈÀà‚ ƒÆ+´ñögöuçÙÿ²¼ŸíþÅû“æ}‡î󼿟v>Ïþ¿çÎîûëQžÑ¾#x²@ú5ȹ½’H.$¹´,rHÌ$O´f K&åœÊ”ætU‹ÿ+ûFçÈò<Ÿ5ö}Ÿ—·'<ÏŸn:nù±×šèÀ{T”P?†÷QÏõ•Ïø‡þCžÿ°¬ŸúEu]ñW‹4ÛýWâW‰àÓ¬®o&Ó˜íâi/œÃ8PN2Gç_j×ÇZÞ£eeñűj(·—U¸,‚Ù.À•Áƒ†8‘]YFà>ö@9oÿ ü#fþÕÿ„Íjò¼Ï²ù™\oÇÉ»;:ó÷}«Eþx’ézÚtðÝj~WÙÞH$Tù‘]²Jç÷aþ|·kzV‹xÞÞM¢ßt—Iouj¢K;k‰fYžV,÷n¾bœLC*§Í´à©rV—ü$ºl:Þ…¯Åow.¡böF[v*‘¶DL+òXÉå«d…ÙÈÃç <;ªý¾îÆk »{‹;w¹¹Ž[i7BŠ›²ê•* ˜@æ«'Rk¿]>ìÙ¢+½À…¼µVrŠKcVP{•#¨­*ÿAÒ¼D$Š]Iôö²¹µ–á O5šh$zÅ¿1~S!ÎÒr3´X¶ñ\1[èÖò¶‚ÃG¿²1ðTMp.@uÆ1,Aäèp2‡u¡k:tæ•}oc>ß&ækwHäÜ7.Ö# 1ÔQ§XkœOg¦Z_]Ç$©ºhÞ@Òr™UêÁD¤wÀ~Ù®ÃÅ—ºdþÔ¯"›ý;^ÕaÕ ?i†O)v\llÅv”n“c>î#]Y~ºÓSÁZí–£ªÝØ¥Íí‘ÙiÊó*­Á £H™@Å 98;8ä‡k¡kÚtúž•}qcï:æwxãÚ76æ‚sÐV¦•áM­ÛØA¦jVW7`2K±ª4‰–W!r”Řs'­Ë¿èú¦£q¬^ZßC|Öš¬6ð”h×í&åÕÙÉàÜ”*p7îþŸ¨ø¦ÍìYº3¥Á…¼¶UpŒCceR{©«á­z;{K‡Ñ5%‚õÑ-dkW ;8Ê8À3žÕÔi¾5Ólü+—$ft²’ܲ¢íÜɨ¨?{8Íì]¿…ýdŸÆ:#O¨ÜÁý«Ö«ª®£pá"))p­BH•TÏÎí¢U,¤GÔ€rqøk^›T›K‹DÔŸP…7Ëh¶®eEã–Ld™y#¸õªñé:”Ú\Ú¤Z}Ûéð¾ÉnÖ1#qÃ>0̼Üz×Xž%Ñ£4rK}ýšñF¥Â)a‚åÀµ2LŒCE((ZM›D›c’O[Í¢4[îã»K{«UÚ[\K2Îò±w¼uóâv ªŸ6Ó‚¥ÉP>óIÔ´û{[‹Ý>îÚ ´ßm$в,Ë€r„Œ0Ñê=hÓtKY¸k}/O»¾P»Gk JÁrHPN2@ϸ­ÏkÖ¦[K}%Ô’‰gi¡Ž,€….dß÷̨çsîݸ§£êZlz5ö—ª-ß‘=ÄjÖ¡K;D²¯–w a1ùðÛv‘³À7еˆìî¯$Ò¯’ÖÒSÌÍná! ;c Ù `óÈ¢m X·ŠÚY´«è㺉§·w·p%W{:’>e ó8ž•Ök0Òµ3­\+êB[›‹·´‰¡Œ4k4ŽÃ·Æ›d`ÐbDl¹È.ñ†”%Ž@ú”Ïr“Åví q²¤°I_cbêTó„¬"fùƒœy`¶…¬^@³ÚéWÓÂÛ1$VîÊw¹9øYG«"£eÉÑŸU1È-ám„†'ÚÎT±öìÈdæ2Gqt=4«H5&H¬žÕd™.Æ=Ewå¯#;yÚ ¶Ð[Yñ›ª§‹J‹¸ßTÖ#ÔlÁ‰HÚ|¬‡wÊvι\wÍaÍ¡kòÛE6•}—R´èöî ²+ldPGÌÁ¾R ñÖ£Ô´KF¸[}SO»±:Çu DÅrF@`2ϱ®â?Ûj"ñ ’ý­Æ¹©““º Õ¸Ü]‚‹r„)`¸B7(Á¬?_EÓ´ùüåÓôóo+yÑË󛉤ÎèÉNVEl+6ÝÛK1Rh>ïFÖ?±lµIîl •d@î–±´òÆŽ0›¤IïRkºËoþo!»h,4{û#D×äQœcÄð~N‡8z%ü^±åͯڡvèqÝ• ­ŽDêsÊœ`à€ úÔ:òxhëÒ,ifnÝ6BÂBW®ÌÄë¸ðH d«bOjöºÖ£͇أX„f=° IÏîa‰{ŽªOq€.YÞh1ø*ûMžóR]Bæâ+ ©d´K:ªo3†óA-·åÁá¨/EÒ_[ÔÅ”w0[~êYži÷lDŽ6‘‰Ú¬ßu@kRÇÁ—ºÍü¶š妮a·yäk5—¨í·cÆ®IØ¥w[’ùÚIªÕïôKJ}šŽŸwfáÊm¸…£;‚«óÎ×CFSÜVÇœÚï…e¶A¾±½žüÁjžlR¢ Y@ #ò•P~Y ÀXØ×Q«ø×Þ!šH® »[CzoZ9“h™RmBq (Ä©µEá÷IcÑF@8¶ð¾°`·–ÞÆ{¯6(¥t·‰Ý ó]’%ò³à2âWB3š/¼/¬iö)y=ŒþO•æÎDOþ‹ûé .GÈÅâ`öï44¯"AâYõëèïõ-“cm¬Aqq}WN»ÔP±±³´–(¦–íØ`È$+…UfoõdaA# ãhb·.|©YiwW·³Ú[=µÄ¶Í»e;ÓÌU1ù\„gÀªw&ìxõ)¢Ñ®tµXü‹‹ˆnˆ;ƒF²*Î1‰[âYe³“0Áfn P+Üø+R²Òî¯og´¶{k‰mšv$Ëw§˜ªbò¹Î€TîMØv6šävv“ÝÝIÁ‘Û“…œOá[xºòx5qgc-õÿ˜'¾1‘–GóV·ÌI²»HØ›qìoeÓï#º… y8À“!È#”pTõî8ëÖ€$Ô´KF¸[}SO»±:Çu DÅrF@`2ϱ­Ò,O‚§ÖòI/㽂S H³Ÿ˜žYÉ„8ŽI$&~¥©ÏªÜ,÷Ú#ªÖÒ+uÆIåcUó×éè+BÛÄQÛxj}èšl©;¬rí?šdQ GâP™Q+6àñhž‹£ÜkÚ˜°µxc²†žQb8ÚFË„<œR5ÐXø.ÖKmRkÍzÆ(bÓÒöÊè ÌS)¹XYˆ zU[vÒ\šæôÍJm*éî XÙÞÞ{r6ËDÇ‚9Úä|uéZÞ(¹‚+ky--.m!²6/o(p³Ägk€«HÀ‚¥~è#9-ü/ss¥¥Ø»´Iæ·–î &/æÍ{üÉ…(ò¥á˜1ØpWtž,Ðl´ ëhlµX/–[H&a2†9 ;ãAµ‹’¸É Ø4^}ŒÆÖv&èE5¼7‹G‚K™#DF>l½P‘¼àŒ.Úz޹6§eoö¶‚X’4{¥Œù²¬i寒B…@vmÄ#Ó4-c[ó²t«ëÿ'gÙ-Þ]™Î3´g¯¡ªsÁ5­Ä¶÷I ñ9I#‘J²08 ƒÈ ñй¦k7ZG›öh¬dóq»ív\ãÆ<Ôm½{cK`Ñ—Ž?ÜJDël¶fÈß}®$¹u 2JL åŠleeK¯ˆúÅä²<¶Ö;e•ä•8®×Lè~l…a{2œÀmÁd×ÿ„Úsue+èÚS%ŒK¤H’Ãäl–I•ã‘d ¬3»æÀfÜà5W>¼MmVKËŽ9^A)q#&K*ʪaÝ…bÈ€A ›©ê^×´ku¸Õ4MJÆp‹%Õ«Ä¥°N`p DZ« ây’Âîßû;Móî‘ã{¤€ÆÂ7}å<´""7r !+òí#bm¯©k÷š­ºÁqšˆ®]6Þݳ‚9hÑIôÎ:z Ô𷇬õ=;PÔõí,¥†)|«n±,‚C漆9>Uò¶í YšE –¶>»¦bx‡SÒ|ï;ì7rÛy»vïØåwc'Æq“RiZÑÓmî-&°´Ô,î${k£ _1pctl€î1œ|Ç §}q©ê77÷’y—WR¼Ó>Ð7;Xàp2Ié@袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ß¾ȯwÿ_ïÿ¢ã¯¯~øÿ"½ßý¿þ‹Ž€=Ú×ýOá_*|]?ñuµµÿ®ú":ú®×ýOá_)|`'þ¶·Þí„t˜\QEÀ(¢Š(¢Š(¢Š(¢Š(¢Šçüÿ ;Ÿû ê_ú[5tÏø7þ@w?öÔ¿ô¶jè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÏÖô{}{GŸMºyãŽ]¤Ko)ŽHX2:0èÊʬ=Ç Ž(BŠÇðÏöêèâ/ù} ²D'‡í1«’²˜ ÅA g¶v®ÅQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsþ!ÿç„ÿì+'þ‘]WA\ÿˆä9á?û Éÿ¤WUÐP_ø‡Nµ¹ñÇ‹.î­¯/6ëÒZÅkg ŽIY& ‚Qóþ¯Bä–Œ`ý_x¶kø¾#x±,$¹F–þõ%3ñyŽÎW“ž09é@­á-!¼C¬ÛýŠù¤x5MF)-$H೎ .£òÛ*Z £÷€‘“SWÐô}KÄvÉa¦_YØÁ¥Cuvâdu|iâáP„‘ÄrÇvæÜûx+\“jºà²gkýDZ\Ï+±3>Éf)¶RyÃ9I0Ç®ƒP.­©*Y"êa,½š‰›ìX11óòÀŒr3@ž)ÒlôÅѧ²µ¾´QÓÅá‚öQ#®e•†™VTV/ñu"¤ûƒ‚­5YâÔŸP¸¸º´¤è±nbe“% y çw'zcòþóP”K{w=̃vi ‘¹‹·'Õ™˜ú–'©©$Õµ)´¸t¹u ·Óá}ñZ4ÌbFç•Là™¹¹õ óQð/‡m¯®--uYîfÒåž;õ‹Ì>g“ Ò·ÌÐ"@ÌmÙBî›ï Îê÷^ÑíôË XiZãÇ{°‹LIç´“Ér¨Ë'‘ó)[e!Dyo4Øòwz¶¼¯§¥æ¡©°D{šgͺ•VCOÈ „ ®8 Gj’ÊÿÄš¦¢ÐXÝê·—×QIG’I$ѱi$BK)%™‡BI'½IãH!µñ׈míâŽ"ÔîR8ãPªŠ%`€ãsÄžÔ|1§G{y.øÞQa¼‡’ ûÓBŠ~éàûc8æçžk«‰n.%’iåròI#gbrI'’Iç5éU–޾Óí'† fÔtKûÃÛ'˜³BnŠÊÓ2—UĨŽ6Ű2%ózÐ{ýcO³ºÐ仾¶µ2Ÿ´Ø4ŽˆdR3¾>›QÔdm”^k Ë{;kÉ­'ŽÖëwÙæxÈIvœ6Ö<6+cÃf—}ö©uS86GÙ¾ÏÊÙÚ9ŽEF;NRê 5ýåŵœ×sÉkk»ì𼄤[Ž[jž'“޵&›«jZ5Ã\iz…ÝŒì…KYš&+pJq=…Gmö=Fæ×lëäÊñââ/*A‚GΙ;[ŽW'Œš¯EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW¿|ÿ‘^ïþ¿ßÿEÇ^^ýð#þE{¿úÿý{µ¯úŸÂ¾TøÀ?âêkGþ¸ÿè˜ëê»_õ?…|¯ñw#â–¶qÁò?ôLt˜YÑEÀ(¢Š(¢Š(¢Š(¢Š(¢Šäü©Á-½öœ±Ý‰âÔõgkIV">Û/Ý”®Æ?0à1=}:Êçüÿ ;Ÿû ê_ú[5tQEQEQEQEQEQEQEQEQEQEW¿ûgöuÏöw‘öï)þÏöŒù~fÝøçnqœsбESÒŽ¤Ú]¹Ö#´MCf'ŽÍïU,ÁëƒÓ8ÉÆMÊ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠäõÝN |aá9c»Å©»³µ¤«b¸û²•ØÇæ'¯¡ÇY\ÿˆä9á?û Éÿ¤WUÐP_%xXËñ?Xˆÿg†»MR)ŒþR¢Ì$¹_åþH~n ÎIù‰?Z×Ä;ÿ’‡â_û ÝèÖ  Ñ_›ß‡i‰s¥B,î®e¸Ãͱ––vùŒÌèêJghr¨x¼Ù6bÖñèÑácK'ŠF(ï«F¯Ér «…Ã12íâè “DÔm´Ï ê·ÛM›Sûm¢Û¸f \yŒ¨ù >à;ƒ¹N#¨Õ!ðõ±Ô`ÓŽŒtÓPII’¸7Iů–ÌLì˜û'1’„nÝÿ-+Ìè ÃÆúÖ“OԅΔaû%´QÅm 1L]mãY·¬j ªºLpG– äŠþÖŽ¥x˜+X‰&Óã-Ý´3yŽ. ù@‘N~Rí·ýØÊ‚9z(¸Ó¿³?áƒöWسî¾ßæù?kûvfò6g÷ûã×ý_É÷·ËJÜŠ Ú^x‹P”ø~æÞêö{:ͤS‹sk|ÑŒ)0ÎaWVTÈS°Ÿ+¢€= >ãI·¿µ“ÃðkÓÛÅ%Ó][ÛùÆ&ºYH…”ÆjÚ¨žc •S¹óËøÒxn¼uâ‹ycš u;—ŽHØ2º™X‚à‚9ÍaÑ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@{÷Àùîÿëýÿô\uà5ïß?äW»ÿ¯÷ÿÑqлZÿ©ü+åï‹i»â^³µ²XÂî?s}Ckþ§ð¯—þ,J©ñ?ZRç$ÃòÿLR¦{ UÑEB (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈçþº—þ–Í]r~ Õ´Ù­ï´¸µ GÔ!Ôõ–ÑfS*/Ûeå“9æ^Hî=k¬ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ŠÇðîµq®YÝKu£_i3[ÝËna¼P …?+©†Rä3¸Àn;QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÏø‡þCžÿ°¬ŸúEu]rzî­¦Íã iqj¨C©»Ëh³)•ìW²g |ËÉÇ­u”WÄ;ÿ’‡â_û ÝèÖ¯·ëã肉Þ"ŽáÏ“4º•äOûÞ_žÀr;]ÝW®EgÑ[‡g×¾ØÑÝAm œ^tÒJ’ɵ{¶Ø‘ßhåöí^ ²ƒr÷ÃV–~·Õ[V´û{^ÜÛ=ª³É»Ëò°• <ÂÅ·í*Wi'"€9º+¸¹øSâKF‰gX"fóC8’‰Ò)%(d‘+Ÿ:3 ÆKA9öþº¹–FR±k´ûbÞ¢Nèñdg±B«Fà³ Q·“ó&à^Š’xZÚâXÆ^7(Æ9ÔqÃ)!‡¸$ÕQEV爴‹*-ì/$»KË#<“2lVq<Ñ€ó³÷c°OR;E=3DÔu¯5tÛµM?Ñãu3Iœýȳ¾LIÚÐ2p(>Š( Š+qt‹à©õ…¼’Køï` TÂD’,çæ'–raŽ#’I‡E\ÒôÙµkõ´…£BQäy$$,q¢w8áUY°'œ ÔO ó§mwJ]6/,hn™£g}ûSbÆeV>TŸy„ÎpÈXŸ¢·'ÐÇFÖe½Y"Ô4ÝN ˆ2•–ãx8ÎHh@uëÆ sÂ÷:½´·7v’<È®bŒ¸eVk ê¢T;Xy‘N>÷Ì»€0袷H±> ŸX[É$¿ŽöL$I"Î~byg&xà9$€tU‹)u ÈíaxGÎ ó¤(0 åÜ…;žzu¢úÂóL¼’ÎþÒ{K¨ñ¾ã1ºä2§‘Aüh½¸ºE‰ðTúÂÞI%üw°@Ð*a"IsóË90ƒÇÉ$„)ëD6`ÿÑ1×Ôö¿ê ùkâÞßøZzÖïXôLt˜XQEÀ(¢Š(¢Š(¢Š(¢Š(ªzŽ«c¤¥»ßÜǸ¸ŽÖÝd•Ûj¢Ž¤“ùIÀÕÊçüÿ ;Ÿû ê_ú[5tÏø7þ@w?öÔ¿ô¶jè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(>ïDÓ¯µ;V¹·ß}¦ù¿d—{/Ì]¯À89ƒŽÕ¡EQXzOЬumgPÑÄ7vz…“¶mï"òšhƒÅýø‹Ä ŒîPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?âùxOþ²éÕtÏø‡þCžÿ°¬ŸúEu]ñ¯‹õéìþ(k—f·š;{ËëE·6üªà•`Ù>cœƒÁ<`ÙUñ?Äx£‹âOˆÖ4ê1 6KHÿd’Jÿ²ES¶ñ5Ͷ˜–‹kjÓÅo-¬Œ͆7ï@m„2^YK çaq£®M©Ù[Á=­ –$éc>l«yq†$¡PÂÝ€[qŽÆÎ-6_ évîãE½»1:æ4otÂCuŸ5YD@„«lU$b<ê€44]YôML^ÇmÏáŸvÇI#hج­÷\ô"‹mYíô;ý'ìÐI ä°Ìd}Ûâx·…+†‘#ƒ¸¼`ŒÖ}ÒkÞ5Ô¼Ek=½Üˆ“\ †0£͹—,xÝw úô$Ç7‹'¸ñ©«K§X²ê»¾ÛeûÑ ¹uó¿zþñøqÈÇÝùkŸ¢€7Äó%…Ý¿öv›çÝ#Æ÷I„nûÊyhDDnäBWåÚFÄÛNïUû^§iß`±‡ì>oúL0íšã{nýëgæÛÑz`V}©¢kGE¸ó……¥Ù’G碑NUÒHHÉà6‚UH‘|Eptë‹9m,fY%–h­Àû3Êe1¢áåU©Ù´Øy¬z(°²ñ´_ÛRj:†bòMÙ»’$}÷“K±ƒ!2|ŠZRXE°rxʦ)Åã b½‚oì4Ájˆ¶vÃÎQjUÙÃG*È&|’72–éò¦ÞnŠ’yšæâYÜFG.Â8Õs¨G°ÕPEPI{㉓N:vi£\iÈc¶ºÓ¦¹IR2Ò3&數-+’qžqœqUÇŠõ).óP1ê×û!ºÕ7]4 ÈU” î<:¶:Œk¤ñ‡‚ô¬·vÏ}-­¾ -ä†I“{ÇæÜÅĶlݳ´Þ¨ÇÈK×Ôô=ÇQñuÖ£öé£Ó5±e6†(|Ðæã9!6Ç(•à¨Peãï¯ï5;É//î绺“æžC#¶,y8«ֆ»¦bx‡SÒ|ï;ì7rÛy»vïØåwc'Æq“[$ð.£á:;ÛÉwÆòˆ€û äͳú%ÌùÝœ¨ŠL}Ó÷±žÙÁÀy¼Iywg¬Ay2j·qÞÏ;©WI”Èw(RgÍpAsÀF§âԴ謆ŸciÊgÛ#2R-µ˜¬yÇ+E8\Œ"mÏ¿³}?Q¹²”æKy^&;2T~W‡NŒÀ5±à»;{ߤwFŽ;K¹ÃÜ!xÑã·’DgPåVU%v¶@Á~·-¼E·†§Ñ‰¦Ê“ºÈ÷.Óù¦E~% •°nµÇrxY€¶Ó£}ûϺ2€ËöÉeÂ`äáí!qÎãô=@?oyi‘[]Ï rÿ¬Hä*ådä¿+ºý‡BjÁ×u†ŠhŽ«|cšWžT7‰$u(îÃ<³+2’y x5Òx.m*Y7ãM7Õàû\q³e-nä]»ÁãÎKp@Ც٠´ôøzÖãS·Ó&ðúèÉoªFÂq ÓÉp ÏÙÄNá¥ËåYHBF7bÌæ¿¼¸ûGŸw<¿i”O>ù y² ØvÏÞo¹<üÇÔÕzê”[ÿÂIÿ½ßÙ¿µáóGÚ¼¯3ìžfWñònÎμýßjè5›dñµáí_hzlÐiïÏö•[;b&žU_5Kùì±,ß1-º´4­R é÷ lC[è—ú}ÜÓ\FfGÝ£ŠóüÍWüK¾Ûæy~^ýNî6ãgÝã}«´²Ôô«ÚMk%£Åm£ê|÷7RÆ·ÈnŒ)¾âౚ"ΛÀnå &èüwªX\iÚØ³6+§­Ç¨Zn#šiÓ䔯ÍúØ‚ÆávƒŒ1óz(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÷ïò+Ýÿ×ûÿè¸ëÀkß¾ȯwÿ_ïÿ¢ã vµÿSøWËÿäªëCÞý}Okþ§ð¯•~.ÿÉUÖ¾°èˆé=€úÖŠ(¦EPEPEPEPEP?àßùÜÿØWRÿÒÙ« ®Á¿ò¹ÿ°®¥ÿ¥³WA@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@õ*ÇVKt¿¶ŽqoqÔ;ºÇ*6åu=AóƒH«”Q@¯x›NðߨßS3Åos/”×BhmóÀidljXª‚OVƒ±@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿˆä9á?û Éÿ¤WUÐW?âùxOþ²éÕtWÄ^?ŠH¾"ø•dFF:¥ËÃF ý c_n×ÄÿåŽ_‰>#hÞwQ¨L¤ÌrÙ AýA þÈ^/ Ï6“oy¡bn.-e¼ŠÇ÷¾sCH³³ËHØ/’€IàWm‹­"𕞚÷º£ù’if1ö9¤‘æe˜·™÷“ÍF»'tKÈá‡@Q@Q@Q@Q@Q@Q@Q@±iyΕ} Ô²ùÃ%»«¼˜S°)-‡CŽ¿:úŠ“þÝV]RçO³°»½žÞá­˜[ÛHIq¼ãiPÀ‘œ0 ÙGŒ¼k¦ø‹N»·´‚íkÑp¦dPý¢þ\1çmÜcêÐOÄ)³¼ÿ„²=6[å‡[Õa¾Dæ1ç³G W9ÃʘêÌðp(¢µ¦µøÊùRØFÏÝo‘¸<ü§ÐÕzè5ífÏSÓ¬í {ïø—þ朂'28ämUnZÆ™ýÐg<1¯Øèjûn™öï;fÏ–ØìÆsþ¾Þ^¹woNsÆ9ú¹¥é³j×ëi F„£ÈòHHXãD.îp ª³`N08ýÂ]ê771EåG,¯"Ç…$ò*¯ìª@¡á}a4-z+éS|~TÐ7î–]¢Xž"Ûå}»÷llÆ æ€#×4+âÚ9Þ9bº·[«iãWUš&$Õ\ «™Fq‘A7,ü!}£µü2Àd’_%¦$2=´lÊòä)Tq†u$®%—uË­cAÕµí)5‰õ›&ÎÞH§»EE»¸f’i·ífe|¸9fÈRr À±gã h<5gi#ݬö6WVii)å\„ê%ywËíB¬ ù€ÇíOqÝ}b‘Ã,Ö÷²°›eœÑDò¼n|¿‚Äÿê·Ž8e'›Ô¬ ±¸X­õ;MA 2Ú¬ª äü§ÌD9ã=1Èç®=þ=ƒkWzºÕcmBY'c ¼htÒ`º²3vÎ\ùd•,Ag8òñN™§xŠïP¸û_ˆÕ”еޫ‘ήÐI_’à‚„2$’;@ —gá ûí¯á– ´’ù-1!‘í£fW—!Lj £Œ3©%p,»gÂú&œ÷²ËÑÃvln„"Oôk 132…f[&2àc“†]ÛxÒÌhvðlžÚKKK»X´ûxA‚O?ÏÚf0ybå«û§ ŒD~.ñ…¶¿o~a{·—R½Žñâ–Š; ‚lEÖ>`-pä¹T$‚Äç]Q@Q@Q@Q@Q@Q@Q@Q@{÷Àùîÿëýÿô\uà5ïß?äW»ÿ¯÷ÿÑqлZÿ©ü+åo‹¸ÿ…©­úþãÿDG_TÚÿ©ü+åO‹Ü|UÖ¿í‡þˆŽ“ëj(¢˜Q@Q@Q@Q@Q@Ÿ‚l§K{ë¶Ôîäõ=EVÉ–/*3öÙ~e!çƒÕˆù1ÖW?àßùÜÿØWRÿÒÙ«  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( O]²x=X˜ñÓesþ!ÿç„ÿì+'þ‘]WA@|Kñ³üGñ"y±ÉJwÝd Î[QœØ‚+íªø—âÿhøâGò£”é¶5À;\®~§'¹$дO E}lnoõ-üÍ>îòÚÔoó§Xb”†!@»â`C2¶°9R` ¼²è°ZO“jZ{ÝÆDŒDŽ­(ò•J$&/,(ݹñ†Ã %‡‹nôý=mRÎÆWKYì’âh‹I‰"ó´|Ò»Æìœn+•5'×neµÑâ#·ŸIFK{¨ÖR ­(ÉÝ€Uˆ*çœà`½þ›6œ–fv}Õ¸¸‚wƬÌ8#‚ÊUt=묇ÂZd¾²¿>x»¹Óî/Q mhä˜|æR"¸;Ws1ùQ…rz®¥6¯ª\_α£ÌùÄH—¢¢NÔUTvÕ©‹'‹G¶²M:Ä\[ZKeÿï|å†Vºã–r&‘rS 7ç袊(¢Š(¢Š(¢Š(¢Š(¢Šê5Ïßø~_ôËÛn·bÖK˜ÚB‘’Ò&â6+¾×…'÷,q†BäþuÔuå{û =#PûÒ]ÎÏ´±”.6ǺOõD|¨ í ¬z÷u/ZÏow¢$×áŒ(À†óneÀË7]È>} 5õ\ë/«4–––ãT½Žúu€>¨² ®æ$39 çœcb€2ïìn4ÍFæÂò?.êÖW†dÜ×RC Ž=*æ¥á­{F·[SDÔ¬`g²]Z¼J[àgœ{¯«jSk:Íö©p±¬÷·\H±‚3±bI8Éõ5cR×ï5[u‚â5\86ºm½»grÑ¢’9éœtôcCð½Î½eyw ݤÚ:,žy|RI†Õ<,pÊç¾ ˆSsþ[ø¼øooll¯âŠêe±™¤i%K0HU‘>°Ê£s ”ô œý#Ä—š-…í´p©C‰-äŒ_CŒ™# àà†ùsœ õ¨ÔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÏø‡þCžÿ°¬ŸúEu]rzìzñ‡†$–îѴ󩸊¶e•[ìW´ža >÷QÏõ”WÈºé‡ÆR²šäEq;§•2ÆËþšŠpYæúnù²>¿¯Š|g¨ßZ|OñåµåÄ7Qê—*“Ç++¨2€·§°øvÅt þÕ¢šÒ$²›r<¶DŒ°,"dýê„3 'Î|²±غ%½ö±†qkó<ÍeERÌNP,Á[jå¶¶6˜ãÕutÉtȵ ¤Óæ}òÚ¬Ì"vã–LàŸ•y#°ôªðO5­ÄWòÉ ñ8x䊲09È óšï!🆗íºåìöÚT~B[ù·-¶c/‡Iã·r눃 ÌÈÛZ2¾³¤iv~ŽÊ×N¾¹ÔáÕuàQd…`fg„Ǽ(Œ“°°Øw’Np9¸üK¯CªMªE­êI¨L›%»[§ºñÃ>rGʼØzU8oï-ìîlỞ;[­¿h…$!%Úr»”pØ<Œô  ôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEïß?äW»ÿ¯÷ÿÑq׀׿|ÿ‘^ïþ¿ßÿEÇ@íkþ§ð¯•~.2¯Å}kpÈýÏþˆŽ¾ªµÿSøWÊŸ¹ø¯­ g˜?ôDt˜[QEÀ(¢Š(¢Š(¢Š(¢Š(¢Šçüÿ ;Ÿû ê_ú[5tÏø7þ@w?öÔ¿ô¶jè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñü‡<'ÿaY?ôŠêº çüCÿ!Ï ÿØVOý"º®‚€ øƒÇòPüKÿa[¯ýÕöý|Yã#S¾ø‰âi§]Üuk¯,E>ÿÞËÓŸõoÿ|7¡ NŠ+BãE¿¶û {YÌ—V†ñ#ò$ "ŽþTev¡}Ë•Ûß €ŸEt>ñ&¡.©:5÷Ú´Ø’[‹ck'š7²ª¨P¹ÜCnã*¬{V\zN¥6—6©Ÿvú|/²[µ…ŒHÜpÏŒó/÷´NŠØO ø’H­eÃú«Çw³:ÙHDÙRãaÇÍò‚Üvô¨àðÖ½uq½¾‰©M<¶âê8ãµvg„œ % ãwJË¢·.¼!¯Yx}u»2î;?´Ko#4<–Œ¢’ù\(,û?yuN] X‡ì>n•}ö†>źÝÇÚsŒy||ùܽ3÷‡­gÑZš×‡µ/$Õ-¤¶žîßí ¨É$kæeç'ŸEj/†µæ{$]R/~…ìÔZ¾n(bcãçH9àæˆ¼5¯Lð$Z&¥#Ü"<*–®LŠêÌ¥xäÈ#¨F=eÑW#Òu)´¹µH´û·Óá}’ݬ,bFã†|`™x'¸õ¢÷MšÆ×N¸•£)nn" NB‰d‹ Ç]ѱã<ôè­ÂúLjàÔ%Òlgºû K,‰ O#6çT ¡AËr[*9íUít-bûNŸQ³Ò¯®,`Ýç\Ãnï{FæÜÀ``Nz Ï¢µ5Ïj^½–ÞþÚED¸šÝ.0Šv‰Ê9ˆ€anø©$ð¾±ÿ ¡¡ÙØÏ¨_XK$S%ŒO/Ü}ŒÀ¹Ç$¢€1袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ß¾ȯwÿ_ïÿ¢ã¯¯~øÿ"½ßý¿þ‹Ž€=Ú×ýOá_+|_ù>)ë,$Ãø~â:ú¦×ýOá_.üZòÇÄýd ýÏQŸùb•3v@}[EUQEQEQEQEQEÉø&MHÛßG-¥¢éãSÔLS­Ë4¬ßm—†ËGÞä9è8玲¹ÿÿÈçþº—þ–Í]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_íöÚ?ÙßkƒíÞWŸöo0yž^vïÛ×nxÏLÕŠæüKà#Ä÷^Î×vZ¥²·Ô´ùÌ)<€Ã‚Ü0Àà3c&€:J(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9=vMHøÃÃËihºxÔÜÅ:ܳJÍö+Ž?,{ç ãž:ÊçüCÿ!Ï ÿØVOý"º®‚€ ùKÆz®“q¨ø£OžúúÅUòeHQ&yˆ¸¼‘¾Ré”Ë¡ç¡Ú9á«êÚøÛÄžŸYñ×‹çŠæÚ¶Õîùų‚ó;µO ‘HǾ@ ¾µ¨ÿlkÚŽ§åy?l¹’ãËÝ»fö-ŒàgëŠè´ÿÙé¿Ø7VòßG}§éWÖ.c@»$—í)#pùàÎ3À+·#vk&çÃòØèÚÍÑE»±Ô’Âh§tLVRr•`Ld‡å!Z¿ƒà·ñ›¤éZ½¥ä—¶öòËPcg‚9 ;£RÁ‹’ŠœŒ.Ýä)-¼E¦¾™m¥Ý‹¸ mé×ÅÈÑ·ÛZè2!e§,¸É<àqt‘ÄÒ N6ávˆ™¾b³ ¸:î§ÞG¯ÝO8“Qñ®»$Kâ ÌAO—kJ‹¾BŒÛøŒ`x»mcM’ßX²Õ'Ô®`»½ŽùnUWϸhÄÃkîb¸˜’ù}¤}×Íhiž2ø—OÓ¯õ;AjqiÚˆ€É¾Òg-ˆ‰1à¹òäPɽ^X äï­â´¼’o`½q‰àòà:«qÓ:zs@F¿âM^þÕ2Ç|›µ[íBÉUPyŸhØäìÙå«`ß’¹O½[Ä+Ûë‰ñ8‡R–y.¡‹M¶ƒìþl3E÷Óç¹d C9;NF_)Í L‡Àc\ŸRïîn kUi¡ŒÆ_w+(?}åÉ*²Kà[øÚæ4½±–k/5o£FIcŠYLLJÌD€P²å9`$Ÿˆµ-6ú-ÛK[±ŸdmY‘¼ù¤Þ’"@vó·‘–ÆãrçÄ–w¾Ótã#´´oÞÆ ´ §uÈÏï#+(_›”%™xܲGkàÛ™ôHµ‰õ-6ÎÁÒ72\HùPïhÜ~bÒFØË ©9ÈóôP¤k_¬u%Ô%·ÛÈÿnŠΛlï$wÌùk–Ì‘`NT¢Ó†R䯫jwÚ.&quci%µÂ¼`'3Ë*²°bND¸ ½óÆ=± êv‹©Ú_™ãµÔm³ÍbG‹Ç(`…”6LAq¸cvyÆ姉t­á‘íõ$žÓL¾ÓmaRŽ¡f$y>RÄ…B/Má¿å™âè ÓÆ>(Óu—Ö^ÂãRº}_SKçkèV3n±¬ª‘.$}ãlØÏËü·ÆZKkž'xÞxìu}AuæŸI·¼t#Í&3 ®Ps1ùÃgäéóœyý¹w¥j§_Ôu©ZîàOeµ£1å¤-/œB®NÓÆÅ9à*ßö?ö>ö/·iþ÷íþvÏ'ï~ïÊÇÍ÷s»w~•ŸEhkØÿÛÿ`}»û3åò~ß³Îû£víŸ/ÞÝŒvÅgÑEQEQEQEQEQEQEQEQEQEQEQEQEQEïß?äW»ÿ¯÷ÿÑq׀׿|ÿ‘^ïþ¿ßÿEÇ@íkþ§ð¯–~.>>)kCáÿÑ1×ÔÖ¿ê ùSâ÷ü•]oŸùáÿ¢#©’ºëj(¢¨Š( Š( Š( Š( Š( Á¿ò¹ÿ°®¥ÿ¥³WA\Ÿ‚u8%·¾Ó–;±Rh¤¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñü‡<'ÿaY?ôŠêº äõÝN |aá9c»Å©»³µ¤«b¸û²•ØÇæ'¯¡ÇY@|kâÍ~ãMñ׋භ·Xî5;¥pCÓÂHùº‘3ŸLãWÙUñŽÿ䡸—þ·_ú5¨¿ÜßE­¥Å­«^ñ/d`eS!Ì61‰\a·p}FiÏây¦ž~¦Ï$‘Ë$°k˜Ò?)É?(XþPcØx IuVtP†±«>±x“½´ëI qC¸„Es³;`p71ÀFT ø’ò±mŽö=>ãO*yŽo;q<ýáç¾NƒÎqè ’çÆº”×ÝÛÁigyöØõîaF-st…ŠÊáÙ”^Cµ¯Îr¸ }Jýu …’;K(‘$ªÁTd“’ʼn$œ³Ð §E\“Rš]ÛKeÈ·¸šá¸´‹°<ã‰qÇs×¶äž:¿yÞd²±ŽK™Zm@ªÉþžì’FÆL¹Û•šaû¯/ýaÆ]¼½ÐjÞ.¼Õ´xô§³±¶´‹Ê¥´E6,m; åŽãåÁ',p¤’Û‹\¸ø©]\^]Mc¦½ÕÊ]Åç´,Z(n $i–€Ó;ÆþpX®TòtPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^ýð#þE{¿úÿýx {÷Àùîÿëýÿô\tîÖ¿ê ùŸâÖ‡wqñ X¾·C*~çz¨ù— Î;Šúb×ýOá_4|HÖ.4Ï‹:×–ä!0ñŸúcL¯m_Sê*(¢¨AEPEPEPEPEaøÄ°øx鑵¼—3ßÞÃj‘Æ@òÕäTi[¸E.£8û΋ÆìÖåsþ ÿÏý…u/ý-šº çüÿ ;Ÿû ê_ú[5tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÏø‡þCžÿ°¬ŸúEu]sþ!ÿç„ÿì+'þ‘]WA@|Gã¨eox¢a˜“W¹Fp§hc+ õ;[Cé_nWÉ>2ÕM×|^U4©/[ZRˆcYp] Æ6Ê3* ã8“$yµéðèâþ£8ïÒR^¸7!çÞ[13”ÇÙyŒ”#vïùiR^o÷y~’ØjjtTW7Y웉™!óöl pÙÞ ù´ætWªZÉ¢EªjNÖš5ΦÉnb‰nl DŒù†PÏ$ohÎ3©a†Â·œµæú±´mfù¬#Ž;3q!#wuX÷ 3€Äc°÷ÐsX^[ÙÛ^Mi'xdÝ6†öE`.KkXáØm¡óÖBT)Û‡P§îµ8Ÿ§Ý=ÏöšÁoáÈ5›ya‚Ú9’Ð[-²ù¾hV›1ÈÛ¼œ;3HÃÌ7áè¯X½ÿ„*mæ/ì¡n±]ý”«6ÒÚ‹Ç–lH[0ظîªô•ƒyÿ…þÇý½Û|¾TÞOÚ1åý£Ê#~ï—o›åçɽòæ€1êH`šåÊA’¸Fr¨¥ˆURÌxìO` ®“Æ>ŠR]*[¿ìò/[LŽ$ŒL.&"5UÜ`È  ) w<9sek £Cu£[Âú>¡ïÚ#u%ÛGp˜TÌ<©XÉÊä»`;©'‚k[‰mî"’âr’G"•d`pAAãÞxömôàšEŒP‹¿ô ¡¼‚IÛ ÷£Š%uÈò‰ûC4€ð2|ÃZ‚m!|kã)Þ=7P¼ŸS3Y³_Ù¬Mní+»,— $$óÞ2p@(ÊêI šÙÂO‘9Ep®¥IVPÊyìT‚pA®ãR:ki2¶‹‡ãÒÊ\›”ÕçY¼é|¡8$ygÚT'ïûÚ¹¨ZëZæ•©^\èfÛû="µˆCLnÖÈ(óUTn °›HÚ {ˆó±Ín÷ †uG)Ú¬À•ô…b}§ÒÍn÷ †uG)Ú¬À•ô…b}§Ò½biѼ1äØËáõ¢–p YÃȲ_«²uF‰ ÚÀ† ¹ù¹;󥾇âè´yà[Öí¦³‰æÚïl>ÔªU\ï| #ÏŒä÷4ÇÑ^ãÙ´Ó‚i61B.ÿÐ&†ò ${l7ÞŽ(•×#Ê'í ÒÀÉó eøÛ‹‹Å–=5¤tUG»{`ÑN]Vè\—)”ü»YWÌ NŠô‹Ñ×N”C/‡Á´ýD\+Æ#ÞbàÂ!3)W`·*r«‘‚|ÂTô“ÛxWQÖî¾Åkáû™CÞ´0+EL¡5%¶ ²;²6ä8*df`† ®\¤I+„g*ŠX…U,ÇŽÁA$öšŽ½kÿ Uœo>•¡6‰} óÁ4[}¥á¹HÀt"”hÊ@ÉçæÝE„Ú|?Tû Œ³Iþ×4×G"\î“ÊÚ†&¸l/G–Ë<6˜hÏêÅ…æ§y…¤÷wRgd0FdvÀ$áG'øV‡…þÇý½Û|¾TÞOÚ1åý£Ê#~ï—o›åçɽòæ»í¨t{M\#hcT›DŒ]¬vÖ³C%ȾMª€)ˆþ࣌®æÔæôQ^‰ñÚÊÊãZ¶k]ÖHµ‚ºl:sD̶àÍæùžY,ï …—rBPÊ<þx&µ¸–Þâ)!ž')$r)VFy1A‚e·K†ŠA»"HTífP z)#¶áë^‰¨_ž0—NŸCŸS›Uó­%¼šÖXÑÚfr­10–É·ï¼|Àc*¾³¨X_x^÷KÑnt¨t»=VúXÄðƳ}™ŒFßËg_9™Š2’¹ m@0çôWiâódÚ5‹[Ç£DC…,ž) _¾­Wr¿%È2® ÄË·‹ Š( Š( Š( Š( Š( Š( Š( Š( Š( ½ûàGüŠ÷õþÿú.:ð÷ïò+Ýÿ×ûÿè¸èÝ­ÔþòŸÆ ÿÂÕÖùã0èˆëêË_õ?…|¥ñ„gâ®·õƒÿDGIõÅQLŠ( OÆúEÍ퀟N‡Yšùž81§jmåD_2HÌ‘— [i!¾m™AÆ‚ëv–Z]•Ü>dº8C×rHìöÛp¹”?Ï€C+³ÈFXc{!s‰¡¿¹6Si·6—. _j XЧAóÁ`_i1‘ÈÝ‚ ƒÃP‹ }0ÜHúpye»‰À-y#¹vó`lfgfEP!xMÈÀ4ÍOûW͸·‡þ%ü {’ßñó×sªãý_M­Ÿ›’ݬøþþÔKŸ[êúŸö…Ä:®U‹ÊDF¶Â"nmª»ÈêsÉ$’MlišgöW›oo7üKø6öÅãÛ®äVÏú¾›W/ »U#Ò´Ù¬urâVŒ¥ýêÜDœ…ðņã®èØñžú^ÞææZøå¯.Þñ¬¢Ôo¡k‡h¢IcŽv)TÎÂ6±e]îC9n’ûÃV…ä—S\j©#ã" Zêp‰ QÓ°ç¯ZË·ð]¯†§6ŸØ6‰Bu•Œ÷0ǰÉ]€0]·0u 6.ÿ“¬ Oľ³×"±t{µ»³{h㕵…Ä ä’{Ô”Pá¿xoLÓï,ïüA¥Z]Gªê;ážö8Ýsy1Rr2?vO Õ¼WòÇ4 xäƒ+©ÁsšÃðoü€îì+©élÕÐPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPUï¯ìôË9//îà´µæžA.H,x$ƬQ@^¡â]Yñ'…mô½oM¾u9£µºIX/ØîFHRN2@ϸ®Ò¹ÿÿÈsÂö“ÿH®«  ¾ ñßü”?ÿØVëÿFµ}¿_xËS´ƒâ‰|Í O¹ÿ‰•ÂbW¸"WË|²ŽNF{p09ãh­í‹±Íü#z_™&ý³ù—[ãÜIG·åÈ ôÝÎe“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È tVà×tápòŸ èÅDF[ͪA9aûüää’GÊ09Œë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9$ŠÜ“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È ×tápòŸ èÅDF[ͪA9aûüää’GÊ09â¶³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’d“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È tVà×tápòŸ èÅDF[ͪA9aûüää’GÊ09Œë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9$ŠÜ“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È ×tápòŸ èÅDF[ͪA9aûüää’GÊ09â¶³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’d“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È tVà×tápòŸ èÅDF[ͪA9aûüää’GÊ09Œë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9$ŠÜ“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È ×tápòŸ èÅDF[ͪA9aûüää’GÊ09é!žkg/²Då #%YJ°ã±RAÁ"µ³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’d“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È tVà×tápòŸ èÅDF[ͪA9aûüää’GÊ09Œë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9$ŠÜ“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È ×tápòŸ èÅDF[ͪA9aûüää’GÊ09é'žk«‰n.%’iåròI#gbrI'’Iç5¨u›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“$šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆAâ·»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9ÌgY°6s@<3¥ $ß¶q%Öø÷FÑçmùrÈ?tgqÉ ôVäšîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆA»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9Ȱu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“$šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆAâ·»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9Î<ò,×ÊÇ;–X£,U?tn$àtä“êMGEPEPEPEPEPEPEP^ýð#þE{¿úÿýx {÷Àùîÿëýÿô\tîÖ¿ê ùSâðÏÅ]k-·˜?ôDuõ]¯úŸÂ¾`ø³l$ø™­0É'ÉÊÿLcïQ7d&}UEUŒ(¢Š(¢Š(¢Š(¢Š(¢Šçüÿ ;Ÿû ê_ú[5tÏø7þ@w?öÔ¿ô¶jè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬? x·Hñ]¼ï¦Í žÕÄwv“ÆcžÚLr’!är222¬85¹TäÒtÙµHuItûGÔ!M‘]´*eEç…|d™¸¹õ  ”QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsþ!ÿç„ÿì+'þ‘]WA\ÿˆä9á?û Éÿ¤WUÐP_xïþJ‰ì+uÿ£Z¾ß¯ˆú®w¨>¡ccgi,QM-Û°ÁHW ªÌßêÈ‚FAÆÐÅt?ΉφööÆÊþ(®¦[šF’T·ó…Y£ë ª70ÉOB ¯£kÖZg‡µ+ ­* FK«»i‘.L‚5¤ÀœÇ"6ïÞ®:ŒnÏ8«ðžj’yòÜÛØÝ^ÍÔ y4?¼X®<Ã"¨*üóHႆÉÛ™J¹eàHÅš.‘¨ëúiQ¸¶Z´¬íÊ®®3ÁB¸ ¨Cº±ôý ÍZúÎ=JÒé-ì§¹IbicYÌp™BÑg#Ê ì 0È4j(¹»ñ޵kii§]Ù$ ÙC²ƒUˆ•Ÿ$* ô;FFI$·ñ)´ÖÓQ·ÒtØ¢Kym…’¬‚#ˆèᛘĉæ.HàF¾ìxïæÔ,mäž'žÞÒge’x•™Y”íòÇ) ΔÀ•Ýr M©MáËM0I%Þ«e%̲ÁvM:±P ±!Ý´br$T×Äý„Ú}ÄDð[ÝÌŒÒA33*ÞYåä!™ ù»d‡Å0&’«ii:Þk@Ä>n •¤/Ÿ61‰dM¬õÈGâO _ø_QŽÏP\4± ¢.H÷¡%s²EW_™X|Ê:ddMÈ|©\x~bí9mÞãÉÂEU2ðr»rVÚáÆHˆ8fEl}Jýu …’;K(‘$ªÁTd“’ʼn$œ³Ð Ø´ñ®¥g£G¥Ç¡-ÚÜ3#nÚËt¤ýìg²öþô9°|{¼Âšž›%ÜW©aul¦]öÓ2Èv¶cÑäÈ1rÄ¡‹ Ç‚.¤Ôo­´¬Dv1gœ$í°U·D±“iV ^5 ’¦âçÇ—qKÚ^”ësv··…­É7Sm‘]œ–ÈÜ%nhCƒC’cOJº¢^¶‘¦°‰"[x¿|¦Üd™ddd™ÆÑŒ"çç…­®%ÌeãrŒc‘]I2’{‚AíQÔ“Ì×7Îâ0ò9vƨ “ž@ =€v¨è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯~øÿ"½ßý¿þ‹Ž¼½ûàGüŠ÷õþÿú.:÷k_õ?…|ÃñVeOŠ:Ò–Á>O^ú”¯§­Ôþò¿Åûⶰ»r3þ‰Ž¢jèLúΊ(«QEQEQEQEQEÉø'IÓa·¾Õ"ÓíP›SÔR[µ…D®¿m—†|d•x'°ô®²¹ÿÿÈçþº—þ–Í]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEaêþ-Ò4 RÒËUšK4¹F)yÑ5 µ7InÖºýŠã†|d•x'°ô®²¹ÿÿÈsÂö“ÿH®«  ¾ ñßü”?ÿØVëÿFµ}¿_xïþJ‰ì+uÿ£Z€9ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€=Lµ°>´²’Þuy¥^^ˆ¤mæ˜ÍÆ%7'÷°²ùÑvÊÒ¸í¸¨œqœdã''$Ü¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈsÂö“ÿH®« ®O]²x=X˜ñÓeñŽÿ䡸—þ·_ú5«íúøƒÇòPüKÿa[¯ýÔÏÑEQEQEQEQEQEjhúö¸/ÑcX¬í业Y[j€‘¼›Aîåc|(äí'€¬@I¢jöx{íš”8šÇO»ÒìžèÃ9™%Àk}¥Û päɹjã–_þiçúOýÐ?ï×úWOûsûßðã¢ÏÂ÷Ú;_Ã,Ai%òZbC#ÛF̯.B˜ÕAGgRJàYwWÖ!¸“NÒõuö‹'‹ì°þìGä¼AL‘lpd¸}ÿ3qùË€¹á ¾Ö­×F¼ïläKmRüZ©UKΧ͈’ (ÆOÞéÜG¨Ùë:Š,_Póíæ»¸ÔtûÛœFZE,Ç<¾lyUAiÀ¤è#SÓ®ïçÕltë[Yb…žìLw<‚B £sÒ&ëŽÕ¡ _ivóKt±«ÛÞÉcs¶æ‚T‡Ç7Îçæòßv€=â÷LŽÖæÆ4Ò¯tËnì4ý:^í¬^+¨•ð£sÌEÛæ’ë ÀÜ7yÿ‰>Ç£cäIŸµk˜pEÌ€–’MÃï©v`ÁòÖ<ò \³ð‡Š†šš¥¦™©F.míÖ8%],±JÄÇ…ùÓËG݃чPMcêZN¥£\-¾©§ÝØÎÈcº…¢b¹# 0gØÐ:(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÷ïò+Ýÿ×ûÿè¸ëÀkß¾ȯwÿ_ïÿ¢ã vµÿSøWÊ߀õ¢$˜;ÿÓëê›_õ?…|­ñtƒñWX\惓û˜êe°3ëJ(¢¨Š( Š( Š( Š( Š( Á¿ò¹ÿ°®¥ÿ¥³WA\ÿƒäsÿa]KÿKf®‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÏÖõ_ìM}Gì×þNßôk|ÙŸ,å\Œã9>ÀÖ…— xHñN–º–‹}Ý¡r›Ô*èe` ž‡=­J¯ …½åÍä6Guu·í$`<»Fs[ž•b€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈsÂö“ÿH®« ®Ä?òðŸý…dÿÒ+ªè(¯ˆt2DX–‘1·x8Ï#޵ÏÖ熴‹^[ä¼¼’†Êæx!‰2Ò¼pI(É<*/ž¤ä9, ‘xºÂÛC·²Š{æû¥Ý”ÿeèMçªÍ+‡,¬«rø <Æ#ãþ%~ þÏŸ‹½JîÓ á¡†8ÜFÇþºyì@8!cVÁYÔk¤XŸO¬-ä’_Ç{ ¦$‘g?1<³“[Ȫž•¢JÞâîkûM>ÎÝÒ7¹ºó1D4vÉç8ÇÊrA OxfßJÿ„…í§ó#Óu³¦¢¼‡ÌTýöÖa³knòº†*r¸`@Äþ&ðž¡>¢÷Ðj¬º®ªº¥ÒˆÐ¤d%Æ!:—Pó.[rRØ rzý͵æ¨×6·÷w¢D¤¹´Kb¤pQÔ"¨P ÀRjž¼Òb»–æH v÷kk«]eKù’øöìmÞ’Æz0­O xOÕtmRþö)&{[‹xcŒj¶ö ‰bIy•ƒå (ÁäžÔÉÑW5k%Óu›ë–IRÚâHVI!hY‚±(Ü¡8û§‘ÐÕ:(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ß¾ȯwÿ_ïÿ¢ã¯¯~øÿ"½ßý¿þ‹Ž€=Ú×ýOá_,|[>)ëeS'?ôÂ>+ê{_õ?…|¯ñs⦳Ç9‡ÿDGS-€úΊ(ª¢Š(¢Š(¢Š(¢Š(¢Š(“ðLz·¾’[»FÓΧ¨ˆ [fYU¾Û/-'˜C½ÀAÔsÇ=esþ ÿÏý…u/ý-šº (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*9ähmå•!’wD,±FT3>èÜ@ÉéÉÔŠ’Šæô/èºåÄv"Y,5gMçKÔ†é['¨_$)V8 3ÒTfZá.(Ì茉!Q¹Uˆ,ê*¤ŽûG¥I@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ž»¤ò¹çc±è |O hwšJxwJXn¥óš@÷;Ñǘ#+ûì|‚V çÛ5^êúÞßÃÐiry­4«w{0Rœ&#Œç÷aåË nia‚+z(SJ×&Ò­î-Å­¥Ô:KåÝF]Rd #@b¡ÜmmÈwÊÜbÅ÷Š.u×VæÒÑŽ±z·Ò° 2«HsÍŒbWmÜQšÃ¢€45 fóS³°µ¹|ÇeŠ>N[Ÿ¼Ù<°P‰ž>H£^Š*Æ“¯ 3N»°ŸJ±Ômn¥ŠfK³0Úñ‰b‘I[®{V=bþúãSÔnoï$ó.®¥y¦} nv$±Ààd“Ò«ÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEïß?äW»ÿ¯÷ÿÑq׀׿|ÿ‘^ïþ¿ßÿEÇ@íkþ§ð¯–>.~*k_XôLuõ=¯úŸÂ¾[ø²3ñOZúÃÿ¢c©–À}_EUQEQEQEQEQEÏø7þ@w?öÔ¿ô¶jè+“ðLš‘·¾Ž[KEÓÆ§¨˜§[–iY¾Û/ –½ÈsÐqÏeQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^ÖþÎûÏûÜD­ÞLü¹ï#c£ ŒƒÈ«Åê_ ôY.Pðù“Ãz´h;½(•€%‚Éù$MÛIe¶œPiErú7ü&¶zÂXëÙZ–™å ºœ­æ ª3æBw)fcÆÒbq•Zê(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñü‡<'ÿaY?ôŠêº äõÙ5#ã G-¥¢éãSsërÍ+7Ø®8hü°}îCžƒŽxë(¯ˆþWrO[Í¢4[îã»K{«UÚ[\K2Îò±w¼uóâv ªŸ6Ó‚¥ÉPoÄÖ<1<jÖ3Ûùñ$±¼‘:+nEr °eÞ€èÙNËIÔµ$‘ì4û»¤ãGh!g ÎÛP 7w< Ð×u-7U†Öê%»]@[ÛÛÊŒEà ŕ9%ËìVä&ÎGÏÂ熡ui¼Åqs´6[‚ÛQU7ʆ RÃ?3d¿‡¯®5{3ªË&Ènx†ÏhͰRAY_;9½®À VwÏð…¯ØµÛ›‰îuT-4ï¹Ý±$ö$ðQР†ÆÞÞòæê(öMs´ÌC9Q€ÅznÆld…PI ¸ŽËM†ÆëQ¸‰¤/p.% F£‹ ÇM±©ç<“ôk¤é¶ß tÿ[éö‰â!¦[ÞÇz¨¸¹º(¬¤{™œìaÎ$eÎZ½2¹»oÅmqm_R—Oµ¸7i’y?gŒåŠ(0û#, )b¢cîŒt”‡¯xCAñ)õM2ÒyãxŠÎð#Iµ$lÜÊNÂAw ýlA6¶ñ[ÛÅ0D#Ž5 ¨ `Æ*J(‡ðÞ³i§ÞA†u[Ø×UÔq<Z„|ÞLx2·9§§5ÚA#Mo¯ ; fŠB¥‘÷NÒFGN „Öƒäsÿa]KÿKf®‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ +¹Ó<]¡ËÖªnZÅž~›©”ŽYÝšI7¤ê¸VÉDT*(íÁw¨ÞY»jš_öuÒJñ˜ÖáfGP~WF%HÇÞUaÈ#¹Ð¢Š(¢Š(¢Š(ª÷×ÚYÉ<6SÞȸÄù p]•xëÉ=x«P¨j·—Þ$ð¬WÔ´ôœŒ%º’Ý”Ÿ±Üü£Ë•ÎyÏLpyéžÒ¹ÿÿÈsÂö“ÿH®«  ¾ ñßü”?ÿØVëÿFµ}¿_xËÄZÝ—Ä?›]cP€Jâ1å]:ü‹+í^A“Û&€8Ú+_þ¯}Žk?íýSì³oóaûd›y%÷.pw$ç®NzÔ²xÓÅS ÕM¬ÛüØMì›$ÞI}ËœŘœõÉÏZÇ¢·$ñ§Š¦x^_ë.ð¾ø™¯å%i\¯ÍÁÚÌ2;;еñg‰Îk3â TÚͿ̈́ÞɲMä—ܹÁÜY‰Ï\œõ  z+rOxªg…åñ.²ï þRQ¶•ÊüܬÃ#±#½Æž*[‡¸_ë"wEG_˹•I* Ý’f vÜ}hŠØ>,ñ#YÍf|Aª›Y·ù°›Ù6I¼’û—8;‹19듞µ$ž4ñTÏ Ëâ]eÞß5ü¤£m+•ù¸;Y†GbGzâ· ÕM¬ÛüØMì›$ÞI}ËœŘœõÉÏZÇ¢·$ñ§Š¦x^_ë.ð¾ø™¯å%i\¯ÍÁÚÌ2;;Д%Q@Q@Q@Q@Q@ž¸{u–3:"»ÆnUbB’:€J°¾ÓéRPEPEPEPEPEž¸{u–3:"»ÆnUbB’:€J°¾Óé@QEQEQEQEQEQQÇ<3<ɱ»Âû%U`J6ÐØoCµ”àö ÷©(¢Š(Ÿñü‡<'ÿaY?ôŠêº äõÝ[M›ÆÒâÔ-P‡Sw–ÑfS*/Ø®9dÎ@ù—’;Zë(¯¼Z–7^*ñv£«›ÉVËZkX-í# ®ó’2T„å7d)É'#-¸}ƒ_|A¹ ãÏà ¼1Rs4bBRIY|‡úò[C\Ñ4í7Ã_Ù°i÷WZ­¶­¨Û›È@u€BYš0…¶ÉÊw¶H8“xÂðø–ÇHMFîíÓXH¾îàîréæn{p‘ÉŸ/t»†àmÜxkkfú=N8nîž)ÐÜê® ¤¡[piI8c¸Œnä³2ÌUñ.¼¯dë­êA쥛 §Íº• D|ü€¨ PÅ–• ÝÛÜ^ÛØë7Cqma´w“ÜÍ(”‰"pƒcÊÜ¿ß8æç‰|-£è÷:dqj·WOöÉm¦‰Ñ„QÁ<ñ${2ü[–g ¡C´ìÃrð_ë .£yow|dš'û|ÑÈù’7`ÍaÕY™AÝÁ$w4>»¬Igug&«|ö·r™îak‡)4„‚]×8fÈ'žt0¶ÑâÕl¦°Ñ¯ ±ŽÒÀÝ‘p…[̵ÕC€IÄ6æ ÛF©/SæAî«éUìµ?³i׺tðùÖ—[d*c$ÈG 8=7°*r ³tm¬ ÃøGÙªªÃª§ö6¡-œ÷-:ï|›{™¤,yL~νZM¢PHl ƒÁ¾‹L¶Ö¯ä¾Ó,g´‚E¶½º`åå’ä+ #¶|©K`Àyc;󻀃ZÖ×ì·²]_\ÚØKnI<¾\f=æܬ `y›v@/´ŽjÅçŒõ¹õa¨Ú^Ϧ̱4+ö+‰T„i ® ³—mÒ39ÜÇ“è-,—íú÷…¤–IííÒò{Y¦…¢he·F¿–ß2!#ï)`Lj+Ãúl:®­ä\4‚íî.¤Ö^R€B– ·v3œ`^Meáûˆá´‘ æ ®Û%d ryH1€Clf9'î´nßNÃíŸÚ6ßÙÞÛ¼Ôû?Ùóæy™vcÙÆ1Îh¬‡GÓlÁ×­ ‘íGmJ+¶YŠÉö“h¡›j«…|K‚˜ l ‚Z¡éº…”÷Z”ÚÖ§¦^j’O$ŠcF…îç ´†A:®Òweóµyø|C©&¶u{›™/®Ý9šíÚC4l†6FlîÁBW ‚à‚†¹­]øbKi®àðÝ»µªÚ­Ñe$È󯜠€_æ8bªË8FÀƹ¤è·~$ÓÒÏKÔ¬ôô²³’öhØL 5šJ3²!°íYßNÂ¥]ÓÙøkÄ0Kg÷EÌJf·š`ñÞ[—ù•e »•¶¢~BX‘ŽFj埈¯!×¹w,÷Ú¬{d·¹¹˜¹I—$lä¾Ð8Rq¹Ê‚¬_]Ó?±wö¹m¼Ý»wìr»±“Œã8É­ÏìHu[Ÿi±yv¯ª[¬Rα‚w=ôñïaÆâ(äôP3\üzN¥6—6©Ÿvú|/²[µ…ŒHÜpÏŒó/÷µ$ÇT¸Ðí¤žyßL¶•¡¶IfùÛçqþém£Ë»— š}Í·ˆ|EæÛɬzeñÓí‘Ñ’Ñ#‚Y0èC ˬYŒ›·d /i·¾·ÔÖ{¸ïÊ[‡%գܿluv‚ÛSó™ƒpkówž"¼›\夳Øê²n’âæÚb…ælï‘q‚›åAÆKc B­8õmJ+qo¡v(#Y˜(RŒã–QúhÿÞ9ì4M?J>-øz³YÉ5¥úBg‚CÌæîXŽHŒnBÊÖ v›°úV‘¢Þ\\]]ÚjVz{¢}…..Äk+±eÁºò Z9îE_•òëåØzÕ"³°´¾žv´XŒÖQ´ÛâTåŒx%FXØèÊAù”$~%סÕ&Õ"Öõ$Ô&M’Ý­Ó‰]xáŸ9#å^ ì=(SL¶ó§Ö|5p³ù1Euqnn¢òä¶š23ÉÚΘÙwc%IÜcZ¯àËk;¿¥gakûÉb/}rò«lŒŽgs"§$’Íåªà’.æ¶rðK$NQ²1RU”«;$Ü(°‡GÓlÁ×­ ‘íGmJ+¶YŠÉö“h¡›j«…|K‚˜ l ‚Z¤Oi7¾MKRÖ'“]Ôm.uË#¶Ç”È!`ûŒ,L†TÛ¸’¤/ÍÏÙ]k^¢ÎÖóÈÚlR[ÏopŽV\´rFビ+)ÁRNb uª&‡t–7Ðøz{²­kö½è†A*®baŠÞ[cî7-´M7Q>†ï̶‚M öîâkXÔÈÍ—Žƒ€ç Á# ‘Áå{?ßéZ¤Ë¥j–žmÆs0bð‰Þ7‰¤ ɇp`€¡*GÌ«?KñF±¤Ok-µôçìq\Eh+í¶ó‘‘Ú0Øß6ìâœÑgâ+Èuî]Ë=ö«Ù-înf.ReÆÉ9/´œd.r «W×tÏìOêzOç}†î[o7nÝû®ìdã8Î2k>Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯~øÿ"½ßý¿þ‹Ž¼½ûàGüŠ÷õþÿú.:÷k_õ?…|¹ñcþJžµõ‡ÿDÇ_QÚÿ©ü+å¿‹8ÿ…¥­}aÿÑ1ÔËa£êú(¢¨AEPEPEPEPE^úþÏL³’òþî KXñ¾iä¢ä€2Ç’@ühÎâÔ~Ãq¤Á>¬ï²ñ£u9Hº‘DRÀŽc!ócû¤ýïc޳þ-/þ}uÏü^ÿñšè+/Rñ.ƒ£\-¾©­é¶3²Xî®’&+’2qF}cêÞ6Šú]/OÖgÔÞFµŠM ô+ÊìSû¡Ál£ê*çü&Z_üúëŸø"½ÿã5ÐQ@ÿü&Z_üúëŸø"½ÿã5OIñ´ShÖ2êš~³ öñµÔQèW¥RR£zÝdu?S]eÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Tì¼mÝj+w§ë1À—lÙt+ÜÉ•,ߺ<ù†AÛ…w=eÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Tãñ´GY¹ŠM?YzÛÂÐJ4+ÝÍ)i<Å?ºèDGïOn²Šçÿá2Òÿç×\ÿÁïÿ¬}gÄ–—z¯‡¦‚Ç\xí5šsý‡x6!µž0y‹Ÿ™Ôqëéší&žd<±Ä…Õ;™‚¨ç¹bɤ þ-/þ}uÏü^ÿñš§«xÚ(tkét½?YŸPKyÖ)4+Я(S±O:¨­ üiá[[‰mî$´»Õ|=4:ãÇi¨<ÓŸì;Á± ¬ñƒÌ\üΣ_LÖÇü&Z_üúëŸø"½ÿã5ÐV?ü%žþÑþÎÿ„ƒJûw›ä}›í±ùžfvìÛœîÏëšËÔümV¨ÚvŸ¬Í9¸Y_B½DeQ+ªˆË‘ÿ –—ÿ>ºçþ¯øÍtP?ÿ –—ÿ>ºçþ¯øÍSÒ|mÚ5Œº¦Ÿ¬Á¨=¼muzéT”¨Þ£÷G€ÙOÔ×YEsÿð™ióë®àŠ÷ÿŒÕ=3ÆÑKjí¨éúÌ3‹‰ÕU4+Ò BV7ú£ÉŒ!>äð:²Šçÿá2Òÿç×\ÿÁïÿªqøÚ#¬ÜÅ&Ÿ¬=máh%îæ”´žbŸÝt "#÷'·YEsÿð™ióë®àŠ÷ÿŒÖ=ω-$ñ–™~¶:ᵇO»†Gþüù]ä¶*1åg‘þ^â»I'†…%–4yŸdJÌvÚ[ êv«ÀžÕ%sÿð™ióë®àŠ÷ÿŒÕ=OÆÑEj§iúÌÓ›ˆ•ô+ÐFU·ú¡ÈŒ¹àpzÏíÝûcû#ûVÇûOþ|¾ÐžwÝÝ÷3»îóÓ§5¡@ÿü&Z_üúëŸø"½ÿã5OVñ´Pè×Òéz~³> –ò5¬RhW¡^P§bŸÝ `uQ]eÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Gü&Z_üúëŸø"½ÿã5ÐQ@ž™ãh¥µvÔtýfÅÄꪚé!+›ýQäÆŸrxÏøL´¿ùõ×?ðE{ÿÆk ¢€9;/D÷ZŠÝéúÌp%À[6] ÷2EåFK7î>aváGÍÏøL´¿ùõ×?ðE{ÿÆk ¢€8{ŸZIã-2ýluÃkŸw ý‡yò»ÉlTcÊÏ"7ü½ÅlÂe¥ÿÏ®¹ÿ‚+ßþ3W&ñ.ƒmª .}oM‹P.¨-éRÍ£a9ÉÈÀÇ9©@ï¢K­9m4ýfHà­ã6…{˜âò¤!—÷CŸ0F;ðÇŽâçü&Z_üúëŸø"½ÿã5ÐQ@ž­ãh¡Ñ¯¥Òôýf}A-äkX¤Ð¯B¼¡NÅ?ºÀê>¢®Âe¥ÿÏ®¹ÿ‚+ßþ3]ÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3TôŸE6c.©§ë0jo]E…zU%*7¨ýÑà6GSõ5ÖQ@ÿü&Z_üúëŸø"½ÿã5NËÆÑ=Ö¢·z~³ pÍ—B½Ì‘yQ’Íû£Ï˜d¸QÇsÖQ@ÿü&Z_üúëŸø"½ÿã5mâKHüe©ßµŽ¸-fÓí!ÿ°ï>gI.K yYàHŸŸ±®’oè6Ú ÒçÖôصê‚Ñî‘e,ØÚ6œœŒ s‘Z”ÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Tï|m]iËi§ë2@÷o´+ÜÇ•! ¿ºù‚1߆ºçþ¯øÍSÔümV¨ÚvŸ¬Í9¸Y_B½DeQ+ªˆË‘î¡ë( þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ®‚ŠäôŸE6c.©§ë0jo]E…zU%*7¨ýÑà6GSõ5sþ-/þ}uÏü^ÿñšè( OLñ´RÚ»j:~³ ââuUM ôƒ•„Mþ¨òcO¹<‚çü&Z_üúëŸø"½ÿã5ÐV\Þ%ÐmµA¥Ï­é±jÕ£Ý"ÊY±´l'99ç"€9»oZGã-Ný¬uÁk6Ÿi oý‡yó:IrXcÊÏDüýlÂe¥ÿÏ®¹ÿ‚+ßþ3]eé¾%Ðu›†·Òõ½6úuBí­ÒJÁrHRN2@ϸ  {ßD—ZrÚiúÌ=Á[Æm ÷1ÅåHC/î‡>`ŒwáÅÏøL´¿ùõ×?ðE{ÿÆk ¢€9=OÆÑEj§iúÌÓ›ˆ•ô+ÐFU·ú¡ÈŒ¹àpzŸð™ióë®àŠ÷ÿŒ×AEsÿð™ióë®àŠ÷ÿŒÕ='ÆÑM£X˪iúÌƒÛÆ×QG¡^•IJê?tx ‘ÔýMu”P?ÿ –—ÿ>ºçþ¯øÍSÓºçþ¯øÍð™ióë®àŠ÷ÿŒ×AErzg¢–ÕÛQÓõ˜gªªhW¤„¬"oõG“B}Éàt?á2Òÿç×\ÿÁïÿ®‚²áñ.ƒsª. oM—PÈméPËÃ`9ÈÁÈÇ4ÍèÞ$´´Õ|C4ö:âGw¨$Ðì;ý¬“Ä\|ÈßOLVÇü&Z_üúëŸø"½ÿã5ÐTbxZáíÖXÌèŠïa¹U‰ Hê*ÀûO¥ròxÚ!¬ÛEŸ¬=­æiå:îå”4~ZÝt*e'ƒ÷G#¾?‰|y­Ø\AwáíïT³T"âÂ]þ ‡làå1Ç9!€áN ,1è”P›ÙxÅüUâ_ÚKáÍsIº·Ô&¹Ùfȯ·¸Ì Œpd„08ÃJ-Ö½"Š(¯Žµ±¥Ü|Eñm–¬LP6«qp'jÈ<¹\º+74f@yYÀÍ}‹_xïþJ‰ì+uÿ£Z€&½¹ûoƒ®.­ †?Yi/á6ÇèɶU¢ŒÝ€·Þþ ìµY¼(÷Ð¥­Ž•¸–o쩚òÚMëäËäy±Ç•S'ÙË}­™‡C‘æšòû[Û‹/?È“jÏC*• ®‡±ƒ‚ŒªÃ+Тiº¥ÍÞ³dÏá…Ôï´ÈÑ|¸­ݦ[„|30û:Ÿ)XáBBg2Нm•‡Ö!6>ž–Wk{)‹‡½o³´{À¸ØÑOÈcvà?y\ØxöéVúÞÊ } !kKYå“LKvßqäªÊKÅ¿8q±J§¶äî9þ*ÿ˜'Ÿÿ!ì¨>×ÿy8ÿo³ôü~mÕ‡Ímqè#/‡Q$jêH9åXÃØ‚z'žk«‰n.%’iåròI#gbrI'’Iç4ÒYýþvó?²¿µ¼©>ËæcwÙòÞfÿàó³Ÿ/Ï·³ÕÉÌ+â ±ŽÒM0i›D»p‘±Ãy ³ûWŸƒ 1ƒÀÅ\]XûuÇöwØ ™µùÊŒ í|`•'•ÈÆqÛW9Ú¸ôËY4HµMIÚÓF¹ÔÙ-ÌQ-Í„‘Ÿ0ÊäíÁòbU,0ØVó–±õ#¦¶“+h±ø~=,¥É¹IÝ^u›Î—Ê3rG—ö}¥@B~ø½®Šô ÈÑüi¢xfo°ý–ÓPI5‡¿ò„RI€³#ùŸ!X—ÌDûÇq‘þñ@¯§Ý=ÏöšÁoáÈ5›ya‚Ú9’Ð[-²ù¾hV›1ÈÛ¼œ;3HÃÌ7áè @Öu ï Þéz-Ε—gªßKžÖo³1ˆÛùlëç31FRW$ ¢B¨7!Õ´mT¶ÔãÃëckâ;I4ñok—é߿˹T.Ço—Ó*²‚ÁX©>GEzF‡ö+{ÍRMN=÷[“È)6AXHIږℾn¹ ÃÒÍ£k>)khãC6WeÒ7wUpû0 ÀHGÚ>ÍÉŸâwW'V>Ýqýö&-L¾s"¨Ÿˆå°3ŒçnæÆ76@.xp¾ ³iã´’0äì»p‘±ÁÀ,APsŒ0q¼Ý]þ†×f’$.²º€²mÞAÚ§  ‚0EpúˆÔ4ÃCŸH»x¡Ö,@ÔÖHLR¯Û¢ey3 ‘¥`Fó³™ ‡5蕇oá×TMF(îüøî%ºDkéÚ$–MûÝb.Pæ?Eþ#[”QEQEQEQEËߨÛßAsá*?.6•潺 OÙG3„ÿËÁfÞ˜ÿW•sÆÅ~¢¹¸| ¢Û!H%ÖbBìåS[½PY˜³%êX’OrI®’€ (¢€ (¢€ (¢€ (¢€9}vÆÞçNÔü3§Gþ›¬E)º”±o!% Ò1äà ¨™ù¶]¨ŒÉÔW>þ Òòêè>«×r™§0ëqrÎÕ”ÀP08 à жÑl­5¿‰gûP´K2ïs#ï‰ +¸3Ì 7Îrß1ç“@úM½—Ä?xö´ú}”Ò±bÌîe»ä“ÉÀG¢ª¨À¢«¥¼zŒ×ë.¦Š8d}ÇæD.Tc§Güý…X Š( Š( Š( ¹{û{è.|3¥GåÆÒ¼×·A‰û#ÈæbPŸùx,ÛÓêò®xدÔW7´[d)ºÌH]œªkwª 3cĽKIîI4ÐO ÜÛË™H…Ç##F8e ©÷Ú¹ñ:ž­¥Å¦Å:n…pÍæF FÒdƒÈŒ0‚C¹‡ T ÉßåìI¥ÚKqwpREžîÝm¦’9]ƥʀT‚¤î\zð1—aàÍ#Lû0³}V8ívaþØ»1¨\m]†]¥FÚF1Æ1@Q@Q@Q@Q@½Ý½ÚÛøsJl6wv÷Ws–,!1Ê“…f<¼Òää.Ç,‚N’iá¶@óËH]P3°PY˜*Ž{– Ü+Ÿ‡ÀÚ-²‚]f$.ÎU5»Õ™‹1â^¥‰$÷$šÐ¸ðö™tú«Ï’VÝmo7O!VPŠ7aþî9bzó@wiy§xîÊþi๵Ôñ¦ÛÁä•{M±K;8rÄæ<0 ¹Û?'ÍÔV=†4Û Èî£7ÓÍLfóP¸¹’,«+°VÁ#pÃ0Î ÎÅQEQEQEË­½äöz™Ùì4 `8bdÑ’Éç˜ÙC¹ê’‹±¨®~ÇÁšF,rZ¾«ÉLÁ±vÈ\±v,†R­–$œƒœœç4¡®jO£èwº„VsÞÍLñÚÁ;Ìÿ€*±äàgO×áË4øƒ­cûJ[ÝFÊÎ[‰æÒ®-ÕåSr à EE]ǸÜ︞â×K´³¿¾½$Yïã2»+2 @B“µNÕPJœ ç¤Kxõ¯Ö<]MpÈû̈\¨ÇN ùû ±EPEP_xËS´ƒâ‰|Í O¹ÿ‰•ÂbW¸"WË|²ŽNF{p09û6¾<×ü+}âˆþ,N­¤æIV¥ Ï#»cŸ<0'nܯ^W ×öÅØæƒþ½/Ì“~ÙüË­ñî$£ÎÛòäz îç2É®éÎð²øOFŒ#îeYo1 ÚFÖÌäã$0r£œd®¼!qa¥É}}©iÖ¾\÷o$Žeãt[UI `J €Ì¤€rt½6mZýl­Ú1;£˜ÕÉýã*¸—b6¨îÌ£½h wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s˜Î³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’lCá9Íœw—ºŽŸjÑE#Isæ“Jdò‘–4f éH8Û°©ÏÌ.|ªYê1Ø\ù]5¥ÕÓ!|ìæq"’³nøÆAÊóÉÀrkºs¼,¾Ñ£û™V[ÌH6‘µ³98ÉŒ¨çîœ.Sá=£"¨ˆËyµH',?œœ€rHùFç&½á£áñ›VÓn¤•"–(­ZFf†Hì‡(Œ6±ÐíÚCôϯ}±£º‚Ú8¼é¤•%“j÷m±#¾ÐËíÚ¼Ae:ͳšá(I&ý³‰.·Ç¸’6;oËAû£;ŽI’MwNw…—Âz4as*Ëy‰Ò6¶g' ñƒ•ã èEðï^›Ãóë mI4€F¯"¼q8™ÂØü;xrn¯…&Ô¦ð妘$’ïU²’æ@Ù`»&X¨PX€îÚ19@  ã]Ó…ÃÊ|'£dUo6©å‡ïó“I(Àæ3¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸äKÿjEăU½´Óí#e»ºŠá̆@Š#ò¼ÐO“/Þ@>Bs†RÕï|5igàë}UµkO·µíͳګ<›¼¿+P¡#Ì,[~Ò¥v’r(¼šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆA»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9Ìá—’]+iào·éï|ó¤h/˜X »&ʨ|ì%Kn V?á œYɨ>³¥G¥¯”VùÞP’,†USËó ›¸Ý™`žu›g4Ã:P’Mûg]oq$mvß— ƒ÷Fw“$šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆAË¿±¸Ó5› Èü»«Y^“p;]I 288 ô®’ïáþ¥iqgöí6y,î æ†fe´Ú’I¹Îߘá•ð›˜l*À>€gwN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s˜Î³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’l]øBþßN}BÞX/ìÆÃ¶¢Cæ£ ÉuVPÁWì³Üs‚¼Ö^­¦Í£k7Ú]ÃFÓÙ\Io#FIRÈÅIã#ÐP„šîœï /„ôhÂ>æU–ó ¤mlÎN2Aã*9ÆA»§ ‡”øOF(Ȫ"2ÞmR Ëßç' ’>Q€9̓ )~‘ ÆÚÅå¿Û]¤fž+xÂä3È›u%¤­»ÿM›NK3;G¾êÜ\Á;ãVf ÁeǪºôpë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9&I5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒƒ%‡„ç¾Ó–åµy¥´žöÞÒo4É<0‰ ²•Bƒ˜¤3)ÊôÁ׺ðûØùs¨X¤ªÁ0vu–#ÖpKÇCvå YTA®éÂáå>ÑŠ2*ˆŒ·›T‚rÃ÷ùÉÈ$”`sÖl œÐ éBI7íœIu¾=Ä‘´yÛ~\€2ÝÜrN‡ü!³Üx‡^Ó㸂Ö"YVg”Ë>ÅG*Oî¢.T9“b¨ã;K(<ÜðµµÄ°9Œ¼nQŒr+© ã†RCpH=¨bMwNw…—Âz4as*Ëy‰Ò6¶g' ñƒ•ã ƒ]Ó…ÃÊ|'£dUo6©å‡ïó“I(ÀçB/Þ˪A§.§¦‹†½M:ä.-.ŸvȤ>_$´n»£Þ ¯,óú•‚é× ¾´»}€ÈmY™c|P±1ûÈYNFÐìØ9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸ä™$×tçxY|'£F÷2¬·˜m#kfrq’9QÎ2 oá{›-.ÅÝ¢O5¼·pY16h#ßæH¤)@•/ ÁŽÃ€r»·,þºx¶ÏHÔu[ÕcÓošÒVs»6ÅΠ8öãvÒ1&Ñ@c]Ó…ÃÊ|'£dUo6©å‡ïó“I(Àæ3¬Ø9 Ò„’oÛ8’ë|{‰#hó¶ü¹dº3¸ä™4ý ÍZúÎ=JÒé-ì§¹IbicYÌp™BÑg#Ê ì 0È4[ø^æçKK±wh“Ío-ÜL_Íš÷ù’) PåKÃ0c°à®àMwNw…—Âz4as*Ëy‰Ò6¶g' ñƒ•ã ƒ]Ó…ÃÊ|'£dUo6©å‡ïó“I(ÀæÆ±á[Ÿ ÜM%ÔÚn¡ö Ñky2»*>Xª9rcsò6W6ÆâƒáˆnüA§ÚYê6–v¿Ú­nõ9ÄqƸmÈ$rE»hÜTa@γ`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’d“]ÓáeðžGÜʲÞbA´­™ÉÆH<`åG8È;ðŒééàËIlnîï.¬¦¹c­oŒ¬²¦E±ŒÊè«f ã¹I]n wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£sœyäY®%•!Žw,±FXª~èÜIÀéÉ'ÔšŽŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ß¾ȯwÿ_ïÿ¢ã¯¯~øÿ"½ßý¿þ‹Ž€=Ú×ýOá_,|\ÿ’©­}aÿÑ1×Ôö¿ê ù_âçü•MkëþˆŽ¦[ YÑEB (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ +›ð׋ôÝgMÒãSÓWZ½²†âKçQ gˆH@Œ±l`ç¿×I@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|kãsìþ=ñ=¼ºu•Í£j“fÞ@ê¥ÒY0å‘•Ë|ïÕ±óc ìªøçÄÚ]ÿ‰þ&øŠÞ)¢Jæ4VÉ*¢Y `»ò ;¹%›&€9ÛÝ}ï´84ǰ²Êº–ëí£#³É€ãho,. ƒ1“ššTðÚj–÷3ËwBþh{F (eåv±û„°w;sœ60w®ômÞÂÕm¿¶/§¾²–öÞácD*4ŠUà‰…‰q Ú­§i íwM𮟨ÚÙÄÚÌ 5½½Ü³±Šs Ën²yj˜Ì;~rÉÁ#aÆXŸü%“Ëy¨K{§XÞZßJ“5”¾jà eˆG庲ª#²*îÚƒ‹ðžj’yòÜÛØÝ^ÍÔ y4?¼X®<Ã"¨*üóHႆÉÛ™JЇánµ5å͸¸ƒts²ÖîWù†~h’–/o5wUÜ9ªwVV–~ ÕíMŒcP°Ö-àšñƒï|­Ð*ªê¦4ýÚ|¥Cdߨ¯kG^¿Ží¬-,Š[Ån#µ2m+Bw»…U^¿Â\’hšÑÑn<áaivC¤‘ùÆDh¤S•t’'GR2x ƒÁ •R.\ÄÓÁ¿Úów¦ÝÃdf<´ÐɘÔÿ×?!€'$¬Š¹ Šë<9 ø^/‰©gp—vÑG{g¦—âwYfó ïóHFGð«mVÞ¥‰ ÊÀ|¾'šæÃì÷:v›4ê’GÓ@U­ãwgdHÔˆ€Ý$„„®ï”«´‡Å0&’«ii:Þk@Ä>n •¤/Ÿ61‰dM¬õÈcÏÃq,I4s¢9U–0Á\÷†à^@> TtÐ'ŠBùÐ6…¥6›/–³ö̱«¦ý¯½d³6O¼íÃãT ]|Eptë‹9m,fY%–h­Àû3Êe1¢áåU©Ù´Øy¬z(r\ÀšJ­¥¦tëy­ù¸‚V¼r|ØÆ%e6°× j^(¹Ô4¶ÒÅ¥¥­€xZ( D"?8…RìÌAk‰Xî$䌇E\Õµ)µfûT¸XÖ{Û‰.$XÁ ر$œdúšØ_êKªÝù„ê—¦òê2µ·$Èñ›!n$SÎáÁ ÍstPQmã«û;¥k{+³H’ì Èð",¦B0ÎY·o™[s¤ò§ ØÜóÍuq-ÅIJM<®^I$bÌìNI$òI<棢€:Oí[·Òu;››»{ûŽ …¯Ë,Â%>L‘¿ÝŒ…Xâ']ªàHKªêSjú¥Åüë<Ï‘@„‰z* $íEPG`íTè ‚ÃÅ×–rÚ­Œ®–“ØÇs4E¤ŽÞa&è׿Ú>i]ƒc~N7Êšz–¹6©n¶óZÚGN>Ì"Œ¯Ù£ÁÌHs’„áŽíÇv[;žBùtPHÞ0–OÞë’ékÏwp.ÌcÎAà“æFë •NKÛ“Óå]¼üó5Íij¸Œ<Ž]„qª($ç…P`ª:(¬‹Ç×±jj+¦i¦áoSQ¹$K‹»¤Ý²Y™Á #¶Øö)-ʼò,×ÊÇ;–X£,U?tn$àtä“êMGEn[ø¢æÛKKAihóÃo-¤¬͆ 7ù‘¨ ƒæËË)a¼àŒ.ÝMÇOwâ»ýÊ 27Õ´ÕÕY¤–Tw1<ÝÔ2ï~ K‚ÇEn[ø”Úki¨Ûé:lQ%¼¶ÂÉVAŽDtpÍ¿ÌbDó$p \Ûiih--xmå´‚õƒù°Á&ÿ25‚|Ùye,7œ…Û‡En]k÷:ÕÆ§ÓZ[&±©¥õÌ¥_lN ¼Œn;žäŒ1àcÞÁñ<6ž ÓîìôëKË 2ßì¶¶šœHä\6çtÏV’I%Û¸í,$(®nŠØ³×†Ÿ§4ºUŒwC3ŠH\m2y|£2}ÎÈù¾jÇ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ß¾ȯwÿ_ïÿ¢ã¯¯~øÿ"½ßý¿þ‹Ž€=Ú×ýOá_+ü\ÿ’©­Ûý}Qkþ§ð¯•¾.œ|TÖ¾°è˜êe°Ñõ¥QT ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ƒ±ÒfµøSá‹tù!ž'Ò^kt„«# ˆRÊA{1?íÞ»Ê( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¾%ø…$2|Bñ Š(JådÉ ÂWù†yÈÉç8À ¶«ä e¢_xÉ£“MŠük2•“PŽ9#X<ɼÒE`Ä+…ÈÎÐyÊßëž!a{§ê¦¨D²ÿ¥Û\\Ióȸ¼Rya±G<£Ò›'‰uéµHuIu½IõSdWmtæT^xWÎ@ù›€{ŸZô-~óÓ[k’Cm§]‰¦¿yîšúÝ[Ï3Kä”_)®mòòœFsó`y†¹]sQÒ¢·¶¼Ò­­Þ£pºŒÑ˜#t´* ù*œ…C)™¼¶žyÜ(—ž ­n%·¸ŠHg‰ÊIŠU‘ÁAŒV„>%×­´³¥Á­êQiå ¢]:ÄU³¸l99ç&» ˜m ñ/ŠÓF>7‡Saö‰-×ìLefØe&óoÀùÀÈÅIçxm?zh–[ÍWN±Ó´í:sio(EXÔÊÒ]L$>óù@*áŒumÌÔæÕµ+Pj“êrêÕÅÛÌÍ(eÆÓ¼œä``çŒ ì4ÝRøÇBÒäxãƒKÔâŸU™âfo•eR¸ ˆG˜ˆFâÈèFðv–v·šŽ£iâbÊbŠþâçGH¶4aãPó#bL†•  AÜEzeÙ²¸ð펣u¦ø~ÊÊûL¾žãÉ$æàÏt-Ö8ËUA ä9d\-?Í >œH±±Šwþ47I#Ûa¾ôqD®¹Q?hfO˜hƒ‚ ®®"··ŠI§•ÂGjY‰ÀI'ŒUÇÐõD³º½Ëci)†{ÈSÍ1æ®PòW<îê+C¿óò?ä!ý•?Ù?ñß?¯ñíöŽ¿‡Í¶£Óµ6³Ñ¯.’=ê ±µ2J¥`‚e›Î …³“’2Qæ98r†€1à‚k«ˆ­íâ’iåp‘Ç–gbp’Iãnx7T‡Eñ®‰©\¼iom{Ìï,{†ã·¹ pG WAk¨ú“ ¼1'ˆíÙU…—Ùcƒl‚E]à[oÈ·?&[ yϘEhk¿ÙßðêÙò û\¿cûßêwŸ{æû¸ëÏ­zýíÚCÞÁ¡‹uó0ÛMÞÂò›ÌUÊÆÒy@­â³.³83åôW¬Csáïí×M+JþÖò OöžŸåíÌÞcy’AöMØû0ÛîÇ;³æŠó=XÚ6³|ÖÇ™¸À‘»º¬{ŽÐÀb1ŽX{€h¼M BòÅ"$ɾ&e :î+•õ•†GpGj'‚k[‰mî"’âr’G"•d`pAAãÐjóˆ´]Á-¤¯oe"4e£”¤‹w;âHŽp º0Ãßšé!‹N·ñ÷‰â¶] íä»shþ}›$P³±WˆN »¨R™)'Ý Ê”çf –Ý.)ì‰!Sµ™@,èH ¤ŽÛ‡­G]ÅÖ —Þ}.ÖçC†=BòY…U¼¦˜|–‘|öÜÈë‘– ´HU@Ç7{¡Íeáý/Yk«I`Ô^tHâ´´EC 0¤‡V'‚  º’x&µ¸–Þâ)!ž')$r)VFy1]'…šÓµŠ]*-LK I58â’4¶Äžq *²³òxUiÈP~a]§‰o|5•ñ§Ä{˜î~ ë‚8Œf눜ƒ{ _-ò"õ÷Éõc@­Q@š>}® Ç´XÖ+;y.&–VÚ $o&Ð{¹Xß 9;Ià+rÏÂ÷Ú;_Ã,Ai%òZbC#ÛF̯.B˜ÕAGgRJàYw½Ñôëë›Zæú-Ö“ÛF¶–©6|èdˆ±-"cnðp3žGkb/X[hvöQO|ß`´»²‚ßì±¢] ¼õY¥på••n_áÀÃa‡˜Ärz^›6­~¶´hJ<$„…Ž4Bîçœ*«6$ã] ðF­ÛWÔ ‡M»û4°NRàÇvòy‹Ø–#)c²p¤Æ8»«èzƉ¡O¤ß[¥óßùWpj>tQK ‰Q¢¢C÷ö«–d|#æ¶$ñ¥…Æ™>‹&¡ª¥»ÄŠÚ©´Ž[™È’æG J6oû[©a!$!"F‹Ôá¾²½“LÔ ‚}=ÞÔÄÒo•vÜ‹‚F7A”en:ðGON+Pkºp¸yO„ôbŒŠ¢#-æÕ œ°ýþrrÉ#圀aÔ’O4É K,Ž¦È•˜‹¸¶Ðnf8É=ëPë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9&I5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚‡En wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s˜Î³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’@1è­É5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚ wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s :+`ë6Îh†t¡$›öÎ$ºßâHÚ<í¿.@îŒî9&I5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚‡En wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s˜Î³`læ€xgJI¿lâK­ñî$£ÎÛòä~èÎã’@1è­É5Ý9Þ_ èÑ„}Ì«-æ$HÚÙœœdƒÆTsŒ‚ wN)ðžŒQ‘TDe¼Ú¤–¿ÎN@9$|£s ¿·\g}€I‹S/œÈªçÆb9l ã9Û¹±Íšõ$ò,×ÊÇ;–X£,U?tn$àtä“êMG@Q@Q@Q@Q@Q@Q@Q@Q@{÷Àùîÿëýÿô\uà5ïß?äW»ÿ¯÷ÿÑqлZÿ©ü+åo‹¿òU5¯¬?ú":ú¦×ýOá_+ü\ÿ’©­}`ÿÑÔËa£ë:+âŸøMü]ŸùuÏüKÿÅQÿ ·‹ÿèi×?ða/ÿG0XûZŠø£þÿÐÓ®àÂ_þ*—þÐÓ®àÂ_þ*Ž`±öµñXñ¯‹ÏüÍ:ßþ %ÿâ¨>5ñp?ò4ëø0—ÿŠ£™µ(¯Šÿá5ñx<ø§[ÿÁ„¿üU!ñ·‹¿èiÖÿða7ÿG2 jÑ_ÿÂmâÿúuÏüKÿÅS‡¼_ÿCN·ÿƒ øª9ƒ”ûRŠø¯þoÐÓ­ÿàÂ_þ*œ¾5ñý :Þ?ì!/ÿG2)ö•ñšøÓÅ`dø£Z?öÿ/ÿQx°“ë˜ÿ¯ùøª\è9Yöñyñ¯‹Œx£]Ͼ¡/ÿL>5ñwý :ßþ %ÿâ©ó ågÚtWÅ_ð›x·?ò4ëŸø0—ÿЧÂkâÿú5ÏüKÿÅQ̧ÚtWţƾ.ÿ¡£[ÿÁ„¿üU/ü&¾.ÿ¡£[ÿÁ„¿üUÈ9O´h¯‹á5ñý :ßþ %ÿâ©|\æi×?ða/ÿG0¬}§E|_ÿ Ÿ‹T‚|W­öþЗÿФÿ„×ŧ§Š5¿üKÿÅQÌ‚ÇÚ4WÅ¿ðšø·ò4ë™ÿ°„¿üU8xÛÅØÿ‘ŸZ?÷—ÿŠ£™”ûBŠø»þOçþFoÿÿñTÂiâÿú5¿üKÿÅQ̃”ûFŠø»þOÐÑ­ÿàÂ_þ*—þ?ÿÐÑ­ÿàÂ_þ*Žt§ÚWÆ ãOÐÑ­ÿà|¿üU?þ/ÿÐÑ­à|¿üUÈ9O³(¯G|\?æfÖð>_þ*§1ñsùõœ×ô¿üUÈ9O°è¯ŽGŒ_þ*š|[âÝÜø›[ÿÀùøª9Ðùö%ñïü%ž-$mñ.·øßËÿÅRÿÂUâñ’|I­ÿ_òÿñT½¢F}ƒE|z¾,ñqëâmkÿåÿâ©ÿð•ø°uñ.µøßËÿÅQír3ëú+äño‹wcþMdû}¾_þ*œÞ(ñ__øIõ…öþÒ“ÿЧí¹õíòñ_‰ñÏŠ5¼û_ËÿÅS[ž)íâ}oÿåÿâ©{D>F}E|‚)ÖÇý¿KÿÅS¿á'ñPá¼Q­zcP˜ÿZ|è\ŒúòŠù|Uâcð•ëA½ò_纠oø´ kYôû|¿üUi#>À¢¾>+ñyÿ™—[×íòÿñTŸð•ø¿ø›ZÿÀùøª^Ñ‘ŸaQ_Â]â¼sâmhûKÿÅRø»?ò3kXÿ¯ùøª=¢F}‰E|{ÿ ‹?èfÖ¿ð>_þ*x¿Å`œø›Z?öÿ/ÿG´AÈϰè¯GŒ_þ*hƒ‘Ÿ`Q_ÿÂ[â®Þ'Ö¿ð>_þ*ƒâÏãþF}gð¿—ÿŠ¥íPr3ì +äñ_ŠÈÿ‘ŸYÿÀùøªSâ¯vñ.µÿƒ øª=ªfϯ¨¯¿á,ñh8>%Ö¿ð>_þ*—þßÿÐÍ­à|¿üUÕ#>À¢¾>ÿ„·ÅŸô3ë_ø/ÿBø·Å§þf]gÿåÿâ¨ö¨9ö òñg‹;ø›YÿÀùøª‘|UâÃÀñ.²íþ_þ*jƒÙ³ëº+ä?øJ¼WœÂK¬ÿà|¿üU/ü%^+ÿ¡—Z?Kéøª=ªfϮ译GмWßÄš×þËÿÅQÿ GŠÏð’ë_ø/ÿGµAìÙõÕò0ñ/ЉñSë@×ü¿üUÄþ)ÇŠ5“ú—ÿŠ£Ú äg×4WÈgÅ^)ð“ë_ø/ÿGü%^+|M­à|¿üUÙ³g×”WÈcÅ~+ëÿ .µÿÒÿñTŸð–x¯8ÿ„—ZÿÀéøª=²fϯh¯OŠüYÛÄÚÏþKÿÅP+ñ`ëâ]gÿåÿâ¨öÈ9õíòx¯Å¸Ïü$ÚÈÿ·éøªÈ¾ñ¿‹â¸ güT:ž_w?m›å žÍŽ È=x8âyñÅRÜ»Zø‡W†?4ºÿ§LIã ¹è8ý(í:©-ÔVqÜÍ3aÀÉ$ªàÜŸJøÌ|Dñp¸ÂEªì WÊû|ûpAÿo9ç9Ïò¦/Ä¡RøÏýõò§Šô¹õOˆž)KV„Ìš­Éòž@„¯šûœÂí^­“ÀË}Õb³^|HñšjC‰5¡;:É#‹©#Ú@!€>c #” £ ÉÇ;m®^ÚÜÜÝ«¬··ºK©×Í‘²Ipwdùù² a•'k0` SƱO$i2LˆÅVXÁ à¼7pzòö©}¤ÛÛÛx~AsåiZ§’l”ˆý¦h³…RÛBƤà1ëŽÂ²ç‘e¸’D…!GbËeŠ 'îÄœœ’}Í\¾ÕžÿLÒ줶?³¢xc™7o‘F“ –+Ã;ãuç8Ü>¹ŸT×à†æÒÚ="õ­¤Êîp<æbcù‚G®NÕ$/Ê¥ˆZϺðìÚ~©Ü]˜ÒòÃSM>{q)-”œ€¥X‡ãaùH`EÉ|u%öµt–V0¶¯+Ípˆ²Whg…ŠåÉ27$üØÆÅS¾ñEΠšêÜÚZ1Ö/VúVÁ†Uicù±ŒJã »ƒê3@¿ƒà·ñ›¤éZ½¥ä—¶öòËPcg‚9 ;£RÁ‹’ŠœŒ.Ýä)ÃÖt—Ñu³’æ †\‚ðî •eduWF ¤uSÆq‚ ¸þ'šaiçéÚlò@‰²Kf¹#ò‘“ò…å=‡€Ä—UaOXÕŸX¼IÞÚ uŽ$†8¡ÜB"Œ¹Ù°8˜à£ ª}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@{÷Àùîÿëýÿô\uà5ïß?äW»ÿ¯÷ÿÑqлZÿ©ü+募òU5®{Ãÿ¢#¯ª-ÔþòÇÅÀ?ájkYõ‡ÿDÇS-†ŽˤÛÛd¦>´<2OjØÚÅo/Ú€žÕ;FÉÔb/½ !¡:p äóÆ*\Ò€ ”®!(¿Âsõ¤ÚHÆ*Ôª8 ˜¨¹#¦¤D; ¥ŒTØb¼RˆÈëEÅb%ˆ1枨ÀÓñ€I$q¡±šM±` gÒƒÙž¾õm0®Õcýâ(2H3´(϶isÅD˜½?|–eTÊ@î;Ó÷•“vpþ«Å)ÃdàçÜӿЋç Óž SÞßË}§’*r…zãÔáÂÃéÅÀ¢Vò³Ú”Ľ?\Uµ=)ß+rPRæR‡’}2=EH°)ê@kj¶ãð£ÈS€XQÎ¥CîëNò}:U†7€1éN °}i9)OÉ æ[ç½Y£ "«g Ο3**-©÷¥0cŒUà\ºãAŽF9ÙÍ.aò”ÿU8ÃWE»g‘Šk¦ÓÓéÅ.på+ˆ‘»¡©L+ÝENƒ?xqíRƒlîúqCÔJ‘§Í÷}¸t«²€ tÅ"…¸«i,q¯ œ æ…1ò’ÜË1V8îx#éê¬1"nôr_¾O'§©Åƒ¬~fwÎݼ‘MI±4‘•öQ’wb‘mceæ ÏM¹­n’åŠ\ò1Hm¢È_:5Ï©8¥Ì52K8Tü²n>¤T&Ýzp Ök5E'Î…¾UÚ4”ý)90Q ŠÆˆ¾àÿhÒ®®“dbÜÚ¤Hdz)8ü©`Óã– ædLž„ò*k2ã,š…¼‡û£9þTù´Õ žÅo¸(ºYv@hið„”m¤TPD3·q8÷­[{7 êI¬•Ml‡ÈgMeÕÚàûmÁ¨>È€ŽIô+zâÎ3ó•ÊÕi-ámo¡5nz‰E‹hsÒ¡kQ¿©­q àkDC ®}°)s”Ï¡qƒ“õ§›8,Eiùl@ÜÀŸcHd‘[åÚN1ÈÏéK™ŽÆjÛ†äñözÔëjdNF@ê3нy¬?'ŽhÙ• ›ZB?º4Ô™-ml±8*œûÔßÙâX¢ 6ެAÇò«ÇÊGÌ`†ô'5;ÂÓÅ»iê8úš|ÁË¡’štølv`?4éj8$ö­d¶VM¥® ¤6ªóƒIÏA¨™gM]»Â¿QŸÊ†±.Û ¥G\àŠÑKBFrëèvæöv,?{ŸSŠ9ÔΎÆTLüÇ>€:ŽKfw;¿ýU°ÑÀ1´¬ÝA¨ ÞÛˆË{ÔºƒQ2Èõ¨Å™#zf¶Š+œø Œö íÅO´cQ1¾Ë‚r£üÓ…ˆl|ËÏjÔx$¥ 8¥Ð|¦QÓóÎFaH¶ˆùsŠÙÀó€? i²È$žÂ’ªˆË]5 “ÈnÀÓÿ³AÉsÆ+AmtbsÚ¥X?tgêi{F†Wö~rxÅ4Xà€G¸­±îïšlŠcaëógúQír£m•‰QBiâÓon>•ª°äà!SR,O¸8öäÑír˜mlœ.)ÿfÈèkS쫸œ7ÐÒ‹U=èöƒä2¾ÉLl;… ·Lc·Òµ§G¶)¢Ö23œŸZ^Ð9QAl×o^¾ÕfÞÊ5RÍ´žƒ'd@ƒ»ó« n¾Y/Ÿj= r#&K!ö\S×$ü£ŠÔò2sŒcÚåí8hÅÊf5Ž1‘Іy9Ç­k¹Ý€XûTË€FÒHü©{F¨Â:o=XÔŸÙD¦VE>ÙæµÄ,Ý6ŒúÓ ¾à@Ǿ8¥í;‡)ˆúy¿•3ìD+hÀPœãóÍ4Æ å~oZ^Ñ•gÚ1šÛw÷+kÈB¹àžõ…$ÆqëOÚ0äFOÙˆ$ahû)ÏÜð­M‘ƒ£ÜBOrhöŒ|†wÙ]‚‘mÏüóæµ!o”ä{Ô€D å?\Sç)Šm³üQö_ï)ÇÒµJ®Üò3BÆ1óÙ£œ\¦`¶Oîq¶@>íiFÎ )‰H84s±ò™"Ð`€ ÐlœÿDZ­&ˆ•â2|nÙœ¡QÛ"h¦[Z€9B~†¹m<»à÷ó5ßHƒž3\?ˆ×n¦£þ™æk§ +ÈÆ´m Â=GQòeg$\8C†eŠ&¨'8$&3ƒŒç®ŠãÃ60iöZÓõVK¸íÄVeó™æ{€„7•È+ lçÌ9å,…ßÚÒK?ÚaÌÈÐgzlË‚9B–Ï`3Ú§:Öªd–C©Þ™&‰á‘Œí—س¡9åY‰b’OZï9N¿Uð­Šëº¥°µ»g0êÈöì©´pÉ:*²l9¡;—ïŽ9-|5£Ãâ嵉.ç†Ë]‡M™n11‘¤ p€ÄA;ÁÏÉÒ¹­j¦9c:éŽi^iÎØyJ»‘žY”•$òA õ«~#×5½~ð_kÝ:\4—ÑÈîbEg ùA‰ÂnR¼s¨]6ÆÖëSœ K¸-åÓîn-|×W?»‰ÉbL`:æ7Aèrµb O›N±î¾Ýy§\ßnÊùQˆLçÆ[p‡FÓÎ[;F?öÖ«ý«ý«ý§{ý£ÿ?~{y¿woßÎ~ïzqP-íÚy{n¦\M bCòÆÛ· ôS½ò:ÇÔÐI®ørÏMÒµ9`‚øK§j‹¦½Ä²Ãm”¹U6‘å©Û¹°g±9Ú‰¼·±ÜÇo~­ÆÓÈ'qYKpNWrHOAJÇîŠ5/^jZE¶˜ñG0,JÌ$–F“ÊVXóæ; L*_œñÀÅ=Fk{¨íÕK„òÚ|1c †E9À ã$ ¹ÚÌ;ï²h\ÿgùÿbó[ìÿhÇ™åäíߎ7cÇ­Z;}?Â’Ém˜åÓÚK‘ ¼¸¼¸Só`üÛT(b08 b¹ú±5ýåŵœ×sÉkk»ì𼄤[Ž[jž'“Ž´ÞÂ#¥\k~1MvF—©Ë"Žȉw3‚¢= ²ÚìB…/¤.Ó«hVÚFâ+PòKw¥ë±Ø™Ê YSmÀ ¥Ðæ"HAÜ22 ÖÚî±q=Äóê·ÒÍs>G¸vipÜIù¾GeçøXŽ„ÑöýbK=B_µß=­Ü©öçó¤ÒΞièÍì7sÃÞ€:ÍsIÑnüI§¥ž—©Yééeg%ìѰ™@k4”gdCaÚ²3¾œ;„;JoÄš}žŸ¨Æ4ñ?Ù&ˆKK •]rFä*ïS·º#+nFPÈIŽÂ}{P¸Ó¬4éu+™ížÂÞÝÚÎö1*ò§+¸•ôÏj¹}¡xÃS×$ŠÿJ×.õy"ºOo4“´c‚7 žœb€9ú*Hàšd™âŠGHS|¬ªHEÜ-è72Œžäõ$6—gò-'—í2˜ Ùo6A·(¸ûÍ󯟘zНElCá?\^\ÙÃáýVK«]¿h…,¤/á•Ü er9ëYóX^[ý£Ï´ž/³J Ÿ|e|©ì#gî·ÈÜ~Sèh½$Muq½¼RM<®8ãRÌìNrIÔh»ô )<ž”£š_›¦)\bªsÎqÛšz¨¦š»ˆ€*U÷'-……8*@8¦çb¤]£¹æŒÈ¥rìÈäûÓ‚ã*U84ò0is†`2 Çš‘v…ÆåB l¶3ŠzfËsŸjW)X`!O8Å;)»8úTª«» zš™cLôu©r +(Bò¨Nä.~µuø=TÕÆ>Ô)ÄpxU┌¨/×2Ÿ-ù\Ó܇Á ïCìR3œþàƒŒ-KŒqµAúÒ…É÷ö§qrUnÞœË(Q¹Tz•c__ÖœÄÇ—Ÿ|Ò¸ìWĘþ=hdvÇ=}*¨X~T„ç ¢ãåˆæM<€ c"AŠv¾ ö†=A¢ìV™ñ´Ÿ\UÁslUCá5M#9&¬"ÙànbN;zИ5qbh·äºž*ËNÈsÞ}B±ªÑ´+1*olÕ‡’7RO–~ƒš´Éaç‹÷by!ŽÔUi^ “¼»JÂ,“”üºT°\y(ñ×;A?¨¡ê4»ËBA*ÿ†ÓQ ÛU†~•rYG,fÜO¡¨Ç_ù©º‰TcýÝã)o¼«‘S&˜$Bc¾µw=É´þ´‚B‘YíÈå”ÿ…Y¶»º‡/úz?®ÔS\¯rZ—Oëð#]&{xó#B£=D³ùTð¡C¸ÝAÇa Í!žþáÌ—7pÞ’®?!S¤²mÙæ#Ó‘ŠO–ú!{ÝFÜ;—8Øzóš¯.Óª֬Ȓ9ʪœõÚ?¢0ÌÌŽ õ; &2/(ò@,zUs SÜú² /r1ÔŽ¦¡Ý/švžLŒZÄáT«¢²ž¹ê?aSó¸ ëŠVw'vÍíŽIɤ=Éb@¤eqŽàâ¥$á¶6Ië–¦D$bå†jgT…Àb¬Ý~U¦˜Øå’#Ô/cV÷I4)P þ£<¡È}wš–ÊMªÊÛ³Ž6óBщê‹—vˆ¾zsɪ¡3’"Ú=óWbäµ/øçh;Iüj RÒýÖŒz³óU$(²8™|ÆÊñÓ!ˆ¥‘6D¼áSVÄk°Nå9ÿX Ÿ¨ÅAæífÏô þ•6¶ãÜŒÊUJïluÆiƒæô'ޥݸáHëƒ?BpG~›) ÈèÔ«›ÂŒŸ­&ÒG'j]²(ùTóÐæÑC(8ÝŒv§¢È:sHÉpvÇšU2Ž P2TŠâFÂ#1=…9­æLnŽE=óÅB²L§ ãéNófÁ䟭!Ž1H:Rlt<†ädf O —|€ço_j’¿C(*çߎ”,­ž„SŒ¤õ`9èE;…„GëÁ?‡Z˜ÊBŒ;xÆ1Æ¢F'rþx§îÁ4®dVg#ÙÍÈãÜ@ÜíÙFrOaV-t-bûQŸN³Ò¯®/ Ýç[Cnï${NÖÜ d`zôŽ3¸Óÿá›ÀÖ°Ýe µÓæÜO–³y„j2à [|6@däª>YX5;94­þ¿¼‡Fš1¡_GqÐ<ñ­ÐŒJˆUƒ`Ã3ņG.þ×£GwÑ5%DI]˜Ú¸ ±6ÙI「pÇøONÆÂóS¼ŽÎÂÒ{»©3²#2;`p£“€ ü(¨þÉOk^³²¹Ò­5-Nх˰B³‰¦UR‘®™ Tn,§lž>µ4í3Uk«…¶Žî !²’æVX¤ÊÀbÉ-±IêÀdü¤8É IªãIÔšÁï×O»6hŠïp!o-Uœ¢’ØÀ•”åHê(Õ5¯øCæÔgšì12ÝÍöA’±ï&ý!Ü£cÌ6ï;›‰\¶=óhìúyÕeðä©ýž¢õ¬ãDð\\Àê­´.Ñ)Q´Æ2¥œÂÇÍêå–“©jI#Øi÷wIÆŽÐBζ 8nîxÿ›ý£sçùwšûþϳËÝ“ž_É·=6ü¸éÅt$±ð­¶èwÞ}Ñ”_¶K.'iëŽw¡ê1ít-bûNŸQ³Ò¯®,`Ýç\Ãnï{FæÜÀ``Nz ¯5…å¿Ú<ûIâû4¢ ÷ÆWÊîÂ6~ë|Áçå>†€+×imåßÂÛ»W¾ÓV$½‚êÞÕ¯íã¢%È•ü½áËå£Ì£]ÖxrÕ´‹­+TI´m@ê6÷°}‚]A`1Ä|öb¢0Cî_˜‚EjlÑüÙ4y­ìbµ¸Š+ÝF;=]#ŠÖxšT_*Wó¼Õò¥Èžc–bJW¥é³j×ëi F„£ÈòHHXãD.îp ª³`N08c\Юt‹hçxåŠêÝn­§]Vh˜Up2¬>eÆFA€w^1Ðu]3Æ‘ÇewjoÒkMê'Úä{ØÞ2Ñì$º)(r¤›B—f¢ïÅšUÞ‘¡ 7O’Ü‹ÛëE°›Te½´ðEcˆÁÅd|€Ë#?˜Y±ÉÙøBþûGkøe€È-$¾KLHd{hÙ•åÈS¨(ã êI\K.ë’ü>Õb…Å£¤7ZÞºùl¥Ž6’Dv(•Hä'Êó>ïÜ›€4/nô[gHÒVYGÒì®í¥¾Gs,Mqqå bÞiˆ:¯ÎÝã‰nµ]wáö«5þ§¦¼“jqê _[C#à]äòƒ.YÐr»˜l •U.Ok ;„0Ij4öÔRð—Ž9a #¢EW,Â)6©PHRÃ䪽‡…†¡§-ÄZî”.šÒ{±`Zc0H„ŒÀ•Œ¢±X˜€Xd=ÅSðõ£_kpÚ®¥œ%IîeŒØÛ×,ʹeʀ̡‹HšØ½ÒçÕüK§h²^èÚe´væ+G›SŠh ˆ$Ä“ÆXof.Nqó8ª•¼~ ¹¸­5-6é#r— ŽV̈ÞC½¶aÀHf9‹ÌË8ÎWtŸð…²YÉ>½¥A¦+ɼqpRãÌ2µV"ã o(;•~ï¡¢kú:x ]Ñä´ž †Óòî—ȉy7Ú¢(JËELjڒ`)vj¹m~ÚNšcžçM¼»Ôov¼°j*ͨE,WI4ÎìÞCªÎ—XÿÖèåNÞN/ Þ\iš®§Ia§}ëÅDÿ¼Hÿt¬6<Ô' m »°YA±7ƒµK]FÂÆçȆk»I/3çìÑFdy C …Ë †6ãvV€:‹CD¼X<2ÿĦÎÒ6¹‘õxÇ,rÜ9+7”DÊÛ‚±ÆYŠü›€ËÇ«\I|u_i÷֒ɨ=é‚+­J’ÂÖI%Þ‚“q•ÿÉ]ÎàÇÅêÚKéRÁþ“Õ½Ì^u½Ì¶J›™ ÕXaÑ׿Q÷r2'BÏÂ÷Ú;_Ã,Ai%òZbC#ÛF̯.B˜ÕAGgRJàYww—7úñtš×“£Bíq2èþEó2Í·™`i‡šM±G¡ÔìÜx2žâ‹{kÛai¤3µ¸kË{+>eÞà,rn}ÀÆ#có¶˜dcjçézlÚµúÚBÑ¡(ò<’8Ñ »œpª¬Ø“ŒNtð€j q–öÒ+K„­nÚ+‚·&bâ%HÖ#.[Ê—@Ìç …€9:+¨okAx&0G}k÷c—y 0»G,›•LaU£|Î +À;—v|Þ{kËk;BÆ §Ýö˜evSddù§n7c?"|‚¥Cü´Etáa ª×± mï]¦)8,éò ŒËÃG $ o'æMÃxFò/¶A5åŒz¯ž_MóKÌVÞiÊ©ŒmÈpÎ…Èrîçè­Áá{Ÿ·Ûéíwh·¬’ÉunÅ÷Y$h]Ì¿.23BÌ6•*å©ÂsÇ*ÈúŠéo™uCæˆK:Ï3qxäP»7|ŒØØ P?En7‡c‡DµÔ®µ½6ÝîíÞâ GYÌ®ªï2±´lXvÎ+€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÷‚ït|1=½ššKùG`#&¼:¾‚ýžqýŸsŸùï7þƒ zLPêÑ@ÒÁs#M$Äü‡ÇQìkç‰7‹¨|AÔ®Ó¤ÉäëêÛ¾l¾»ó¯|T⤘ÿÓý•3بîPÚOµ&ÒÕ½JÙì/e·|åN¸õª ±=ë–æêÏQ„ÆÓIjŸ.NsLîNi\i Áî1I­JÜŸZf4\ÛšÁû´£4àO"•Ç`íÐ pQ›¡ x4¼ÍH ´Não‘ïJÈ£ 1ŸZ.4€€ëRúSCí(2dp¦§R¬ {Tw€Z`\œ“jZLåqÁ©$í=©ªÎ •9=MMÊLU ÜŠw–¤äsíH_˜¥Ýè@:ŒX lT.ÛO!CÅ&ÃëBUSÎÐ1ëQ°=?ODËóœT’¾XeHôëNã*ü§‘Ö”GžCøÔ„(W'µFyùziˆU'¶jQ cÕ Äû½ENU‚ò l¦Ôã%¨Ùv0ô§ì< Øö¦0ÚrI4&€ëJШÁ-L$ƒ‘ïI±G4ÀzD…ÀÞõ5cìñ#®Ü¦"BF_o¹©ÖVâáOáH p¬$ò¹#§ÍŒÔ¼…£omòf@ÚšsÃ4wÌxÁPqV¶%‘°ç Çßpæ£!Ë<úµ<|ª•zåy¤{eq¼L„wÆü³OpØfÿ–xïP»psMò”tçÓ‘þ4€9¨e"`c#ˆÐý\ëVfÌ‹;fÇûdÿìÕ_ìñº+y˜ÏPH—5}‡Žñðª23Êä²€{áqMDE;·9üiÂD²û’i97»—D"ÅŽùÔ‹nUKy±«ÿ*’¡‘òø |—@äm?˜ÿ R·3mû¿÷V6¸ Øæœ¬ ?Bh‘6crã4\ î¬òy7¿rƧ·ˆÌFòNBAþTÁË «R²à)eô¥Ì;\–1.ÀHü :RX`¦S¹\æ¡ÎxŽÜÒ±ŒËÓ¶M>mÔ¤0”#»SË´QíýÞïö¡RGãÖ¡Äx.r{òiØCÁaõ9¥ÌÂÃÌû£ (ŒŸö®* E²ŒG¶)~VV@}€4Ý»OÔI¶ÊI ϶E*ŒT°öÇâìGQôÅ r:Ö•Æ4´ç€XŠr³Ž¹§›‚£@ö \îm<{Ò F‰™y Óž”}ªN~A†ëòŠ‘nUA?ZC.ïà"‹œ¶)…8KžÜzÒ TÿíÁ»})X–Ä}i (9$5KŒsN` `¡4ÅT ŒŸj˜@ÅB ŽŠR¬>ñϵ!ÊÈéíJÞVÑ’½zµØ?éÌIÞIéÒ‹#y{±¸éšhh»–úŠˆ(ä±8›È<0 õ¤û”—>ÙæšîYó!ϾÚEÜzIéŠxyPôÿ h2‚ÝÓýž´¾s¡ÏÊÃÜTOæç f”ÈJá¸Å/œåŽ?Aÿ×§yòíÚÂ<ï06üm}¾¸ §Ë»“e4À—tŽ7 ¸ô)Lw"#)Ú?\ƒUö¹Ãט¨ !XXÜFØ¡kÜ‚ß4n£ØŒþ”ó:8'§ß/pz‘´Ò(ˆÀù¥aè<ºíHF=©E'‰IõȦa3ÇèE!‡'<çÐÑ`'iv|”ÁϹ5ʃ3FGeP;æ‹(P9\ïN2nM¼`õȨÁÁÈÛ€:Ԫё‡Lãû­ƒBB#ãi®=©ò@`)˜UcÔõ" *YdO¦H5JàÉöáTýi$*=N{ÔcfF9çÙëÒµ5ßé–w÷7¶+ö;¹­6†“É`ÁdÙå«a„vW` w.êþ,Ðl´ ëhlµX/–[H&a2†9 ;ãAµ‹’¸É Ø4Ðj~4ÑõO&¤É} ‹ZjVÒ 4‹ö™.ÙX.ðÊdn†ö'.ÛÅpÅo£[ÈnÚ þÈÇÁQ5À¹Ôgı<“¡ÀÎ^“á÷Õtë½Aõ ;IbŠin݆ ‚B¸UVfÿVF26†+$úXèÚÌ·«$Z†›©ÁbñR ²ÜoÉ ƒŽ½xÀz®‡4[‹K‰ÛUŸÏ7л£"(p"+·•ÈÝÇwËœ*[CÃ$³Ñt}VÎæ9ÞK½ÞYA6—ps’?ŠáÐ7|sLð —ĺ~©Ú›S‹NÔDMö“9lDIÏ—"†Mè òÀM='Ãmúëþoˆ¬QtëHæ†ä%Ç•!ibBHòKíÊŸ”ÅHʆ sRñ®ƒ©k7š³Á©,æßS´µ‰Qí¹k—I·g Üì(mÁÎ6o^Ölõ=:ÎÒ¾ÿ‰î`iÈ"xñƒ#€~IÕPáå¬iŸÝzqéJþ¹Õı³Ã{ ±Œ;@é#Wf>YÁ‘´åNàFÅßÃýJÒþâÏíÚlòYÜ<Í ÌËiµ$“s¿01Ã+á70ØU€|)§á~ÇCûWÛtÏ·yÛ6|¶Çf3ŸõöòõÈû»zsž1p—zÍÌQyQË+ȱáFÀI |Š«Çû*£ÐÅ\Ö´S£&[ûKè/mþÑ ö¢@¥|ÇŒ‚$E`CFݽ+.€6×1ÔnY¢–Ò/.ÁZ˜öF›ŠÎ»w;„{ÊÃ21_3¯P‡áŃܹ’×UŽÆÞYaK¹®#ŠP-µÄË4´a"Œ›prLƒl îã,—‰t5Hæ¿¿ÖeK]2êÅ.MšI-Ó\}¤¼²0ØU®:n}ÛrJ盋P³±Ñõ›+C;Íy,QG;Æuª³;+.㵋­»qœl#v ÝÒGá+)®.Z Y»1$>VŸc©Eu,êæM× 4P²´HcXÈU8wÁ`FÓÉëºgö'ˆu='Îó¾Ãw-·›·nýŽWv2qœg4ÐÂIag§YYi÷Ú«F—k2¸#“û>"$×Û2Éæüàˆ•ü±¹pß.‡ü'†yd†-{UÐí"Š(!m'O†7¸Ò¶é9"Xþiœì\ŽFK2ïl¶ð ê‰Õu=5ç´¸û=ü eÝdÂ9dräǵ‚,çË/¿.쌑øâR$‡XÓe³6Fûíq%˨ˆHñ’PBeŸ,S`ã, ( ÇÒMgâ ?±ZAg{o,6éeý•^ég1ù…lÉF*@$:÷†ìåÐe²ºÕf“M´–̼¶1ÄSÌiÝn#"fýäm2²¯1ƒ½ON.xZÚâXÆ^7(Æ9ÔqÃ)!‡¸$ÕÔ]ü?Ô­/î,þݦÏ%ÃÁ|ÐÌ̶›RI79Ûó2¾s …X ÿkë¶ÒE=ÝÛÁn"–úõBÏvÛÝ·È77!Ycfùc^GÝ~0¶ƒÃVv’=ÚÏceuf–‘žUÁ˜N¢W—p`P\¾Ô*À`௘خ< ,‘<ñkú3Û­’ßùŦEh<ó0ß9W^W›#`rqUï|;§Úø:ßX[´šåïnmü•Y¿z±ùX)˜€;ˆùY@ùƒ(“CÖ4M }&úÝ/žÿÊ»ƒQó¢ŠXTJm¿µ\³#à1È5±',.4ÉôY5 U-Þ$VÕM¤rÜÎD—28hÚQ³ÚÝK !90ûøeä—EŠÚxíú{ß<ÆF)#Kæ.ʼn²ª; RÛ‚Ñeáûyu©,ßP‚îßû>îî;‹'8cÈ¡—ç2©#‘ÁV &£ñÛTIî¤K»yö_¢XG4R›¦¸"G›!³ºpªQ‡ÊpWÌl·4_ß™u¹õ›û{›Ö½1Nÿ³ÆÉ1oïrñ3¼a°a%aÁ#fŸ€u»ï ¶¿ YµI:/•)ßeƒ·˜ĸØÿ+:±ÛÀ;—u=sÂ÷:½´·7v’<È®bŒ¸eVk ê¢T;Xy‘N>÷Ì»€6 Õü=©y¨I«ë/~éµ½T Û¸6È…ÀT*¢1„ÚªUi›¯ Ãáɬ¬õ V©w™ÉÓã"ëk“3ùùŽ<b¡[çÉ%ö¦Þ^Šô‹ÿˆvwÚ›ß\Üj·’\]És¹PN¾9Wm±.wmiQÁýÖM¼} #_Â{HµÏZ<‰—[ÚîÚ6œâTó‡gUÉ‘° N9ÂyÝÞ\xÚÚ{ Ä7š’ZJ—i‡R[Ï#'În1´‚@LYÜŠÐPEPEPEPEPEPEPEPEPEPEPEP^áðjáá;«ÛÍ,ÒnUêTÇq^_G~Οò,êõúÿútÙC«j—›k £u(+æKD=X“×ÕàlF—ãýFÈÞJ@™õýÊWÓº>³m¨j×¶ð`yMòŸï¯#ñþ•ó‡ÅÑÿS[úÃÿ¢c¨žÅGsQó¦¹2³—^€š«±”ƒ¸U낉 ÆäbAç=ðPØÍÞ¹dÕô7Šî+¨ÎO¾) z.ÕåŽi ÈÀ&¤±2äPv`p)Ljy'&•"éëJᨢEè9¦“¸œc51£+ŠŒ3˜ Ð=iê£Æ>ÔªÏÓ$ÈŒdÒŒÈÍ /LÒçÇ4Š Úœ­¸ýÓI‘Á¥ó9àÊXSÁ¥ )邼¯ãKµ{Ò¸Y‚d÷À>Õ:coQÇ­V+Èä“Ê,@j–5r|)oj_/8ªâÙ·ÉJm@<¹©Ó¸ Ó¨'‘@œÉ})¦(—Ÿ0M<ö8õ4ÒA©/˜*?ZF˜°ÉÇÒš] vâ”ãìŠÛ½)û¹-Ϧ)›³Ðš8Û÷ð~µV‚éëJdvÈÆjbà§ù­ÈÝ…íLϯ…rsùÒy‡<9‘¤=71ü) 6ÎìýiDŒàqïP–cÓ"ÄuÉ>ÔXW&òÈ9%:•"qÈ)Ï­UÜPÙúS×'ž‡·ƒCB w-è ã‘OšÑâ8,Œ1Çîøª1E<ƒåV#¾5lÛL©þ¥Ç¹P*ú ؼ$@ŽûrOëQ5ºvôJzÇ4¹Tˆ³tãf^ÈÅVÈëœüè³k¹„gsôZ…la³R.Ÿt£‘´{°¨ÒÉÉä{Òh‘Fã,X¯A¦Àë¹Ä­þä±ÿSTà>n˜jtm!oœ(íP†i2Ésûæ‡ÝWpß™ZAg»(œ¶;ƒÅS“M‘Fï5vŸcOŽ×>rä”1/RЉW€íϽB¶lc³S½œ÷©Á?.;ƒƒSuÜ,*îQƒ°àzsLy¹º_~)dÉ”“#yÆâM( ¤\à}sK˜VLXäŒg÷]ißjM¸òŽð¡ ‚Þ„Tæyl‚ÝI<îÛÈ¡?0±\üÃþŠyN9Áú”Ð7œ÷4‘ƹ#róМñI ˆ2áAÏaOxŸpïz)ª…_ç|{ÓØ¡½À¤1Lv1ô¥H%dÊ…Y6œ4€r«¬ß–hºD.;¦)« Òe3éR‡Êýæ>ÅqQzãð¤Ú–9¢ù]OZ “ô÷©HÂò~uQŒíÀ¨¸Ð¬A)'RÖ—¼R|`Ò‡+CÜÄTèÖ;@u‘û$üª®È1Ʋ.Ø#×4Ó°XÐŒé'鸞ÿ¾ ?nŠy>pü«>8`fÛ¹hZXçþ>Øz|™ÇëZFWè‰iy“y:'æœ~4ái£»<«õÿõTqXZä”ÔcïÅþ4á¤ÁÕuO׊µ~Ëúù“§˜ï²i¯qÿÖ¤þÏÓÛ¦ Ãê1GöR±/í‰úÓ›G˜ä¬ÖÍøÑgü¨.»±£N±'Dß&šÚu˜¦¡}ÔŠ“ûï²@}ÃTo¢^œ|«Ÿ]ãšN/ùë¹QaRÅL„Ü I”rnAŸ®?9´{ñÿ,ÿ&ÇÓ5ÖO½BÑÎOBj_¡JÝÇ…eÀæœIQ÷øIéøJAû¦“ßÒ¤dãgÌê)m\‚š€¹1õ4õË("2sØÓ° 0¼2)Ïq@àƒ­àÇÔbšî¹ù@Ýõ¤§nÁ±ýiVi#VXå•PõQÈ4Ã+1ï0ãæþt×9ê#÷ù@þX§°ƒí3BÙYÝ 9Èâ¬E©]*ì[GQ¹TÿJ€K"œ£ ü)Ï#ºâO-»ç©JÝ@‘ï.e]’ˆÏ÷@Í@‘ÎÏj— ½;¤äWù#Þ“»ÔiX˜ g'ô€Èã­ —`QŸV¸xÀäPN•+=Âäm¼œž? ÒÈ7ì@«Ç,ÏÊfÏü).U¢Âï‰óýÓœS³È7JÍ‘·Ž ŠyÈéœuéÖ03 Áùsš,‰”°ÝÍ2y ¨¸úqNàýGr(9dP>â†AÌTà\óR4ìWib~´¥[o£ƒ´–'ÜS¿`Ò·–pçr+…ñ) ª)óÌv÷5Üã*ß{8çŠá|KíAŒÿ«~¦ºpß0Ä|%='R›FÖluKu§²¸Žâ5¥‘ƒpAÆG¨«V¹6•oqn-m. ™Ò_.ê2ê“ a€ãknC¸îVãx_I·Öµè¬ï.~Ïj"šâi9á"‰åa¬FB­Œçkc¤¿ðç…,4»enu+Û0öË6îP9“í*ËçK · ¼EŒîLóDâ1ïËò;—Í’O¸öãÌÛ’îÍ·s1f5Ï×y'‡<)Ô®VçR¸³‡LP­ÜàŸ´¬ éaŒÈ°ýàPîd+Ìz†4{Ë0ÂÏUy.t«ÝZ)c¹M–‘ÂgTIG”wå¡P\ÌG =èšfƒ Ù|FÓô¦Óõ+”±×bÓo$™ÑíîXÈÊ/÷`²åû—pÜ»rpô{ ­jëm…õµ¤ÚUåÅžHå9Ž âÍW]ÑȹUR§Á“^¶^ ­±Ò¬ZÆ4¶™˜%Ô¡J‰e"@å€'0UËaFæÝrÓCÓgðøÖ^êE‚ y’ê?1DŸjÎ!1Œ$°Nâ!¹#î Ðñ…ô= Þæ=7S’êóO½û ØWVl>X“ ,G1œ ys“†ÂÀòx”Ë{ í¤é¦+k"ÎÕ–GŠ×ç2nPÎKìí‰ ©ÜA` yçšêâ[‹‰dšy\¼’Hř؜’Iä’yÍuði­åù»ßhêQ`•PX.n«rVÛ`?Â_q §CQðV›¥ÞÏ¢Ë=Üú‡ÙïWT‰VÕîcE´–-öVù„ƒ`àíù€ ߺn,àŽ[ûÛ…»ÔÚK1 Ë!Šhæ„®Î$¸ù| ˜Ê*—$eÿÂm9º²•ôm)’Æ%ŠÒ$Iaò6K$ˆÊñȲVÝó`3npºÈ<¢½¦¯¦4vé§kf¹Õn2Î-íîä”E¶,ÄÊRGïJîC†Úqúׇ mfÊ×ÃïSKÛ:¢ŠY[!X#4Q™@òÉ,Êó´’ÏÏ3\ÜK;ˆÃÈåØG¢‚NxU(öÚ» kÇÆãÄÞ‘¦ZZYÞ^Íq4l$-v®%LK™i1Í*Ÿ,§úÂG!JòpØ^\YÜÞCi<–¶»~Ñ2FJE¸áw0árxë[ðïÛï­ÛVŠú×L¸´¼¸Žê8sæyÈçfì+á™\äX›ÆÓÏcqfú6”!—OtaTòa4ãnÙX9S¹·°nÉ.[.Û\šßF“Lk[Iãß#Á$Ñ–kv‘Ud(3´–TA– ·h+µ¹®’xm´ûNdÕcµ:Rêvð¥Äné‹Ï²´LÆ0qä8f~ì˜äO xvO%῞ûÛK›ëKbÒJéo*„eH ¾|–̆HÂä’˜_˜\ÀšJ­¥¦tëy­ù¸‚V¼r|ØÆ%e6°× [ø”Úki¨Ûé:lQ%¼¶ÂÉVAŽDtpÍ¿ÌbDó$p7.<1¡,ö‹ ÕL1JbÔ$ÚY¢eFwYcòÃÛ2„$àN»|¬æVçüI§ÙéúŒcOý’h„±4² U×$nI®õ;{¢2¶äe „|@ÿØñØM§ØÜIO½ÜÈÍ$332¨Ýåž^B°/A ´Ôü@ú–Óìm#YLòdaæJ@¶³8åc§ ‘„M½ö6 èPìž-Nmîó͈"Æ<‰nŸ.0ZFu‹gUØN_îŽ. ÜD×É$Á‘#pŒËž@bðqèh:+¸Ôô=ÇQñuÖ£öé£Ó5±e6†(|Ðæã9!6Ç(•à¨PeåõÝ3ûÄ:ž“çyßa»–ÛÍÛ·~Ç+»8Î3ŒšÏ¢»øoGÒÿ¶†“%ñþÈÕFŸ#]²?œA@Ù·È+’[~Ca>íX×4×Ä>/¿¼µ¬lu¶²†ÎÆT·Ûæ<åHbލ„¡ˆr6à€pôWyâ MÒü4t¸4û»½ZÓXÔ­MìN :À ,팶À™!wü§{dƒËøM‡VÕ¾Å3H ÛÜV27I2Âí ƒ’Ò\NìH  º+¸Ã6f°º|Óý¦é´Kû‡x$ãYc[ƒÈsÅn§†ÄªêÃåªöþÑçÑôÑæ_ißiWz†íÈ!‡ÈkƒŒcsïX6ã+°üÙ|íP>ŠõøD4tÒõ»²¾Ùz©‚}BIý«ìÖ×’ÈŸ,y[¼¥È&M»ÛFìøBìõM/tg..bŽæÞÊâa#¬{®£u%Pf’ÞBFéÑI€pôV†»kgcâNÏN¸ûEŒrÅo6ðþdjä+n€G» bÃD¿×4½ÆÂ{+;M+ûFoÞDòL ’Ý2ù‚%mÇ »œ¸²ªª6PŸÑ]Ä>ðÛi÷:œÉªÇjt¥ÔíáKˆÝÓŸeh™Œ`6ãÈpÌýÙ1Ï9…®%kxäŽ䯒8vUϰŽøôê—„õƒn2»Í—ÎÕã袊(¢Š(¢Š(¢Š(¢Š(¯£?g}¿ð‹ê!†A¼pFÜç䎾s¯£gbG…õ öÇÀ'ÁzÝ¥¥Œƒ¼qDã€ÉÓÓ×ó'ÅÃÿW[ëÖý}¢ëW–±séæ1—;OLcóŸÅÓÿW[úÃÿ¢c¨žÅGsœ•nf¸-å;÷p)ÂÚèÿ˼Ÿ®›FŠ9Ö1*9_)äm¬;P¶3ƒééVÖ[ÿ.—?ø¿üEr¥uïu=š•©6יȋK¢ãÚ_È!±¹'›yOñ®ÈIbÀÿ¢]àBÿñÏôÿ.·_ø¿üED]œ‰µ¸ío)ü¿Æš-®ÏüºÉúWb üúÜÿàBÿñfÖÆ×P“ÉŠ9ár×iC r_Z=ÔT#)ÉEu8o±]ãþ=düqþ4Ÿc»òë'é^×sð¯ì! ׈-aß¾dXÎ:õz²>Ü2ƒý³;bÛ?û=>I/õ÷•ËOþ~/º_äxoÙnqŬŸ¥ iyÿ>Ò~•íãá†v„k±yСРn@=7ûàï-´û Éíf¹¾i!•£c¤eIRG˜Þ”{9/õ÷…¡ÿ?Ý/ò8ÿ³Ý*œÛIõÀÿƒåîNGc]kÍ`ÊE¼— ƶȋŒú‰Xþ•…«¢,¨ê 56Ñ« ÆÉI4ÓíÕ#?å&¥ >¦ =ÇãJ¨,rÝ}(ÛòçšjíAÁÇ­?x9©â1€iø”ãfqìiwnéOVuàŠaa«¥ŽIϹ§˜5)izllþ4›¥^I`ZWC¶—[7yRÎ7`ã4«6óõ¦+ȈƤW“î‡â†ÐÒc¾Ç9¬dƒß"®[h•Æ B=2â©”»Û™©#¸¸;‰WýÖ"’”z…¥Ü»>¨@¥¥U Ÿš«Åe&2úâwP$¸™£1#ùÓã™Éæe÷<â“”z )[VXHÞ0Uñô¥r21òûsH¥sÄÿS·¥[Qn¨7]JIîƒÌÒæ}Ñ[9ËÍ!ã“LÚªü–ãß­:VI{›¼ÿºòÍLÑi8ýÜ’êÙâŸ+zÝüŒÄ—#üsŠVÝЧ#ýª½äÛ†#ýÞ”IX;7“î çSf%Î~ïëšnp;Õ¢©éQ=F*n; TfÀǹ©B™ÂŒöÆMD Óó©dgý*.U‡˜Â®p¿N”ŠÈ„–TqèsQî/Óqúæ•‘ÆsëO¨‰Ô¸l?»“RùÖá²ÖŠG§˜Ø¨À”úªh~ÌúGœOû«‹#ya—”¶ £“üê=Öø;Óœñóãô«¦M/1Ü µL#Koùø‘¦Ö» ^…PöyÁŠB=œ…0ù,ÿ*•_By«ž^˜:ý§ÿ E¦ŽC\}BÔ¸ù¡¯B‘ŠØœ¨#êiõ_çWÚßNl~þQõOþ½ e§1âéñÿ\ÿúô¹%ÝüŠÉk 3í÷Îj'µˆ¶œv9"´ÿ³,HÀ¼ÇÕH¦eZò~ÝâøÕ{9y ›Ô¨šzó‹È¿àLGô©œpOÛ-ý³'ÿZ¦:\C•¾·ü[«¥HF#šÿÓöoùC™w 2)âX޾`¦Imƒæ]X‹{x?嬟5µ;ÀN%oΛ%•Ú½JB†Yݱ%bcï¶šçó ¢9u ™>þr®—WÇèE[ûèëþ£0ܯ߈î(|ýA8•L¬í¹—-M[¢…ÛŠšEn…zzõ¨Z1Ÿáúâ ¤;ÌÙb}E8’1³§­7ËTÁÝÓ¶)ŽÎr@  IÜ9ÇÔÒhú†Cô5å8%[6ä ¢%O¸4Ð1¦#’@ÇÐÓB ·˜sô¦‰cYrb‹oû@äi¬°ÊÅÖD\vVoëUajmÔ¨R#çä@àb²è  êÚ•¶¨uH5 ¸µìæí&e”³gqÞrrrsÎMF·÷‰åí»|¨žñ!#}Ûz)Þùæõ5^ŠÜÔüS{ªhÖº\‘Ç$JÌ%–F—ÊVXóæ; $“ WçŠ*À¿¼[ÈoÜâêžTÂC¾=€ÚÝFЪ:`c¥W¢€5ĺó=ë¶·©¿@—ŒnŸ7 ¨s󀤌ðqYtQ@­©-ÃÜ.¡v'{…ºy͹¦RJÈNr\b¨Ü}jOíÝcûcû_ûVûûOþ~ÐþwÝÛ÷ó»îñ×§ŸEl\x£X¸Ðm4?·O™m‹ì±J빕¥Üé¬ÛŸ®:*úf±è¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ú+öz—Èð®¡#¤¥>Üã)7;#ã_:×Ò¿³ÐÿŠûŒÿÄÒOýz•´ñ‹¹fX$O1·110$à ž=«æ_‹ $ø¥­6ɇ¨Çü±JúZöð[mŠ8Ä—2²=ØYeÏõ¯™~(—â>§'˜²nKsæ ·î#ä{‰ìT74tn6ŒË´¿ú)ª0Þ‚¬é  Œ“ÿÒÿ覨²€p+”é@ ‘œRSF_£×ºóØ×£ëºÌz.œ&(f¸•„VÖê~iå?uõ=€'µy·¼«Ûèpx’Òõäñ¤¦òñá8pzF=Wws]çœz>ƒ¤Ë§ÛÉ=ì«>§tÂK©”`ì«èŠ8êz“_<øšKq®jlÒ¿ö©~AÛ÷Ï|ú{WºøÅöþ1ðôw©µ.£ýÝÔ ýÇÇQþÉê=|ûâù5Oúû—ÿC4Ÿk6û¢¸ÀÇõÝf5>QôËøû?Oê*MaIX¹Ç&¹+ü#ºÀ«ü‘•±ð“B°\”P=#+Ë`TeŒç?`„—bO¸Ï@qô¦)=8?ZxšeVP>SÔôkÐwC7À»Î mÇ%phÀsÅÔPÌ{ñAg\á©Ë îùëSŒ°ÚpôëJèz•¼ÉCsíN/!8«+/,Üý)‡nx9ü)ó åcdsÍL‘4ŸpóéšÔÓµ¸|'©ÿV§þÿüM ð~ NÁqh=·¸ÿÙj­ä^f0‚1"©bw ƒž‡ÞœQÝ$~9­øB¯³ÍÅž}C¿ÿNÿ„.ðËÍŸàÏÿÄÒiödaº“=*6^Et?ð†^´Úcýçÿâißð†Ýãh³ÿ¾Ÿÿ‰¨³+™ÓtÀ9¦ ç°8ô®x*ó<\ZßoÿÄÓ—ÁwÌãêÌ÷Ÿÿ‰£•‰Éâçµ5½×’ùktzÿJÙÿ„Rû9÷Óÿñ5*xgSŒånmí?ÿBRAÌŠ‰y)‹lz<_7ñÙæi µ¾2DŸG\ ÕþÂÖ6×öžØ•øÿÇjxôex]FÛñvÿâkM÷¿àG¥ŒõÒµ96ê™ÿ¦ƒ(Ðïˆù„Cƒÿõ«HišçmFß=þvÿâiçMÖzÿh[çýöÿâ)¨Ã³&﹚º%æ>i!ð"¥4è;³æÆ~„Ö§öv²:jÿ÷Ñÿâ)F¬÷»¶?ð&ÿâiÚŸf—s7û ãçO΃¡Üÿ³Ûp­Oìídøù·üÿøšci»šxÖY?øšN0è˜Ó}ÌÏìkµþÿ}ŠwöMæÜlN}H«Ø‹´¶¹ÿ®ŽöZSáûüÇű?ï?ÿSÊ»~#¿™@è·G¶×ï S¤ÌFß:ô’­·‡µÇÚ-®]ÿøšQáÛÜs5®ßþ&—*íø…üÊñèÓ`ÿ¥Cô LkF·ùMÅ¿=ÁÿëUôðíßñIn~ŒÿüM8xfèƒóA»ÝŸÿ‰§Êú ºîf¤“›‹uç¿ÿª¬2 ßBµYO _ƒÉµÛì_?ú #x[R$”û>?Þþ"…mcq9G¹Té–¤óÿ?ZaÓ¬ÔŸôèÏÑjêøST~ÌÜwgÿâi…5@z[ßOÿÄÒqÈ>hÿ1I­-ØuÀèM3ì6¤ó}ÿ€¼ÞÔØu·üÿøšˆøKU'‰`‹ÿñ4¹_ò‡4{Ktà^'Ók…C,¼¤èçèGô­ð~«×}¶Þþ&•|ª“‘,þØÿÐi8K¤GÏæO•‘¼jŽ@ÉÁÞ? Ü> Õ³þ¶ß?ï7ÿKÿ~¬ß¶?ð6ÿâj}”û´s+7R~•'–Tg‚+oþ-Tw¶ÏûÍÿÄÒ jÃï5¹ï?ÿKÙTì?iæß“Φi È`Öáð®§ÎM¿æÿüMGÿ®¤82[ÿßOÿÄÒösì>x÷2Žƒ– ú‚E+]Üq‰_hÿlÖÒø?VuÈ{R=Ù‡þËNÿ„;WÇkø;ñ5JNˆ^Ò=ÌE¹¸$1‘˜z&œ5 ¤J¾aí!ÜË:µâô‘¿H5›ÃÁrÞæ´›Â:˜ã6¿÷Óÿñ5ðž¨wÚÿßOÿÄÑjÞbçž÷ó;‡eŒ·©QPKpœªdú+Uü5¨ –£þÿüM0xjðËKCõwÿâjyf÷)J&P“üXôÝškàÿ õ¸šÐiûÔ;ý–˜Þ¼=&³¶]øÿÇiòH9‘„c''ìr*AL›DMž¹QZÇ×Äü×6ƒ×¿øš†nÉ8º²_}ÏÿÄÒösda R䮿®6üª¼©å¶>µÓ§…î”ßi¯îÅþËM›Ã7lÇlšz·¢»ÿ ÕrJÛ:¾ç1$à©õ© ýÕ#>‡­t1x^èæ5›ÛÃý’¬¿…ä)…ŽÔ_¶1ÿÙ)û)1ó£;ÉÆ:v§"±î×5Ñ¿„ïTd5ªúêçÿe¡<3wüW6߃·ÿKÙÉtuÜÁÝ…Ã(oÃ&æìM¸õ5Ð/†¯3ÍŦ}w7ÿCxZøg3YÛoþ&§’]…ÌŒ4u+ù”ÖØÜ…ÏַdžïS:×þûoþ&£ ^¿>u¦}w·ÿG$»29òcÎ2ÇCêF+tøf÷¼¶|´ÿüM0ø^íÉÌ–`¼ÿüMRƒêƒ™ƒÑ¿*|lèß#sì jÿÂ)z"k_ûíÿøšž?ê¨~K‹^BÌGþƒMA‡:2d½¹)‚ÄãÚ¢Òƒqµ»ýªž­d~¬ÿüM5¼?©¹û õ ÿüMW,…ÌŒ0Çqÿ<æ+Ö¤ð5ÑYlÁÿyÿøšoü —xËIiŸ÷Ÿÿ‰¥íeØ~Íw<ŸìwóÌþb±\ùd1^°| rGY~.ßüM5¼ s·™lìw¿ÿGµ—`ök¹å`¹Î<¯ÔQö œãÊýEz’øä~Õd}·>?ô’/‡wlã7V?ƒ?ÿOÚ¾Âök¹å_Ù×óÄþb¦Ý‘‘ ?ˆ¯[?/¾÷Úìvÿ¼üã´£áö ‹¹/-?ï§ÍiûIvEÜò?ìÛÏùà1Mû Ïüò?˜¯[“Àz‚¯ÏsdÀÿ¶ßüM4ø.ô‹›ûé¿øšN«]SO©äßa¹'QüÅa¹òÈþb½eüy‘º[}ÿøš‚®‚`Od <ïÿÄÒöϰý’îy)³¸c?˜¤û$ÿóÌþb½FãÁ—1(2Ñ²è˜ ÝY‚áõ"ƒà{¾¾}ž?Þþ&—¶}‡ì—sËþÉ?üó?˜¤û,ÿóÌþuêÀ÷CγÇ™ÿøšOøBn@ù¦´Ç³¿ÿG¶}ƒÙ.ç˜}–ùæ:O³MýÃù×§Ÿ]`•šÏ¹þ&˜|vNDÖ_÷Óÿñ4ý«ì/d»žiöY¿ç™üé>Í7÷ zað=Ñëì³þóÿñ xqûû/ûéÿøš~Õöf»žiöY¿¹úŠ>Ë7÷æ+Ò/ü¼YgýçÿâiG/9ÍÅŸýôÿüMÕöd»žgöi¿¹úŠ>Í7÷ç^•ÿÛ ‹Oûéÿøšað ðësgíó?ÿGµ}ƒÙ£Î>Ï/÷ 'Ùåþá¯Hÿ„ ô.,Ïü ÿøšCàkÌö‹,ÿ¼ÿüEÕö³]Ï9û<¿Ü?g—û†½xì ìOü ÿøŠ_øB.Ç}ŸýôÿüEÑöf»žoöy¸:O³ËýÃ^–| rG^ùgÿâ*–¥áit»ežimÞ6qîË ÷QèhöŒ=šîp>D¿Ü4žLŸÝ®¨YÄäŽ;O°ÀN2 zÒöÃö'/äKŸ¹úÑäKýÚéþÅ8 ô¦$\ûu£Û±g9öi¹úŠ>Í1þù×N-¡-éÇÍÅ;ì™öçO^¼Qí…ìŽ_ì³÷?QGÙfþçê+°].ÁYktç}ÅJ¶¦D28cÃËü*½ {3Š6“ޱŸÌQöIÏü³?˜®É´Ôóp>ç÷™M7û2"\+«;ŽÒhÌãþË63åšO³ËýÃ]dš|j£!O?òͳúŽ]-Q†×ÎáÅÐ=™Ëyÿr"OîšèÐ&áœã¯Ñn¸ÏØÑíEìÌ"OîÑäIýÚݨ'§øR=¨ö¡ìÌ?&OîÑäÉýÚÜòW<ŠC”{@ä0ü™?»^Ûð‡Ç~ðŸƒ/¬u[õ·¾{çš8Þ)X1Æ%±ÊŸ~+Ë<ŽÇ†%Ï sG´Cèø•à¶ó<Í~9·¨i7ZÜ/žý•¿vvÆ?º3žýóä>;Ömu¯j…ȹ¶™a 2ÆÑ†++¬29­s¾RÐS€QŠRÐÔlz6‹›•phù éØÿ®ÿýj§¤qÿ.Òÿ覨ÖFé\í›Úæ‰ÐHòÓ¿ïÿÿZštEÿ ¦›ŸúøÿëUÇÖ˜Þ•ÂÆšè¼ø˜é§þÞ?úÕ*é3,S.ìæ—ËùVþn ç·¥d…eê?:ÖÑ3ö¹9ÿ–/ü¨Ñè\$á%5ÓR36´Î’5üŒé¬uÊ烃¿ŠSu¯ÐNoü/ÿYÙç§Q‚M+Ë»/žóí~?æZµ:œ¡à¹òù‚_"î±ÃÕùæÓ'ÜÍá«9ŽL©«sÉ ·5†ù?áQÁÎ*£9.¤ÊTßü»_ù7ù›7±iÒÚÈ,|;gi?Þó¢¿2¨98]Ç< äõ…ù##Ô×A§¯ïŸùc/þ€Õ…­'îâÇ©â¦RæÕŠSM(¤’]¯ú·ØÅò†XŒP¨n(Qór Lu›`ÕS”vîǽ9p=ªE9+J–˱—ƒÖš`ÜsŒš›ð?…<»mçAJìv#ŽÜ/^}©í*¨ýisŸë“Š™K¸_”{Ñp±µ 9ɦˆÇçWÛ„5çB“)ÖxQHÑ¥ý%¿ô®ž :öæ!$ò:Ê2+œð§üåÏüü·þ€•§»siæÛÆÀÇíšõ0_¬ÉÂû+œxš®’ºîiϧ_Ú[Éq5¼ÉjYØŽ‚e ë—6Ë<š\Ë¿æA·½³T4«ÝCUÔ4òq2©7Mÿ=9ûÊ»áu¨¦³qr÷*Öo $pcî8's~<~UÑSË.[˜ÇÚ»8û«+‹„WP¼NFí¬0qI ¤·2ጻ· ÃÖ´|Er× bDKüÍbϨf†Ù홊õp9 ôw'Ú¹ʯ³FÒª£fZ[;hÎ$Õ­ ÷TGuSþò©ó¨ä·1âH¥Œð¯îSíì}K¢‘éìû-ãÚAŽ6sŽäzâ¨}FF0[´%Æ @'¶}o<Ù=L¡]¸ó=‰¸$€*;ͨ5œC§ß‘Ú¿OSHËbß+8Øß+JÆ?)îjxßhâÕÆ,5[J<Þ[jz”pOIÊ2å×}ôêj .°2ÿjKæîÀÀL\ Z¡ik}0œíŽxá?3ÇËþòöü f6±6ŸŠŠÓ-ªìÇR1ÛùÖ‡5¤Ô¼Kouú„²™Ÿ0OÌ;ŽÕîã(9`ÝzIE¥Íªèµé·âx4*ΗJo™^Ú?ó:„`§<¥kÚÙ¼ûwa$êG®=*Ͷ›ø¢Hs($e‚p庴õ Rʯ¹—œô5æ`«Rª£*š&޼eiÑvŒnº³ÔgKKù­gŒáŠ&ÕÏ^3YWÚ¹µŒ»¢«ÂnËÀWEa§ÙëZõøÕ^â4‰—÷qH¨äžæ´Í('òÝ-[N×áŠNÒymÏPxþµ ²­¼²C¹CFÅp¡ÅyX<$kß™ÚÇ£ˆ¯*v·RÊiºR±ß¨É+·‹ø¶*=RÊÞ­gµùS)ϘrC‚8ãõ¬ #Uo(ÊŽHç©õ®—åºðò’@0\•$ކ˜5¥|-5‡ö"yº¼²0în¡´@fm¡ŽxÏô­« +í6ñÜyÑyr.åäŸé\ç‰í•teRѺœ{gÖµüö¿ Â]‰n ޼Ÿ­yS\°RGjը߇G¶SûÆ ìÿ¯Uµã°•qkŠ@J9êq׊Ñ-±_q\©PT™÷ª÷1Áwk™ZLÂøÈ?(<Š)ÎW咵̑vŽB­²dôP$/cs}~l6§Ê–O_—9â¼óÄú¥þ…ãtúŵ¶QÒxúĤ`ûAãÐ¥Õ…÷ˆîu5Òn5(Þ©%ó¨2Éýç°Åz°•j«Å\橈„4z®i­s´VÕ-f‹ýe‰Øñ?û^` úþ%°@žy>f9üqÆ~œVóë_Øö¶EmÅ7$Š 2rÙG ô©4mb÷QÖu$¿º\ŒUWjÇÆ6ÛŒ~u¦#Z/k5eø‘GN¥NH»³¡6’¬Bg(ÈÈyX #êØ¬­KÄ~Ò1öýrÕN3¶ÓüpúÖO|9.³¨ésÇs$;í„l#à’ŒÃ¯Ð­qz߀žmíÞîâçR»;`‡ï§ÑG­y®¥Ë–OS·ÙÔqæHëÛâo†”?Ù-õKÙ¢4ˆ9öÉ'…vSÜ”uhx†DYrŒí`φ¼7Ãþ¼¶¹º’Òî$ºp‰d).Ó†^{ƒŠõý*æçRðžŸqu‚éíd d<žÛJÕ9Á·tg5)#Gíòª,¡G'#¥%æ®4û;{ÛÙ– Ø(¹Û¹ëŒâ¸ êºìÚ»½Ååý½ž;‡‚â\q´žõsNðã6™yzZ¥ô×âšê]ëg²ôÞG°º)Bó½ŽW^7²µÍÿøKVK»›;h®oÈÁ‚îÇcBÞÌXÐÖÇÛfÇßLãÒ©&›©kY]ùöö±ÛEå¤(›”žîÙêiÚÃG`Ö×Å¥º·šH¥vQÉ yü±\ÐÄÒªÚ§-Ôd¢¤ÖŒ£ªøÀi3õrþ(ÔÓþÉ. ƒËFŒŽ’éÜצÚAkxÒ‹R’[ùi$ €÷«ºTÔcõ[ëù%þG$ªÍ·Ëcšÿ„îÅLŠAÁÈ^?ñêèÖòm ‡c‘‘Y>0Ñ­ít±p‘°q0V'Áö©.õ"þ yí·%À· ¸Ôc?Ö¢½(FÎ Ú•IKâEõÔ¥g*ã$LÔSj²Ç0.nqXú~‰syo”ÔnšE¶qµ°z±ü*K_ ê¦tµºšÎÞæVÚ‘Or»Ïü×=¥}MaèÅ?i3Xj§|qy„´™ÛÏ\T¦êcŸÞ0üjk¯]é:jê\Âÿbe”Ç“•èÝÙ$þ“â=Y-­¡ŠÖ0$°[n0£®?JÒ'Rj Ù³R•$åt‹¢ò\í9#®qIöç'kßU‡áã}l·WÌò«’<áGáX÷šÝ²ë³ivì‘’£aÁ$w„žþÔl8é4}¹üˆü+J³í«ÁnäÖioy¦ÙgD`L.Iùÿ“^ÒÂaUGA9JKw²GõÜ\©ªöŒböN÷q¤šœ“ ede?ìÕ[«ô‰ Îðă«0 *„:¼Px†g²·òl®Xâ9Ø}}ºtúW ãMÄ7Üø¹;½.+‡mß,±ù Ùéy¯;ƒtjr7£W^Œôpص^Ÿ:[;?Tz¶£cwŸ³ÝÃ1£åS³rrü+ÇôÏÉÿ£øš B8æfÅ FT³¹Àœ˜uô­];ÇsÙµ¿¸ImüÃ]°PÞ€ñõö®yPkc¥T]OH$y«âÚÚ+X&¼Õl,üðLk;í,Á?r:Š-/"+ éq*«Hëj ž}öŽ‚¯x¦Kxn´ .aóárîAü_¼>ã©Ó»÷NzhníчüÌšGýÿG¢“ŸøI4lÿ×À¯3¿Ž$råYdi6÷ÂŽÀdÖP_j[P:tâ››µ­øþ¢Ià;&?%ÜãÓpVþ‚¹oOM/Uk”˱Ëmی玾Õè:GŠ4mrâK}:õ&–5ÜÊz× ây7ø»Q ð¢5ëè€ÿZ¹¨r^&iÏ’¢iöfN9 ‘èj¾µÈíãûÑù£wà:ŸÂµ´ÙáK³ò4Q\FÑ<ªFèü èAÇ5çóêZ.‡­ 4¦k™"Œ>þxf'¡üºÔF Ù¢Ô©¨¾kß§üÅï,a‘ ¶µ¼ºœ ~¹5¥¤øŽßUýØW‚p2béYš.‹º}ORÓ “ÌÅ¢Fx~5SÅ÷}­¼Z•Ì+z¤c¹“ðç…7{#5'kž¥XI©<Án£„D ’àâ¶?á»bÛíÎxåÿJÇð-ßÛìšâXÔy±.ô##¯¥w7Ñ^B%xU8;Ô©éŸäkHSM]‘)´ô0ǃ.@æòØÿÀšþ‘Y®lÁc…`I§_x£ÏI­ã‰’&ùDŠølLÖ†™xo,£v·XÒ6 Í»8ïÏ5~Î$óÈãY%Wh¾ÎíÎ>Ry«öº£tû4‘/f•±úkG×Ð[I{¿&8fòp@ý*ÿö™gya™ó´,œ.>ƒ’kÊ­‰”$⑲9{û¬.šÝÙØŒ|Á>Sô5M–Dn§>ãÞÇ{40 ‹¤fVl©÷G®:ÒKq¦ßZ]–!f9ŒdpyéQ jÚH¾Iró%¡ç„˼©û£§3LBô÷ã¥F ó[ 7b³ïPÇ5­ì÷ÓEg,Qàyƒ°±5êÂÒQF3—*¹´Ñ%µ‹ßê3¥’yÒKŸDQËÉ]jÛRÕã³Ób‘í£減†qŽ0£îŒú’~•Îk~"ŸZ¹–]C)n²£Û Ø@œ;Âcjòº²Ç4î'8ç­uË©Óm«³š5¥9¥²;•·]†AmH*uµCE!ÀÈùO5_T»½‡Ã6+is5º½ÌÂEÈ 6¦3ëPÚ^xƒX€ÇåÕ¼ñeÅÂJàH½Áäôê1\±‚jæò™|Ûìž\ÇhÉ!xSHʨŠÌι鸞ŸÖµô}:þ[æê·w äî™äoœwÏ#ëSx˜¬lCÌĉ$ Xnì¼})Ê6WÊìÇ’À­ªJ÷–ÐG(ÜŸh™W#8È\ç¨=©¶ú4®ÝGÏÜÛBÚÛ¼‡ó qïZw:e°¶µ]JFÀ­º@Éî=ºšÆÒ|U©¤JöЭŠ1¹ q—=r}ëJxiNIOÝOkõ&UmË­C Ù«$0½ÍÄŽ®<ÔÙ²)’°O\z×4ÈÁˆ5b/Üèúýª[X<ÖÒ$ûÎÏ݃Ã(õÏLõæ™su ×·ÝŒ9*`àòåF.„hÊÐwC¡UÍk£)ݦØSþ»ÁÓþº¥M´ >©¨îÝü¥p?å¼?ë²T¤=ÆkŒè,éÚeÎ¥1Ž6¯,í¨­vðå¢&d¼‘¿ÛXŽÏϧ “G‰oý⼨½]yüð¥i¼Ûâ˜ù² $;X” *z(®ˆÓIJnç¨éï§\yNC« «/B*žÝëWÄ÷K6¥ ¬8ÌZ@vgWëŸÆ³m­®®ä1[Æò0]Ä/¥e8ÚVF‘wWd&!Ô)<³ÙëKûVÎ>Å/\t¥þÅÔÃ`ÙIŸ|R³×s7i–$Öž§[ßI(¹™Ð my¥]Tùs—5¿á&µºÔ­æ’Uw)ŽsÒª Þ\È™=4dØBMÅÇpsÿ²Ó—@Ñ[ï]ÝŒÿÓ3ÿÄ×i -p²¾çS ä2㠻€v’t¨Óê¿øÓèÏ=ЉÞÞÿ\Ïÿ\uÏ•·9ŠĹþè=kÜ]×o‘Î}ëÃ5ŧº O8ïPq¸n¬ê(]r«-nËzE¢ëÆ[+=F|å¬iô ì2 ©uwka4°Þéš­³Äq!"7 úŒþuÖZxûI·²†íÚ%‰B,"0Ç\ROãÍïí0ý¨F…C4b,³úƒÇ4ù¹ÙÄÇwgu)—&AØd*Ø÷úf²‚‘·?SIؤ™È8§Ç79Q°ã™#r£ƒ¶•Æ9b ¼þTáÇAŸ­"ÅêM8GÇ^ž¦¥Œnö'µ‡p ºI5žF)îaá|dKÿ_-ÿ ¥P¿¸h/'d‰¥`ßqN üëKÂÊ¿Ù×Ãè)Ks¡y÷RN³²î9Ưg*ÄÓÃÍÊn×Vü?NU—s µ¤†F¼‚ëP±ºHY—px#¨®ïFñD·VŸYê· y×Gå¦OV,zþ¹ãáù6OµH?(«ºú¼Z<6×bx3P§þUÙ[FRæ‹üxPšÑ£sT=î{ycŸÄÖ4Ö±]éÑ41y« (é»Y€äýÊ®9ÎùÙY±…ÇJDÔ4Ûÿí-'ËymžÖ_õs/§Ö¸iâ”1¢ØÖµ:Ï-­/e7o]ŒÝWX²Ò šÔé1RªáW=#‚+Gá7‡nÅüú…ì;^hvÁŒ0;Ï·Ó-¼HîB\C>¤C]E†³2Ûºi°²M0Ú÷r/¢ƒÔþ”±xÜe\;ÃF-¹nÛ¾Ÿ§âgWB„ýªkM’ýuÔê4ëøÇŒ.€|£(¶ó;3ŽOþ=‘]%Õº$Eîåò£ëP^Xiw×jozÐ\ˆ•$Hа,23ÐF+ÊÀÕŒ$ùÞŒôñäâ­º8Xî¯tMR&¹;íß$s×ñÍzg‡¦ûe†¥jKF“/àpCYñÙè9eµåâæ8@}O§k©[Ù£­†™kn] lû™›zçךÞxЧ*Qm¦gU%%6µDîŠòø~ôo„,Àc¸®káæ§åÙ^Â~er¹êõ«¬–{‰­ž<±VR¤õ®Áú¡a5Ì’±Ê»Byrs…Çë^\ãÏI¨-Nè¾Y'&z Õ‰$‡s¸ ‚Î:dÓì§ŽužÞYÌI*p¼À‚ó¬ÄÓ3Ÿª*Õò«i­,e¶ÄŠÛŽdÜO¶ŠÂ ¼ÊR.U!k#‚ø¥i"5˜‰L¥Ž0IÁãùÖ¦x–)¿G‘|µoš¹8ô§ã+3gki~û"”¬˜áYHÏçŠç쵦Àöw×þ™À@üÛõy\èÓ¡)N§+ÚÞG˜F¬ê¨Æ[ßS²›NÕ5=æâ¡²1¡`ŸyñŽç ¯2ð\—ñx²ây¼É­äq“±þ&ß ®¶k¿j6YÁ¦T™v´“\a€ú(5‰á FÚ(-®5b³Žq;GÌÀç–>⣊ÃÖ¦á{¾†ØZ©´íc¢ñøÓtk+¢ŒLwm8Þ™ú¦iwbk›½PCåLá#Þy|z{z Õ»ÓôíBÂK+ÂòÄÒ$£de'àñ‚Es×alu)­­URdp\ñõcÏJùÅ‚¥RºDšµ¿¤{2ÄJ49Žå»Ý*Þâù,M£F!œIöˆØ)-¼õέÓÿ²ìåŽ)ešÞIÃ1Ú~ïáÆ8ö¬½n -V‰®ãbNJ-ÊÄs؆<§Z·c4Mm³\FÎYAÛ&ìr8Ï~œšíXjâù"‘ÊëÕ–’“hʳŸìrê06Ý3£ßÏ5ÒÅc/Ù¢tÎJ†üù®OÄkŽ«&&P³"0Éä‘z~Ôi¾6´ƒL¶Ž-þîå# çËØ„Ž8-UšJ¬ðT®›æ_‘Ï…ŠŽ&¯<]­ú‘]_mÞK’V8Î0:Ö}ÄrêW#3Gt‹:“ê>VþB¤¿¼ÔõyäuÒ--£—ï-Äå¿Eý7N’¤–úâܬhR8`„¨\ã¾yéR–a”R´úíoêæ°ERÿdľð]íì×Oq2¼®XŽ*¼þ ]2Ø\ÃyunÊ Û¸ìkºi,×™#Ú¯kz¾¯¦´ñ\ƒ Ê3Èàœ{UМžòØ*Å-‘çÉáË{˜Ã.©u2g?3îúV¼zp‡H{0ÅÔ£.[ß?ãI¥ÛÚÛ^Lª @ª2ôfÏo_­lî´+÷dÅsÖrrår¹´µÒ;¯ ]}·ÂÚ]ÁûÍl¾ `þ¢¼ÓS™|?â^úËSÓ¥Õ?´‘×OkMÓÈhÚóÓ$â¬é>>M LþÉ[i&š dUÚ»¾RįëUî¼[ªj7"xôŒHY¡ úÖüË«1åg¦ê—ÖKa$²" ã(ñ“Î`Œ~5ãÚ•”—št~K+ÏnÇi鸎ý*çÛòóéó;ŸxÂÔoÓ4açÎãkȽ1íþ5Î[Û}›N–ÞxËHÑ™K£à†,é‘ùUëM7M²l>fã÷˜¨$ŸsUï¼Åb"¶7 "lcæùeFAãƒè+’¦!JÐŽ‘üýNˆPq¼å¬¿­ŒNáô»(>Ån×2™˜Èò>Nà2rG=.—ã¢4Ô£´µµxKDcf$ãž)ÒÚÝ}’âeG²HbêN1¸žäóÍp÷’_iæÞÒåâ¶•QÂü¥ðŒy++BOB¤¤¬ÎŠ?ÝÍ5ãy),͵m `íuÎ+{Q†I´[i¦N¬ ª½ æEqún“w¨X5íÐ>-€bàüƽÍ„ºdk©D­3¦%XÎkJ5cB¬j.ŒŠ´]z2¦ú¢–‰$"ÑíæM®X•bØÜ§¸«M½‘ófrç #üsUšÚKfaçˆöàŸÄ¿Zaóœa"*O„ýkÔ© ¥*¬£j×SʧVµÆJSމ­WÞfÛÆój ÅH&RçÛ¿øW[á=nÂÞÞûBÔ™DšI‘$MŒ[#׈#é\õ¼rÛ\¨19ÆàF3Ô¦kJÿLÒuXÕnmä‡)">±¬s:°•XJN6²±Ñ•SœiMT‹RæmßôQÑ|.ðßC …¼±8…G\ñ…Ï÷â¹­GÃ~‰¿²ôÝ-/5’_Ï*‘3–oæJºþ³Ç:¦¢ËýÃ'QîG5`hÚzA+i•Üœt5溊>g¥O©¤xn; i.4³&8FdäÍYñÓùó“Ÿûk[€žx%ì>Õ-ì×V³Ôž{XÚ0Ð6ÕÁbݘgµ*S»÷™sŽšO5gO^´ÞðS¡Û§ë;±Æe8Ïý÷QŸ x¿MÖsß÷§ÿ‹­ùãÜË–]Œ¿†à kÿÐB/ýkßô¯ùÙ×¼ú¯"µ‡ÃÚV—5†‰g}Ÿ:Í!¸;‘ԱõÚ'‹t³¢G`Ò^Ã'ÙÖ#$QüÊvàjy£Í¹\¯”ç¼w¤Ïâ›ËWB·Sq¢£(¹RCM't\uØ9ϯÑü5ñ=Ÿˆ|/ pÆ]ZÄ­ýï¡ëõÍ?Oñ^¦XCek ÒAíQå~§žIëšç´ôð¶•â¹µý>MRÞYóæÛ¤cÊ|õãëÍW<{“Êû_ͧòzIÿ²×ž´ßff7|Ê?0ã u÷®ÃÄúíž²ö¦ØL< û¼ÄÛ×þF¸fKHƒ ·) É·;7aÈãük(Ë÷Œ·Èb½û³<¥ÐÅ|ä©ÚØÐ÷ëÖ¬,2¥° ‚FûO’d Þg+¹1»hÃÃ'Ò«®»g [Z\ß´sdб+×…b«²ÜÝãìúØ=ÆXþlElÚêÈŠ}Bð³›_N©rŸËŸé]{ ö©´q“ˆmÔŸ)3Ô~UèqüEðû­{È?륣ÿ@k$¡$âöfЫRHÔ¦í$døoÃÚGí5u=bíVþà,näüªOð¨þgÚ°õYãÄœÈå¹a2005µâ/iWF(­n xÌÎéßЫãëÅc?Äm6ÜHŸdR˜É®Ýÿ…e'.E±×QÏûù»ÍÞúýÞ…R¨ñ²º)ކ“RÑíôÏYÏá8%ÝÔ„OtT$£Ÿ»“O“PŠû6ï¶7ä&:R]xŠm'A¼ƒË3‰ÈÚ¡7{žœûPî¯k˜F^Êjv½º3œÓ湿ƒP²Õ5¶{l¤m2åwã?+u9ô®kAð¡mRInZ9a ·+ÔÛ5°,5qƒ]Iö;Sÿ,Õ¾vçú é4Ý2ßN·@TzžµWå*dÎR«7Rks¥ð¼I Kj`;s].™i%±•§”ûBÆúœWkyý›æ$Éæ(º˜)^zçš×‹Æ `eIÇý“§Å15ÔªŽãåV!0Hô­vÔiQYEh›ï¦Ÿl`qµz=«µÔ/"¶ò"òÅÀ–|Œã#ØS›ZÕn5XîžhKÛ&Ôo)p ëÚ”d¬®‹lïtõF²UDT ÆÕè+Ÿñœè–c弓ï}³WÄ:œ'dw,¬K1ò×ôâªêúž¦nÌr,d‘„U8ÏO¥’jÁÙÜmÕý캙ioö‹ë]±ºçïDxï´ð}ˆ¯6[÷²×/týLÉiq$éåa@¨r½Ç5è¶7mìWQÇ–CÊÿxwˆ¤ñ-—…µ+øo?³ ýäm¿Î¸Ø8êøô<}kg_žŠ„þÈ£JŽQês—^#ñ_‡|Kuâ‹ûKOÊB©À)Óçž¹éÍ.­\k²\ß]Ø 9¦‘V8w¤J§û’ÌN}«WQÖ/î-ŒWÜBH;TíÚGLÆ? ɳg’äÈb1¢©c×½c*—V*0³¹jð~ápÍŸ>ÿôÙ)ÿ6>ù¨îœS<ø?ôrT¹ÏùVÄðj—ºxýËÄë×d¹PG"¥½ñFªBÂÏ ¿˜26gl{nþu—:ÊÅK  ²Žã½h`XëW°$ñî\´¹ ø?Zè¤îŒ*-J%Š8%Žö'’Äõ'Þ«êŸÛ+þÃÕ …ÎïšP3¹1÷<~T×Ò›J×åHn…Ô^Ö‘HÀ ð8«~`Ï ÖsÒWEÇXÙœùoˆŸô8>?ÜÿëTE||O>,'¶Lcü+¦/cNWã—´{4sq¯Žüåy<\H ýß<~êž·jZƒÃ%ˆDÃM&ç?SŠãŽ:q]ŸÃÌ-íïAûµþuQ›m\RŠKC¬ŠÊfY¥P;ï«Ñ/‘¸_â'5.åõCvßè’…+’¤dö­ÌJ£\ÓZå-ÒéW!@^kÆõp†òí[œÈãêjÞ—aââˆîc€µ²Ê`6…nõÈÍTÔa2j¸8>c~¦ŒLcr±ÐnW¹ÇµæF‹;ƒðqšjºÃ;6œäGµl>‡·7²I »¿”Ñ6K&:ìjľ ¾MmRim–ÕWäÄ¿3ç°\u¡j®"=2MÑî9ç>µSŦEÑcÀçí+ÿ ½j[[ˆíã@¬%º“ŠËñkãEƒÿ)ÿ ½sTz³¦ Ö8£,ŒÙÚáA›iÆ3OÞ¸èri¦TÎ1ƒX\nýÇ©§[oFM8º’9õ¦0yŠ`!'pÚ9ÇOZ”Jë,rG<ÚˆÝIl¡ÈÇÍÓm:B\úÓ%’‘snÁÎ{šÚÛ~á##'<{柉$üãû¥sš•’#<üàqŠbÔ…§fž3þÒƒùUu$a‚E'ÊF cùUÙí"gùdu-»·øÕg¶€Fb¤eO_ÏÒ† ÆÖmÑÆI\ŽqþMVœ‚‡ð«MØUw’¤võ¨|¶Á+Ôg"€+’9ñW´Li,¿óùGü UbxǯlÓhäYcfI#!•Õ°TŽ„Æ’zƒGw«èöš¬Úü±irÁ}o«¤QÉ$ä ³,¤Áázƒ‘ØŽµZÿÚzA¤Êm¢ŠI5qas»ÊPŒŒó #‘•ãÒ¹+GQ¼‰ëR¼™#1“³mn¹<zY5]ZàbmZþLºÉóÜ9ù—î·^£±­9¢gÊΟWÑt©lµUÓtù!¹±ÕÅ’œ·œ‘ƒž#ƒéÔšv±á»}* ³E Ìz²ØÎ–òLÉ´‚H%ÀË1•ãšã¤¹»‘%W¼¸e–O6PÒ·ïûÍÏ-îy©%Õõ{„tŸU¾‘\©`÷Àí9^§±äQÍåg[¬xHxuø4Í>HntÛè šà·æ1]¤¡ëêj¿ˆ<9ee ­à¶Hn¡ÔÅœéhòÈ6•$ŒÈXŒ¯ËÍr’^_Kçù—·-ö†6ecæ°9¹ùˆ= §Í¬k3†j·Ò+,áÈ;NW©ìyïY›^+Òl-ì­µ ?³%•£I–I<ÒÀglŠýsÓŠå U«ÍCQÔ™þúêè Âyò³à{dÕ\i7ØÇo¦ê’FUC:HŸuÐàâµF±xÇlºÿ¿§üh¢¹“gSH‘u;Óÿ/·?÷õ¿ÆŸý£}ÿ?—?÷õ¿ÆŠ)6ÅdCq¨j>Yò¯î½Lþ5‹.«®Ãj·?„ÍEôù Œ¢ù’~©x…«-O[yuIÊ÷ +Û:ïüþ\ßÓþ4Q^~weˆI$½_‘¦á#:øÿ—ÛŽOüõoñ¤:•ðñûqÿ[üh¢¼‹³q¯¨^y/æÝÜ2`î_0œÎ¹ëÛµ>q„Vrl¨¢²"úSü Ç€Tܱ¯Z`¢ŠW$N8§y„íE ³Œ’)Ølc8ÍQmIl]„c,iDc½Rc:ï &Ý&_úøoý+irx¢Šé‡ÂŒ%¹Ëø«Gñ²ñE¦^ZÚÛFC–2º»89à­oi‘j §D5F®ÔaÚJ·¿ `ŸJ(­ßÂŒ—ÄË€˜ ð(¢±4 sIÏl~4QGPGÍÎ)Ùºgñ¢Šo•rÑŒúàRNÔQMì‚ç½;n3E<¤|nP rÆ€ð ~QJì ¨ãªÝÂâÞW³Š¹Ûû¿;å]ÞäqEKq=ŽSúŠ´Íbk­JòÂîÖé·LžcîSئSÓ1ôÛ¦ÐGÈÏJ(­jnD65 *aúU…9íŠ(­âô%¡Ô(«$ ¤‘ïUZÊ3§ö¢Š–“Ü{2¤a‡´I ‡ûŸ€ÅVN)ì¡ õ*Ø´ƒï (©QW)¶‚Š*Ô"O3éËKò;âœ,"–cEJìÌwØ¢OãKöHs÷?SE\‘ì+°û,«1ì­\ ð«}Fh¢•’†+aÇ—ÓÒ”Gož#¢ŠVCÇnú¡Ïµ ¹é…S²ƒÊ€õ¥!Kaÿ,¿J(¤Æ‘Fòà à|¡¸ûžq^a£xÎÛÅo¬\]é’Á1 - –@‚>Á~Nì~¹êh¢„&Žü½¯üò?çñ¦îµÿžMþ(¤6ˆ®ŸýV²·‰®vŸ(LÄ&îÙ#'ÂxoÃþ$Óõùîµ™´ÝBÚé·N…˜²žÅ2˜éŽ>‚Š*¢&µ=#²Ž0±ÂQº¼ C»Žü(¢¦È¦ˆT1Q0#ñ¢ŠÉ¤>¤yÁÁéJ£îŽ}袥 ’´@Ç’ï­V'œ¿…PÁœüidv“C=(¢€9ßiÚÞ¯cö-"{[hä¾’Geb?º0§Z·áø5k]-mõ™-çž?•f…Ù‹¯ûYŸ~ôQWö _­Ã8Æ1è*ä‘F#ÉwÝŒôÿëÑE8¤6pþ.ÒüE¬I]ݵ­¬d9&GWwŒáNúÖî’oÅ„Kª´Mt£Ð1*Þü¥S—Â(üEÒ»›‚EE4pÉÆ$ä8QEeXCKƱö ÷¢Š»ráºæ•”ŒÑEHÆí\œŒýE)Te‘H¢Š(rAiVÙúÑE(`ÜmÇãMãqñEïŒüÔ ¡,ãéEV£Ë'ï?ä?Æ¥6À‡'ð¢ŠvB¸å°fYpjq±ŸªÎ?Z(¦‘.LÚp™y¾µFàኟŠ(c‹´ƒƒAPÔQK Æ‡àŒi7û(¢’cö†Û´~µƒâËmsVÓþäÍkm£Ë#²»îŒ)Àõ?…UÅêL’±sÃÚ–ZjÛë_e¹¸åYâv%×ý¬Ï¿zØÄIýÛ;µU6$´nÁ(aŽÙÅr>.ÓüK®þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœì½‡w£Wúß7øÒ~ÞîÕîJ+ÊHÍŒ4MÓÙIôÞ;@QˆB`猤]­Êîªíª—_zNr’“œä$9ÉIï½Ú±cÇ-vìØ±ãœÜçÞûV¼_¢^ ßﮆ¼ïx?xê½ï¹sš4iÒ¤i¸Òi–&ý§ÔĆúŸ}¿rü/Ë)5¤4a±=M‡ôB )MãÛÓtH/ÔÒ4BézÞíÿ@,¿PCJÓè$¢'0ÓSjHMé†g¥ÃcyJ ©3)Ý¿Añ8žRCêLJCjºÏ¡‰5éα€Ôc*í“<ƒÒñÿˆÓjÿJûÏ®t¢ežQ õÍŸéOòŒJñëôLO )MCPŸVê±tm4¤4 Aý;~ÝœîwÄÈ?žñõÔOX§{ãþØOVßH10ö!kÚúù3Ï]|õêÍ[w»«¨^ß“ê>’îþÐ Ò,Ö–Žü˜#ÁogàiºûXÒÃô7™n¿~S@ꪺ}œè)¾†ªiCêçŸåµk¯ß!pÒÝW”š‡<à9ÒñÍ#- -‚tøßE¸¿¿ xéx¸†3 )bJ@êÿU!5»N¡z4:æDR=6̃)žàÉg/\ºvãö='ÝŒ¢z><ˉƒhA----/¯¬¬èõz–Qg4’[è!ô‹åeô M˜`Âú‹Dîß½- õTHác—?¤S~xTR:ØG•L;•F¶ó…ª^©üœŽ>_]·ßœZS‡Ôs._ýîýÎ-“øf2ø°`€$€„2™Lf‹ÅbµÚìvÝn‡[V+zÐŒ~‰Cpé([bã5ÈX÷òÁ½»Âøï«PçÇÞñgÕÉ~ŽX'@.í`:R'FÍP:Z¨t:ñ—΀LLR/R$Du›¯]¤ãhÂ< –‰àdF8YIv‡Óét!éàºã¶XfÄ2\z°XËØbQª0W}ŒEÕŒ©ÿG…:>öŽÎpÑoÆ¢ÞHñý§ñF ß ¯ÓÉž¢“ÝìWSˆÔ•ƒ!5¯›ÅJ˜&dœ&@ÉápºÜ¯×ç÷Á`(Ò¡ÿBÁ` à÷û¼^ÛpÙ¬,™µÒ «_¤î‹ú{*¤`’(þ½T E™Rž:RÂoDJýq»ŸpZ‘:ib*Ó4O'½'°M„&—˃PBE¢±X<‘L®¦tðOj5™LÄã±h$ |@åŠÚ+ÞZ`Õr¥4r RW…Ô un¬évE¤¸Ó÷˜·:QnQ+¦ÓqðIc1ÿDé ñ”@CŠGjSsžÞàÿ™Ÿç’òHž8œ,D“ÓaŠDI©µtf}=—/ŠH:øg£X(äs¹õLz-•LÆYAd³ÜN§Ýf±àèj…8 ºþDü™;Åý£“Ü#ƒ• õ«<Ôîò—'R眼^H c9†r—ŒgK𠥯•RNÊ¥ü'sHåK° RSU†ºÅOtšŽÀÁØ'0On¯? Gc‰UÀ Ñ´±Q*W*ÕM^ÕJ¥\*m ®«ÕD<ý^+l«8SÅÇUóø¤HÍuBÔ )NGAÊ¥^Y  ûÇCUדèzÏ[MÂ-â¯:žØåœ=|ÐN¤Ît,¥Î¯ê°PÔãÃ<™LÈÝs g™§h<¹šÎ®ç‹ˆ¤ÍZ½±µµÝjµÛ;¼ÚíVk{{«Q¯m"¶Šù\6½š®VV‹ÉyÀNªN/ R[…dH1ÐSÑýÜjž¤;'{zR"Û£|ÒÓ!5¸<äžU¤¤ {|Èá³Ùn§Äj*“+ËÕÍzsk»½³»·¿ppxxx$º{p°¿¿·»Ónm5ëµj¹XÈeÒ« Œ•<@  ü? T"õ©PY3!)ñ«ƒ)þWrÇO!–:qø'«{¶µÏÃXý!%&Šx|Èá³Ú.?Š&’kÙõB©RE<µÚ»»˜¦££c%a°VíÖv³^­” ùìZ2 ý—L•‘ZªA˜’ õ·Th*Rå]):~Ê¿¢÷äGé8jïÓȇÖý5j5ÝHõŒ¥”xÂ@! ” T<ö©TÝlMûû‡@ÒCNRœÄ!°W[Zµ„lUj5ÆTAXeètÿ„±ÈÇyb,õ7Uh*‘Ráé‘’ƒ!}B—óˆ C¼ûÐÔjº‘êf”,”Á€"(Ä“/‰'×Öó•Zc«½³w€hB¸<"Ѐ£‡¼¼ý½½½]$ôÝ¡Æë!}p…쪲QX_KÆ#@øƒÜýë:¼­Ôÿ©BS”8Jé¯ÈŸ#DðÙø'Iî /èˆ-•ÏsŽ®NtÐ(ô±DªPÈãÃÊéò"Ñd:—/UkÍÖîÞ"åá£G'ûû»ØÞj6:Q£ÙÄ ˆ³8úÐ ½BXµšj)ŸK#ª^˜*œTï Õiú*4a~ÔóN&úy<æH N˜(ìòYmN7I¬fòåZs» öIdw Pj#š µW…Ì9Q¥Z…D pÕQ…þ[Õn5kå|f-–Êi³b¦ˆ÷wúJ‚Ô_W! ©Q¥ï“3„”R}Pþ5±”Œ(ÎDé &³ÕB¨0X¨B¹¶µ½³ptL]=ˆŽvZˆ¥ZµRÚ(rëÙl&^#Jg²Y\¯*•«5’Çà¸Â/ÞßÙÞBT¥ #÷Ïaµ˜z*õ±Ô_S! ©ád€³³ƒ”BdØÙP­*=!6P4͇-”ÍîòÃñT:_Ú¬ <á h§µÝ¨m¢¨(K¹ÉD<DÂáQ8‰Fãñ$)6*ÕZc»µ³·ÈãQÕÜ,å×SñpÐërÚ8ïO^¥:]z⯪†Cb)iá+¥ÒçC@­@RÂáö£ÉÔz¨Ýƒ#ba÷÷…il–K…\6J&b‘p(à‡6>·w ãŽtt¡P$O¦Ò(,o6šÛ€ÉYU[µjq=•Œýnj©$õÓ;~E…Ø›ˆìhlb©Žâ€bÕá”HÑJ”^o´Øn_ ’L¯«ˆ¨}BdvÚ[udžò ž‚~?î7w8È:)";×£Ž[c‰d*“Ë#cU'éBÂòÿ¶ˆ©t2ò¹6 2T’*Õé‘ýåštŸ„²ØÕX4D¤näü 7ûFJ”–X^ÁA2Q±rùªÖÎ>öÖ0OÛ Ài=½EBŸ±d·[ñZC#·œ/î5âåбîÄ=¶`­VÓY„Õf’ôû{-Hÿ¥WcA/1T4¢RÏ”©^8ñX ð±Fìh\R˜´ƒoà×JJw§¥D8Q§oçV»ËŠ$3¹ÒæVkï(ÌS­\XϤ±púÊ¡W_®Ë ð’E²JqiY´Än® ™)•Y/”« ä`ÿïøp¯µµY*dÀR¹ü“ETÂ8 ¿R¤þ’ ±7ÙѸÄ2RŠul¾QKR\^Âh²:œÄDml6wö©…ÚmmÕ+¥|&•Œ‘Ö»Íʵ”síÑ!|;nh Ç ˜/Vê[­]âÿ!¦vš›•|:A •É(ËRˆ‘’§'ä-¯º¿¨BìM`öF4.1ˆ”4Š;“êº'¢Àé³Úœ^?6QµF{Ÿ›õ»Û˜'¨$¼ÐŸGh"‘žÞ³ÂÇæSò¸OÐáòH•«T©#ÿ~¿½]+å¡ z6« "*õΟÄJýbo³7¢q‰e¤¨)!ŒÂNŸÍéöGbk¹r•³PGÈ5kÖʘ§ßãtN´ˆït$ßKŒßãÈâ|JÜ~ëp"cI¬eòè­=œ÷@Pí4«åÜZ2âw;mfuþT1¥!5Åb )…$ú©b)1O¼‰2[ìn0¶–-â ê˜x|íFµ˜‡¬œßí²#ÇŒ›ï°ïà ‰îs)·…&…ÀâC52Vn?ŠÕÒÙ" ªvq¦‚„TÅÜZ,èw#hXY7S_s½c©?¯BìM`öF4.1…”¨IY’¢<¥Râ /—鳨œ¾Ptu½Pi§ìøð`w»Y-fÓ‰H繉WFyšy@pÂÝ‘‰ã ¨s…ÎPéI͡,U 1UÛ&1bªÝ¬”ÖW£!ŸÓÁFŒT—¯©?§BìM`öF4.±…”h_Žn<Éñ•waª[Áé[M*µm’ç;ÚßiÕËÅl*ñ{vXß´ îgž0LˆžÛH·:´,l¬€ªEL•ÝáAö0•Í—ë4KÌíf¥^ø½NÈR,«sþ4¤¦XŒ!¥âj¢qŽÉlsùӗߨmïà Y¨Z¥IÅB4‡æ86O'JAéu¤›D7èMx” …Á"X±ª ±èò†b‰ ¼»DõÛµüZ,ìs!{¨WPIú_Tˆ½ ÌވƥÇ©½Ñlux‚‘ÕõRu‹Lð£}4Á¡`Ã#pň¢@Qž(N7°®S‘{V@•2UØ(ÚHù«PB“SìnU‘ózÐô·BR §@êV!ö&0{#—¦)Y﹨cbÅ`´Ø¾p"•¯4·÷ˆ¶»Ý¨äÓ«Ñ€Ïe7› ØBÍBôÄãı]Cº*Ü¿Fé²x¬ ²BT!Ëh0ší.O ºšÎƒ¡"®&8ùl"ìsÛ¡•bIÁN´CÒÿÔCl¶þ°7¢1I÷8!%í˜0[2Q…Í­Ýœ,Øm7P•Œ„¼N»\¾4yÁ>!ž8œ0L˜¤×^• #lW¥©ÿ^…Ø›¼ìhLzœ¬g¤H’Óˆ­­—í=nJ—ÖÓñ ™ £žÆPÔãžxœ&JÒE¤—E‚û [g¬®sT!Kõàd*÷‡ U<½^â>h7J…µXØë´J|¿“‘úïTˆ½ ÌވƤiGJÔw*‰£¬N_8–.–›;!€ù¼YLÇ#~—Ãb\ÁêÁýû‘òDq",!‚^½(~€°…Áâ°cTQS5;‹-•ÅæòGâh ö¦z§Y+¦WÃ>d%;â)ú¸ÀP‚Ô«BìM`öF4&M=R2…Â^ŸÝˆ¯rqÔÑ>ä±³ÉpÀm·š¨‰‚ гP(€B ›'O@щ8®(UØX!¨®’¨ b*©ff ù§7™Ñ ÂÉlžfðI<•ŽÜN+Ô§:›h»¤'þbo³7¢1iÚ‘RHM`¯Ïœ®\e«½Œ“Ø2šËAšËb¢Ï‡M±P”'À‰ƒ ôèy‘ð-à cT½F¨ºI`¨pš9«¹r'ñÙd+ƒ>Î¥wKQHú¯Uˆ½ ÌÞˆÆ¤Ç )²: {}xf£²µwp v[Õl"Š¢(‹çD! u …=>ÊàÄÁ=Gô,¹Ã¡\a¬DTTˆ*©ffç½4€óJd7ªd(G{[õL<â“ÆS' õ_©{˜½IÓŽ”¤$µÀgÏÃñôF}‹šp·b/Š¢ôK ó8Í {|8‚B Êë³@\­ƒÆf> zìVã .îÞ‡Ò.ø|×0PÔBaž°y¢4a†žîæ °"TKõ*$Õoܼy‹‹¨¡Få FSùRcçàû~(žŠù‘Ñ4é•Zh•’þób³¨ÊވƣÇ)B” MàPt­XÁ^ßÑáN}#ŸŠøÜ6ÈK@ûÑ} Ôõk¯Q À@}"Ö‰ÐDøù¥’8²0VØZUÔTAþæ)î@D57‡ •ÛIe6ê;P"CLÕŠkÑ’ÝÊS¤þ3bo³7¢ñèñBФ¢‰õrx}{ÛÕ\&p9ÌÈËšŸÅNMKˆ‰"þž(ÐSI¡z†ƒ 9€8¦Â!MS@–—¨–– f‡ RúÕmâûµ›åõD”–§T õŸª{˜½GR"¢Pä‚ B¶„“ÈëCD­Æ.«ŠQ$uy PàòOØÝ#8‰XzR&Zœ­³TªK$¤çï6n¦€^ ³Õ#¦êØ÷Ûßm–²Ôtâò”´8ÕÔ¢BìM`öF4M#R 1RBjÂ`²ºó;í&°Q|b;}—/‹MqøD@É`’Hd¯8¨¨¥*R£ÂI XG…ì”ÉâôÇVó›ÝC’¢(¤A· :—{#õª{˜½GÓ”85a'³¶µ‹kÍÍ|*pZQó„¨[·p¦9}¯¼Bƒ(pùžxœ8~~&SWU*j¨Àù»víÆÍ[·Hâo~Io°8áT¾ÔÄ©Hžw3^«/gJ‚Ô BìM`öF4M=R¢/ÎU¯­W¶ö‰¨R‘€ËjЃ×Õ(j¢¸(ê1P„''9K dI¨â¡zþ…_z‰wþP@uTÄ÷³º¼‘T¶²µ‡Æw¸¿U)®Ñ…¤:Õ™žø÷Uˆ½ ÌÞˆÆ"èß¡r„êDŠRF«ÓZEV`÷žoWsé¨Ïe5BEÄDqi P”'MOt•ˆ+ž*0U¼¥"Þß\¢â’ó ËF«ÃM@.J¾»ÈŠ®†üÐí×Y’ õï©{˜½E RH!#Œ¦7ªÛ¸ib·±‘NÝ3Ž£îß¿{û6¶Q¯¾zùÒÅ‹„¨çäD ö©;Obª(T”©§ÅL]¼™?b§nß½û~f+b£…‡¸†%á”<ë'EêßU¡ÉN`…­ë5¤†|ÈJ‚ß- 5^HAjgÔ¶ÊÙXØc3ã8Šóú®^…0êâKÔé;€zJ”§Ÿv•+BuÿTûã?ÄÔU¨PAwø~z£Íãe˵6rýŽ÷ÚµÂ* §:zÒ;’zâÄFºZ×óîYÑ〠¤¬/RۻةjTs‰€×n2,-@öœÔw!Ó‡¼>êô °…’ó$Ðóge’qÅQ…MµT*ÎPA… zÓï@ÑwaiÅdw¹uN+ëk¯ $ʘ’ õï¨Ðä'°|“ÑD4íH ¹ œíËjPJ=:lo–ÒQ4W +‹8×^ß .Ž9}r¢$@Éq’cÅC%gŠ:/¿Lã©›¯ß¾sé‹Ë«ÝMç6qáìp§VÈÆü»Y¿"럕 õo«ÐÄ'pÇ&>¢Éè1@Š´M!›¶V¬l㆟z1÷;l45As}ØF½ü²`£d@‰xêF“œ+Ž* T‚z™T¨pÞïî=’¢0;üñT‘tQlCÖ/ಊ×yL+Rrßsâ#šŒ¤`3r“Åá &s›MH5KédÐe1­@_G!¢p5ê1QØé DJÊÓOº¨“*ÞTa¨°¡zî¹ç/\@L½"ajnqÅ`q£éR“„SÍÍ\2êãÖytAêßR!&°–ž8÷8 EŒ”ÅæÅ2å-˜§H­ÇÛQ¿8GmÔ BÔÅ—_"&Šóù8 ŨhêKLg©h: ©úB<…ó~Ø÷ƒE|½Ú€z4¤Q2«!·Í"ô¤w"õoª X†”Ò%,{é†ˆÔØ>AR‹°e2ä&¹jkOSHEN‹~Zeqj²ç(Ž"õ].Ó÷$±Qb ÕÔe:‘©')SÈùÉ?ìûA.ýÖ­;÷Hk’Åé¤K(œBQß^«š[‹xV£ÔLIú7THîuMd2ëºÞ93ÒI~ õ˜£“)ì÷A'’ÃL"gj©âzÜï¶– 5Áu™%Ø(Áé“X¨n0)‘%PE 9ÔN‰˜zJ¾Pž2XQ8µ^lì þ÷š¥®Ÿ }IÃ@j,‰ÞgÔò1G' R|'R,“¯Á¿£ýmäJ]vÓòNM@ï9Éõñ^.F‰M” šdX‰¡¢•( "¾ÎûA_:§–M(œZÍ”qÅáN­œ‰ñ}IŠHýë*Ôù±qJ+Î# ©!st#E")³Ý‹‹=›8ØkSq¿)\ã%©‰Wq …¼>܃$ب“ˆúQ‡NfЧ ñ÷ K¿üê«8œºsW| &œõk´ CAKhf£¸6%Aê_S¡Éæ°• ©!st’"…›û\Aœ€Û·]ÉÆB. 2R³h^"#}W0Qž'q±Q\^B TšÀ¨’AÅù~Ï?5_HQ@»^ê1»°¬·¸B±l¥N2Mú]´ÕoxH3–R Ý4¤†|Ì~_-ûÓ(ý©R÷0RÈHÍo4™ßlB¥g»–O½8ÛÇR¯]¹té"Ξ“8 §úD&JÎSOšäX‰¡’1E|?`êÒ%HûáÅ}’õó“ùò6r{3ŸŒB†‚kõ“#õ¯ªÒÇ>᾿‰ž}Rb)ùZ¥µ'Rp4ÒÜç‚ÜÄÖÎ!ŽLÐW¾Çi^!5^.5Aº¸8Šsúd@ýDÔ%‡ê'P‰?ìû¢m¸â»¸bvz"éŽþ÷·pÍÁ·ú)õøþõL´NtVkH ù˜ƒ¼X'½+÷Ñy¤æiMÊN­W[(’::hU «!—ݸ¼(RÈH]¼ˆSb¯¯ Q'Õ*S4ïwþ Zñ…¬ß… /]Ä=é¸/éÁìnõK¤ËÛ»PPÛ.ç“ÐìKòès³b¤þYbo³7¢ÑK^QòQû|¹¸X¦ØÀ!;9Xìø¢‡H }Ñç“7÷ñH4ÛGÝ>!}.òúÄ&ꜰR0WÅtÿ IDATTSÔNqMõÃ}I·ïÜ›™]X6X=‘d¾¾}€“~¸íçÑåHý3*ÄÞfoD£“H©8€ì5ËHÖlgs=rYŒKó3$ŽI]|éÂÈMp5^HŸ+x}r¢z%…Jf§D¾6S¤âË5Q I¤Ï/­X\¡øú&ÍVV²1ŸçÑåHþéb3ÀÞˆF¯iFêæ­ûóx /Ü}Š¿æ·JkîÓÓtéD¢Fê™N#%&JæôÄ“”*‘ó'òý$ái¢¸ðâË´/éuX4“~¾ÐZ‰Ùí:ôûÚaÙÔ‚©J…Ø›Àìhôšj¤n?˜_Ö›ž°hJ&ün¨I‘æ>’›À½}|Û„”¨.&JPPÉ|?Y&|I_$Ò¡#}~Qoqû¢¯„0¹(2S¤þIbo³7¢Ñkj‘z#µ°b°ºac¼ª9NœîCFŠ6÷½Ê'ПyúiµD©JÕ L=õÔÓO?Cû’ C­~P›š_69Ü‘ v\÷ÛU为aÙ”©?U!ö&0{#½¦©™Ø9È׸ð~-ä²—f¤`×>Ò‰$ÉöI‘:ÑF}J•#õSy†ïDÁ#5;¿d´¹Bk9bfwjù.M-/.J‘úN…Ø›Àìhôšb¤^EH-B:”Úh¶Iù}v‹~ù}wïÐ~YØd )>7ñ„2QÊ@}OQ= R4SBqŠFSBm y~vœG?€M3šx…?4%A½ðçùV…Ø›ÀìhäÒ)ÜêaG$ŒÔëwf—Œ°Éd¦ ¥÷… Π“t\“‚tß‹â:_‘¢© 9Q'㤄UW¦~*f g(hÒÔ¦ é·l‚I=Á)¤N”„©Þ®Ÿ(é÷7Ñ(µ@I êdJš¡xR”ôʽ÷ ƒÂìò%òõmX‰Ø®W¡Ú«Ç•©/Tˆ½ ÌÞˆF®éFêÞ¼Áæ ¥P‚¿ß7×c(”¢ ¥0R—éÊCÒ/Û™î〨^L)%ý¸õ½—9¤ ƒÂäô¢`j 67R!ŸÃ¬_‘"ú¼‡ØŒZØÑÈ5ÕHݾ·`tx¸2é^£’ûí¤(ůê ;÷=Ó›¨ª êÏ`©`ª»™"I?hHñ%¾ƒâ.\Ñhw‡Óîmd¢Ø) YÛûRŸ©{˜½Z½×ù 帣Aêþ¢Éå‹çP(õð|½¯=V\”ÂHÑU|™WŠTW¥Ì’TÝ 씘)ROq]I¸ƒâ)MÍ/ê­Žàêglsñ0´ÎJ‘úT…Ø›ÀìhÔšb¤^xùêKfw Y¨´=V!ö&0{#µ¦)d¥®ÝÕÛƒQ²"öhg3»pXiëÝj _M VóJR0RýØ(™Rrý$žŸÐAAš’HŸß-Ò:krV³›;\_UÈe5­,Î>úP…Ø›ÀìhÄÒM3R¯Ý›58Cñ|½uû÷UÒ ŸÝ¼B6€Å‡¸¿Oðûd¡ÔPŒTO3õ#ÁLÑ5â%¤7PÌÌ.¬ì¾DºÒڃˌÖóéˆötך:éºÜêG"Ý//\¼~ÎèŠ$‹Í6Š@H7’io:AVÈ¿" ¥:2è=)µD‰¡êj¦ÄtK?ÜçG6ž%Ýèz«7–ÚØBQáÑ~³˜zaŠ©Tˆ½ Ìfz„ Rãi›ÅHÍ›<±Tik/4*$#n¼ Ýt‚¬^èïŒÔInß)€êÆT‡™’W{_(îã]]Ü‘d,ûÚ*åâ>¼qš©ß©{“—½XSn¥Ì›=±µìw¸×À ~0 R¯ H=Í#õÓÉ!õS%¤^ãvu6¿p"ß@>,]I)G Ô'&í{#±¦©Wn.tÓ q(%IN ‰¨ÞL‰â`ŠlAA¶G'%á5S°Þÿø°])$ƒN›qinF@ê·*ÄÞfoD#Ö”#5³hõsi²v5ñÛ+ ³tk$ºËs\Ëlg¾oÜHÑ Ú:KºÑéFI¸ÍÏÉàzéœuÙMËb¤ÞS!ö&0{#±¦©_¹‰ ¬®Óbî™5ðH]í@ª£uB†T_¹ )Rß;©ŸqHçxðHì~èœ%%¶ÒZÈ-Cê]bo³7¢ÑJ×õÎP< a¤f—lÁµ\Vôîn£YËé~dk$J=-K¡ ¡ÔPŒTw3õ#qÎOÒ@wuyÖLÝ Ûù¬ÞÐZ©¾ Íèõr:âq˜Væ5¤¦LÓÔ¥›³ËöP/’‡½«Ù“¬•º‚×J=ÿ¬Ðà÷„4;ÑÍï;=QSÝ<¿?+ñüp0…×L]!{‘2=ÒŒ~¼ë;¼NóÊü¬€ÔoTˆ½ ÌÞˆF«)Gêõ¹eG8Slî=ÎxÉ”ÃÍ¡«/ì x¬1Roª{˜ÍžŽ‘iDH§Ç#epÇó•öáññ~³šÅë¥H] +;ø:Hý¢+Rvw$[„+¶1R6Ü´!ébsò²7¢‘jz¬Tç\á‘‚€#•¡H‘ë ÀúCaçæê$J)¥ÊTo¤`ɾ(¹¸üF*S¤ðZù –S H=R!ö&0{#©¦)]'T€ÔíEƒ'içc²á˜Ëf#õÊ‘ê`ª?¤èÂ^‚”Áæ §ñþiG;Í”©‡*ÄÞfoD#Õ” Ei’–CªXÝQ@꺩Ÿ+!%^+Õ5‡®H”*¤~ „ÔÏ{#•ç‘ É:V!ö&0{#¥äßû#;ö€GÖ)… e䑪—×ðÆRä’J[¹ôDJ‘êîù©EêYnã1©EƒÍZË×1R[°ã¬]‚Ô‘ ú7~<¦!5šcögê…”7Yܤv¥Hݘ&¤nˆ‘ÊÕw9¤Œb¤Uh8_^ÃÔÙFj˜ßOòC rìÇ©§{!õP©êü“žêƒWò°O¥ÎÓe¤tC5úêÿàÊHqz\‘âÞÿ†÷UHÉñ8ÅÇ®øIŸâåºs_žg)Ýè‘ê×T=ŽVªÇoO…”¦ó‘Rxõ™BJ2Á OÃcª‹ã××áµô~û*¤ôùžÚóë{hHIî`šF„”Ø}éÿX'#åRãJ¢+!å’"%M¢ï¨Ð H‚§¢!Eïè¨#<¤ Ûaú7Sg¾ÔÛV!…÷´Ÿø S`”ydÖ%óûèÄSC.nt~yž½†$N-ñ¿Êb I ”td²ûp’"un8Hí<{m³Û*Ôñ±}&Ÿå$ºd;t©«²Â‡r”^'8s‹;¶ThâzòLOPr¿Gj(Âx:SK›*4é@f8Žç´jê‘:k å*4álÛ²#Ó,©ßÇ#5$ÏolHEÖ7¶0R |¡^©›RÏŸŒ”ªí\T¥n;@êyR Ëf¹\/EÊ'Cª®B2¤Æ›PŒ£Ï.RçDH ãS=RgnÓ±š ±7ÙÑÈ$Ï÷M#RgkkÌMbo³7¢‘©ÃHñL RglçŠ ±7ÙÑÈÔ ©!| cBjÑ€kF#¤öZå4´ðp—¤.½L.~Ý©Sìy ¤ÄFJ±,—@HÁe®ÓË ,l¾Pº ýHø2a·®è¨!55’ %ydZ:kÃ)«{˜½J…^Ñ›Ÿ¤ÎÔ%Û@=ÄfÛ{#•:‰#5øç0¤."¤ÌÞxºÜÚƒ ‹ÖsñÓlX$¤.¿"BJ¸°èÉHõ{aÑHÉ/)HÁ…E¯Ý ]\6;Cñ\}9±‡­r>#Õ '«Qì§{#• ¤ÎÖ寋*ÄÞfÓvŽB¡”è¡a´Ît5'ÁHÍ]‘dÍÃGhn¤b^+„ôîáS¯]¤„kwðHu¦Ñ²SŠD)¦ÐƯ’‡Þ‰—_¹ò uçÞƒ™ùe½ÕKm o‡GèÛ¡˜zíý⬩¼ ±7yÙѨ4J¤dÇtO½pñÚ½Yò–òuè88lUÒ ŸÝ¼²0;sïiIº„=¿g¥ë;Dm~fª¦:¼>”ÇÙ‰—/^º~ß­;÷ffV v_"]ií=6ŸŽxlf)R9bo³7¢IÁï“ 5ð1.¤ôŽ`,1ýãv5“ôÛ¡‰‡"Eö¾ _2%OP N)R"#¥„Ôs)Øx‚"¥7ÚýÉLµ½ÿ2-¹µ°Ûj^Ñš=H½|íîÌŠ=ÉâÌó1šˆ)¼ýÄÜ ^…xí*·d Úüž§Ñ»GS§fª‡‘Rlx’ôÌ¢Pê"]Ò ¡ÔÜ¢Áä A‰Ô²«A—Å©¬ ±7Ùш¤à÷)>6ŒŒF8`»;³lõ…×Êu<ÜoÈÂÞy²dê:x~Ò`J´fªƒ©N;¥*Ñ“»ç&”öÀH]Á+;n“ÅRXÒÛØGQáîv9ð;ÌFé¦cbo³7¢IÉ"uvý å#X©«w,Y<ÁÕbµ}ôèáÁv)ƒõ t}éœ}‘ô$uñü:‘3uU @IÝ>iW¾ïÄ%Ò3{·¡›lÞXÖ©<«äc>»É°¼0s_Cj:¤ä÷)?8„3ŒFRfw Y¨´=„j¬ïXY Íè7„K ˆ–!þLÔ:+¦ÌTO¦¤Ïë JI ËÏsH½z• mèfYÙqü/ézm&Ô¤ÖTˆ½ ÌÞˆF#EoÚ¬Ôó/½vûþ¢Éå‹çJ[AÏjÐcÕ/’ÎYØÒå YÙÛ™ Pˆ¦”ÍTªäÏQm¤ž"ù>²Hþê ¼• ´¡[A҆׾ÎÅÃn«Q/E*¥BìM`öF4=6HÝ[0:<ƒ@³)ÞxÌO¶tÁHኗ=?™ë'MQt@%"KñWß—õÃÎHª£Îû"¾š„]’¢^,Ÿ¬ì}õ²°ÀCîùq®_gÖO©:)šA§-³8ßG–^»IVô.â}'øÌe}38͆•Åù"¤’*ÄÞfoD#‘rÔ$yóS‚ÔÝy½Í\Íâµ°‡Ûõ|"Œ‚)ôíþ€,C|t£s9?i½ÓLõ•¨FêI¡Î‹»ÐI7Ò=èF2»|‰<4øA} öð³›ôxÑ¿ðçI¨{˜½DÊéòéCêÕ[wçV,| SGdÛã,C$ž®ö^FHAiŠëó“%ýº2¥ªï÷ JIqHa#õÒEÒ2Kv,¬Þ`jc‹„R¥\Âï±WpêR@*®BìM`6ÝÑ¡K¹¨+CªÿÏa<=~€Ôëwç–Í6o4‰Ëïµ+™dÀaÔãjïm\šº,éóãÍÔИ:™(I™—4¡ã–Yèï»EºÐõFG ’©´I(UÈD½.‹ayIŠTL…Ø›¼ìhR¥†‡TÇÁF!‚ÔÙe“ÕNжƒÍõTÐi2,ÎÍrH]¹$ÚÛ‚¢‡™1¥ªï«Aê ñ~$ƒý}R¼Vjs–îÖré°ÇÙ‰TT…Ø›ÀìhêÒ&!}ó25z¤ž|þE@jÉhq£™ Y3 èFG“ñ-Mq;dJ“~„)…pJÌÔ P}¿(E·O’î£øáf$R癇¯…µ´‡­Jf5èB¡ÔÒ"ø¯Rbo³7¢Q¨K3ß"uóö ú†wøC© ²Ðh»œO@ë,”¦î’<úMѤß/éLI ê†•ô9?èJ”$Îïã‚›ÐÉõfßg±ûé2lñy´ßÜHÅý«qeiq^‚TX…Ø›ÀìhR…Ôp.Y=:ñHéMvopµÐhÁWmH=‡‘š_Ö›žðZ©†3ÐPš‚ÍĹíüH…(é§’©S@õuDñ5)œî£÷Èž˜n"_Æ‹¾v¶Jká€Ó‚C))Rbo³7¢¨‹ß×ñæ§©[÷ç—VLvW0)š’pÝh=ÝÕ…”{_ájS4C!aJæû*)P¼×'" gûøÜ¤¸M' sÂh÷…D_ I¨óV–æ$Hü=Äfˆ½ _Ýü¾iDêÆ­ûsK+F›ÓÏmÀ…™Ž÷ZÈó 8L†¥¹™wéâÞË¢eS²¬_;¥ ªœ`£Dý²¢…R\™÷¹%ä÷AQ ü>Ø =÷{l&ðûdHùTˆ½ ÌÞˆ†¯n~ŸR|ãCjqÙ`±{"é<ùšßE_ó8NÖË“ÚÔej¦Îwš) SPõ¤Jô4P"¢·OØr‚.”Â5)¼B~Ùô|ÙZ)¢”B))R^bo³7¢áK5R™© Å2FÁ§áš]XÒ›¬ÈóË ÏäÑaI,lØ5ûà.]6…×xÀÈÆ³B8%²SbC%†J+É~(3QR¢hsl1ûìóèª\“ºû.zmrà :lœE€$.J­,u åQ!ö&0{#¾º…RJH ДÔ÷+¹ËÓûÝ‘Z1Yç·¶ÑÜ'yôl*è²—æ¹Å½€mHµ%q™tLɰ’ÿN‰(!’ä&p ú%¡Ì;7¿d4»‚©lvÌ=Üon¬ÇýN›I¿¼´0??7#FÊ­BìM`öF4tu5R¬!%ÚªSé©{³ Èó3Ù<‘DnsçÑ›ÅlÌë2ëqY‡Ô¦^ãéSâpJÊT7¨ºé‡r§O°Q’llÞ÷e¤úþ@†”²ã‡‘ZÑ›íÞ`2_#I¿F5 ¹ 65 ›Pðݳ8ëG·¡1%Î¥SC¥ŽªJx’:}"¯^«ƒv Ó~Y¨ò"#µ¬·¸|±l•¦ûjùdÔk7q$%GÊ¡BìM`öF4lu÷û”ÞüD‘’µÆËŸ$ µ¸¬GžtPà™y°]Ë'"+\jЬñà»gùpJœöã씂ó× *ÑS‰%û„@Šë—%5)ØcÖê $òxoOø.X‡q] )» ±7ÙѰÕÝïSFªßOä”¯Ó R‹§¹ùÅåƒÅé sþÓîv9“ 8Í$C‰tÒêG\¿“˜ê0T2´ä‹M”"Q45A:‘¸æ>Ò‚¾d4;‘Ly{—óXÃ~’A_\>ú†m*ÄÞfoDÃVw¿o¢H)½ö„t$¶R¯ß›™Cž˜)'2SEXµ)XÅgà ®ÕlCAzýøŠ¯Ø÷넪ƒ*uÅWx%6ê™g¹@ Ü>’í›Ã¹‰h²Pß%Fª¸ŽË¼zÎï“Z)‹ ±7ÙÑÕÃïS|ó}35d¤â<R‹K+F«Ã…r/ÍEçHmŠì’I[ý.] ¾4í7 S?ên¢HA l”(~ñmî£ tƒÕáOÐìÿÑN-ŸŽú\V#¤ûõĉÉÜ{#²z)v’'Ñ• (ÔBjÙ`†r/$ý 6E›`c—YÚêÇeý(SOwcJNU7®„ß‹,”„(ÎëãÛ&h'ÉM<˜_\1;=‘t®¶«:ö·JédÐå0ãH ò}2¤Ì*ÄÞfoDÃU×þ>üˆò+úL¤÷õ*ñ«I}W©ÊKžB‘Bþ1Sfò¡ò›xÇþv ºOmxŠ|_Ò%!E!ާäPýXU/ýXêó‰Lçõ ©‰K´ w CÝæÅý¾xÈíMH÷ᵇKÔHI‘2ª{˜½ W½ü¾.o~"HI/'"ÔÉ/Rw1R(š2‘™Š¤K›mظkw»‚é¸Õï>éK") ؈âùgÏÓäÒyC…¡’PuW?þ±‚…’õ i–Å6 R¸ ²}@Ų•:ÎM´›È°]V3—îÓš õ2R]‘êëCù')EjqYo°8ý¡ÕB…|çïàD:d(æp†²~d5"T§äñ”ÈNIÝ¿PñO,”ÜFñ^W‘zõ*Ÿíƒm‘ çŠiØ®Ö «!?,”‚tŸRbo³7¢¡J”‘= Rý|*cE {~z“Íí‹eò829Úß.“]Q–H8õ:NQp_.ž’CõS%¨zJ°Põsš˜õ©H·º°l²¸‚«™òöÎŽþÊ™˜Ïmƒ…RKñ„ÈR‰¡ê&e¢¸0Jðú¸/Þ “dûH ÉMl!75ä¦-輑’"µ¨B 1“žÒ“>ÿhÕ3’êñæûajÌH!3~‡/˜Ìm6¡ÕçÐ’ø’·¤‰1E»(ÀN]xþ9P‰?ÁRqXuåŠûýOÅ<‰>F=‹_~ RÐ,{ë¤þ®`9©@ÿñ^s3—Œú| º"R *Ä ã7áóT½“½Þ|L)l¦ŒV—7²V¬àõ½û;õb6îw،ˤ⋙Âm¯¼ }`¨ÎSCÅ[*ÁT Tu—À—• @§LõúDDÍ/,Í(Jëx…×Áv¥¸ ¸¬Fœ›Ðšõޤz¾ùÓ35n¤¸D:d(r¥æÄüû[åž()R3*4y¤:rŽc>ÿ8u’‘:áÍŸ’©ñ"E]¿¥¥£ÉæFqÿFöì?>Øml¤q½G¿„|¿û÷ïÞ†•×®¾ }éÔP‘ÔµT*)V]õ3O(l¡ÀçLé™À¹>\¯†Øhá!n£!Fƒn›…oî›f¤:&ÈcŒÿ^»bq›Ǟºj¦&‚Ô"nõƒ¾¤|©Iªjެ˜ ) ðýp»Ô§  ÂΟœ©_ðLõ¢êg 8¢~)&êel£pcŽ£HjÖ¡$rUÜ6q´ÛÜÌC'’Ud¤”‘º¯BF fÈ$Ï?^HÔ‰o¾{ÜÇÁV'R\8esû œÂ¡ÿÑÞV¥‚lšù~³¼ïw ')^¡Y 1TU"[ÕU?çpâ\>ÁDqNNLà\ßâõ- +™ÊV¶ Éãp ²}|'’›è,õÞS¡‰[©3„”ÈHu}ŠŠƒ¨¦jÌHñLA_’©üf ª¨G{È ¤âdã~Oá\:$þÀP‘ •ÔRQªDX)Å=þ ObŸ˜¨Ë`¢ Õ‡³çØë3Xœp YÑ=°¢»­Í|†R|'o£4¤˜ÖÉD©zó:µT)ÁõÃY¿p<[j¶q¬Òj–2«aÝbÀ´d•/N¦¿ ¨ˆóG™â,U'TJâx ¨…âò‚Ówõ:‰£¨×g0Ù=áX¦´I©v³”M…½…l_RwThòøÌ ÅÐ µQ’: aн‡¡€ §Ì§/˜X¯ÔÛ‡¸âÛØÈ­Ò«ßÎC.®>rþ¸ˆŠ¦)°¥¢¦ cE¸’À%<" ñô4áI0QÔéƒÞsl£°×gAD­f6°åáa»^YOD}N ¤Œ”©Û*4ù ¬Ðe8ž 1n© J-+Œ"% § &« MÜÜF7'îÔ«ˆ)¿Ój„¼—¤¸yªË\šC%¢ cE¸“Å¡$‰ð„]>Ô ƒþh"[ÚÜÞ»yЮsÈuÙLF!š§ïC©k*ÄÞfoDÃЈšR¼ï‡ÌÔŠÁlƒòTz£Ž}?HTréX™HüA6ýþ½;8KAB*ÞRSE¹Â`²Dz–‡ ÑD g¡HZâôãLß IõYîMœ0A^_»¾‘†èÎ5^¥d_'RWUˆ½ ÌÞˆ† º.c¼ïmŽÇ¸~K+Дî Ä3Ô÷;ÜÛªn`Ceƒ 8îAÝ—æ)°©"¶ŠbE¹°žãàÂ$˜€&'bŸÀ@ѬTwq1j.)g±¹ü¡Dv£J†‚¼¾úF&ñAgßJGÿy—Xê5bo³7¢!èt«2†wÒŸ ;RØ÷Ãå)§;‡xªMLÃv£œKǃ§²àýA:æ)ÀTñTa¬W,‚§K@ÁIÌÍJpQÔ<ä%¬NO0¾š+7¶©Á„8*ô9IAjQG)#õª ±7ÙÑà:MÿøÏ:ò(:~’tûù"(žª5waeÒáN«¶‘KEiN`‘¦Óiš‚Z*ðÿ(TU”+ª 'Äõø…¢y>EÁRcœ)‰¦2µl1øðp·UCqTÄçÆ}©‰.Žßbo³7¢Eˆzì‘â"úySÄ÷ ÇÒÅrsç’íÆ&²¿ ET+ÄPÝ¿O µT˜*b«W,Œ/üú¦‰âD<>Ä“Ôì,\ùÊN_$ŽÆÐha°›µ"Š£|Ð+»""Jôè’"uY…Ø›Àìh`MÄFMÎñù~Àò¹¼ØÚz©LJ»ízi9](¢2¡—‡T`©ÀTqTqX½ÂdZ¼à> Ü=‚ñøO8Çísø"Âf› 9}éõR}kLP]*¬ÅÂ^i¥àõÉ‘º¤BìM`öF4¨&Uÿ› R|ÉÙhKwCòzƒ›ÒÈHTKë«ñY £~™@Eý?L•€âê |÷_¢l]Â(Lˆ&‚ÓuHñžˆÇ‡ƒ(¨E9½¡Èêz©ÚÜÙçÞÈbßÓJÛz%Eêbo³Q€¦&âôM¤mV)EAsé¡h*W©µ  t|´Î_& z¡"!fê±Tªk×DT]!N5—)NäI"%Êûáý2-v§/œHå+MœÄFÎßîv£’O¯F>—ÝŒ/àNÜ?Lâ À“uM\OÅ} ð‹"œ8žÀ@Áf»Ëˆ®¦ó•Úö.äF ‰ß¬ä³‰°Ïm·ÐìyGR¤^R!ö&0{#HüÚš¤ã7'Ë¥›¬vˆ§xÿ ZþZõr •Ïeƒ" ©æ‰¥AE©ÂX]š~H7Æ ñ$…<>°PÈå[6˜Ïç •+×·v°q<¦gÔïvZMFÅÆ¾žŽß‹*ÄÞfoDƒh’ŽÀ„‘·¥¯èñÆÖòµm<¿ìn×*R…¼náhjÏrXQ®0Y¯Ó•7F7 J¯Ão&'Ø÷¶f7š¬—7„‚¨˜(ÈK Š÷¶kùµXAl1éWÔ%Eê‚ ±7ÙÑš¨g=à©;‡ÞÑá¬)Ò›„ •Óí¬¦aŽï7l,U1›ŠEüòÄŒd÷dD`Åqu–Ÿw®ž…G1Lˆ&ŒÓ ¾d0ä$L»ÃãÆR(ˆª·vö‰« N_!½ñ{‰‰RE”©Tˆ½ ÌÞˆú×dƒÕÁN­ë8@疋ʱ”‡}é¸@e±9}¡èêz¡ÒlïaïïYªfµ˜M'"ŸÛléeÀÆj"+Ä€…Ñ’?0Aô4ƒÍõ1-V‡y|‰T¶XEꀜi¯Ý¬”ÖW£!ŸÓAO#í=ïò$H=¯BìM`öFÔ·&œþèܺŽ#(l¹Ø©91R|âTÈùË7·Z„)äýµÕb>b*¿ÛeGæƒKÃÍqÆ cE¸éÁ‰˜'r±`8òøì·?I¦Q DÔ!ªµµYÌ­Å‚~· ¼+K‹¹¾“‘zN…Ø›Àì¨_M:¡:8R’Cœ„Ô Î, 2šmàüÅÖråjsCY«Y+ç3k D•Çé°š‘W¶Bâ ›+xKWüÀ †iŽ×Œ&³Õáôø‘…ZËäÑ)Z{8ˆ:ÜßiV˹µdÄïvÚÌ&ƒº0ªÓñ“¯0Q{˜½õ§É—(9»NòƒÞì©9©¡2YmN¯?’ÌäJ5šû²»]¯”0UÁ€×å´VàŠÌü9 K®9 ¦É8Ù.o I¬fò¥J}›8—T{»VÊe’‘ × ÉEâô©#JCŠMœ¨a %º0‚»-îP@Šèf°b6Tíý2éQHÕ¨• ¹t2 ú¼(ªBašû+˜*…µLœéƒƒb ,6›Ãíñ#1äñÊ5äòQ`öÛÍ:2Q¤f1ôJ^¥¡w"õŒ ±7ÙQ?š¼Rœ:c©ŽxŠï¤0"kâò…°¡Â!¸fàÞÁT­gR‰X°r:ìV X+LBk 肛˘%°N«Ýît{}Áp4‘ʬÊ(„ÚÙ;8¦Q¥B׿SÉ…jQ¢qJÂ(ü|CDâ®22MúÏÞ)&ãÀšø›èc’=5åHuf+Ωtü¬¸ÌŠxÜÞ`,‘Ηª šã†LPµYÙȯ§Wã±H(€¸BN  ‘e2\œÐbÉbµÙ@“?‰ÅWÓÙüFe³<¾zÈý½V£ZʧWcA¨}YH¥Úéë°R ž8Múï®(öFtjg¯×“‡1øk¥“Iþ®T#%¨––õ°ÇÎs'ÓëÅjmkgÿ€˜* ª½U¬r™Ôj" ý~¯‘åpØí6^v»Ãát¹=¦ ¢)‘Ler§j}«ìvøîïl5ªÅuÈ&â ½¢(‘‰RC”)åý¥šü^.öFtZ1BÔ°3~X©9±ó·´²BjGÞ`4™Z/–S»„)H% SµÕØ,— ¹l:•ªB¿aåv»\N,— Ýœ!°NÉT:“+”Ê›&røPEˆ:@DÕQ©d4è'&J¿"&ª¤~¡B üåeboD§扅w1¬º”$ž’<§{]J¹æË*H(˜mv—7ާû·YßKuLLÕ!²U-X!cUȯgÒk«ÉD<DÂáQ8‰FãñäêZ:³ž+ óTkl·'íæf)¿žŠ‡ƒ^—Óf6ri >ŠêRÜíU—êuN,üé¥boD§቉71`÷gjuƒ!%³T |ÚB*—ÇŽ&Ó¹2UU«ýÝÖV³Q«VJ…Bn=›Í¤ÓkDéL6»žË6Jåj­ÞÜjµw÷…#ž¶jå\:û=.j¡H¥`¢4¤X‰íÙxo›Uöþ¸|º‘fƒQ(Ì"K…â }ž dhövÛ­íf£¾Y­”7ŠÅB!ŸÏ!åó…B±¸Q.W7ëõæöv{w`€Úƒx Y¨µD4L‹ÇÜÒ×%u®Þñ{B…Øøã‹ÅÞˆÔKÇQÌ!%f $Ô-6§Ëˆ€¥Ê—ªµfkwïàaõèÑ#ÎZ!sÕFhm5›F¨Ñlnm·Z퀉P/÷v[MHò…м§ÍÂù|§¢ê~m{AŒüõEboDªÅQŒ ¥àüQ¨ ¡‰ » J´ñäÚz~£Rk¤á„ž#ŒÖþÞÞÞ.úîQÓÄч¬ÚV£†"°õ5ÄS¹|vhÄ5¬,wêtÝRã_Ñaæ Œ©né ÅÂ/•›*D•?Ž'Rº«n6pt^ uçˆ/(–øayµ[§j©Ù÷xxe¢mMj‹»÷¤HýD…˜ùûóboDªÄEóì5™Ë tŸª¤ø"ÕŠ^oKåôx¡H|5É¡^ÛÜFÆjÿà@ŠÕÃcü Nˆ'džP̵Y)s™ôj<,”Q J8³Ä@) 5ש«;€{#R!…ôØäņ㧠iLÅõèÙn0UÑø*ت"$PÄñF ü9lVšã¨>yÂHÝ!õbk€Ø½›ÄÍG, {\[c^¸|ýæû°°/Q²ø¸ 7–Û±r{|èÞ‹%V¡E »¸E„+Të€Rj5¶Á€ÏãFæÉf/´Z 0õ98¬™÷îH}_…šT쨻XŠhôHýâÙ^¹zãÖ]ºÊöôš!š-ÎåÀ‚.ÇçGh…#Ñh,O$I$ô#E£‘0B Úÿ\ü:Î6‘åÀ³ôð}Ž,%¾wç–€Ô÷Tˆ¹y0EHI—Ò°7îÑ#õógž»øêÕ›·îHv…ÐÉ·‰è*Ø?BwO¶‹Ä¾>o³¬Vi;w»=Wçõ¢ÐCëD ÙlV‰]¢ ëé¢zþèjÇ£4òÛ¯ ׈×ý:ƒa(¢öIˆ¢öè‘úÙÓϾtùµë¯Ó Àè:|ƒ»wGáÿl$°áF‹Ûžež3Y,²âU:²ÆÃ ‹¨èúD¼{²K³ü^e÷ø-•èÑ¥'%ÿÜé¼§“ýïvvS¸ µîOTˆ½™ÀÞˆ:Ô±tˆE ÆÔO=óÂÅK¯^%;¿rÒÝ8øgsû]Þâö޽{Ob¹ðºøE^ÖKã$ëÐ ÿî}4¹]4 ¯ëׯ½&\×P÷O¨{s½‰¥´M ÆÔO~þäù^¼ø ½ŽwÀ.WTñ°è:²O³°G3Ù Sw›Û(“ßÝvvÖI.F0”±\! ¹ôŠp-Ý?®BìÍöFÄKwN(VG^Ïžö<Òý£*ÄÞ„`nD‚¯×14–Rßûá~òÄÏ~þ‹'%Ò=©(u [8 ÿømRžæ¥n>Íÿš<›jxc!ú…°¨P÷¨{S‚¥éÎ)¹züo™jHî úc?µ‘Ž^¾ëGÄàG'óÔ4Mv"èΩúÂañ»¨CS0DMãÐdl§Ž3KÔ4õ~2û@±éhšˆÆ8tçÈfFjQ"/šš©:-ãÔ4bx"PpèzAúe®z—°©ú‘j©†>t4swŽ.d¢¤Sâ1U<ÓÒD5àDÀØÐ,}„‹“¯>¡ö°S†hê¬i4Rœò±lªóbËמ8ŠPÓ]CJ–ÒìUxL'úÿÀ§ì5šÑX' )McÓ&‚ò)Gš‡~l‘RøÔNøÆÒõ¸¯âè*žvBSƒÒ¯«¯#C_É㊔®óĽ&³è_¥û*Ž®æi½_¦tÒé œ{©ÿ7Ó÷+EÓÓÁ4ѱŽî¨s~öŠiu’*‘:ù}Éž&?Ë ƒ8wŠ¢Êth2Ó´¿ŽG )åSJ-„z¤ïžôtµOSÔp"tv4¾i:x÷°†”ò)G‹Ô‰Zŧ©u€Z ›Ù4íÞ„?Žù=¬WNR½§§"R'>½/¤Né}>^Hi–Æü÷:§fzö|ºÂ=¥ßŒ)•ñš&McQR½éVBªÇd –RÔñ~!iÒÔ[ý™]çCê>š£j@ibDJnÓiê=•U:eOëù )ML‹‘D;6œðlÑÓÕ ³]65±—ú1kÒ4^ñQˆªé)y¶Š0FeŒ£xØ^Ï–6 )Mš4iÒ¤I“&MÓ§1:V/ŽþԧМvM£¿ÕÊØO¥²Oã:åèO¨éÌkŒLÙ\ŒtÌVhbOcl°RN›ŽòÔŠU} )M#Õ‘:§xøg”Uõ5¤4T*»¸Fwª1 %­jHi©&ŒÔh“RšÆ¯É"5âÓÊ‘RÕÕ¦IÓ@šh,5êÓvô¾i+s4\“Dj u^…óh/Œ?¶0G“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4 iÆš4 WÚšMMš†+­m_“¦¡JCJ“¦aJsü4i¦´ô„&MCÕW¨jÒ¤I“&Mš4iÒ¤iTÒ\zMš†&V!Ѥi˜ÒpÒ¤i¨ÒÒ¤i¨ÒÒ¤©?éèåFu¢-øè-á"Ò'hÒ¤©»t₽®ãO«ëkÒ¤JTtâ[ €iÒ¤é$©Fêœæ÷iÒ¤Bê‘’ÜФI“²$ׄÒb)Mš•øŠ…:äwO'¹§I“¦^_²3Eô–èB:ôa(Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤I“&Mš4iÒ¤IÓh¤Ó4,MúO©‰ õ?ú~åø_8–SjHiÂb{šé…RšÆ'¶§é^¨!¥i„Òõ¼ÛÿX~¡†”¦ÑIEO`"<¦§Ô:›Ò ÏJ 0†Çò”RgRº!:~ƒ âq<¥†ÔY”pNÉCÅcxJ ©3(¥kFkaXÒ>ɳ'è_áA­ö? ´OðìJño¦'ÂPßü™þ$Ï´vü£¯d )MCÐPb©ÇdúLRcëÿ´N÷†Gý±Ÿ¬a ÅÀÛ††ûç=Rç¯\¿û CºÎ‡Nÿ0CG¹/ õÿ©sqH1ñÕ0MRϾzóþ̬\ºŽGúx˜£Ì<ú‡*¤æc¯9ëÓñ{,˜š6¤ž{íõsÒu>tú‡:ʬ€Ô?P!…½ã!Å\÷ÈÔçyNõ2Vù›:¤®Róès¢:r{~^úCGnÌÉ~è”ìùñX. QöC'+óCAªãϪ“ý±ºœ†o1¥¶SåèHqùôY{¥'Éw·¡©×Ô!u+ÕEjž=/H'º=?œ£ŸôlR_…L“Hq“M×󟾎Þ/RòÓö7 é!§ ©«#Gj^&üÞ\ ©¿§B*bÀñÓñ£Æ"½¥vtÃFJô ¥¡Rg)E*f°‰tôç"y´Y=ÜÇîcQЀHé”þ}ëö£žŽŸ,ѧð²F‡”òÐN§3ŠT‡D,!x–––—WVôz½IÿЕ•å奥%WW®†ŒÔßU!… ¶ÒìgÆOùd½êqþ¦¤§ÿJ§ð<5c: ©¾ú@Ný’®G߬Kz‚ûÑ™,PÌDÌˬ”ÀO“Á`4™Ìf‹ÅbEB?Ìf“ɈÈB\a¬ªÄêyÆÎJïA†§¿£ .¥Þn>Ô™:•R-þGÀåœüé’·)᳨¢´ƒÅÎPS8È$‘¢#­º¤'‡¢ Á„H2[­v§Ëíõ¡p8‚‡Ÿ×ãrÚm³ÉˆÉ¸îˆ$Hým’~ì==¼1Q5,¤d€È‘’Æ@ ¤8ªîHÑÿÎRñRbœMÈ0™,V»Ëë Fbɵl®PªTkõFs ©Ù¨×ª•R!Ÿ]KÆ#A¿Ç…È2!“…¸êÄj¨Vª¤hSê#–êú\õH o»—ßÙ}Dòèú"j¸L••âxZÛd¶9Ýþpt5S(Õ¶ZûÇo¼õö;ï½ÿ»ßÿþƒ‘>øà÷¿}ÿ½w~ý«7Žövš›•|&ù\N›Ùd X ×X‰ú[*¤nöŒS“Aê¤1tuü”‘êñFzhúRLOô#(0O6§7IfråF{ïø­_¿û»?úäŸ}öù_|‰õÅŸöÙ?ùøƒß¾ó›7ZõR!“½N»Å¨ ÎÈ$HýMš2¤:<´ÞH2–êqÔ“­”º¡õÔÙAjžÿßž¿·¢7ZìN_8¶VØlî=|ëÝßòÇ/¾úúÛï¾ûîOÑß~ÃKxè«Ï?ûø÷ïüúán£šO%B+3ÂJ‘ª~{Ì‘Rù€ÑñOÒ)#% zä7¨/xÒ¨DCÑÉîw½tvOtjŸVô&«ÃJ®ëÛG¿zÿƒ?|ñÕ7ßýéŸ"j¾þòs°ILJõÁ~üñþøéç_~àBÏùæëÏÿðû÷ß:Ø©R‰ Çi5u¡jP¤þ† M˜€”(KÒ5æÓ‰xà‚É‹„€çœìŽKÉ®`Iz:T ­§¦Ev¾ IDAT©þÒb¢—õF³Ýã¦76ÛßzÿãϾø¡¯¿üìÓO>BÁÓ{ï¾ó›ß¼Mõ›wÞ}÷ýßþîƒþðÇÏ¿ü ?óë/>ýè½·[•âZ$趙ؔ05„ôÄ_W¡©Aj̇˜ˆ±f ©n•8ÑýAÓ¼…2˜íÞ@b}cëèí÷>þüËo¾û1òÙ>üÝûïüúWo>zx|txpp°Ï Ý>8<:~øèMÈ[üî£?|ú¸‡ß|ýÙGïþú°YÍÆý»ÉÈYªA†(Eꯩ†ÔHrÚS2„”®ãð¾­”d$Lvg ‘+·½ýÁ§_}óí·ß|ùéÇþö·ßzt|t°¿·»Ón·Z­m‰ÐíöÎîÞþÁáñ£·~ýÎo?üä3v¡àêÓß¿ûp{c=îwÛÀÿ“ºZ©¿ªBR ‰%¤$Þ2}d¨Vеb4;|±T©ýÆo>úü+dœ¾üô£Þ{ûÍGÇ&`iêPõÚfµZ­T*e$ô£ZÝܬÕ­-Ä€uxüÆ›o¿ÿ»?$¿þü÷m³Q¯ÝbX!þ_¿Ã”"õWTˆ½Ù§!5¼Ã übä‘.Vªo¤—WŒV‡?ž/ïüê÷Ÿ|ùí·ß~ùé'¿÷í7ì#ãDxª!–JÅb¡§*‹%Ä©þn·¹Ú?úíÃf~-䲘ô’DÅ©á!õ—Uˆ½ Ì&ècÑ‘ôSÔÉ~*Öú¶RÔB™ì¾pz³õ柅øôÃwß~ã¼½ÖV£¶YÙ(æ²k©d< ~Ÿ×ëõxÿä½J.êq˜õ)õ“%ïÏÓýï*ÄÞfoDãËHuf+Îõ›ž &Jorx¢¹­ýwþ€ˆúò³ß}óÑÁî²OõÍÒF>“JÆÂ¡€×ãv:&XÎ :¨à¬ô¬\./ŒÄWSÙ|±¼Yo‚©:|ôÖ»ýñ«o¿ùê“ßì5Ö#~»©ÿJd¥þ¢ ±7ÙÑ¸Ä RÒÀ\îLž2‰Îµ€MT"Sø»O)ùò“÷óÆáâ©Y« Y„SY'dœa²ÀÊ(#Yuˆâňd=¢VQY‡Ëã„c‰T¶°Q©5¶ÀR½ùëßþá«o¾ýêãßmâ^+g¨8²ûI¢ÿbo³7¢q‰%¤û‡`¥€¨¥e£ÍYß:xïÓo¾ýæ³OÞÿÕñánx*åÒÉx8àó8ív°L·~WXo-qk}ay"²YVd¯<Þ@8žÌä‹ä¶÷öõÛ?G§øã»o4³aŸÍ¨_êÇP‰úßTˆ½ ÌÞˆÆ%ö’q5xz›¨ƒÕÏ4½óG4Ý?ÿ…b¨­z­\X_‹‡ƒ>· ™'l8žå]¢eŠxÍ/¢ Œ•Óã Ek™B¹Ö@þßþÃ_¿óáçß~÷õ~ÿ°¶óXL+ý8"¤þ¼ ±7ÙѸÄRâ­º°‹ã'ahNÂÒ²Áêe›ûï}öÕw_ÿñ£wÞx¸\¾z¥˜[‹Gƒ^—Ó8áUðˤMonvffæÁýû÷ïñBwÌÌÌÎÎÑ%Vˆ+‚•ÝéòÉ4²TõfkgÿðÍw?þô›ï¾ùôݽz:è±èå…ߎeú’·"wüþœ ±7ÙѸÄRjNp:+…‰Ò›¡Déàý¿þîÛÏ>xûÍ#C57+…L"ôº6‚Ó izƒí“ïß»{çÎíÛ·nÝzºsûö;wïa²æp_Ù¢Âb±!ªB±d¦PÚl¶Ú{GoýæÃÏ¿þî«ÞÛÛHìàü-œÎP‰ú_Uˆ½ ÌވƥiEªWh/’è3Úݱæ[Ÿ|ýí7Ÿ~üîû;ÛÍÍÒz:F”íÿoï-˜[K¶6¼ñOHêû.ÓܹwèœÃffÅ,³eff±ÌÌÌ–´u“ 33VRI%•T觤»7h“äm[Ð:³ßššs¤#k·å~ü®µzuo½V£¢6¼WWUT@˜Jùùyy¹¹¹9@Ù@ðOð0//?¿ U^^Á`ÍÊ`nhlëêžñrª“[‚žoøÆìƒJQÇ«R<ò ©ÿO‚ð›Àø(YJC¤žPž £ô ­Cî•Ó@˜¸;=ØXòzœó³C½]h£»N«¦¢Ü©ñ”K²”ÅIÄ Rݪ²2tªÆ¶ÀÔ4` Õ=~8ÞvÂà•ÓŸåRÿ¯á7ñQ²”†HI+¢SDÕÕ«ŒÍK'W!âîr}ÅçvÌO ÷Ú›-FñAžjkA¸W^VRiÞXÊÊÌÌüôéÓG¨è? ðħÌLÀ rURR½ŠuŒ­¥£op|fÁáFupuG„îÇúš ÚúSO+¢Cý?1„gë~#J’Äú^ü† •t—"£ôæ¶Qßæe(¼ÜßI”s~j|¨»£Åf2ê@ý Øp§¢BàMÀ™² K¢Þ½c >OC´XÙ$VÅÅ¥å•Õè µVްèNRª•ƒ« þÖ=í¨J!½òÇBêÿ– ü&0ž 'AqE*™GcJ! eõKSÿÂöI¤QG›«~·k~zt¨§½$Q:xˆÇAA‚ö”Åâ bô–% +’*ª\°ªJÔ?¨T£”ªÉÞ;<6³2ªµ­ãÛ@øáhs®·Ý¬AùÔÓ‘ú¿$¿É‹ßˆ’¤tt) å Š(E½ÖÚ5ä9¸‡AßÞšßëIÔ`wG³•Šr(hPy$N&ÄDè ÐÏ,ÁÇoZ,hVÈ«`©‚gYÀ³–L úƒFµàò.®íŸÜÁ»=×d§E«b O)OüŸ„߯oDIRÚ"õ¸GÁRŸ®¡w~ñ$]l/{]ŽÙñ‘>{SƒINµ¬UVR y"݉ĉ„ ôҔЊ,Ò²VÀ­HªJË+«jÐfZàTÍ}Cð<@ßÊúá j¶ÛfTI.RÈH¥«Ò©ØÕsr}Wcnìwî‰Û‹Ý•Ecf3‘"¾ Ax²'Òœ˜E?z DþF Å Q¬ –*Щ€FSC«½otzÎéñ­î]ÞÁ›…Þv“ZÉZõ•èRÿ‡á7ñQ’”ŽHI(O€Y ¦¶¾©crõâ.8;\‡AßäXG[ƒY”¢¶U\T ð§·$P,ž^óDaê-ˆSÙ9€©â²ŠÊjxt-¬¨76wŒOÍ»<‹GA"x¶<ÞרS+¤Õ(XHýï„߯oDIR:"Í¥"‹!¢4†æÁéõ«q²¹êƒAß@O[ƒÕH&Q5•åe0äËõá=íO M€ŸW@ß³ŸxE‘Eq…¼Š¢*'/¿°¤´¼ î"Qkày›í½ƒ³ .ßÚÖéC(t±êh2«L#E¬ZºŒTº*‘zÔ¥P¥±4y7¯‰àÝцß뜛…gíõè\XäP…(äCͤ‰„ "ôÔ·ŒÐC -+èV*ÿ«ÊÍ/(.­¨¬©CÅ?£­ÅÞ769ïò.n_C—‡îÀ”” ©ÿM‚ð›Àø(IJG¤+O@ªSš»f¶ŽÄíùβ׽0=1ÐÙ ë¤EU”!¢23I‡ŠõŠâ‰$éJ W4T¯i¨€U!§‚Lå—£B÷-Лš;G§ÜÞ•Ýã;âáj}j°I¯T< ©ÿU‚ð›Àø(9Ý7ûòwL¤b•'¢@Õ<<»uÝl/yó“C}öFxG¬óU”– ‹úD9ÅÓk' &ˆÑ×<Ñh!°H¬(ªS}üªìÕU¡àÏÞ=<µàô,¯ÞÄÕ†0¥VÐ% Iå‰ÿE‚ð›Àø(9J_¤b˜TMB­oòmÝ¡›ýU@ÔÌÄ`g›Í¤ÓÂB_t¨àP$PÀ ¨€/‚Óß)ý ˆþ;M +†*U&„ª¤¼¢­7Ám'gßÚám€¸:ò 4šÔ‡~¼†¤˜8aÙ§€ßˆ’£ôE*zïyMmÚÜ4è=¾!®÷W} è°7ZZ`Qµ5•eÅEù¹9”CAƒbñDÓDƒõ%ú1…¢ D€4Tï‘S•”WU×èUSÇÀÈ´Ãå[;8 Cw»IÅîMzÌ¥þg Âoã7¢ä(-‘ŠYž@²ºFûÔæu€¸>Ý\t;çÆû»[¬&½}å%Т¸D€O¨¯‡Št*”S½)U&,¨—–WÖÀ%*½ÑÚÚ301çð,mÜ€Øom¢¯A[ÿ˜O±úŸ$¿ Œßˆ’£´DJÜ¥"½ç*mCßÄúAÜì¢fÇúÚ›-T—¨A_Ë¢@ÈŠæ‰Ä‰EÓ_ùŠ€Ec…¨"ã?àTTô—•›KÕðìu­ÁÚbïŸ^ð,­€ØïrÅÑcÕ(¹}é±\*M‘Â2M¼â‹TrÚfcáÃ>¥ÁÚãX¹$7«€(x£›E¯Q+몫ÊAÐW¢è$Š6(’' '6L_rÄæŠÁ PEZ ÿ¨”êSfʨª Qi –†öþaÀȧ΃¡óݹ.‹¾>Fk÷¿ÿQ‚ð›¼ø(9ú<\ŠYãE½çº¦ÎÙÝóPðüp äQSC}m6# úEååd~úˆêæ, (¢pâ²ôF\²(¬XT‘N…ŠШrr ŠË QàÏÔÐÞ5Œò©ËPèvkÚÞ‰ýDW|Y.õ?H~¿%GŸRÌq.pAJe²úÎÃí%D}Mf=¼™ZMeYIaô½¥ˆzõ †|¤C‰õxP‘VEÅ SoÞ¢à/'¯°¤¬²¶N©Öé-Ííýã0ŸZ?¾'‚'žþv#³<õXà÷ßK~¿%Gé‹T”°O¡4´N¸Žƒá‡ãõ%ÏÂÜx_ J£†¥¾Ò"T— ²(2‰"BÍ›¥?óÄ+bUЩxF…‚¿lX¥¨¬®«Wkô0öŸvxü'"pàmÑÇ,¥³úï$¿ Œßˆ’¢ŒôEJt·¦N¥k^Ú{N7üÇôx;yÝÚªŠÒ¼\hQïÞ¾Ee È¡ƒââÄPô'Z|°(¬èøXéT?üø#üåæ•–WÕÕÃÂ_CûÀȌõ¸y~¾ßñ6UuÑwO±úo%¿ Œßˆ’¢ Öÿãú– Tô":\ãÕí3;çDðvÅ뚟îj†w{QÈ£`¬ôQu‰ˆEÑD1Áž'W\¨H¦ Q¡2íS3a>UZY£¨‡±_K÷Àä¼Ó»zx nN¶Ù41:“XHý7„߯oDIQz"Ås©È"omÚÒ2¶v$.V½ÎùÉî Ì£jk*JŠa©ïãû÷TÐGEZÔW4Pœ"ý‘,UTøŠ þÈÊßÇ̬܂ÂÒŠšZû,-ƒ“³NßÚθZé2Ó+¾±Ëÿµ¥v‹]/#ç·L ¢¹J¤Œöÿ9¾Ù[÷9g§;Z­(ªª()̇… :¢ƒ>(O|”xâc±*Ú©"FE)J+`ì§5X›:‡Æç\þ•ýÛpèÔ3ÙfˆÞAËkHú¯b“ Œ˜)JO¤D]ŠL¤šG‡ÁÐýáê¢kn|ÝŒZˆ*+-ÌÍ¡ƒ>dQß“E9 ”Nà‰ÇE *dTªQÁ"EV6` äS À”¹¹«bÞí];z ûËCZU]”_Rÿ¥¥~óGú¥DŸR“‰ÔìÒ%ñpµ³äsÎŒô·ÙÌ:”G•‚¨/›)õ½~ýê»Q'.U"LQ)Õ·ß²}*3+'æSuJÞhkïuz–v¯ÄùöT›•NEEê¿ ”O`ÁR>¢Ô(‘†}u*sóØÚQ0t~°âqÍõØŒz²®¦²D}°câíÛ7?ýÄú(‹bñ$BÓïi ¹¢¨"Ã?~ð÷ã?Q±̧*«SZcckïøœ•(@:5ÜhREi¢`!õŸKPÊ'°œK‘Jc¤x.Û&ô­}Þ³{âz$Ró}mM&xêj@T^NÖÇïß¾yC§Q‹BÅáI€O\¬"T1PÑU `ToÈØ/7¯¨¬¢F¡Rë̶öþÉY—oc¤S'®îfl¢ˆíRÿ™á0e¤¾HW¤DʤIu®Ý†BgËž…ÙÑîf›–&*+J PõE}¨ÔÇ!ê/\¢J•€©Håï:öËÎ-()«ªSª´FssÏØ”û²u _/u£T(XHý§į ¤¢dÁCJì–Ÿ½28¼ð½’õ ²]ŠnîC;:ô-ž3"| ©éñÞV‹Q«RÖU•¢`õü]$êc*}|‹Òô;Ž„\q " êTBE2õ]K/,.‡m:ƒµ­oxÆé[Þ» †Ž£ML…‚ÛêÇBê?‘ ‘=ùs9#êƒ_Œâ‰ï='1—ª®®­W[ûý»ÄÃáª×57:Ðn3èÔõuÕåÅ…¹Tõ<õ±,ŠT˜DÁâAÅ1*Xøcb¿Ÿ²ó S`”Zcƒ½g Výޝ‰û-O¯EW_+bS,¤þc ~ì)˜Ò2RéŠ×¥(“Òì³ûWá»óM¿ka²¿³Ñ¤…¥ õå¡Z•G}÷ôQEÅæ‰ÏÐo¡Ä¹¢©¢¡‚FE&T°=éZô}ûîÃûUVÁZSSûÀ”Ãåß:| .v§Ú¬jvKºˆKýG”Ò‚›è<’‘Šó{&NüòªMÔÔë,½ž³{âêhÕë˜ën'©ê²¢¼Ü,Øzó¨HÔÇõ(.Q˜XBÅbŠ þX>ë~0Ÿ‚%ŠœüâòÊZ¸âkkîŸwz×vo·'ή&­B¤Õ…Ô(AB¤’™ÄˆµŠÊHÅù=ŸýåÂ<›ÿ Au"Y[§vˆûÃ-¿kv²¿ ˜L¤*`Ò§ÔzT$êcê| ¢Â$ V„**üý•ñ)²–þó›wï>|ÊÌA%Šz•Îd65çZ\= ÷›ã=f•HK: ©ÿ@‚Ä>öd2%òsJÞÕ1~Hep¡BçCÆq)¦6ÑÖ¿xI„Î7—= à ½º^Q]^ )äQ?þH-ð²-Š•D±yŠ…+6SdU„©hŸB%ŠZ¥Zolì™\ðø·. âÜ;Ñ¢c–)~Ë6¨_D±ªB)îûKéÕS%ìx1:¿<û&T¦®±;"p ;‘FÚ¬À¤µU°k"˜™HÑÕs”Gñ‚>Q|x~CI*vôGT>EÅ~¨D·z›**«ª6e°µŽÍ¹}ë'ÁðÍê¼h!…Ô¿'A¢{JgµŒTœßó%_›í1ùˆq)º€^]«Ò6»O‰‡«íE/ªMõ0‘BÕ>¸ õóÏ4Q0b¥Q, ~Ïçé7Q$J7øcûÔ«Wd‰âýǬ\”N)5ZSS÷À”ý¸s¯4j”Ôd¢å‰W‚d¤°Pïϸ¾é ¾6vžËw)ÔÜgîvoÝ—‡+×ìpg‹µMÐÕ>T>õŠ›G±,*âPâ$ÀŠãTâL}O-O}ø”[PZ^­P©õ–¶®‘Y‡wõøš¸=qt…;§XHý;$Vm“¿¤ W¤b¯o°]Š6)sóøÖq è½- °ÿ¼¦¢¬(7'óûwoG}/F”PáÄ£JÅŒý¾¦c?”Nefå•TÔÔ+5ÆÆÖ¾ÉY×âöQ t·>Òh„gEË¥þm ’‘ÂBiŠ­È¦µ­}îð&|³»æuÌv5ZôjU]uyIl?a4)öý•G ³¨§Šü1>E×ÒɾtrÅ÷çLT¡PÔkôÖ¦î±i'lõ#{S­–Hѯš_pÈø·$H¬!é?‰8HF*Þoú‚¯½Ï+¢Ã5)}ûàòu0x²¶èž›ì‡HJ`R%EyY™P×Äk*‘"‹}l¢x@±‰ùµ¸b@Å*RµôHèÓ)²‰¢´²V¡ÒÂBúØœ{iý,¾ô÷µê¼ –Ký›„߯€êä+îH½ôSAJ¤Ñ†»Ô MÊ:0s ßì,z“#F؉TUV”Ÿ“ùÕϹ‰(Q ¢à$‚•ˆQEò)¦DA¦S ôËÉ+*ƒ}Iz#ªPø–öîBÝÉ^³JÁmHg!õoH~“¿%Aع”0ëå”'à2¯¦qÔuF›>Ïüø Ý¦‡ôÊRX›øˆÂ>¸Æû 2)”HQµ>–G=‘(T£b1EÖÒétê;úý §²sáÖ),¤wôN,xüÛWÐñüMÍëôc!õ¯K~¿%Aø!õ³´ý84žKÕÔÕ;ëwÄÃáŠÇ9=ÔÓlÒ¢zQ^N&]ía_dAê1¢ç‰G›©?0L1%Š¿3«SïÞ}ÌÌÎC}I¹¥cxÆåY=º̵߬£SýÄ]ê_“ ü&0~#J¼20D*Ò€”ñE¤Á}Û¥@ÜW¯¶ ­—[~çüxÝŠj•%9Yß¿Cmt"EûXµ¾HÔ÷Dž8Pý–ûEÊ~Tè÷óÛ·ïa_*¤k ¶`S.ÿöq0t°ÔoÕqëè,¤þU Âoã7¢Ä‹¿¢çwM”8èÕÕu*}ÛìáMøêhÅ3?3d&¥ª¯­(£jhÓ!³Æû%“HEˆŠåP¿(T\¦PìG•(ÐidÕïcV^Q)lŸÕ™mó ÞÕ0ø½©³ŠŽüÄ’þ•³€ßˆ¯tGŠ*NhŒ®³â|É=7ÕßÚ`Ô(5°¹/óÓû·oF;:x&%ˆúDò$F‹)¾MýY`S©ÜÂb¸6¥5ZÚ§çÝË›—ÄÝñ‚ݦæœ=ËBê_– ü&0~#J¼Ò)&î3؆a&u°ásLÁ5)JQ›ûPmâ ªMÐÕ¾/¿ûĉІ“VQ˜ú#)rŸê¡È/„é¨èצVŽ¡›å6nä'#•†Jo¤(—ªUY@Ü _m­¸çÇÛ,F¸ñ6÷e~  èßÃ]‡¬5^š(^Ô''q¨èجû±Ó)¦ê÷ªPÀV¿Šš:¥VoµÏ{üÛ7áàÞd¯™î à»Ô¿$AøM`üF”x±‚õD¼k¢Är)ÔÞ×Üë¿"‚Ç«~çÌ`Oì—­©*-&k?‘ݲT³l$‘ŠaQ’€âRÅ5*v:E­øR ¾?þHÚTn!ìHWkMͽó.ÏÚiˆ8w5jêXutRa Âoã7¢Ä‹)øÅ5¹M¦KA¤ô탫· î[q_gƒÄ}°Ü—‡Ê}?ýDÐ#µ aiâÙD ˜âÅ~”M!¤P…‚jõû˜•So= Ò»¦ù׋Ó-ZªƒU^d¤ÒOLµ:íbŠèð.¢æÞ©ý`àjËï™ënƒ-赕䚵ʩMÄ0©ç%„Šúý1ÒDAV(~ +hm C¡·¶÷Œ/¸wnBmO—QIéÇu)B‚ð›Àø(áb›Tz!E~tçÄ9q{ºæqÍ µ7ÁßÔ”—¢5)*“úö[Ö"/ǤD ‘ùgž¤1õ;vèéK¢m vÏ–UÔÔ«@ä×1<ëð®Ÿß'k°ƒ"R `!” ü&0~#J¸Ø&G¦’‹H¥¦ü×hQÊ9=ÐÚhЀ¸¯¬$?!'h“ú’U›ˆB”)>PbP‰Æ~LÕ“MQE¿÷ÑroB©16µÎ,xVOnˆ‹mL±š’XH$¿ ŒçjYB•¤’y4&Bª®ÞÐáÚ|î.ºÆ{š,:µ²®²´(áB'¾ù†oR‘°/Qb<‰QŦ~Ï®P…t¸Á—Z›Ê+.Eutksïä¬kiÿœ¸;™o׫>'¤R=€ä+í] 9aé_>"¥æF:l°s¢¦¢¸µ ÿü3³&ŪMMJ„¨è8‰Q%žNÑ¡S¡ l 5¤ÃåÞZ…Jgnèrú¶Ž‚Á+I9Ö……Ô½á7ñQÂõ U[¯iß¹ ßl¯zæAÜg6h” îƒtʤ^}Ç«M©gŧ*S¼B:µqŠ\î-‚‡%iŒ–ö¡ñïÚî]øacئ¯C ê.†ð ±ðQÂõ9 ¥Ô¶LÜ—›Ë¾“n”*…ôt…”xmB€”4¢¢!õŽM± éÔ&x#7ÔA#Ì­cóž¸Ú»3Þh¬göË³Š…ƒU¢?ö' ¿%ZEq¿9@2‘ªS:œç •Z]tÍŒw7ÂE©ÚŠ’|Ô9ñ3Õ‹D¯IE©M<—(TØÕ=Kuú½y‹:(ÛhÅw IDATJ*«°)©g$Sëçq2ßfU‰!u#AøM`üF”hqM* ‘"OFê[º ¡uÞÉa»U¯…ÍHEy9ðX$ꜱ¯…«¼B¢ž”TbL‰F~™9yÅUuð4çÎþ)§å(¾òv7E(XH]K~¿%Z¤âÛ>‘T¤tÖÁµ{â~oÉ»01ÔŽÖyA*•K6#ý‰û¾ä¬I±zGEõ)1›¢—{¿ý õöçœÜ¢òJ²Ï¯wÒá[>xß,õ1 ¤®$¿ Œßˆ­ôGª¦¦ÞØ4¾ _ÃÖ‰Ñþ¸·¦ª”Ú{Hm”bµ Sq»€þ2¢¢Û©?Ñ éäTóû˜•SXZ6÷¶v-xwnCÍ‘}½R—„߯oD‰©¸}‰G ŠìFRYÚæŽ â|Ýëšêi4jÔŠêŠâüljï!÷±Š¿1©gņ*–M±–¦¾'—¦>feç—”W£ÖYûðœÛ·yLõšÈž$î¡c„߯oD‰©xÞ9%‰.U§nèô\†ƒÇ+çT§ î¯*Gë¼pïáë×Ì¢”H]ĤžC˨DmêüȬùÁS2‹K«à~ù†Ö—wíô.|æ²2%±\ê\‚ð›Àø(ÑŠüÒ)Ôà×Ôã¿—ÝŽÉ^x脲®²¬mç}ìó~õÕ_£'~4¤þò%«)éç7 ™‚ûå«êTjƒ­¥ÊéY9¾ _ºG˜6?Rg„߯oD V¤iö‹´EJ¡kCÕ ÔÔÝfÖÁC'JÉÖ‰7ä:/ÕŒ+î‹öý[±™ŠžMqk~TŸj Pªu–¦ž ‡{éà2|»4ݬUÖ :• ü&0ž Ð +î‹RÉìñC ~c;ÁÐÍ–ß97ÒÑl‚gÌ–— ò°u‚½ÎËiïϤã):UB¦Xݳ\¤"ÉÔ§œ‚¢rØnnè›wùwN‰À†#ÒæÇBêD‚ð›¼ø(Á ¯O iHÁüº'öCÁ«MŸcnØÞdÔ*É.tÔ„öupKèxR"@‰CõRd'Sß}G#{’Ð[Çè¼Ó¿} n»: ê:RÇ„ßÆoD V:#•E"¥PšûgOÂ÷çkÞ…™Á¶ƒv#‘ÝHd*Ïœ`›ÔØÅ‰ç%UôÈÝ;K’‰î9€ºÑ ˪d›ß¬Ã»q {Lj"¯Çï(†ð ±ðQ‚•ÎHQ.¥PÙFœÿ¸=YñÀ?lð«,)dº‘X%ôHܵ‚.(¨DmJ|µ7’Leå  °ÍozÞ³¶{>Y°Ðç$±:” ü&0~#J°¤È¿§R”KÕk'|×ÿ¸:\rÍNÀ½R°Ánì@H¡­R,¤þÈFJXAQј’ù‘{{Ñü’ÊZ…Zojs¯lÝüãbkĦ"u AøM`üF”XEšf¿H?¤H—ªUjš§oÿq¹Oö̤êj*Š r¨¼n$N½ï7‚zßÓˆz©ßH@ ¶ùÁ=SƦÞÉ9÷ò&øí°;Ö`¨ µ/AøM`üF”X±ã¾´C*‹BJÛ:·z>Ûõ;§ÇºÌdÏ,yÚµEþïôBHÅŠûEêŸD‘ŠùEŽ  “)´Á#'¯¨¼¦N¥34vϸ×/÷SÍ&¥©= Âoã7¢Ä*­‘¢\J¥·;7ƒÄɶÏ1…vô¢žYê´1t4Òã%ôçÅcêñdЬO¤¾¡êïÑq~Õ°s¶¡klÚé_= ߟ̶š©…)R»„߯oD‰;•JW¤Ôú×v0t¼åsLŽØ­F²–Ü~H"ÅÚØ½:!Š”¢bÙTÌÅÞoÈ=SïÞÌÎÛR6¸YÞ¿zJ<œÎ·YT¤v$¿ Œßˆ«´v)2ð«Ó»|{¡àṳàAmè¹YÔmÚ¨ÓÆ$!õt“ŠeS‚£’8m~èóô ™U #ÔYí#“ßÊq(xá´Û„HmK~¿%VìêDÚ!] Þ²ÃÔ»tH<ì¯{ÆÛÌu}u%ÚÑûŽÜ~ÈZè%Ïq‰žJ=ƒ(q›Gе2EÖ'àý>fe¤jê5:KûÐÄ‚wù0ºòt6Àµ^îi³[„߯oD ǤÒ©,)­¹å8|¿·æ™h5éÕŠêÊâü )Ô;ñ7R±ªÏAJÔ¦b·ùÁ=S_ËììÍÎ/©„G£›ÛǼKÐnì­á¹Ô¦á7ñQB•ÞH‘.¥ÐYVOÂw»käþC=Ú,•‡R,›Gêu©jÔâþq»ØÓ¬!c!µ!AøM`<{:&ÖÎŽ/âˆT’Úf³(¤¬Cë§áÛUÏÜ<I¥¨‚H}úÀ3KîèQC«NH%êyHýýkrD*+¿˜D ’´¸wOÜ.÷µh.µCxN^üF”P Šß qâûIŠÌÆ¥ô¶áÍóðÍöŠ{n¤·Ù¨#÷fB;;~ vv0;zYÛ ½Ï2©g#Em–‡[¦Š+ R¦–þQ€Ôîq·ÚߪUð]jM‚ð›Àø(¡âT'(—ŠÓG×O’!žýíRzÛÈÖq½µâžîm¢Ê¥âŠI#¥w"HE©Oˆn–§ÎŸ@HUQHÍyü;·ÄýÚ }3DR+„߯oD‰T†©ø%SQ<û½¸ïB#UohÝN%RRêQ¦8HiL-}#Rë)C*î±ã/ )ê„#õÂÏ5 RÙ4Rc;—ÄÕÖ²{v¨!U)‚Ô—ìÍR©Aêbk½©¢ xü„©™Fêa}¨]ˆÔ²½ô—W†às~©~‰H1%©—åh¹BjS)þ~©Aêw U^UAê†xØj× Z” þÇüÄŸgëÿq’ŒTÂr©¼ñ#.Õ˜þHq\*ŽH=µâ$úI?Abe¤ç¾WZ*©H½*q¤hEAêc:!%æRô÷Ç|Ã~ ‹·“‡”Øõ~He$ )tøæKÞëY¹H=žKÕqr© ±\Ê+AqAêù&%òå¿(¤x&•X¤2^ðÓúL*~B¤Ø?·â'‚”G‚Ä>ß§|æ"¡ÛSõKG*ƒ‹TÜÖz¹EtVøòü÷Jw¤b¯Kq]—z&ROýÄe¤ž/©h_þæñ’Xm—Õ=1BwO 3ݹ©íž°Ô»{b Uˆ-—ˆ˜ŒËOâE“à—\ž ½4@JlXì¿3ØãçžékŽôø½Ç¼Çï;¦Ç/ßãw'Úãç” ‘6¾?ˆG%RÆG4™âçNqA*iŸ «}l›u Úfþ‘{#œ§ •øNôWüNt ©âv©·Y+èDR©&êåR‚pv)‘ Ð.¥5÷¯‡ïñÝÜ!e¿T5{¿qãïÙ/µ AHôáÑëÉH¥RÔ®^-¹«woÝ3?6Øj6À-ˆ¼]½‰D꟣"ë¼YæÔ±w3¹»z—à®^oW£pWï¼¥8‘‰O*—¶ÔÌÓ )æì‰nß>8Øð.ŒµY jÖÙ?òÏžøcbÏžˆ½Q^ìì‰wÔÙõðì‰axoQxö„«Ã¦œ=1'AâËá‰þY0דøÜçªÏ)µ¡Ë» n’ǹÉã\ò˜ã\{B’ô‚ÿ„¤,ò„$€TÇȔ÷rBÎv«ð8—Y JéÍ£AH¡SÐÓ©È9~®-úбtèXªÎñ“˜JÑçøýÀ=ÇÏÖIã÷p2×jžã7#AøM`üF”0 {%Ò )ê´Y•®m~í8Ûñ;§G;áјuÕå…I:möiGcŠž6›‹N›ÕÒ§Í^„oái³¤¦%¿ Œßˆ&I¥RÙÌγ+÷áó½EêgëçŸXH‰Ÿ‰þ2¤DMêq¤XwëýÏD¯QÀœ{&f]K—ÿ¸ÙŸh2 ÏDŸ’ ü&0~#J˜>—ª©×4MúoþqyÀ»sÇ'òί„wîˆqïë~Sÿ,ŠUê‘Û äÓwØßÊö¨M/DjR‚ð›Àø(aÊàÃïù{éÛ'VÌý¥êÕ £.ð«ýxÅ=7Õ×lÕ«µÜûK‰ÜW«ûK•°î/µº{>]»¿ÔD áÙ£€ßˆ%¡I¥+R •e`þ4|¶æ™ŸheßÝPþûdßQ)©wA\@wA<\ê» â¸á7ñQ¢$L¥›=^úþ‰øÕ)Í}3GᇋutcÑFƒF©¨*-fßX”Ú2ÅÔ'¤ß³-®7ý³RÙù)­Ñjžuø6ƒ¡=_·Q#¼Wï˜á7ñôÎDH÷Å©$öø¡;Ê»ÆwCÁëMŸsnÄŽî(¹ýõO/¾ýu¨„¯5)N*õ‘;Êg3w”ï„·¿Þ9!›»ØåG%¿É‹ßˆ¥D"y³ŠAªV¡oÚx îv] c]­fª¾¦¢´ çÓGfËÜß!ZF.M‰0%¤Jì5B¢¢ß '’JeæWÔ*Õ:KSτõ´¾[žiÑ*…HH~¿%HŸRuÚæÞ¥Ûpà`Ùí˜èµ[õjemeYan&¹¿.ö~ó5)±E Ÿbõ%jR¿ãv#Eü`:Ú˜[TRU§Rëm-}SNÏÊñMøÒ3Ö ¦ ~l¤†%¿ Œßˆ$‘T*=‘B·Ãiìö^…ƒG+çT_‡ …ŽŸÈ‚Hñ“)Þ6D‘l*:R1ÅEŠoR¼?fU n–*…[z ­Ó.ÏêémøÜ9lS)Èê©! Âoã7¢I¤àA*ŸB‘ªUYÛNÃÄÙš×53ØÝhШÐþŽìH3ú·œÍòâ‘_ìÐO*Q¿ɤD6ÉS©ÚÙQ7K›ìón߯åq8ÝgVÖ ‘” ü&0~#JDâ>戇4A ŠDJijžÜ…¯6}äÆ^-›*K r`ç,™L±¶!Šu£ó™z2T¿âzÛ¤˜âÄŸH“ú ¶NÐçN 6ô ¸³ÃÜÚ56ïñoß„[£†zTðãÔy2$¿ Œßˆ#±T*Ý¢]Š%ª_?BÛ¤¾¦–yéÎ XAWjõÖöÁqØ2{íO÷™éÖ þ~©f Âoã7¢è³BŠ.PÔG7ˆ;¸459ÒÙ`†MI•ä©.tÑï[a!úÔï¹L± z”ª_GŠ.M°úeÉÚ¹—\æEt±±{lÚéq_èvu°]Ï*Npj’ ü&0~#J€C*.L%³<"?½u`å68Ú‘ßxw“5%•çg“ûå™å^z½7bSÑ}ê1¨~-@ê·"‰eR_¡c›Q/y~_A¬ « æ¸(µ¸v ^úzšYë¼Â¿˜8a¹„߈â/ô=~H±?Ø:k_8¹#.–ÝóÓƒmMFØAQQVˆ–{ß lŠI§D˜âB%Žï%¿‰AÕÜGoÿá§7ä2oQIem½Jk²Ù‡g<« î»ÞŸnµÀE)ÑÀ¯A‚ð›Àø(þв*…R‚.ù(7D~J ˆüΈû‹ ì h³ åÞŠ’|rÛÙBÁZœg* Tˆ (*‘¢ èL¹˜TIyµ:ÑÜ;¾àòoB‡+VnÜÇFÊ&AøM`üFE‹ûpB*ƒ UôÛ_“•ftB¦ÒÔíÞz€ut·cj »Ñ7÷VÁµ)X¡  éß~-Z¢J2Uôë9ÅŽú¨N$Tí£j2³óŠÊIià2ïЌӳrtEÜ®ÍÛ jjQªZàR2R˜*# âÓ#ö,»ÿn t¾¿ìqNÙ›a…¢®ª¢˜ìž…éL:õ7’)VìÇþ¤PżR”(2‘‚Û¤Pµ ·vŽÌ.xW®ˆ;`R&î2/Ï¥ô„߯oDqVŒ¸;—ŠI«ƒ)Vœ§Ï%*ô¡.$äQhAêGxÜÄ{²Ú)•ÎÔÔÖ?¹àòo܇/÷fÚmtwç{b!¥” ü&0~#Š«b'øH½ð£HRY¼À®P -Cwû+×ìH?°)2**ÈÍ‚I¨”Žb¿¯)ŸЦŠÏOlž(‹"=ŠJ£XyÜÑñþã'T탉0);0)7* ?ìøú¬zam‚‹T½‰TFýƒxD©¾~‚Ó¤¸Eë4@ŠëRÕT…¢ÞÐ>íùþåÖ¢×15ÖÓlFéTUYqAò)’)¸ožeTB¨XX‰pù7†§HÐ÷%FQÕs2êDef呉”ÞÒÚ7<ãô-íÞC§®ñfŠÕ‚.êR .ߥzJãY‡Œ—b'âˆTR>Eay"U]«Ð6,÷ûË~×ì$°)“N oŽSZˆ“`)Žý¾aûÅ”8T,®8OþA„(¦Ô‡ªç°WE}°µ/µM(`µ¯Á>LЬMìÎ Ø4J1“b#U'AüFÈŒ”»Dª¯ŸXÅ&Š×ÿóÒnô}µ” ðÊt6U«4Ú/Äåöª×17Þ «~°‰¢²´0®ø’LÁÖ$*¡‚…?T4U\¬Dh"qŠÄ|P_QiÔ÷TÔ‡J9y…¥dÛ„ÉÚÖ?Lj}÷† N=½d]=ºT­É_r•;IJK¤>US§¶¶Nn…§»ËçìHW» 6QÔÖT”äÃå):Ÿ"{“8Á„*Bƒ,ÖÓžH ¾D@¡Þs†¨·¨ÌœüÂÒJ@”FklhÕ>ÏÊÁy(x³:Úd+ óª‘ ©¤ê“JO¤¸¿Ó©V?s—cõš¸»€éÔôPo+ŒýêáQ™EyÙT>£ Œ*ýA¨h«¢¨âpÅÑ#8!žè$ЬKPAßë×?’y\Ê/.­¨g"lí]#3N÷ÒÎU€¸Ø±5‘澨.U-A2RIÕ#&•îHEZýÔúÖ ÷i(x»¿Ò©±ÁŽ‹^£¬¯­,+)È¥ò©7ŒOQÁ‡).T"T1ÿô'žCý•U;‡}}°±VÏ?ffç–¢Ò„Æ`jê웘w{WïCÕ‘&ˤ¢"EKÄ˪XMÇÉþA<¢T_?‘‚©jLNxÝ /c*%Et’©Úz•©sdåŠ .wּΙ‰öf³^ƒº(J `Æ~€©xŃJ@‹+þÄ6(¾E1AßϨzò¨ÜÂ’Š*¸Æ«·6v ͹üË{7aâÜ7ÝnP :ÐE¿J ’‘J¦2ÃDP-zɧ‘*—BL)4¶¶©­»Pèl–(úºšÌzXJ¯./)"ó©wT‘âüñ BTÑXñÈŠ<Ëæ‰ªJ@ PÐGEVÏAURQ¤ô–ûÀä¬Ó·¶}I¯WG»-jö‘ÍQ]ªB‚RÿzŸ1RšTz"%fS5u*SãàâÅ}øætÃïrL õµÙ pïûQùüñ™bAŢН?3@1±(6Q¨z^X\VU«@¥‰öî‘™y÷âÖá]øöÄÝ×j€ÅMŠT¹¥)á¤ùœ‘z´%Bða¼hmêù_*ñâå &j[; ÷Çk>÷ÂÔY¢P*j++J ss`ò)x*H+YÌ“‰”˜EÁ“šß¾ûˆÊ̓yŠúŒ¶öþái‡Ë¿qz~Ø[j2©"H±\ªL‚RŒTÆ/Ë¥EDdåýùŸGê\Š ýTFû´ï,¾;\]tÏÏŽö´6¦`ì˜ÊÏÍ‚[#Á *6U$V,°¸0‘8Ex¢ Ų¨OÙ¹E¥•U(ê3mãè ¾IDATÛÚúƧ<¾õã"xäo5h¢&R\¤J%(Õ.õKBêq“Û9û|¨R´ÔK! ³t,_>7û›‹nçÌhO` äSŠêŠÒâhT>¼{ Ï"ƒPÑ)CU«/i°¸ú’Á) ]—õ}%e•°z®Õ››ÚúÆfFi‚‡T‘¥~‹däəɖ”oêÙô¤)ÑÀ½â«kšÙ¾%B—»ë~÷<ˆýÚ`-]­¬# U)`ðG9S‘ñ¤ŠÄŠ‹­¯hš NtÄ÷Ý÷TEeQ èƒURr;¥Zk°4·÷¢W÷oÄÕº«Ï¦ºÆ+t©B JýÄý¥¸TòO$)¨¨¿Üa:UÒ©áųq¼»ìuÌOv¶ÙŒÈ§j*Ëa‘";VþÞE˜Š8„ŠMÕW|œH þFúÓ7‡¢,ŠL£ròò‹J˪jõ*­ÎÔÐÞ5<5ëô®nžB#÷d»ÖK¢›ç§–Q A©ŸÀ¿(¤’{Å„_ ŠK±B?…ÆÚ2ºt~GÜ]¦Üó“C}í ƒV¥TÔVW€à/?@«oH¨ØTÑX!®"d1,QöDíP´EÁí†Ù¹ùEÅe•°C­5šíýÃÓ ZÝ?} ÇÞÁ3Zãåà³!)?†ð¯~!H¥àÃNefªV¡5¶Ž-ïÝÁËÝ•E÷ÂÔx¿½ÅjÔ£RÔT•—°êgØ¢DÆ4V+,Š,š%š&€ðAžPQ*3;.ïVTÕÖ Og²5uNL;<€¨ëâæÄ7ÔlVÓ§MD ©\ Jý–‘JØ%~Ø.EÅ~*cÛ˜cï.ºÚÛLÍM ô´ÙL­V)ªÊKŠ òH§z¬Š¡êÕ+«X\}CÓpâðD'Q°©¨´¢ª¦®^©Ö‹jïšœwx–ÖnBÄÍ J¯Qp¢¾Ç\JF =¾Ê›ˆk&úQËL%n›×ÚzÇV@ìw²·ês9fF;›­&½vRÔT–•¦`ƒÒG†)*äU U®ÈG$OÈŸh ¨ê=²¨`Q%åU5(è3˜m­Ýýc³N—omû,@N|³]xj']MVÏ…HåH~¿ÅA)©a¦¶ˆ‰ýêµ mcË»wÄÃõÁšÏã˜îim²`•˜DeyI¬§ÃÚß{Xüc¨X‘fÁ"Ñ¢õ 'Ê¡H‹IT°¨ÊjhQZÑÚÜÞ;:1çôú7Ž.‚Äõ±o¥ˆ²ë0Zà—%AøM`üF¥$mMaàWÍÔÒI¦Œm£ó;·q{¸¾ìu.ÌŒöuµØ,d𠢜* ö§ÓT±°‚\A°8z…`4œ=!" –ù CUÖÀÒ¹} m=ã³ó.ßêæÉ=ˆA7D˜þRVVVaÞ²'E=‰ÅSkGïÐèäܼÓã_Zß;» †‰»Ã%ÇúT‹â~T—úA‚ð›ÀøèJ%Q/û$3„ï :<4Ð×ÛÓÝÕÙÑa··#Ùí]Ý=½ýƒC#c〦¹‡ äO¾Å•­ýÓ‹»P8¸<Ùt¶Û ZC=M¼?áÁ2á9yñѳ„Á‡ß\Jä ŸTžV)`™Bcllí›ô®\§ nÎ÷6WAèy•sa~vfzrb `58Ðß××ÛÛƒÔÛÛ×ß?p<ÍÌÍ;@þäñú—–×¶ö.n€é=\쮻ƺQj™EE¯KH/Oü]‚ð›Àøè9€¨xÑãUžˆ@[ˆ”¥¥gpÆ¿sHRuwur´»¹¶²ä‡\·Z˜Ÿ›hMMMNNPšœœššž™›[XÁžÚÓòêúÖÞáÙõ}€ Bû›Þ©‘®&“A]_Wû‹â"õ7 Jõ](üFôtáÔ‹»'èw`¥ü—<Ë¥8[èaëƒJïø41ëß>¸¸"‚wW§ÇûÛ[ë+K‹$X.—Óét°º\n“д±¹sprp TðîühÓ;=ÚÝÒ`Ô*ù@‰Ú“t—úJ‚Rÿƒç ¿=YxõÒO’ùb õ—¢ BñŸR­77·õŽÏx7NoA" >Ü\Ÿìíln¬­,/-.úý~#ð`qiiyum}kgïðäâê6"ÂÀž®Ž÷V]s#Ý-&F©¨}©CñÞì@( ~ò<á7¢§  ðk›ÄN©Sõ*ÉÚÒÕ?îXZ?8¿ºG|ïo./NŽö¶77××VWW€–À««kk§ý£Óó«Û`OПnN÷Výó£ƒM£žgV¢ØH})AXüì9ÂoDO&õÆHqùBTÁmZ£¥ÉÞ74íò­ÃªÄ‚¸¿½¾º:::::>9=;¿¼º¹{€æ†öts~²»ºè˜ìmo´’·1ˆ‡Cñ½#OxüðÙÂoDO>Dዯû»ºšª©+Uxä^gÏФý¼µ{|qs™ùÇ?50Ç  ‚Á ȸIày"¸¿>?ÚßXrÎO öÚ›àÉÐðpžâPDÞ1X(L~ú,á7¢§#¢R¾1Fy"òG„)X©PªuzsC“½ghlÆå]Ý>8:¿º¹„B#d_±ÀÝíÕÙÉþæ²ß1=2ØÝÖb#ïÌ‹ø¢$ž\žø“áòã¿IN@%©–'Xb¨ªWª5z¸+·£»tjÆáõ¯lììXïââêââüìôäho{}yѳ0;1Ü×co±Y:­Z©€§ˆ ©?J>€~#’*¼€J—bŒYQ'†-¶æ–ö®žþ¡Ññ©™yØ áö¹Ý¨µbrbd°¯§³½î[$Ïd쉳Ç0Ž.õ Âi ÂoDÒ”ê¾s¡ÒÊ¥XTA¬Èºð`¸ª¡± ¶óuÀ>¤®ÎÎ{{[+l©µ{€UJ%ÚQEáGƒBâ5$ý>†°›HxŽê1‰tÀ¥TIÍ‹+~b;ë)¨XÛuµ:ƒÁd¶X¬¶†††ÆFð?›íúУ-õôÞ_¨(—y¾XHýN‚ð™´ðÑã (Rø#M®èÍ»õäŽCZh³/<œ‚4§Ù%R¿‘ ܦA:"%Ö¤ƒR…ÔÓözdDq‘jZôÆøZÄW¢¨–Ù7ϼŒûÅt~ô䱈HF*¹Ýõ€‡Ò©Xªæ)ƒÿDlkŠ3R¿– üf~#Š%Œ‰JYy"®HQC*~ïûÕ,¤þY‚ð› ø(ªhš°*H½ÊÌ/«¨ä+CðL,=íÕ‰}¹è«+Êe¤’#ξr,•x¤¾û]X"P†ð©§?Ñ»Gú' Âo:à7"1eD Û'©oÞ~Ì-(CøÔÓŸÆè]ò#Hý‹„ß|ÀoD|±Ü c ’Ô—ßýðFäžeQneö¤§1z—Èím2þ ÂoFà7"ŽØÑÖ@%©>Ó»D݃ù¤¡¤Nøˆ7{¨d õKÑÓ¾áDìO~#‚â`X~tÇxug˜T›—ä×KDó¿èo*}Ìé'ÖwÃLk1˜‘€è%9—O4M‚K¦ó5įÉù@cMfòÿ¼páI¿û$¼,CôÙXÿkÌi¨çOç—}áKY|Æ%ü…)˜Oœžü—?‚Ô#lÄ~×' %Í ÓGɦÏôµ\ñ…_™nHÅœžâ“=ÞH=ù]e¤žü•üü*ù¾ø‹A*#æ8D'ÿãqßc ±—=a±Çœ†zzÙAV¥à‡Çùã‹´Dê‘b†,Y ‡àǧgÌ— ð.õøK¢½ìñwå~•Œ”,<$@*¶aŠV3¤¿»ô—=á]Sèñ²d %ö;þ)_ì‰,ÑA/‹ùOŒ>eÉJªX‘¿ˆíÕ¢_óè»?e’9Íà=)KVêÅÄL÷{±_Mµ0<sIŒÈ¸ƒxì]3ž6fY²dÉ’%K–,Y²dÉ’õù+‰+üK%áÒ"—ó`Y U›Aø—Jª¹Èw'¯(ÊJ¬’Ø Â¿T²â­êËHÉJ¨RˆÔ¢ãEž3ÊHÉJ¨d¤dÉŠ«$6F&ìRIˆûx:2R²ª#•Øëò‘Jb-FÖ/V© ü]Bç]EÞF +ñJ)R‰¾¬¼‹@Vò•J¤Õ§m&’%+JbƹTF²®Ê\GÞE +iJbjÁ\н©&ÁŠ ~ô'#%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²>gɽû²dÅWòžMY²â+y'Œ,Yq•Œ”,Yñ”øÉ’OÉå Y²âª$îP•%K–,Y²dÉ’%KV"”!—seÉŠ§äsbeÉŠ«dœdÉŠ«d¤dÉzž˜¤ FŸú—Á~ì…9¹’%ëqe°¨ÉÈàü‹T†\±%K‚28>$øóH^×—%K’8¨d°ÿ&âR²dÉzL’‘"€NòèdÉJ;=©/äÀO–¬GŹ+@”\*CÎ¥dÉ’*æ& Ì]=˜¿1XwþHÑ(eÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%K–,Y²dÉ’%KÖç¬ÿê5ZgVIèhIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/sodshock.pdf000066400000000000000000002126441477365367100222730ustar00rootroot00000000000000%PDF-1.5 %µí®û 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xœ„½M¯õ"¶Z~·«´#žSùÝêúq^¿ó¹O2qüžGC:'"¶ó÷:àdY–ßm¿ädzŽi”܈i~‚iŽÖõ÷ÜΗ£ Â‘3#1ÍQÝË¿jú³1á†Dçʼnæä8÷ùê®3Sw‰uPçGL\ä2Ï¿×óoÍ‘3Sw>:¨9 &Ψ”çY<–Þ™—#?¨s$¦9zÎí¨[ïˆÌË‘Ô9Óíçïsù{Gd^Žü Î‘˜æèšëòºFdú‹­ƒ:Gbâbÿ×öö?¯½^ïç?þçs—ÏëÜÖç‘zÞì2{·ÿñ/}ÜþÝ_ë<ÿ2ÿÝ?ýí¦åü-¥î×õxúÛ?OÁ¿§¶>çyûžÿÙ—ÃÎí²³lŒq<çznxËó1¸‚øÈdêŽ)W±_Ör/W}.®Áó)çħ “™ÌKµ Ý¢—õù•åjç"¢yi‡L:—v{Y«}â\Dt^â?•©;ȽÔí÷z¼·sq¢ó‡Ä©™š—cû=ËÖ‹—8D—¥3¹—kûݯ¥;':/qHœKcN¦Ÿ§ù­õjç"¢yi‡è\Ú1<•mÝ~·²Oí\œé½8ÓÎ¥ã^žëT®•wÑ‚ú÷Þ™m}Ú¢­a9ÖßeŸŸoåÐÎxž÷æØ®óùg¼[ûò¼¶|[е–dëâäÖ‘íÐý+{æ×­<¢¿ Ý7ß|g>ÓŽÑG¤{ëÚwEM‡¼q¼É!Ó]A´±¯—Üñj/Þ¾þÖñØ;ðÆ¦“ãûçéù®åìµD¸ûíw)×CŽÄ 2Oð¥x>OøK‘DHìß`§¢W¤y‚âÓR¥Wöa˰SÑežàK±ó`‚½@ý­ë2ÂС{èÖ!÷:»Gí²—°“áûï|m# =í÷É<Á—âYË[‘DHìß`§¢W¤y‚Mñ˜ÙIÅ BâZ·vŠ B1Ì|)îϧã¥HÂ%ŽçEÞGŠ$zEš'Ø).¿¥n½¢—°ÁC‘DS”y‚/źַ"‰X×}„"ˆ^‘æ vŠåyÖúïM!q~ƒ"ˆ¦(ó_Š{Ýߊ$\âùr÷ßSÁP$Ñ+Ò<ÁNqµ®M§(‚Ï­ŸË€d/ì/غÜÛ·ËÕ·Xí¯ó2ÂNŒDS«½VºyÛó€½~˜ˆp~ƒˆv)ežàKq/Ë[‘„K<ã¿RFŠ$zEš'Ø)Ößå|½„"B¢{>…:½ö4NÍÖåÞ¾]nÛ—· (¿e/# AS'Aó;Åçk_^_R!~ì;EMQæ ¾빿I¸Äó?ç:ÂP$Ñ+Ò<ÁNñø]¶×K!"$®o°SÑežàK}å—" —x:Êåa(’èižàKñ[¾I„ÄqÖvŠ zEš'Ø)ž¿uëû¥A¸Ä30ÜΆ"‰¦(ó;Åëw™_!Ñu…:½«ÿ¶ÉÖåÞ¾]n}uMƒpýyφ ‰©“X»®irïŠ×–~ ‰8ê€:½£¾~ mC®÷ ¹Ó#$!„ TŽ0IÄ ó;Ååwîá8e„ ÿ…²v¹—oW[_ýÒ \à骃¡GbêÖ®_šÜ»âµloE!q,u„"ˆ^‘æ vŠÏò5¸Â%žîú7Š$š¢Ì쟱û«—DHœ]/1`§xö½Ä0Oð¥¸.û[‘%žmYŽʃ½"Í|)žGúg÷ê=÷ca§¢W<×o<ô·_ !6E.ñt׿ÁP$ÑežàKñºö·âÕ aÇuŒ°SÑ+Ò<ÁN±>ÏÚëõáOwý8GŠ$š¢Ì|)¾zoÂ!°oË;=úÞ¸uÈ¥ÞÛ¹?_ô×=áëïr]# =í÷É<Á—âž÷—Þ6¢Nmë:§2 ­=I¿e{}LE¸û§»¾­# 9íÇÉ<Á—â9/oų¾<÷¹Œ°SÑ+žmtó“Ü›â3€Ý_S.ñôØ÷m„¡H¢)Ê<Á—âþêšÛ7Ø)n}×4Ìì/ÌQôŠ"\âé±ÏÛC‘DS”y‚/Åcßߊ$B¢~ƒ"ˆ^‘æ 6ÅkNaÌ \âé±—:ÂP$ŠažàKqŸë[‘DH(Úý‚"ˆ^‘æ vŠËó¬½~£ˆ¸ök„"ˆ¦(ó_ŠG9ÞŠG7Šy¶ú †"‰^‘æ vŠ…QMQ„K\¿óˆBϱàÂÖåÞ¾]®oµ.ô¸[»ÞiÀNní{§²¹š~Üú ž?rë+¸þøë¢¶BZ ÊNÍÖÕÖ˜7¹ý5š ‚Ï#fÓʃS'±w£™äÞ·À Â%–W3`(.ïf˜'øRìcç¦ØÇÖëZFØ)‚è»ÐûOroŠõ=ë+ºþx<¯:ÂNDS”y‚/Åw3—(¯fÀP,ïf˜'Ø)î¿ey}ÛD¸ÄÓcïzãC‘DS”y‚/ÅíÕ5 "$J×5 Ø)–¾kæ vŠGŠeg­#ìÏ׳z¼b™É½+îËñVÜ»QÌó°mË9ÂP$Ñ+Ò<ÁNñξ Ç!p¨Së#™2u­—c—zÇ1ƒp÷OW½ž# 9S§ÐÇ1“{S¼ú¸ù#xõQõÇß9¢Níìbì2u­ë7©z&­Ú»ß_Ì€!·¿˜až`S\æg»õ׳1!r}ƒæCL!Òì3~«öñsªööç!+]¬8`¨ñV¥}ÆoÕë5hkLÈô¡Ì€êC¼U¯nà–¨ºüÖm}©Šq™§ó¾m# U#zUÙgüVíÃéTíãí×½ë©ìTâ­JûŒ{Õò<€ÇKUŒË\¯ÈfÀP5¢W•}ÆoÕë5ÔiLÈÛ>ÂNõ!ÞªW7ØÉ T]ë|¾TÅPOÃÚõ"–gza¹Èø-|¼ú®iBõ ìekR=ºlV êöвCu{…áñ@,_qÓ5¦–‹ŒßÂ×’t»Þ%œË7ÜË>Ì[öZFØ‹V® íTÅHæéå#l¢ zMÙgüV=jíbƒðYëò÷ªó–=ê{Ñý|‡êþŠÎãqX–õ n²Æô²r‘ñ[¸ÂS¸ÓÃí~”/¸~˜·pÉÿÉ"~†ÄëûÛ(FBÏà+nÂÆôÂr‘ñ[øXjîÃöp[»oýðü…¥~Á½ðù ÎCø|Eïñ`ÌÇö7acza¹Èø-ÜÇè)Üñáv_/¸~˜·0]dÜ _)bÚ í¿ËU¿à&lL/|½Â¦YDÂ}ÄžÂ}Hn·ãø‚{áí8ÞÂt‘q'¼Ì]àºA¬öQŃ1¯×l·É®‡ŒÝ‚ªë<—XêÓתëþ´¸Å¸îÓ@6˘#ó³ß¯®Ñ_Õì= ½J=äñ·R-}Ʋ jDò÷ÅU#Ô_Nóº}Å´¸ÅPW¢¹ÈX&.-¤¿Q¸´˜?.Òœÿæ‘÷&£+ÞÞffÄOv,±C«?æâb‡/)|þê7Èão1þ×Ú9ÈX&Å%ã7gµ7',°=ì9X|QΛÁ-‚²˜]l2v ª*º¡=eþGÐ^·¯˜·×]; Ê€²§Þʶ»ì飻Åß¶Ý'oL‹[ e×ãê\d,o1·°ðÌú;?Ý ¸½öúÓâãÂÏ[Õ\d, >ˆÃÊ “)¶–~ýŠiq‹¡0Vv7ËÂÕgž~^á¥ó<…×jnO‹‚gL‹[ …pi.2– …˹w.&Sì^â5˜mHž1-n1Þm™Es‘±L(ÌRëþSlÅ>ÜrÆ(cZÜb(Œ^s‘±L ¼û‰.1ÅæPáö*å ¦Å-†ÂX¨Ó\d, Û¤Âfë2©kÄbÏ.Þ„í äá·ˆ emÖo¤£©wy0ôZ]'¯áð¨çl·þÌyß;»ThÒ13Y1O›±®öü³QϘ·îÛ9­¹9¢Uc™PXýÒÝ[1Ü·ëWL‹[ …uë\d,ŸÑ/-~¡Å`ɼ²ƒŸ ¿Åø>¥µ³OPÝ}¾dÞ%3ÿÚ‡Él3âÑ·ˆ‰_¿Î8AOÅ˦íŠÝs*’™ãmãŽÉŒiq‹áµ^“<$(È^¾P´Ø¿AVÌü{XƒY=¢•1-n1.»^‹ŒeBaÆYn9]˜ÌlA7<ý\š1-n1.líÔÁÛ7– …¸q …ÉÌvÜÖõú‚iq‹™¢uk.2–É#\æ6—1ÛÍ`Û×·çWL‹[Œå³s‘±L(¬) |(LæiLí­ãRö7âÑ·mñ] óŒeBÑz°5œ×ÅE«¿¶úʬŠÈ˜·~ ­ß.2– …¹¥ã&Ï› “)6‹ ·ûWL‹[ …1m.2– „—ØÙ§ÂbøÜÃ-÷ŠdL‹[Œ÷nð„‹ŒeBáÍ—îa9…7_¸üàhVíiq‹¡0vÍ6Ë„ÂÜYò¼‡ÕuIl¶*^9–±Ü" {ÚÄEó±[Põ:ØJú—#˜Í¿çó©ú†÷ørÝ‹_Šp‘ñÞ¾¥øTÒ×¹t“K§½öm.®ÇG\gc(Ìë*Ýu.Þ?-^@a2»mÒ€[NdL‹[Ì#|Î1‡ …ϓÒÂdvÛ©·œ5Ș·/¶ +\d&^}Éôõ _¬5 ÆŸÇÇ­Gp_ÇßN@µ`Ž-ÌŒã©i±,°ç¶J—ÄÌÁua‹?ââƒmÝ8¸—l—­8$úUÃ5xõ毘·è>ƒøÒyHP”µ@9– ²Õfa+_|Éõ€7µúd »³•o]«¿ÙRÎ3Fž"ŠÍ°Ø¡žÇÀ“ d} ) vÃÎRÙJ`©¿·bV‹Ú÷mݾ`ZÜb({Ù3$˄¶{äDîŽÕ…ÉlX¤dŸ7L“dÈão1eL·9ÈX&”=°WígæqÀ`Æþâ[—ñ¥x è.ŒÊEÆaBa[(ˆ%Ї„yήXçsåÒÃŒÝâ3ÙÎ|ˆšÓŒeBa·` •ß]gžÓc¯hµgaÀnq‹ðêe9Íxé:Μb=uEpÕ?^= ù ¸xÿ†d7ïÏÈCÆ¥õo»83´.”%³0.ðx]í"eL‹[ÌÄöM”‹ŒeBa‹y=ç†H…O¿;ˆ¥ÁíþÓâáÝÖ@6ËÂ'ÐçäïX‰)¶7 nѼgÈão' zØÂ½fŸ±,¨Ší…=é®ixµÑ1Þø²|Ãvü-¢§­M  úñT´–líÅ5ÉlˆðÀ¥Å?2äñ·˜É²@`®ª9ÈX&½¸Qò91fSmÓÜÚJŽŸ h™~V,æ9ÃC‚Í€²¶«œ|(fçˆïyç¬ð¥ È.>⣋Œ› …Ñ„âÜ<Ìì ®Š…•·Û,‹[ „ ÃÊá4ã¹…™ ÷Áá䚰팻ÎÂ÷ uüíT×P¡ÇŒ—¦ºÎÖÝÁ™ÍÅn¯3¸(§=|2–Å-›ÑÂg‚2 ,š œ6UQ–Ìü|JùÁ7|Ä´¸Å@¶Ú’ðæ"c™P}vœ›wå‚Q×í°îõˆ[WÎ{×-\dÜuåÖžի̓›®ˆç³dmÈ™þ¶oüһє‰v4•ðâãl<˜Ìó5Ú{ÏׯxW<› tN a‡‡÷Ò~8t±pf ¼`6ËŒ˜·È^6m.2– „‹í†\mBÖÆ"Áìö^Ã-r)˜·˜Gxa4*\d&FÐNŽýÕ`Ž_ópãyü-² g™å ã0¡,¦ìÔª«s[¨ƒ‰àÓàÙÂŽD¸ÌxŽŽÅºZãgg6óÅqæ97{ÝðyYλÅ-º«­niN3– …±“ÈÎÍÒG5f¶þ¿}`¶òÓâáÍ6 4˄–7lµ¥ Ô5bagÄ>/#äá·ˆ )ÄlÀ/óu<9CdgÅám08¯Ê/ËWL‹[ ~ên1 æ"c™PâÕçä(Lfµi|fÊ1B‹ìa1·æ c™Pñ;5ŽF‚Ùlá¢}hjý‚iq‹ðÉ)†p‘±L Ì|l8¹Ã[=1Ïé]?4çñÓâáËÒ…4˄¸Û89 æ(LÆ& ñæ¡ÿ7@‹ydËÌ \9È8L(Ëk`.ª’8,¸ ¯¼®›Á-²Å¶K†‡ŒeUë¼®¸Ì|šIàÌŽj>Ñ‘°Üb ºÚ*ðp™  (úœN «( çuÚ[WäßÀž)l þ$×RÃKüœOñçȉÅöÇÀ_ýyø-bZKµïN˜'¨ã¡xØ`ç„ -$ÅcÀ§]Åyüí®)Ž5ûŒeAUËû‡øÉ^]•ÌÊ1áÊ]O#¦Å-¾P)\d, [KôœÞC “Ùlzn­u0-n1>íMl.2– „O{ÄprúDˆÑ'a³PÖˆÛ'bãæ†µè“ ÷ŸˆÓ¾Ë8¹s—0™ÝkeºÇÓâƒÄ“K3ïÿŽC)øtZ×u¶hõ@`°}ðƒbÝ´ŒÝà¹bgÂe‚2€(—î?'6g cpz}Ãnq‹ìê49Íxé:m—ÍTàÜÖâº$f;ïܺп…§íY];óŒÝ€’9á´|Mg0 Ãéþ¯ZÓI†©Dm g¸Èxmk:7ë¾áÔvÆEX=†'äá·ˆîœ “}‚2 $Ö\â´0/CM2«wD6Èão' yppöË‚ªØ3Œcüfó‡ö`úÖx„Ëcºâ‘ÙjgŸñÑžám±5š+ÞbÆÚ‚ñ58ø—r}Á§bmdáGÀ¾›r‘q˜PK¦pr+Ûó`'ž‹6cZÜb ÌUrá"ã0p±YœœŬ§}Oû² Ø-n1.üú†ÓŒçö5~8ë=n‹-奰1ÏéíÖSºØ%ÍØ-n1^mº¢9ÍX&Æ’>£'KÌìÒe§9â5ž-c \ýa’‹Œ×îáâjѧþe4(æ„W¬E±Ü" »Ûâ¼æ!c· *Ö×®–dúpY2\úºØs¹Á´¸Å@ízç!APÖ½]ë E0A0\bSΈw-7$Ñ“ œä!Á½-6ÄÏF³¹¾/ˆÊ5wÛb½Ë _G<­u¶€X˜g,Jâá\74L.Iâ`/z[¬ë3b3¸E<¿³.¶%&*šÓŒ—¶O°nnƉUÂdØ0Â-Öµ˜·o¶¡¡¹ÈX&®œf=7ëªCXL±o9zˆË1B‹ìnóUÍAÆ2¡,¾“ëY­¥ ,™• Ŭÿ Óâჳâá"c™@x·4Ž)Ün WÿáÄ€wÄ´¸Å@˜›¥›‹ŒeBa{ÊOûòQwçU²FçqŠàĈip‹yd¯™‹-ÜC‚aуwëâr¨:s2ê§hãì·È¥å4c™PØ–9 Oݱº°1çåíÇÆ>nÆnq‹ðÊ~^8ÍX&>m]Žñ)á`˜¤ÏÞ,¸ðª)a2®œ¯mJ¸r'ª¡ëEa2Å:_x1’1-n1Þ9vË„ÂcñLI&Ã)¢ÊM-äñ·Èž6ºj2– d/»ëuXËY1Õ†K¬èö Óâ3ýlXs„Ušî"ãfBa ¯+:7NpЧ‡𥾠È.þ왇›Á#ú O°à‡°Ž–\#¬Û°·qý„eq‹, Q4§˄˜y ûÜS˜ÌlA}¸EpeÄ´¸Å@x³…ÍÍEÆ20Ãþ8¦0 B0>ƒR™ñ{Ä´¸Å@xG@½yHP”=ñTÛåMU#°µÔ<â ‡ßb yÚ¾™¿‘‡`±˜ö†Œ ¦'\îx«•7` CðâöÔp1 (‰HŽðUIÁì\Z/ÛO9âK«’È ÈÙÂhº\d&f‡mA÷Ûtx.MØìE ˜·È»„ÍeÆnAU|`7_ÈCY26W§¸R,ú@‘ñŠnø …ƒŒKû@¡:Øf‡x\Ęø¾XÿvÄ›bäd »[Ú§ðàÖ"äûÆZ˜Kµ\ÂT%³Z‚8Ý¿bZÜb ë ÂEÆ2pµø9ŽÑë*ÆúÏÈúˆ½®d |ñý”‡îuå›´a'îâª$v?Wfñé‹8H<¢X€ï—l§ÚˆÛC}pçZ<Åá"ãî©¶OFq4$¼0ÝÉqÚÎÛñ·ÅWIôã©xò…ö©\‹Íݧmuહ\2T´É[Ù'¸¶©\£üH:Á¤xlÔ3`Üb&ÿ,5o¤Ã)yù»_?fapy?®ã ¦Å-ÆEÑö‡‹ŒeavâŒcV‰`f‘8=|6àUY%ÈPØn{¸ÈxmY%N®çÛÓƒa7n/o|ÞxÕöt2¶íèá"ãµmO?Õü®Š›³X äT“žàª¸É-<—Í4¯-nr²Ô¤q\ÌbË=q{–¯˜· ãcÔ\d, « .œ:[#È"Ü_1-n1.Œ¾ìÙ5ô/,ﶺԸ¿XÌbí%ž ôÝFL‹[ …-ì.2– „[s\8È=[ƒoÍ× þ òøÛ WÝ:óu<5ñ·0 ÌÂäfgkîߘ·—µë!Ë­%^Ø¡:[sϤ5÷oL‹[ …m¤.2– …‘?Ï8nÆffxõ¬òñªíød\½Úp‘ñÚöãŸ,mg“ƒáÊm<ÖŽxÕZ12.l÷T.2^ÛZ±k¶Ð8Ÿ­fæìÄãöôNû¯š­ ãÂM‡‹Œ×6[qyèÜáº$fiNË;ÀÕC6ÄÖg¶Aa˜g¼FÄæZìtŒâVÌ`f˃[3—òøÛ þÐó¨aŸ±,¨jA®-Ò)3sѪÉ}Å‘R‘Œ Ÿ‡»œŠ6åʧ̗Æ3sN C¾âUkãȸ,á"ãµ­ŽCžŠãpnqa2Üí ·ÇW¼*õFªƒp‘ñÚR\k4jž ŸöFb•}ý‚Wå ãÂXÿ.2^[Kçá×´3sªãâ»3bZÜb\!‡p‘±L(ŒL‹Æq‚3˜™{/®Ùñª=Šd$\;¯m—"2©x£6³‡Ìl7Ü Ì%˜·F*\d, ÛóÆ^uý>±'æË7Lƒ[ŒË"Ú! Ê¢»·jÅ6þCUÌÌp^kÄ´¸ÅH¶v.2– „[|fw^ÃŒpk3¦Å-Æ…1Q.2– …Ùªô13²‹*Yûõô’ìÚyȸD¤Éc*ch‡bÁ@Æî >«äñ·WEï"d,ÊžDº˜K?˜™ã©«ú¨1cZÜb$\:Ë›´bK& {©ÉÃ%‰òòð[„5¶…Fæ êø?¦23C*9|›ã[ .¦]ql1¸< +u¶ÎEÆm‹¸}ö»m±ÏÆxFßë°%n#Ž ¿d$ÜyH°eø-È”súí®«ÉŠ™-)!V‹|ƒ<þã¢Oߥ9ÈX&”eƒVlO;e£ÉÃh ËeŽó ¦Å-FÂ¥s‘±L \¼AkÂ¥5y&tq*wÀMøò©Ý’‹ŒßÂø›\ua2³íã‡Û£ŽÇßN¸*ªS‡}Ʋ€*—Iöªb(ƒ‡Û»F,/ÎôÂr‘q/¼Y×ß#1³Åá‰ÝG\<¸èŒ„·ÎEÆ%â‘àŽùHÂd$ÄEÖ#n ×÷Bt‘q/\[‹æÂµµy&Ä|#nÂ…¹”›\düŽ-„£Ís!['0à^˜ :!ºÈ¸Þ[“f«Ö33Ûlõ?X| ©væ –X°Vi§ú³fáæÆx˜yõ`kÆÅcÇÎt²ò`‰`38[õ’%3³:ýóHl_q“ÝZèQíæ"ã^øŒ&_çS-Uª‡Z3.Ü’è„DKs`ÑF0ÑžYNÒÆÌ¶‹>± iÄÅsŒ:ãªHq.2.‘–´ÌWkÏ,OcfÖ››¹[nÄ´¸ÅôÂr‘±L(mZ«Ñ“þwĽðq^®‹Œ;áenm…ƒ‘ µŒ¸ Ó ‡‹Œ{᥵i¶Oµ1L§·×^¿`åÊwFÂKç"ã–^ÜQ“îÑËœ–#wÄMöd»^æ¨#ìEKkÒ\µD£G™‹ËÕÜd/_¾:r‘ñ[OwÅè~^¶%~ÄíþÓß_¹È¸¿¿\×>Aøwây(Ö¯Xß Ýw#+ÇmYY,ì·¶>gÀ«ï±rÆÃù(©.2^c[V±¤b<™Í﩯aÎŒa\=Å Ÿ6±(ûŒ×H T悴ɲŸ+fa€¥M½1-n1>1fO¬\d,Ÿá;ØÎ³°F×Â܆#¦Å-Æç÷£s‘±L |ÙÆ°^XŒ„ª!GÜ„qa¹ wÂÈIïO›_ê`tiwM›¼`»Ð{L›Øu ûŒ»ë\8Ûe7]Ç`˜aù¹Héoy;ª¶»YÎn)Ul­¹=Õ¶ ±1 Ç/ 󎘷M m‹ŒeáÕÊi3æl‰`¬..ÌêÝôäñ·E—÷ÎAÆ2ìfánDŒ áq‘v Äz¨á¹3݈>dÜè ׈°ý3U^ÙÌ}žè —";Შ52.Z¼\"Vgb³BŒª¢¬/Èão1®úŒb›ƒŒeÙÓfšÉY9ý:ÎTޏx‘#g$|u.2.Q©_ÈÙñÌ&e[ûÆq÷îÖÚ5½´.âÛ^Y_¡I!ÃÉ#M#:Íðq§ZìÍïTEHEŸ²ŒCÕˆ^U2îTW.‹mª"ü.b­ïv~ÁR%Ñ«ÊCÆêÖ|˜‚‘Ìò[¿Àx”Œèž¤°Ï¸{’Ö½]uocɃÈ6½ ¸éÓ ËEƽðA×=$ Ìö;MÔˆ©i¸y‚½âÙ<.yFˆ"êreÜT++±7¹È¸n!<×eö6Úyá&»w£“¹b´ÓÃNÔçÝ»Ob0ü"Z<]ŒO"™î“2î>‰kuô²b\ç²þó›¬1½¬dÜË®¾@¯ØL)dÅ̶5'ËUÓâ#á¥s‘±L Ì, ä¬cÌÌ~/1-n1Z»{t.2– „«EàŒ³EÃá"a\'T%±Ö;‹†›‡Û¢á²aÃ%)[ô÷à]_`ñå‹NðµEœYæ –XîX¶ÓV·[G&˜ qšZ›ð‚<þÃEÙ˜«l2– d¯ß½úóQøD‰™YmlÛcáÉ_2éŒ £Ä`¸È¸Ä*ËR9:‡åªp0³mkÃEÚ¿bZÜb\ÙÂEÆ2p‰hÇn©:3[*\§Ë'Íߘ· [D!\d,¯Ñ)âzÿÆÌ¬ÃŒ4Çþ_¾ï …à  –Xï_ÃÊã•ܶÒ¯ˆ|,þ ½qñ=(ÎPÖÊ놋ŒKl[)µz×h±n„AêB”Ü«¸:ôão'¸¹@8LPÇCó°ÙdüLfCÓäÛDi(ÏR0`·¸Åp/Ê·…ÏeÙ“ƒkìa±áLNÖFì>}ù†3¾QÆ~Ÿ»È8L |YŠ lÓb.ï)ÖÝö@X}8Ü e}¶ðqëÃí¾JÕ A=²Áp,.ÒñWÏÕå wöYùÈp‘qô^¢q.Ë¢ >1óÅ =ì©þ†ÝâÃÁ6§/m‚»„wf´±Í›¨¬ˆ}Æûù›Á-‚IsìÌÂCÆnÕj_>Kol;û³³´ÍŽÍS×|zžg&Ël¼\d&>XN•˜R f¶0áÎö,^6Ø{²eá 㕆ˎÄBVÇÐß"_š}·¦/ÃC¯‰Éª'â‘y‚G{ k¦Kîpk ë¥Àˆ•Ì3V1g¼2«—ö¥‹Œ[ý«ÖÍ"Ú˜®ûó'ˆâÛ—(þÆ4¸Åx)ôól”ÁVÎÛºH‡Òž7†‹©‹e›ª_°r˜;Ãâ¨Ñ ·´çVI´°H. 24feµèêu/Tug(Ë"¨rq+È`U5½6/sN5fµ}j¨^©¿o\=…”3.¼w¬‘s u+©Í¥±²ªüÉzn#¦Á-ÆEQ[”D믗™fRî V/ÝXXöiÀÕl;ã¢ËÑ<$X##7ŠÛ¡-ìUŬQ1òZ¶/¸Énln›Ž\dÜ _ŒvÂÁHèð—/ã&lL'.2î…‹ue{a1âªê7á‹ýå&$7áùÿù/ÿéù¯˜vV„j'±Ì§UXó1ûRÈ8a°F\©yýìýµÌh³8cßjݳé|Ž­À;>í ¬ü¼ϱ$6ÚÐA%Ûí7QüÃꙌHñ£WmW1™ºS}9evn4CÜÌjQO+ Ò"¤¶™%ª/?CÕ•ÝljžŒ VŽÍ²åÙl¿…¶FĉT-ü”£4[xì~Õ®ëâ …V¦!ûƒ }?ÞÕ†édx{V»¾«o¾\^¨Ú¯ôn[NÁ9bµ¹¯í#¾«XúMƦ¼Ò=ÄÑUzûó3B_ZÅá?Vzñï-2›Ÿ!’Ùý ±¶Þ1U©ª¬øp©¼ÒÁ *Õí&c} /¨ GÈ‚qygÃôÀáÕ•yŠÅÒþ©:4‰ËΙe›ÁxT&UM‹åŽÉØ Í+¬©…þ½D0~‘Y¾—Œ5,¬KÂêÛyÅÛÚ´èŒÇýa )Y'vrÊê z ×p\ìÃÇúªd¬à8KŸ’À:fÕ$Å“ðô“gï’¡5!£Ò˜~ÃF5+‹—Túò3YÙ½â5L­~ŒaïŽ#ÉØýb=ÇÕ³SöR‹vγzDt´Š†+S†@uÉ`,§š~d,Á˜—Û#cÙp½Þ‡uÇ4vnWþ²·ÈëÈ=ÄÊüÈ“J­‘²œ†^Œìc5,,³ ‘°ªi¬ßE_/¬e÷oe®U¾"c©Ö¼$ËÎêÕ¢>VµW×Ë8MN­ÐÑÇê­X•¯Dý"ÕìùXÑS÷š:)ËêoÈ k¯J4«¿a¿ÔKıB^»e"ÅF¬®ò±²–ìÕKŸ±ú\ýBÂÊÆ°`„•iØUÊãc50¤T¥%÷ÇOT 2–ýÓ+T˜£ ÏJG|,K>¾ªé@­Š-±Kïû±?–ý}±Ú#Ûª_±qÿ£— aIO7fõÿX&u¬QÊ}2ø\LžÿcIÁ7”]cÚxv¿<­û‡Yô—ùÖÉØ£Ê¤è“S˜eWÊò³RŸkäÿxÂè#}˜Ñù(JÄ=9eɪ™ø“Ól}z7/Dé¹¥?žÏûˆÌÏxj%o<+3+ áé’?̃‹[èyŒÉXé.O0<‘‚Ïüû±«h6••—ÌnÇ0]îDz“Z'Ïc‹T]XuÁ3Ìò K4èÉ_?–䧦,­d¬Ü¢§O5G+‹zbÓ1¸XÊ9ú±¤ŽVX“’±¢-ž¥Óq¥rh~Œ±ª’žÜ’Œ}¹<ëäÇò 2K!3 ™#€U¢Æ%áÃ8A9ÉØñä†K^‡9e4G§®r~,ó[i¹úH`¬¦4zË—†&KyîðÚípfºå³y ÏGÆ–q1qÛÇs•–…ÄañROxöa­‰ÈH +¤afÂ`ú®gƒº”WËžpdjZ÷ÈxEÆ2z*ª§ã*‘#ŠŒ…ü™¾ æÎ¼œÊoDóŽÌ<ô±¬2¶UÙS‘±uÑž«×êyÔñ8)‹ÎÇ2´ØFOoó±ä)^e—ïbÏü(Zë¿èóÞŠù,¡ç¸í1kñ±L«çq¿›¯1_¹åc¹'8o·ê;{ì¾,›qP2ûé ûo‰'¤˜œR,Vf'#‹s8|l³¾¶yJìŠM˜¯ûÓçÒIïýœ\¶­ÔÛ‹¾ú)Vv–ÏÅbWÚloŽŠ¯ˆÞòé—lÕSx®¿žVcµ¦ ›‘¹Š‘;ºqÏvÍð|lÿ.—þq'ôÇö·î®¾ð&Ÿ> »ªƒt¬ ¤½µÛè<tƒï¬0b°ÄXÛ'?¶[ ó“vÛ‘:|7øÌ¾éµµåŒ×îÌ©µö—©_NF±~>'š•¹øÂ¡Bø¦Õ†—31 ΞÃÅQÙg;4M0¥ÿ³´µvÍÀàÛ5õTñîÅŸ<¬"ÇðÍÄBûôaù5^’I+É?¶>yÖ^'gkwµ›Ì©ÖoÃb[\ˆ©§®H}ÄA–lëùb–¶d†Vˆ/ºØ«1%fCy±PpÑfbk¯Àpo"WB~lmRXý»­z›ýQÛÜkIhÁÙÇ–¨¡mÖ·-þ£¼'üز<} dvù†).'ûØŠ¬ÃSÈ`×ÇKéÅ›7[ëyúµ¶mG¬‰ùØâŸC‡ØË€•9—y† ÓÇiB“Vøòn/bm[«lÜZ¬à`ÏØ*¦î-Ìv« >6mM„Ïpl¾V j0aGXd竃ø=Ã<§ˆÝ~èvƆC~à0Ó©+˜püØŒÝÓS™b*ðc³iکů{©kl‘cK‚ µâ :Vgì;4ÅÄÓÇænìÖûŒÐÇæˆl7ǪkVY¦A³(›ˆÁÙ »ƒh®-o¾Í<|,xoå|Jàc‘utÁ­sZ¶VEÓq…†4 C8Á"õ„þ0L£ÐŸ_äè){nÍÑe‹TýØ@_$EüÏ¿ý÷ŸÿëçÿžàÑx>ˆúïÿòŸ~þþ¿Í?ÿò?'[øu=ÿMˆâÍ?ÿ:ýã?=GÍ?ÿ<-óÏþ¡ë.¬W|Ö®…õ Æ6·À¶! ƒìþþY„cöµG—â° WÙ‘±Eß—Å/0¸Cd¹ª3›EHÏVµãq³ÂÆÂÂÇ…Á€•ó¹§>$`ñ<7VÞâ“;UÈ °ÐˆÇ/6{ß‹µ·N`v©°ä˜ v #0â#täôD” ¹ 8D.\Ùþü<ƒ°h šÛuSðÄÖ`÷û&+ Hðį•§¼ÛwÙb%ë> ö§€¹¼?ãk=ñ±b%­]\þa°Ä^&¦‰%c±b4À GJVEvcø¤(|r’ðGáäþËë²s'ƒ–ñ†o§¥°\ÑÓØFðÑ §œ¼—½6`|ö0¸˜°("eU@'‹°ÔEfV¨gæ®üÅSÐÁAYz¶_t9X¨ž-¼_,œsØIÊJ-`« V¬œ7 Ìx°帷Ý3lCnO«÷ˆ-—Ìp;­9•B r°ü¾0€¡Ô«Ð«y¾C‚5eU°ÆÊ¦,U=ö•M˜“+š¢Ë wóÙ\ù°O¨9½‰±ìrj ‹RÅ…%µ½Sˆ<§<º|ˆ³2Ò‡òׇ¯-J²[¨®:ȆˆJF„Ÿ«$í•Ê$óx­vvþQ[µ°²?nA 59¦A`haíàõR¨Ák†,ß)+YTÔîX¨H“È¿9XËúR/þ!¬²âs¿1E=‘Âf-D”E¤<û…»Y¬ æä3·qªÙ¢T»¶ e¨vx¡êµ$Ë©H.ŠòÅAwˆE/-1¸‰ÈÖ±,ÎìØŽØV-ŠvYe¾¢ñÕÆ%¨Ýç•çãÂ_ˆ`#þåÕÆù} ±±Ú˜à ²±ÚTÈíPcµUË´:!"æ®Ke1ö¢Æ -Q?d/j¬G[XùŒÔÅwmߢµÚ8ä@™2o­6ÇXóÖÊŠV®Æxs…PÛÊÊd‡„§‡èN5W¸uVìRsµ]Þ«›Õ\E )OKÊÊÜ‹š+Üó‹…µ¼¹BˆÎËwys…ø¦Bt ã0x0ÊÕ¶ÈX¨ñ¨Þ^¡ºBŸˆ/ði­ o ã‰öj"…~ÂxpÅó këNÆõ2,V<õfƬjñG‹Ú«Êñ}Þ^U‹ J7W•?Œ7Wue>}½¹BÁ΋5¼¹BxÕ®Î]Í••ŸaxЛ+ ±Á ]2³õ>HÿÅ·®r ÓêÚ°¹Bý#¼@—Ê•ˆ !Do®ª]_”†ñÖêyI¬DÙUÔZáµAúé§ ·D¦²~ ~ ë\Õ;øˆ1ZÝâkWc…8$ú()ØÊèàÊ_G´V• ¬­ gg*d"4é­U=%Cà€SLÕ&¶@`x<‘±‚§µøX°ÒR½#JÐâ™Õ*zx ¡olOCØ ÈÄçÊÂþ+.[«;ÇLBžÎ6㌭€žûx’ñº/§p»çlzz)l«vÎÙÒ3{rÖQÿ£@ƒ…a–˜Y|(ÛѺµV(¦€µ>‘M½0ÞZí\"0!¢zpn|çø!Uo®v~wQAÁcûˆòctütR¼¹Ú9w;ºø°b%ÚÁ¸«7X;g$7 \ÎXÒ§Ÿâ-Ö¾Yc6¡ŒÛ›(1Ù°[jlðíêí ^bÿ6c ñžŒÞzsµ3O.òèÏ—â¹¶ƒaÞåÝ7`:ká…Õa³â{ƒõ|QqbÈO¿2Ô¾3 ;ÂÀÞb!U|aâ{LŸO¤¦—÷ Áã…K$qòd,¯ÐºªÁ§šyí9w…i[”¾V5WÅôøöƒ?ÌîÁd6Va‘•õP1hDM0ÉÆ^ÞÎé„—g{ ña¼±:س¥Õü8|D¹ï‘­š‰•1+Ÿ>>-[çSPvŽFß G£1Çø¤Ôn û_m#s?ô§sÅÿ+¥<.5Jÿ«î韭Óü<ÿødWÔ©›ÑÃÑð}áðý{Ž_þŽÞc Í¿;Gëg«ñ˜Ûú¼` ß:b6´>–,˜ÍW˰˜­$hŽ‚9ì-ûÓ9ã…_?¬è‚Ÿ×5FŽÄ4GÁtŽVc莜é‰éq–§ó#"Üøž––ɼã\œi?È™©?—8H~|VÿÏfÌ¿û‚Y`bµÌF&_×¶ž°‚oÅ ‡/Õö•Ý;v:EdOcŸžÊu"Õ›,ùÝ,OSï§¾0ímÜ|`š™þð›ÓßÔÖ&ê²é˜Düù“´_ß)kšyóXT4vú­ øxzyP'&Ë^0ïaž`ÿÇ´^ή“ã"¾.fÄ¡z¨f^踋Œ“0F¨oa2MhÿŠ{ái.šÐÙ%Î"ÞbO“„Å4¡+–Gô¸öt÷Rª“„“pç…º/FNGÜdyËë_¢)÷ªb$ÃRÑ#n²^Yºé¸‹Œ“ðYK&Ó„ö¯¸Þky ŸµŒø%ÌÀ~/,¦ ÙaÀ½ðµ¾~±»È8 ÛÎÏ—0 ­Ì–;à&¼*ñ|ÒöÒ~ ¶v¹#¡Í'\3nÂÆôÂî"ã$lI&_ÂdšœÜ {&Ë&¤d˜/üæ˜^XL:¿â^ød^G ‘ ò…“°­Fy “‘×yŒ¸ WmDnBÚËüÂ/á‹ë:a1ÚY0,Á&»{x©\-‹|“jMšõ%HÛˆ{͇y‹ÖŒzA+±óú™Á4‘ó+îE}U“ËÈEÆIز²¼„ÉHˆ+ÅGÜ„y +õË ¿„[´Ú ‹iB¯'Ùa/ûzŽeŸqRÝö%©’‘ Cˆ#nºÆ¼…ÍEÆ/áÂXL',¦ Y"£÷Âgé¿Îr‘q¶Ê7/a2º˜ëiÀMøRî§&Är: ¿„=¼Ù ‹iB×WÜ _[ÿu–‹Œ“0–¬¼…ɸ–5–ã a2oá­ì#NÂŒöÂdš-úp/ü0oa%Lyá—ðæ%4›° ù¿7áEÙ‚$´E¾¡~ W/¡Ù„Å4¡¾/+ØË¾z²²Ï8©®ï.t0’)^˜4ã¦[¼f{'Ô×ÛÈ"¶5o/a2Mè¨#ìeúVUÞí~©z„§S#™•KLÜtW¥Ð”ÐI8_ø%lë¯{]'šŒ-öp/ëiÔ$s(¡R“èúî?#¯­1à&»yNgíûÏIDÂL=Ñ “iB˜­q/ü0oaå¯xá—ðéÓMXŒ„j·n½ÇMؘ^Ø]dü¾|U}ӄξ¸>_ÝX¹È8 c6þ-LFB\è2â&lÌ[x]ö'áóÈ¿ø|½±{W›·Ç½°ˆlBçQGÜ _³×tá`$ÄÍ[#nÂÆtÂr‘q¾®= _ý`ìqkoî…½¬_Ò–ˆ~ /ܕР‹‘ÐiqÚ7aczaw‘q~÷+E4Ël>à^vß–·lß±|+P´D b©Š‘ÌÅt n²Æô²%ê¿pÞ³îþ–ݾÀ^t;»È™›'øRäÞ‹^RŒ‹¨€Ø€C•LÿSÝEÆIøœ—$|ö±Ë‹Š ¸Þ_£A¹Èø%ì³é° yzñ7áEu:$´E©NÂû» LÚ¾â^x{u¡å"ã—põ9é&,FBÌ0â&\˜x¥ ÕȘÿÂIØö4¼„É4¡ú÷ÂußßÂǾø%¼çxp0âz7áUé[%´¿ãÁIDÂV>î%L¦ a}Ľð6ïoá¨Q×ã—ðÁ̰˜&„5b#î…¯ýõÉr'á£IøèÇc׿«:2n—ƒöBJ^ÿÂ/a.õí…ÅHˆ+`2l² zU·Ï8©Ö#‰ö²«zâ°Œ{ÕõÕ‹v ¾D¯×dÅŸ?i2}4\°½^_h·Ï8©îïY0’Ù} .㦻ûT_'´÷³$aL%¾#Á‘ÐñŽnÂÇ;.2NÂý\…_³×Á}Ÿî…æ-\×eÄ/áå5[ñçOcšÐyÕ/¸>¯×/v'áw$¸1:ß‘àÀMø|G‚ÃEÆ/áÂ=‚° ]ܧ5à&lL/ì.2NÂÛµ'á×|ÆåûÊÜ —ëx o×>â—ðš‚ÂiBg­_p/|¾ŸêõÎ"Þ—# ïÝx $wIg,/μ…•×ò…_ÂÛïr¾th2ר‹^]oVæ &Åw@¸1Y|±`ÆMuQ)ߦÓ„³…k?OñçOMæü{чè~jb¸LŠõÌ’õ%R^‘à†›jyG‚ÃEÆ/áÝ’õÂbšÐõ÷ÂW?& 'á~ª‚ÂýdÂRÖ/¸ óÞJq¾Î- _Ý(nûHpýð+.2~ sÉw/,FBÌ;3â&lL/ì.2NÂýl…ûù ¸ÝKý‚{á½Ô·°ŠE¼ðKøäšéNXŒ„ê+Üp®ï`p¸È8 _[MÂý|ÜZˆ÷Â^§ ][ñK˜Eza1ò×n»RÈKèŠ,ô/œ„óJÂÇùª_`/[“êq^#îU—ù5UñçOc$sx®1ðÒŠ'¼p~ufƒh2–`À½¬W/n2]W6)Ptá’àNUŒdlïÍ›èùÛŒÂ>ã¤ú ‹ÑDl½þ€{U/Ðdº hR hyÍRüùÓÉ\ž:ã&kL/[¢˜Ø 'á~ž‚ÂýLÜîGù‚{áý(oa•”yá—ðj)nza1.´0ÚˆC˜L/ì.2NÂÇ»ïLª]ß¹á^¸¾úÎr‘ñKx{ÍTüùÓ -,¤3à&lL/ì.2NÂýL…û¹ ¸ÅÞ×÷Âûz¼…ÏuñK¸¦Hpc$T¸iÀM¸0š -ÍC‚I¶ÍS.ÛÏdÀév_0-n1/ÙÝÞ÷0 »w³”Ý»yŒjO…íâp“5¦“u &ÙˆÒZy‚Æ@æ4§5.zO¯5àŒd·æ"ã0ùöa­jÒNíóXÕæyžr½G=äñ·R=›}ÆaAÕ˜¢°Š{Ù9P^¼Âë€iq‹qaÛÑ֊ƾp˜@øŒI ¬¥þó§1>/¦oHüÍ#o"ø6Q™‘øÉŽ%vøJ¼U;|-Ž•ñ#¦Å-Æ%Z9¹È8L |1E¸ƒ¿RÌÎÛÂé#>½Dˆ3L f»Íä"ã0¡°æ'®Åu5a9hÏ6à“ÙþpÙmm2–UOÕ±ìxc¼|<ò&ø`åO¯!îŒëž¥¹È8Lá2ǬÈÅBÁøb6”ïÛëL‹[ …™Æ]d&¶ G+ÓÌRøðqßupÇeýŠiq‹¡°MMÉEÆaò‡m¶ä¬Èõk{BqØÎrxµ4W6ƒ[e­##Ë‚ª|-./íÑϳõ¼œlÊøòbÎx’»³yH0 [ü¥¸l‡ëŸ?ñ%ƒHXÊL‹[ e-Í\d&Þ™±Ï¿É"ÿöû¤g‚W|’5Ê"2O0ާâe!ÍË:”$ÃݧËeûlÈão1L<Å]®î ã0ìÊNÙ6{±˜`VæúÀC¸~Ãnq‹ñú)ØLN3ž£X öûª~"6ÑÿùÌ#¤§_ÝÝv‹[ …mhN3– …µpgcoJÌŠ\Äö ._ ‹ñ _sm,Êî>ÙQëå²»Owغ¿Ç­‡@zèÇßN¸*z1á1cY@µÆÖ½òûXc kå»~}~ü-†²N —Ë„²ŠV²êj0øuJ—k`_Ø-n1.¼—æbÀ2ðîyÕf[ÿçO0xŠÐÀc+ú7ì· Û°6œf, [6ÊõR*˜ƒý§â¥š|©?E†_*ûˆÉEÆaBaîÛ¸¼Ôlc˜½Á¶ÚÅ—W‘u†Âø@ÈC‚aÙÃwm0ÑΟ?Ù9’)kl ycZÜb¼áÅXX.2 o¾Ü ï…7_SgëÑÊs8oL‹[ »tV:N.2 k»È²IX{RfÿÚhçiq‹¡°­2’‹ŒÃ„ÂÖðƆÂd˜px³üNß0-n1“?:Kç"c™@X9 /Þ¾÷œåéÿ>¼¦wc./>¦ÌR“KPe¤B£ Ÿî(ÕCËÓâ3qÐQŽÎEÆ2¡ðé 3ô4‹Yýé­ZÎx§¹z¨÷Ξ^¹ÈxïžæË×"³"ÇŸ?Y=QFe@/A;1ñÆYÎcÙg, ªr´Ï¼KT%ÃÕÅÈ|gc©yü-†²ìÈAÆ2¡,ûü›WyoLaû¸Ý¾âÍK¶;3ñí.¥s‘ñUÞÁq×áÊmÇX¸½(¯fÆ+Ks9ÁäçR:¯*æ…"lâVËËœ bf[QX;a€<þCUÞ9ÈX&”e µø¶åÆÌž4EK•3¦Å-f²«ÈG.2– …íÂ/Ø;;‚±|ñh@Ænp‹™ø–mKxÈpi#|Ô!Xyçð’ýùL¹¼×{°ÝÉØ-n1”µšÉá4c™P˜»5f/5 ’2âŽ/œp^Ø-n1“]F[=&Ÿ ÎQjÊrÐ,Ì`ã…`Š÷ä¼V0‚šÌaãö‡TýßPw옃ë9<Íäˆiq‹™L€á¨&øÂaBa>¢¶‰ºJüƒ¾H|Þl·ˆÉ®¢Exä!cYP•ýøCc±`<÷r¹¸`nÀ‡FcÅ‹2lëìÑIw‘q˜Pør7òPXí ×ų0-n1?ÁGí\d,¯ÞfóÏŸÆ(ì73(0`ZÜbØÔ3M¾\d, [¢j¯KCa2–2ž©:B‹¡,·ÈAÆ2¡ìénô@‹Y}Òì·'㪚Ìä_Ë«s‘qíèÍïÛfÐ?S|½ cÔòøÛ‰É®¢:½o, ªnìùcMQ#æ6G>Îå¦Á-†² ¹‡e@Q~H˜Å›ªd_)·x5cZÜb&»†¶ÄM”d+w,f`ÿó§1³/ƒ\8ç?`ZÜb&»ˆœÁ‘‹ŒeBa[†W˜)™ÂÆ,]7g]Gì·˜É~wmÉiÆ2¡ðîwsáh[ b_×Íô€ÝâCau1v¿£o, ÛI•YcO1ˆõÍüÖxb¹úñ·¯ãÑÌ3œÛÀóéçÙù Úµñ*‹9,¨:C#¦Å-fâU<®æ"ã0¡°u}–Ë+‡6†ʬ»p,_ðåe@¡°6&›‹ŒÃ„§¥ðc‘3 “Ù}ŸùÊHæ€iq‹™x)}効È8L |ð{½0ba1ÕcÙ[ú›GÞŽ,L1ufZ‹ñv,±êȲH12שmŒ;fÈão1/ÞÕÙ'(ŠÚl+.\Ý\”ÌæAaáL‹[ '¤¸¢G.2– „O¯R\£³úwc¶É×hŒ™x=†G×®%ðM{¸ŠÛæÂdН5ñ€¦Å-fâ¥T†$;$c™PØö€-LžJa2ÚçÁT§#¦Å-†ÂZ¡r#”d/Þ7æÿf^;‹/¨­>Iš±Ü"¦njP2v ªÚž»†—Ë’™c§¼µ\¼øµ3¯b­‹ŒeBáC—ôt]˧Õö$Öúá·[ëÀ¥î/Aÿ‡-µÔ~ýþü  i4÷ »Å-fÒ%l>”emldׯ¸¬1óÉT—øÈXÙª„Ýâ3ù¬ÍÅ€eBaVк,›/…ÉL<‹ îÏ€iq‹1áfÞÿ‡þ1qú“ Ù~þƒñX >0øÐ ˜·˜‰—A{¹È8L(l\Àusa2-;‰é¾1-n1/¡m˜r‡ …ã‚.‹ “ñd±ëé—4cZÜb&^Êmë\d,“?¬z¥šÛ5™,b‹Ä(–kÀ»æ’ÉPvñ4æ!Á½Í$o–Ë"ÂüˆY¼ô ´£ï†OMÚ»õÉYý—sÉÙeë©gÄúëox¾qhò¾¬çåœz+‡#³5ÛÐÁjŠ6¹ŒÐ¿…¹þÙ«-º„/ì”d6À͆nÔ$Ãüùn·›Ÿ1-n1/ê/Õõ – …­šWÏëטå׳ªX“–!¿ÅLv ¹™C2– dýëŒKÈ8}0³r}A<úî–ÔÌ›ïj”yÆ2¡¨uq 9pwûClCõÂìo¨ão1”åþ~¹Ìxiw” àóp Û†ƒ¨ÊÆ%wËà3ñÎõ'\&ØÅú6_Þ=Ç8Çl;¢Ñ Ëâ3ÙE´IyùL°êlÕ“­3ÆCY¥_÷‰}«%ùF<úaû«¸ÆÖ7 jbK~–ÉP“ k"pºù¦Å-fúáf¯3\dÜL leŸm»£Ø}ËRøT<†Ìd×ëßvf‹Áf@Q+ëyö¤Q•Lµœ’öš/#äñ··Ú¢Ùg, ªZ¡„k×6˜CV–K஬“ý.‘’}Æ{¿¢^…Õ`ĪGT àŠ͆ö#¦Å-†ÂÜ*#Ë„ÂV~›³9Ìê@½îñ€iq‹™¸³Ñ&Lå"c™@øô‚›ü ,Æw!mlÈGL‹[ÌÄýÎ6'~F•„7– …ÑoÄïá Ö ük´1"8b3¸E0¸kÃCÆnAU“…ØeÉ̞˳²†ï€iq‹¡îR÷ÎEÆ20;ö¸Š…+j‚™ý±¨¬Õ;`ZÜb&»ŽIË„ÂV(åbE s^žzig ¢ŒÝâ3Ù/â†Q9ÍX&¾˜ âˆ|u‰?§èTØ n1“ýžËßµŒP(ʲXƒŠâéqzc¦yø-lù=,,þ2vJ¢Ú.Ÿ¿ºÁþªV9cÄW¼ºÆLvíU•‹ŒÃ Ëäœ,Z a1,º·V€jÀ´¸ÅLöƒì.ÈEÆaBa«,ƒje.k¸úNÓÓÊ6ehGß ÛJÕ©YûÊÕ—sÉ se]§~'å?.ÑŒ˜·˜‰Ù^ÊÒ¹ÈX&öºQ'–›®ˆÍÛè+ýmÞ|q'¦L´£©„ïãÉúT2bõêÅ|5GLƒ[ kéXY”EQ/íÜÔsá½-®zà]'c&û!ÖW’}‚[ë9U®ç²lzì$³p¨²d؈iq‹¡¬Uš‡e@YKº¾ZV ªzvëD£éÈÃoÌ€g'åæ êx(z »çâmþ!3[N… 2äñ·VY²„´á c™PÖˆrœ`æÓç·ò`oäßcEǧ°>½ùÛ»™›~¶N9|)QeY÷»Å-f²_ÂJrš±L \½šÔlA;ƒü¤•¯J[%èÇßNPÕ&ÂcƲ ªÕwDfÎ¥¸*™Ãö¸Wfä ¿ÅLv-2)‡ dwV ²b|gB-^ ,cZÜb&û=hJÂEÆaBa«iˆš©õta2¾¶KåÁL‹[Ìô£ÒdÍEÆ2ðÁÊm£åþ4†ñr¸Å„äˆiq‹¡°…?ÂEÆ2¡ðfuÝx5(LfãYݼò[Æ´¸ÅLv)-ñP¸ÈX&¶n5Ò5/®Kbå²GTKÛGh‡ßÂL’l˜gìd­CüÜ;hŠ)^h ²jÚ€iq‹™ì·ØZûp‘±L(lÅD/·ÑˆÅ«U/Ê—±Ü"&û9¶¦,Û%ôU“@;‹zÁ6٠ؾ;fõÔmælå‚Éα ù=Û†]#ƒ _+ß5쨰[Üb&ûÖô‡ÓŒeBa«ÕºÇR¯`|mWeØuıثz Ö ,¥¹ÈxïV{í‹W¶¼¼NcX×O 0-n1“]J[J"‡ …­2ðÎ÷ŠÂdXýnëWL‹[Ìd—ÒÖpËEÆaáb'… ¹ñ“Œ/0F-B”K0-n1“ý"«U.2– …w^W=[Nlþ(]¶ÎyÄ{6A&Åãï…^ߨ n“]@ …‡ŒÝ‚ªˆÕãêy¸8˜…½ê3™#^.&3ÙÏÁ%<$¸¶pñÃYPw¼,.KÆyì,`8bZÜb&û96=.2– „«ÍÝá×øÊ_1Õ“X¸/x¥¿d&ûE6=N3îÿî¶?ÇÏN üoå³oa—ŒÝàCY+Ëe‚s9ï,I ÎG\bª/8ܹmÀnq‹a-›9 §Ïmܵï¬[cf0¾ç¥=1lpìÁ$3ÙeÄŽEyH°v{0w®_­b+¿bX2ÏÄòŸZè¼{ölüŒ¶ä!Á0 ,æuP]v–ª¬ —–ŸlÀ4¸ÅLökÐ}‘ƒ7Òá<-ßáÛ"‚ÙlÝÚó4`½Þwm‹ CI›Šïm[ÄÎ}!à|Ÿ@0«m ؽŒ{†»ö ™ìZÞ‡pñÞö  {d\ý-œ…feN4²®ûÆ´¸ÅLv1 l.2– …O¿¨œ¢p Ú*»®o¾$‡Äd¿Ç–à„‡Œ·X’sÌ6;V™"îQ±p‹ štnLƒ[Ìd?·_ÞH‡SÒB’µè»ÌÌùò»­F\â»hÌÄ‚§ø†‹ŒKû.¢¸ãÎ èS=b6V„ÅaÑôŒÝâCa[yN3.mªçáXÈ}±0 …Ù¬h2¼biZ†~ü-f² i½÷p™±L [80G™r®×³yáiÖÅ)c·¸ÅLö{lPN3– …±—?GO•˜Ã#V£ñÕÅ*ïke>#yH0 »2Ⱦñµ†¬˜ûQ-û€iq‹™ì÷عÈ8L ¼Ù½^­Š=ï¯îKÃÓˆxG†<þCY?ÃAÆaBY›¨~.¢2ƒ©œvÀøm_ð¡A&™É.¤µRá"㣠2–åÅeÜ8šÆ·xÛãx|Á´¸ÅLö‹lÒ \d, Û2†ç÷ø¨`V.yÂãˆ〫–@‘™ìY)\d\Û(„mÐWÙ6eòÆ7JãüŠ7eò CaËÜ.2ÞZ&ƒSÕàôéSì[ñ<Ø›7ÀMŸ2“]H~*ä ã­ût¶û—‘}ª ¼œÍÁí#6ƒ[Äd—ÑfëÃCÆnAUuc½Ôµº,öˆQÂH>C‹™x 1b ˲§ÅaÁùRÂ`lÎODÙö-$$CY[82.m!áqÁÛÊÝä%¶íä| Ïòè»áÕ·5ÉÛÊO/ç’ô(…‰±Œ5§=ë7ì·˜Éd,öN3^Z,ìôùÜ4¶÷blAôan°[Üb&Þ7,§Ë„ÂÒ°Ek®kV€û#X¿aÜ"(kÃÚp™ñÃÜÓ¿±X¡Ç™½`. :¸‹}Ä—– ‘¡®M5ÊEÆaBak×K‘û`Fê1!ó_ŠÜ“™ìZ¤^.2ì¥å­½oÜ1¯ñFSObZ76ínýFk×Ο\Û·^Áø²—ƒË2¼4ð2‚¿ß™'ÇS¹íud“Œo~‹= øR“GÆeÑÄÉEÆaa~AŒÛUžŒç7?¹HyÄ—fŠÉPئ†å"ã0¡°})_Âdš}~Ü ûç¸ ñó›ðK˜Öäø½s°ÅÂ|ݾÁ—BÙdüRã›-‡ „wÛo×ßc1º§Å"&#n÷¸0 x»§î"ã×=fÆ>{àf ïþ‰°½R(‚·-_ð¥½yd\x=š‹ŒÃ‡-Ìè^$'üÅÁJ‡uù‚ãM"Ó½JtðF¯éP³æ©«Dx¦ªs³Úˆ#s—D¼Î=$Øç­BM.÷Á™cW+£¨Æ=¦Á-†¢¶·Ò=$½ü€U/ÿD ÏôøÄ¢åòø[Œ‹b&C2ÈòŒcB–`¦:=Š6`ZÜb\-²\d&0V±þ©fÔ>˜ƒaz¬´9Ö/øRØžŒ·?ËEÆaBa6ë—ê(L† :‰úÓâ㘰•‹ŒÃÂìüZcÈýLÁÜ¿tž–ÚkÄ—ö3‘qa|Sä"ã0¡p´ÂÜuM=®ÓÙ5õ/L‹[Œ £¥½º¦¾Çaáb«ýº>F0Þ§8™}qÄÑÇ Óõ1ä"ã¾qµ6ÙÓŸ^­Í·ekg´ù/x)ùéÙÚ|im~ãxjÚî–¼*OVuµ6ÿ#yÕÕµù–¬J.2î“W]­9Æ„,„[›o+7®Öæ¿1-n1.ŒÄÕÚü #îe»süºÎîoô òø[ŒËb*R2Ȳ‚µqTqð“ŽÕ­õü‚/ßCÂeñ—‡ŒeÕÝB)¤ø,‹ñtS×Ó;îo|)\DÆu’‹ŒÃ„¸ÇllÁÖÄC±}—’¯!Õ«ÙgP=l‘“qÖÇ‚±~Ü™¹ŒðòõÄÖK·å2ÏX”´8×ziWm0žÁKù¿âK»jÉøoEÓ#‡ „O.–4Ž·VÌÁ=ŒX¸ýÓâãÂgó`P–ãØ^–L“9¾â^ö8Ž—,ÇÂoø’½¢5;¿æ`ïåÐöõ ¦Å-F²[s‘q˜ü1ÕyæŒÖÊb8þ4¦ áõ1-n1>›‹ŒÃ„ÂHÈñ&s07ìÅ.ƈ›°1oas‘ñKx‰ÖLÂK´w:m=ψ›ðÉâuMÈ]dœ„õ´ÙR ¼úÚãÔæp|iÍ%—½JxH0 Z¢9“j‰2¬¿4â&ëõ˜šŽ»Èø%¼rÑY',¦ Ù|Ç€{a[mÞ„ÜEÆI84ÛªØl[¶‡ãÅòø[Œd÷æ ã0ìÖÚ3—Ý¢Å3…Ûi2l²Æô²î ã$íYȪÅs C_°—Ý·ú–5¿dk4g®ZÕÜ™JÑ´GM²h„i‹[e‚/çÔcbÒ^PLhœß`¯i¹O›Š;È8Éîóû!ÇÂöë‰tæ-¼Ïeᇸàêëjóøû˜rqÄí÷n¬iÖ~=$øúµV† uB"• ÕÜD«/\ zH0‰bqåpU2‡í‡ÓÿoL‹[Œ¾Ws‘q˜@øiŒ_ °óçŠá䞈õ+Ö—3mN,\d¼¶9±Š"/3§Èmço#vû>ÀëõŸÜÍëdgkpÂCƲ ªæV‹E{Sm®OD¾_–„¢Ùÿdç\¸eÝ|&¬1Åâ<¸+ËW¼ùÜ–3/ÅÞyHp‹É0p— ¨fÏML9,§¶8'c·¸ÅLvfÈEМf8Öq ;AUl›l3.±´Z¥³…?XbÎËŸE®f°[Üb\xm2”d±oÝ(Ö>°œv„~ø-b2‰­„y†:Š›}Œ³½~Á@7ec/lÀnq‹ñZ·æbÀ2°…õŒ²," ƒ0-*¯ÕeÄnp‹qYôå2ÁuêÆÄ5äì½ †Up‰ø0d\<°3.‹–'\d\"{pݘ+Î8[bÔ˜Ùöÿâl篸x'g$|t.2.Qó©n\&H޲˜Ùð8]\®¯±çŒ ã.2.Q–¯VVÅ(—–ˆ7ÆÖ„?/º­ª Ö{;#ÙÚ9ȸ- p³îc0ìÌã*aqΈ‹ºd$|u.2.­ûˆ½mçK× Éàõa5bjnž`¯¸YBï^RŒ‹`kÓr}Á¡J¦ÿ©r‘q/\-@ÐßZ1¼—µØÒ‘Æ­%ÓßZ9ȸ¿µ»%{äSfŸª`fëjâ"í_1-n1ÝË.2– „O{‘³åÚÁØ7q³«„v‹[Œ¾‘ÍC†2€ìå$öó {EÊ¢xÈFsì#v‹[ŒË>MCsš±Lal¦]8(`úâ`NNäTäfYλÅ-ÆÛzüÂpš±L ¼D'‰ë‹‚9¹†×ißèÇßN¨¹4û/±¸¨îÜ• Ž lƒyd°¢¶zÖ‚»Å-†Â§/±Æ¶î›»Á±X\0X¥ú iqºÌØ-n1Æ?5§/Q,®b›oõO å5æ<ü:[Ö;`·¸ÅLöä ÕiN3ž#¯qݹ|µx:C‹Ù­‹€ët|Å´¸ÅLæÿ.2³Ü2VcVÎ`ÇõW¼{f+g&sŒÏhs‘ñɰ*6c4|.¾<˜k5íl±1C?þÙ t¸Ìx‰­àõXlÿo9XAè‘ ¦úía6ûÓâ3Ù©!±Qs‘±L ¼Úœ`AÆ«ªÙ˜Âò˜Ù0-n1f-®æ"c™@I‡ÌëÿOØ·¬\³,Õöë)¾æÚµ¬{VuᨠlˆCy©%¨ôñÏ—ÈÌŠšàÞ°÷?Æ—cÖ=322ÂSý ”ˆcûü¡|sÌóE 8œÖG÷ç6É/*ü N»´3rW:aùƳ·\™x(…4Ïu—Ö†]1:*nY‰‘9]¶R8,{ãÙ…*ÍXW?,$ :3oˆüŸ•};hûÀÏNjeƲpyVÏ5Övx NcöÊŒ2n‡^æo¬W0.…£d ט{Ù`BF 7n²«²«NXH°—e^ü^ÕDˆìz¿pÝU¨ªØÀu’ø®½d!¡÷è7ÉC 2B$ =ÅÀKDz7ðùÝ,öÄ,s‹ò ŠaÚH0‡ •G:éÏÃöå”§ëf],ÖãYTdGŒê\éý(æÕ ¾û[…슊X|Ná`jq!dŒÅ(é÷È×—^¯uäDüf´)êBcd,ŠE•\Ë^Lq•Ý ¨U8Ë2*À‹Q=‚‘îÓAwè¸^»Œ®£úÍ2wÊÓc6±ú"¼êvi<ÿÄ1:©îé»……7i Ä0Áë¢ò ¸£fWÐu­í[5OׯZƒ©µÓ}‚v•HUõh*báºÎ· \².Ôn10Û¤bvXø£ÇIuŠo•ë±>fœŠ-/7·nð>43ÜÜÝÀ´e]¯½î£¦Ô îúA`κón–¡£î ?8œ@ä5³Œ+~]DÝY¼¨ÉÔ6ý‚ÒÛöãªÛ¢O¡£–ÅÔ¥|XŸ›=9¿HÅFL ë7>ÐØ›¡±u1ÚìuO!™±Šuƒ<ï`0L+\Äøm<‡>àˆ¾›D=óbˆ¨vü­~±¦;zˆP2Ì„"(O k38Z†fùÉ"ŽífHå`v3Ö½ƒ¿nFRaüZ4´ó­±S7ÃðEXÓÍ@'ÔÆŒx£›;k£çe@(M™{ Q.§ùZcZÂÕ@¶ÜŒ Ñ:îä¡À€˜âŸ‘Ï ÄÛ8‚4n†mL^ðÖqëRCn†È‰í؃›Ë÷çTcnF Lk¬›S #Ç£Ô•ô›KÑp ±Æ}s™˜îo/>ß\Fª§X³¼¹ÞxÌbå•òú"`|OϰÄ$ ËVån®jáõ«e7~à„÷2 í#?r±Æts‘³ÅXü¹¹zR|54£Ä: N§—KdhórŸn7×Hhᦞ‹õöýßtžÃƒNy¼ ŠÎy¸ËÁ¬Ì¦îl0Ú~曞çÞ,ÜÜ0ôQ™Âˤ‡9tææwú0Ÿ×ç^_27üÍÏ ,±¢óçw ‚âóLý:}.ÛþóÏßÿüûðyã.9Uãÿö/þìÿŽ?ÿú_Ä‘Ïù9îÿàÊþmø‡ü´þi˜ÆŸ¿þ©¶ΙÿàdµtÌÍ íH§ *3³gþËf‚Ó»,z ÕˆÙª—½Î´5R` ésxN‹0 åàoÅÄ]‹â6Õˆy–…Ý­iø¤RöÓ˜•ÕêgBPÌg°LñÕŸæ„©»‡ˆ˜é³àéÈ”Ïb˜ûÓVÉŠ“]Ìôuhpì: Y¡Áy}¡Ÿ@Ìι÷îaþ2¹*ísËE+fþþÀ#Ü{(:Æôœfø½ƒ3 Ô]~u–S@ SFÍsÌp> nE0³Æv ' pM?á@ÀœyžbÜk€‰ö\r #$á±Þ²ñž…·›TQÌŸ ‚Ý'.z9Á:JL?é šè@Àëw¥jñOÂí»KÕÔG{T ‡òð ènA~£3\ vD¸ô43®ONчË&Oub²¨Â¼ ü…,Ÿ®òï#c¯ïêTSiá`èØÄB£¿u´ ¡pPC«ÝIOÇÃ)?ƒ§¶ð<¬*¯¬Ç¡b¬(]½dø2Ì.Þªçpt:ã·ÕYõዘ‚¡7t¬Ã| 7ÕE oÀÌ!xŠo:,ÆÓesLˆ†Ôsx9ð` fÍÊÖ…ù±Î:ˆ]W¹Îp¯ž2ú:˜ÍeEá±*[ÕY}ð•,ªé9ùül¢1I1³Íòž0Cö-÷ɤª–¾`«'èç7هوõåb™ÀU•19H©ÔìRÍ(ùØ9W+…# VöÓ³¼j{, NÎzk®Z¢T5<5ÒZ2«4ê΄†µØàá6ÁTI˜”p¨ԔöeŠÁ«Œ«ätËØýåz‰%øøtËlÕQ³ªœ'Û¤Çêl+ëw£ î˜D5¹Cþ8jè𙽴•«ŽŠa¾pªÒC±é–…ŸßþA‡½.š%æpµ'Ï7³ ÓμôàÌÁÔp%¯‹ž{1Üê ÿŽ.›ë7•ø:Ô:A;_mƒ(ú&°Ê­—/\>‹\>öanš©£–Ž—-6‡EÁ›Õ¿H@…ïH_é’çŽ!xÛà9Ðs€è§CŽ!|.Q˜t È|³ˆì)rÙG·)é*˜Q7զɿ~úþeU!æÚÞãAEáˆU%wÊÌÁÒ Gœ øl°ñ ™ýåùÜG'ÐÛ«÷õÅ{uWt+«6Lšï«p£]#¨£ ¾wÏP:¦‡‡Ç§ê§@pv-rvÙ±µ±ÎáV½ïŸó¦,á{ý1®mŠmF™n6%‹¸•;N`Ú“¥UA0X˜£dðk¬-~˜sÞ•ƒ>Nó!¯ëVG »ÖPY¥À§ðÐμmŽ¥M”!`š¿M[ïE©¨ÀË¢¥¸Í¬œþLq?†GWÙö{Òä§šXfu=ãa®Î¶ÃS60rJ±˜ˆ‡h–«MŽøÚømZK|ŠÊì¼Ñ%Ü¥EÁÔð¾éŠáÇ ßÉN²Eß"8ää·GbìYy¾áÑS”;ûl^<îTZªA”òª¬ñŽvp v%m^øŠ½éØ[íÇ[äÑ ¯/ògU_ߨ]Üþœ#Bˆ¹ ÆXdÂĆI{P³^øT¿1VüT‡n¼Ssõ™—àÉD„3’4`æ¥ Åð¤8C-®‡õ9x0¡¹Væÿó_c‚óç¿Ã}^îàýÏ©ðåŽù–¶‘ã ùûßý˯㯟V?¿ÿËðËÿüé÷ìÊÿÌóüò„_Ãfþ3×lðVœ°bú¹ÄŸŸø1üËÿƒ±¿ø½ü¯¯}·óÕ©<Œ™•gÄxžg’]à|­>ÿιg"~°…~ãf"¬Æs”7M“3&È÷GcÂHÍJešN%ŽúK†ÆT3&:3Á43üp¶ã:#jÐÙ0ÑLà ?ž :¯Cפ³L=µóèå¨0S ÿ”¡2ÍLeꯙcwh5D‘‰¡7ã6™ÕCŒj&ˆjÆ„­ ]›Î ^ÛKw~+Q͘¨?fhT3ó™j#w˜1QoÝ ºc3t§øïÚ£üõf0ùÉÕÌ$ó~ÒúGø~ùõcöO¿–Ïëï—ñOÿøû_ X™7 šÆŸßÿiøOO&ÆkåqŒˆx"Ü.^™OEhÖó¹¹à¬[ÈÀ°)8¥Z0njƒ°P[È® êðy´µ´d¢Y0ñßXœ¨-dïçù¬?a¢Y¨-â7Ô²pDRƒ în÷¿Gw7pï Ûˆ•àCýƒ¨?`èÚ„ÖÈV2ÀúaÅD; 3Co¥6²•ùt%dŸÍ :+µÉ'´5²•µî²õoYÃy\­Ô&þ)C×ÈVð,)VLtVj“z@b†fC(å㱕ڤZ©m[9X—¸îlDƒj"ZØÀ¹iki;³bzfÚÚÚÈÊ<Êyö9÷þ!Á4+­Mü”ÖÆVfÕlw|0•Ú¦Z©mþ·—\ŸIòçû޽ã‰#Èㆠ/”Ï‹§¬çŸŸÇ2~Æ7xÝLzÝ<ÿø™Ðòs~ÍŸßFí]ê·ÏêÕ©DüÑælßQ}ÔÚû6ÎV4yâø{éN Fz˜Æ:,Vb-–w|¡Ó;NáE27wL†d‰‚sŸÉZ§„ͯŒczÁ*'b¨ îžàSÓÕ‡¢ˆ*±ƒ"ˆ^‘Ýì5Sꃨ|ä2ìA4EwOð©ØY `/°q½ì«ž‰z Õ»É=~ÝGí¤c¥“ ŠVzÁª'¢Ÿ»'øTÄ’ìCQD•Ø¿ÁND¯Èî vŠE“¦X‰*wÜ vŠôŒ‡DtOð©géCQ„% “˜¾`UÑ+²{‚½âD/K§„%8G~ê(¢)º{‚OExdŠ"ª&ð/Ø)‚èÙ=Á^Q+ªbUâø;EMÑÝ|*Â+òPa -Z½`UÑ+²{‚½¢–È:Å $QÈ—Qô7އ?ú†ÜÓ¶å¶§ØÖ‡í;1ÚÖk¥‹§EçN+ˆjþø;5íTº{‚OExBŠ",1ÑÃþ‚UQD¯Èî öŠ*ñÞ)Q%ºû3P§×îÆ¡ö ¹§mËa‹ÓCN„|ø‚UPÄÐI°{‚½âN¿O§D•Àòà vŠ š¢»'øT„cñ¡( ƒL_°*ŠèÙ=Á^±pÙ®S ¢Jœß`§¢)º{‚OEø|Š",!ßá VE½"»'øT„Çñ¡(¢J`q÷;E½"»'Ø+ÌnÒ)a‰ÁG/XE4EwO°WÔÞ•N1ˆ*Ñ uzgÿnsß{Ú¶ÜòšVÂªÖø‚UPÄÐI,ÝÐ4™·"b‘Š"ªDÙ^¨Ó+ÛãÙ·Éõ¶!wÈ'Ôä*aÂÀ¬‚"êF÷{Eì꫼Ü/Øé‘ˆ#tï{ضÚò—VÂ×€^°ê‰:…¥—&óVDìÙCQD•€sý;E½"»'Ø+j÷S§„%€þ‚UQDSt÷{Å…ÍbUâèF‰vŠG?JŒî >±2÷P!‰C T/LôŠìžàSñ(éîÑ;T—ú;E½âQÇx”tŒ+£V:Å ,¡5¡¬Š"š¢»'øT<Ïý©xvS˜E,¡½`§¢Wd÷{űªb–PÀå VEMÑÝ|*>Fo«)^°Ó#Qß7êÝäÒèíP¹ÔN. ,\Ò}Áª'¢Ÿ»'øTÜ“àþÐ[ߨS[»Á©»6­=Ii ]§„ͯŒ«~Á*'¢œ»'øT<Æé©xtÓ”ç7ìAôŠG›Ýü$óTT‚ÿN1K¨fÀ VEMÑÝ|*î¡i%ªÄú vŠk?4î öŠ'™;Å ,±3â«¢ˆ¦èî >~úPQ%¶o°SÑ+²{‚"ö`<ܘ•°Da¼Ô VEU1º'øTD|ÀCQD•Ðu‚"ˆ^‘ÝìÚ)Q%Íô‚"ˆ¦èî >Ë\žŠ¥›ÅÚ ö‚UÑ;Å: vO°Wœµ>Òƒ°ÄùÛøFUO8^pÑ7äž¶-·•§Zç BÕÂntZa'·ô£S÷nr[:¸åá<ÿÈ-ç:²`-/Ô©5§ìPû†Ú’ó”Û³™JHའ—`X01t{7›I橸&f%,1‘Áª(¢)®f2oÅÞwNÅÞ·ŽJšËü†"ˆ^±s½ÿ$óTÜÞóâöð®ŸZ€ÁNDSt÷ŸŠOf%,1?˜VÅùéÀŒî öŠ;ƒ ;Å ,¡µã¬Š"š¢»'øT\CÓJT‰¹šVØ)ÎýÐ4º'Ø+b›Çãa ¢JÛö†âñ¸WÝ=Á§â>•§âÞÍbNí¥{Áª(¢Wd÷{E„¥ö‚ÆUà|£N­÷dºkh= [êéǬ„ÍoŒ¡{Á*'bèz?f2Oų÷›ÏÞ«~2çqFÚÑùØÝ5´Î§CžRÛ‘´¶Þüþp`VXåö§3º'Ø)N(¸öç³1Uäü;Mf ‘Ú?ã¤ÚûÏ¥Ú;ØQñ³óWXUI&m©2½+³ÂN•Ifz•³›¸e©N &îUƒ±ÌÁ]x/XUIôªîŸqRíÝéRíýíØ€ÑT+ìT÷y{ª²ÆÕ™»VzÕ`,s><›VÕSOJSqÿŒ“êù˜ê4¦Ê 0÷;UÖ¹èUÎn²“¤º0¾¾W F2¸–nÙpX1Ó ÛDÆI¸<Æ®iBÛØËnIµtج Õõáe‡êúpÃ㆘¾â¦;© y²‰Œ“ð9%Ýnt £ˆ†ã^–åI{™szÁ‡¨ÒõªÁ„ 6O½aY®¬‰¸ÆIµlI´ó Â&¢Ñ߸Weªï^¦l/øÝÎw¨îïz ÷N|˜Å¾7î…÷¥<…i"ã‡ð™<¦ !eíyã&L¦>nÓ,½Ç^½Kf×R¾à^x-å)L÷ÂHZñðó7&„ wQ¾q&Ó ‡‰Œ“pswžnîÔf·zê{¬W0ÆË8Ld\»@X‰þÈí±Ya‰/ßÂ#¦©õ„F˸òÑ;ãÚCšÕ•ÏèÕÆì µ•þÕã &öl&2®] <7Ÿ>Ë{4ÆCò1ÿût™ŽXfPuí&â'±á̜ۘ‰qn_ñé$Öft”ŒA×.VÅp*֘ᬓK¸¾ñéb`f,ŒÉ_˜È¸v‘pøøUw¢1…µ`výŠO‘0caƺÛDƵ „×êêÇe€p0…Wf±¿ñÕã F œ ×..žS©^cvò¹ ·¯øtu;3Æ÷j"ãÚÂ[uü/³îä`J}ðŽqû‚Õã ÆÂ¸ÿÂDƵ‹„ã]}ƒ)™#2|_¾`õ¸‚‘0vV×.><¥CÜ‚„Å(‡Ìê‰ÏX=®`$Ì•—0‘qíá½>Û!á` ÷ÿÁ,¿/¬W0æÀ"Ld\»HØ>þ²†.‰ÂÍWxÖ/Pͯ øjæzöT×{XÛKñ´;òð]ŒJûÂfÙŽ/øt‰3:T¾ÕÂDƵ „Ký$žuƒP<úÌfÌWU©j!ãè!Õb1\²b´V—¯X=®`¤;Á©&2®] |h`¸Œ.¦R¤q%¤!wÂîq#aí £µ˜ ¸ L¿ga2³Ãk_yyA·¿LH•Ïj1ãèU8$ôKnÌ̇?c›}> »ÇŒ…ùÍ £µ>89&GÆIX¾IUQàž(¾iv+ C Í8º|„g•7â¹ßùítÑSp|Ãîqã LzÍ8ºHxó”C›¥ƒÚ¼—²½¡Ú_Áøùe£ d\»@vª!ùØÅ Ù`ŠHš¶¬_°z\ÁtßÁ0‘qí"aý-¶u5f×¾lpôìð‰Õã ÆCIzåm"ãÚEÂÚ  ˜Ž-\YŽº*òÄêq3ð *zÇ&2®]$|r¦süÆÒ‡p„ã¤ôéoÌW’Õ–>[È8z@uö€J´@6nëæc E”ŒÕã FºZ7³‰Œk Ë/ËB{Ò¡¬õ°*WoÆìp1è†å8j®®Þ'v©ò ¶k\,+fcãtÚÕ› Ú_ÁHUû0Â@ÆÑ²K˜=XϤ1«¼6Ó)7[‚j™t«òký3ŽRI=’ÙHUÌê·ãèéMÆêq#a­Â†‰Œ£‹„÷C—ŽÛC¡î°º~Åìp!Y¹ÓÂBÆî!UmÛ\©1‹×;”Ïù7—S23è5z‰Œ·Z©½-æe•Ñ6C,ü±‹ÂÅ2v+˜A¯#;^d4ãè"áÓf” 2“’eNÊóðÆîq#áL?î_ptpqàÈïâ?•Á€E(ý ºýÌÀë'k˜Ì8ºHv³{ƒ©cE¥}a÷¸‚‘°¾Pa4ã±y1¹óõÜŽ>,¤Ñê+ž±z\Á <‘zdl"ãÚÂG½_§QR0»ãµª–¡Ú_&¤ªµ•£Þñ\{HW µ©Xt•H|\åÓÌX®`†ö^ñ}ð@µ¹$y¦ƒsbiŠÙ‡¾i–üÂêq#ј²Å«îkŸž>—lÌæEáMïŠ.®çgfàI,±6CG 3xm*®„Û˜­Æcñ+òÂÅemÍHžf"ãè"áÝWs—k¡2«=»|é/¬W0ƒf ^ÃÞ}MŸ8ºH˜;˜àÉ ]+“ZÃ*ÝN ²ù˜.ŠØÁ®î»ÃGrñ•G¶SJVbqp«Šš¿1;\A <…å\: »‡T9ÿEmªP±øÈŠBM_x‹C-JaDŸ”Ud!ã­?VdõÂéóu­Ì\=Ìz¾ðZ¯+™çP± a"ãµ]×eò»uýÝÆÌŠ½:žÿ\]DWh§È}†LtÍ%¥‡^)%%ÆÿéW¬W0ÏÒè5G sñóéØoc&Û­¨¾ðâʽf$Kº2‘qtðl7Ûì¬C«·éŸÞX=®`žJ­ …‰Œ£‹„9¨œ¢ÊpeƳ†_ÍßðEƒÍH“ßj3ÁVeXœÓ/˜ñ¬¡\ÖÌØ=®`žÈ²¬ÍÄ G+í,¯Ÿ¾ñÁŒ>¡ô oìW0Ö6ÿ0šñTK²‚㞉.¥K‚u–äüàÖšŒÕá B‹ŽÞU“»‡Té%WÒi©2ýTÑAñó‚n~¡S:Um/ÁhEÕ£äŠå¬ ¦pÆÏ—ËW¬W0ƒ®ÜÞ,$X;H–“¢‡çR²bZ 'Z/¬W0’UÔ¥Md\»HÉâxÙëŠØk8§2/ÌWO#’rV G¨n¼³xá6Í+S£dùÏPí¯`¤ÊŽa ãÚE²«ƒp"$»:ÒD_,%±|cõ¸‚tù!&2Ž.Ž“zÈ5U™örÓiÍX=®`$Ìïq5‘qtðÎ !.Þ®ól!K´ÉÄEªùÌ ‹Çàv÷O0:Hr]|åK’Xì^¨•á o" Åu¶èžàÖVÝe˜ò5“¢“Ôq]AÙ©R㫼\CëÉÆ¥§B^¼V›Ö`f§úX8ÁÉPí/ƒ.#Z£ÆÑCªœ´áZM›UÅ(24îUyaõ¸‚º§9Ld]$¬O›"î$,¹vNšÕÇ.cõ¸‚tݸå,Ld] |è½5.1ݪÌè]À«C\2^bº%FÂZ /mº… õõLº2£–ÆY*ñü‚ç˜I‹t ùU Ïm&ú†¾€ËfÝqžL© ›­%ͯ`$ª}v6˜`t€äYC¸í2sÚ „Šoí¯`”ðQ·{˜Ì¸ó ¡FŸã‘}É‚9߸#ŠÖW €fv†0—`´—"wE!ÎZNF3Yû Eë+˜AŒo’0˜qtùˆªîÙYãŒu€Ì¢ŸG†5ÁNÜçÝ7Dw㟧õÐCʼn!­õˆ “³óñž2bÛ+ ¯|îkâçi;ÔàÏ9FYKŽÄ®ø<Ô%#5¾ãt±®Xt6ñ“¬KpbÏyÄ.ˆ]›iä2I舉œ °h_ô6ñ“̇"vž±lxÓ{’5JçŒ5»À§*.×Þ^±{—ÜÌÕÆSy²ÿø©Äꄃ³Ye¨æWÜ]Ä$ØÑ=Áh/E|çNÕ•"‰Õr,|û‚j~ÁÍZýDï'ŠÖÒƒG»¡ŽÐ#±hô‚G÷\_Pͯ ¨‡‹½Ÿ(ZCoaT²’ÊÍÄâ9€êf¨æWÎßôÑ=Áh/Ed ;׈w BU¢&WqÎpx'Μ¢{‚k‹wZ9¾8õ’— °Þò°‡(Cµ¾E¾dÔ{W–¶‡m©©2ó¹Ä#a¬*x¸©ÇZü@nñ<¸ëæç¡·ZÈÇÍãa1£O†JÁ½ž¶¥¦Ð¦ãà+r&v…,¢`Ù_Pͯ ntçC¦î ÖöRD†ð#¦SÆtXÃÜ–Ás)alâçTJžf%¤šßGágJ&6M¥Q!ã3ÈPͯ %'_[÷£½ñƒ ÞBÒ\ɉ ezA6¾>ípgUyX)&Nßëmbbõ±qÙ%ýÞ'›b3ŽÃw†»'¸wwÊÉ€a¤ bJîJ,üTàÞšŽŒÔøªøÀ«ph}‰’íÖX$DÒ²E‹V€VåHÌPͯ †É­ÝŒöÅmd 8Rîhø„ðì|f ©ñÕˆÝw£ó®½O㡇õÑCAºÒ#1iµyU>• Õü ‚Y˜­9º'í¡¨§òX"(!ˆÉIéUG/Ã%"D zd¶Ö=Á¥…#|(øk½\¥HB¯WÜgó¨æWŸLÑ¢{‚Ñ^Š´FöùŠUƒ?×;!¶½*D°2\ÉÑuՎ‡eiÍ\b<¦ˆ‘2QT% 7\% ºùÄ€3ÆE¨°—àÔ¢£Pöè3e ëÝŠ t†“ ´ ºùwöŒöP\8;Æx_›(Úã„boË‘_˜ýÎk $㡇LIåôjeà¢ÅIÔ’ÛË ž^ª4f^·e¨½…žÆ%·y:°kî³iX†gL…L¸ü*íøßI+ðýœ!;‚Ø9ÛÞ„Ð~ÌCɸÆóC¯ÀÓxèá%Šrsš ¡ò\°ˆè’ KLD0÷&G½Ñ=ÁÒ&›¦'¥påáŸJ¬Ú>´im+C5¿‚ "¾uÑû‰¢µôàÅva)é‘ð¾ÔüÕü b`zVx2£{‚ÑŠ* ‚jW'§•A, 9Æ}…H¬ Õü b` Ú¥õ~¢h-½—È ­ÆšHÀbé3Üb‘5–ÕjoUÙ~Ú–Z‰ëã±Dªó{HÙ™ác *ƒÁCtOpmc‰M…ºËÂŒIÈe› ÃÆ Õü ‚Ù¨9˜Šî F{(œŸ–ÅáUKœwõ2¿àâX„ÀtÓ­·×qÆC+EÛ.¤GBû.&W¶ÎPͯ ¥óÞZ÷£½ñt©øœQ ß’æTë«áÅ«äamÑ2ïøäNn:/SDî˜ø0P‡´^Ðͯ ” a/Á©ÅìlŒâ.*¬.ÁŽþ›*&èÖW#\‘6¬Í Q{ئÚ>2ûÇ^wˆ¡j‰¼©ãëÓ§ãKçî îÝîW¯Ü•ÄYŠ$vÍ·7ÌPͯ ¨È¥qwO°¶‡¢â—?çÌΈ vW’§2Ã#œ"œ7ΠÜ=ÁÚ^ŠŸWÀ^XèS‚À›¯‚Šªg¨ÖW#NïérïSKÖÛR›ùµ—XßbU bÔ&ýÌ2,±¾/bà9ƒ÷.º'XÚúþ®í Ÿ3æ-\A89:JÎç î±K루“»'¸·Í[() j‹Õ³ äÇÃe‡W:Ã-–ÎD ,2ƒ“ÝÜÚºÙ¾ð]¸¯ÞŽX…aµ73\½!pqè]´áa\r¬þ»¯1ü4ž9ÞD9¥Ïø1¡5FŸAì}º¯Š™>-‡~ô¾ð”‰IA:»Š¯g¨æWÃK­­{‚ÑŠ—¶wí……¢‰Q±f<²õÕü ‚ŠL<ÝŒöRD4JÐú4ñ¹xÅU­6C5¿‚pޯ݌öPÜsé«Í…¼ãyû'èæWÏFa/Áh/ELñÊ+¡âóa:¦]1P ºù`öŒöP,t ïcì„2¡b»¸òp3<‘_˜åš¯Öf}̞ƥw0Èf«qDA8l·ÚçòeXƒˆD 8krï'Úº¢ýà’'Ê Ë7Ä®åfÜhëú‚j~1à'çî ÖöP<aƒoLÑÇÉĮʻVa2Tó+*r·‚»'XÛK Þ›‚ߥHbó­½s®•¡š_A 8o\8î Fû"j4}F ¨IIÁÀ+gá“+[gÈÖWÇ«Fo¹îžÆC÷û¦-Ò#±úmQX®"C5¿‚ €€êèýDÑzÏõ¶ÅƒÄâ']q÷nõÁ?´e“‹µvOpk~Ñ®ýmÀ¯ fzí*XžÐQ_A`ª9´¾tº&ÓR›RèÖP3áš(3¶î/¨æWÎc‘£{‚ÑŠ–Æ ó{Íxò{ŒU4ZêKMx×L4ºz ÑÃpH!Êf«¾Â ìÄÔå ¬¾Bƒ.ÏÖº'Øù ‹Ö0W^t:M8…ç?#ß Õü ‚ŠLAÝŒöRÄL^¯)IŒŠ)@µ¯/pŽ.c ¢{‚s 1(~1Μ¡CÑ„Óq®9–3Tó+*báºvO0ÚK‘Ÿ¾™ÉR$ád™¨2¾d¤ÆWÅ«ƒ6¢ïª˜§mÉáæãi¡±7á£îÑ Í1'4Æ2-†÷îºjFø0,)…±m¨¨@)a»aíóØ<‘Ú^®Ž·S«Âí–C ÕÁøÞ±ž¾WNÈtó+^7ÝŒ¶—àÜÝ›£F@ÉcaØÆVš ›_AHñ°—àÜv´}(¿+›"H S <†eÏð¡HÇa'á7æöЧIÜAaSá%ǰ(Aµ¾^5 ­Ö´Wâiœrðúo[wMÔ«¶3r‚ÝEÜUÎ|s¼[ØK°»ˆX×Ðó먉Õaó(‚µNºù„1N { ÎmÊ*ºs9¤†oåÑHЭ¯F¬q‡µU»q¶CíÐC© ( óµBýóyÊЭ¯FD‚C[sćm©!{ Åk ¯Jƒë_™ [_X©ÄÖ¼üa;ÔN=ÃÎ>Ĩ¥írÒ_›á©gD z­{‚sË;s,\ÃÜ´Š&¼ZuÈi”¡š_AP‘Žïèž`´‡âʵB¼Àõ bTV,éëð€j~!ŵõ~¢h-=µàrÔï-÷,õ{û€l}5¼bgh½‰žÆ%§òl€é„šp&·C_“ Õü B‡‡7PtO0ÚK±~‹û¯í1kæ™àiÎDP‘oßÛÍ-ÃÙ¡±"(¹G‚ó%G\]BsøG‚Xí‰ÎÞÉñ4.½úe\”^,ˆ‘ƒ+XÄwõ‰ÔøªxŸvh}WíÌyÚ9Ä®‚Ò:A£r5þÎ&¨æW:Xˆî F{(Öï¢2ý ôg6ÁÙé ¯p ­÷*‡ÑÃxÈÁyIæ°‰Qùw9Þ2Tó+ ¿îž`´‡¢Š¿‚Ò¤,ˆQ>Écçl%Ã9\”"¤È2ïîžàÜ\”nZyá1ý(1úE¿s¸œ¡š_AhÌÛ:?@´•Œ ¦„wŒ¡JÍ ©ñUñªUòÚwÕ¶ç§mÉMÜÕJ«»A(–ú`äè̱¶kiv£§ñ>-‡Ý8sL8ƒµÑ;_àN:“øfE÷ç6á<õoR:›&¼ã±|_àoDX±´î Î-Ý͇â´næ|RŠžöa´‹å Tó+)"¥NtO0ÚCq‰Ï̪QL#m£RÒ¾d¤ÆW#`/µè¼Êáþ4.= PIq`Ĩ½£‹p1d¨æW>³uO0ÚKèc Z>µ±&C¶¾^á£ZïU» Æ%·Åw Á ·ÅgˆS¹sfh†j~¡Ä@'º'í¥¨ÛhUбïOMÀ3Të««3š»·“õÝj÷çºT‘ûA@•PÄ.9†”F@ +ž­{‚-h·øÌèÝâ#„¡1®æÔ¢ñÕàŠñíÐ:ÿ0Û®«wÆh]x¹áåOH¯F¬Ú[;ÿ$ã¡çÌVëùÇ,"z#C5¿‚àñaZ»'í?ŠÓ˜“¤JŒü‚à’ã9ÈPͯ ¤¸´ÞO­¡7ÅFÙÐ*¡T£3Ó'l/8;¹™ ém­÷Í5(}_”ÿ&ðÈç—#ó g'²©Ä*_Zô&üyÚ–Ú\?/úö¡¯.ˆ2ŒÏ™‰¡~ï¢{‚Ýç™î½2¼Z‘„<‘°Xô:{Àp4š¨ŽÉÚ=Á昜‘Ükâm«´Ap}låE_ÞÐͯ †X"«öœkÂÀ9«ô (¡D%FN7`ñüg§†0aßòѺ'8×T ¸Š¦MR$¡tT¸ò[jzÜXI«öüIf¥´)ô`UàFÅÚ>ó?}«"1*Þå<¯½‰žÆC{ ÷ÙyV*—íaÅ?¡ÙIS*a_hí,gi2.½£Œ¢$*Ð3!<®öçÕ™_3…ÊÐú*¥J²-9¥~;"¸¨Š&â¥.ó F°‰[MÝ”)!}|“…Íx#)~î®ö»ÇÌÀ#‚µÍx¬;df>¥ÎiÌÎÏÖ<ëŽxãÓÉpÌÈÏû®šÈ¸v0ƒ¶p8Ê/Q‰‹¸8K¼¢/|8c„­eÀc¬>¢‹ªÊ üQ­ÌÆ]osTzyaõ¸‚Ú½&2®] <˽w~± ÌÆ\øµÓW¬W0O#âTš‰Œ£ „¹–êÊlB/rE¼q‰1µ ã>ª,mXÜuŒ(vƒTB+Ë8IÛXìæšÏFížq©ž¤TÃ:÷AóªÌÆÑ"ÎK.¼pñ²)Žš‰ŒK]Iš—ÂõPšÀ±a;-~êøFÅKÁ•8µt\;«ôU2.½CkvRþS/ˆÛÑæEì7f‡+&Þ×ÍBÆîU:¸”­Wr›ïú]‹ /\â,ƪx‡…K{#•ѡߡÄEٰˆÓ·Õg"2#Q¬Y4—š¼h^œÿ(ÎŽÚ˜UßéŹ_¸8Ù© o…KÍŽ:¯ Ÿ@pJRÚÅæâÇjm0ã⌣f†öI®&2.5Ié¼®Ê$ ŽKçY9ßš×IyÓ_¸¸”¤™¡®”6Go ×ÇÀµÆ¬ UÃybÖ….ŽE3cáÏl»™È¸ÔðµyÅ&6Qró¡=À8KçXœïÆßOø”Öî –šg^È:´Ë ’Á(¨¿“id_X=®`|¨}TGŸÚÈwìñ̪ͫoܺ;h$ã=¾yb$Œy_µàÞ¾x fÖ°AY5£ L8IûW¼;W†ËbÐSMd] <+K&Ur’UÆ.æÕÅp^X=®`æf"ãèᥔT(°1+—°æ=”ñîªf$ŒÂ€ÍDÆ{-8{u@,¼Â•‘û~F6 ßjO¼‡ßEŒ„éi©&2Þ›ëeÛê`içÎÎÆ,t á<íûªýeBÓÞµÆÑªÞQwhѪÁhÝuö>î7V+†ÁÒLd] |hÌ1»š@cFÍ¢‘ %/<»4€‡øaôTMd<×j36Ú8ð×ïçʨð¼íJ¤÷ÂQê׌bQù>×.á}ôŽ›%Ü£•™4}ÛŠŠ ¼ðR1 ±Ç»´ZHpiNÒÝûñ±[á”ḿuúÕþ fÐf)x9ªŒ£ dn$Fz$ Z+¡(3üV%sÉxõ°U„’SqœZ-d¼Öq+v ²"ÞéìrlÍ@Ƶ d‹ö^S¼4Ì`…ïˆ]¡a Fû+å/Å`¸™Ìxj¯ŒnX%>ãGÁxb”Õgä‚EB‹C¨oXíjWŸ§aJ•YùÎ&…–Æ@èT¸KTë«áE¡%Õš¢žžÆ%ÇKzN.ÈkÌÑÏç`³ºÒ™õЭ¯F0ÁŽž¶¥¶3Ï#ô5š0q¨üÝŒ]HŸû»2ÃÍ„ô<—Ls¸î#Co&Yg¹x§ü³5¿ˆZDasð“áÄòx¹,rT(÷ûMŒe6çfQ–Èœ~3©4žÐ3žµu”çÅ©ÇÅàt:7øÍÌÉ8'ï··skßš¯|î,%£ÌàyRÆè›Éuánvze¾áòÞÊ1=m‘£XÄ>jm“ 1XIvÊß[™_õÙ_õþanÖIso%OÕŠw\Áudµ£~Y]1‡Êo*Ñ­N@z+ùä¨ÔšxVÄà9rþΛ‹¹8 e¼Æ—Ë )oæ „GMù"3xÁ:££¦‹o”w^8CâÍìqXwsBAþ;§ü»™~ ¯}gä¸SæÝÌ_¶)ã ÿCàñV 8ý²=2Œér#1~ˆB(o&ÐÂC¤$gÂ(Eæd7óOqAÀyÂÄ`ê¸×/Îvò‰rΫ›ùŽJÍ)us.ޝ‚R8 fÜãK73ìÌ‘1Iû+œ§èV>œ-² ¸‡œåçV>™c‹$<·Ó½œ‘#çV>–e6"˜lÔŽøÛyuæÈ#O²“´ÜÊK£„#ðÏÝJ³l‘âD£ò™ƒäæ‚=wX*IˆƱnñÊv½lrÝ‹pdý‚„[N”éˆd"¸•¶Þ·E¡rNõpÓm¢A¿O ²c_ b¼onÐ_”Œ`Ö¥E¶Ê¹&¸é‰qˆ®Æ•eÚÈ`fW ž?zN¹ø ^ë»ð™{­ÚÛ?ôĆ6þ0ß0xp–ºëú¦×ÌûÂüEü<Ž‹~ˆGf‡Â$6nôå/CÒ⢟úñGœ=ƒÈÚ¼E¼ØM7›CÖ<ŠåŠÆÌßå»Iñµh|zÔóåsŽúÕèâ(Êå2©ˆC»8<<LjÅ\ôâûx°¶9†G§Q›öþÜŠS˜ôÃV½¤N­lsÜ (Ÿ¡ß±ò—>ys†¼Å7;ˆnÆëóÓ&‡›à“’`YH„7ëU€€mo^yÊ@Ð;®0ô›AÏÞN«O#„&¦7Âx1*uܳïßÜ&Žâ+êz*AÀ=ïxÛ›±–ø9 V„·õm»d=KŽ(½Oè]j;Ç0¾ó&2`@Ä./Þ4ÕÍÄo20˜ÿ:ðfàÞÑ»6)Í –Dxç߈©âÍá`´›ÁN˜T8\LDQ¢r½…™ÄÜ'³ºðµ¹ü$óÝŒÅâˆÇáI7c}phCt3§ØïŽÁþÍ覧:]Öýf ²;æf@ gFT¹éÁÙ¤#Hnap°©Ð:¼nuxüÈ…Xs<ùÄ ¤ x¡ 7Wü9ÒW a˜è¥Y…ZÐS„…l:`½<~s‘ùÔZ'3ËT9ðɇµœÞä^<è¢)“z1öæjæáð(M­±|É<_±Œxs9NÑPZ滹Næ–S÷¢Î¶³®ŒÝ\+ƒ×iˆ5«›‹>œºy1éæj ÆI±ÊssÁ‚™e¼ürsA^Ò!ÖFn..pæE‹›^ºãí.º¹¾ÀX%|ð•/,½küM?vÙªsü¦‹™ Íò[ßtþ2Uƒ]Ê7½³“ËÅsƒœ¥óNÙQ´åI^Ó›^ÔC®yà$œälñÃX\^Î^º›ŽB¬Ð4…ý ÏÚMw^ƒòØ|0J6Èù©[ýùù‰ayйš‹Ê¯Ÿ9ÆÏþóÏßÿüû€1ýòƒwcüïßþåÏŸýßñç_ÿk`|Ïù9Aÿ=À4þüÛðÿøi5þüÓ0?ýcÓóûnñvÌ­ù£}1EœtŠ17×wyöNP³ç±“Êû ɳ= …XÉýˆiµ wïü4Ša½LLõ¸q}÷˜Ïzâ¿hÕw^c°…êô§&ßzkƒ9™à`^c;ksgÖ{1#¯Ë3”ˆÀ¬¥ªy|aºð[³ÿÉ%9§ð0Ä`Ü;êÇî~³\(Ëa[}ǘý‰-ªÄfõ‘íò }˜ñð/RZۜ܈^¬máF`XìÔý¹(ŸÞ#J{9ÎÕ©Räè˜ê™>ø !œŒÖú¸IÅ0” åÖ& È—ƒóÃS[n9,óÐo‘ð¬^èEÓóˆÙ\ {aÓ踛Á¬·êk`Õ=;ŠQñ /ÖøNMžBÍ«ÃÓw>Ϻԫ²ÉbGñ<™@@ô‡˜5!^½ŠV'·«GªpUè4ÃSqr¡£è¤~|JñQñtĦ?XŒáÜ<]pVÌ9É—Ž |ð]8«/ce\}ñ¯ú0)ò¦ç‚ÁµŸqŽ_­¬]a«––#n587F:7ì1ŠR.Es41È |ÌàîÀlˆCŠÕFQ˜rèÕù!0¢=öÎÿ1b0ˆy‹æZ«jvÒC²°`Š'ó‚~˜Õ‡U> 8LvùT1LÙY„F£ÓZpc‰ïÅ*‡²=ír™ŒQâÄssmšàUÑH ;Íñ0ñ3tŒ|%ŠàZÍX=5?BHA柿Ë*¿Ë)Ÿ ç?åð„¡=ê>qÛmœ¢&Án&ýC©5<5øæ–³wLÁOɘ«£faæÿp¬ü•]éžÅ@q чyÊ·øè#ÁêÆò ~«`ÀO&¥"厷Çi,Õ_˜O+!¼îÃMnã2Ç×~S€V¨'MúàÿA)>Ñ›Ž¼x„ŒOc™â[·)]\ö)*ö^Æxm~¥D×"fÚ=ë•c¤#ÖÑý»N%#>´COÌÉàöÀG3Ó§dgÿ®m~Bß]%÷ö=¾&;}Ÿ½Nòì[Ü–»Óï[œ0d–.ÊÄm«šsï«*$ŠÁ×f_5‹Æ½³/^XÚ¾÷ÅãlfGÖû%–ŒàÄb†õ9¼²ý(t]iö ×NÝ>ÇW™¦‘ÓzâÔX>:;‡ºƒ§ížôX"öIoרî/{²Xüs¢ýêûœ¨.µ­®¾ùÔ!bƾ.EînG¸~wq2±‡pú!oÊ¡`51œß—p‡©ŠÍVj—ƒéX·½uꊽþŽùA4C|k¶­úämÝâÈXEñT¾&'ÍmU%O1Åi‡ìƒ²f‰÷QQâm‰k‚ r¢,œÂŠ8™¶lfàßMŸœ(öì¼g{!»žqíê‹Lñízj¬;Ÿ|Tj~¢eæÿüטuüùïö[~^ààýÏõàÜ‘ÕyX ï¯ßÿþì_~ý´úùý_†_þçO¿ÿÛ€13ÿ3æõ\@£_Ãfúó21“"“¡bø~Œxì?–ù?°ö¿·eðÿu:´1bãy˜eó¤Í3'·­Uk¸/§ó~63b~0bâõ ¢3ÌtúŽN…o0Y>m*f‚hf*ÓÌ,z¤âÇ ©fLtf‚if䯇$yX†ÿ Ná¼ ïfÝ¿|Gý`a|Ÿ/.½Å˜Úá©›ò37¾…þmõ½¿ÌĉîÉô‹¤{òº¯Zr´IDmQuºÀ/kwÞ!ïÓ²ÃÃó†»÷ ™Pª•Ï ©vOp¯û‹–¢Z;½d0)ªÞóÆUµ¸œOÓ ?…1{ ‹iBûWÜ ïXSê…d"ã^X;ù{á`šs"¼p/¬, U(Ldüî¬H÷!#·ù7YÏ6zZH°Uµ¸^5˜™ÖòÆMvVÌbÓ ?…mNÂbšÐþ÷ÂÎeÔ„d"ã^XÎé^8˜&Ä|#/Ü sjÑ„ÂDÆOa%ëé…ńТì/Ü„çËè„d"ã^¸hÓl'L©ºÊ7a2½p˜Èø) çÕSXLœ÷{a:b{!™È¸Vê…ƒiBG?Œ­¸>ÃØj"ã§0ŸÂbBHoÜ„wÕ±ï…d"ã§ðQò'vçJí÷¬¼Õ ÉDÆ0@-OCeBH»;Þ¸ “é„«‰ŒŸÂç¹'᳟Œaéÿ,_p/ÌâJ½LdÜ O\Üì…ƒ ¡ƒ›2Þ¸ “é…ÃDÆOáç¸2ˆ&£¼Ç÷²\ëeúåSA¢ÚhÑ«2Ü·ø7Yïll:a"ã§ðžu÷§ìúö¢bè5ö§äžѯ“ Æ".óÆUUL¨a"ã§ð1NIøè'bçèï÷Âûc6XMdÜ k¼&„”U÷›ð¤ÚÑM(LdüÞŸCèÊ4¡õ+î…×ǺšÈ¸Þ”i¶&„´e÷›0™^8Ldü.ûž„Å4¡í+î…·} ËDƽðžýÁ• !í6~ã&¼( « íOp a• è…Å4!¥ϸfôP/$÷Š"í…ƒiBç~~Á½0£x›P˜Èø)\æ’„K?;U±è›ðêŒLdÜ Ê¯Ö B ]yÁ&»ý6>7úgüTÝJíe§‚öÞ¸W]£è°`/z>+ z>—3PigyÃ^ô|¼¡£ÆOÕý91«LÈì^<˸éî^Zê„ö~b–D ¼Žcò7&„ÊÓ\q.OOp3‘ñS¸_«ðc5ã,J%øÂ½ð‡y ËDƽðôX­€ðô\ÏÀF«sû‚{áã|q˜Èø)üô7&„ާ'¸â&|<=ÁÍDƽ°v6õÂÁ„Щ|Ê/Ü„ÉôÂa"ã§ðzîIø±žq:aÏ ÷ÂóYžÂë¹Á½ð’œÂiBǶ}Á½ðñ¼«—‡S8‹„ð>•$¼wó1ܒس÷ÆaÅÌSX&2î…×ߦã¡k¢Éœ_`/zv£ÙÚ=Á§âÓ!ܘÑöò7nª“ª4ö:½C8‹Hxë×) »õë0z|½è‡èÕÝ|*nG–Ü"óÃÜpSŸžàf"ã^xW ÊN8˜&t~ŽðÙÏÉš‰ŒŸÂýR…„ûÅ Ü„ó¼|ÁMxQÌ~/$?…ÏcMÂg7 …ÙÞÜp/üð7÷Š¢î…ƒ ¡Õ…52nÂÞVØ„ÂDÆOá~µBÂýzÌîóö÷Âû¼=…e"ã^ØÉ ;á`Bh{8ƒnÂÛÓÜLdü>×- ÷ë0‹­moÜ sÛE/t®ÛÜ kÛC/L)~ú›ð®ì M(Ldü.Ç™„ËñÚ¾À^vKªå8¿àNuKˆ|‹¸-¦¯¸ém¹­BÕDÆOáÇ`¶MF%ƒ2îeË4=e»¡lRèä:;M5˜9~›Ë6Ñã·~fÔúgüT}¸E+ÑDÿƽ*3i÷2S4)Ht~¬R@u~¬càv@·7n²§öº40‘ñS¸_§p¿’³{™¿à^¸Õã²LdÜ /JþÚ c¡IÁŸo\…'ƒ6¡0‘ñS¸<ÇΕiB[7vn¸Þcçj"ã^x}¬T@x}¬eàÆÀfœ7nÂdzá0‘ñS¸_©p¿–³Ø¾öƽ𾔧°LdÜ oÉܘš•pó…›ð¬-DMh{x‚³H÷+î×2`v-å î…×RžÂ2‘q/¼·•Š“ºûc)7öæ¼1;\AXv^: »‡T«£–Q×Y˜'V·8ï¬W0¡[:GW‘ÔVJíÄX⳷불G©‡j™ˆR~k×?ãè!ÕX¥˜|–K[Ç@œü¤:…o¬W0^çÎDÆÑÂG]§@䄃ÁOݺÿW‹Ëèà~"·2Ñ5—Hq v|IDÌʵÜxÛW¬W0Z¸×$Ld] |r=¸y•p0+¿5¸¦(;úÀêqcárv&2Ž.Ž¥ „JX oX]¿Aµ¿‚‘,BQšŒ£ËGv넪w7Fi¬`öÜ·/xwMn3Æ( ™Èx¯e¼ÁO¬Tô¥1𝓶x¿ñî.f$Œ]ÕB‚{-ú²ÎS]–ÀÖ-ÈÃrÕ°yŒÛªýŒD?³­Ö?Áè Q–éµUW¢bT×·"ëð½°z\ÁH–o¯j"ãè"áx(ðæ‘p<6øRÁ¬V™2V+•âÄÛ§™È8º@xöCQxÓ@8˜cq˜=9KÎX=®`\ôsÛ4G sy¡8ý}%”? ÏÀú'²7Áª¢…÷»'Xjâ{P'½™¥^Ü`6_Ì“»­ß¸Ô‹KF‡ª‹&2.ÝÅ]ê7QŸJ(Ë"î}V3f‡+ˆ¡&œª2ŽRÝ"ªÂÐÒF†e¥Õå+V+éâû¬$[i¯ÊIÙé~ƒÑ;é'>\ÉŒdñ&©&2®] ¼zøy¸žmcÒVc\ÿ€‡KÔš‘,¯ȸv‘l(©¼@c” Ýô®`FÂðW×.Þ½¬ã­š•ÙÙ fíìy@µ¿LH‰µƵT7‡æžÜ‚ Õ­ëbÚêl`o¬W0ª8‹Ðj"ãÚEÂá™õWh«®YlƒÅ“á¾OÌW–Å€ ,d= º{!BI/ »×¥‰•/Õ™Y ÞX=®`|[íG3‘qí"a-DÌô#áº4ág û?°z\ÁH˜û/ÃDƵ‹„YXoN?¿Á(̪\yÆêq£·$Ü~ÍDÆÑE‡Ë~Okœj1o˜Ý¿bõ¸‚‘0Â‹š‰Œ£ „KÝ£ÒY9YƒYm·Éxw¶3úèëš–ºýæ‰÷Z \Tò>öÅ«ãù[ë2ÙªýÌÀãAW3qt‘¬6äl®rÚå…ƒÙX%{âÍUKÍ þ¤O‰Œ£‹„OÎZUYÂb”RfËW¬W0ƒNäÜYH0:@ö¨Ë@›†VA(= ž{-¤eÌWF¯Ò°±{HU®öÙ•£3òµ «òßg<» ”™Aƒ>~€ÂDÆs­Ž„GlK—¹®Ï“'V™ 0aw¸‚,§lÕdÆîU ó"1Hzð¡Ù˜Lñ £ýebà9ĤYÌxª•×ÀÉ›2º–u0ÁèÅuK,.—mfàñàeÒ d\j…mpLVvÖIoe<ÉþÆuÒ+fàñp’[MdÜMz‘®~UNÜ}²î¡²»ˆãë éÚ_X®`†·ÕB‚Ñ¢“’"DŠšUN™/·eý‚Ñþ <ðH ¹ÈX$ Ë ëN®ÌÄ´f|µ¡>à «ÇÌÀc›¨ZH0:HÉtp$ÛÇ*F¹ºøf›ßPí/*ÈŒÝõ­ÆÑª3Ç 8Œ> jæP¦;¾Ø¾a÷¸‚QAff©F3Ž.f¾sô(ˆãðÇïÊŒÕá Bå˜ùÅ©&3ëh™•eÐIå$»»¦/’VfÝ¿`õ¸‚Q5fäÛª&2®]$ÌZìˆÆãxÅìô[ìÊwf|¸2ŸFFê¦j"ãÚ ãRq<ª0×%·ÆSÇz5/\\0ÎŒëo…K­0NõK•@T²QátåÝ8º˜rÆêqãZúTG QæyÞ,,fatÌî_±z\Á¸j"¦ãÕDÆÑ«ï×µ 3W¡szõ“='•L”JôÏx}¨²ôêÒ‰’˜,‚üßðRUÉ <˜Y§7\¢|‘ éqU3VæR}ṓåë2ZG&2ž;áÍ™¾¦*l¦œUˆµP2v+˜Á™ëfâ…§‡0â'ïý•0™røöõÉØ=®`‘nß0šñØÝÎÊ´Ê\þ~|ƒ)~\•ŒþÏúøÎZ)Áñyµ…kÉ2Yx9:Y1£Ñ&’¼&tt’Ìx}Œ!¡ÜãOXÛCq×P§r„b0›4 Ÿ2Tû+˜‚È”f ãè"Y|’X€Áïå`V½‡—EE”^x÷²˜Ç£÷p˜ÈxïÞË;ýš8¼}$,fáæ¶•©}/X=®`Rì7G«¨Ž'„ƒ™õÉÃøéñïµ ê 6nµn»Åž†CŒÏ=Òkú{Ìt°¾ñß[1®oÊïk˜Èxé¾·ªÀÂzòUF)/a–ÅÌ^xŽ1ˆ ,$8·šEu†p4!kf?« –_Ø=®`•Yš… §‡ìêRM– ÊÉìzäæoØ=®`ud3Áñ!ËdûÙÉŠ)Uy㳓åª5ŽÇ:´`íYULU‰É³WfHᣓ=Y޹ŒÒ±…kÉb7SoVY1›ev•N{áRewUcêÌ¥³`yÈ"ؾwª$Ö*²}{'‰lRÌ÷¹´ÞOÔ-2²@ÖÁƒð#[™Å¨Ê½ñVÙ]YYp |D«‰Œ·öÈ¢&E{}1Ufö°hžõÂíU<ïÚýRª&2î^RȺœÿû߀ÊL~çΘÞx©ß€¢r¯8"¾ó«‰Œ—ö X'Æ0®¾y•õ‘+zg8×o™ÇÃo\5ñܾyH>«¸³3Ál§/ŠTya÷¸‚Tƒ—j4ã© fVWØåÝ“0™í°ÃãÐ‰ÍØ=®`·Úçfâ…£ „g&ŽGn¹Ä‚P¹em„V‡+˜A5·J5ðDµ¹$QJe;¸Q’$œØravÝTó+ˆ™-î ÖöRijü9†]«#AlZ \˜VîÕü b`i¬„D÷£=U…‡>$ƒY¹l›< ªýebàq 4©õÏ8zH• ?REE(ËðºjkÓ³ÃÄ :m8ûÕBÆî!U~ˆ69HVŒª#Á*¿m/¬W0ƒRŠÃEVMd] ¼ª¤é¦‚Gfb&˜=¿bõ¸‚œþ|íLd]$Œ‡Ç£$Ñê45åÈÌX=®`¥j‡·šÈ8ºHn@$›U“‰õä; F9RËØ®`”Γ ®a2ÁèQÅÑãX°ªfÖCžÂuâð »ÇÌÀ£¡C¿Í8ºHëL÷¯h“Ê®åáÉÃÀ;Cµ¿L ÊÛ?­Ƶ‡T±Z‚ƒ9üÍ fgtðʺß°z\Á ª:×`˜È¸v0"x0¨Ë]Ž/Y–¯{cu¸‚x<檌ÅG—Õ ä[­Ì*_!žøé ÷ˆ 1ðPPûg¼·¸WÚdÝŠrZUÌâ¯óÂwj†j™*kÿŒ£T Ýï,ª×E³Â€ð¬£dË ¯^ë1¨VÖ¶ª…Œ×ºÖµjÕš•@–òb&úÊø¤#cí «ÇÌÀ“·qµ`t€¬Ë­sĈUfTLتÍÏ#¶:¡=K \¡šÈxn1b«Â?œE‰~«Ÿž˜f¼ê´Ê!ÔŒ)/vo<ÄÚƒSç…Ä`–£¾XXp)ãµ.%ŠTÍk‡ÕhÆÝZâç‘ÂßXÉÆ/E3‹ÖY`Ý »ÇÌÀÓ‡eÆf4ãè"aVlÃ<Ìs`T·>rP¾±z\Á .™s4×.Æ=¶¨Ž¸tIì,‰£,aýÂêp3¨Ø™,$X;|D·ÑùªQ¢•ØX·þø²ùx`ñc¼j÷ŒÝA’,ì·¨º‚4Å òm²ÌB†j3¨ž²ªŒ£ d'Uµ[T\²Á,¾÷‹ª>½°z\Á ªþ„›½šÈ8ºHŸ@ø’ô¹ bfø4îþù Tó+®â*XtO0ÚKAO8EßœÊLڀĴ|Áêq3ðP8«&2Ž.VÍ'–Ó¾2#—ïázíÿ©v—‘‡êê3d¢k.)¼±œ¹-V1ûÆ[OÆ"¾°;\Á <F†É£ƒD1¬Æõ¸ZÊÇñe‹aÎôÆîp£k9V“ Fˆ*  GâÕÙÊ(ƒ(nwÜ:o|Æú¬ˆã‚l˜È¸v‘0 Öuà ¼L¸±.ü ÖECkÙÁáî ÎÝŠáæjqX­ßu‚ƒQ¬ÕU¦ÞX=®`T3šf"ãè"aŠ£Fƒ@Ý Þët¼g¸GȨ•sdˆhôOpo£( ¯&ê6“5ŨbÕÊJ¡ß°z\Á <¤Ãk&2Ž.Þ\j‘3èáÊ-,Áü†l~X•’×=ºgì’dYDÄå»5ÅÈ‹±)ïé ªýÌ@c7GÈîÜæ™” ÆC2JÌjç\eF†ŠÁߊaD†j3ðxP‡¯È8º@vÒ*ë4…k"˜Ñ‹å¨=7•7v+ 3ö¼ÍxjÞ 8ÌYRwäqû…Ns0“>,Ÿ÷ «ÇÌÀ£¡{¬šÈ8ºH3ÇÏÁ!{ªd3ÇÇXý›¾áÙf†£0à\Ç˨ۉÕVDô¯zGŠA2<©¸ÿQœù £ýÌP+_7“GÉâ$€·s~Ÿ/ô«$í¯`ž?ŒŠ›ÉŒ£ d$>ޱiÝ v Àé»+1y‚Ñþ FŸ¹E½šÌxl[Öw4eB¹Å¢À…ÛÄwW~¢3öŒ›Àa¬ó>Dg㟧m©Œ°CÆ>9Ú‚Ø)ÿ¹ àtÊðˆ¸yƒj‡#NÞý3®=¤‰µ=ĸkäĦҮ ê–6‰p&Eï'*ݘé¤sñí~RL¬þ‰;ÝýªùÄ€cÐmíî F{)âEznœÄH‘„Š»Ã"Þªù„ê¤#Ò;º'í?Š…{mÏ•sÝ ñìqVá6Cµ¾Q?½=5yØ5¸ Ï5rF1ÓÖžþ¹F∠vºÚÔixÂÖ:wy`ÿ„6²¡ªÑ¸Øp”g¸Ä.o%L£{‚KÛ‚‚Õ¨Â>ÿ¦¡I`å‚A\ä Ùújx•“²ö^µ,û0.¹™óëÏرdâ8åGBÅáÏË;A7¿‚X«N¤°—àÔ\J. vŽœ=J"ÈgÝ[å Ýü bÀA î_µ—`´‡âBGùÉrêTZ /; ?_pÊœjMIu’qé­ŒÖ?°™“rƺÇy›Û ²õU1Òj¬=ªÞÂ?Oã!‡µdlÊÐÛ%ˆïvÞdŸ‡.C5¿‚pýî ÖöPTá£ÄÌ,ˆM1ÞfåKLËD ,þŒ×AtO°´9¢e?'ës §Bw‚X‚ûì3ËPͯ ¨8ò'¹{‚ÑŠ;‡¨!B+?мϾ@5¿‚pÞ›¥vO0ÚKÓº£næ ›·Šbg2¬[¹D 8o ýˆî v;¹Já(€áýºsLÌ Ã¥Ÿ¾@5¿‚pLÝŒöRÄÄ÷XÉ)ð¤ÄMˆSþ C2\Æ)ð®@·Ú[«YOã’SáÕc ßL“\1¨¯¸î/¸„cFÄ€“ÆstOpi^™r"³Å1‡?×xÔº~aeú„æðåoJ¢]7¹†C ÁLØ»2­Ö"1jŠq_ š_A ?®»T»'í?ЇF‰¸<®¨-¢œŠ*òt'èæWTDfûj/Áh/E¸ °ïCϽ ü8>è…žˆÝü bÀ%bŒ^ØKpj!{‡_rrBQD‘—×[òtó+*2#LØK0ÚK‘ß¿É+ÍÆ¸à¼?€ ªõÕ°ë/UkªÐô4.¹{-ÈBŽøcAbKÀ-¯Š.s„¢§QÉ(Lð™p:"ІÇ0öÑx"7¾*^Tµ[´Mùi;äP ”Ï¢œžC÷fë ºù/b›ª½£=µ•ÔååA@¢ðÄã#öDn|5‰é0ªkÄ?ÉxèñíÖëh x7>ÑCD§GkM¯3.=EÌ“â«Ì^rŒ‹tó+Q¼ÀÂ^‚c{¡}ÞãpÑšu„"xÑNZ<ÞÐͯ | ·Ú=Ãh/E<ø‡‚㤢(:—± ºù„‘š(ì%í¡´î\½]ˆ‹«øt-S†Gu³áŒ)aM)Už¶CMß›x_/¾rÓ┡[_pÕ‘°¶ømÝÛ–¦Ø| HŒÖ1@±ÏÌ!A5¾^ä°[‹òFõ–C ë‘Ý[Lß\+Íaþ‘`{•‰êëËæž¨›\x=”;z" €`“C^£Ýü ‚z8Ìj/ÁhÿQ<µ–wÔKÅ듇‚¬<êj¥)bªöì–*Ïú1œ´‘Ó$0³:ü­}B7¿‚"ØÎú­}ÀhE‰¥É®‰¢º ¸Óºù„1Ä { NÍ ¶ÏáŠñ±å{°}l;èæWTäÊëÙ¾¶=ŒöPœ¹vȰE@‚Or7&èæWRœkï„¢5ôümœèʇž¿»ço¾ÓðÙí›^/Œ]®–&Q{Ú )ăšNK€u þæ>¡›_AèÐ𔇽£=ýYD´ ýÉ=õ<ýÍ}Bµ¾^”€°Z#þy9ä^£Ey`qØ ºù„«3a/Á©­Õœ*j J 00?g>K ªõÕð¢ ÕñÏÓ¸ävzŽUœ€žào]‚n~¡Ĉ1ì%í¥O#(š€b Qi*#7¾*^4q©Æ¼ˆó´-¹Â›TÑ#xQ.Á8'äÆWÅ8©Æ’’l‡}9ª(9ÐßßÐͯ x>ù{l5ô”XðЪ#ôD­;âŠOoèæWÖ[k÷ £½=§sNàC»qf• ›_AXñ¨Ý3ŒöP<ã;ƒ€Y(ž1çC68\u<¾ ºù„±†öþ[W²k»n\çúŠý¹QÇF_`À€±Û üûÑjŠ¢xpß­u©*m‰bS¬Z5‰ÑþoKZÅVÙ-0˜€{b_™-ìÎ]ß$¾-"Ï\€ õ´t\“äÆß8tæÒµ=öå²·Å,ƒSOØÛbbàùýðÁO¢›Ð/<úÕ“­eÏý¨›s·´z8ú&ñeyç—¸Zâç­[Öö˜hä´€*_9ÚN¢›X Ö7‰[wÚ'0ÐÕ]P¢E0QÔÉàwŸD7ÿ`‹µ_>‹Ñ^=×<c.ºÿ‡—ŸÔ$v ^sÙˆ£Å3&…k@™ïžÐItóo²xg]ß$n=\§›ƒž &²\1£èæßl1õËg1ÚÃbò|SÌF•ï}Ÿ„ÁÖîka†¢°4ª•!qiÖÍar<ÚëÉ¿õ×Ò/–ü™”‡½¬©í±—=óÕ“ïûü)F &²§ÆQ-9¸‹×OñeQþó0a}“ø¶è¹æØm0¦¢Zùºq1‰jý}d¦™.ýjÉŸ·r™«1ÑØ\íóõ'Žf“ø˜³ÜÍY[˜•‡9Ä#Œæ úKš¤Ñ˜|=ÝU=¶Ͳ¥,œªÆtõJì™D7ÿ ww/8»¾IŒö·EDïÛ`ÑL\5Âi3‰/‹äö¡oßËZÞt…ÛI,‹&ÊZ~ˆ£Å­Ï3¶¸õyˆ&*·-“8X¬òútÖ7‰o‹1Ït‹1ÙN‹'ñe1×óe‘ú&q´¸÷yÆ÷>Ñ-ßÒ`Oò¡â]Y˜{é–9¹ösõ§ø2C™8ÂcøßóéžTmM$¾÷ó§èæßd1oýòYŒö°xÆLcƒgLC4 ÔÀIìmá1d¼bh s£î°sM7S‘ àTx_öòV–ÑBLU£8ZL}®ÑÈf ›P’Ó$ºù7[LýòYŒö²sM·sÑuQ#Ì“ø²Xêõ²xyjÅÑbî“ #0À)ÒýcðÚ‘2‰nþ `‰“Æ®o·{™ÕïùæÔ—Qb>‚Çá%žD7ÿ ‹¥ôËg1ÚËbIãO,ž‘ô“Û4‰Ã/4phYÚ⎺e­þ’£MÛPËÞvâ ¶bû®²‡Jˆ†6mBߺÃûª(ñe€e¡®hX$7þ>Ü’iéKþLÊeOç™<ªÐÃP”Œ~üÝü€OB®~ù,FûÛ"RGtPêš·E<âV»~Šnþ `Áq1jtu}“íeÑGjr7P ýËxçé-¸é7DåwMbÒŸË–vè}Œí@ámál¿!ªù7€…=0—~ù$öö²xioBÏv— ]ÒPˆ`ŒY¼—rÝÆWKþ¼•ËÜÎÅ¢Ø3 ¼qldÞ’C¾µót>®•ü™tËœ÷îGìÔ@Q饴÷³ŠQtóoì-2Cß$®ÏŠä.ŸÓAb¹ˆ‹ ÑO&Q­¿l:®M„…oå2—‚?‚ÄRgà‘'¿5Ï¢›PÜÁvõËg1ÚÃbŽX›]?0Ç7Vx ºÃQÚå©ñ”£«_JùóÖ,[…ï'݆X™à½þº;G’ÂÉ5_±LòÓV”ì[§³wE¿õ r¥Ã‰éH _ž‹)&å²wqp!u§¾9+ICñàŸE5ÿÀŸ¦©~ù$FûÛ"ȱõ€<-°r"@"­TGii!€ÓÓB\¬cˆI¹ìí<¬ÁÂ@¹˜*Œ‡âã‰Q¬A©c€½Ù?]ß$>< Iìòå)¶0„‚`f=ÖpŽ¢› E¬»¾IÜzlaBn»nB)ú`p½ßt:93‰nþ @ lNCß$n=9ÿÞŠþ çýZ’ët(øm·VŽmöj½tËš(çsºƒ%0&q°Gàq£…¾I-V:ñžM’Ø}hÅg“$àÙ$…¾I6I -;˰À6+ê#Ç1ï(> lÏr7ôMâ°À•Ÿ×èü‰–cy *ÀYRÛoIéºôK%Þšekï{,͵ ³ë¡˜¦I|–Öž¥uè›Äai}±O¶ÁûhIË,=Ö,ª»ªÂÖ¨X¦Îîç°­3ü Rÿ,uq0·©îs·`}“8Zì¾*­”ÎðdÉÀÞ÷ ƒèÖßÀç½ÄÅ”>oͲ•ûÖÌÆrìüP²Ï#ºÍ ÖŽgçWûÕ“4ÚS‚Áž€þsÀkýCìxìYÝ[í‰Ávx{º¬˜­·8¼½Üc¶ôº®ˆÙz‰ÃÛmš·ã²h ›}ã$ <Cß$Ž7ÆØ Ä×}Šáy‹‹Ö7‰£E†õ±Eb×ýºf©-ch±",£ZÙ9¹ÿ|†M1N¦­Ÿ]â3l xü¡o‡adŠi<†0^ù´÷ðƒA¬ÝI/àqÒ‡¾IœôHwP‡òt¶‰g’H5N.;'¡Í'oå²WûÖŸhLá¡\>hD7ÿÐC8º¾IŒö°xÅŠÄ‹Bö¤!Óƒôø _Ah³¯à­œö²ò4ªªáÝö 8¬/è-ºù7…ÂÝ ™®o£=,nZ“0ý%—ÊÊ)x&Š $µýv‘yïK¿Tòç­Y¶½{¼Â1àéI|<‘1]ÓõMâà+ȧ¶²—SË:PxÜ×½œ,ºB‰‹–·ø´†DîH¸´, @A ŒÊˆ2˜ÄË2 ÷ p­Æå“XžeYvÈàiŽáì\~ãa”ßO³¸-f&tôË'ñìì ¹—÷Mä«÷MEÉ›¿!^Ñ7,¸%uF]>‰½=,ŠÞ/“‹-¯<Á="3wÙúûȧ"ûÕ”?oå4W6m“Osw@g¸CŽ„“xšbÛ,1а_>‰Ñ]Àç¢' úÈà‘h0‰jþ ^H–ŒË'±·‡Å¤Ä¸_ i QSÉTôo‰M¿]¼äŒ+ÅìóR+;UìÅÁLPm>\ÀÚh“XœdqZŒ^ê—ObéÁL©ŠÃ»8ú-äÄÁ לÄâ`¶˜.-®ŸÚ[·¬¹¦H‰°”äéHEc³Xfb@¿#.ŸÄò„¥T­'iz@…KSÝ”}1‰%¦w²ˆn—Oby¦w„ _/‹ÂÄ©ÐÌI|,žŽl¾|G‹¤È&ÂÐrbä®Ë6K%‚6¸µákÅøÿÖL[ׯ’ÜÝ–ek¯<º›¤Ç–°åkmë¥Y¶\þ1f@ú¯ÕDf/©[  [óÅaî¥\öäì°…ÃtM/é±g ÛóÅaï¥\ö*׆ƒ=¶ XÕIzìèö|qØ{)‡½õƒÿþø»ûß/÷Kç7Æ¢´ôïž gJWGŒiD.Hþ€$£„-;¡ì’Øò¹ ÁØMäžú…àØœHÒUdSXˆ”l‡c!Q|9ŠMÜ]Ë]!‘¨{BAQLË>!õtUXÊ îªöBNßrAn· Õ’÷ht¹®1nd_ÇÌ¢µ[1’xÏE«YA €„dcnÔ@¢wQÂØ¾ù]°nø"D/£ÆÚ•Ŷ…œEÅmñ „”ÔëS·EŇ÷Ò‹G7U^ÕèòŠø2ê< ©ùˆÌíÃ2×Û©¢ÌUM´ÛŠjÉB²oq£BTÒR4ÊÕEIƒ•AA”ä‚,稖ÛX,s½Î^ÆVˆk«Ä¬ œ£ø«ä‹·¬* •w> †T H´Ä(‚ÅPa1fm¬5Èz®*„<.Í)L7.š¹aÁ©«wÌ])•QkR~² AÞ2¼É`7rµD<÷Âìu Õˆ43*1ØX] ¼ÀQûOˆêÚ‰bSH//—Õy딨d×XA }-JÌ !‡œË¿5Ö:ˆ¥Ê‹aLˆb^BðyF±­¦J?`itU(!yÝ—^»©©R AùK{ð•z)ž¦RD¹öò1BD[˜Eª!H„Ô§2HcyVãu5‹F&}üÖ% ?¢Ñ5éçy?.– De;TL ‘@ü†bú_ ±:‚ÙðªùÎÌÝ.„äuæU O1žã[>õy#‚Q&hÂ…ÖñdG8ýüL°-DDf¦¾D¾>sR7rc^ Âh!,&:çF>[ÌDK0 â#5#q#%+zdð÷6ñ¥Ö£óÜ6S™‚-Ö ´MD£÷N3b…FUÔTDÿ*bÕö‘팧‹¡RJ’62>b®P!$-ßû¼ß5‹È˜äŸrÊ\äd#k„˜(Q‰½Í`(„TV&¤¢ªªÈ¦l$;bý›Æ´‹¢øGì*³"ß©LW-Cï}¼fùPõ8ú¸w#qÞgàñ»o™@ŠóGËÝ |ðM"¶8DwËöJü®eŽx{dÚ\1#~oßÒòFœ>vH+¶<×öœ|¥!kÎ"APc˜—s—¢IîÉEœ¹š ¬i7`—,‚̓›tä£`°Æø#G‡©OpFÐÎ1<>1f'C|Ϊïl ¸¿ÆÆ L] êi *òÑSâQ?ü.Óq’#„]!dÒ²qÕ3b@ƒBðOÒh x8•‡íÅ ÜÉ4ø!bÀ©ÚçsÄ$ÄAG.œ¸Ç9›ïÄžŽâç5¼¼ãê l€ªzýà¬ñ ôÚÆWÉúRý¸²ñð/ïi ÝŽ´vòx˜îýöˆwÐ]¥³g©¯ßËG©k–Ç“ÈqÝx áT ?Ó¤üoA4žI ÒOÇ®wÇ3ºÿäÝžêË›n8à^âæ¤S™Ó+^ø~oÙ¾äF×,n\&ð¾î™£¤±îMåýÒW à45Ó/ŽI©dóyLJd? sWL.¶Íž οÉgYvq5zÙÎ8E)ÿE1ž7ru«]…rþ´üÇç—C•ð°eÙqp}/ÿv¯ð?ÿ÷×ÏŸ?ÿXð],?âÏ?þîóïÿ½~þþÏeÃL~Ýã_ ü%ëç–ÿü¯»Õúù˲­Ÿ?|ºîî@Á·2 Ú)®Üý'÷î/¹=™AË}³ò*°+=ku#LèØ–zû­I›Ðì}så{PÍÁ;W ÷ •]“ûK¬€IŽ)=:ÕÇ&Ô~—Á£ÅŽóОâF¸Á–I~ÚO’Cô:úfmeröœµÄÆ”ÅL/m5µ{„K»Pïã¸aª¡’›Nl±.Ò., TçØ,ÝkÜ€GVØsz:=\‘¯j‰/„´ž å9.#\Èc`Ú´’A$ÑÉÐUK¬C¨@Ö¾Ouåî]k¬Cõ¼ñ¢\cg­Q'©µÝ7¨¢½ª>óºÇ~—õÏJ²Ï€õ­¹jFQg-¬QÐÛÿr„gèÈ.‘»sã)D…†wo×XÆ™TÓeëºÐS¶ù0D¼h›Ù…°öU®^-±`1þÐv…¢«¸–®/‹2œ*É&„eyÈ^{J‘yãqœ•ÝF‡YȽiG~hGî%á!\8ôfÅÓ36éÚì+ÙHÝ!8ö,pS†níÏM U,­¸ÆÞž¤·¨` åúvUytŸ:ÕÛ¹ÙW“nº»}»$Q~Ž–y<Œ°VPÒÿ›jÅ© áÖ–‰J›‚ ¡#ÞóÍ*oÚ=Yáõn<]©FW{Óè $±,èpA,Þˆ‘Ñ¿Btj,¡w…ÕÎÜ}‰G×›]T”E<ŽûÐhrzÓ{±Å=áPe ·î|@äɦJ¤T‹ð|Þ`Q g¾Iø9p6¨ƒŸÕ5~j|ƒ§ákÈ»>e¸XħX *!yX;™H _„Ö-tO`Ø>ßÉ… ž‹ ÙSã²X‡;2«å`X9/p  òê>[ãhÕ«º¡ZUTÉcjÒînŽëq|U Õ]?t|x«>³Êñáa­D)±CGý/æ#®ááæÀ^†…YöÇ‚Qc×!¹RÚï)º\Ò«¦3伌`Ѳ²OÕUTáñXw#rªì±UA= —qOMò -t¢ÈsÕ(¼ \²‡`_c+†2—JtØ ÏËŸÜVcKwCXgÁþPf“ ñj„s#Öêþ…sãÿŒnIz ‡ZÑt‰â k´A"kjh×…€˜Ê;:ëœ8½ð(ŸbQ ?!n)éäÑ0zýU£Ìq²D‚™ã¡kñF<<çÕe2ÖhCÞzù†ÈÞ*O˜UÖp)‰{[AjÞ"Ψk\P8!©Â~t½E…!Uø»~ù=vsBÅAŠϰL#hðBIÌóîApC±èAò>'V;DƺÞWÖ /”:'iþ¬¸=+©,¶0 «úýpþÄÚJƒ8BÄîóª|êP‹dñú6²NÚxÅwV³{²L’Þ+|B˜üȈ}n§žº¾=ò{„w‹¼¹ýx$«lßUcØÈrÎ^å—o¾(ÄúR!d;îsT.ÜdÞë9²˜º ‰ª=ù!àâÌ.)ZŒ`Y ê•îDà: ?£KóâF`öl/gʪº àÙ’óDW{£VN¤ñ•×>Üǯ¶oòÏÕ5©—”àh£WíÜ¥AkØj4,buçQs5P—µÖø-ɸÈÅk/zÈ»,âK®ý ¬²;©q5Ùä«ÛHL>2S7¤ºà»ƒ¨Q»œŠÀ<9 Pjÿɵ[£/»fuaÅT;‡e8ϰ£»²ûgï«Ù’9+ÞÈ¡31l¾”$ã%9ØG•×—Ãù'·Œ¦»”¹_YÞ[ßWå•¿iÜg-ÿg®­ï endstream endobj 4 0 obj 57844 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 5 0 R /f-0-1 6 0 R >> >> endobj 7 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 459 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode /Length1 9140 >> stream xœÝy{|TÕµðÚûœ3g9™Gf2ïçÉL“d’L&!0IN`’@Â#@ $<äe#Tã „•ëTP¡Å^«ö2 ±ÊWA­b¯íw­Ö⣵UsÛ^ï-dæ[ç$P{~½ýÝßý}|gÏÙµÖY{íµ×^kíha+0à[ÒÓ½ö×áGöè? ó–ônðXY_`š Àzn\»¼çà†=*€Ü\ÿò›6ݸu0p9<ßH+–u/}ëÓ»¾pþaU+`ÑV¸ pœ·¢gÃÆÚCì|OűtÓš%Ý}oàx7Ž=Ýתçòïâaà[{˲µÿúÓÍoáù©^ ~œw?׊Òò0é8%S8UŠÜ ¹€å§0 åØ) C?…€]­ùÌß4ËOÿ2>m$>Ýp9>Í0‡úøHÜð%VåeQ£ß˜¯ŸëM]ù3×úç)æ×Wƒ8;`f˜yƒ9 "<.-Ì×å[ªuÕ–õ\Ã\ã\k§»Ó³B½Ü°Ü¸ÜºÂ}›æ¶Üžš¹ýž‡à!bUój¦Æ”kÍU[sy~¶Éãq{xM®š³††¸Œ ²ë‚j^£É¥¦¹z²ÙêáEêÆî‰æ½"ó"/-è½j³kÞí±YkŒ¦š— e·Æ&k ÏÂu|¬)/# ˆ%›X̹V'©#±ÊüP~Ìžd1Ê'!BR•aîã‚5˜"®òpaú}µV£ÍV§,²—1‡½*sÀàv\!¯ú'çä5Œ×ËÖ,)Ëɶé…NŸIåE?"ó&³&ƒtêž°À°@.)¤Zæ®êðw:ÄÞÜìNî¤ë¤ûœêã|S?Y?ÙÐle«bÕbL«Vic*«Z«åZ,…*k®Ue-´V‹Xã[UÓV‹–“¶°ÆC²}ªÇU'U¿T±ÖˆITá[-VWÇ E«E«RWŒ'z3Þe0N`@åŽT0—«¬œqj«UZ ;Áhœ2A¦`T9Ë%'qÖ–Ç#/]xi¬ÐHoÄ&·Po_µÆGkPZÊsaCx¶ØðjCØœUóØå gåß(HÞ‡u `l+p5UÕU±Ê±Ðâ!V‹?V=¶?¥$ŸÝ2Ö‘ê!1òN(s…'¸Ë‹Bdb´ÃùQG›KÓKÜVoÈ”gœd=ìÎöV¦ß®ª ÿþÌøâf¿‹äxr:J'Í,mÉu˜—‹ä•^;½”º\”ÚL9 ¾jgWàJ‰G›“Å»\º@™MĹ>Þ…ûØF¾K›i¶ì$-Ô2ÄÁåRäè1ÿ7ÈÇç¢ácˆL./Ëñ[ümä«´†foE `Â32ÈuA6xà^)ð4ù,ë#3s~ S1®F`¦ªU‡<\ö¡\ö›RT}̧íw¤(?èóFÎ9l¸< õÃõÈ}Ò&i¸³B¶ 9¤ºB† ¬Ú€…ÆïƧǞΞ’ƒ•Æ©ŠƈU¥{¶)ûg2VæS1À¨ä݈š¬¹3OýüÑP]¥}7ûëž|²Þ’nYVwkúƒs[úçßž ’‰¤ü‹ ÙéOïÿ·ûÓÜ„?½8òr2}âØ d2¡ÏŽÈö!ó;ò¼:I9\‘N'X­uµg /ú7~Wñ;ÓF¦7.K| õ²öØP¬²*Z2¨Dâ™8)™ØPf“›‰‘È$åL5d>e¶p[ ~&åïp’˜Úl!@ ­œ9`¶è²4z«Ã ×¯79'öX®°8E*$OPsÄ餻ãˆdñ ,½¸Õ“‡,I µœ¦j(…BÔyiIäüEÃå_*J;Î:FÐÈkú"¶Ï ÃD6÷Ù¥a®ÏpŒ²Ë©1F‰©ÆXƒÃOËQÚMRȕǨ}~¯ßãwûYR»8Ü…<¬T~MŒ¸œ¬HqÓ†¸²%EÛ¶‘U¹ÑŠª˜!’}‘lëþŠªj+š¿èçÑKZ=x@Ä‘Uô‹SëŸNþÐ]¹:5eè;äG>Ñe˜ÎæYÒ}sŽLíkŸÜ’>÷§Åñ¥á’g¶½v?an©g4jGÞËõdŸÒpG]ö¢Y̓KÞM¿ãmó”Œú«ZôW¯qKÁ )ijÐDn‚›ÉÊf)ݧ¿¬¿lf9½ÊlÑÍlXmÆ8Clv­Žè´ Æf7Úm:-áTfÕêlÎb>âÀïÌbúÏÙeíºñ4ðƒn—¢]Y¹ŽÚó6ƘúaY©¨ÙT£¢EÃOÑi;Î)öîb ê / ek´Y:NÏĈ& Í™5`²Iâ¨Æ1s^W­FÏ*äU<*Q1%JM2þZr3QZ³kN$®øÃ®þü·éäµ®éåŽ5Wc%w¥?¼ÿÀÒê[4{óá#é7Ò·—vf¥Ê9¶¢n^æbO€í’w#C8AÅj(#!ëM‚À²V „Q §ÉŒ¿Ydÿ -Ãi³´)â‘4pDSÆ~ÀR6Eªžñ©$Õ!£:Mµ ‡,ªÔgÞ‚øÈEŒc€/Å5Šfd;ÛYf«3Õèåh¦!þœ¨1j¢Ñ£sÒòÙÄE?ÿùc#gؽ#-Ì]WïØž~ŠÌÙ®Èß„çæyn#®#{%q¾OŽFk œækÐÑ79©¤õk¸À!*ûÁJ¬èˆŽç¼ýœì‰òCè‰FúÎÚP@å`8j_wØL5 k”ý ùò,`í!‡%#~Æ‘`ϖ댈AdÛóFÛ¶mƒ€Œ†`•ߊñä½Ãˆ,o¥Ål’ÏóügÏ%ÓïÛŸÉ8®ïDó”­¶º’¶™½ýLQÓ¢ž»÷Ýv1¤ß!-ÄDºGþÅoÑ<ù½žÉwáü¸åO«jó÷Ó¯¼Ö/ï'=¨~n ú&DIXzr€Øý€çÿþð¾’‡Jˆ>îùaø%G¿(¸’ÜfkÙñªñåã+&©š­MùåÍó˜ìMìJîvv}V¯pkîzë­¶ ÁÝìÝÜvëþà æ{’{Æÿ«‚ˬ·€Í³ÅFËjóí‚=/ÎŽÅóçqóíó󣫨UÜ*û*Ǫ¨!¡Ž†l«·(ÎtÈËé úÕgèj(zøùîq}OÞ÷«“ßÿýÌØ­]=;wU=ݶë{L]É´žEÛ7Ì^x¸Y[ßµá®Ô?­¿uA¬qóé-{Ïž¸Kw}Ǩϲg†éö0`®T¤1g€ši' ’t~m3_§×¡Yëò$4bvÚ$c±9OŒœ¿àxÅq¡ zäìyì~‰Ôôþ‹ÃöŠ£þ¼âôñ˜É©ŠÈȱñš;–]°Q,E?S…yJuE®›PÍy*ØšòbGn冪Þ"kÇilµëŽyxòÈ™©ù`®§iüÊšet!£â´:sMóƒ¬pY>›µð'¶™q(9{é U¹ž'|ŠdIF¦œr€É:ÅL}·ÚX¦ŽY:D†§,ÀˆI01’_¶ùÊeV{å2éÛ½›<²{·¢›ÑЃè³radï5ï0Ó¹ÊL³F«?0ÿ±˜ÿ@4 ¤ÈÍC9‹Í)²Y2 Y eÕNÍgÙ0VS&EÊNde v«í9²üäq´‚±û^ÆBw¼­lÚ¥á«äR8\^†f¹㵬-fT,„£t1™µväü¦[cvY“Åurš+S§±.ªjóhY…Ûà:}-oz“yÂ韦·ò­Þyü ˆQ14x£’Ó¢ªå†Š„j‰ŠWrõ’Úœà’DC0ŸG&•Ϩ®¬utp41n΢¹Ó¦r'“?0ŽlMN-±Ó¼ieœDJD—^oÖ4ªÃ3óãuµ{)ßæ4ò®,½û±sðî— ùpNšü’ãU=iÿ©›š$­'¬6µèùy9~§µ@ ø¡Ñðäç0¼¿ÔSªmå›ù•)µÙ¬4?¤În78ËœmNÆ™¢Ú…ª@aæ¦Ì`aÁ5mÉ ^7`ü–ãÀ—ÃÃc‘*<¦-Ý­€fIHçΞC¨+Á¥˜0Ì!_‹SÚ7I—_jÞç'JH— ùŠs1zˆ¬Õµ&Ô¬µ˜Yô.⨙1½ß›»½Þ]0ì™yßÕ§nßp3u–˜Ó?ûØ¿ÜÞ|ûÈ‹ì}M!{xäSŽLyåêt]óæ¶Õ MèÕÇþ“Þ½!® Žzä°t:¶0 $¶@oÝd#ÙLî¥/Ñ ¾¯Ì7Þ÷´?ÉÈwq8Df‘.Ä÷ás_sÿÎqL…ypZà)Ò 0j ‡ÔBùTA#< Ïã›` Ò6Á? ‡8Ïf~‚°*x Rp-Æñ§¹ì†‡2gáü.eg>…(lGŠ73¿…lE,掰 Ö’º!³êp¾áYxäfêÀ•‡,‡Ð7Ã]ˆû1¼ o®¦Êpž&˜ wÃ}°’ðñ’ÛÉ#¬&³"³ n@ Váw÷âjÞ€OàOÄH^ /g\™ãx~(ˆ0&*øƒð†ïÉ+—±\„a<™s‘©Ì™ŠÌ¤×£Ö$h…oá=p®äA8‡7Ñ×à}œµ€T‘9d-ÙJÈËt"“ÃòÜôÌw@>C!”²f üëQÒ½ðêð ø–á£æ5D¤ t+ý’12;“ëÍlÉÍ<Ÿùgå4f£þ[±L… °úaÊ{/œ„ŸÀÛ¸W„±¢ ÇÉ»ä3 ÔH ‘Û«Ìf€9Ê{}—«ãv¦¾˜Yžy óZæßqõOxw¾Ë8œ£fÂlè„¥¨ëÕŠ}<GaN¡îÞ„wà]4ñà:«ñ¢>|›|Ÿœ%çÉW”Rõ✅t'} Ëzž¾É87SÀ”3 ™}ÌcÌì}ÜRnw?7¨úŒïO/I/M÷¦ïH?—iÍìÏ<9ƒÒøQyO'Ã\íLhǼ¾­èz@¶%”çœÀr¥: ÏÁy”í7ð%ÚÜUÔƒFу 5QFjH=ûD2‰$ÈÒJfvÜŸ¹¤ýí*ô§›É]è’GÈa\Çq,§Èiòyƒ¼…å"ùËW”£<µQ‘†¨D[±ÌÅÒM—Ðt%í¡{°ü€¥ÇiЦŽibº±$™3˜e¼Å¼Ïüë`7°·³ÿ‹=ϾÃ^dÿ½Ì¸2nwƒÊ¦ªQõªŽ¨Žñ«ùñïÀêøŸpM_–À&ºþ6ÓfW¹2©™Ô5`_%¹ Aô \Ü(qøó¿†tATAÃ%»òv^·ÄõS_ÜšM[Ç !ßíÄäz{ îSe˜E ] ›ÃÊ~ƒÂbù±WTìkB©›ä}ó ø¦,ð5ùVà†³A¥EIJÎ.gvÇJ¬Û;üI©Óy½»¬³s<ò Ë|X…Ï@'rX5Æa•ÂŒ Qqq+ª(ÔÖ1³#¹5áLJ‰NT ÚÏ™¶ŽäÔbg'R•\—Û¾•¶1™KQæ’"ìDF¹ÌFÈ¢s``t$ú“gœò9§üg€4HÂM%E¶¶)¨­¢ß)D¿èG±:8Uš×µíMAùßÖpÅ×5Ei+ Wþi8ö÷h¸êïÒpõ7kxÊ\-k¸æÿ†ÇMÃJ‹OåÁâé‹ôñKĨVÆß¯¯´¯Üó^,Ýuõ>áam15H?úÖ*HcG8—îJw _ãtý1p/ƒŸâ+Ò'¡ [¦Ë°mÀ·_+¾Møöа³w*°e:v½|¿Sž›p2¼á3íøîÅ öÙpö8ßIŒ Å*@ïúGLÊ1“ÌÂ{@F$áªü?HE*¬Ca÷¡ôû˜€_þNõ"Þ%ZXÏqXÒkþ¹èÛIý…ä±v"5ä ~\¦Ô>¥6(5+’NíåÉ^ùcà Š|àT¾I¡²~’$Iì½@Õ˜'ÅÞQìQxŒÊ¯ÜÛ‚zØBåV ÷`ÿìo¥¶jÌ6Ö d BÖ d BXX„£6œa‘ÂqŽäYg(£2Õã¨LEp¶Ž"ÊÈKÕCD-=K>"ÓȬzïOÖe{ŸÃ¤c,/)Ú1Ãû<ùÞçrRGÊö ïù„w|Â=>a‹OxžÜ mˆ¸I©‰”Ý&¼Ý&LjêÛ„ñmÂi2s#0’¹@øq*þ±@¸£@è-J ðëAL×òJ}¿äk¾j^il¶·ßnnlü-Âb—çœ.!E6ŸÔ߫߫ vïîÝ‹°KÇÊ#Þ†ùâDÔ.®ò¦È®¡öblîjÊÛ`!Û %¸¢­PHåöH(í&R¦´I™‚¿m(RˆŸ­ª{›uCuQ«¡TA®Š^D踡ö…Þ ‰Žñ¬€„ZnK†êîCtÑPñëÞ#ɇRDpD´Q…<0Öª†ÚCHÎGA3…)B†¼éþ%'½W"³¼—KS,B.•¦ÔØü¦0EŸò¾ÁF²zYèýU]‹÷,rx±ý¢÷…ÈMÞg‹•~˜xNæO`&ù°¤ó>¹Ï{$²Ëû½:}(ªðÛ×®4"ð¤w²Y_š"7 yo‰Ê3輫‘ãªâVï?,é½¥ÅÕÞÙ‘ÓÞ™‘[¼3Fgš’PšÉ‘g•å|! noCÄí­­{Ý;!+òÖÈŸy+G'¯(U–W^7ÕÆå±'½EíåÞNI¤ïœåü"~_ÍÇø2>ÄyïæÍj“Ú ÎVg©µjµZ¥fÕh·js*ó–ŒYe+׬Ò7P¹¦£>ˆ5EÓ’#C’ìÉí­·Õ›êŒ5M‰o¨ºÆêð7=îä>ôŠÉ'ÝÉ ¹“qw¶&cr¢sŠ|B>jLœ"ËM'Žý䓯Y ÜŸèì´µ&§¶u¤ÈÇ+SˆX‰y¤Œü˜/!Akò…"(q ÚåùÐ*(”ù ÉV)d»FÉ"ÈÉr#“]„ˆB¡²×e²ÁþÂÆÄ`a¡B•B¿BÒÏ•Ê$¨ðQÉËðÓÄ`$¢Pi“¤L‘»L›T¹FÑ(’ÔEe’ÁŠ( F+tä/èâQô¬Qô,=ÿ/èÒQô¡Qô!D£Žÿϲ‰ݱù¶”3Ï.±q¾]É»{1¹ÞºØçÜv`,% u-^²Bn»—%ˆËÉmbÂ78ÿà7 Êèùbb6¶w ”–%†æKó•„õØŽ=ëÿj®]×çZ·ç˜í‘™­“çÚÑø èF½Cž«Qž«Qžk‡´C™K^[ãÊÙ×óáÖ[®_¿þ'OY½ endstream endobj 9 0 obj 6391 endobj 10 0 obj << /Length 11 0 R /Filter /FlateDecode >> stream xœ]‘¹nÃ0 †w=Çt|ÅuÃ@‘.z nÀ‘èT@- ²2øíKŠA t°ù‰Ç/ŠÌNýsïl„ì=,zÀ“u&àº\ƒF8ãÅ:U”`¬Ž·Súëyô*£âa[#ν›Õ¶}PpaƒÝ“YÎø  { ƒuØ}q WïpF!W]'’{ýë8#d©xߊ۸í©ì/ãsóe:Ò’^ ®~ÔFwAÕæyí4u ù+j)9Oú{ ªm)5ÏÉ…Ä¥ILFµUž˜ ùQüÈþZü5s)\2„Ì¢_±~%úë7’Ó¤¹«JwÂçˆ~Ãúµô@†u랟Ç{¸ÏM_C ‘¥e¥Yñ”¬Ãû>ýâ¹*}¿¾\ endstream endobj 11 0 obj 294 endobj 12 0 obj << /Type /FontDescriptor /FontName /HVJFXF+Times-Roman /FontFamily (Times) /Flags 32 /FontBBox [ -203 -428 1700 1271 ] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 1271 /StemV 80 /StemH 80 /FontFile2 8 0 R >> endobj 5 0 obj << /Type /Font /Subtype /TrueType /BaseFont /HVJFXF+Times-Roman /FirstChar 32 /LastChar 120 /FontDescriptor 12 0 R /Encoding /WinAnsiEncoding /Widths [ 0 0 0 0 0 0 0 0 0 0 0 0 0 333 250 0 500 500 500 0 500 500 500 0 500 0 0 0 0 563 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 277 500 500 0 500 ] /ToUnicode 10 0 R >> endobj 13 0 obj << /Length 14 0 R /Filter /FlateDecode /Length1 5056 >> stream xœ½W tTÕ¹þ÷>óJà "„<8g<äE&™< !’“0IÂ#„ˆ3RaB$. 4+T)T_±>ªÖj[N†Èšà‹«´Úª«¬Þå¥EÑöKKo{¼W`Îýö™ˆØÅºËu×]÷üëßÿsÿÿ¿ÿ½Ï™=Ĉ(‰úH"w{Ï&õ¡®šJ"~œÈ6iåúUkû7íq9†‰ì;W­é]¹jþæ:Ìè‡O^gGÛŠ“ŸÞù9Ñè5ЕwB‘z19ò'w®Ý´9yõB~²kͺö6Ì;ùäÑkÛ6¯w58Oƒ}²ºþ¦ŽõýÍÖ“/ ç«ÄɃ¼÷Ù›P“frÖ`wÄØb=“lΉ’í¶IâéIg£‰®¤Ï<õ-i󿨚w±j¾û\Õ<÷Å*ª©ºXåþCIqYª'5è±÷ÄÎeoú깘ôÎ…ldçŒk6.¤‰TCgb”[#Ý£Z îŽ‘vžÞ­Í ô„ÆsĺõÀÅÀ•ÀààAàSÀ#À_åkíô6˜EºQ Þaõ0œ¢Ñô)߈ðI`&ó•À`Øìî>üpø Œˆ„ˆi¨3Íw”¦’F”:¶2¡ítÅ(¦\KS ŽÒ R@‹Kظ ã'Œ/+­(¯(Ï-ÏÍ\ãt`Sss|lrnNêTá4A¨…ƒfÍQ†«ÙÄk³gÎhn*õ¥û8¯T**/.›š™‘<šÑ²›—ÇÿzãÊ›oþûÉÞ^Î{{?Ø¿zÝd{–§¥åG[z rYüÀs|%¹ZÅÍÛ²Ù瓴쪙sÎÿqæUnîp}rŽ»ðÌ36¾ýŽwÞ9°ßÆ[í«ëùa0˜ìpÔù×£—öMÄqF²€iÒ}t‘ùð ðÓ8N«°Å_4ÿUšçA<^S…½Ë¤-t?ÎÖz¦ÑÊ£X5äA:AïÓ\ºŽS#=Ë®¥ÍÇF¬e³h2û=v<@?¦—0£—ÖÁ·ž~„“:HGÍW +§gÑçsØÄ,šEAD¹›0Ó£ô 53?¥2Ú·Í#Þ¼»qöÒ)1»i=+ä›Ì»¨ùî§£ôoVÓÕØÌ*òÓ*ꤵôOt'l/â(d™XM!#O=]O»i?ÝGýš)ììa[’Ùivã\Þ€Èk鬿}Lg©ìeöš™iš&rk4ê,{?=LÑãb%ô`˜Î°EìzI“¦š²Yjž‡ º¦S}3ÖÒ­XÉýô+zð>²æ±rv[ÏúX„½Æë¤«lNû|óvñö£ß³ PÿFTºîEŸ¦_^¥A瓘ÆkyÿBJ•tÛB{y›yÈ|ÉüvÄNcÐÿ&À\ÚD›i'^{Gèúöêot‘9™›M@ ƒì4ûŒOåùˆö[i‘ÙÈÖo;m¯¶ß*>l®2ï5ß0ÿ«çø²dcç+Ó‘£†Ò"¼l+ÐëÕÖùx€Ñ^³èø):M)Î&a¬ŽÝÀna?aÇÙ›ìKι›+È™ÏïâŽñ7ùÛRº”%åI%ÒRé ôˆô´m¿}…}ƒý€}Àñ™sg¼=¾"Þ¿5þ‚ÙdÞgþÜ<†j<¨Fìé¼ösQM+vp%Ýbõ:"Îê9LÏŽ ªçézµý™¾À™»€>$Y}HC'ŠY%«bÕ¨s6ó³ÖİVìÏõ,ÈÚX7Û¶²;Y?àaöÖ1bϳ7Ø v0Ìþø’Û¹“§qçp7®´ñvÞÉ»øZ¾ð?ÄyL"©Zª—Ú†tLz[:)½/ý—-ݶÉöÛ?ÛÞ´² ÛþÃvÎî¶Û¯³/v¤9*=Ž'‡«¿pž¢(züK¬éò§zùAþmå×â=Ã/ ÿ-ŸƒØÂ³'Щ'qn§Þè€@2àvôp €ôÜœìÉÚ5U™”•™‘>1 Ÿ¬qWMu§Œ‘GJNr9v›ÄyZ}X5r†-G›3§PÈZm—)† Uý·} 5l¹©ßöÔá¹ò<õ„§~É“¹Õ*ª*ôªM5ÞòkjŒÝ°0~_ ©Æ‹Ÿgñû,^ïñ`‚Hëô« «£¾§3ûnHGÓ’ ½8èÆ(Ø Ùm[:Ó@„GÀH×üc¢æ·lRv m…Ѽ0ðgx<¡B¯Áf·kË Òꌔ‚‘ébž ×– rz»Dý´{ô mÅî˜NËÂkû^ÐÚB‹©ÆÍoL¸åôoį¹ÀÝ— ž]ßÖ©GkvÏIˆa!µÝ ©i‘а|{(h°í¡DVí‰Uth¡ w«F’V§uFºÃè9µ£ézz@kó‡ jF'ê-¡Ð;”¶u¦M*¬-¬t¦'mk‚~|GBÿûc£,¿ãmj¹Ô&2i (ÓPÛ­$j.†ŽéiŸ7dóAòY’Â]QæÒ²Ù<Öò\Šòʆ1Ê ¸̣夰’èŽÊKì)RIf{­ñv}Œ*¿§Ê§Ty¯*ߦÊ/±ÝÔ Ãkdú˜fùÍòìf¹¦YžÑ,?Ïfâ®"3I—'¿˜'ÇòäŸæÉ·æÉ=yrafàú,³ŸZã]m”¿l”_o”ïo”·7Ê·4Ê+eO£¼ùž}Ð=\âSjcìóçÊ”o¹c»¢­^;¢­Ï*µW³m”ocXQåsAo%¿E{Y±E7³bË~sÔ—i£Õ?Ù­F;VS‘e쎖 C;=ÚºT©Mbe#1KÉï´0Z½æ)Qï[Jm*Ë¥"– õd*³Ì•Yî׌PG´5îöAjæÇ‹*ñ1ÎŽ(ç}-ʹ¢˜ š³E1ÈŸócüÙ¨rÚ¢OPÞñ-UþXݨG„W[‡•—}k”£^kÂÏü/ˆèô4nv꣔'}û•'|»”Ç«-ó£eV¼ƒ­¹7Ê#Ê.„ÙX„?ÍQå¦2‘a”²»½MJ;Ôê)J‘·BYä{^Yè»IYÈÔà·ÈßQk9Ÿërm–RëËRfU¿¥Ìôc%Q¥RL*SÉK‹¬å•TÏU °<ÛeJk‰r R2½P¹n•s™ó:g…s𳨙ãÌvNrf9ǹƺܮ1®Ñ®d—ËåpÙ\8·®q1óOzxéÇ9Ü‚8lb´Y¼›‹‘'¾ œ¹8Ž–øRlÏøžš´š±Õ©•õþ+ ᑱàJO–q_)㙬Q*3+ÔdL!ö1û0àb ‚ìaZ,½Ç ¥5s›ƒ1öQ +CîuÂø¸¿À¡ÉXlÅ¡|¨üCÔ*âðrÊqpdË-·] 7¢ÀÍ/ˆp&ŸåæãÖÛ[Âm`g~À?Ÿo¹Ø‹h§å²Ó^$\ÐðDåŘêðù,¯dƒ[u'V ,+PY\ªË„Ë@iÊJ-³ï³7anI˜[,ó’oÌE ó£ ó£0_±Çÿ‹§£î»ù^òж~q k`ØØÝƒËnßrUØöÐÈ1'¼¼½Sжã!­ÃolÓüêÀ’þ+˜û…y‰æ þ@kp _ïðG—èK¬ äá{6¾•k×¥\ö\!ØlƒÈµ#ps@˜wˆ\‘+ ríÐwX¹ÄÚ]‹ê6^áÙôýï/ݸq)ý7Ж1÷ endstream endobj 14 0 obj 3321 endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xœ]ÁjÃ0 †ï~ »CqÒ]C`t—Ú¥}G–3Ã"Å9äí縡ƒ lþÿ3¿¥ÏÝ{Ç>þ”€=%pž­ÐA‚FϪ>õ˜ö®Ü8™¨t†ûuN4uì‚jÐ_Yœ“¬px³a úC,‰ç÷sÿõKŒ?4'¨TÛ‚%—Ÿ»˜x5.ð±³Y÷i=fìÏq[#Á©ôõ#Ks4Hbx$ÕT¹Zh\®VÛúN ¿wÝÕ+ÖŽÏ7nûä3."9OÙD ²EðLÏeÅ7ªœ_Dp– endstream endobj 16 0 obj 224 endobj 17 0 obj << /Type /FontDescriptor /FontName /NGCTIB+Times-Roman /FontFamily (Times) /Flags 4 /FontBBox [ -203 -428 1700 1271 ] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 1271 /StemV 80 /StemH 80 /FontFile2 13 0 R >> endobj 18 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /NGCTIB+Times-Roman /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 17 0 R /W [0 [ 722 556 ]] >> endobj 6 0 obj << /Type /Font /Subtype /Type0 /BaseFont /NGCTIB+Times-Roman /Encoding /Identity-H /DescendantFonts [ 18 0 R] /ToUnicode 15 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 >> endobj 19 0 obj << /Creator (cairo 1.12.2 (http://cairographics.org)) /Producer (cairo 1.12.2 (http://cairographics.org)) >> endobj 20 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 21 0000000000 65535 f 0000070323 00000 n 0000057960 00000 n 0000000015 00000 n 0000057936 00000 n 0000065471 00000 n 0000070162 00000 n 0000058088 00000 n 0000058302 00000 n 0000064787 00000 n 0000064810 00000 n 0000065183 00000 n 0000065206 00000 n 0000065894 00000 n 0000069311 00000 n 0000069335 00000 n 0000069638 00000 n 0000069661 00000 n 0000069926 00000 n 0000070388 00000 n 0000070516 00000 n trailer << /Size 21 /Root 20 0 R /Info 19 0 R >> startxref 70569 %%EOF danieljprice-splash-4d1f09c/docs/figs/starpart1.png000066400000000000000000000155761477365367100224170ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þÐPLTEüg9ÿÇŠ%×7ÿݸ¼èMJÍ(ÿ˜*ùc6ÿóæ"ÿ®XÔ3¹GåIÊ$3ÿÕ§ö_ÿ Ñ/ÿëÕD¶ âEÿ¦G0Ç ó[UÿÍ–ÿ¼uÎ+Aÿˆ³ßAp-ÿãÄ©ÄðW\ÿž6•RÿùòÿÙ°>ÿ´d°m*Ü=¦ÿïÞYíS’Oþi~;ÿ–%j'ÿÑŸÙ9£VêOÿ¬SÿŒLûeÿçÍ{gÿÂÿ¢? Ö5ÿýûŒçKÿÉŽÿ¸mxøaÿ„ÿ‚ÿ€dÿ~ÿ|ÿzÿxÿß¼ÿvÿtÿrÓ1‰ÿš.äGuÿõê®aÿ°\šÐ-†ÿ׫áCr«ÿ’^—ÿíÙƒÿ¨KoÞ?¨[ÿ¾y”ÿŠ €ÿņl¥ÿ :ÀX‘ÿÛ´}ÿ¶hiÿñ⢽Žz7ÿÓ£f#ŸÿŽº‹HÿéÑË&w4ÿ¤Cc ÿÿÿœ ÿË’ÿºqˆE· ÿ†t1È"ô]­ÿáÀ`™ÿœ2 …Bÿ÷î´.Åÿ²`ñYS?±ÿ”!+ÂîUÿÏ›PÿoÿmÿkÿªO<ÿåÉ(Ú;ÿÀ}¿ëQMÿû÷3ñANiIDATxœíÝõÃäFr‡ñ 33ã…ùÂ̇™ù.ÌÌÌÌf¦»@Çaf¾0ÇaúâÝõÖ¨%¦æU©UýÕóùaýâ¨Û[gF¾u +”»ìý×((§?ë¦ ïºéjšB”ALeúÙO¿xÅr¡.4Ñ¢,©÷õØ6©Š­b:_Q—}\h¾EeJj›¨î^·Ú>«oýdñ‹‰þú¸Ð|‹Ê•Ô½¢/”¤Ô/4Ñ¢lÔþÏcû¤nmqUu6©Íï"6ùÖøH’› 8ÒäôD–¤n¯(zÆ]×R›èj&òªË#åJÊ=ÐéÎT™|}[]ÎDžCuy$KêÕ<¶ÝâàÊ)è@ƒ@IªÃCuy¤6I]}%j‡åtaÃó~ÁGN,©?ðX5ƒî_ŽœôúÑì ÜÕ.©Ë¿;{ aK$…x$„²1þ3xéW÷x"!I!^š¤|?‹¤oURç®TÊðûõ—h«AÌfIî+•Ñ…nò|½HyW†Ô§:“pÛÌ™¿þ¨®šÊôv IA“/©Ù”&iÍýîCeMŸôz}R3ÏÃÛIá&œ÷¥V&rÃïî…ðP/ÒßL[Kê‹<Î&µpzâÚ¢xBBœûÛÜš:>ìÔÎüÅx’z.s÷¥æOõyÏŸ/¤äÌßîL#çZyùÅ¡^“ÔÙù/¾~-WF¸I)s'5ýB\]Œ ” ƒ³*©s÷ÓÊ…ïŸ_L㤺}·O\vîÛlR£ÛY I½-x÷[ƒ×çý¸ÇÆóW¶x/—¥ã5;Z;ir½0ùsüéus’*©ÖĶƒŠ=¸381wWdr–mðËÕO\u\’‚œs÷ògN<ôAu]Rïæ!6ƒbÛAeîfßÌYóù;þ*Iñ´YÄ™»áwúúä³ø~ÿæ±í 6Ÿp’Rvù¡Þágœž )hYNªÔ ùçMÔ!)¨Z|ÔôÂuqýýûÕ‡{l}_jÛ‹ßýx8‚TIµžq’B¼LIñBy°¤~ÃClŶƒ†wÃÊG/|Ž©Øv‚%µ˜“eµõjfžÕ¸åáÚ ‡‘*©rí+¬VˆfI=‘ÇæKÝ䡵U‚‘Ф€P–Ô7{p_ ¸ UR­ß ‚¤Ï’zu±|¨ »ªÞÎåIí½") ”%õÙÎààÍ?t,MR§ÅpÆ=³¤žÅ£Í«z¹–BÇH ecü}$\))îKA@ª¤xöúgI½‡Ø Šm)T/”_ÎIïÙ;bÛA \K¡,©¿ó›A±í Kê…=ÄfPl;H¤€P$„²¤~ÖClŶƒH ER@(Kêb3(¶¤+©Ö¯êÕ{BvU½Ëãy4y&z;ä„x™’j>á$…x$„²¤¾Öƒ¤€ 2%Å})È”ïã–Ô{zˆÍ Øv‚%õŸb3(¶¤P½P~9'½ÇEŶƒr]Kq_ ݳ¤¾Òƒ3~À™’âq) ) ”%õ"Üð.°¤~΃¤€ R%Å?ô/UR\K¡–Ô#=8=\@R@¨LIqÃ,©oõØüôÄÆ—¿ïáp™’jÿz)½gcWÕ;$½–‡Øü‰m)Ф€P–ÔŸx¨Ý—ju H¦¤FKR:Ž£z¡ürN­®?H =³¤>Ý£Í ró¤žÆƒ¤€ &Å ?ô,SRÏ÷‘¶`I½£‡Ø Šm)Ф€P–Ô¿xÜtw’ÊÀ r5’B¼6IU‡jkPè¤U’BÏí·ùæ.%Æü oÍ|DX•T9ÝÈÞ_¹qR¼±ÞhM$…­Ugn›OiáN‡…3¹x}RáJý!õbs–Ô7xÌÎà½''$Lªú/Áô¿$…xQIÅÜðk,ïÊЯI ïø/œž¸fngnœm‰¤Ï*x%¹{÷3¤Î<.uÅbÚ :I!žMÿïxÌ={béB¯;·Õ³'.ˆ³&©ÍÖ²éQfÄÉ”7ü À’úD­gÓè^®¤f;Úôh …£H–T[bÛA –Ô“{ˆÍ ØvI¡,©·ô›A±í ’B‘Ê’ú+±ÛR8vR¼• BUoçrȤö^UOÿü%‚ÿIÛR°¤žÝClŶƒH ER@(Kê‡<ÄfPl;H¤€P$„²¤ÞÙClŶƒH eI}µ‡Ø Šm)Ê’z ±ÛR ) I¡,©_ò›A±í ’B‘Ê’ú ±ÛR ) TõBù^¢øBy½-aWÕÛ¹,ædYíºÞpbÛA $„²¤>ÄClŶƒH ER@(KêÃ<ÄfPl;HÁ’úp±ÛR ) I¡,©ð›A±í ’B‘Ê’úH±ÛR ) ”%õ1b3(¶¤@R@(’BYRë!6ƒbÛA Õ å—sÒ{U¹Øv×R@(Kêã<ÄfPl;HÁ’úG±¼-‹]UïtȤö^‘Ê’ú'±ÛR ) I¡,©ö›A±í KêÍ<ÄfPl;H¤€P$„²¤ÇClŶƒH ER@(Kê]=ÄfPl;H¤€P–ÔSxˆÍ ØvBõBùåœô^\$¶¤ÀµÊ’ú@±ÛR ) I¡,©gõ›AÁ3.ØUõv.¿æ!6bÛA $„j“TÉy+ߊÐ?KêAR8 ê…ò·½ñûîäw•ñ…’È’šMi’ÖäwOI•¤IÍÑŸ| ˆbIýG5ƒÕUWÞ~3gôÇßâ¬Hjøû §'ö[»òœ[ I!^LRó§úrœ?')4eÓÿW>!)Å«¤f£Ÿù±6©üH M;©ÙÇ€›OSygk)4e£öþ=ÎàÂý·ƒì–gü°µÃ$5wF¿Çí ;¸gôèqÎè÷¸d§ŸÔ±í ’BYRŸä!6ƒbÛA $„²¤ž×ClŶƒH Ub^ÎIïÉpbÛA –ÔçxˆÍ ØvI¡H eI½”‡Ø Šm)XR_æ!6ƒbÛA $„") ”%õzb3(¶¤pì¤ô½Æ®ª·s9dR{/‚,©ÿð›A±í Kêm=ÄfPl;H¤€P$„²¤žÀClŶƒH ER@(Kê}<ÄfPl;H¡z¡ürNzO5ÛR°¤žÖClŶƒH ER@(Kêã=ÄfPl;H¤€P$„²¤žÓClŶƒ,©Ïô›A±í ’B‘Ê’z1±ÛR8vRzO[Ä®ªwH:dR{/‚,©'ó›A±í ’BYRö›A±í ’B‘ªz¡ü3-<ã,¶¤`I-ædYíºÖpbÛA –Ô¯zˆÍ ØvI¡,©‡yˆÍ ØvI¡H eIý±‡Ø Šm)Ф€P–ÔËyˆÍ Øv‚%õ7b3(¶¤@R@(’BYRò›AÁ'×cWÕÛ¹2©½A$„²¤þËClŶƒH U½Pþ»–Þ—ÛR°¤s²¬v]k8±í ’BYROì!6ƒbÛA $„ê'© ŽMRˆgIýˆÇ®3¾‘¤Ï’zzg0:*’B¼6I•¨µb£")Äkx-2À¡M‘âYR¿è±f£®¤£")Äë)©{1…•@Rˆ×,©Õã{ºv")$fI=G=ƒåÜY‡2ø‘é×òȸ&ôÎ’úCÅ|f.´ØÇ)§7å¢Ð¹ ’*õ}žræÇH¹(tnmRu0eæeø¹¾ »ªÞÎå%=Î%å(+£¼+C¿V&eQ–Áe‘¬z¡ümó)•³g÷Ná”é—ªCä“weè—%õ—³3øÐÕT!) .)nøwXR¯íQfÕ>ž==‘xn/ ÝZ‘Ô ™ùS}™ÏŸß‘xièÖª¤.œ±Hÿ¸O浡W6ýŸê!6ƒbÛA $„") ”%õëb3(¶¤`I}ž‡Ø Šm)Ф€P–ÔËzô<ƒ3’õ¼}Üÿý<ðÀÞ«Èí@IÙõ—p’ºì0IÍ=á°ãí설.³¤¾Ü£ãœ{Z|ÇÛÙÃ}÷Ý÷àmçÿÜ{!¹%©Ñ{g>Á%$åb£öúýÎ I­GR.Õ“Æ—sJþ´òeóI-¼þ¸Îxš¸–Bب}½GÇ3È?´AR@¨Ã$U¿áÌéK@,Kêí<ºžÁéiˆ®·ƒ¤,©ïð›A±í ’B‘Ê’zo±ÛR ) I¡,©ô›A±í Kê£<ÄfPl;H¤€P$„²¤~ÆClŶƒH ER@¨ê…òŸ±DðåbÛA –ÔbN–Õ®k '¶¤`Iý¶‡Ø ^ñbWÕÛ¹2©½A$„²¤¾ÐClŶƒH ER@(Kê•=ÄfPl;HÁ’ú*±ÛR ) I¡,©7ñ›A±í ’B‘Ê’ú&±ÛR ) ”%õNb3(¶¤@R@¨ê…òß½DðõzbÛA –ÔbN–Õ®k '¶¤@R@(Kêý<ÄfPl;HáØIéÝ=Ä®ª·sùQ±ùÛR ) I¡,©Oð›A±í ’B‘Ê’úy±ÛR°¤>ËClŶƒH ER@(Kê÷<ÄfPl;H¤€P$„²¤¾ØClŶƒªÊ/ç¤÷J±í Kê5<ÄfPl;H¤€P$„²¤¾ÆClŶƒH uì¤ôNbbWÕÛ¹¼¹‡Øü‰m)XRßâqÓ,9¯ò­ýk“Tu¨<ò­ýk—TÂùM¸$tÏ’zw’.h–TÆñ͸&ôn]RgÎ9”ÁL¿–GÆ5¡w–Ô÷xÔ3x§—¹¨ÊàJý¥TR. ³éÿ2󻓹´«®²ôS¤\:“T©/mšTÎá͹*ômMRƒK¨¯ŠæÊÊ(ïÊÐ/«à1çï7 ¯«H V½Pþ¶ù”î9ûû~PÆ_$)ÐÊk©áér’I}²Çäq©ê#nøë’_/ÍžžH<·‰—†nY¿ì1w½º”™OÏm⥡[+’º|Î"竤N2¯ ½Zs-Õ=±í Kês=ÄfPl;H¤€PÇN*ù}=ô¦z‡¤—ö›?±í KêK=ÄfPl;H¤€P$„²¤^ÇClŶƒH ER@(Kêë<ÄfPl;H¤€PÕ“Æßj‰àS Ķƒ,©Åœ,«]×Nl;H¤€P–Ô·yˆÍ ØvI¡,©÷ðèq^µßãvÝ’~R ˆc÷ýýÍàìÿFľÙz58õ¤ßT°Çí »£$5z§Á™O€6jêÑã ’š’KªŒß±s)©³oî \k2x*IMp-…¦lÔ~Ê£Çäôš²¤>Í£Ç$)4u˜¤êÿVý- Îq’º5= Ñãv%õ›b3(¶¤@R@¨êyÚË9é=€#¶¤`I}‡Ø Šm)Ê’z±ÛR ) I¡,©¯ð›A±í ’B‘Ê’zC±ÛR ) I¡,©oô›A±í Kêí=ÄfPð™ÀØUõv.‡Ljï@I¡,©ò›A±í ’B‘ªz¡üŸ-<=&¶¤`I½Š‡Ø Šm)Ф€P–Ô?xˆÍ ØvI¡H eI½©‡Ø Šm)Ê’ú_±ÛR ) I¡,©wñ›A±í ’B‘Ê’zR±|½ vU½ËyˆÍŸØvI¡H U½Pþ–ÞñÛR°¤s²¬v]k8±í ’BYR¿à!6ƒbÛA $„²¤žÛClŶƒH ER@(Kê÷=.Ï`ééá«^Ö‰žD'U]hv½¬=±¤^ÜÃ7ƒÝLj7 EGH eIý…‡kûÔ~VŠ~¬Lêô…Ó9‰~µŸ•¢AIݪÔ_ê@GKE7¬‰×ôÍ ./“?»ÐÑRÑUI®™Êð{ÐÓZыȤºÑÞÖ‹XRÿê¡–TGÏô@ªwHºç-æØw'1÷nô¶^ôÀ’šMi’Ö™_')à!$„²¤×ÃqƯ'Ý-ˆIª¿óçwt·`t *©.Ïõ·bägM|¯‡Ø Šm)Ê’zJ±ÛR ) I¡,©Ÿð›A±í ’B‘Ê’zf±ÛR°¤~ÅClŶƒH ER@(Kêù=ÄfPl;H¡z*ùrN]>Ù|‘Øv±¯¥ôþ+]UoçòGbó'¶¤`I½Œ‡Ø Šm)Ф€P–Ô_{ˆÍ ØvI¡H eI½®‡Ø Šm)Ê’úw±ÛR ) I¡,©·ö›A±í ’BÉ'5xùÆä…néYRïÑÝ Þ©¨Ø‡£õw·tÀ’úîfðô¿gœû5v·t z¡ürN=¾–¤ÐšøµÔ§¢Fõ¹äf£öÔ}Î I¡¡$Uì[ã¤îi¾&èO“LRe²³ÁŸ\Kas6j?íÑá ŽZ")lL=©RÀ?lÍ’z6îf°Œ>$)lM;©áݪ™ó½m=ÐNê±í Kê·<ÄfPl;H¤€P$„²¤^ÐClŶƒ,©ÇzˆÍ ØvI¡H eI½¢‡Ø Šm)ªz¡ürNz/,ÛR°¤þÞClŶƒ,©7ò›A±í ’B‘Ê’úo±<ã‚]UozrȤö^‘Ê’úN±ÛR ) ”%õ„b3(¶¤@R@(’BYR?ì!6ƒbÛA $„") ”%õtb3(¶¤`IÝï!6ƒbÛA $„ª^(¿œ“ÞӶŶƒ,©çð›A±í ’B‘Ê’ú]±ÛR ) ”%õ¢b3(¶¤@R@(KêÏ=ÄfPð¡6ìªz‡¤C&µ÷ ˆ¤:?Bû#In*ðH–Ô«zTº#´?’ä¦H*I%?T—G²¤ð¸ó;÷$•üP]iUR¥ó¨ÊÙO¿xÅr¡.4Ñ¢Ö$UÓ’’¹ÐD‹²¤îó ©+” mt¡‰µ"©2½´Î”Ì…&ZÔ±“â]7]Õ@Žþ `’buzÈ…¤€XÅþ`rÆ8¨Á-ã­o#Ÿ.~Û#µ¹­ßj7-ÿ† Ü²£eë39§Gí7=Ri3zv3þ"ªä§D7?;zz"̶Gjsš·én&OHëô·´ùßW¹wáõ?68Ζ—~:JµImüï ‘ý…)%Õj7ƒƒ‘T?_ý'ÕlðH çTwHêfjpb‡¤’š¾jfðgè_Øä%7$µêP$Õ‰QKÝ_K Þ—jzk•úƒÿ±•LjË3¥ ÿ£‡õÊèÃIi<.Õt7ÃI*µá}ퟵoC¸í‘½ü Ín†wG§oÀMð¦‘@¬áÿÏÀz…¢€P„") 7ü€Hœž"qàñÿf››%c IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/starpart2.png000066400000000000000000000462571477365367100224200ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þÐPLTEüg9ÿÇŠ%×7ÿݸ¼èMJÍ(ÿ˜*ùc6ÿóæ"ÿ®XÔ3¹GåIÊ$3ÿÕ§ö_ÿ Ñ/ÿëÕD¶ âEÿ¦G0Ç ó[UÿÍ–ÿ¼uÎ+Aÿˆ³ßAp-ÿãÄ©ÄðW\ÿž6•RÿùòÿÙ°>ÿ´d°m*Ü=¦ÿïÞYíS’Oþi~;ÿ–%j'ÿÑŸÙ9£VêOÿ¬SÿŒLûeÿçÍ{gÿÂÿ¢? Ö5ÿýûŒçKÿÉŽÿ¸mxøaÿ„ÿ‚ÿ€dÿ~ÿ|ÿzÿxÿß¼ÿvÿtÿrÓ1‰ÿš.äGuÿõê®aÿ°\šÐ-†ÿ׫áCr«ÿ’^—ÿíÙƒÿ¨KoÞ?¨[ÿ¾y”ÿŠ €ÿņl¥ÿ :ÀX‘ÿÛ´}ÿ¶hiÿñ⢽Žz7ÿÓ£f#ŸÿŽº‹HÿéÑË&w4ÿ¤Cc ÿÿÿœ ÿË’ÿºqˆE· ÿ†t1È"ô]­ÿáÀ`™ÿœ2 …Bÿ÷î´.Åÿ²`ñYS?±ÿ”!+ÂîUÿÏ›PÿoÿmÿkÿªO<ÿåÉ(Ú;ÿÀ}¿ëQMÿû÷3ñAN IDATxœíÝ¿-uÕðKeñø«$ô‰Y©„ÉCB=$‘`(¥ú©¡]Tü•F ’ †W ºe>áP!b˜¡i<^J%­GÒþ…fÏ÷κkÖ¯Y3{fß³÷ù|^/ûìsîÙçÜ3ï;{­½¾ßÙ±AAAAAAAAY"U Ý<Ðß‚lBªýo»¦*™>ÃŽ®•R˜* “ õ–·¼åW¿úÕé§Ÿþãÿ¸:á„üà/}éKÏ:묛nºéÔSO½öÚk«k¯=î¸ã®nòH“ËëT÷4¹°É—›œw^u^“/59s_ªÚœÜf÷îj÷îÝÇ4¹²ÉMªK¹»É®]»noR»Èž={Îhr}“êÄ}¹¦Íc=V=ÖÉ%Õ¾ÿw>&>5¼ó –ûö¥ªÿ»D¦ºÓˆ¾sñ™ìOÝwßþ/*¾ÓÅÏU]S~Ðòs—¿ƒ=Uý×±§ù{9·ü%íZ¤*sÍ_â¥åoôÊ+«úo÷˜6»›œ|rUÿÊï¤üŽš_Øâ·Wÿ˯´þÝÖ¿åú—]]}uý믃ú€¨‹úø8ᄪÓO¯›¯~õ«ßøÆ7^þò—¿þõ¯ÿÚ×¾VýèGßúÖ·:ÇXõw2™—ÔLb;˜:R µÙ¤æAUέôsv>R µá¤ZSQTÁtBƒ©j1‘§úo³j<íÇtùå KUSIÕÅtfóK«Óî6ÇS&òTU‹©x*ÇLsøt<ÕXÕÅD$®Ð©Œûøš”ù™÷±tM\âè9¿Iuþùž³K¬…ÓûÄ÷U“*éÀªX{öÁjUUõ_WÕÀªXWvaU ¬“9¬šTý«+¿Ç«¨ªyäêVU}LÔÇGýOnýoo}ÜÔÿ“ªŸÿüçÕ×¾ö£…ªþð‡t¨ý¿LVRKMÊ%Õ¦s~⤎3IÝc‘:/Mê“ÔÝ©=©ó¤ú¢OLæ§%H‰œßÆù¸"u_šÔ&©]©,R»ó¤±H`‘Zœ¨d{b«Z|GS£J¥@ ¤–"µ5ÏRD|ÚÚ_L‰Ž_Á$J(ò$J(V@˜ºÅS•Á¤K(á‰c"OAeþ^z©é?ÂË&%éü!ñl°ª¶¨ U°hÃaÑ/„©ªJQ•WUÿS\«zæ3ŸÉU½ò•_ÿú׉Ô_Ède¿‰ˆ)Ú~¤´…i¾Î~MâËÎO*õ”oR†©Iéç{s‘zle¤ÎœÔÉd5¤¦|”î«ÙòƒK¨{HSë)ƒ‰žÆÇ˜´'¯„21e$ Í%*^ÅÔÍm*½¶ HÔ|¤~&빸ÃMe–PÅ“YBñª[BM‚Éó$f%´§$³xÉ|²Å( tN7[úû§JU™‘ QTeêEU¤%UÏþó¨~N¤þY&sÖRó}iÿ1A ¤“jêý5 UFûVÜŸ)w–ZR$UÁ4Îõ|줘2ãfãÜÄÔË"SOȈë9§/yX\ÕòEUoO]7ÔÝ•óܯ)¨ˆÔ_ɤ@ ¤ÖŠ”1‡7ëÃH U×&ëBªˆZáK½½%Tñd­‡âž2ƒ±„)_BÅóSÌ"¯²< k*UËUÆ0E[æ“*§ï÷o|ƒHý£Læ]j¥ç)ÚdR•Cª"RÔÓ¤ª–TU}ÉJç~UurÙÚª*Ïý:'ªÅ“¿Ê}Í·.¨¶ÒYª­£VGjÚV¤ª»MR퉪Úw¢òIÝsyU¹cí\þM&s“šc/—èñp–ÚXRÍÁ­IÕž$©Š=ù«v'HE“Iü,µH­:U\Bõy2»æSÜ5ŸÊÓ$h+=IR mñïBÀZBUÙVtÿš¡FÔ.±‰fª=W•÷=÷k~ÃmEÕYDeªj§hë‚ ¤@j£Iu»é©ªíST¨ Iý­L@ ¤Ö™±LRÕ’Zùج¹ž{òçcGwÍÍj¨'¯~šÍC§…IÂZ^U«*M J kÿVÏMO½-ªªý{¨ïnvy>¹Ù3nñšo%Ð{ªš“ˆÔÿÎdÓ– ‚ÔÆ“ꜨRUóURK> Hm[RU)©ª}­¿ö‚U‡Tmjߤ28°„ÃA %0eJ¨žbLKûH%F”³5H'«ªŸìYSÕ®¶QqwÓQ7GþÚnú⣹y’³z~q±œöèú³™¬`lv•©&Å^öU­?5H+Héu‰ëIjÕ¦@ ¤6›ÔêÊõd6Î㮹(¡ÌÆù8OIIËëɺÎJ/¬iUYóIº¨šLÛ1}qI·öèúO™lÚëR Ró‘ú{™€HÔZ‘ªª•ÖSaTEùó¸k7Η÷4”QŽþ˜|úâÁòTÑí©º¦©ê gµïhUæêùö*ÙguÖ–"U­xó ©Iý¾L6m "HHMú€1¦>Ofã·§ú”•$¬Œª`Œb멺öÚk‰Ô?Ìd5—¿^]Ǥ@jsI5ß{»Š€HÍHêg²šU½«;K×fˆ§+ÓžâÆù‰¹ Ýd<˜†é‰)¨/U½å”©êŠ6¦ªü í Uå@±TwÜq R 5©™ HHeI-sš¿q°òZŠ0… âyJ6ÎWài@£Gûç*£È«:#¼¸›©ª U‹«Ž¶G×8K­~z¤@j>R#“M{] ¤@ ¤¦LÕ;$kyz =.á5ÎÇyŠç£1™¼WYt>Ö&ck´*³œ: ªÂ¥ó<òHHÍCêdR RYR2“ $µrOb\b´§L åéQ–©jt+}*UôúÇU´t¾é¤ƒHHM©IýûL6T°4Ê÷t©ïÉ—X'Ó$Œ´¤{í¶´ª€ÔVSEcžª¦œºçž{@ ¤@ ¤¦ HÔŒ¤Þ™É’šß“hœOèÉ,¡LZI&9I1¯qª4©Ûœ1 OÕcÝÓ'W¥–O]xá…[‹ÔªWõî»ÆHÔ4¤:Û¹üîL6í*ˆ8KÔ|g©-@jõ×êê©Kj+{Z¤Êd`M[NåUiXª •.¯ *)š‡Ôç3ÙLR'ëYßÝ}žD—oIO#º|&ÝŒëMŸ¡8Uü'8Pªè8ZU»Ö£~ö·•H­¾–)ÚhR«ßǤ@j>R;“M{]Êóä÷ú¸§d •”dÖ>‰ši4¬d9Õ«ª·õ—ïþM¨ªYêA¤~‘ HH”©M'µêZj”§]ÌӹݥyODjœ§d 5- ¯¨ô}œÊTª‚¢*¯êšî&ÏãTYó~œÔ?Τ{°O`å?©­Ejê#|â¯×ÿ€ R 5én ODjyO&¦¡t c3HUo7}PC½·¨Òªè×;\U]P©?•‰$5qÙs žøHÍDê?d"k©Ó¢)ÚÞ¤öýÉ)ñÕwüO}¤VæiPã<À4HÏÛÂøz¼Ïͨ×PTiXƒTZëѹrÇ"6¥hTh:î,R 59©¿›É¼¤`{¤@ ¤¦xÀ£²|jbIO¢}NG'5¢q®1å«%má•Ø™ú£V ÊƒåÙš¤¨šAÕr¤ªÎÿ&9ħûR¹Ç)šÔ?ÍÄx]jR+6R µµH호;·úõR‹ kŸ÷z 0yžÌBÊóÄ<³q`ê­}´¡ âsµ* «·­>,]T-©jñOsg‡¤¿”ɦM¢E ¤@* µèQ€HHM•j”§s™§3º;!eJ¨Ñž4&ÏS/#]9ÑÁÿ¦\:Áçª>nôgvÖU#`Ve-Ÿ"RßËdÓöž)ÚhRí·²Š)R R“>ÒÀ¡‰ÛÏÝ¿.~œ'11Ñë©·kî•P½†L_èKˆÍüD¡ª–ikrXAC=?EÛUÅI}4“Õí«{âR 5©çeR RëGjåOü† Mœ;ƒ'MÊôÄûÌq ÕËèmªãmb:ÅJ/8G §êƒþš³ÂšCUs8m%R+î÷HÍJêof²i¯KHÔ”©FyÚÓç)À”ñTH%K(áÉ“äô¼íÊ”äóêû¸­j¬G‡\Bç–<,SUÐPwTHÔl¤~–ÉŒ¤*–ùE<&HÔæ’š+L¨²Z3xhbOw²Äž ©A˜´§€Ñ-jÎÁôôY'–ïSLUÖ ÒJÀ:e,³¨ZNU},©Og²v¤EÝ”ë½@ ¤@jX*z[±÷é£ RNjòJª‡Ô(Og,çé|îI´Ï¹'“YBnÌðvw/¦!ñT- K´ÕuQuZnG¥iUÑò© R/Éd%×êüAö‹_¤@j³I™‡ýD_¤@ ¤&ý²6©6.©áž•P·Y»`Rûœ{ò0™ž2ztLO¯rÒ÷ –V5VoOÝl«¬YUÉ×€ª›É:’ê>›Tg©xú¤@jÐ‰ŠŸ¥ÞšÉÖR]Kº=R 5©EbN+˜k˜þ1ªî To!¥e[RIO“é‰ )íÉÃdzŠõ˜’t åyÊEUƒêªÑ=õäPílª¶ÔYjúTÝ›ò¥^©ùH}1“u#Õ)õ ¤@ ¤&M5ª}~}ÎSÐ5ç˜LO…”ö¤1ÅžNI'Àt•ïþöƒÖgmõå{êɡڤª‹«â°,U[Ž”ñälÖ‡)šÔ«3YÃŽ_øx Ró‘úv&ëøºTô€+ôdbÒžD!EžL¦§€KQ q&?ü°oh-k„*¯§Õ.£*.ªHUsHÔÆ’: Oü@ ¤f"õ‘L6­=1ÊÓ‰=™]sÂtswïs^H O&¦ÀÓ =¤±ñxqXCU™EU¦­¾*U[Ž”ñÚѬR µé¤V©I=;“%5µ§L×\{¢BŠÚç÷†[ÑàAà)IGDè¸lp<^±*o’"€ÕÛV_*ÖM¯")š‡Ô2))òSñB*íéš%<™˜¼ö9ML˜-ó^Oƒ MÁ¨—×òªzë*³¨Z¡*)šÔogR R å§YKÕ¿,~OILAûœ{Ò’¸'N*ôpÅIãcªâVºV%lÅEÕJUu¶sÙ–¤r;M€HeOTõQD¤>™ HHeI½0“ $%Úç O´æO&¦ëÔF˜¢}n¶Ì&³ò0ŵ§ã‰lzaqUÁ…€eÚ°”ªvŒb‹‘Zù¦@ ¤6›”º(ÀÜ)š‘Ôoe²²%ˆ+"5ÂSK*éIcº®šðôÚçÜ“)é Ö®–‚ÔLZÊÑ=‰mqUÔMï¡ÕªL^˨¢ø¦PµèúµGHHm©Õ?ñ)šÔ›3YŪÞU.”÷†&´§n!5Γ)‰0ísîÉÃ4È“®tL\Íwí Rå•S§¨“né&†¥US´ôœ.§Æ©j[é[Ô*¯'R 5+©Ïe²i¯KHÍGj‘˜ÓjÏ «H5ph‚OM$=yS“¹2>ðtJ7Ÿeᤄ§“úÒËèˆnúTiRA9¥UiXZXRý­O®ŠQÔ‡‘zE&›¶ HÔ†“Zõ¦c R›Mjå[cŽšPžˆ”çÉë—{žtû\x 0™žt åó“ÇÈFõÝ£»1D”S\‡uŠê©›¶„ªd+]¨2Ç(ƪ⤾™É¦mà R R“> HÔF“: Oü¨J{¢Kæ=™˜eÑž¨ <}Ve¨'‘Œ¤ûYº¤bXºœzX­¶t]ÌVÄåÔUT!÷ªê¶Ò‰Ô»2Ù´öHÔ†“Zu¤@j>RïÎdÓ^ê]$šÐžZRC=’O…”öäa2=iLG;1%ÝÆ)­´ª¸œ¢äa UÉrêSÃGhcU1ŠÎv.Û’TïHÔR×oû³HÔ|¤Þ“ÉŒ¤ª•ïŸÎ“‡é+j?$îi&îÉĤÛäfDwÞÑ]h¬X‡Åm‰žz+(§Uӎжå'õþL@ ¤@ ¤ü€HÔ¤©t!Õ7*›$åyÒ’&¯ŠŠ1™%÷HÊLÜÎÁ,ìÍ‹`õvÓ½ºÊSuе—’WNõª2Ç(’ª¬rŠH} ))? R3’úP&›Ij`!uçBJ{’¦ÀÓ L¼wÎ1yŒtMä1ꋆe6ÔùwªayªÌ¢ª·•žT•£è+§@ ¤@ ¤& HÔŒ¤.ÊdÓHõNË.牓 Z潘>«–CqLf ¥=eÓVÈÈ­= l‰ŠJ7Ô3óô£°t+½WUÐJ¡ª-§@ ¤@j6R‹Äœ6ð2 Ró‘úp&Hê@Ræ ÄˆúéaQ'¥ç#LC‘yº®©}7(ªu†)Ì‘ ³œÊ¨ÊŒÐÞî™4´•î—SDê'™l©E@ ¤&#ÕÙ!i[’ÂY ¤p–š2U~n‚y:¹B*ðdbºª›‡YÈ“–Äçd )‰öwtÛäZÒMžViïôª«;¬IŠï:Ûgžd ÒÆ°–T¬òTõÍPpR?ͤ@ ¤@ÊHHMšjT}yR“(¡a:ÉZ´š“MNC˜ÅÓNö6aÒzUñô”£»óZUÜS­ôqªÌrJ´Òså'õT& R •%õºL@ ¤@ ¤üT¢ƒ>§Yû¿­».J”Pž$Ó“‰I/‚×’nµÂ*$×Ó^v7WŇZéôM%UñpXKªê-§âVz_9R Ró:())?ÕJ:è…”è óBJTQž¤‡ýÝÄ!ª‡dÍ6¹ÆÄ •Û‚N¹}lEJU‚ÔýƵsŽà¤žè®£2'jgR•™ŸÍ Ï‚HÔ<¤~3))?ÕÒtÏSïè„.¤O¢¬ÐžÄQ*0Ýa-~zZ…£¡ÛD‡R¿ûx›úv·Êʨ°D9eFÀ õAªæ(§X“zN& R R~@ ¤@jÒT£:è·í P]ëFRƒ<=Á–C¡.ecz:XÍGtAì3Äõ˜á¤ì~zÇÖÁlíÔ¡Ý-×…*>E›Q5´¢TN U¹rŠ“º ))? R 5iªQt“TÒ“ÙA§¹‰Ào)“§£»ëà)1$kvÊ…Îèqñ.¿¿­µxÑÅaQEEß-×ç°ø$…N¯*±‚ÊT%ZéA9u|â 9^ýŠ+ˆÔa™l©E@ ¤&#ÕÙÎå¡L6ÎR 5ßYj[’ÕA¤‚BÊôÄ )ÝA7K(1KÀ ©^R±'AôÈlBzŽT‘®Ž¥Û‹—S®ªw)•€5ZÕjÊ))š‘ÔQ™€HHùY’”è ö¤;è^ל )³ƒž¬¢DwœHi@%¶áÚ¬úŠ*ª§­ô|Ñ>¯«ÄH…æÅU•¿*oŒâkÛ¤%Ë©D¤@ ¤f#µÈ÷£lâ•;@ ¤æ#r"VTÀä©’£œTØA×HéiYo`V”PS@J,2Ç%´'Q‘ΨdçÎô!UYqœ¼œ2i9/–°¨ÊŒQL2?kªrHýz& R R~@ ¤f$õd&Hj¢ºWHõzÒ¤t ¥Ç ¨}®=é*êÖvß#Ñ;çè—sLwÝu×Î6…Ýf°t-%Æ(8¬ƒU¼© ÍK«Ê´Ò3å”×JXNHHM©I½6Òt]Hõzú‚³&RÚ“î* OTB™ísÝ;ÏtÊ  »š”;»a-u‚ÅIª¼¶º˜ª0K+RŒQLXN”ÈþïY½¬R 5#©_f²Î¤ Ä÷R RCC{KG*QHéeñÞÐÄ«ÔúøËœ/Pá˜U—»žôT¬Õ —žˆ”Žtµï‹éŠj¯µ†>P•i«sUãZ颜ŠçgÓª¶)RR µbRgg²¾¤ªÎ{í; R 58Ë’R…Ô9þÀ¬ž›44Á;èæx¬éIH¢hOºŠâÊ»¼T"=ÏR1híã¥ë*¯´Òªt[¿BÀUݽhöù=“t+]—SBHéD¤Ú€H-MŠŽ¦öèúµL6ÎR 5ßYꙬ/)ñ¿}ïhRà ©Þº.¤NqöÂôæ&¾k­†çõ“DUÔÓÝ Úx¤¸'ê—sO/ëF©"[üëqRÖÞîD­ÙYפîW[iêr*P5nÑ|†TWÕ6#ÕÛñ)©žtžòH­ŒÔ 2YkRz¡‡To½-¤nVsùBJ/Žç˜âB*À$H¾:Šc¢iYÂÄ{àER±ÂË&’ôñ6K‘¢rŠZéæ:*QZ=ÝMR•·vÊTÕ[NeTiRV9µù¤‚€HÔ¤)š‘ÔßÏd3IõŽNt ©›Ó»"e:è‚”77Á1éÊ$u£³ ^÷Ë©f)Œ8&NŠŠªne%T‰èêJ«Ê“òægãÚ9Ê©;ï$T R 5©g"Ëû5ßÚ¤@j«‘¢7ë™~R‰BŠ<™¤’tî‰H‰uQ±§§Unl×Ä‹£Z´Ì9&R¢~øáåm ‡Õä®îrú#» `íu†jf›'õöÑu9å©â­t±hÞS“êªZ’”õêéZ¤@jFRŸÈÄ"µÆ¦@ ¤¶)su­R3³ºƒÞR§9…ÔǬí0ƒ•Rš”è ‹ö¹^Ÿñt,[ %†&&2Äñ¨âªþœ”˜ÇÕ¼bU·²ET|áT¦œÊŒQèEóZ•(§r¤éíÑR R“’jóg¬È¥ åˆÿ¯_@ ¤f$õ™L¶© ƒÞ®“ÊRD*Þ3h¢ëBJLÈÜ.Š"F”½jÿKމÏJhR¦¤‹/¾Ø´Õ–UÔGßim )„iRUbݤò:èÁô„h¢{¤Ä„,•P𔮢øÜ„ EP¸®ê&]ZZ_AÅyQEõ¸Ê±ÖJú[»gzE•©J7ÔõÚ)³•ê+§8©7fR R å¤@ ¤&Í~RÞè„ÕA¿nŠBŠ“³™:y"I7ªÕQ¼}þ`{UÃr`‹Þyñ$J¥CÚðÛüNFM¢tÒïßBéAg®–÷Ô=U&¬úo‹ÏÏfTõ–S¼ÞKªUÅI=#))? R 5iªÞ™YAª] O¤D!%«»©%VÅm R±*A*ÓG÷(ürŠ“zY& R R~šýl@ ¤&#ÕÙ!i[’g)½)&°Héº(¤ÌºWH‰¹ ¯ÒžŽU«£t×\{"R|,‚H½æ5¯á;ùpj%¼ÑÞÚzÊÁ[ IDAT;CƵéK«ò&)Äü,Wu»TާÊ$5´N¤ú†gùYj‘gEY÷«ˆ)š‘TȉXP“¤@jFRwe²i¤FÍÌŽNˆeR½¤z§e‘âís^By¤ÄÐ÷ô™Ï|†Þ–&z·­©Ìö:祛ëô½U:˧RTNál”>ˆÔr}t)© R 5#©™l,©àâ‡iRf=CJ´ÏcRb L¯ƒîRTB•)š 1åú—å"H|_|Eª¨2›ìdKô׃aŠä…GJŒQô’òúè½Ëå>:HHÍFêÁL@ ¤@ ¤üTÉi¤T<:aNOĤLOå(Ò…”¹FŠžUdH‰iY*¤jOŸøÄ'è èüb˜õ»ªÀ*7 ?ÞyªQ;*ñiîb“IR¼.Zé#Hé>º&®šâ¤ŽÌ¤@ ¤@ÊHHMš*pK¤ôèÄ R¢â˜OåØãžtûœKð*ŠÌ òôb–O°dô™M8?òFeV»¶ªÓP×­t꣤JnUǪLR´P^òúè™åòÝ NêñL@ ¤@ ¤ü€HÔ¤±IéºEÊ\,5Ž-‘AŠž“SWv'»Âᳬ‹jO©¿ßæÅÝ[Í'¼à/(ŸRîãmw곋†úÅÝk' R¦*¯¨ônI)Z/ÅI}ôQ¤ŽÍ¤@ ¤²¤öfR R å§ÊNäHh¢S9“¢]‘øÜÄãÖ.˜1)` M¼}^HqOµ—w¼ã¤†î)·m_èS¨Öªø8­(§øÍÏrR¦ª[»»%‰ŠJ«Ajh¤v€HÍJêÆL6Ô" R“‘êlç²-IõnŠ9Š”^(O¤¼}1ƒÅR¼¢ìeÛajObbâeì¢7œ/¤øÀl‚ëájèÝ:¿Ü“”VÅ[é|ù”˜Ÿ%R;Ù¢y“”(§¦"5b¹<;K-XµGHHMJêéL@ ¤@ ¤üTùÑ "•ØS“¢õR‚ c³¼¢¢BJ“òÚçbHöb‰¯/ ðºŠ*z  ³Ï>»†sv“–Ñ/Ÿ|òÉ_oòä“åƒõ'¾ Ié°sUb„Vo›Dó³4öa–S…”©*IJo9ˆTîª8DêÖL@ ¤@ ¤ü€HÔ¤1HQÝ_,•!uK÷b8&©Þrªä`ë8|f–o¢ÛçbiŸ“¥P½ÌMÔ(¨f*Œ^ûÚ×–·¡¦£Ž:ê°Ã{衇š;êU¥½ÎU™µ”¹pÊÛ-‰&L…*"¥§'zI™c³æäl¼\>$up& R R~@ ¤¶3©;"¥gfûHyå”H‘*1Fqkw€‚“z°»2žj)14ÁK(jœ?£»fQPj)ªœj/O6ùþ÷¿ÿP“Óo6©ouÔ¯wUqRTKÅ“³bx–×R|iQ/)*¤’¤Na»cN×Gï\¹ãŽ(üÊÓ?:HÔŒ¤Íä?ñ›HÔ6'55ª)ê ÏCÊ[5Eªò¤ÌiÙÃÙ6H‡t7Câžh¥T˜-¤^Û¤`ªSº ÉSMêuEõýï—fz)·x9å‘Ò…y27Iâž)ê "5_}IMk ¤@jFR÷gr I-@Mˆ ¤@j{“j1Mö]T£ÖÎTKyåT@ŠKíìîŠdŽÊ O__–IÕ. )Þ2¯‹§ZÒOúÓŸüä'tPSHRä©LOP-Ec³b½Ô!j­6kzšƒT°\Þë£w— nyRûÏN Rë@êˆLô¿‰R 5#©ïf²-Hõ-–:€¤ô̬YKeHqI´ÓyY)Uff ©ÚKé?ç9Ï©%]tÑEnR“ªïi›è¢ò:è%‡¨…òšÔƒêZˆ{ý­1½’bRs P€HHMšf ¤@j2Rí\ŽÎdÓH%/ƒ#Hµ¢ÏMêÐîryNJ¯—"Uæâx½@Š–Å‹0i5|Mª´Ïë‚é‚ .¨K¨÷½ï}jRÛzÝë^W—Võý=TÊ“íª)”h¢kR|wLê %Eµ”.¤¯+§|àïz×»Þýîw×oëZªV«j*ªú㵪RN™£ùé‰Ñ¤t!õ„Ú}IRÞHñ€HÍHê¤L@ ¤@ ¤üLE*.¤D-ÕKêkst½V^{ҤĖH¢}Ns²œTñTG5¦‡z¨®–êš©.ž>÷¹Ïýv“W¼âï}ï{ßÿþ÷×°š¢ê9ÏyÎQM+½¢M’èª8¿Ówl13«ÇfÍí‘âzPHMKª¨©©I]– HH”ŸÁ¤>ÕÎN8¤âBÊk¢S}©ú0ãWÂÙÉvCïí ¿¦M)¤êpOeZ¶xª ¦ÚÍ7¿ùÍg?ûÙùÈG ©77©o\tÑE?ýi»`þ¨ú•>z¼Pžšè&©xz¢wo$³DJLOx¤ÄH•€HÍHêáL@ ¤@*KêªL@ªÒ£¢"OfýáîžèZï£—L™}t=3ËGe©âk¤Ê¨l]0}èCzá _øÖ6¯~õ«¿ýío×Â>ùÉO6ÕSO=U«jvÉ\ÌÏÒ&IºNÛ3‰ olVïD…Ô8RqÝ›©A)©IR 5#©We²Î¤ŒÝrç % ©¸ƒî‘:¢{UœÞ%S\•GêæJ×¼‰NžˆRen¢–R{ªÝÔ%Ô§?ýé~ô£¿ñ¿ñÎw¾óyÏ{^©«Þõ®w}èC?mË©2CQ³,}tïb8yRG¶—@Ô{#MK*³^ ¤T*z³ÿ.)›Š½¥û@ ¤æ#µÈg£ðË ,kÀYI‰BêUÝ:÷“*žt9E»c>Î6ȼ«{ík½!z}Tóé ZO»"ñÙ .¸à'?ùÉ{ßûÞZÏÏ~ö³Ïþóõ!ð‹_üâ{ßûÞ¿øÅ7¼á ïyÏ{RtPÙ(³þs´jªVÅ(Ê>Iå[àÛ¢{Mt®jo›A¤øôÄÃáz©¸K*äD¬Vì`ºTâÿå©ùH’ HHT›T›eH‰™ÙÞÙ¸ƒ.Hñ…ò£I™3|l––È—õñ´úC=TWIþð‡ßüæ7×€ÊÅK^ò’·¾õ­¿Õ¤.³óûH•>:­š2¯€-H‘*]KyåT†To9E¤2ôäØ,Míѵ-IMq–)jH5‡ ?K}!“õ%5_Ǥ@ ¤è¾^RþöH½3³1©Ë¬í‘bR„‰šèú’8üz8t1½;f°VžïT(j2]tQ]6}îsŸ+°ê·5²úžfÅIÅ¿êµ9<[úèu¡ôÔSOÕªh¥Tm«©¢.jöIj·È\ì‘Yj©29k’óœ”Ø$‰{AÊÛ$I4ÑAjÚ€HÔ¤)š‘ÔÛ2Ù@Rtù븉žÞ‰“£^Ý\,¥f©½ÖE°ï².­(ô E¹þá šÐepøÅk@øÀÊžèeo¤:ÍR)ª¢ê”ÍÑérˆ‚”(§.fB¤rJ¯—¤¨ƒ¾$)stB{Ò¤üщۚKh‚HHM©I}%“íKЦ'†Òµ”ÙGפȓ×Açµ”·I­šâž‚&z™Ÿ¥áYÞG/û$Õ©‹§§š¼®ISF=Ô^‡_ ±&¥k)Ú$éíÎÎèÏêUñÑ Nªü3ä‘ :èDªü“…TŽÔ3))ò3†ÔðÅyRzYG†ßÀÙÜÑ…vÍ£g}Ï`Wm—l+ï ç~e7¿ZÕAm~³M}góœ¯4úЧ²²£öT:~eqGy½¸Ã$¥Ÿû‘'1à7‚TÜîË<ëóÚ} UR 5#©{3))òÓ!UTmURæK½ô:ïÎ6š_ØËw˜—ëåK<ʦ.¥œ:ì°Ãj=‡µ¡ÛES뉪¨²¤—j)j÷Q!Åwˆ«¶qR¢ºÑÚÇÚ}ñŒŸ.¤2í¾L!Å^ç­IÕ‡HHÍCêc™€HHù©{챉H‰1¿IHér*ÞÀ9&enã,.áQÊ)¾¶·¨â9ªI¹ÝtÎÙ¤þ…TÙ¦÷â¢Òc~É œR|G—¸ƒ>ˆ”^Ïëz4“M#µHÔd¤:Û¹lKR8KÎRS&KjøúŽ ©`ÆO2×wR™>º7CÁ¯âÁûèËk›”éˆ'›”a¾2ÏwöÙ„©L&òä]µM¬ìðwà§;èzt"YHùtNêS™€HHù)©Ic“*ªÊß”IªA÷ÑËïAê^N‰™Y)z}‡7<[®âQZéåÒ½g·¡Šé—mÊý ¿‚‰—PæF.ÁÜ„9:¡IQ-¥WväIñúPR¢êvЩE޲æWî°R 5#©ë2))ò³ŸMΤX½—T°°×#E}t©27ñãÛ¹Ä;ºðVzYÞK¤øÂ©’b«¤TLåÝn1鯹·˜÷u½6NŠ{Dª¼‘™™5I‰zo!euÐA ¤@jNR§eR R å'EJ P4ª û胶ò{8ëÝ›¹'ê£{8S9Å7u1Nñ1Š:EÁ¢¢ªH)¶¨bâ·Û—Í[Ê)±q_PH O¢2I—í Rz÷æüèÄÐYNªYrR Róº9))?©ä…*§ò‚”©JìÞLž8)½IÒN–xx–Zéoo7sæÛú‰ºêÅ,âÝæžr·ž˜ Iæ2)onB ÌêõRb¡<'5nfÖë ÷RjtB:'))? R3’º-“mG*ì£S9• È¨ú.ÛÙ§ÆyIÁ|±Ú´Ù,¤LO½µ”î kR™Ñ‰±t)©iR 5#©ó3ÙLR½“³ªþ©!}ô )£óZU@ŠÆ(Äþèæ­ž¤ U&¬ÏtÓ½GTQbbB”PÁâx}‰Þc»k{Úº^Ÿ™ :èD*ßAOR EÙ· HÔD¤:۹ܙɦ‘ÂY ¤æ;KT)ÖGÿë£X.ÿp›¸œ2(ø>I|Å<ŸŸS´TQ™ u1IA¤,º§Ü&>íǵ'=*KåœnŸÇ¤¨3³DjèèDïJ©At¢€HÍHê’L@ ¤@ ¤üôòûè1©¡å”˜Ÿ ¶JÒªt9,'RVPQ‘ªßa›h¾†-ƒ÷·½sÓÓÅj#Lªôîê^ùPLˤÌÑ ±XÊë {;b&;è e¤@jFR÷eR RYRWd²É¤âŠn“ò(x9å‘Ò唞塞:©2×N=îl›Ä')DC]TT½å÷v,bu”.¤ôÄ„ödvÐõè„^)•!5nc¤CªZ¿þ@ ¤¶4©U ˜6 R3’z,“ $åMΆ}ô¡¤âÍÑÍrêˆnø ­·vŠ/2"UºœâS´|Œ‚*ª‚â,Ïh¯[Íïy£±,¾Žöt‹öÔ[H‘§ )1:R[ŠTµcÝžöHmmRUûf}R 5#©k2é³V¦ RfÝ 0Ié ¯œòNñ>ºPÅË)¡êX>LÁIQEõq¶|JORð¢ªÜwvÃñ?Gž.înÎ=Ñú.Ñ>7I‰BJ{ vC£¼šŠT㉽x[µ±)µé‘ÆÝ R UŽ®3ÁY ¤@ ¤ü¸¤Ì>ú(Rf9¨Ò3&©X•.§xåQPQ%bÞɤ‰ÏåCb?$>.A£²´>ž~ˆÞ¹ ÓS~tBtЗ!Å ©)IUÿ­G@ ¤f$u}&}¿õR µ•I•nÅ L˜ý¤®èNÎ}ôåHqUz„VÏPpU÷;ûe>­6˃´ªíÒ_ÆöJד^8O#%VÆëÍv: ¤ŽµÇßÚÝÓlŸÓJ©¤îm³•H­_šn%HÔd¤:Û¹œ‘ɦ‘ÂY ¤æ;KíÉdÃI™¢¾opv©@UÅUyåTLJo›dªâ­tMêpvÁÁKßßý]BÑ—ôÚçÂoœ›½ssnÂóäN€Ô¬)©IR 5#©s3Ù¤âŠ.©GÕ¶è1)Re® ¤„*MŠÖNñ “8¬Ç»Û&ñŠJwÓËÁ¯ayé~Ú!Ý–¹öo†Ô;1¡ÇßoíƒÎ=™£ 5k@ ¤@jÒ€HÍHêöL¶©p€âø!›$iU/§8)­êþvä;œÒÍŠÊ$%êÔSç{g‡ÃU„%ÿé³Íâ*j„§#¬í0¹§¹I©ÅRœÔ®L@ ¤@ ¤ü€HÔ¤é'%(RTN R¢œªxO“2UÑ®•?4·QúÞî–™ªìì^-çe,#¼tɉϥ/©=Ñœ¬çéiëº7äIwнBJNôn4©»3))òR R“¦C*˜œU}ôãÃÉYMŠ«Ò õ€”VÅ·H'X·v7˼±»mm=TcNŠ/¢â¶>ÎJ«—u£¼xŒ“çéH ÌŒ'ÝA ©<©GÛ,GêÒL@ ¤@ ¤ü€HÍHêL6Ô5×\“ï£÷ Pˆrê–6½ª‚>ºGŠÂU™°ŽU×É9²»]ºgË‹CMOÏ ÷¿ô< jŸ{tò$ © I‰í‘ ©æÈ))š* R3’º2“íHJ÷Ñ©A唩j\]êxCºéëAµ}&ÙÈvqñDžˆ”ðt£ÚSž© }ÎG'nIoˆ®I‰™ÙÛöï‹ R R 5möíR 5©ÎI‹eý®Ú›‘g©ýÛ$õ,—U™¤´*MJD¨zº=LÁU™¶Laœ^<IäéñnÌ**è )îIŒNís^H Rã:èj±”8KíΤ@ ¤@ÊHHMšý¤.—¤D]—Sf+=è£kU|¹¼©êŽîErD]ÅUiXz¨öAµ¸Jk³éú‰KF¦'Ž)ðtwqüÑÎv˜OqÝ+¤ÂÑ AêäL@ ¤@ ¤ü€HÔ¤ÙwÕá×%úèyU¼œªt9eÂ:ÔZ=oª¢y ³¨ò ,­TY’ôŸ8²»4j¨'úA½ö¹YHiOC;èÜSÐAg¤êƒ‡HÝ HH”©I™Év!enŽöÑÍrÊS告[éb‹tëPµe&·Eª¼a 3–×qo=iC<ÂS!Å=iL™5RO8› ÷zŠ;è™BÊ™F))š0 R3’úR&›Ijx9å‘ÒåÔPU½å”Ø%HªVÏ÷ª*6?ÎMUq±ÕVNü>Î(SE‘'IôÎÍ5RzZ–ÚçOƒ ©`¥H•€HÍHê¼LÖ‘TgÖ^|¤@ ¤§âÿïþÕ‰'ž˜$Õ-§N ûèIUoê)§tE5BÕ^•c»é-³ºætåt¤š}ܹ¡öt¨ŠnŸóRÞ)Ó“Gj™BŠ“jŽ:ྜÉú‘¢3SÅÞÒA ¤@jp@ ¤@jÒt-u~‚ý¤bU©¸œQQéVº9?Û«JØâü¢¢˜¼HA‚š HÿéÀ‘Œ‚ö¹®¢tû<é©·:­M_]º0)Ún¤*J{{+Iµ)Zš”:ð6…”JÏY*_NY}tQNVÕÛJ'Xf7=†Õ«JØ2!hXaÕ¥¿@PEñBê~¯}lxÊRÇ·TH©³Ô=™¬/)·=R 5©Ë3))bÿ—Ó'¶Ø¡¸Ù*§x+]¨S´oëîœä©¢Vº(ªh‘¸†u„Ú>“7Ô¹*³®â öª^{—”W9íín{iz¢BŠâ ÚçÞöçIOÉBŠ{ ;èõ‘³}HíÐ;{‚HÍHê‘LÖ‘T)š4Õõ×_?ªœº9QN‘ª¸¨ŠÇ(,ÝPç°ô8íýÝ©Š$,/‚SezÒ_€ÇôthwçKžÞeñÞ´ì’íóá…HHÍFêêL@ ¤@*Kj‘˜Ó^¹ãú&½ª¬áY^NåU}Ðß1}„*+¬ðT™áÂʻɱ «ãŒLL¢}.*'ž`Tr#ÌI ©ÛÚ$H— HH”)š4©¢ª¯œ:Ç*§„ªÞ¢*P%FhMU–°¥ë*³§î…xlí²™©ººžø×àŒ(C=]6ä¢7£ ©xZÖòt_sØ©k3))òR R“¦:ãŒ3F•Sç8å”VåÍS,©Êƒõ„5W4Ôõ#Ó¶ÂI&¦Àÿ±bO«,¤ÎoÓGêÔL@ ¤@ ¤ü€HÔ¤YŠUyóÝrÊTeÂÒE•©JŒÐ U&,=XaÎSpUúðΫJGcâ ºÌQÂýpÞ¨¬ééMËí…™Ÿ–ízª"uS& R •%uV&›Fj©ÉHu¶sÙ–¤öìÙ#NT¹rê6VN™ªLXqQ•TeÂò†jƒa + f ³°‰;&-ÉódÖO—©eñ|yÔA÷<%§eq–Ò)š‘ÔK3))ò³ UT ,§n³Ê©@•†4ÔÍnzK—Vf+݃%bªJÀ"=â]îéþnè;ÒžDñdb W¤ê#¤@ ¤@jª€HÍHêÇ™l&©ÞVzXNeTiXZ•ÙPתLXW±¡Ú“Â-”Ì‘ ¯^ŽmLIG°O&=.Á{ç3R~û¼R R R¤@jFR§g²i¤n¿ýv­*QN™¤LUAQå ҚÖ¶E¤´ªOÖ@I“þ.’žè‡Ž»æ^µ’öùcÍ¿Ä R 5©_eR R ågAJ¨Òå”5<{¾SNõª:>ÜA33LAÑSºœzBí Ä+¨Ã,IÿF’ž¼ê–nF{JRNû¤)š‘Ô"o‰²‰—)šTȉXP“§ÚµkW!%Æ(t9Õí£kRº•.Té¢Ê¦¸×ZCÏU [•S—©­ÓE’¼ò^ÚÏÕå™iÈĤ'&2³&&ái%íóâ©>l@ ¤@jRÏÌdÓH-R 5©Îv._ÍdÓHíj"NTA9Õí£÷–SC꺨"UX¦*ŠÇK 3«+Œ¯lâ’t 5ÈSŒi*Of!圢®iþ%))š* R3’z~&›Fêî»ï.¤t+=,§LR+Seªôêy3[5N4 é$A|Æ“‰i¨§AíóûÚ€”HHM©I}#“ $¥UñVºSNÝé”SKªzT­£“\•°%TiX½ÂL^ 7&#É{LÓUjçË^O&¦ÀÓˆöyßÐDñT6 R 5©eR R 姺ôÒK¹ªt9¥IéVú|ª¬@ÕUΚ½ÈXº%nŬ–tJÒeÝëØˆhC¦^OÓ8OS´Ï¯oæn@ ¤@ ¤¦ HÔŒ¤~žÉ¦‘Z„©Ê÷ÑU9¥[éS©¢ã„« `ña –É+YW‚TÜ+˜„¤ST¦Ažr0]å0ÊKŠ1}…Å+¡’˜æ÷´§™»))š* R3’úC™l ©¡åT£êŠáª‚¢*V5–ÙVaKóêb i=½ž‚â)èšÀt³54± ©ÆS}Ø©ÿ˜ HH”)š4Õ™gžYT%N±VºIjZUÉ¢jD]5Ú–Ó*_F’.¡azT-‚÷0éjBO©?ž HH”)š4Ͱ\9Õm¥?æ—S£UqXIUfQ5–æ•¥ª§—^LüÓ§¬ÙXÓœžÎ½Z­êq ‚IDAT½³ËÍdÓH}éK_Jv(@ ¤¤nçg©WfR R ågA*.§üVúܪ® ‡)zaŪ^½¥•ªžz™,0½-±jBL±§˜Tè©>l@ ¤@jR?ʤ@ ¤@ÊOuÞyç%Ë©n+- ê¶)ióE•VåÁ2y™¶œVùPF· \þ¾<&³„ž–)¤noAHÔ\¤þr&=¤:›Îia¢€HmiRìE.z³µ³TPNy­ôPU0E›,ªLU½EUR•NÀK÷ÆýÒ©—Žˆ×27%™˜Ž·VÀõ“.¡&ñÄHÕ‡ )ø?™DL*RT±·[: R[™ÔAj LH­©ÎÓ¿-êË_þr²œê¶Òù²ùXÕ †)’ªzai^ºDÊMFqñôh7¼’\ÓlžvuIýõL@ ¤@*KªM©M÷ˆ”wƒHÔÆŸ¥Ø¿ª±_]xá…¢œªU—Ç™_U¦¨ŠêZ•€å%°Å…¤%iL#¯~º.\c:?=1ÁI…žjPõ1CÇÿïÉdH{bKˆjUtS|O R3’úW™¬)zk}S RëAŠÂ:=¤î¹çžL9¥T©-“¤ª¡ÃAQ5•ª$,“—6Ð`O¤É1ÅžM,ʨùHíØZóH\xçû)š‘ÔÈd+Aɤ@ ¤¦Lgâ°KªÍ—E9Õ»vª»eÒPUCê˨Ұâdxv|FL¯z×’?;DÕžîUg¦TT-okéL[<ó¤1 *¡½sòT0 R RS¤@jFRÿ7“M#µH[N‰Vº7FѨÚå¨Z~˜bBXÚÖË L&£ù0‰*Ó8w<³»³éÉ"1§5¹Zè€T7ÝtÓµ µ‚lR»·ýY ¤V”mIêŸg²i¤Î:ë,QNéµS–*5D;^Õ ¢êœÜÅs´­ …¥¿ ~üÑ’nö÷¼äÉÔ,¡žê£¤@ ¤æ!õ{3))òS½ô¥/-åÍÏz­ôPÕíÝ‹åL2L‘‡u³?UáÙZmââ)ÏH` <Æ$J¨ØS™©fžjPõR 5w¶+© HÔð€Ô6"õƒü ”S™Vzw’âÒîÆIs SUƒ`i[:˸ždñd2Ò˜´'¯„êÅ4º„âžJÑ}à R 5©?˜ HHeIý»L6Ô 'œPÊ)¯•î¨z §j’†z/¬^[Ia3ÄüF†JêŤ=‰j¦Œ§¶„"OõÑR R 5U@ ¤f$õG3Ù4R?þñK9¥[顪+-U“Sİ2¶<^ã´e¾”Ÿ¡’ô{›³Ó¹éI”P“cÒžÎ\¤>Z@ ¤@ ¤¦ HÔŒ¤þs&›FêôÓO/域ÕcJ•Ø4sòaŠÖh[yaÓÅû.1 0ÝéŒK˜ž¦Ì Dºq^<Õ ê¤@ ¤æ!õ§3))òSýêW¿*域õZé UËSxE•†eÚ2y†Rëý:a–aäaò<‰ÆyÓЪx*ÿðžw'õÃL6Ô" R“‘êì´-Iá,R8KM™ê™Ï|&©¢ùÙ •ÞªÚ­T9Õ.ª¸*¯¡À2mÕ©Ò¼2ÂÂTËŠ%u¨L—„ãCfc+“ç©[BíóôåEˆÔŸÏ¤@ ¤@ÊHÔŒ¤þW&›FêùÏþ[Þòj¥—ùY¾vÊQÅ7N:&¦¨†S˜EUÆ;úÎ÷×àâ¬êõ²¤$öC‰ŸXcÊ4Îͪ;(QqL£J¨â©>Z@ª%UY¤*“Te‘ªÒ¤*“Te‘ª,RUžT÷ܵﰮ¬c½²HÙç#“”óE Ræù´óýǤ*“Te‘ª,RUžTe‘ª,RH5)š‘Ô_ËdÓH½èE/úêW¿ZÊ©JµÒkU•ùܯºÁxîWÑs?6LQYÕùܯ²žþUêéßâ˜ÒOgæ1i<lé1$†}je=Ó#Rú;-éüPú)_en€TYóÊ*¡*kP¢2ŸòUÖS¾Ê*¡ªFÓ…ÖGKçÊ1§ ¼rHÔ|¤¶åY A¦Ï°£ë€ @AAAAAAÄ{-oîWõöùyi5¯N®ê§Yåo™ ÕŽöàXüºf>6ÚÿÏûHÕj½ý4ò7T[<½á7gz,:ç}¤Ùò(«üiÔï Ù²Ùÿ[šý÷Uµ_¼û¿gί¾ÿQ:?Æ*HÍü÷†L™ýÂ6‰Ôª~ö` µ>a¿¯õ'µ²¤/b¤Æ=Ð ; µE£WͰ·“þÂÔ’Zê¡@jM",­ýYjk©•>ÅD–MÕ½±‚l7’ÔœÒþ£‡,ŸJÜ\©Íx]j¥? ¿ R[:¼Ö™Ÿ:ç}¤m˜°šŸ†—£Ø AAAAAAAAAAAAAAAAAAA™&Ø4A¦ ¿ž‚ ˧‚(™4… “¤dÊà‰‚L´'dÊ ‰Ž ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚dòÿmÛ£øÚùIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/starpart3.png000066400000000000000000000502011477365367100224010ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þÐPLTEüg9ÿÇŠ%×7ÿݸ¼èMJÍ(ÿ˜*ùc6ÿóæ"ÿ®XÔ3¹GåIÊ$3ÿÕ§ö_ÿ Ñ/ÿëÕD¶ âEÿ¦G0Ç ó[UÿÍ–ÿ¼uÎ+Aÿˆ³ßAp-ÿãÄ©ÄðW\ÿž6•RÿùòÿÙ°>ÿ´d°m*Ü=¦ÿïÞYíS’Oþi~;ÿ–%j'ÿÑŸÙ9£VêOÿ¬SÿŒLûeÿçÍ{gÿÂÿ¢? Ö5ÿýûŒçKÿÉŽÿ¸mxøaÿ„ÿ‚ÿ€dÿ~ÿ|ÿzÿxÿß¼ÿvÿtÿrÓ1‰ÿš.äGuÿõê®aÿ°\šÐ-†ÿ׫áCr«ÿ’^—ÿíÙƒÿ¨KoÞ?¨[ÿ¾y”ÿŠ €ÿņl¥ÿ :ÀX‘ÿÛ´}ÿ¶hiÿñ⢽Žz7ÿÓ£f#ŸÿŽº‹HÿéÑË&w4ÿ¤Cc ÿÿÿœ ÿË’ÿºqˆE· ÿ†t1È"ô]­ÿáÀ`™ÿœ2 …Bÿ÷î´.Åÿ²`ñYS?±ÿ”!+ÂîUÿÏ›PÿoÿmÿkÿªO<ÿåÉ(Ú;ÿÀ}¿ëQMÿû÷3ñAN IDATxœí¿eõßo1¦ •¦š6_m4TJ C[RmRâ7Hª±”*-US«µ¥ßhQ4AŠ+1Æ„&Mɘ¨M,P±%_4jðGÓX"ýzîœ;çžçœçyöÙ½3{÷îý¼y±Ù;;;³;{Þ»{Ξ癉 ˜¢ }ú‹®¡wW; ÷zQ_0÷5˜åÁ­U°VÃÁƒÕÁæNÓë‡÷rÛWËF¨d›áƒµÛoöR5l’sk›¤ª/ã%òPy; .ÜUsªfýúõÇWÇê©§Ž9²dÉ’E‹íÛ·oÁ$Õ‚)öÕ,ª9pà@u`’E rkÕ,9ÐÀ·Òv6mÚ´víÚc ú³Z»öäÉ“tïÂlßÃË—(ôòEŽª^yÙ²e+W®¤'JOš_ý:ª—÷ _>uüN±k Qê•¥ ”š#Jõø»£½êжAYÖ˜å EJ”jî(eT˜¹R´\Çù ¬”ü©•2>‰Rr¬”Xà”Ò®HÈÛvAÍ[ª6m"uX©5l•QJöR…^¥4bM/åªz#ô´èÉÑ»=]:|ÜŒOòúê×vú8ÛÃ&Jý¿ ”‚RP*³×hTÇ|‰ß®Ò§R榘RöUN?¢¼R%”²ßú¥Ž'”ZЧRÞÒ¦„RkJé}•(¥w§Y”PꬄRgõ­Ô_/a8‘>4z+UFôÈ—+åo-Qª×C®î íW©õ5=• )Ú™Ä'VJ|«ÖÖˆUQ±4>Çò» õ¾M:å­ê dZ¿ªXs¨hK¢Ôÿ(JA)(5”š*ð ßW(¥ÆR©Jý?\l»§; -QKúLz‚ͬTþTé”&¯”øDQU*ŒqŸß¤|Ò2™DʧSlU*©Ò˜ýJÚ$W¶#) )Åé””ÒUÑWXŽ'õŽ3Y÷h¢ë_•ЙR“P JA©v{êJA©±RêÏ—ÐR•þg˜Ô}ÅÁï|ÒÁ{VcLÏmg¬Jm<ñЦ[¿J™DÊ(¥ Ñ ™|*£Üø”QJ2*“T¥¬2âʾ¥ ”ê¥Ô$#¡Ôl¥ T‡Jý­Æ\©ŒU© -°Êo#¿á”R™Ë}›ÖÍ]^©¨U§‹ýÓÑb)VŠLÜFUŠe3=}ÒJŸt5]gT1·§wš‘Io‡•Òé”·J-yÙv4Œ–RÃlCŸ€RPªS¥þM û°?¡”ê_©ú]¿D©——ÐmÌýke|ÈRƧ]…V•h©·ÝT^©ûT&ä­’-¤”Ò[Ð>éDÊ( ¤Ç'yŸ„D}Š*¥‡OétÊ+åÅÍ+åëèÒC¡­Ò2ÑÁ uøÙUa·o”‚RP Jµ¶C(¥Pª*Sê?—0þ¹TÔª„RѬ%³½¼LƪԦ2ï©”·*šK™ò¹WʨL÷9i^Й‡÷I÷ÌS#¨ÖºáSy¥2& ^).¥‹U|¥ ÔœQªŠ(%^L+UE•ªX)^ßJ)õJ˜¹”·ÊÄ]f6‘»P]Ë•Š)Ú·U=•º/]G*•ò©@©h¥ƒÚûäBrE4»*WªÙ©UjÌ—QM+EÂP£¦8œ¬“óÛJUËT-á’ù¦É™œj™ªÉÇöd(¥æ±R]\²¤šRjròš•Õñã¬ÔÔçS¨Ô$ÇJ”ú«%Ì—/~PjÎ+UG¾K¤*mÔÔ?~U­TÅŸR9¥¦¿‘Î¥†íÔôì‘%J)ŸNŬÒ÷(QÊ 7ÛÓÑV”2=³ U‡¹¢>¥­ÒJ™üI|L)^8ЧÔôl«bš.OÔT“ òæÈ‘©ÏªI·ê–£Š·VM•ÌŤ¥ŽCSÐUQê¿•Ðñ¿¡N5;¥æƒRÍçSóÙ¥>¤B¥–TGª#­*õÏKÏNt(5_”ªÄ«ˆR䔚)Ó»fb5­TyFe¶ä•:å6ë5íékT©…anF©]ª‚nš&”6̦|:Ùàk眀x±t²"éÔ&Õøñ)¯”|Nñ7ÃfƒýÇL.]»v2-ZºtrïÕ mÒ¡Å´JA©±V*È¥rJMúTµªÔŸ-aå‰!j ¥Æ_©ÒO)¶©7¥†=E0£¹Rë§(·j¥Ê­òÑß]?ÑžJq"å[e=¡L‹Âމ’*Z…ÖË—ÖAm¬Ò–ìsm¹âŠN㦼á"zUzM=$¦U5¥NµxñDõiREÔ™â¢Ô×JÎO½C­øA©qUj“þaJ>§š…ÕÉ@©àSsZ©&×}•(õ7J€RPjî(å?¥ô­©VCÞ©èÂ_ææªRÃÿâ7ÉÁƒ=­J(UnUT)mÀ)‡Ù w+£½QŠ×<C6"JI"•©'ó2E}22‰4]¢6VéAóŸ$‹>ýHL-œ¼8óÌ3ï©9³Á»s¦'˜Çï3%ŒmyJA©6”ªµj¢k$”šbëÄ”‚R*õK·ß¥¢敺OÕ¨cJE%¸/FT)ï“lpaŒÌ–g¢T&‘ÚžïFçMõ-®€mƒÚw›ú„žh«Ö†Ó¥NÆði;äÓ#2é´£—ü)— ´®(õKÚ‰E‡”‚Rc«ÔlœdJA©qVjV>¨¬R«$bëÀãÁÔýZõ)¯”ϨRVy¥v…ó-•(e)%‰R¡OѪ¹ êTîr¨Ä*#–ÖËïÔ”íÅf6É'FâÅå!§9î á…—_~âÄ Qêï”ÐiØÿƒ JA©±VjøRA)(Õ¡R¿*¡û"z×;÷ 3#VB©~­òZ”+å3$cUt³=•Ò>írgxÑ>í‹Í:®²'/S*¢Å¤h3Bc•NªJð‹LZ#¥Å$'ˆaþ^tëêÕO?ý´(õWJè>â‡û»”‚R£¥T'ÃÚ‡Ù=¥ TwJý—¬R(0Ĺ'RJi«ÒJi«L'…(£ÔÌ­ŠnV¯ã•2On—š÷›'ÔÞ˜j¹+˜{‡üÈ'jÎ}+w­j«|R•ê½Õ¥ú¨Iøä•ÒwY=)ÔòåËg¢Tw?üI*(¥:Têý% I©a}ûƒRPªC¥žW‚Qj¨3„u@‘R&ðÒJõk•%eUJ²”Uƒ)%‰”øäûQÍÂF%-dAG´.TçËÒ«Ä-ýg*Ë7º–H J¦I–/â‰'D©†¸JÑö†=¼©u ”êP©A>¥‚ZˆðaÏ ¥ T‡Jý»ºUjúcoHRå”:K§8Vk{fÑ*³ý”Uý*%§ùÛ;A“©–Kjl¼‘ŽqS®öa»ºcVë¥•ŠŠ’ò#¥Î™M£«¿)ªÔ厴L“6ÕŒ’Rjî (¥æ¼Rÿ°„ns)(¥ÆI©ÿ[Bä§Þƒô•Z8•Ni¥¼[åVír¤2Öf”JåRg¹Ù ô;m–)ñIº ¢ý¨a[B^#9…%gŒOÐuZ"nñ1jòÖLÈßã0Ë£"žæºe½IF&ýà[Qªí©"¦?ö ”šóJýÛ:Ÿ!i¸?tA)(5îJ ;_^©û¦ëèQ¥´X§F²è )Ÿüö£J-LäR“H9rdÑ¢EºâX8(ÉwÀÖ6™ǘäÃÓÄãy!,­@kFóÚ¦ÞÂÓ >!ËrÎ<`cRÏ^0ßkJ7¥úú”‚RPª—RçéO©ÿZÂÐfHÅ\ JA)(Õk¯…Je(tŒ§”JYÕ3£Š*evQ’N•(Å+Ó6—-[Æ>uô°#ÓÑdO&˹'V)×HHêP|¸æœsΡKmÕiáÈ$ZBË3.²[Ñ®¿$ªŽGV3ù“Þu³JA)(Õ™Rÿ¸(¥ ÔQÊÒՎ½út–­£û0ï+Òbù›2J­¬ÑVÍ\).Ÿ8p`Á‚kÃÙ#ýp§XwD¾!ïÓÃ!çÔ«LDs,ËÊÄþ¾£vˤYR¶÷7H´ÄêçbTæ,>5žéñRÿ¡„yTñƒRPj†JýÍ ”‚RP*Í •Ê[•I§$ä£ËSJ­Tð.Ê•b«´^º|ÎM'OžLÉ””T'P…2påg‰JQ„Ì8½†®ÓB¶Jlà;Êš ¯U ]1zéDǰ¼F[er,yÌч­õU<­fHúŸ%@)(¥ T(¥:TêS%Ì¥¢yG¨”O§$Ø”Ò3ÈÆe ¢ÔS ¼#“N™üÌ(åÙÕ”Ï)‘âò¹™nHò'Ý kFg»MM`šØÔuhŠPöã¹òƒµX•pÖ&±L´þ†¾Î[`ÃÎQh‰uʵ: ?àT¥Uj¶&Jý…æ°RSG‚=”‚RPj@‘±XP JA©‰êï[©&nw¹:ºÎrL:Õ—UÚ'QŠ­2é”öi—ªÓG}ò‰”Ïœ¢2™VWr¾¼.Ek¥¢º\õ pzdü ë$¯”ØY¦«´æ3Ï¥tùœ}"X ¶Jêâb’$[|}:¿fóæÍwß}÷ºuëè’®óB1ŒÝ’ ½(e¼1¢d ð†Z¨ê,ˆ_,¡û¹'ú¿Kf¡îÀ-/O@)(5>Jõ?çRlõˆFP J ]©¿\ÂPr©¾¤ª‚ïrÍAy/P*,OœUÏu(êS¨Ô)×КW*c•÷ÉlG§SË|)½\©SáàøcÇŽI½Qø“Z)Ý!-Ú?âöÛog¥¬Ùºu+]§…$_Òš¼MVjyÓò ÅÊ$OÚ$ÓÌOÙŽH¥ú&Pª@©žŸOP J•*uÚä4t¼FI©ÊüÛs}õ®0ð?(¥:Rêß—0ZJ©•/O ¤ÔBWG_Rb•Yèe2Vi¥(ò¥tOT&ÞõÊæÔ7 ,àDJû”*–‹OaßA4Ðt»¦$OzŒ;·Ê²’‘¤+¥3'A:&ä^¢É$JÑ^N—œŸq:E»^®º$|O‡IžÌ4)c-“Ìâ9‚JõùÔ¾‹ù7Ö*ÜJA©î”zs *5è|cÙî‰ä S·C)(ÕRÿ½„á|ñ›ùTÍ"·ÑÞJ%|òéTT©ŒUQŸ2™™,¥Ø*I§J¬Ú¥jÿº‚¾bÅ “HézyJ)UR^CBõ‰°KÂŒq×>qïöZâKæÚ§£ ¬”TÐɧ-5t…þdÉZV㌊öKI¹Ë$OQô¹G¬ûFI©¡¥ T‡J}¢(¥ ÔQŠû†9{óDO¥Ò>y¥2”X•òÉlÍ(%V'JZep¦‚îg5×ÄKT>í¬Ò2=¡¸ëÙŒtuœ; È'Êx¤ NnqÍ[|’ñO’B±Rì9tÍ5×\ѰsçNúsïÞ½t¹³ao yF§h±LFeò'¯‘ÈÄÄ”ús%tYžènÓé}B)(ÕRï(a~}ñƒRP JõGN©ûý(ÕW:eÊçz#œ*ÉÖRJåÓ)á”Êü莬”¥8‘ºe|’Q»å­RmÆ¢ÔçKè\©^-D-ïJA©î”ú£ ”‚RsH©©‘¹³ZžHùt_¤uÂ+•²ª_¥D&ÖE‹%JQ&dÒ©ãuÿlÊ*Ùo„îHJÉ)¯yz$Qê„ëÕA¥} ’Pz8”(¥Ç9™ ‰•âŽW.‡s\: è’nåžηX;†D¡,êÎ;ï¼å–[.½ôR²Š2ªGk.¸à²J×¹šN[##i×ôèáÉ*#ùe@Ž„¤Vi¥þS Ï=11Ôß|¡”w¥† ”‚R*õ÷J¥RVEÓ(—£«|:•÷)ª”Œ‹Ò Y)¶Jn]Ù”Ò5þqŠRtw“N¥|UYXS'{Ìù¨u{¬ñIš^eJKî–W8éሖH¬tC%ì ¯F‘I7ÝtÓC=ôøãSFu}©FyoJZ*ØTDEMFPÑOW TÝ J}¹„!L:6ûm³P JRÃþ„RPj¼•ú×ÊÈ~‰”?iõ©XýxH4’…Q¥–…è…¢”·êxú<<¢””á%:vì¥SZ©§UãëòXDS'?G¶:…VJÎ)‡S¤K'Cl© BЕ5kÖÐò={ö\}õÕd yCY™D>Ýpà tI-ÙØ@ëÜ=!)Ìzž•ŠfQ=•š&˜Çïõ%Œ›Råå (¥ ”ªµj¢k”…/~P Jµ¥Ô÷KÆïRCd@¥œT&Ê[•ñ)¥Ô‘f>$ã aJéÞª¼Rtw]G?tè—ÒJEOù§º#t¶dÐ}²fZ#™Óˆ‘î, %I¤”HsswCÐÒˆ\¹¥æñºÎé_²^´|ÇŽl•WŠO›#Cçý{G”Õa'qÈ()5 å¡”jK©”0þ¿KA)(Õ–R,aü•ŠZµÐⲩ¾›g×+òJ‰Á>±R:£Z¦:)Ö».ZúóxÓ3Ëh¥xž$£ÔyŽ'ì¬æ©Î×®%tÕ\Ú%.“ïÝ»—Ó&ΖÈRjG é%Eqº~饗’+7Ô@t–dÜ@A ¯»îº+¯¼r÷îÝt…þ¤[éŽÒ<ËÝ|ÂΨèáÉÙ¶ý9®Å$ó­ËÕìïÍ(¥ T7J}¨„ÎÊWC-Q@)(5îJÍþàŽ2¥¢é”÷ó>FÏDÊû$Jå­*TŠO­•¢Èàî Ý+a¦û%êSÙøé*ͼ•æôÔ\57)#CšX)ö‰]‘ëÒ(aJæäÙFëЭWÖ\×@kÒ ’“Ñö¥‡‚Ï™ÃVéä§N?O(ÛtDËí«W’R#;JA©”ú§%@)(¥J•úp ãÿů ‚^RG×–ä­2+§©%!,Ù ­’jú²Ä´I¬”®Ç‹RÜ9ë•uô0¨pJs=Þ}sƒn‹¸^¾MÁJI3,gQ Ë)âáï\,'™Èºä?oª¡ëì)ÈÓ#=úè£l­Ìò±v$O¡$ã¨d¶$öžÏÀ#åVJWÖW÷f¤”š˜ýò”‚Rm)õÏJè<܇91&”‚Ró@©áb•Šú”Pj¡.öPh«üÊQ¥–8Ø'¦Ü*“K ‡LqÛ¬(E9+%㞸?V&´TUqŸ$ÉÐöà âWÍùD…œH±RœBñ„F2›ýIáÏÒ5ì —Õ¹½‚E¡ÕèŽ2ñ9ÛÉ[™“x5–‰®‚äÝ…ÍËØ)’‰ß/D)SGOdQ«ë¢ÔGJ€RP J•*õ± ”‚RsE©JÑÝ^Ì>gàSO¥R=½f¡OZ©B«¤gÖTè92¹™¢@¢ ’Â2ÅiwèXíÏfÄVp»Ǿ”ÏeP—·M- âÑQ¬çLœ<éñô¼/~ <•&mŠÜb“d®t®ÓsAîÅS¤óɱI&yéyFİ{B+õ/JÊÄY*¢C)(5vJUæßÎRP Jµ»Ã”FeJ-T§ÄÑC ¼(«Ìj)¥t¯„(µ¯Æ(µêx“À­¬Kù:ºœ[+EáÄJ‘L”+Q”JÐn³H¶$JÚ$JÑr)¢ëò9Á ñ†y¾s‚Û+DMI¼ØN˜xÚKi… {‘ôxue},–œ‘¯ðìJ<|ŠVàó¢ÿr J­gÄÔ„nIOò/s !Ëú?(¥ºSê×%ŒÛœèP J¹RÃd“J”*I§¼L=•Ò‰”(ÅV¥¼UÇÞ٧šY6e’$­………Å'¤D£Ä¿I‘i ì§5º“B;'í«&E¢Ù{)£Þ¹÷AŠßæÌÛü¾ w‘é6y¿|bRJŠèt/=^jµšIÏ„XÌã÷›Æíw©A?œ ”Š* A„RP JµªÔoK˜J•ÉÔ®R)Ÿ2JíSøtÊgT²ñ#j:¥§šÓ!.X°@+E‘AQDEÑE±J±'ÝlS'5â„H³®žyH:g½äöúdצ·BÌãud •À=¹2º¬¦Ó ÎØ}>F‹Vã*ÊCå ÒX)¶J{©‹è¢ŸøÆ(Îôö ”‚RP* ”‚R*õgJ7¥HŠL2V¥¢V¥|zÊá)£”N¤ŒUKBLR¥ÿä+£·NP¤qïb’3ÔpSk]¾Ö•ožiRÀéATÚ3É«³j/ºúOݹ«{]õ,G2›§XÅbÑʲ)3oJ¼4ÓÁs.¥Ïy(é”b ”‚R­¥ T‡JýýÆP©cÚf£Vú$åí”OºU–MZP“J§´XzSô§(u¤>%Ž(Å'á¬)Šsé8åÑLÒwÚ(ÅY”$%—4è¡ów‡ˆvz0½6I¼ÑSlr–#ÙÍÌëºåA)"œÆýœz„ÿô}õ¬Hz˜”™Ýø¤Ó©XýE%@)(¥ T(¥:T꟔ÐýœèÃÕK.´áS4ZŸ&Ó(µLaÊçQ¥$…¥´Uí–l®K»'´RœHQhQ„_sÍ5äÓ£>Ê盾ùæ›/¨a±vîܹeËáæ<Ҝֈä„–is É«è Ë$ê\åÐçTôË£>i¥LR%gê–ÍÊ)öÉ ‚?AêÐáy@K§FI©áŸ«JA©î”úK%@)(¥J•úa c¨T-N/¥ú²ª/Ÿ¼RÆ'A·ÐF‘ûr:Å{\ÒÌŽ©•¢£€ßºu+eK2‘ø£ ¦ÔÌ-$éçêÉ2 òƒû¤o‚µÓÅu½Üt­JŒ³C§g1>-!gñÑó¼‹[rw™ÝÌĉi´XÁVi±Ôé¯G@©áŸQJA©î”zu ãvFy(¥ÆZ©áÏãw*ÑRG·Hðu.œK·…ÔÝM %¢èäÉ$=š¼O¦ö¼½D—ÞÙ$)E²ˆO‡jÄ*É«jµFI©¡¥ T‡Jý¯ ”‚R¥J½©„1TJ(t«À§T m&‘ÊÎO¢³iÓ&sE ê¾#¯©‹î|ÓÚµkI)Š Z ø;wò쑃 O&YÛ¤Ux®9 ¶Î™H ž ‰çCâŒîí ç¦"ª ¤ÏЭk“Ä'É¢ÎK`¶ »eÉ‘I0yUÍH)5¹”‚R)õËÆíw)(¥ T«;œ¤™0¼ ·úU*êST£h"µ)FJ,¹#­sòäI^SßD I)ŠXŠ®“CW×ð©g8‹¢›Ø§Íõ¹c6läIþ’ÁLy³uëV™Š’…Ô>éDÊ+¥‹è"“qB¿£õ…±ŠËçÜ4q(†¶jq0ßß.aܔ☇RPª%¥j­šèúC ãÖ=¥ Ôx+5ôî‰ãÍTá§Ò´ª”™ÉŽò2ù|HÌ0°(Æ*ßjÁkRæD—z5ZBñ³nÝ:>ë4iħ™æ³K“O<\žì äˆŒàî57—Éåúæf*#é¡qQºcÂ÷ÉšJ¹V*cOм@‡œç¦DÒݲù\ª¹U”zw ãVñƒRPj¬•~.¥ ”ju‡ç3¶*z'£ÔJEʧB¥¢‰ÔÉ‹¥Ñ2±OÇŽ£K½Å 6yCÉÉtÓM7ÑåwÞùøãS"Å¥ï½õ¸x¶ƒÓ¢Ã‡¥û•’ /õùrô”™™ÑQ©–X®ÍÓåþf’rÆwIdÈKffõyox.Ì¥še¢Ô K€RP J•*õ¾Æ­â¥ ÔX+5üÁZ©A­*ñÉgQåJùZ¸ød4Z«0y_—¢4Ä” IDAT[5Èjt…‚ÿúë¯'‡n¸áJ¡.­!«.¸à‚-ÍäçÜXA©%Uôg=7gN|…ç8÷çÃ1b±UzŒ”$L§‡C᥸¾_fy8}‘au .¿Y¸)µ²™µ²Äª´X¥L.õ”"Ó:á«æ"–î€ð>‰+l•6†o]Ñ`V£%Éd )E>=ôÐC”Qmܸ‘ÄâDŠO{H—”BÑ>N}Êiüĉ«s·š}›+]Ïn.'Ÿ‘þÝ0+ìWs‰4'z!NèQïzÎ$Ñk¹;ǵF§S)œR¯,aÜr)(¥ÆZ©æ¡ c'¼'(¥ºSê³%Œ¿RýgTÑ{*ågEÊäR¾"¯”6ÆäOO>ùäÒ¥Ké’בċBbž’¤ûï¿ÿ¦›nâÂ9)E¹-!¥¸ëuÇŽ»wï¦å¤ÝªU«®»îº«¯¦ýù«Ù'öÌ4J¤‚.ÒøÖñ,¯[Y1åh·D/Ý+5RÎ|˜±j„•žSP JA©vw¥ TwJ½±„1TŠ­*TÊÙ•º5¥ÔJ71R>ò>i¥Ö:t¶¤s&Q•ÒV±‘-”‘7\D'ÈRçÎ;ïä!òtIª]xá…Ÿþô§ñ‹_¼ìe/{Á ^ð£ýèÚkÉ« .¸€Ò*“Hñ%›d¼ñDGºëDGбÏÁ®/==õÃòÙ˜¶J‹¥ÿ"Îy }tŒ»%ÚÛ³3B‚ݨÃ×ïQh«Jœ3É–WÊœG€RP JuªÔïKèP©JÑÝ^Ì>¡”êN©w–0žŸRƒ¦S3´ê)7!zO¥ô`÷µa¯„ø¤&I›4´„{>é’þä;RHP6´fÍ’‰’#Ý6KìÞ½û‘Gùæ7¿ùú׿þë_ÿúÇ>ö±|ä#øÃè]ö¢‹(¡Zµj¥S¢WÍ7lØ@>É–º ž—ƨ£«Ýé&Ë1°Lî45Á­/™N×üf½X‹í@ùy©Ô$P Jµ¦T05æóK7¥ð)¥ºû” ¥†ù«ímY}èÂæÙ|Ù¼—UfàT¦yv¥L™\”Òi“FÆûðMt/ 2‚¼øö·¿Ímä·QP®ôóŸÿük_ûÚ;ÞñŽ÷¼ç=”H]tÑE¿ýíoøÃÞvÛm?ýé+^ñŠ/}éK´:¥S\A¿ä’Kž{î¹ýî|ÔO„“åÑ•ìÔM™ Iç=Ú-Akq¦CK–¹£k Ð¹ÔH(UM u (¥:Tê½% e:—!vO@)(ÕR/.a8“Ž ¯ˆ.J™t**ÓÌ”ZŸm£È ™òJ¥Æ?™DêP m•t{òŸ¤Ô£>J}ô£ݾ}û•W^IzQ¢ôýïÿ׿þ5}GyÛÛÞFz}÷»ß¥?¿óïüêW¿zÑ‹^ô¾÷ýô§?=û쳯½öZº÷¶mÛ¸v~úé§“LF#'õì\ð…íÔ:)¥î‰Õ¼µ7Þ Ý¡-4©Ìɾ[A)(¥ºRêã%Œí?(¥ÆR©Ù(ODÓ©ŒR}ªÕ3Ê(•ê›ÐJ™ ŸH¹oûÓa é_Y·nOŠyï½÷~ï{ß»£æÍo~óÇ>ö1J—È­—¾ô¥/ùË)iºþúëyäJ¤Èª×¼æøÀïÿûŸýìg”w>|˜”Ú°aƒ j7®y9Œ"¦Â}y‚¨L)¥LÙ;j†±0Z/ç•M{ÊŠ¢ÔËJÃ":”‚R)õ¯K·Ÿz¡”‚Rm(•J§b>•‹ÕW:%Je*è&‘zRÒ>¥Rñ m#xüüã·¼å-/~ñ‹?ô¡½ð…/¤/ütýOj>ñ‰O\xá…;vì }Ȱ/ù˯yÍûßÿþ·¿ýíÏ>û,e_>øàÑ£GŸ{î9RŠgšdN„m)R…mYrOØæÑÈÜ÷DÚ$>™þ/VêIRÙ†ÑR*žKU–A7=µ©éeP Ju§ÔëJ˜Š_JUÓÛ†RPj¾(•ú]ª×ßE›ŽéZQ÷L§²Jõ+ªT>Š*¥û&t"%/ýÒC ¢” ³CMíœnå…”ïP’´}ûö/|á gŸ}ö«_ýêW½êU_ýêWûÛß~æ3Ÿ¡w2º‰V¸ì²Ë(Ùºùæ›É ç=ïyôG_üâI©ï|ç;tË–-[.¹ä’«®ºŠ+èO‡Ã›tàkÎT͇&„õS¹'A4yÊÈÄäÓÑTF*.®hf›ªç0>£„9«Ôô' ¾3”‚R*õæºR“_u.¥ ÔX+Õi÷Ä”RÁö+ccUKJ­Ñ³y6ª”ñ‰DJ^îC RqHʽèVZB1¿nÝ:ʓȘ_þò—·ÝvÛ[ßúVÊ¢>õ©O}ðƒüæ7¿IÊÜu×]=ô%U·Þz+÷YüâozÓ›^ò’—üà? Û·nÝʃãI)S>?Mu4˜ð_f'>-4o‹Uy›·Ö3s:Ôü`à–ìÔ+eÄò,uSM)¥^ZBç¿þŠÉbEåo¯Â ^¥ Ô˜+5‘‡jä.¡”ŠR?(a6•JTЃžæàd T°ŠX¬âØnɪ¼Où:ºéž™ôt˜R>—K‰e”2•ç3Uš”Ú¿ÿW\AIÒ…^øûßÿžÒ)’镯|%}çï{ß»qãFº•Ò)RêÒK/]µjÕÛÞö¶‹.¢[ÞøÆ7RtìÞ½›œä‘RçwÞÓá)k.o&2,V5}íÓŠòÚ-“9e$ÐiôŸ I™}HÕÑ›\Š^$ ÆW•ù¶Yʈï)¢ý3ý¡”9¥†9ytaÿ WßJA)(ÿüòà§R¥(t¹cA‹­¦ÏL©ã!+™ Ó1!µsÝ7¡ãÊäF)öÆt/œö¦RüoÞ¼yÏž=<òÈgœA&½ûÝï~ýë_ÿ›ßü†”¡,ꊚ k®½öÚÏ}îs/xÁÇ?þñ—½ìe´:ÉvôèÑÓO?]Z'ŒRÞª”RÝѹô³?V¸3Òø]hoôî¢b¥<ã?cJý´ŸÈ̾R1sJ•j€RPjÆJÙ~¹ÑWj"^žˆöEàS JÍþ§ÔE%˜è¬rñÚ6Éï˜Róë?—âbµœyÐèe*ëÙÔ*¥TF¦L÷„VJ§Pæå^K(ÇÐJ]xÎ )þ) ºãŽ;^úÒ—R.õüç?ÿ[ßúÖ'?ùÉ?üáï|ç;É*²fëÖ­×]w7Ò¾å-o9ûlZëu¯{‰µeË– 6p"%J™áP¾CÖ{`ò‘W¼â?ùÉOž}–n¡4û+_ùÊáÇ)‘âññËÒºR­Føô¿P JA©"|ú_(¥æ¼R/(¡ãHuÀ†·¶ûâJ±:r}SƒzMé/Z…l QÖ»™43>™ÌÉ›´6œúHÂÿˆ+\Få{%´Ỉ𬂒B±L”=üð×\r òøã_}õÕ7nܱcÇÞð†3jwžÿüç¿èE/"Ÿ(‹â"ú·¾EqAÉÕÞ½{¯ºê*î–å1ñZã¿N˜´úéŸô R*#“>~^¦ŒRF T¦n)¥²Ö˜_s[Ù”‚RÝ)õ­:ÿ>–©èõì…`oP Ju§ÔÙ% ±IÖÇðO;›dW¢‰”ΨÌ`¥æµ¦[ÈRDwWD©|‹o[›$rè‘àô§„¢)‹U¢TyÉœ}b™(Ú¿ÿé§Ÿ~ÅWÜZsÿý÷ßxã<_æG?úÑw½ë]×ÖÐõ¯|å+dÕÏ~ö½ï}VY·nÝ›6F{cŸ5gX”ˆ31{lzV¡“ÇlR²VLòœ ç•}J ¡]þDÑ—ˆ!:—‚RP JµªÔ#%tžKe~Ëí"—‚RPj¼•Ê[Ó~?a%¯™WJ7P$*Ûb)Â5õŒO’<éMJl˜\C´3´¦'ÁŒwʤÒ&±L„ÈD<÷ÜsÏ<óÌÖ­[ïºë.rkÍš5”TQvµ{÷î{k>]Cz}ã߸òÊ={öìܹ“îÁ‰íYü7Þ„oJS‡¾yËò/ŒÉmõ{I§z&@'Úªž.¦6Ò J½¢„¡ý.5 ”êP©Ÿ”¥ ”¥zý=øý‹—jžõ]¬êÛ>ÝH‰y³²cÏ>Iá\·ÄêͬÈ6ÀšÆË—½©$¢Èr6檫®Ú°a?IÃ+ëêªöé’K.Ù¼yóáÇo¾ùæÇü²Ë.£ä‰R(ÒˆR'Ê«H©;î¸ãºë®Û³‡¬£é®´[H=ÙŒ"Êà”R’·ú…>·ÕoF+\=Ÿéý¦DÏ“y.#§T*—‚RPj.*õ†f§â¥ ”j•VN,ݰ£ŒR±Lþ 뤪D& ÑÞ­”Kò$®…S$³”Q`ó%˱¡á¹ºÂ®Ü~ûídÁ¶mÛè:-‘[I¦óÏ?ÿâ‹/¦äèþûï¿á†H¦U«V‘O”6Qõ…/|aûöíßþö·É³[n¹eÇŽkÖPÒu÷Ýws×™ÍdëONÏ””IÞÍø ki¢ïlæ•X–Ò}=ã“äd)«Ìr¹žy"5¢ÔÏJ7¥&RPª5¥‚yüÞRÂlvOt>¥ T‡ŸR³­TŸB=÷y,ü>j•ô9¨×R´Ð¯o€ÅÒ&ù4ìXØ(!˜qí&‘2ÈDGœ]‘XÕd)BZln ëG¥…œ!ñ­ëÖ­#ŸöîÝKyÐ]wÝuë­·^pÁ”6=úè£dÒÆÉò溆ݻwÓå•W^yÓM7‘FW_}õõ×_¿gϺ˖-äÙHY=z\Ü-Ët}pSø#î¾A¿úÊw=D-Ñ{×JE½7w÷«¹'$JýI ãö)¥ ”j(¥:TêG%Œ¡RrèK¬ •Ò/¥qK’‚M¡>:äæ7ŠštySV×IgNð”9QzDz­¡+¬%A[¶l¹æškÈ*’ƒeºôÒK7ÖPªD×ﬡ+ü'-ßSCò‘…”rÝ~;¹ºÿ~Hq1ûXºûÕ4D웚 É’-–?Ɔ¼RÚ*#JT©¼Oõc¥>W”‚RP J¥RP JµJ½£ÅZâr)]¿Õ¿àË–Nª. £Qj#‘éòØäåì\1ͺŸB:a9Á"·Ö5ÜÝ@¶±X”T‘"7Þxãý5gÒrÁü©§´ÔãÝ¥VàfØóÏ?ŸÅ¢ÔŠLz°fïÞ½×Ô°U IC&=ZCžÑ%™DI)E7QîEÒFêú9íËç~˜TT©}!’®.iÎCµ'c•KT8é(ñ)*VfS ¥ÞV¬~JµßU¥ Ô¼Vª}© ”êP©¯”0ë¹T»RU2Fé3¥£ä[*i2™ú·ÌiäW8ÓÍXiò¤h†ÄÒ0fÔ»¬ tóÄpíœ[*tFE‰Ô¶mÛ(b±xL<Ã5rJ˜nnàŒŠ|¢[i}º/·Üîßσãå¨éÆU¯”1Iû$Jy«J±Ä-m†×ŬSn•ßΜVª]§ ”êP©w•0ÛJU‰Ó¹ º9(¥ºSê%Ì®RLí AÔJ齫õ5ùÊ÷=j^¢Í$FÑ¡N—»¹É(~<¹¢ÇÁkx™ßHFJ=SÃJ_³Y¡“*JŒvîÜIé´ ýIVÑ%××I,ºNòq/mœvW—Ï%‹Zš˜×Ü(e|Ò‰”9EV-jÒ…qKÇy,ö§oJYRâœkî(5ý饠”M ”êP©kKO¥|q['DÆ­fMY1*ŠžÆRçIf2r“-=¡f6:'dÿ©U“[õym•ˆe2*ñ‰ëèdWÓwÖ\Q#nñ4™t+Ý…îKäS]¯^}O=%’Èd”’üƒãm_Ø!k”bŸdбäH/ôI%¸Iç3uJ„ƒR ”êP©{K€RP J•*õÑÆY©«X¬æª(•jv0mQ{X }]:^E ­‹$Lt¹_!˵Rl•”ÒÅ'.Ÿ?øàƒ[¤‡B¬b‡v6ÐBZ‡îB"Ò¦Ôé0Hí\Jôx©”O‚I¤ô9£ÞD—›3‹{·¢˜”«„¬R´½ù­Ô$P Jµ¦T0ß÷J7¥ð)¥ºû”š—J=™ž<¥”Â(•:íŒÑH_8Nž)Ó¥x£ÅÒtã“dQ:‘â¾ JŒ×pRÅH:űp­C.ÒFxJõ§§Îs½¸i•Õ&~Z¿>?–eá•Sç—âº!e/ÉØ–J¤êôL”út P JA©R¥~\”‚RP J¥É)í¤P2™ º©‘?‘ey3¶Éœ²†“*o•ÌxÄqKô’J|2Eôhó,O›Äb±R<|Š¢KZrq­Æ££h ´e9Ïu=HŠŽšN¤D©¨O>ºMù\Ë¡Íðø.ú\DÞ­#a ÆXŸÅ7¢K—Û½Rî.P JA©n”úB P JA)(•&PÊX«AwÂú)*½RËcˆUZ¯T5GA±%æ7‚”Ø%©Ÿôð©¨U[´„n¢t›-ÉħO¤CX _Úœ{P“Ê¢t8g©•Ѝ@™Rç ºå­Šú¤­J¤P^©U%@)(¥J•º£„1T*õÝÏÏS6é‘úG^ã“Øc~óM¦ñb™‚žqËüø+c{ úg_Ø{q-”©žÅBù¶I[Vµ>>)¯ñ)_è3_ü2ßú2VùŒL§j¼X¼)] <ŽÎø´/QtkA)(¥ºQê² ”‚RP*MµTaFy™üèÜp2?KÔ'ƒØë ;/Ø«Åò2™Á ¦¨]Ô•äLúänRZ”ŒwAƒÛêàÜlb’Æ+ᦇî²CƧè¼^š¨CÆ$‘É béÔ*jU9Æ'Õ6(Jm/JA)(UªÔ•%@)(¥ Tš@)cU´`žö)eFÔ*3æ× )±JïЃ|ýj²‚1R§V’*™’¼ 'áp½_©ÅSõs?s‹ÄšñÉ0˜RÞ$#Ð.‡äUì–X5¥4áx(¥ T7Jí.JA)(¥ÒL+õ¤:ãš¶ê5Ï2OÌ*ÂEf4’©]òw×néšúyj¦—‡›±À¾ùBw ²¼ÙåMˆQSÅB™É¦ø½¡ií“¡¼=Ïu—ò)?¬#Ÿ?‰R“ŒU&¯’tê@bÌº®(¥ T©Rß.JA)(¥ÒT⓲*ëò2ô$~z¹i¾Ð2ùä,šc¥*î–Iv­+ý¾-Wk$éMŸ˜>)/ùäÇ8˜ðdÌŸ=­2n嫿bÏB‡Ï«8£Òé”yx)·¢ò©;j¥n(JA)(¥ÒÔ³®A)(ÕšRÁ<~•0nJùO)í×ÔgösÕtO¬ÓÂÞ$+hù¢.ô­bÞòp˜°HÀŽz¥t[®î¹Ð˜iáMñS`Ÿ–ÖM¯DyÜ-r]´y«´Rë%J·x}¶j™šïÅŒåz>ðy‰R7•¥ ”‚Ri ”‚R­RÌ”$&¯2n¥ñCêÍÂT3nFZ#¢vQ["ås£+­Í늻¸¸¼éø S@΢š¾‰É9šÃv‰¼X%¥ôL5=¯”+c‹%ÕSnšh!#YV5Qêñ ”‚RP* ”‚R*uK ã¦ÔŠ^©Ø,QüH{Mt4~t;Þ<#–ÎL]7MD›2Œ[’Eí‰jdú|æÔ¯OƆhß„˜t°A‹E‹µ>qNŘUP JA©n”º¿(¥ ”JSQ¨ôTêIWPwé…:¾î·ªÃ3µŽÞ¿HæõºÇ©2EÛ:tá_ò$ýð$O2è¹L›D6gò>eòEeŸ¢ PT¦¨O^,ß^áÅ2V-SgÒŽ)uc P JA©R¥-aÜ”šJA©Ö” æñ›—JåÃÛ»¥h j«ôV}R¢W‹®lô’4Ë'XF—LC‡<|Þ…”Ãûêwu K|22åÊËtª×hx#‡.œ{¥Œ[^/-–$U>R]P JA©n”º¹(¥ ”JSùØöQ­S!­FxþB[å·j|ò¤ ‹ºåuIõnHڧߤNA@!á]å–TH‡|wD6…À¤h •q¨Ä§sCú+SGWSc^P”‚RPªT©[K€RP JA©4UÏÀ64kùsO«z*•y,Z/mÉ1Gt^£͹§9ÔMª"aÌá­%Ónõ2)%“Ù|OŸ|—DO™Îr¤|zì±ÇŒXþ¾Z,Ú»N§ÌM¨Ôš ”‚RP* ”‚R*uW ã¯T ¡OZ)o•˜a6à6'ª—Þ Y?Õé S‰v–)Õà[F§‡;ò2i2>E{c3>åMòJ=¦Ðb¥¬ZΫ´²>—Nh•Vꊠ”‚RPŠ©Ì¿õu(¥ Ô€L53Ò?jb÷•RÙ‰ÇÛº»"¿5³ÁM‰©Èužt$Ûº eJõ!x·Ö»‘ãiò¹QT¯¼L)Ÿ¼ŸRJ‰U>£Ò¹”·ÊeT¢ÔÎæ¬RÕÔ§Sø ”‚RÓ(ÕÂ?(¥J”º¦„¹®Te¾øù²¶I|jäUHyp29é»ËiSÛÔ2éVvH*ÉM2‰‰k—šFRoó¸¥Ä’è–üšQ™üƒ@&*ã“ 9J,­ÔÞæ¾RúË”‚RP* y¹JÝ^©E•ºqJA©N•ÚR¨)%áâ@#w*e¬ò]ìEØÿ"#VF¦}èÕLÚ$Eq“'ÊN5©Ä-­Wÿ”l ü!—ÈtnŒ¥¢2ù÷e½sY)oIãXPÞ ” >Ö ”êP©K-¥õQUËB¥¢w…RP J9¢ßèÔeJEŸ“alA:e”ÊÈ´ <` )™Ö‡­…öøLÄçÆ-`½LK¬ÞƒüÃ/L¡Ê}b¥ø^)Ÿ¢o *©¢×C”ÚZÂè*þ⥠””Ê]™(WªJA©+%ÑÔD×áFO)eÔŸR©Ï'£Œ(u¬™iJéu$1òƤÐõröIdÒqØ—:%dôJŸRf`z¾tá“(%Ïxaì'ý>!—§¦’*zs›ãJŸQýçRP Ju§Ô¶FM©x‰JA©QPêâFL)—G™?Oß?o’WªÉ¥zúä­2í Ç3y“–ÄðžÈ§Saëk^ ˜hJQ®W™U H­Vø¾PèSÆ*¾É$RQ™¢Ùa“TÍe¥L:¨oQkä6¥ TwJÝ^Âh)5c ”‚R­REb´iñ2>i¼CùT)j’—‰S¨”Iif‚ËhѯIyJ|Š>ÌB“Ì òï Ëç)™Ì³®o¥Ö•¥ ”‚Ri ”‚R­R•è éTÌ=³bÔ¤}n`“ñ)5Û¤‘‰_So=ãÊ3·bbµÂ}!3÷É[•: òÌŒUùw‹f-Qꌟ TIDATî ”‚R¥Jm.JA)(¥ÒT%c”¸FˆuòtàÀ#Š+•6•Ë4€I}镉=7šeÄ*À¤T9ðf&•?lþÔ!ÇÌ‹•ø”‚RP JµªÔé%@)(¥J•Ú_¸)å#ÜëeÊêÊ“  F©¨FF&Ÿ—éÜD åCB¢"oU9éà-—¬oôcéëô<`ÑC˜µ JA)(Õ™R甥 ”‚RiªLŽ£­:b»ôí©â·F§Sù5M 峌¨L:µÞe!?óýG·0€IÅVi¥–—9;Ú\JA©•jx:†=ÿ¼ŠÊáJÐ.P Ju¨TT%§– Ê!KÐ.•OsfzI^)«­ö@?ó=·.SƪF,²J”Z]‚5hn¥ Ô¨)5Ç‚RPjÄ”šëFÕJ´))·œOÑÄ(/Ó®þÝ]ÎûŠ™Â8éiÕ hQ<ä£?ð>g.Óï~÷»Ì±¥B«D©%¥ks(¥:Têòæ®=Q ”‚R­RåEðª)ò>é-™yô*Ó+/“¾‡—ÉOr™ ‰ž!š ˜°*õ¨Kdʵ¡Ô ”ê;Äæ­RKJ€RPªïƒRóL©T:7F^#ýrÏ\©FK¿1ÓM¼ÛèÊy};=<ác¥Ž”¥ T{8ðn£+C©QJÒM¼ÛèÊ£§Ô²ÆM©~eʶ¾–;1€O-†JyÌtƒ3y£³}!Tê© ”j5gò$Fgû”‚R­†â18“'1:Û Tå¥IÉt0) m=ãg€Øè‡½(îžÏ¯‹]t¨Tð)¥ Tn¿Pªè×J q€RP Jå^p­T¾ž<Ÿ)•1)•?ec0}¨û0)Ô%QÑJ„dö5Jô)Rä µr´(5¥dö5Jô)Rä µr´§Tô JA©‘¡O‘"O¨•£%@© yÒ9 dÊ¿j±£ÝC£žÛŒFE*´ŒÌŽF•òæŸÓ`¬×Û£VÊÇU(Uþ=_ˆ’pê[¥Äc˜ Eú¥ü°éç4ØëG©×–¥ ÿç QÎ=£"Q}«”x ³¡H¿”6ýœ;`P*ýhÖO5ÿý¼|DqyT¤Â©?‰Ò&À±9 q² pû=f½dš Ju¯TÕW’¥z«½÷ÛóÁD£7v õíU·òÄ¡[ pí1ˑҨJ*U"áŸB©~€RCáwPj4¨Ú)õ7T©—lf!Гª$NÊ}*;¢<7•Ø'§”ªá•½§£RUB©*¡”}éšWµ2/±íØ«– 6—G_ÃÔkû×âJM=/ðbGÔE§ËgxÜz£N™R‰›‡Ñe€(¥j T[Ô5™°0£Uħ闢ä¥.~I§6Ø×ú3YUÊ<ý¼¢/uPÕõàø$ ƒU¸ùÁ”š\>ƒãÓR‰jv qô/~ón¿ÍŽçÍ~ç/Íö—ƒÙßï¬ìxþìwÌHý"^ùÛÛ<âÉ_â;Þor+ÙýÎ|ÇÉÖƒÈ~Û?бåïwófuÙÂ+XÜõ~'â5âaì·ø8O_oé8GŸp·ûÇTöZsXõŸáe+}^ýïw¢•ýNH4 }¿ñðì·ÍíÞšïwS™«•¹¡¥ï=~·ñ÷ç®÷;a£)¾ßnÞ¦gk¿ÑotCÙï|¤š¿JÛ®ŽxPlâ~ƒ¥÷ÛËÑߎ»ß¯>šÃÝï¼$¬géü®C[ïoˆû 2…ä~;ý´ú~gïù΂‘/UòȶÚ±7Ãßo Tr¿mìxçÛÉ~#ûïb¿€1ߨ‡ü)5üý†á6/>¥ô¾ Ô¨ÂK÷ùÎö>Ôýfr©1|¾Á®†ü|ç%*— ÒªŽ¹Þú0÷ßy÷û½çk$æqž¯Tæ°Ú¯aòÑÚ^«æb¸ûU»þó˜…ç›øXÊqž·$~×›~;ëæ‡¿Ôf»ÞïD"‚†ð|ga¿é9X†pœ€Ñ¡×9Ï1“*}Qà ” (@«@)ZJÐ*P €àçu”Ùédt¾fÏmˆáæu &~”é7£sp<•1ÄMKl'¨†Rd©¢F'‡RôJÐ&Ù/~r JPFª<\ €A()¢»õ åà§^ZJÐ*P €VÁDtÈÿÈS¸¡¿DIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/starpart4.png000066400000000000000000000501251477365367100224070ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þÐPLTEÿÿ#ÿ59ÿ/ÿÿyrÿ%ÿÿ«ÿÿÿÏäÿÿÿÿ&ÿ ÿÿ6ÿÿ|o¨ÿÿÒáÿÿ)ÿÿéÿÿ3lÿÿÕ¥Þÿÿ–ÿÿ,ÿÿìÿÿ‚ÿÿCÿÿ™Uÿÿ/ŽÿÿïÇÿÿFÿÿœRÿÿò‹ÄýÿÿIÿÿŸÿþÿÿõOÿøˆÿÿ¶ÿîÁÿÿLÿèúÿäÿÞÿÿ¢ÿØÿÔÿÎLÿÄÿÿ¹…ÿ¾ÿÿO¾ÿº÷ÿ´ÿªÿ¤ÿÿfÿ ÿšIÿÿ¼‚ÿÿRÿ»ÿŠÿ†ÿÿôÿ€ÿÿiÿvÿp ÿÿ¿Fÿfÿ`ÿ\¸ÿÿÿVñÿÿlÿLÿFÿBÿÿÂÿ<ÿ2ÿÿÿ,/ÿ(ÿÿÙhÿ"ÿÿo¡ÿÚÿÿÅÿÿÿÿÿ†ÿÿÿÿÜ,ÿÿrežÿÿ3×ÿÿ‰ÿÿÿÿß)bÿÿ6›ÔÿÿŒÿÿâ&ÿÿ9_ÿÿù˜ÿÿÑÿÿåÿÿ¦#ÿÿ<\ÿÿü•ÿÿ’Îÿÿ©ÿÿ? ÿÿÿYÿû’ÿõËÿÿVÿñÿëÿÿ¬ÿáÿÛÿÿÿÑÿË ÿÇÿÿYBÿÁ{ÿÿ¯ÿ·´ÿ±íÿ­ÿÿÿ§ÿÿÿ\ÿ—ÿ“?ÿÿ²ÿx±ÿƒêÿ}ÿÿ ÿyÿÿÉÿsÿÿ_ÿmÿiÿc<uÿYÿÿv®ÿSÿÿ ÿOçÿIÿÿÌÿÿbÿ?ÿ9°Vô) IDATxœí¿eõßoJ HBC£ [¥‘Æ’’´Ø”65Z…ØøEÄ_)Š •¯1E´bBÁ€@mšÖDhcJScšF™ˆ¨ÕêWc*Õ ‘DЪý+´ú/ôÜ9wÎ=Ï9Ïóì³{göÞ»÷óæÅfïììÌîìyïî9{žgÆÆ`‚ €öé/º†Ü]í(ÜëÅD}Á<Ü`–·VÁZ —^Z]ÒÜirýð^nûjù¥*Ùfø`íö›½TÍçòš+Ç©êË+y‰i¥ŒOºš®3ª˜Û“;ÍȤ·ÃJétÊ[%‡–м¿l »?f–RÃlCƒRPªS¥þ] û°?¡”ê_©ú]¿D©O—ÐmÌýke|ÈRÞ§½{MØö´ªDK½Íè¦òJ=¬2!o•l!¥”Þ‚öI'RF©P =>)ê“î\ˆúUJŸÒé”WÊ‹›WÊ×Ñ¥‡B[¥e¢ƒAëð³«Ânß(¥ ”jm‡P J  TU¦Ô¿(aôs©¨U1Ÿ¢YKÞª¼LƪÔCËl¼§RÞªh.eÊç^)£R80Ýç4¦yAgÞ'Ý3{D Zî†Oå•ʘ$x¥¸”.Vññ`™xš€æ'ÝI™Zf”R3 â¥ TL©fN”æS¶*Pꟕ€O)(5k”ª"J‰“JUQ¥*VŠ×÷ŸREJýåæD.å­2ñ_—™Mäæ­J)S´o«z*õpºŽU*åSR&‹22E}r!y0š]•+Õì1PŠVÁ?ãÛ!aŽªQSœ@Ž×Éùm¥ªeªNpÉ|ÍøLNµLÕøcÛJA©9¬TÅCOœ¨&”Ÿ¼fYµm+5ñù*5Α¥þb så‹”šõJՑﲨJ5ñÅŸGU+Uñ§TN©Éo¤³A©a;ÕŸRʧÝ1«ô=J”2èÍöt´¥tϬlA©”Oi«´R^¦5aí¼/¥xá@ŸR“³­Šiº«ÆÝª[Ž*ÞZ5Q2“ö8vN@WE©?_BÇ_ü†:Õ씚 J……¾qŸJ¨NW§[Uêÿ–0úèPj”•ªÄ«ˆR䔚*“»æ­J(UžQ™-y¥v»ÍzM{úUê@؇›Rê@XA7MGKfMíÜÈí˜àÄ‹¥“I§Ö¨Æ‡ŒOy¥äsŠ¿6¬è?f|éòåãiÑž=ã{¯j“v†Ü@  ”i¥‚\*§Ô¸OU«Jý¯†Qž¢¶Pjô•*ý”b›ªQSjØsP3ú—+µc‚r«PªÜ*ÿýÝûRŠ)ß*ë eÊûM¡¢Uh½|OÔÆ*mÉÆ°AC»¢Ó¸ o¸ˆ^ÕŸ^‰û ª‰GUM¨SÝqÇDuiREÔ™à‚¢Ô'KÎO½C­øA©QUjþaJ>§š…ÕÊ@©àSsR© Æ×}•(õOK€RPjö(å?¥ô­©VCÞ©èÂ_æf«RÃÿâ7Î¥—ö´*¡T¹UQ¥´»fƒÞ­ŒöF)^óÒ²QJ©Lí£JYå·¹7œo©D)“Hé,I” }ŠVÍMP§r—ý V±´^~§¦l/6³I>1/N†<ã83„žl77pÌj½´RQQR~¤ÔYÒ4ºú›¢JtDebŸ®˜`&)¥æž€RPjÖ+õ·Kè6—‚RPj””ú%D~êm1øg¾R&Ò)­”w+e•—l¯#å±6£T*—ºØÍ¥ß)h³œH‰OROãºe½I>ºÂ2%¥Úž*bòcJA©Y¯Ô_+¡ó’†ûC”‚R£®Ô±óøå•zx²ŽUJ‹µ;Ñøà%+±j‡ÊÞôöRÆ*¯”Á$R§OŸÞ´i“–éH8(ÉwÀÖ6™ǘäÃÓÄãe!,­@kFóÚ¦ÞÂu >!Ëp¦ÃH5©çƒ¿,˜Çï%%ŒšR}}JA)(ÕK©Ëô§Ô.ah3$ÍÄ\ JA)(Õk¯…J]l(tŒ§”JYuÀQ¢”ÙEI:U¢¯LÛœ?>ûdÔÑÃŽLwD“=™,çÌX¥\#!©Cñ’šGy„.µUÏ„#“h -ϸÈnE»¢ ½:YÍäOz×±\ JA)(ÕªRÿ¡(¥ Ô,QÊÒՎ½út±­£û0ï+Ò!ï—g”ZV£­šºR\>?zôèúõë—‡³GúnØXwD¾!ïÓ%!Ô«LDs,ËÊÄ¡¾£vˤYR¶÷7K´Äêç"*ËÐ>57éñRÿ¶„9TñƒRPjŠJýë ”‚RP*Í•Ê[•I§$ä£ËSJ-Sð.Ê•b«´[º|ÎM+W®LpO Jª¨B™Ž¹ò3k$n±ÕÐuZÈV‰ |GY“áõ¨¡+F/—èLRoÚ ­:æúd5]½þak}ש’þy P JA)(•JA©•zi sE©hÞ*åÓ) öm¥ô ²qÙˆ(u^ïȤS¢Jyö6åsJ¤¸|n¦’b¹î†5£Î³Ý¦:ñ±y…ªCS„²÷׬…Ī„³6‰e¢õ·7ðuÞöˆBK¬S®Íi|Õ<ê“jå¥þR ³X©‰#AJA)(5 HáX,(¥ ÔÀÄFõ÷­T·{]]g9&*·J'O£[eÒ)íÓ^Õ¦õÉ'R>sŠÊdƹ’óɺíÓ¡b‰®ˆ?è: ÁÁ+%v–é­yá…ž¯X¸p!]^X#ž±a" a êÚ½DÒ¯ËBL"ÕÈ)Jý…f»R¦1JA)(50JMé‹”‚RåJýÙºUªÓξ*¼àe…> ª”¶ª§XŸÄ*–i~ ]1éT¹RT·¬ôMhŸR3ùáE1¥L.¥}2Jéò¹øÄZ°UR“$ÙâëìÓ³5§Nzì±Ç¶lÙB—tŠaì–Tè%—2ÞQ2xC-Ô1uÄß”ÐýÜýß%³Pwà–—' ”¥úŸs)¶zD#(¥†®Ô¿,a(¹T_RUÁw¹æ ¼(–'.®g Š:õ)Tj·khÍ+•±Êûd¶£Ó©ù ¾”^®Ôîppü‘#G¤^ž(–ÛÎØtÝd'ºi‚uᬈ Hº"êˆIΓØ'ZŸLºúê«×®]»ª†®³[ ­CkêM›õ&e’®»ó•ëšAZu9㔪úš½Š|Ù?ÓƒRPªC¥>QÂæñë¥A¸~àM¥—A)(5½J}¸„¡UüÊv¤=ªô}J•j(õI)µ7L§–)Œ =­Êø”WJ—Ò÷Æúp$ØÎ…¹råJJ¤tÉÜÌJäÇ¿«º¸nŒ52I«lT&“EqVD>Qø“Z)Ý!-Ú?âúë¯g¥­Y±b]§…$_Òš¼MVJ'RbU&yÒ&™v`~ÊvDúLPªo¥ª”êùù¥ T©RÏŒO“AÇk&)U™{®¯Þþ⥠TGJý“f–RjåÁË)uÀÕÑ—…d¬ò&iŸ¶ÅðJQäK鞨L¼ëeÍ©oÖ¯_ω”ö)U,ŸÂ¾ƒh év LIžôwn•e9$+" H/VJgN‚tLȽD)’I”¢%¼œ.%?ã:úÕ%áÝ2É“y‚&e¬e’Y0gª“u_pÁLRjè@)(Õ¡R¿(JA)(5K”â>¤aÎÞ<ÖS©´O^©Œ=­Êød¶f”«¶…¥G­28SA÷³šë@â%*¯sVéð¼B p׳éê8w@O”ñHœÜâÔG|’ñO’B±Rì9´k×®»èúƒ>¸ÿ~ºÜÕ°¿†<£ÓF´XF)“?yD&&¦Ôÿ,¡ËòDw›NïJA©î”úN së‹”‚RPª?rJ=ìèG©¾Ò)S>×áTI¶–R*ŸN »UæGwd¥x¤”(ʼnÔɰåõ˜ë‹PéÔu!º­S(3à‰‘¬ˆ«àì“>I&CÞeP”äO ­Ck’7]tÑSO=uà 7ÜrË-t嬳΢%ä].mà?É-Ú YHw§Çà;)®‹ý,0;•šH¨ºÝ‰Þ”‚RÝ)õ•ºVÊöêu ”‚R£­T56#”ò2¥•šz:•òÉL†¤—k¥ Ó©½á/ÞÈÑ£Gen$,E¡‹å›ƒÑ@Q¥4ºõ å“.‡ë>YŠq’ƒR"N€èrÅŠ”ôððwδ¸B:aé’îBk²O«W¯^´hÑâŋ׭[ÇV1$ë%†ÑöEYzlzø”ñIDí–·Jµ‹Rï(¡s¥zµµ¼C(¥ºSêJ€RP JÍ"¥&FæNky"åÓÃ‘Ö ¯Tʪ~•™X-–(E™I§¶Õý³)«d_¼º#)%§¼æé‘D©c®7VÕæ°V9¤ÇBév =íå… ÉX)îx%«¸òM—ÒA—t+÷Dp¾ÅÚ1$ eQ÷Ýwß½÷Þ{î¹ç’U”Q¯yî¹çÈ*]\çj:mŒ¤]ÓCb«¢Y”ùeÀ¼¿d•ú%t>÷ÄØPó…RPjÔ•2P Ju¨Ôß*aô•JYM£\ŽÒ3ÊûUJÆEé…¬[%·.kJéÿ8E)º»I§ŒR¾ª¬¬©“‹=æ|Ôº=Öø$M¯2¥%wËŠ+œôpDK¤ Vº!Èv…W#ȤsÎ9ç®»îºçž{(£º¦T£¼Š7%-lªDÅ#¨6gG}郡“ª3D©W”0„IǦ¿mJA©‘QjØ‚P J¶RCÿZ™Ã¯ ‘ò'­ž¢R©\j~ˆ^(Jy«¶¥ÏÃ#JI^Ò©#GŽP:¥•ÒÙR´G¢©“?¢N[B+¥ 猔Ã)Ò¥‚“!¶ûaYº²téRZ¾nݺիW“1ä eQdùtöÙgÓ%eT´dQ­Cþi«hGd0Wèyþu¯”É¢2JMÌã÷²FM©òò”‚RJÕZ5Ñ5”š _ü ”jK©/–0Œß¥†È€J9©RéÔ¶c•÷)¥Ôéf>$ï“)¥{«òJÑÝu}çÎ<^J+Å'޹Â#¦éŽÐÙ’A÷ÉšidN#F¸³4”$‘R"ÍS Ü AWH#råÞš{è:§S ëEË/^ÌVy¥ø´92tÞ¿wDÙv‡Ì$¥fÂ@y(¥ÚRêó%ŒþïRP Jµ¥ÔgK}¥¢V°¸lªïæÙмR§cpý›0Õ|ÕI±ÃuÑÒŸÛšžYF+Åó$¥ØsÒçpVóTgk׺j.í —É÷ïßÏigKä )µ¸†ô’¢8]?÷ÜsÉ•³kH#ºNKH2n  …wÞyçí·ß¾`ÁºBÒ­tGižåî >agTôðälÛþ×b’ÀùÖI5û{³JA)(ÕRŸ)¡óòÕPKP JºRÓ?¸£L©h:-‡GÓ)CÏDÊû$Jå­*TŠO­•¢È °‘„‰1m±M§„œÀPOWiæ­4§§æª¹I¡ÒÄJ±OìŠ\—F S2'ÿÈ6Z‡n½½æÎZ“VœŒ¶/=|ζJ'tEN”핊–Ûkf’R3v"”‚R(õ¯J€RP J•*õòFÿ‹_A½¤Ž®-É[eVN%R'BX&²A[%Õôù‰i“X)]¥¸sÖ(EI„¨s‰"œÒ\w?Õ Û"®—¯U°RÒ ËYÃÅrJ€xø;ËI&²‡.ùÏsjè:ûD òôHÇgóhe–µ#án©‘qT2[{Ïgà‘ò?+¥+ë›{3£”›þò”‚Rm)õWJè<܇91&”‚Rs@©áb•Šú”Pê€.¦SÚ*¿rT©ö‰)·ÊäR§Ã!SÜ6+JQŽÀJɸ'î• -UUÜ'I2´}Uƒ8´BÁ‰+Å)Oh$³ÑŸþœ!ÝWîpYÛ+è’Ì£ÕèŽ2ñ9ÛÉ[™“x5–‰®‚äÝ…ÍËØ)’‰ß/D)SGOdQF©•¥ ”*Uê…%@)(¥f‹R•¢»½˜}NÁ§žJ¥z(—AQ\Þ6]´<‚ŠGG±œ3qò¤ÇÓó¾ø1ðTš´)r‹M’¹Ò¹NÏuºO‘Ny!û$o"¦{Bz$ÌñÊ1QêÏ”0”!ˆÓTD‡RPj䔪̿¥ ”jw‡)Ê”: N‰£‡@yQ2V™ÕRJé^ QjcQ*jÕ¶&3JÍW³^) 'VŠd¢\‰¢T‚v­E²%ùÓ¤M¼‚ÑuùœÐæùÎ n¯5%ñb{8aâi/eMº™AW÷APÖÇbÉù Ï®Ä÷¥xļ(Å¿ˆR›Ã15¡[Æãü›CÈr†þÅJA©î”úT £6':”‚R#®Ô°»'ÆĤ¥JÒ)/SO¥t"%J±UF)oÕ¶°gö¼f–M™$I+µ¹n›¥Ð¢øä€”häi*}ŠÔHc`‡8­ÑÚ9i_5)šÍÞØKõνRü¾"<ó6¿/È]dºMÞ/Ÿ‡”’"ºlÄÏŠ¤g ¬ æñûx £ö»Ô NP JE• † B)(¥ZUêƒ%Ì ¥ÊdjW©”O¥6*|:å3*Ùøi5ÒyÍéׯ_¯•¢È (¢ˆ¢è¢X¥Ø“n¶Š©“qB¤ÙRÏ<$³‚^r}}²kÓ[!æñ:2ÐJàž\™F]VÓiç@—5ó:±h5>¡¢y¥ŒO‚n¡"÷åtŠ÷x¢™Sr) 9 xÊ’([’‰Ä+x˜R}N™ë› ÅÅîA ?¸OA[% –I­¤yAOP$SpjŸ¢Ÿ6ijøèyÞÅ-¹»L‚næ@âDŠ4ºCÁVi±Ôé¯g€RÃ?£<”‚RÝ)õ¥FíŒòP J´RßÇowx²˜B½ÒZ¥•ò2N´Ê¥ÖÇ«´[rïË«qšÅtQjÏž=~d¥HdÌÒ¥Ky>"™Kœÿ¤DŠn½z|.qé_`Ø'ZBêè ¾Î…s鶺»I¡´O’<™¤G“÷ÉôÏ^¢—èÒ;›$#¥HñigX%yU­ÖLRjè@)(Õ¡R·(¥ T©R_.a• Ý*ð)ÕB›I¤2…sã“hÁ¬Y³Æ\‘‚º‡ïÈkê¢;ß´|ùrRŠ"‡‚–~×®]<{$OÎç‘¡?ù 2<™dm“Váþæ$Øt‹”ÉI ž ‰çCâŒîí ç%J±@ú =ÑÚ¹6I|’,ê²f º[–|™“WÕÌ(¥¦#—‚RPª#¥¾Z¨ý.¥ ”ju‡ã4†·áV¿JE}ŠjM¤ÖÄH‰%w¤uV®\Ékê›h!)EKñϵsrhu Ÿz†³(º‰}:UŸ;fûvIžä/ÌD7+V¬©(YHí“N¤¼Rºˆ.2'tñ;ªQ¯—±ŠËçÜ4±3†¶êŽ`¿¿_¨)Å1¥ TKJÕZ5ÑõµF­{JA©ÑVjèÝÛš©Âw§iU)7ï•JuÈú|HÌ0°("ÖÆ~Ñš”9Ñ¥^–PülÙ²…Ï:Mñi¦ùìÒä—';(9"#¸;BÍÄer¹~ª™Êˆ{(¤šn:&|Ÿ¬©”k¥2ö¤è©”æ27%’î–ÍçRÍ­¢Ô«JµŠ”‚R#­Ôðs)(¥ T«;ä8Ÿ²UÑ;¥–)R>*M¤V†HRÅÒh™Ø§#GŽÐ¥^b†›¼¡ä‰d:çœsèò¾ûî»çž{(‘âÒ7Ágœ!58-ZµJº_I ™ðRŸ/GO™™•j‰åÚ<]’RZ&ß%‘!/™i˜Õç½á¹0K”j–‰R¯.JA)(UªÔ×KµŠ”‚R#­Ôðwh¥µªÄ'ŸEå•òÉ“Q*ªÑr…äUÚ?¹õHƒ¬FW(ð(ø¯¹ææ–û] IDATrèì³Ï¦êܲê¹çž;ÜL~ΔZQRUOŽ$“óžãÜŸLjÅVé1R’0=…—âº(Å–\—fs 3bÞèÅJ¯„™éœ'F2uôX"¥•zM £Ö6 ¥ ”j(¥:Tê%ŒšRËšY+K¬J‹•QÊäRç)2­^)±Jw@xŸÄ¶J÷l0«ÑŠd²„”"Ÿîºë.ʨ-ZDbq"ŧ=¤KJ¡h Ÿ §>å´ ~âDŠÕyL̓¾ÅÍ•®g7—“ÏH„n˜©¹‹Dšc½'ô¨wí–èµÁãZ£Ó©N©×–0j¹”‚R#­TóP†±Þ”‚RÝ)õºF_©þ3ªèŠ=•ò³"¥Šèy¥Œ1&Ú·oßž={è’בċBbž’¤n¸áœsÎáÂ9)E¹-!¥¸ëuñâÅ , å¤Ý¼yóî¼óÎÕ«éFþjö‰=3© ‹4¾µAg<êVVcL9Ú-ÑK÷JD”3f¬šÁJ Ï)(¥ T»;‚RPª;¥¾YÂ*ÅV*åìJÝšRj™›)ŸNyŸ´RË:[Òn1ô'+¥­b#)Z( "o¸ˆN=¤Î}÷ÝÇCäé’T»ùæ›ÿûß?ñÄozÓ›Þýîw¿ÿýï¿õVòê¹çž£´Ê$R|É&o<Ñ‘î:Ñtìs°ëKOO½Ä°|6¦­Òbé?wî¤#+J]UÂp*~î$Ø!”‚R#­ÔÐRPªC¥¾U¨)u^}*À¾Ò©2v„øtj~ÈJE}o4Ú0úS~ý§—_Ò)Š 2‚Ò"r讚E5”KñÀ©­[·¾÷½ï}ç;ßùŽw¼ãå/9e_ÿú×ßð†7ÜtÓm·ÝF+îW§CäÂ9¤Žq×¢D{`{vFH°uøú™ mUÞ9Þ¦I¶¼Ræ|8”ƒRPªS¥¾]B‡JUŠîöbö ¥ TwJ½¾„Ñü”4š¢Uç¹ Ñ{*¥»/{%Ä'0IÚ¤¡%ÜóI—ô'ß‘B‚²¡¥K—’L”é¶YbÁ‚O?ýô»Þõ®—½ìe/~ñ‹_øÂ¾èE/úÚ×¾Fï²?N Õ¼yó(ÒçÁ^¸páöíÛÉ'™ÀRWÁóÒutµ["Ýd9–ɦ&¸Õà%Óéšß¬ë;P~N*5”‚R­)LùÝFM)|JA©î>¥f†RÃüUŠö6¿>taól¾lÞ˪fÜTÜ*]G@)S&¥tÚ¤‘ñ>|Ý‹B‚Œ /^ð‚p[¹Åm”+}å+_ùä'?ùï|çÃþ0%R?þø?øÁW¾ò•W]uÕÛßþ³Ÿýìø­NéWÐÏ?ÿüûï¿ÿ;õáäCyt%;uS&CÒyvKÐZ,qhÉ2wt :—šJUcC€JA©•zC C™ÎeˆÝP Ju§ÔKΤcÃ+¢‹R&ŠÊ45¥vdÛ(2C¦¼R©ñO&‘ÚC[%Ýžü')uüøqÒè#ùÈÖ­[o¿ývÒ‹¥/~ñ‹ŸúÔ§è;ʯýkÒëŸøýùƒüàÇ?þñOúÓ¯ýíoû7Þxë­·Ò½×®]˵ó‡zˆd2é<©gçÂIE¬­¡·RgÆjÞÚï„î‰ÐáTædß­ ”‚R])õ½Fö‹”‚R#©Ôt”'¢éTF©>Õê™NE•Ê”ÒJ™ ŸH¹oû“a é_Ù²e OŠùüóÏô£½­æ-oyË _øBJ—È­7¿ùÍŸþô§)iºæškž~úiJ¤Èª—¼äóŸÿü·¿ýí›nº‰ò®U«V‘RÛ·o—Aí¦Ñ5/‡QÄT¸O&ˆÊ¤mˆ´:¨LÈ›!‡D,ŒÖËyeÓžrð (õ¦F°ˆ¥ TGJý÷Fí§^(¥ T›J¥Ò©˜Oåbõ•N啊&RûÔø'í“Q*Ú6GÀìcûå/ùÆ7¾ñ3ŸùÌ«_ýjúÂO×ÿwÍ/~ñ‹›o¾yñâŤöŠW¼â%/ù¾ðž÷¼çÉ'Ÿ¤ìëÑG]¸páý÷ßOJñL“̱° !%Pª°-KÎ Û¢ù¼G ”z‹1ý%^¬Ô“¤² 3K©x.UYÝôĦ&—A)(ÕRß/az*~m(UMnJA©¹¢Têw©^m:¦kEaÜ3Ê*ÕS¬¨Rùt*ª”î›Ð‰”¼ô{Bv6ˆR&Ìv6µsº•R¾CIÒÖ­[ÿð‡?Üxã_úÒ—~øÃ>ñÄüàß÷¾÷Ñ;ÝD+œqÆ”l=õÔSdÐç>÷¹?ú£ßüæ7¤Ô~ðºåðáÃçŸþ<ÀôëÂáM:ðµKT3ÂN… aýTÎL`4ê)“OGS©¸x°™mªžs@ÂøÚf­R“Ÿ€úÎP Ju¨ÔJ˜íJiÔ¹”‚R#­T§ÝJÛ¯8ŒU-)µ#FÏæÙ¨RÆ'B)y¹w&HÅ!ý)÷¢[i Åü–-[(O"c¾úÕ¯^uÕUßúÖ·(‹zéK_úÙÏ~ö]ïz)sÑEÝu×]”TuÖYÜgñÄ_þò—_óš×¼õ­o¥ÛW¬XÁƒãI)S>Fu4˜ð¿#ÌN|ZhÞ,îPåmÞZÏÌigóƒ?Z²S¯”˳ÇM5¥”zs Wüú+>$‹•¿½ /x”‚R#®ÔDR¨‘»„RPj(J½µ„éT*QA>xš?‚oRÁ* `±Šc»%«ò>åëèÒ6kjçz:L)ŸK€¥Ä2J™ÊóU &¥:t÷ÝwS’tóÍ7ûÛߦtŠdzík_Kßùßð†7,Z´ˆn¥tŠ”:÷ÜsçÍ›÷ë_ÿúñÇé–o~ó› , 'y¤Ôe—]v]xÊš“Í$CÆ€;TM_ût0„¼vËdN ´F½Ç}!)³wFr)z‘$XBägØd)#¾§ˆ6öÏôC„RPjÆ)5Ì Ì£ «øo¸úP JA©hüç—¿8•*E¡Ë Z¬h5}jJm Y¦È4P˜Ž ©ë¾ W&w0J±7¦{á™°7•âÿÔ©SëÖ­{ú駯½öZ2éU¯zÕË^ö²ü㤠eQw×Ü\së­·þêW¿z÷»¿÷½ï½éMo¢ÕI¶… >ôÐCÒ:a”òV¥”âÐö˜Qaú)šçõÀìB{£÷+åÿSêí%øDfú•Š™SªT”‚RSVÊöËÍ|¥Æâå‰h_>¥ ÔôJ=^‚‰Î*¯m“üŽ)5¿þs).VË™^¦²žM­RJedÊtOh¥t e^î=±„âŽZ©“±ç¼âŸ’ Ûn»íÍo~3åRßýîwò“Ÿ|ãßøÚ×¾öú׿ž¬"kV¬Xqçwr#í/ùËo¤µ¾ÿýï“X‡Þ¾};'R¢”å;d½&Àó3¿ï ‹Ü^Y-jOÆZÞE&Ÿ3Fºî‰†'bÄ{ÀÃ0îšôÇÓ˜qJA©™ TT%§– éiUJ€ít‰MB)(ÕRï,!Ï!Ÿ»&Úx”عþìÍmÒEßäàç€o cÁRJE³(oRÏžYï“WJ¬º#QO–ëRD{=sl§\ê·¿ýíÇ>ö1J‘X&2õº×½îÉ'Ÿ|þùçÏ8㌽èE?ûÙÏÞûÞ÷>ù$ÝBiö‡>ô¡U«VQ"ÅããyŒ”&åk÷Ñh_S–Ö>éó|k«äDMòŸ7UûdHinsjJ%}Pòc ;0JA©•z²„Ž»'$ŠIÕÁg"”‚R*õ®:þ”šüw8_&«õ1|·ª¾©–ŒíÒbe©ŒI©Â¹®š§^q±ÊW’µUÒYê}’*·ÈÄSYîÚµkëÖ­ , «æÍ›Ç‰ÒUW]uíµ×rá÷U¯zÕ{ÞóЇo¼ñÚkI<²ë¾ûî[¸p!—Ï7×'4öÈc¹Àε:ðLÆ*9 Ñü©§Ë)ŸŽd ·Ù‚R­Føä¿P JA©"|ò_(¥f½Rï.¡ãHuÀ†·¶ûâJ±:r}MƒzMé/Z…l Qv¸™43>™ÌÉ›´<œúHÂüˆÆ*#–NžÎ O},<« ¤P,åA—\rÉùçŸO‚ÜsÏ=«W¯^´hÑâÅ‹þóŸ_[»óÝï~÷§?ý)ùDYÑòŠ J®öïßÿÀp·,‰×êÿu¤ÍÐO×ø¤_€”R™ôñó2e”2¥20uÓŒR*kù5·•ÝA)(ÕR?)¡óïc™Š^Ï^ˆö¥ TwJÝX›d}üÿ´³Iv%šHE+©ì†®Ò-d)¢»+¢‰T¾E‚·­M9ôHpúSBчÅ*Qª¼dÎ>±L” :t衇ºûî»Ïª¹á†n¹åž/ó#ùÈoûÛ[kèú‡>ô!²ê¦›>úÑÒ*[¶l¡{ÓÆhoìÓÎæ ‹q&fLÎ*´Rn’•Å$ÏÊpnP9Ñ7 ”ZÐåáO}‰¢s)(¥ T«J=]Bç¹Tæ·Ü.r)(¥F[©¼5í÷Vòšy¥tE¢²-V‘"\SÏø$2éMJl˜\C´3´¦'ÁŒwʤËäÚ$–‰™ˆûï¿ÿ /\±bÅE]Dn-]º”’*Ê®,Xð|ÍïkH¯ßýîw·ß¾nݺ]»vÑ=8‘¢=‹ÿÆuì&!}Ý&"ËÍÛyóJí ;/R6¬th«ò"f6Ò Jý¬„¡ý.5 ”êP©÷–¥ ”¥zý=øý‹—jžõ]¬êÛ>ÝH‰y³¬cÏ>Iá\·ÄêÍÌ6ÀšÆË—½©$¢Èr6æؾ};?IÃ+ëêöéüóÏ?uêÔªU«žzê©{î¹çŒ3Πä‰"(u¢¼Š”ºí¶Ûî¼óÎuëÈ:Z‘îJ»Õ‰Ô¾fQ6'”’ÔÕ/Œ¦·+Ãt*£TJ…5aU¾œÌs™qJ¥r)(¥f£R?/az*~P JA©ViåÄ¢Ñ k/RJÅF0ùƒ¬“ª™L0D{´RZ,É“¸N‘ÌZPDÍ—,Çö†ûkè »rýõדk×®¥ë´Dn%™ž}öÙ«¯¾š’£n¸áì³Ï&™æÍ›Ç>Qõ‡?üaëÖ­/xÁ ȳ{ï½wñâÅK—RÒõØcq×’f²õ}“ó%e’w3>èZšè;›y%–‡¥t_DÏø¤‰Ze–ËõÌ©¥n*aÔ”JA©Ö” æñûe ÓÙ=Ñø”‚R~JM·R]| õÜç‘ðwú¨UÒç ^KÑB¿v¼K›äÓ°#a£„`Ƶ›DÊ qvEbQT“I¤iqª®/\¸r†Ä·nÙ²…|Ú¿?åA]tÑYgõÜsÏQÚtüøq2iÑ¢Ed ysg èòöÛo?çœsH£Õ«W_sÍ5ëÖ­£»>L>‘”•Ñ¡ÇÅݲ\A×7…?âþèô‹¡ß¡|×CÔ½w­TÔ{sw¿š{B¢Ôÿ.aÔ>¥ ”‚Rm¥ T‡J½¿„TJ}‰U¡Rú¥4nIR°&ôÏçO;ÝüFQ“N&0euTqæD} éµ°†®°R”>|øÁ$«H–éÜsÏ]TC©]¿¯†®ðŸ´|] ÉGRÊuýõäê¡C‡t"ÅÅì#éî×õ!'æHr"D‹å±!¯”¶ªD©¼Oõc¥~U”‚RP J¥RP JµJ½£ÅÚâr)]¿Õ¿àË–Vª. S/OÍc$2ŒM^Îé뺙B÷SH','XäÖ–†ÇH5‹’*Rä–[n¹¡†‡ÈsÎÄiAJѺB+PúE.®ZµêÙg¥o‚))Ÿ{¥ŒFûä¥I)¥WH%«ËcD=ˆµ*ã“zf¢ÔÍ%@)(¥ T(¥:Tê%Ì€¹'Zݤ¯cË }ÈøPɱvóó˜¬H7ÈjÆ$Óás&mŒ`þ4£ Ä'é¸öÙgŸe±®¾új2éÑšýû÷?XÃV1$ ™t¼†<£K2‰’*RŠn¢Ü‹,¤ÔõsÚ!—Ïý0©¨RC$]=Ñœ‡(jOÆ*/–¨°ÒQâST¬Ì¦ÂÌP”úu Óú)Õ~W”‚RsZ©ö¥‚RPªC¥>T´çRíJUÉ¥ BîhNÐ"˜¢F“‡Lý[æ4ò+,q3Vš—,jOb^s£”ñI'RæAZµ¨I§Æ-ìq¢¶¥nJ1+•šüt‚RP JÍL ”êP©[KM¥|q['DKÂS57kÊŠQQô4–¦ÓÁ«£Ñ³i5ðŸZ5¹U‘×V‰X&£Ÿ¸ŽNVq5}WÍÝ5âÛF·Ò]è¾´A>ÕõæÍgÖS"‰LF)É?8Þ6†²F)öÉÌ%j¼‰¢O*yÚM:ŸA«S(”Ê¥ T‡J=_”‚RPªT©”0ÊJE+áÆ*«¹*JùÜÈ㺬Af©4¯"ÖE&º<¤åZ)¶JJéâ—Ï}ôÑà ÒC!V±C»h!­Cw!iSꌇt¤v. %z¼TÊ'Á$RúáQo¢Ë͙Ž[QÊS®¼dÍ´½¹­Ô8P Jµ¦T0ßGK5¥ð)¥ºû”š“JíKÏFn”ÒVõR*ÕÝÀéë—$ÐÉ#¥qºo´Xº‚n|’,J'RÜ7A‰ÑªNªI§Ø!Ž uÈEÚO©~ÝÄy®ïhZeu‡‰€Ö¯OÆùYxåԹƥ¸nHYÅKR¶e©:=¥~_”‚RPªT©•¥ ”‚RirJù6ŠP&SA75r_×lhÆ6™SÖpRå­’¸"Îb‰^’B‰O¦ˆmž%9(+b±X)>ÅÑ%-¹ºVãÑQ´Ú²œçº$EGM'R¢TÔ'ݦ|®åÐfx |}."ïÖé°ãhºÏ"Un÷V¹õ¡”‚RÝ(õ‡ ”‚RP*M ”±**Vƒî„õSTz¥RãœX)­WªšÎ£ ØsŠAJì’TéQSBÔª ZB7Ñ ºÍ–dâÓ'Òƒ¡¬†ÆïiÎ=¨IeQ:œ3‰Ô2ET ŒL©sGÝòVy™ŒU‰Ê+5¯(¥ T©R·•0‚J¥¾ûùïyÊ&=RÃ̧§}{Ìo¾)Ãô}½X¦ gÜ2?þÊØ^ƒþÙ—ö^B eªg±P¾mÒ–U­OÊk|Êú̷̿¾ŒU~#Óî/oJW†c3>mLÝZP JA©n”:£(¥ ”JSíQ˜QF&?:7œŒÅOÀõÉ`öîp{µX^&3ĵ‹:£bÌÉݤ´(ï‚=¶ÍÁ¹ÙÄ$=ŒWÂMÝe‡ŒOÑy½4Q‡ŒI"“AÄÒ©UÔªrŒOªmP”ÚZ”‚RPªT©ÛK€RP JA©4RƪhÁ<íSÊŒ¨Uf̯Rb•ß¡ùúÕdc¤N­$U2%yNÂáz¿$RwLÔÏýÌ-kÆ'Ã`Jy“Œ@{’W±[bÕT”Ò„ãE ”‚RÝ(µ (¥ ”J3©Ô>uÆ5mÕ™jžež˜/T*:…‹ÞëgwÉÜݸ¥kê—©™^.iÆûæ Ý1Èð–74-f¤°4 Š…:3“Mñ{CÓÚ'Cy{žën¥2•r£TÆ$c•É«$:šó›¨L©;K€RP J•*õ‚ ”‚RP*M%> )«Ä£Ð§uG­ÔÙ%@)(¥ TšzÖ5(¥ZS*˜Çï®FM)ÿ)¥Ý⚺Ä«¦{bö&YAËuÑ oó6¨ÑWZvÔ(¥W–ÌÌÈä@xSüا=uãDÓ+Qw›\mÞ*­ÔG‰RÆ-^Ÿ­š¯æ{1c¹„žOG=¯MêS꜠”‚RP* ”‚RPªU*£‘™’ÄäUÆ­4~H½Y˜jÆÍHkDÔ.jK¤|n”b£µy]q¥ãC2y«Ô¹z3Ƥؙ ÜöÄöó›QJ'@: â[7'0’颻äp^&!Õ4Ên,k’5Ÿ|}™#ªTO«Ža2*Ï27}´×+a”‚RPª¥•¥ ”*Ujq #¨”·Ê+%V5ÁïÕ1Šø»ÊŸ¾KCëyã"o¸Ð7I]kt,lÑeçtó…oìfNb’—Ie›ªD¶G;ddŸ22õÌ¥2J]¬ÐVyxËÆ­óÂsˆœVý¶¡UP JA)(ÕP Ju¨ÔêFS)#V4à]FåÕñºÈ6L†ßážpŒ–/Ÿ/q­ZãÓ3aë®ä•[}Ú$ÏN?l¿1°)ãPF òª¹—)ªÂ^…© _ìàå{ˆ["£õ2I”ƒRPªS¥Ö•¥ ”*UêšæœR&Ù ³%m‰ˆâ7éeò+Ĥœ78*ŠÎ“Dš”—¾Þ/ú'eæ9—sÿIÙ\ùµ'ª‘éSð™S¿>¢}bÒ¥ :©Êt×úÔj™ª¯Ç¬‚RP Ju£Ô %@)(¥ TšŠB¥§Rû\AÝ¥t_÷[Õá™ZGï_$ózéÆT¢mºð/y’~xÚžûÈôHds&ïSÆ!/PT&ñ)šEeŠúäÅòí^,cÕ|u&í˜R·”¥ ”*Uêx £¦Ô8P Jµ¦T0ßœT*ÞÞ-•hDcP[¥·j’³Zte£—¤Y>Á2ºd:äáó.¤žov5Er·°Ä'#S^ ¼L»{†7rè¹WʸåõÒbIRåÓ)ÕE¥ ”êF©§J€RP JA©4•mÕ&:2™éó¿Ú*/–ñÉ“2,ê–×%Õ»!ißòX!œ‚€BÂ'8ºÊ-©$ùîˆl 5€IÑ*ãP‰O—‡ô+V¦Ž~ô¨(õ\ P JA©R¥Î*JA)(¥ÒT=ÛЬå Ìy«ÜŠˆêµOõkÕ„Ezí=?TSÿ™Lª"aÌá­%Ónõ2)%“Ù|OŸ|—DO™.v¤|ºòÊ+Xþ¾Z,Ú»N§ÌM¨ÔÒ ”‚RP* ”‚R*uQ £¯T ¡OZ)o•˜a6à6'ª—Þ Y?Õé S‰v–)Õà[F·¥‡;ò2i2>E{c3>åMòJ]©Ðb¥¬:Ϋ´¬>—Nh•Vêî ”‚RPŠ©Ì¿õu(¥ Ô€L43Ò?jb÷•RÙ‰ÇÛº»"¿5³Á5á h|7kªˆ-ndŠö!x·v¸‘ãiò¹QT¯¼L)Ÿ¼ŸRJ‰U>£Ò¹”·ÊeT¢Ô®f­RÕħSø ”‚RÓ(ÕÂ?(¥J”z°„Ù®Te¾øù²¶I|jäUHy°29黳%ÃÖ«lIw°²F"PIn’ILŒX{Õ4’z›Û,%–D·ä׌Êäì2yŸŒUŸä`ÈPbi¥ö—0û•Ó_þ ”‚RɳÈUêöJ-ªÔcP JuªÔáfšRr.4r—¡RÆ*ßuÀ^„ý!¼U"VF¦}M›|ž´;;}PÔ¤·´^ýS²ò‡\"Óå1J”ŠÊäß_”UôbÌf¥¼%cAy/P*øXƒRPªC¥-af)Ũª*X*½+”‚RPÊýF§.ûS*šø¬ ;` Ò)oUJ¦õî4‚=12Iæ´#[Oã3ŸG·|€õ2-±zò¿0…*÷‰•â{¥|о%¨¤Š^QjE 3W©ð'(¥ Ô TîÊX¹R P JMY)‰¦&ºV•0ó”RF ð)•ú|2ʈRGši‘¦ ”^G#oL ]/gŸD&‡}©SBF¯¤`ƒÓó½`*>õTJžñØO)ê*zs›åJŸQýçRP Ju§ÔÚfšRñ”‚R3A©«K˜aJ¹<Êü›ø)xòþy“8þ×Dr©ž>y«ŒFÃ^WoÒ‰~ÀùÄ2™Œj!iB4ü„¾ô*¶ê@/Rë¾/”û”RŠo2‰TJ&ÿ›¤j6+eÒA}‹Z#·(¥ºSêúf–RSJA)(Õ*U*ÙÑ ¬‰tΖø¤ñõÌ–¼I^&N¡R&å½'–Ñ¢/zRâSôašdV§øpX>OÉdžu}»(µ¥(¥ ”J¥ ”j•ªD vǧYî®~I´ËUÈÈ”špÒÈᩉ·žq噊[1±Ú¢]Ÿ¼U©Ã ÏÌX•·hÖ¥+JA)(UªÔ© ”‚RP*MÕs\’¶×ݽ\ (IDATªŸJ'OGÙ)O‡ç“Ñ2y‡ô,Gy™0©/Ã2±çF“§´ð”Èä}êiûŸôÅáóÒÒäßj«D©gK€RP JA©4P Ju¨ÔÂFM©“6mÒbŤI±ÉÍ]Ä–D­2ë“ôÔây™t„DÛ2yD*À ֹ؉Õ.}É4Å÷¿©ü³Ë*u~ P JA)(•JA©•º°„QSÊö Wܱœ4)¼I†Ó±“Hk‡üÙd(…*‘)%ÐÛjÓ««¢8˜mýæOS”©ä¹¦Ü‚R”‚Rý§.Ó~ô£Ì±¥B«D©c%¥k³(¥:Têd ³×ž(P JA©V©ò"xÕyŸô–LÜ›ddŸ2” Â|„ü±#ãJ_+·ßajçÝù$ýÈ=–ò`”X¢Ô3%@)(ÕPj¨3A(UáƒÛRÄ((Ìãwf £¦”)b÷´#†¬•Ù†öIkÄÈ8øË£ÞM,eB1¯”·ªßØ\˜y™°*³q#P9©c©Oí•(µ¤(¥:J PªßЙŒ¨R”0âJ¥Èšf¼1«{™¼Iùª< {úÔÓªb{Êî³\©Ìöö)£”{lP JõÞý>²‡¥F(¥:TêŽFM©½µÑËtqƒ™ñ(…Yè“WªÚ•)ºÙ©øÔ¯RýKQjg P J•¥ ”j(5Ví)a.*Ó+/“¾‡—©p†K=c²\©aY•zÔ…2¥©ÙT×>•Ëf”‚RÝ1·•ÚW”‚Rý0·•:X¨)u`âÄuAü§­b±R2™ -S4ê>œ¢8u«º±°§L}=Ø”©©ãg¶Ö¢OòØÔ(¥Š¶ÓÓš,P JA©Âõ˘“J)a•Šò°#aÕîô÷Â’yI"¨ò€l‘¾]*b€=ÊÝ~‹>Å&”‚RýEL °çÙ Ôò ”ê€ö<”ZYˆ+åMJY•NÀ¦.SO¥‹ÉaÑé/«Ÿ Ô`@©€RMt­)JA©^@©&ºæ°RÞž‹Úª¬‡Æ¤ž±]+5å ,®Z—)¿ýÔ1ó÷¢RëK€RPª,® ÔXµ±„QSj(Õ:sW©`¿9©T‰LZ©^+^ª(5E¥ ›A¦:’©pS÷i°#TïJA©.€RcÕ¦ ”ê#¸ ÔV*eR‚KôUÎ2u0†Xç%þ.|jC©£%@)(ÕwˆÍY¥N”¥ Tß!¥æ˜R©tyŒònˆ©+5Åh f¦CѾö•×·ëãƒ(uº(¥Ú À÷]JÍ T9àÀûŒ®<ó”š_¨)Õ¿L—·¾f„̧¶B¥ØÓ •:¯(¥ZÁ©ØÓRPªÕP §ò<:Ýø`OJU^š^2]ž¨Ä¤}j+Hú ›n¶ÚîÃïn_=7ëi^-QÊ2=”‚RmÄc[¿»}õܬJA)(5øf=N©ì)žFS©T/DB¦+³á?¥†)S>lZÜ˰˜^Ÿ¥Þ¦Î‚˜8iR”‚R3(5€RPªxSý+µ»„QSªP&ñi &õëS§1Þ3<2÷ýÓvذH=üÁd‚R”‚R!­*åæ§‹¥ ”*U*6ùc”•Ê·Â&"?}lK­ò+L¯L™=þiŽvff·ínP/ŸŠOPŠRPJ¥¦N=딂RL JóøùÉ‚"ŒšR=MJÈTz„û¤0´M`äW 6zÆa/ú ðžÏ¯õ]t¨Tð)¥ Tn¿Pªè×J q€RP Jå^p­TÏzò8£¦TƤTþ”Áô¡îäTP—DE+’Ù×L¢O‘"O¨•£%@©1(• ³¯™DŸ"EžP+GKpJE¿Y ”š1ô)Rä µr´(5&OúJGLùW-v´{hÔs›Ñ¨H…ÖÀ‘ÙÑ ¦üÈÉsì€õz{ÔJù¸Š¥ ÿç QÎ=£"N}«”x ÓáÇ”¹ O©·•¥ ÿç QÎ=£"N}«”x ÓáÇ”¹A©.±Íú©f⿟—o€(.ŠT,õ'QúÁD£7v ‡ Mža¿Ç¬—LBA©î•ªúŠâBò±Toµ÷~{>˜hôƤ¾½êÔô`«£=f9RUI¥J$üc(Õ¯Pj(üJÍ ª6dJ½Ä Uê%›Zô¤*‰“rŸÊŽèŸÎN¥öÉ)¥jxeïi£¨T•PªJ(e_ºæU­ÌK¬C;öª¥B ÍåÑ×0õÚþI\©‰çå^ìˆÚã ètù[ÏãcÔ)S*±có0:ŒïiJA©(ÕuM&,ÌèCñiò¥(y©‹_Ò‰ öµþÀËSJ™£ŸWô४ºŸDa° 7?˜Rã˧p|ºQ*ñ@ÍÞrÏ( ”ªRmQÐ>ýE×´À¬¤2ÿ}¿CÞñtí·ÙñœÙïœeâHÓ?Ã=æÍÞª!Ë<}û­æÔ~ç.Õ˜qìw;ž3ûË4!6=ßGæÎ~›Ðž3û»ðú¿9·ßfÇsf¿s—æˆûËÁôïwZv¯þ÷;ÖÊ~Ç$š†¾ßxøFöÛævo Í‚Ž÷;‡©ÌÕÊÜÐÒ÷¿Ûøûs×û³Ñßo7oÓÓµßè7º¡ìw.R…_¥í‡GWG<(6 q¿ÁÎÒûíÆåèoÇÝïWÍáîwNÖ³ô~ס­÷7Äý™Br¿~Z }¿Ó÷|çÁÈ—*yd[íØˆ›áï7P*¹ß6v<Èóíd¿‘ýw±_À˜oÔCþ”þ~Ãp›ŸRz_PjTá¥{|g{ê~3¹Ô>ß`WC~¾s•KiULJ\o}˜ûï¼ûýNßó5 ó8ÏU*sXíW0ùhm¯Us1Üýª] ÿùŽMÃóM|, å8ÏY¿ëM¾uóÃ_j³]ïw,ACx¾Ó°ßô,C8ÎÀÌ¡×9Ï1“*}Qà ” (@«@)ZJÐ*P €)àçu”Ùédt¾fÏmˆáæu &~”é7£sp<•1ÄMKl'¨†Rd©¢F'‡RôJÐ&Ù/~r JPFª<\ €A()¢»õ åà§^ZJÐ*P €VÁDtÈÿ¡:€ì‚ÆIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/starpart5.png000066400000000000000000000515611477365367100224150ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þÐPLTEÿÿ#ÿ59ÿ/ÿÿyrÿ%ÿÿ«ÿÿÿÏäÿÿÿÿ&ÿ ÿÿ6ÿÿ|o¨ÿÿÒáÿÿ)ÿÿéÿÿ3lÿÿÕ¥Þÿÿ–ÿÿ,ÿÿìÿÿ‚ÿÿCÿÿ™Uÿÿ/ŽÿÿïÇÿÿFÿÿœRÿÿò‹ÄýÿÿIÿÿŸÿþÿÿõOÿøˆÿÿ¶ÿîÁÿÿLÿèúÿäÿÞÿÿ¢ÿØÿÔÿÎLÿÄÿÿ¹…ÿ¾ÿÿO¾ÿº÷ÿ´ÿªÿ¤ÿÿfÿ ÿšIÿÿ¼‚ÿÿRÿ»ÿŠÿ†ÿÿôÿ€ÿÿiÿvÿp ÿÿ¿Fÿfÿ`ÿ\¸ÿÿÿVñÿÿlÿLÿFÿBÿÿÂÿ<ÿ2ÿÿÿ,/ÿ(ÿÿÙhÿ"ÿÿo¡ÿÚÿÿÅÿÿÿÿÿ†ÿÿÿÿÜ,ÿÿrežÿÿ3×ÿÿ‰ÿÿÿÿß)bÿÿ6›ÔÿÿŒÿÿâ&ÿÿ9_ÿÿù˜ÿÿÑÿÿåÿÿ¦#ÿÿ<\ÿÿü•ÿÿ’Îÿÿ©ÿÿ? ÿÿÿYÿû’ÿõËÿÿVÿñÿëÿÿ¬ÿáÿÛÿÿÿÑÿË ÿÇÿÿYBÿÁ{ÿÿ¯ÿ·´ÿ±íÿ­ÿÿÿ§ÿÿÿ\ÿ—ÿ“?ÿÿ²ÿx±ÿƒêÿ}ÿÿ ÿyÿÿÉÿsÿÿ_ÿmÿiÿc<uÿYÿÿv®ÿSÿÿ ÿOçÿIÿÿÌÿÿbÿ?ÿ9°Vô) IDATxœíÝ¿×yð‹e$dlÅ’±q‹Œ] F *–ÀELU©@ÁQb’S§qHŠ"W‰IŒ$ld£ˆbdHµA!ˆz„ëRZ(A5 )E¬85Ôi•âP’wçÝyï{Þ÷œ3gÌÞ½»Ïã¯öîÎÎìΞïÝ}Ïž9³°€ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ÒO… ãÏ`­kb»« …[½Rÿà¼ØÄ\ÜZK5¹ãŽêŽ0Í—ïåÖ¯®¿#’JÖ>X»þf+UóÀz¹«Î{{©êŸïåkä¡òzNŸ>}¢Î±:O?ýôþýÕþýûo¸á†+W®\ºti÷îÝ»víÚÞKµ½Ÿ]uv×9þ|u¾—ÝMäÖª¹æ|¾•Ö³uëÖ 6œS¡_« 6mÚD7ñ&Ìú}øúK*úúÝ.U½ðŠ+Ö¯_OO”ž4¿8úuT/ïþúþþ?Ýω~„Ô¿* HÍ©ª©9 Õò{G[ÕMÛ6ÊJgxkŽH ©æ.)CatRt½nw5!R½4¿jRÞ“¢&ǤD#¥­H“·MØ5j^Sµu+ÑaRgê°*CJ¶R…. ©ó ¬ÅëCÜ’ª^ =-zrôWƒž1íÞoÆ“¼¾úµ]ÜÏán;vLHýÓ’€ÔŒª@ ¤:Ùj´UGɤnµÿÊI17ÅHÙW9ýˆò¤Þ› ùÔW“ÚŸ µ}@R>¼¦­ R¤ô¶JHéÍéìNº=AêöIýÑ’L¦¥O,E¤ Ýóå¤ü­%¤Úrõb4 ùà7$©°2M;ƒI<1)ñ$ª6ÔUQX:¾Æò› õ®óM9åUµ†w2-_Õ;¬ÙU´&!õ‡JR3@Jú&@jfIõ;ø&ï¤@j&IUêÿÉÆöc—ð9$ªdÀ¢'X÷ФNgتœÒÉ“OÔꢤÂ6îë›”'ÉR¾œbU©¢JÇlWÊ&y¼²)‰—SÒ•nTE_aÙ[¼ŸÔ_œ^¿GÓºþ@I:#ÕûR RãiØýŸ R3Eê÷–¤R•þg’©»“‹ÿéxüO5|ÝÒ3ëΨJ­<ñÐÛ ¤L!eHéŽè&_Êèn>É{Ú&ê)JJ>¥Ë)OÊÃ-$µ»éG—1Z•ÆD;ƒ–ágW…£}ÀHHmƒ RCªÊHý’Ì~-U• å«–”ª ©è 3:3+o%åUùNt?n“2”ÂÓ}Mc/èÊÃ{ÒcfÏ©#¨6¸Ã§ò¤RŒt<)îJU¼?OÐ|¥»ˆéŒÍT‘š‚?©©fN”æ]¶* õ7J‚w)Z6¤ª)q±HªŠ’ª˜/ïߥŠHýî’ÌE-ÕJªîf6-7¯*E*Ft`U­¤^L÷£Gk©”§RÑ*J7jïÉ5É3ÑꪜT³QKj»Ì—Q-’"0çÕQS\@öúÉùÏJUcª.q—ùÖÞLN5¦ª÷Øž¤@jŽIU|èâ¥KUŸToòšõÕþýLªÿþ’êå\ ©ßY|ð©eBªnù®ª´¨þ?~UMªâw©©ÅO¤ËÔ¤M%IUÎÓ±˜*}RF€^m«Ñ±Ò…”¬A ©”§´*MÊÔOâi8R|åPïR‹³­Š4Ý=Q¿Qõz(ÈÍ•+ý÷ªž­zÈQÅk«ú]æZÒñ0Gú¡‹Bê·—¤ã~jv¤æTóþÔ¼w©7©Ô¥êJue¬¤þoIf$:HÍ2©J\EH‘)5‹»æU%H•WTfMžÔ1·ZÏ´Õk”Ôépnaº4q¾tÀ¬é;7˜¢#&¸…zXºX‘rj«:d*ã)OJÞ§ø“a³ÂŠþãô®Ý°¡W?ÞÛzÕ0¡ž~BW€HÍ4© –Ê‘êyªÆJê–dÝd R³Oªô]Š5U³FjÒsP3ú—“zºŸrUC*W壿»~¢­¤¸ÊxŠÁÒÝçQOÑ*Ú ­¯?^7j£J+Ùå†åŠ]ÆõÝp'zU¿{õƒ¨úªêÓ©üJu 1©"tú¹%!õ·J2™¯z'ÚãR³Jj«þbJÞ§š+«M©à]s‘Ô-½åcïF%¤þZI@ ¤–)ÿ.¥oM 5ä þ0·\IMþƒ_/wÜѪ*Aª\U””pÌŬÐÛʰ7¤xÉ;b‘•))¤2}ç `SÔ“Á$hLtµQ¥šÏx’.ú`ô#1}áäâÆo\YçÆ&ÞÎ>Á<~¥$3Û=R 5R5«¦uM©… X)ê”Ô_,ɬ}/m`žÔ‹ª:F*ŠàÅX¢¤¼'YáéX2k…T´,žTÓo½Ûåµmz¼,< A`QGS.Þ±‰/ãxý¾<"Iß cxÉe¾°r1´¬ús%™Ø‰E'©™%µ')šeRKòFeIeTI‹­L=¨ª¨§<)_Q¥TyR'Âù–JH™BJÓñu“³jÔ©ÚåÈ U–æå7jºíE3Kò…‘¸x-Ì7]V†á+_{íÂ… Bê—¤Óf?ù7*©™&5yT R’ú%é¾½ë „[‹63+AjPUžE9)_!e¼–“ÒžN¸3¼=QO±Ñ ù-’¢ƒ¢1ªtQUX0iFŠE/aþ^tëž=÷ß¿ú/%é¾ÅOö{)©é"ÕÉaí“=R Õ©_Kªœ{"EJ«J“ÒªÌH (CjtUÑÕêe<)óäN¨y¿yHíÆô–»soÈùÄÚ4g}+ZÕª|Q•{«»ê£’†ðäIé»ìéÚ±cÇ(¤ºûâwB¨@ ¤:$õoJ2!R“úôR Õ!©QCj¢3„u"R¦á¥I ªÊ@I©J!K©Ž”RâÉG5W6”4 ÝõiѺ£:ß-Q%¶ô¯©R,?Ðu¸BJ¢0õ4íØq÷Ýw ©&qJÑö&}xÓØR Õ!©aÞ¥‚ÆÐÂ'=7&HT‡¤þtIº%µø¶7!T9RwÄÊ)n«µž%TeÖŸR5()9Íß®Ø šLo¹ C 7ÒÍ\·hi¿¾ÙîiÂmVóÒ¤¢PR>RtnT#^ÍMQR¯¹D1±§»û™&Rjî ©eOꔤÛZ ¤@j–HýÁ’D¾êcãŸ~R§ûå”&åm¥Tyd'\R†ŒÚ ©T-u»› Jÿ¥ Õr!%ž¤c<:5–g¤+§°ËÙ4Æ»é2]#¶x ·„14ym¦É›²Ì—kQˆßt£e½$_?Ým3©qO±ø¶R µìIýþ’t>CÒd¿è)šuRŽÇ/EÊõ£GIiXÇ<²UO«êM¯?Fªªµ”)¤®\¹²{÷né\xP’[k2%ޑ䛧iw†aX´-­{hz ÷7ñY&+] ú¨¤Ög0ß÷”dÖH¾K-#R½—¤†'ÕÛ#ºS¿Kýë’Ll†¤éª¥–)þ¦¤F"UÔð[TJ•/§2¤¢°¢¤Ì&RåÔ ¤xë´Î+V°'CGvdFG4Õ“©rVÆzÊu¤Iê¦øî:/½ôýÔª¾™D×Ðõ‹l+:ê!z¥¥Sï?ãO3õ“Þts HÍ©A?øT‡¤þYI@jÚI©‚Ô¤ì§ÄeJʦ« …[-ôt»íG÷Í| rJ7y}†Ôú:ZÕ褸ûüüùóÛ·oßÎéwòãTÝHØ &ïéÝ*/51ªL‹æ¶¬—¡ßQÛ2e–tÛû›.$†Äêçb(ócO3}¼Ô?*ÉõøHHêï—¤@ ¤@*IåUeÊ)iòÑëS¤Ö«ð&ÊI±*ÍKwŸó ‰M›6™šéL8©‘?(©.  1]pÝÏÒ*…É8Y‡.Ó•¬J4ðeI/ÿlº`xéBǤ>¼i‡Ve ,yÌч­ùªÜ¯fHúÛ%))J¤@ªCR¿¯$óB*Zw„¤|9%}AWz&²rY‰º¡ oÈ”S§›DIùœhºÏ©âîs3ÝÔOz4¬9ê<;ÚÔ4LÓ6u?4µPöñLòÁ,¤­JsÖ’-° _æ5°°—T¼Slùø^ó¨'5”CHý®’,cRýG‚z)2 ¤ðX,):±£ú&Õ´Û®]W9¦œ*W¥‹'CŠU™rJ{:¡†iD=™Bªª6ùÊ)ŠÉ au]ίÕ]Ñš”o¡¢D÷ˆt™@pã•^vÆô¬ -yë­·Þ¤²zõjúykqÆÂƒ0êÚ‡¾Fʯ;ØBªÁ)¤~GI–;)30¤R½ýR 5Pú¤Fúà7«¤*ê€Ôo-I·¤:ÙW…?øºBOÃ’ÒªZae<‰*Æ´¢]0åT´–Š’:­FËöÆMÔ¤´§ÔLDþ Ø)SKiO†”î>OÌ‚UI¿¸H’b‹/³§·ê\¾|ù•W^Ù»w/ý¤Ë|¥c[ÒC/µ”qc d:àMjPÔYÿwIºŸ{bð»d®Ô#pË»'æÔvšURƒÏ¹[<¤ò¤z£û@j̤þnI&RK „ª >Ë5¿Ý{©°{âözÖ ¨¡¨§Ô17 5O*£Ê{2ëÑåÔŠ&¾+½°–:íŽ?wîœô—':ËíÈØ‚˜ºýêAÌ…«" ! tAèˆ$®“Ø-O’î½÷Þ{î¹gsºÌ¶8´ -©K4-#ê&%I÷»ó…û›ƒ´ê2rêHUM‰^EÞ‰ì¯é•HuHêo–dóøµ1—ÜTúú©¥%õWK2±¿² iG•¾O)©&¥ž©a9µ^ÅPh%•ñ”'¥»ÒOÄÆážNäD8æ¦M›¨Ò]æfV"ü»ê×c &*Ådª(®ŠÈ5B Iéñ2DBû£<ðÀLêå:7n¤Ët%Á⟴$¯“IéBJTeŠ'-É æ§lHŸR' U Aªõý ¤@ª”Ô7{ÓdÐþš&R•ù·uyõWaè~ R‘úË%™.Rjáá»'†"uÚõ£¯“Q%¶Ì5“Q¥IQ ä»Ò}¢˜xÓë›Sßlß¾ )í)ÕY.žÂqц¦‡KpÔâIãÎCe‡TE„€x1)]9IdÄ„ÜKH&!E×ðõô“ë3.§hÓ;Ô( oËOæ š’±Æ$³xN!©¿˜Òw1ÿƆÊ÷)êŽÔ_(I‡¤†o,;z"¹@ÿv©îHý¿’LæƒßèwR}¹•¶“Jx*,§òª¼§üª )V%åT‰ªªï_÷ Ÿ9sÆRº¿ü+-!#aé'Ý…–dO[¶lY»víºuë¶mÛÆª8„‰y‰0Z¿¥G¥Ÿ2ž¤@Ô¶RµT8zâ/•¤sRmCˆÆ¼A”Tï;*#õçKRsNª©eEªdî’vO¤<½:áI¥T JJ01 KHQ%dÊ©ýõøÙ”*Ù¯„îH¤ä”×<=’ºàÆÆr£bR{ÂѰÊ¥‡Ò“lŽs2“⯤Š{¾é§Œ€ Ÿt+‰àz‹Ùq UQ‡þüç?ýõד*ª¨.Öyûí·I•î\çÞtZ‰¤MÓC¢‡'•d¾=!¥UšÔŸ,IçsO,Lô;_”ÔZf¤&˜Ô…Þç>*"õ‡K2û¤Rª¢e”«QZË©¼§()9.J_ɤX•ܺ¾éJ×ñSHÑÝM9eHù^eÝÀš~rÑcÎG­‡ÇJ%’t_8#%=èd…‹.€è+£!H [áÅIZ³fÍ“O>yèÐ!ª¨v6!jTWñªdHK僨øÀ,9‚êBýtõÎÐEÕÊ BêûK2IÇ–~Ø,HÔÌšô› HÔl“šøÇÊÈ~…”?iu9)ÓäåÊ(©aô•Bʫڟ>’nx)§Î;Gå”&¥«¥è‰¦Ÿü%uÚêT4)ÝqΑîpjé2‚‹!ÖÀãa]¸ùæ›éúmÛ¶mÙ²…Ī¢Hyºîºëè'UTtÍÚ&´ ùãÑR¢‘`î¡çù×™T¦ŠÊZL0ß÷–dÖH•wO€HªY5­k HMÃ?©q‘ú©’Lâ{© fHRUªœÚÆržª*AêJ3’ñD LWºW•'Ew×ýèGŽáã¥4©è)ÿÔè]-™èq²fZ#™Óˆ#¸3*’ˆ” y½ †  Ĉ¬|¾Î¡&t™Ë)ó¢ë×­[Ǫ<)>mŽ:ïÿvD³'IfšHMÃòKHª÷ÌAj†HýË’Ìþ÷RKGª©#õOJ2û¤¢ªNÛ¸jjàrêi•<©+±°'&¥+ªj$ÅÓn-ýº¿3ËѤxž$CŠÝ˜“>‡³šû>r‰¾FJ(9]!—àp7ù©S§¸lâj‰Ü©uuˆ—tŠÓå믿ž¬\W‡Ñeº†ñ ºò‰'ž8pàÀªU«èýJ·Òeð,žàæpEEOζíÏq-’$2„6ìs©)"•úàRË•ÔO–¤ó嫉vQL)u_©15ñ¥?¸#UNµ©:æ†BdÊ)“Œ§())¤ZU’âÓ_kRÔ2¨ÙHÁÄ‘f¦ÇKÔ§²ñÓUšy+Í驹×Ü”P9¤‰I±'¶"—e „é2'¤–¡[Ôy¢ -I HMFë—1|ÎV¥‹?ž:UyRÑîö:ÓDjšA)”Ôß+ HH•’ú¾’Ìþ¿2O­ýèZI^•Y8UH] ØHƒV%½é+Ó&1)Ý/¤xä¬!EE„Ðñ‡A5SšëãÝ/7ÑÃ"$Ü_~ “’Á°\Eq¸³œ >ü;Ë 顟üëš:t™=AžéâÅ‹,f|ÌŽÀñJr•Ì–Äîy­tÿ3)ݳ¾§=SEjaé»'@ ¤ÆEê÷”¤óæ>ɉ1A ¤æ€ÔdcIE=%Hv‡Ë{RÑrJ«ò GI]raOœrU¦–º2ÅÃf…ÕLJŽ{bI2¡¥ê÷E’Ú¾¹‰ڨ…“âŠ'4’ÙŒèWjþ\!®ÃV¸[‡W0ZŒî(Ÿ³N^ƒÌœÄ‹1&º@ÉÝ…šçaì‰ÿ^)Óž¨¢ ©ï* HH•’zWI@ ¤@j¹ªTºÛŠÙæžZI¥ÆPøè% =iR…ªô˜YÝCÏ唩¥ø)jHÔ¨¤c™ÚÒî¢ÀjO<›ëÙ¬ÂÃ%¸íK÷¹ÅÝÛf-AÅGG1 ®™¸xÒÇÓó¶ø1ðTš´*²Å’d®tî§çuºO‘Î'Ç&LòG¤õŒˆáè Mê·”d"‡ .Q':HÔÌ‘ªÌ¿¤@ ¤Æ»Á£2R§Õ)qô!PJF•Y,EJ•R»êRQUû›ÎZ¡FÎzRÔœ˜a¢Z‰Z©4Ú{l¤Z’_MÙÄ H'ºî>§èó|ç^!4¥ðb=\0ñ´—2‰&Ý‹dÐãÕã ¨êcXrFD¾À³+ñ}i>b^Hñ7BjO8#¦NhKšq/ÿ — T9ÿàR Õ©Ÿ(ɬ͉R 5ã¤&=z¢—a$•*,§ ¦VRºR¬Êòªö‡cfohfÙ”I’4©=õ°YjZÔ>¹AJkäi*}‰Ô 1aC\Öè‘Úœ _5%'U½±K9êÇ>Hç·>!]Éä.2Ý&o—OŒC¤¤žº>^jšIÏ„¨ æñûë%™µï¥†}s)Š’ A)©±’útIæ‚T¦±ò˜Rf=©]*¾œò•¬üŠšN醿tˆÛ·oפ¨eP+¢E­‹Ú*µ=Àª8uQ#&ÍÞzæ!9+Ñ×#ô¥Åø„ŠòPy…´&Ū´K݉.¤øÄ7†T8CÒÇJR R •HT‡¤~[If¡JRJ•›!õ-¤ )]HU—˜¢JÿÊV† –Æcø &9C j­-èžožiR `Fú *íLê*ŽY j/#tõ¯zä®ëªg9’Ù<õÿ<ðWVe¦qâU‰K3<×Rúœ‡RN¤@ ¤Æ©IýŸ’Ì ©‘%eT TEe<顲,i{T9¥aéUѯBêJ}J!Å'᪠)jç2â”f’q§ŠÔ½õ“r¬¹>˜Ê`alNLoÊnïzŠM®rä@v3óºò …”€§qéds:îg›È¯ú0©ûU¸ Ït½XNÅ:Ñ¥$ R Ré€HuHê¿•¤û9Ñ'{T/Y‡'ßîƒÏ“Z¡bºÏ£¤¤„RZ•޶%k ËÒΣ'4).¤¨iQ î¹çÈÓÅ‹ù|Ó¯¿þúÛuÖÑ£GÏžÝÜœGšË@&4¦Ë±H]E“ÐyÖEŸSÑ_õ¤I™¢JÎÔ-«•c¤Ø“9þ )¢C»ç•X95M¤&®^©îHý‡’€HT)©(É ’ÊDÃi#5ªxœ‚Œ›ðë¢M/è Š¸³¡“ÙO;b‘³øèyÞÅ–Ü]&A7s q!EŒWaU–:ýõšüåA ¤º#õoK2kg”)šiR“ŸÇïXx²˜B^éªÒ¤<¦+‰¡²†ÔöXD•¶%—ù¾¼ØùæÔÙ|=“:~ü85 j~¤ƒJ$sóÍ7ó|D×aOô+Rtë½½¹Äeü‡=Ñ5DG‘àËÜq.£-¤ßÝ”PEO¦èÑÉ{2ãgï £¯Ñ]ï,IŽ”",âéHQ%uUMkšHM< R’úc%)©RR?]’$%)´Uà)5„6SHe:Î'aÁÙºu«¹ ê>|G^RwºóM6l RÔr¨ÑRƒ?zô(ÏÉ“‡oÛ¶g¡ä3Èðd’µ&Má™æ$Øt‹t“ ž ‰çCâŒîí;ÎÍPˆ()¤ÏÐí;×’Ä“TQw&bÖ GË’Á$1uU©"µµÔÜ‘ª*š ©W’Yû^jIõþdƒTUHù öÒL>[ƒ’ŠzŠ2ŠR[cIÁêß±~Λ6mâ%õMt%‘¢KíŸûÎÉЖ:|ꮢè&z‹ê­¥>wÌÁƒR<Éor0…ÜlܸQ¦¢dÚ“.¤<)݉.˜Œ Ýùe”‰çeTq÷9š8‹Võx0ߟ(ɬ‘â6R“ª@*JªfÕ´®Ÿ-ɬž˜SR[Aj^HM|ôÄþfªðc錕”7ïI¥FÈúzH:îLŠÀÚ¦©¾zÝ´$UNôS/F×PûÙ»w/Ÿušñi¦ùìÒ䉗'TõHÕ£#ÔÜHÜM.—/7SÉ îM7#&ü8YÓS®Ieô¤ÒJJçN7%’-›¯¥š[…Ô–dÖzüæ‘Ôö­ã õJOHM;©É×R 54©W^)òäv>²ªè ©õ*)O…¤¢…Ô¦0RT1‰=;wŽ~Ù´( IDATêŨÍPÃ&7T<¦5kÖÐÏÇ:tˆ )îú¦ðgˆ—E›7ËèW$^êóåè)33GG¥†Ärß<ý|¡™¤œãGId’GfÌêóÞð\˜%¤šë„Ô•¤@jsýÙ|‘TUTœÔÏ•dÖzü@jdR½_@jZIMþàMjXU%ž|•'å‹'C*ÊhƒŠÔUÚŸÜz®‰,F¨áQãß¹s'ºîºë¨„º¾©zûí·Ï6“Ÿ?P¿DTZQQµqcýKbræÂsœûóáX¬J#%ÓÉðPxé\AfG8}‘ÉžXäpùá@Z]œÉX 3Ó9OŒdúÑc…”&õ§J2kÃfAjPRôþ4!RURË/ UFªÇ¦&%Ÿ#„ÔÆ®HÕ[YÞ¤~¾$³Fj}3ke‰ª4¬ )SKÝ ’:áI‰*!õ$VX•÷žib£k¨%“"Ežž|òIª¨Ö®]K°¶m«›wï´‡õ…k¯¥ÒŠÏ„Ó;åtU5?q!Åt^Qó ïÝËc-çJ׳›ËÉgd|DÝu^oJUT/¨¹‹Í…¶ˆ }Ô;³3¼v¸s\ëèr*Gê=%™µZ ¤F'µ¹I‘%UÔ‘jÊ$6Â[©!Iõþ HU åHý™’Ì>©Á+ªè‚­¤ü¬H©Nô].yRFŒ©ŸžþùãÇÓO^F /j Ôæ=úàƒ®Y³†;ΉÕR>ØkÝ<êuݺu«V­Z»¶wÍUW]õÄOlÙòTÝúÍù«Ù;»\/ %L¤]Ðø¡ ºâÙQe5bÊ£m /=V"*RÎ|˜Q5Ť&gj IõÙ²!U›ª©Ê‘²§„H]„TUÔø[úD¶²°”¤ªY"E¦6æIÃùò¤zkžRÿ±$3HŠU’rºR·¦H5ª"¤¢å”÷¤ImpÑÕ’¶Å¡_™”VÅ"©µPD¤¸BzˆÔáÇ·õ‹©mDí¡‡úö·¿ý꫽ßôGôSŸúÔg?K®Þ~ûm*«L!Å?Y’qã#CVëMÙQz„nûÜØõOŸV^",_iU–þõÈÚ³Bê‡K2™¿N7lpÉHE>øM©Þ#L’zõøHM?©‰g I­X5¤*Mêឨɑrcó–'©_(ɬ‘º¡>à@åTYžãË©a† õ$nt´0úU¾ý§—_Ê)j$â©§ž"COöÒ'Eµ8µoß¾O|â?ò#?ò3?ó3ß÷}ßGUÀÏýÜϽï}ïûä'{ì1ú„xJ‘Oqs¹>>zŒ»†Û:2B»¡Ã—WªhUys¼NSlyRæ|8Z©©'AjTR_(I‡¤*•î¶b¶ RiRk{¢z¯F@ªwÅ"©úÕ©©?[’Ù|—¶œQÕ nBôVRú`÷ áX ñ¤ &)›tèóI?éW¾#5 ª†n¾ùfÂDÅQ3lVýûú×?úÑ~o}ñ]ïz×w}×wõ¦÷é… ª«®ºŠÊ)}ìÕ«WRTœÔûK2™IÇ&׉.¤L9Å4©§SÃ(²µ”Q¥':ÚàŽ2…Ô‘X´*íÉ¿nl„ÿÜç>·oß¾ЇÀÀÑoüÆc=V_ú‰/¹]¿'ýãŸýìg/^¼xÏ=÷pßùÉ“' “a¤ë¤Ö‘ ¯©Ä†5´“ZëóÖn¼ =&B+4àTådÿZÔÔ‘ªªi"UúHÅIýbIföƒßÔê5Ï¥#u±·ù5R?’ú‰EfDŠL}¤¦“ÔRtODË© ©iµ–SRUr脞‰I™!¾rŸö›”S|aïÞ½<)æ;ï¼óÈ#<Ö¼#UÕ»ÞxãO}êS÷Ý×ûåɪک޹¾ç{ªê§¾ð…/|ò“Ÿ‘¡ªò2d—ˆÂh9/l†§œ9#¤>P’ìD©4©J‘CO>ùd@ªþ RRÿµ$³öUït’Jð›()Qó®w)QU3J½w8Ðâµ R½¤RåTÌS9¬Ê)éñËô ›Bêyuü“ödH¥ÚƒÖFÖ®]{Ýu×=úè£o¾ùfƒå‡èÿûÕÛÒC=Tÿ{è¾ûîû~¹öc_ýêW©úzùå—W¯^ýÌ3Ï)ži’s!†‘êØ–kV†Ã<¾hÝ£¥þĘñ%Vê“”²M¦‹T¼–ªl†]uU‹×T’”ˆ"Rzßÿª&¥o)KêK%Yš¿qª× Rí¤š=ý“?D¤Q¿Ê ªC‡BQd ¤¦ŽTê{©¶ß‹VãZQ3n-§²¤ZaEIåË©()=nBRòÒs¤‰2ÍìHÓwN·ò•Tïìܹsß¾}ß%¿ôK¯¾úê§µ›;¯®ÿ}ýõט?t_¾úê«Ïž={ÓM7=ûì³Üƒ~xx“nøÚÁj0ÂÓ„õSY™ˆaÔŠ‰“/GS©X<ÓÌ6UÏ9 Íøƒ%Y¶¤ßõAÊ“ªª}‹J"¤úÿ‚T;©/—d¹“ê}hÔµHYR’_ªIÅD½C¤úÿÿ¦Ñ`šÿãauâËBóÇâqÕ½Íkk­œŽ4_ø½%õ¤ ,Ÿãnª)Eê¾’tÞã×Ë€‹Ç–¯üíUøƒ¯©VRÍ/ýèG‰Ìm}Q=RkBR©i$5D")dä~‚T ©wú¢z¤-’z²Oª6…w©$©•d)I5/­½Z~¨_‚O©`5`QÅm{Lªòžòýè2Ýôëé0¥û\X –!ezžoTÔDª> ÍSx¨7Æè U÷­]»ö©§žÚ¹s'‘ºþúë¯â«¿Ò;Ž®&µjÕª½{÷ò‘RwÞyçýá)k^k&2W}úÚÓ™D¤Ék[¦rÊ ÐŒtôŸ“’}Dõ£7µ½HÒ©$‘¯aÇ€¥,ñ-EØØ_Ó¤¸UWÕ")BÓ#õÐCV‘"nŠT’úH…Ô$'0^YÅ¿ÃÕ÷©R½˜$õODT g‘T#ªGê?öDÔLZPp*{];)jºHØV¯^}òäI:aHyU)RÒº£sèg$ìáΠñ›Ðnô械RÎø×©”Ä2KO*&§”TÊúÞTï§'Õ»8礤55­kêI-„X?÷Pð.5©•)Rüò—¿üƒ}R‹ê“’áèÕ¯+RÕ|“rïR_)‰iU®½Ž;ÉϘÒç7x-ÅÕræAÃËô¬gK«© ¦Ìè MJ—Pæå>+(E“zÍx^UýÉÀ©ýSôØcÝwß}_øÂ¾øÅ/~ík_ûùŸÿyù¼³?¾â‰÷ówÀo¾ùñÓR_úR}íÙ³äBJH™Ã¡üYïÀ4ðüÌïÇÃNnOG‹ê‰FU™zΈt£'š¼‹}O[l«KùÁOÁ²Ç¤Ô!€iR•"Å¢žhFUhRgA* ¥äh¹&½¤¤äØÑnÄDb• 5©5¢žh®iH}‰>þTHêGJ4Ïø[Wg‰Ï·V%û *É7ü¼TíÉ$Å.\çh¤’ }ØTY¤È©vRÕÏ6¢Þÿž÷ô_*"õÕ’tö‰O|âß')÷t—?©¯•¤óÏcUºG¯u,Ä[© ©JH­ãÎ ú„÷Å/vA*út—?©—d‚ƒd}ûþÏ*ùuŠR™ƒ•š×šn! DD®ˆRù!¼n-Ipè#ÁéWiЦsXT ©òo¡(w÷ô0½ôÒK/¼ðÂÉ“'Ÿzê)ž®åÁ|øá‡{óeÖçúÖ·¾õÙ:tù3Ÿù ©úä'y¤·àÞ½{éÞŒ“=iΰ(-δÙs‹³ m:g‹’ Z’ɦpnPÙÑ?@)º2Û~E1Ä0º–©9&Õ¼?¤® Hõ~Iª©;hk U·®¯—¤óZªJò뢖©)2umCªj%ÕûRÓF*¯&çmÈíÉkæI鉞mQED¸O=ãIŠ'½Ji¦Ö"C³0c̬,QLˆOJ(—E0Q¨&ºõÖ[7nÜxÛm·‘­›o¾yË–zç¯ZõNo×!^¿ù›¿yàÀ¶m‹ý´Ú²ø7nÂ?Jý]È{ßüÉò/Œ©mõß SNµ@›\´ªV‹©•4Ro”dbßKM& ULjKŽ™: RŽÔ'JRsKêpOTŠÔÑ£Go­»8@jyjû}ø ú/5xÖbUŸöéF²BnÖ7ÇØ³'é8×CbõjÎdÀš‹}ˆw«ÜY÷… ¹žÅ<ûì³$.„¦·p³ŒÜJaO7ÝtÓåË—7oÞüúë¯:tèꫯ¦â‰£GyäÑG%R=öØO<±m©£Ÿ}¶·i]H=ßE”m€}RRºú+£åí¦°œÊJQت¾ñb2É<—©#•ª¥@ª˜Tÿû¥%!õìÝ ú_%Yš?ˆTR ÕÖòmƶbÙGR±#˜üNÖEU &Ó¢c4) Kê$î §–Ì,¨ ªwÏIÁq°É3uè[yàHÁ=÷ÜC—鹕0½õÖ[÷Þ{/G>øàu×]G˜®ºê*öDUÔw¾ó}ûö]sÍ5äìóŸÿüºuën¾™Š®W^y…¿”âqU’$%»¾DUHJ¿”Æ–[C¾~:âæ7ŠJz-Ó­®‹*®œ¨ÁSåtï½÷¯Õuè“¢"èìÙ³Ï=÷©"5¦µ×_ýÚž©µT*ÑåÇ×oY×ó¯tÓ¶:„=zôÈê /¼À…”Ý{.=úu{˜]ýù’¹FÃòûØ$OªU•¿{ÆSýX„Ô¯—¤æ„e‘ª*š’€T)©ëIUÕ´‘ê=@šŽTÑ£w4¬Ýa\-¥ûoõ7ø²¦Mj”„a”šÇH0½›¼œ É3˜B§à1<,‚mímòJÒÆ°¨¨""?üðƒu¨Z"=\3qÙD!R<" ò‹,nÞ¼ù­·dÜRÒ}îIFöäѤHéè¾õÛ¨-V7ÄuMTUÆ“zfBê¡’€H±)©X@jfH¹.Õ) õã%™‚¹'ƺJß-ùè]Æ»Jöµ›ŸÇTEzð€,f$™Á¾fÒäó«9 J<ÉX †}ë­·•V$éå:§Nz®«â*’t±9£ŸDŠê*&Eµ)¤•Ôýç´Aî>÷‡IEIí #åê¥æo Ÿ»Hé·¶ßí ÈüFr¤Ô­u˜Ô[u.«è¢Š ££GR…D\x -‡~%Uô“û× ]&|<ƒVN›«»Ï¥Š:ž˜×Ü2žt!eN¤©E%]Q1¶t;µýÅ›RJJÌ9XˇÔâ»HHMg@ ¤:$õÙ’Ì&)ß¹­ ¢ÃS57KÊ‚Q(zK]'ùÉÈMô¬E:/4á_55¹U"¯U ,SQ‰'îG'UÜ›~´ÎSuÄO“I·Ò]è¾´B>Õõž=+ë)‘“!%õ·73BÖbO2Å€(¹Ò}RÉ+nÒùL p • HT‡¤Þ) HH•’ú\If™T´'ܨbXÍE!åk#èÎ&2K¥ñ*b„‹Lôó¹^“bUÒ•.ž¸ûüå—_>ÛDÆPˆ*6t´ ]IËÐ]"­Š¶B–žW}Œ”ôË€}¼TÊ“ÄRúáQ7Ñë͙Ž­hLÉU’,)Zß|“ê¤@jl¤‚yü)ɬ‘»Hu÷.5—¤ž/˜\w¨‡I‘Jn`Fúò»ÑÅ“óÄJ觸Ѱtºñ$U”.¤xÜF›ëpQÅ‘rŠ 18 -Ci%<¥zíéµz"L*«G˜øÐõd|¬È†Nk\:×MRªøš”¶L!U—gBêÛ%)©RR–¤@ ¤@*RfEˆÉô ›>rß;®³£9¶Éœ²†‹*¯Jf<âq†%¼¤„O¦=:x–§MbXLŠŸb@ô“®¹· -ÆGGÑhÍrêøú )ÚkºRQO¾u›îsCËð€Lø.ú\DÞÖ•pÆùØ8 …#ÒÝîU¹åA ¤@ªRß) HHT:)£* «‰ 맨ô¤RÇ91)Í+Õ›ÎGA±sЉt±KQ¥š’DUmT¡kè&Z@³%L|úDz0ô€Õ¡ñÇ›sꤪ(ÝœS…Ôú0Q@L©sGmyU“Q•(¡<©«JR3Gª÷Ý$HuBê±’Ì ©Ôg?ÿ9OiÒGjèñ{Æ“è1ßù¦„éxX¦CÏØ2_þʱ½&úkßúÀÞúûþ{CWÊTÏ¢P>mÒšU_Ÿ”×xÊwô™~™O}U~ƒéX‹W¥{χÇg<íJtº¥@ ¤"¤ªjdR¿Ñ µÐ Œ§o†Cw*·ú²Iž~ØrD¼t›s'DÚPPy¯¹Ç¥pBÅô ßî"ª¢[‹£y™¢ ¤@j<¤Î'EÍ9©m%)ò¤²Ÿôæ˜ÔÎ’Ì)Sì„Õ’V"Pü*=&¿@ mä¼ÁQ(ºN4)—¾¿_~õOÊÌsnNÃzŠê‰22ã|å4¨'£!:nB$ÝÑDÃJ®=¡¦ÕÔ¶²ª@ ¤@ªR–¤@ ¤@*ŠšJ+©ç]‡º+/t£ãË~­ºy¦–ÑÛdž×JwL•aÖ¡;þ¥NÒOê$=÷‘#‘­™¼§Œ!(ŠI5ÒA—>ÒÚSj4‚æ%­}}â°qÇ(I'ã):66ã)/É“z¯Š†•Ru:œWi}}.P•&õTI@ ¤@ ¤8•ù·¾ R RC¦?˜‘þQ»IJU'>^CêîD~mf…[ÃÐøÑ¬FÏ nè‚Æ”‡àm=íŽO'_E *yDIDATyå1¥¥ÌÐiý[0ЧVRòŒOǾBH¥~£¢?nËœTð5x-R Õ©{J2m¤â]| RÓ@êÞ’L)WG™_/Þ?/É“jj©VO^•a´+ëê%]ŠÅðDžŽ©¡¯y@ÒÒR-Pn-çU¬êt[RËþ](÷”"Å7™B*…É?Á¦¨ZΤL9¨oQKäVR Õ©J2]¤FHH5U[Ð.Òð2žt¼¡ÖjÉKò˜¸„Ò /߯Æ˰ˆQkJâó¾=|^Mþo@­JH½U)©t@ ¤:$µº$³FªåÀ¤Ý»5¬šTv»¹‹XIT•YÆHÒS‹ç1é©#R ¬`ÓÇžrI£ÿMñ«Ê?»,©›JR R •HT‡¤n-ɬ‘ò û’ëÜXM*^’Ž'eºÉ£g“¡jL®3¯ATE[ßpÚ*žFÇTò\S¶@JR 5Ès©Ö€H ò\$u°$3HêJ,š—.ªšhòDŒ*Ó_î%E{ÍK0}¸-ƒÂÊ,¶èÛ;Èõ¤þ¦¤þ™–‚• õLI@ ¤@ ¤Ò©³)©`¿gK2k¤|¥c¼V¥(Ek0íÃô{Uf1#IÏnžÂ¤U¦1 «¼&Qå2„›Q•{òûæÇ\dŸyX‰w))+©“%)©RR/”dÖHùîy™nu¥ÇC†‘‰!ed0ñAðyLw%J(ß$¤UäU•'ÝxË‘Å~,=ƒÖÝ…YU R Õ©—JR R •N•©qŒª°hÒ·§:¿ut9•_Ò”P¾ÊˆbÒÍ£¤U ¤*³äpÚ|tÿgÅìžÿ”N™*©ÒFèo©©w—ÄJÌH¾lR Õ!©;Kú1g Y~©nh‹¨bXªtŠúH‰VKž‡ÇJp •©/¢í¤ÕÓ@ª|ók#8FC±/É(˜QR Rݺ»$ RÙf R£‘êßs’Æ›Jy9,å)£DÎ1ž¡ã#sn³'Ýä2°¤y ¡*êi\Í»¬É¾ýè†T¬J“ÚQ’ÌÙÑ–c@ ¤:$ÕäþXìùçU«œ,‚ñ¤@ªCRQJŽ–k”F0ÞT¾Ìñ1°P)IQFSôœz‚I:Îó…†o3­$OJ·Õ±7ì¡þè[;¦Œª©R{Jb-oQ RÓFj™‹)š2RË]TMÊDKIÙrž¢…QÓ‰0ü½»î8¨Í¶“VUCdHEñ&møCostL¿\'µ/…T¨JH](I€(Ýg±\R Õ!©×J²|õDR RcM•‡à©©ä=é5™r/É`O™†”j„ùòc.+-<Žø ¦6Þ'ô˱D÷¥<KH}³$ R¤f u%R¥-|x-E™RÁ<~+K2k¤tu“¢‘q’ʬF{ÒŒ8rü]‰£ÞM[Ê4Å<)¯jж=<˜\ò˜üÆÇå)J'•Ô¾Ô©v%¤n, HT©™ H Ú‡g“ËŒ’º¥$³L*“¬4ãÆ,î1yIùª¼A¶zjU5hÛG ·ùcÅåTfýC{Êr ¤@jàæ=è#,{ø 5)êÔã%™5R' R,,ªÑcº½‰™ñ(Õ$ d¡'Oª³ŒSt£x”Ô ûRH) HTq@ ¤@j¬™{RÇK2¤b¼ò˜ô=<&?ÉeªI´¶ÏLƒ™nU%÷M=R³ªŒ§§ÿ⌎ÉïËæ ©î2ߤž/ HÔ ™oRgJ2k¤N÷O\·Øø3 U1¬&3D¢S¾ðÍ)ÚGWÕ™Â<¦lJêä=ÉcSW€H­§•L[@ ¤@ªdùâÌ©s%™ARѼè’Pu,}È{a—yI!ÕÚ8K^ú±d`HEbË…˜¢ë£§ØÃ)¬Åt!¶¼Hm( HTbËËÔ¦’Ì>))ªÊò+S+©áÚä¤Òé/5O 5\@ªƒ€TÓº¶–¤@ª- Õ´®9&åõÜî¢UeI­c'@j´F2DºÀ”_jŸùûNÔö’€H¤êÖµ«$³Fª{æ—T0ß\’*Á¤Iµ-x‡JùP#’о¶Ýü .OG˜ 71º§áöP½Y©.R Õî’€H и@jŽI¥$%rG"­‡@•gL]7˜!›Xç]ü]x©ó%)¸‰Í-©K%)¸‰Ôü‘œÒ]±”†Ôˆ­eˆ6³DÚVžo×»G=!u¥$ Rãk€Co3º0HMC@ª<4À¡·]xúH­(ɬ‘ÓÅC_3 †ó4®¦RÞfºoƒ£ÜÓ IÝP©±¶ÁQžG§+îé€Hµ)ÑGy®|¸§R•Gӆ鮠IC{c;)o3­x,½ëmµ®Ö§yµ„”;ez, Rãh£?ö®·ÕºZZ©®š}GÍ|’Ûj]­#•=Ås“Ù$• ‘1 H•`šLkãV&•¥õÔú°: bâ¤Ia@ ¤¦5 5 )*^Õऎ•dÖH ‹iIƒzê´·6Ì}-Ìxؤ’zøÃa) HT˜±’róÓÅR R¥¤b“ÿ¸Ì8©ÌPØDËOïÛRU~¥Å”Ùâ¯å2Þ‡™ÙìxW¨¯ÅHq@ ¤T@jôÔ³®HqÆ@*˜ÇÏOɬ‘Š2º+qèS›¤È0…MÛ4ŒübC´ÖvXÚøךõõCì*÷‚ëw)©ÜvAªèפŠq)©Ü ®Iµö'÷2k¤2’RõS¶ ¦wõ’Rº¤UŒ¥…d¶5MRä eoI@j¤Élkš2 ¤ÈËÞ’8RÑ@6 RS“!EžÐXö–¤äI¿×¥SþU‹ííF­ëŒ¶ŠTÓºad64­)ßmú9 ·ÃÚþÎ=žü&¾ãí&×’ÝîèN=ˆlwü;:v}ÇÛãÄÿøÇv³ú9†W:qu×Û]ˆ÷Ob»Åûyñò˜ösô w»Ý9Ne/5»UÿþË8¯Á·»0–í.HkšøvãÍ7²Ýqîh÷g¡¹¢ãíÎq*s±27Œésßlüïs×Û]°­)¾ÝnþL/Õv£Ÿè&²ÝyLµ~”¶o]íñ ³a‚Û 6–Þn7–£ßw¿]½7'»Ý¹LØŸ¥ßð»nÚz{ÜnP)$·Ûé»ÅÄ·»tÏwNùR%÷ìØ›v숛Éo7 •Üî86<Ìóíd»‘íw±]„c>QOø]jòÛ ›Û\¼KémÔR…?ÝðpÏw¶õ‰n7SKÍàó 65áç;—QµTPVu¼ËõÚ'¹ÝøÆ»ßîÒ=_ƒh’ûy^S™Ýj? „ÅÇØ¶Z5?&»]µ‰É?ß…%x¾‰·¥‰ìç¹Mâ{½Å?gÝ|ñ—Zm×Û]H´  <ß%Ønz– ìgAAAAAAAAAAAAA™ž´ó3©"È@)ðRRB±¤d¬)k@ AFˆŸ×Qf§“9Ðù’=·!‚ ±¸yƒ‰eúÍ蜂øTFˆ›–ØNP R’Mý5:8H!H{@ AÆ™ì?¹RR–T÷j)&%èn9Bòà«^k@ AÆB±‡ "‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ Òaþ?ÞqÜ#Ç&IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/starpart6.png000066400000000000000000000526141477365367100224160ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þÐPLTEÿÿ#ÿ59ÿ/ÿÿyrÿ%ÿÿ«ÿÿÿÏäÿÿÿÿ&ÿ ÿÿ6ÿÿ|o¨ÿÿÒáÿÿ)ÿÿéÿÿ3lÿÿÕ¥Þÿÿ–ÿÿ,ÿÿìÿÿ‚ÿÿCÿÿ™Uÿÿ/ŽÿÿïÇÿÿFÿÿœRÿÿò‹ÄýÿÿIÿÿŸÿþÿÿõOÿøˆÿÿ¶ÿîÁÿÿLÿèúÿäÿÞÿÿ¢ÿØÿÔÿÎLÿÄÿÿ¹…ÿ¾ÿÿO¾ÿº÷ÿ´ÿªÿ¤ÿÿfÿ ÿšIÿÿ¼‚ÿÿRÿ»ÿŠÿ†ÿÿôÿ€ÿÿiÿvÿp ÿÿ¿Fÿfÿ`ÿ\¸ÿÿÿVñÿÿlÿLÿFÿBÿÿÂÿ<ÿ2ÿÿÿ,/ÿ(ÿÿÙhÿ"ÿÿo¡ÿÚÿÿÅÿÿÿÿÿ†ÿÿÿÿÜ,ÿÿrežÿÿ3×ÿÿ‰ÿÿÿÿß)bÿÿ6›ÔÿÿŒÿÿâ&ÿÿ9_ÿÿù˜ÿÿÑÿÿåÿÿ¦#ÿÿ<\ÿÿü•ÿÿ’Îÿÿ©ÿÿ? ÿÿÿYÿû’ÿõËÿÿVÿñÿëÿÿ¬ÿáÿÛÿÿÿÑÿË ÿÇÿÿYBÿÁ{ÿÿ¯ÿ·´ÿ±íÿ­ÿÿÿ§ÿÿÿ\ÿ—ÿ“?ÿÿ²ÿx±ÿƒêÿ}ÿÿ ÿyÿÿÉÿsÿÿ_ÿmÿiÿc<uÿYÿÿv®ÿSÿÿ ÿOçÿIÿÿÌÿÿbÿ?ÿ9°Vô) IDATxœíÝß\Õp$¤ÒÙõ‰¡ºÅŸ•˜D©1›®+¦›RjÛ›°h Ë6B…m6Åk$F7Ù lŒhÄËÍRv±u]Ì>©­K³$¥[wËnè¶.èö_ðœ9ß¹ßó½ßï9÷Ìï™'ŸÏëOž™;÷ÎÜ9ïyæü¼—]† ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆ•ª,ãb74óLu—Úâ™ÔÆ75ÓÓ£sQ{¶Ž‘r$ä ËÞN–»\¼xñœËîÝ»w¸lmfGÈî³uvsÄjó¼ç7®q9#²&díÚµîîtDµ“LΉÈûv[¡Ç,Y²dÎÅ nÂiN¾Q©7‘Ï1åÉ:SB*}  ˜T©)šRÿ¡$£#•ü=&Uª/RUR R¹ãôFÊÿ9©©%õ¯K2iR寸”ªÖ¶ ¾{˜¤žiªº¹NWTUß"H4=R®8)Yð)­$W`Uh¯Î‹cC¤ž‰TIR9¢YñQhwî…û×ï΄?/îDÑi6ß%õ®ÊwNf)ZŒ¤Ò©$©[@jªIý…’Œ””½ó>Šaq)•'¬œmjËžHõÊŠv"ªS‘¨¡’JÔ£ UQ œ¼'—3ì‰YqujmP¥+qfZž_U É «N- ªöÖªÊëËô¶Ð9¦“»·>³uyþ³% ©n›9Hej‘ºåf)ƒTôH% R³FêO—dd¤üÿ@*{T©žH¹ÿ*/†'$m¨â^v y´g%•{ÂüDoN¥¿ë¾H¥H©"Ý©ÈRÍi-õI)RÔDA[ÑczU%É×»¤Wæ·t¤.†& Þ@õÖ¨·LZROÓ@ŠªR R‹ŠÔŸ,ɤ[ü@ ¤f‡Ô—dÒýReÅÝâÔ(¥ºt'ŽÑ ˜?í¹œÔ â‹yþ9Rï:‘âzT’§Å’ô´£™­–§RQ•JÕªr¬Äӈ̸»éeEã’BuêÉÀª¥TÑé¤!]ÃTÕF)ZĤŒ)$ R3Jêß–dĤ¬ÝçK|ožŠU™»k?LŽTË¡x'<¤ùI‹ÔM)V)9}ŽšÏ)Ç£ŠgRªê"€|LJUêA‘¢íoJ…wǤh]ÔhA$E*ÕXÁ1-±'YJµ%ö¢";w„ªîåL"–§¨•$%^>=Õ«ä4¬p¹"dEÓÍŠt¦‡THH € ¤@jÑú[%y‹ŸþC•(:&©¨Ù!Åft3„5ˆ.W‚s="®=µªãJ–f> Ùã$€S“ÙÆÀΫhd53 éõðð………)%Å)šQR¿^)*%õßK2%¤LYR{«rU†žI)¦ªäAŠHñ)ˆ^;‘âkòæH)H)K¹ÒËŽRƒx’iªêÊzZLnOTgÏÆDÄÐB&l,eiáî»ïÞ¹sç4‘âE¢rÍ R‹™Tr´k¦êÿç›'@ ¤f€Ô.I5DTÑÚE¤¤ªR²J¥†'YzÌÈÒžQ•dí¬”ÜÐ$%^?=úàÁzú¹ÎŠÞÒL¤Ê²´•)AO7ÕžTÑ5#7YÕô-UE²¢jUfd»lºgÒæ³±@´y²HɇÞž‚þœÈ˜ÉŠqÉ[2ÍfÇÓबN*eÉgÓ¦MQY±)YW~z]Ê HÔŒ’ú«%1ëR£5R R}¤¹Òæ ÉJ’z’ê±*ÍJõ>Yõ¤Jî‹Õ`¤hºïÚa_{s##Ú(ªNÜϤéÈ"­ºzÌâyw*š˜$•"’q‘c³¢/nÞ"uÞJÊÒÎàiS) ©?_’‘Õ¥@ ¤©?S5zB·ÐõIª©K‘Ôð2tR'ãå!÷ZQ¬LU¦3Eª…•FÜBŠ÷ªHÝpƒ±V(?š>G–‡¶ j 0©éÑx=ÑÏ”B$GÊ5*ìùâækðî6*·þ1´¯UÍ(¥´gUƯP±DR í)$³Ab“‘)!•HÔŒ’úS%)©KTTº2¤¤¬#™ ¦³bUE}N.Eêdº.e†íèãpÙ½{·´äͬiFMÏCzØ’®†XEjO‘¥uÍ,·•@ªªãö/÷µ“SWÍš…> OØË82m³^½¸šÔ;JRã åë’ 5VRUR‹˜TRã&åÏøðIýÇ’€H-VR‘)J”.&u0ÃJ´PôÀÊ’•"¥Øl¡Cýú#ž?À’%KvOŠM4ëܽ'Çìqc„ªË/$•:QÔn yÖÅý –Š»+Yäéî®dÑ &\ú9Hà©î¦XM‡”bm¬$Ä“ÙÄ7ƤþMI@j¤œ©>š'@j0Rú/H-RÑÎAj¤^·D]¢¤rÕ *˜¤*EŠYµ‘eܼ¯…Ô\‘7LRÔ!uöìY?ÔHZJÍÄM 5ZÑ:lÇôD )òrc`U©š¥w'[ñ°gO…„=0®¸žUWµ¢®1óî…x¢® )ú”¸éåDž˜Z<«÷_–dWA)šQRÿ¼$#¿ ¢>HH †ªßå\@ ¤¦‹Ô?.É4\²­ORíª Z(¨Œ§îË‘š!ǽ’"UØ3ñ”ŽsadŸº§š ž®çlH@z:EðTniÁ곉J^ø…Lœq¿ù;¨•‚ Pñ$K§êÐÃŽ…¸±¯gëÃÄ*4—]¨ZXh6[D¯§ù’¢:Ô¶fvF«ÍN ©æ ¶ R 5ˆ'5ù¤@jFIýHIÆÖâ×Çe2¤d•F×lööÒ=• *Ú“ZΡ«êÔÉ:)Rfü–{;R~/uH=Ý\JR6R3*¢QG¯ç'=páS º¤6Ž7¾’ â‹ûA¢ÉEWB"Kîaûê ¿Ñ¾NHd\gŸ¨âuw>;n(½/†Ä{®Ëð+É”\X¤@ ¤úHHõ›ªñ¤@j–Iý‘’Ì)¥J’ ‘*nUèÇRäID“ ªæD ÅIåIÜ—ôš&¨mbÇŽ~ ¨o‰Èt<™ŽVˆF =Îí|§G’2‹!óØTñ\¹ð¿9TL©Àr#Æ1ÿ€Õ«W¯¹êª«üÕ!lZ0ˆµ„¸'£{©š ÑmQËÆºfTÓCRæUEAªwRá‚ÔäIýÁ’Œç¯HHŸ”éi`RBU¡¬<§ˆYZâÿYW§’Ó†[HÑÆ{ëŠÔÖ­[½¨ãÜÿ¤{šˆšs\Ó¤T]JpÚ©H­«=ù’M•(WèI±ŠªA éPÿ¶:xú^È… ^t¹÷Þ{ý÷Ý~U@FÀÜâ.0®Ki3ŠHKç– yrç¤.ο[’)jñ©)gj HTriuê™Ôš5 5 ¤þiIFG* í3Ú'n謙”â¤IÒ‹Iµ°2+Qj—tã\¨O-á„ãÓ1ú%êQs¼€Ë™3g¢ÆòLC¹g^5lG×AÖÕÃJ¨ ùø‚ïø2›’ÕVOîa¤íÛ·ovYâ~»—t…x]n{Y_“ Rf2dó;ý“-Ñâ2ÓB*))©ËªŸ)ÉÈG¢_¦*U R3Jêï—dĤ‚(y2LÊÓ3ÍY)RÌ**ÿeª,NrÔS©Ð=åïfAú8'ÓñwŒ¯*àgu?~\ÍÐM6H0ÙÇ$§n(KäIYŠÆÝXOÏ +Ô«ä8ùï ¾$ñ#Ž$CŸ]»v©çBæççýoîv/‹~¸íÃþ)B¡Tå|)HjV .¯è,ó9m¤Ôß))@HÔ¢!õwJ2rRU—ÖðH‹dš¤æšÒÍ*U*–%ÍJ’rVµwoÝ=e&e‰TÏu®!JRgBEJÍÐMv>똋¤ ‘œñJe» ˯¸Šõ*‘¥Pòß#R²ÞÄá!HW…‡KRÎRDÊݸ+Üç„Êõ}ùgÃÌÆðƒò¨Éýˆ†ç¹n‹î˜½ÐA=NOäŽ;î8pàÀc.×\sSµlÏž=/…¼áâT‰.«n•Û³ïsÏÆswO›[)t»“§ìî…æÔø4©¿RZ|¤@jñ’*®KÔ0I-DwƒÔIý¹’Ì@‹_ÎÓ“Í9R«O R®º…Â_fÀõ“¤¨l„‡nù¡»Õè½–HRr9YJèXÚ&¶?éùÎ¥=¡YáÕ`@NÔpÿò£ôÜ]¾ãiÆ ‹3sÀÅArœÞæâ~øV wÛµ·¡gÆøEM Ž4uyîîù©–v‰R*SCªó$¢ÿƒHÔpD Ø/R 5%¤¾P’™#•¯Nå®6•RuÐðTURëU0ù†®'Ç îjT©èàå¤ÜŽˆÏñðs )êgÚd]ÖjtÈŠœËÁË­s9¶×‰–3 ^uÕ#O*xÙª@Xäÿéy%…ì¯ã~YJõ©æï[¶lÙ•IêÅε}/ð²IÖçK2L*œ”¯þH5Iýû’Ì\]j¤*)‹ÔÏ—dô£'T_¯E*ÅJqJU§ú~P¤ÔÅT§³”¬R‘,Y¥RÏÞXÒ¤h…LZÎ%"̬Ñ£Žž­/*›Ç9òF^²œÚÌ£ñG!ÔBî›Çi%–PQòf<©e!·†ûJÔ5×\㕼-Ä!ò¿¹³aP’¿ý‘GyÈåÊ+¯tÿzÄÝමÆíkh4 i;]‚4T©¼ÿSkO­SÙÔ\(“C•®óçÅÕ¶ê§‹”‘é'•ùâR R};)"R?W)ºäI™ªŽ£ŠR-{&’à•ó§sLJ¨:'Tu[)z!µÕE‘òo¾+ r¨‘,HrüÑ©ÎõueW“NÐÃŽ.„.(š…»K4J<Áá©¶DŠ8]˜ðo×ðÀ£Ðöð¹Ðåû œB/Îmè[) y¤Žwæ¶âßÇÅã’è¾+ÙÔr,\ŒŠ>j,R+ÑE)©Ñúg%)©RRï*É”²8õLJŽK’<ÚUéÇ(R QÂä HVôY¥RÕ)"µD„IѪ.Š”¯09KW]J®I~¡1긩CýO›Eˆ¯UN•( u>ùN$Zž%ô=yKNŽÿAQKCÜo×ONâž°.¦ŸËKþÜc¨³ŠF)9t´€&ÍøõGä…2/„O„0,=êm#RrØ–¢“ HH†ÔŸ( HHHHåH¥E‚N´†'ÞFÆÌlª/—º.¾¨V„+ª…}Q{9­ËB9*RÑÃ"]V²=ýõ×ëâü寔<HHHÔeÕ/”dZ/B§TDêèÑ£þ}v…Ë£X¿~½ÇrÝu×…'ߨBžÜ ~\’ÛÂ÷FÝ‘:!ÄÉßèØÈGôõDñì]îÒŠ\ª¦ú—jž8e…lJyRÓ<Ö5#o”½Zig=×3aOÁŠ+®)$%R 5£¤þbIÆÒâ'o)!ØT IDATšQR_,Éú¥ŽÄé WO¤¤ª'Ý!¥,µyb ”7ò¿6F¬”,±‡è¡;â±Lt÷GÊ—W6}?|øðuaQpºÌÒ–-[h™qºÚæé°J8wEåŸH¹ÛýÝÜëäôìG"-]ºtèŠò¤\]ÊÝæË2MÈX¶lÙ•.î.ãå—_þˆ‹ó¬Ì‡¯€›¹–Dœî Ö.„Íx $CõœNÕËùËî!5ñ–Š{dÉ,îE‘¸"`\ËÐô¤èr¢-ª R­$hž˜.RUµ(HùRMRU_¤:¦®©©%u™<1]¤|ùY¤:§r¤:[Ì·“ºÀÓ Iù_¤~¹$è—š&RÕ¢!UiR/~îïØüü(H…? 5QR¤ª'R–¯Ü&9Rµ*›Tª…Âô$I­1‘RMw‘:XÑ&dÓ½ÿ¾-Á‘¢~)GÇ“:pà€_©óJ¶8mKï¹çžßwùÆ7¾ñÁªúà'>ñ‰O¹Üwß}–ï~î¹ç¢Ž'jš Ò!õgÈ O¢¤Œyr”ÞÎzŽrê0Š~X)!Sž«×+í…EbVîý¨I½¯$—8)û‹ßlòOIí±H¹ŒÔ&)&e6OÌ©ŠI9S[&HjÛ¥@ê¿–d¤\Aî³:ÕS6cV§–43)‹ÓiFDó·ð×w/‹+]î=ö \mÈ:ð¹"åêR4¿÷³Ÿýì']>ö±ý¢Ë»Þõ.ÿÍþK_úÒû]îºë®|ÐQ ›šw¤hœÕ§|Õ‰—9b7Ñ8f›JÙ8#.ÜÊ ýr…ˆdU/@2ó±H­P×ëå€HHÔ ¤®µIUH‚Ô %™)ªOŽ”¥ª`EO¤xÒm—W§®™£q”17 Šö?Ü ´÷ûQE×]w·ä*E<ÝÃr?|³ù·¾õ­»¼óþ¶~ûÛßþC.Ï?ÿ¼{—]^v5ªË]\u*"Emæûöíó£Çy­rnü.ó¢ØÈ¡CQÉ^h6i«%ëŸMTLg²ö&ö°‚“"7¢ÿõ’€Ô" U…ÿW1©*"UHTO¤* ©_- H-&RÑ¿ñÅoq’ŠÞb¾Ñ•[R¥š(R6Úú ŠYí­“R%çx @Jt:=ÍfŽ’n†¡Û¹nìíÞ`ÏÀix« 1r¸|7TUí¯tÞå ½üS.ï~÷»;7|ô£ßþö·ÒÅ=Ì/¢D³:V®\黡N5/™Ë ;ŠLdOPîî–æ†+DëÔÅ‘V‘ÎZv`JŠ›'¦€T4¹ƒRC%µÿþ SþïRƒTUÔ`¤Þ_’±MA©aò84)[TUyRUÕ%ÕùRƒú@I&JJK2-µ:/'¥ªSª‡ªeb¯I*5=WV¤'ÉJ¼¥þOê¥ŽŠ¥÷ßÿg]zè!ÿ7ëSJRýGëk_ûZ}ã—¾Ôùqç÷ÝwŸ_æeóæÍBo”xä,)D²Š¤¤,X9/bnRLJyKŽMAŒ/’•:QmÒŸq uÉ‘jxúîw|ðÁŸéüóó©/Ôâ ÕR—©I½”!õùσԨI}¥$X}fHù§>3¤>H}—I}þóüµÏ“úèG?zç 5󤌄¢»Üê×BªO\©нyR¡,v=©¦‰.)µÔ‘Äg6M¨7_¾¥´ oì;‘èúo¾ùæg\ô!1oÿ¶Ë§>õ©»TÕÏú€·Þzkô}ðïxǾð?í®»îòSCÖ¯_ïIíÛ·V0§`´›Ð4¸ôÒ ç3IY’TŸ‘ì=Jà³i´ö=T½t©I}°$ 5Ó¤*Iªª¼¨ªòÂ$ê}DªóZ ¤Ô÷¾™!Õýâ7½¤ê¿Ao¤øRDê}ïûõªúõ@ª©Hý’L`Ñ1AJK*ðÔ«,U*¨O ¦ÎfHqEЦóRÕéx<;÷¸ô¤HåÞ]!ί£ríµ×ú‘H<ðÀw\>Ðõó^÷¾ÓÔĹçž{–…}èCúÑ­o¿ýöÛ_yåW {è¹çžó#‘:äI…uÄ)&*ç)ª¶£ë9«êºLKµ)SÕiðÉ|©ñ]¦¬ÜgYT ®3U¤¬¥1g‡Thñ›vRï ¤*)êžÎ?öï©!’újI&°€3H …!ù¹÷vHÅ ~ë·¤ø®Û« ¤@ ¤,R• U5IÑ?;¤*šeRæ?W`—Ô¬º}S5«žH•ÉJ’RCýTEДܑ:^ÏÐP•åèݤt z¼îr[Ðí¾ÍàÖ[oõR?øÁj_ÿú7¾ñ ?’/Ê­·¾å-¼êòÐCU3_{‹ËéÓ§ý%Ž;vcè”â|DJuYøWˆqq‹¨Â*_ªjPœV©´X¢ˆF!S•|zj'ô1H¤|kSX ª.Í·•dÍ 5\R‘ޝ·“R¢@ªoR_+ÉFO€Ô ¤ªªwñƤ~¢ª~¤)#¡¼²ªn÷ÔðIiK-¤¤ª)Á©»:Oâà·íñLråÌÝÀ÷EÊÝæ+1÷†ë©uó¾÷ù5®>ðüH|ë[®¯ÿyµËÒοîwð¾øÅpë‡?ìIÍÏÏÓšHžÔ¶úÚOÔëôº¤ŠüÃÍ*ˆYmT'ôŠ£Z×qí)‡ˆÎYêäFOÃ"¥eY‘¤xm{ZĤĸ.©ú†Üc!R¯½öZ“ÔìǼ(ê—Ô‡JR3O*HuL}®KÊ›º¿K ¥fšTüîƒÔpHuL½ù替d‘êþ•ò¦>Ǥ:§)|ñŒÔ‡K2¿R®¤^¬YQA–ÝS}¨Ò¬Ú9µtMɉòª3jãFqa§ë%¸èäd)Rº³fEܳãI:uÊ_íð¡‡òO/¼ðÂ/TÕ/ü|ôÉõ~¿œ¬ÛÂ_ŒÀ‘ò/¿<ÜõòË~Y„@ʯ£éxÒ y¿ÒN±¸÷KIK+깋¶椆ÇEáBN¯_7C¬å_E>‡ãÍd´G»”Íîm®I}½$ 5£¤î¹ç…°˜X‡Ô'IuµuHý2HM‚ÔÈ‘TO¤¼‚©€åçYÔûý•MR/R¿Üiž©±’Rs1†WDi¸”Õì¡:Ø«vR{U”'EŠ%)ÙÅÓ9x$’$%+)RôgHýééçJ¼Ÿ±eË–o¹Üv[Ðòž÷„åe=–εíäž"õ‰O|â+_ùŠŸÎsÛm·yqW]u•ŸÎ#m²HÕO¡Ùg”"ÅeÙZ'ª1¿Yžu†R…_Qš‘ÇOÉÊQ£[lR- HÍ0©Û‚("õÓó;¦Âht‹TUÔXIU£ÿâRC#õµªúš'õN"UuIùÿÛ¤ü/ Õ'©—KRSNêŠ,)—)gê§Zü‘êš 7ýN—TRc&U¡y"ôóœå`fU$¥R9Kcü©hNýéO¯wqõ¨ua]¤îDÞ…æ\^«ÓYÕz$)͉‡õÈSVŸ«£“.ÝÍ¢.-™l'Œ½Æ&á @*Q’)"ØD¿m¬#ßwƒ‡çx"«Ipš³ ÉU0£þ§5ÍÕ.ùí6ßfU7TCC’㤧¸M¢S€]ù_·nŸ‚»råJçâÀþýû7¸\{íµË–ÑèUh¯¨~Ã%´ôùÿûÕž¿ùÍoºwÛOç}ê©§Ž¹¬ó÷ìÜy>¬„´ª^êˆ_fô Ž6Û:Gél09‰w/GªÅ’<㦥RJõHónZl¤º¢4©ªj’ê˜úUOêöNKß'_{íµ4© ¤z"õÍ’€Ô “ò·©ßì’r¦~5ºýöÑ‘b—©;K2RA‰²$#UÉŠ ½gîn_ãq.ä°¥T=ª`ÄêŒè:a\ÿñ?Ü QEâx3Ì*"µ¢^¼¬ *T |á÷–\ýÇ":q℟cxõÕwÜqÇž={h­ôû]¾ÿýïßâûô§?íT½v×]w}æ3Ÿqî¹÷Þ{ý*è¨ Sw1ΧãJDãÂÍÑÝüvd†ÞÇ%Ÿ¨ÔçUŽÄº¦ÙWØH•¸.R‹…”3µn¤üæ5©m^HÔ¥IоñY¤®fRþשJ’Ú¶R=’úVI@j†Iu"IU¤ª ¤)>å)9Ì/j,ç.¼Ö­•o]Uzd{’–äè=®:Gï3·.¬Š—rô ¤5‡ò«ZÎÏÏ_ïâp]wÝu¾9½CæÊ+ß ùýì÷\zè¡-[üý‡WûÿwÖDòÏ4|4<|4^h­*©²‡wŽÞyŸzcukk”¤THÎÀZ+’UÊÌî8 u)“º2GÊ™:|¸©¾I}»$ µxHèˆÊ‘:|¤!õÉ’L€”uòMO¹™kâïíþ¡®BäÍÌÕkÂ'jOn¯¼K¿/õ«þ$5€èu–E•fp£È:š:ËDø>ÂrìØ1åPůWI©·x6lás(xò—†ºp႟¥ñꫯîß¿ß÷8¹š“×ã}Æåð¤|ðÁG\œ'gÏo,ôr…zÔ¡õ8U‹ ‘Š*½âv]/–Õãµ¢{ªT®üo]–––´½TšVR¡§vJH;æŸ HõAê7KRc ÕýR Rà UHšÔš¸ž›$%&ªëå‰ä‰ »CCÅò"Kk­w69.O’²¢9î¡WÉ—YÒpâĉ©'"ûê qÿ"%»\\Áßìâ~s·ñ^Ü÷\¶oßîÛî¸ãßå,]~ùå÷O¾]â?øŸûñÖ·¾ÕQÛÿØc-s¹îºëæçç_t }RÛhpMÛ8ÞY òLK!ã&zËv7/¿ü\Tïãšf÷”Ù/•1ÐèîʨR÷ño-/“R“º«$ 5zRÇ@j‘úNI@j ¤ŽyQ R£Ê™æÐÁJ’:›X¥hÍc(>í‹dÉeŽÌ ¿¥l)"¥&¸jH"Ý)¡Ó‰d¹ì!9^Ã…:î?¹ÖݾšêFa“{]§§\\åçúë¯÷ƒŽÞxã Wezõ¥—^rŽî¸Ö_Eªªœ™Gêø)÷ã!—¥K—zD6lðkŸ»J”èéÓ§'ïÒUÒüÓsÏ—æëÒH$.aªH5b}ÊßÎ&"eñ§šAT@J>!I*õ vdnk½`ºDHU 5nR¯•¤@ ¤@ ¤_üÂè>5©O•d2¤ø„Ñ«HµRDo…"%ß ù6l UªUƒ6aHÒ’l”P³Ú¥žT˜ Ö£Þ¥¡‰b_hŠpÜ·Dl߾ݻ*Äý‹HÍ»8O<ñ„ÇçL%ùÝk;¦®}ì±ÇüoèüͺæºÁÝ»%Ä|ÉiômîPN®ï Mçypßñãñå”ÌRµµ™õrU¹œkFÊR Ef H Uɘ;jáž!H] ¤\@jì¤~§$ µH˜]Rþ™ƒÔ Qß›-Y»U¬ºÔÓ¢[ƒG¶øbÂ{¥óõ? D«DtÿS³¢¤ÓàQÏÙ#”ä(%`DU׋÷Öy‘ãX§]­ÊÑxcÏž=w„Ð~¨ÂtkUDžÍœr[ùj˜Cé‡!¹ZDz=T¤¢)‹”B…8™`ÊXYa]'ãƒrM"ÉŸHRU‹'ñÚkR÷”¤©[·(RHH]r¤vQ R 5$R;:¢f…ÔO–d¤¬n êqçR¾:zMÑùaKf—ÒÃuBy9.7VÔè=³ ‚½ÈuŒôÊFbâ;ý ‰§xЇ&½»O²¶»8HÏ…<õÔSO„«Í›7»ZÉz4¬„D¡'_YzµU©'¿‰{˜ßI˜!²Òq¦5‘VÕWs)LRMGQ!ñ¸È±ôæl½:)W™¥SŠÚ°WVæ.A ¤@ ¤@ ¤f‘Ô÷K2iR+!`32¡Ènî¾"^{r¡³\e÷’™ª¦$GqȋدI¾­n—«°<{£X¡O„¶Š–³ä鼫CˆÔ÷B.ˆ®P«òcÒ>ìÇ%9(†áéOÇ©rÿ§6v/ËýæCCÜ¡üñCëyT‰:š¾4”&¥<)²¤®Õ%¹¥]¸º]&œTqîÎð(‡gɪIý^I@ ¤@ ¤@ ¤@ ¤@jöIÝW’‰‘2»‡dËŠz¡~ÕÀmŸ"ÂѲI5œîSQnÊÕHÔI½Y)ZT¤R]Jš• “2+Ef,=ë8T=’+—3Ær‚¥peÉÿ8‡ïj ª¢î)ªNÑTßÍ›7ûÞ¨Óux\R¤Š®ãn÷þÜ#=H·WÔuKIí óx©ÇOç¢a[\‘bN;v'fîªzÔrÛPf–¤îN]ú5Uñ*N)·óšÔý%)))š©Ï”¤@ ¤fÔñxIÿœ*ÙKթܨ» H’º1ÙBDèB‘™ K“²ŠìžbUó"îF·ÛJÎ q–¼T·ÿÝkñ'D,ˆ$IQ¢)[›í²èž§t$II -™kb:X§WnBˆiI±JõDÉÔ¤./ HM7©ª©é!õ`I@jªIùecA ¤ÚIIUŠT —´$&ð.È) ’š”ŒÒhÊR=N«….w9’Õ0"¥"‡'…U’:k›oãoçëQ1F:ö¡àIvHù)F"Qôzô;šCT]ê\¢"5g%HFY:bÊ¢½²,Iа´yÚ‘ÁR—$©ª&)º~HµzKI@jšIíJ‘ò·TR u©Ún“ª@j"¤>[’ÉLîàD-)K<èïus£§†'½J’eLö\)YléõSìuO•诒­/úÂÞi†ðÝV„hõêŽL{ #º§æŸshšè..˃ûä%pÝ·¾­áй;vÄ`AªC*9¸Ï“¤ ±%–%Û+–ÔC£î©>¢-‰™# µØHUŠÔê!“r¦¶rA©©‡JR3IjuGÔðHmÝ R‹…”deZzÝsZX°·´’„tw|YP¹…¥ª±B¦œÄе\2Éܘ·’…£ª–çþ™^<â‰õRçšê¡ÕÒq¼¾¢€\“ ÒnåIe0R¦#¥çI+\³"\Ìj(¤dÔ¬ášÔ•%©é&µÒø‚R Rý“Z©¿àHH- R”d¢¤¬Ñ~Ô6M§X¤RëËJc¯=+ö£w”“ÅUÔöàÝÔcõ`ÁH|:ζz¨¡^‚)˜9ƃ©‹=x¯ôѱ¦tøÏ¥ÇãK³IKÜ¥'Reªö6£9™šª¸­¢ÛXA=Tî )3Ã#õÖ’€HHH”"%—ºgYs•JMà Yç{É‚ˆ¼OÕ¤DMMó”ÎTÕMãcn¡ÔKË~—²²ölsi&%Hî•ê‹<—G"ÑÚ—æ´UU‚¾…†'eªS¦®D/”M꤅‹«TËC}*6%žvWŠ |á1©·•¤@ ¤@ ¤@j"¤>W)ZŒ¤$.j¬X/†”ꡲ“¨îæ­$Á$J¹ûãYò=·àU“’á†eI b¤¦Ž…àéŠ0¥ÃŸÄ£apçë¹XíŽÛ,„ª,+Aê •rR =Œz¨–ˆ5iÕä~NÙ«M“ZZ))©‰Ú_’‰Íê"Wj´jV«”®–X“Õí¹ $-ˆÈ×JÉ#êR¤H¢¬žq5LteEu¦®¢ºg‹pû§A•(‰ä‡!‰%[tòŽ¢˜¤LU=‘°ZT‘¬¨Jµ¼îž2Óâ¬HHHåIUHM©ÇJ2RjmÆ )óò£L %$y1RNj ™ä.M¢JÖùx‘NÝŽ.‡!¥>)\~""·’ï«$:ôʨuüx}ÉPkйHUå=Ér™«Ke$•‘Ò¬ži†jUAÕÁ¹ôBœô ËeI]SšRÏ6ÔV_IDATÕHIù€T)Ÿ<')"›)‹Ô’€Ô¬í?šeRîMÎ:*"U±›‡Ûóx:êPt¸”£)ÙŽ 5#…K9ë좪¢Ž'9œ*eéé0‰W]@ÀfãEeiO)Å)Gª…UŠ«j´RX™›3.xe˨©EHJô厂”R¤®- HH•’ZV’É2UY¤"V¢VU ÄÜ ß zÇ䯑*ö¢:¤žjRÑBs<Á›Î«Mê!NqÇÓu%’?A´%ºÌ × Œïv7AŽEuHµX*«Kµ‘º!ެR™¡ã°.]Ébc²VR UFJ™))š© %©Kоø-bRg”¬T?j´R˜lL)¼¿è7:¢õ"R«×·¢"mqа°'©é1±ò&fÇ¿~ùŠøZ¡Q7”/&U•dÓz–(H¦%«•  Ò‘æ"IªOê+ÜJ‘J„+j°‘¾TC…AjKI@êÒ!•ý›R R 5nR·–dZIIVfEIò¨…4"wžÚR’²s•=4IYU¤ÈRêѪ›MuU=C×|¼Ì¹º:|ÔÿÔB'…h¹ŠYoJsÒ— MBz2=‰ÝÄ‘²R‘².fu1Á ¤@ ¤FCꎒ€HHHT÷æ—‘:nõRYµqY¤è7ó² 67ÔeòiÏ)GŠYÝdU©d]ꤸHU¦JR R R 5¤ž(ÉdF¢«Âm6”·Ê•ÿLÙ×{ÈìŽx´àж´VO‘|Êë-•%ëI±:¸<€ªÿä*Kê ¥öjnÿd “õ:ú·d{U*I*sæ¢W¦dŤž* HHHHHÍ>©Ó%™Ø¬^“ÔšæD]}Ÿ¢]U$«ÅÒŽâÈÕp"êäˆR¯YöÒJq5€õŸò}µ¼žvN…ú %O”:÷Ñ <(¦úU R 5RÏ•¤@ ¤JIÍ—dJH¥ª:’?®€”¥*g‰<íî#²ã‰jNdé`kS‹UÕ0« W²è´É=¬ í¯Î|-ÃâD¤èÑ9O©Ï‹¨ú9×¥R R R 5¤Ö—¤@ ¤fT“µÒ%Y:S/µ?RrKnc0±ä"ûŸ‚§È’,g}°)O °cƒ§ì“b(žÊHñy‰^|æ³DË ª@ ¤@j4¤6—¤@ ¤JIm/É”J|³.UæÉd¥IGgÃ…RlTÔd\ªA‘%]À2 ¢2*`Qý W`½²RÍä6ìéc£GNYRán:QÑËÏp2OA—ÕÁƒ R 5R»JR R R RQR|Bù—ZZ0Z8ɘ‚ÊÚLH–%j”È9jñ2”˜²,=#*Ë3ÅžR¯ 'Hj+> Ñ ¤$,éó¶ªIÝ[))©‰z±$“!Uf`c~B†µ½¾QÖ™,)m–.IY¢”.Ke&U6ו‘5ì{ê•“©*wÎøµkUí'¼1HH†Ô…’€HHHM„Ô÷J2R‰yç2‘’H©ÈÖˆ³ñ`¼n,Y¹fNÊÒIQŽútÔ¯±–’%`Ù²ž)J™¥§öO¡õÂ%˜‚‡  ¤@Jn R R…e¤²§g褮*ÉH©V¤¬”—\TÍ)â‘PuNo© ‰+1)KϨb#ßòä(š–úA¦èoiÊ]zt4Rs“¦ÒJjeI@ ¤@ ¤@ ¤ŠÎ HHM5©Õ%™)³Ÿ3ú‡X–å%’ˆIJn¼¼¶ä‡ü[–nHŒ”ž„ 䫼ŒÝ bI–£ž1 þRËOHHTA ©Æ é‹Ô¾’€HT)©C%™ ©‹‰H_²Z%¼$#l˜44+N™%ÎBœŠ-}¤(}Êj{€*¾ºð9£¡“ùìÉ}dé|³q))©&u¬$ uѨ٨N¬v[R•1ébI³ÑÛfÕÜX>†-ÑØ£œ%YZÚÞÚ>dõZÈZTµ¤2CâÓ«'ë<þ]+|Žo¶dHHHÍ"©%)©RR§J2R¦'Ë×¹f_•¤£Z´"E*…HY:>*°$ßû‚w˜ßäV½¦¥”öêlØdÄ3ìçõ•ßÔI§3}‚(V R2 5DRÏ–¤@ ¤fT¾J#Y™&¹Uª´·™ˆTÑöÝðØ#³¡Šˆùv¿Éý¨jÙ~ÀR_äbŒ1?~Ô©ü•–ð ¿¥µJR %RÃ"ucI@ ¤@ª”Ôº’4IUÕÈ‘H ’Ù"Õñ4jTªX[aUÝ^*Ñ‘r‘³‘l|°QhÚ.µI´ÔÆSï|§~T™¥«LâhõóPž"K­˜ª Z)"ý¤@ ¤$©M%)):!£ ÃY¸H÷*KÖžZxŠv6f¢ëO²8µ”±ò·{V)O#(Ë©džÂpžTj_ý;J©ÊU©jÛJbðuûHÔ ˜©nlJÝŒ]HÔÀ˜©%Q€FßQR 5èf‰Ôº~÷Z-V”,ö”l_È ’–ŽäC“8d£D¯Å ì]/ % äH q¯¯±Ï}î¼›ö"Rþ4ŠŸaª”¦Ný€ôžNzŸç¸oRE©wÞM{)ÅÏ0UJS§~ @zÏ'½Ïs¼ˆI}$©¼¸÷ôNµ—Ò±d4žzzF‰¤·Œù¬–{ ¤\9íž3ûJyÍ€HM8c>«ƒ*z RΘÏ*HH õ¬.FRVã|!í¥~´oØ0ßçž2&NfÔþrg5÷Ð~2ê³7$RE¯¤Œ ë=î9 5¢³R RC={C"Ut"'@ Af3UY&ý4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA†›ÿu«¥ç¿¤m£IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/starpartfinal.png000066400000000000000000001377031477365367100233450ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þÐPLTEÿÿ#ÿ59ÿ/ÿÿyrÿ%ÿÿ«ÿÿÿÏäÿÿÿÿ&ÿ ÿÿ6ÿÿ|o¨ÿÿÒáÿÿ)ÿÿéÿÿ3lÿÿÕ¥Þÿÿ–ÿÿ,ÿÿìÿÿ‚ÿÿCÿÿ™Uÿÿ/ŽÿÿïÇÿÿFÿÿœRÿÿò‹ÄýÿÿIÿÿŸÿþÿÿõOÿøˆÿÿ¶ÿîÁÿÿLÿèúÿäÿÞÿÿ¢ÿØÿÔÿÎLÿÄÿÿ¹…ÿ¾ÿÿO¾ÿº÷ÿ´ÿªÿ¤ÿÿfÿ ÿšIÿÿ¼‚ÿÿRÿ»ÿŠÿ†ÿÿôÿ€ÿÿiÿvÿp ÿÿ¿Fÿfÿ`ÿ\¸ÿÿÿVñÿÿlÿLÿFÿBÿÿÂÿ<ÿ2ÿÿÿ,/ÿ(ÿÿÙhÿ"ÿÿo¡ÿÚÿÿÅÿÿÿÿÿ†ÿÿÿÿÜ,ÿÿrežÿÿ3×ÿÿ‰ÿÿÿÿß)bÿÿ6›ÔÿÿŒÿÿâ&ÿÿ9_ÿÿù˜ÿÿÑÿÿåÿÿ¦#ÿÿ<\ÿÿü•ÿÿ’Îÿÿ©ÿÿ? ÿÿÿYÿû’ÿõËÿÿVÿñÿëÿÿ¬ÿáÿÛÿÿÿÑÿË ÿÇÿÿYBÿÁ{ÿÿ¯ÿ·´ÿ±íÿ­ÿÿÿ§ÿÿÿ\ÿ—ÿ“?ÿÿ²ÿx±ÿƒêÿ}ÿÿ ÿyÿÿÉÿsÿÿ_ÿmÿiÿc<uÿYÿÿv®ÿSÿÿ ÿOçÿIÿÿÌÿÿbÿ?ÿ9°Vô) IDATxœìÝ[[– ôò‰C"ˆJ¿®ˆèE@KE£Ž--#ƒŽóLÄatú1EŠ]×CL†`ÂŒDMшˆÖ‰ˆßúhÑnŸîh±-«Ÿ!-eSzó/øîïµÖ^{¿û=@8¹ý®§*7Ã9|ìkﵿ¾÷½2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(ƒ‹JZ|úOìK?~,‚y;y üþ¯üHþØh0O̽Fà…Â/¨>þû2~Ä÷u¸—ÏñZÄKÏM,Š˜Í¢­íæÍºº£wïÞ¾}{÷î,†IÜQqWÇ[æ wï ÔVÏ=0ÐÓÓÓÙùF§Œìí=Y¨Wôžw±@¯îÂ~äÑQ]ÝÍ›m³³‹‹ÏŸ¿|ùZ}·ƒ?§Àü°^£È¾Ý5B*üBa/á†ßL ‘*€êlH…LEI‘xˆ”U5©·)¯é"RÊTg"©S™Â/î£2¤2Sš”2ü1~†¬(õÝv¤þý”8?RÁçxašuZ3=;SèLEHù¯ HT• —¤,©p’j¢’IQ'HÓp!(™£€¨ ÖÔ00•æ ÊòßGA™'µi*l*ÞPðÎóô9’Êoí)-”iüñÏeq¦¤À«~Å™éüûy¤°¨E¤$)›IXS\û†”ŠÂ=Ä;&G9R" ©©bÉ*ÊϵÚT›êú)RØý'‘zÉú·RââIåbIl¢LóO~‰À'”`ª(© ©ïQ1R±$•F*иÙàš-hÏÜ(dª› '½+þ“c{†”6¥ÒÉSÞØÿ Q“ú>7HÙÖ—ÜB™æ_ )ÿçE wýÒIùIŠ!e! œšjÑZTŒIS…M½ b (¤B‘}[Hù½BLŠüêªRáH•yß­Ô±óÐ\RÑÎ{Y’¦¾ŸßñC?è0)6I ÃßìÕ˜r>]îët¢Œ)R °#8Ú›LSÑ䛺éÒNq?hò>ý³± À7xqÑ’ú›Sâ\IñO~Τ˜ßNÉIy.¤ìë2¤~ˆ:cR¨³T)ó¤Z”"µ±0eH £æ_ÐTž(ù¤oéhÊ7&Ep†êVÏÚöüקĹ25óOCʧá5øÄäßö¤0*D꾟L '2QŠÔÛxÁ/Ü‚s=¹NŸImàÑÔ@TqPNû)Rdrê5Ó,¡* GÁoìÍZ þ¤¼ßNixÿéHÉnè…}RßgI©'"c)˜£Î™”/Š!µá(†MÅ>!ÖüŠ )UHw•tO)J~Wëêl»þkRâÜH‰?ΔüE—ñ%ÍꉤBï? )0mȾðiIͦ’Bmº()FT””KS‰y*A38æHÅÒÛVì |ƒÍr”ì[šE­ÊþL!UÀ^(¤ašjâk„0Ø÷ EŸæõëðçl?Ohêû,)ûTéöÁ™^jжèb¤0('ª“ˆ¢ ®ó—š§rüÊ`]ôü¬)š§BåÇðÛûÜx²ßÎìs©Rz(u¶¤hû„-ÔûÅ“N*øZö‰«6åÆôSƤH䓚M"•"*LÊ>×À@)’¦¼<0ô'A-jPæ{™}¶]ÿå)qá¿ÔöÎ4OÔD=TU±E¯ež·©/™çá?å\Rî8R°Û§D¹i©» )º±½ßvÁQ„5MQ:G±¤:;¡©Òþcu?òiøžPÄMѾ_ü§ýÒršý=\8°íù/J‰ Ÿ—JlðQ‰¤ ™ÂÏm~")~ýeÈÔéIµ…I¡à²#EÓ’zç/ã¦Àó3¤ü‘”IƒÎ £)²ræè,¡A™³¡,XUa rò)¡<å‘‚i*üsþ1ìí-Úr„,ð¨ôŠ›µEŠÙBRE‰´ÎDSô¹Ò^È):E‡e%z¤@ÑÏTýTžò~Ìîg"¾òþM°îdXo¯t_im‘bŸ=žDŠ‹ÂþêI…žùÔ¤ì&†TÐÔW©¤n²¤HDEÑ’u,GuBQÌâ Jª“#å¥Ï@ŠÊeI‘4åº~/½4%óSÌç¡õV>©#%j„TNEµÎêL±pòÙâ–Ÿ"Ê{%°ñæ%xÚR¹YŠÔ&Tu‚#çÄå¨aà ö@C ‘rïåHS ®Ô> Ez~(M™ï8ù§gŸÔè©b«{ö+Õ_…ùbj‰TjÇ/FŠ€bQ™Ç%e?¿ñ%úY|0ujR0ÿ%“¢¢òHåbr”n©Ã¾¨Ü$ß‹IqiÊC?ƒ|QŽ”+P˜4EM¡.¨î½Ë:~hø„¿D¶5ÿ«)qîå‰Ó’bD1ߨtRùÝHô$›èV^„ÔË—Ü矦)ûl¡$u³Îôû()¢‡Û0Ë$)L¯Ï4·)Ós{~Ôþ Š‘‚ƒ)[¢xî·)Êœ‡¢FP»÷Ÿ k’whLN“’zIã\HÑçÏyÚ|Sü'OêûAR¬(Ž”—è.tÒßb@q¢lS‹‹ŠìžÊ _T…•µ,Ðó˾Øõ3yêeÅüp+•— Ëg·kVÀøé¶5ÿ )Q+c©)¾±Wa*‘”÷ô§%ú¤Ýóæ’‚?R@¿ “%E,¹£(¨œE `ɤÞTIŠÉQlI½­’=®IU )•¦´©Š!Uw]¾w&AU@AYÒ_ÜçJŠGõÒ«¡¥˜Ježþ”¦b¤z~R\·ÏˆzKDòâDùž¼˜×â8Q`)EaR\·¯Aé¨È§¬XRYG®RçLé<•e¦ŠúÎWdU¢Ò¦¦ ä”nöÙs3 M|¾¤øíFQRLå“âŸ=Gjìµb¤è(­0©`’J%ňb2Ô³G“f4UœíäU|Q)Õñ¤*ŠTEç)KJT%*`Í‘ì:V*8Amxa›ó?—µRñ ˜Š6x–T®©¢Nk*—T¬æçWü^¾´‹Ñ˜Ô‘ÁBû}¡ó&sr*ð{œroì„§»¤‘b“T”&…:~†Tf*ûUtßïyE.8©¨ATEOëÚ3s{Ü×…%½2a[ó_’µRñË%Å‹¢eéXëÏ!~ö*L}R7YR~q‚'åZ3;Š ¯EïC¤†SIÑׇYÊ]¬Leq眘¤dÏ/3U±ã)Ùã[¬¨ATÅ-;r_\ÄS‘b‰ÎoŠ )Ó õf¡S˜*"ªê EŠ‚‚c)5×ûN‘ªS¤Ú¬)™ŸÔ£wo+*Eù |J/^¼À¤þ‚”¨1RÁæ”c ~\QSAQpéå'%õ•Gê% EÙ^_˜ÔÛ\R\—/T=‹"U U Hîø±°)ÛÓ³?õ&KJ¦©ÊQ-PÈ4%£¢æ¡*ò+¯èÅGðPwÔ µEŠ9()¥1H=‡KS±ƒp@¡O}1¤P¿ÏœÞÃç¨àʉÀP*(NLR M–”öã')IÊ™ª©%™¨ÚôŠ­ŠšÖ­È/¸2l^„Â6æ?7%>IÅ¿ÈY‘zŽ›h‚©TRøð3Ÿ)¾ß åÎÃ"9 ­ï ‘ò’h§¾¨”$MyoV¤{~<) ˆïøeNt×O“ª¨ÊMEsTÑ7äÄnÅÝ<9!RÿoJ|šy)¿<Y$&õü9kŠÏSá³dsHù¯Àqû:KRð™ )”¢|PÁÑÔ[J* *MÔ%)G*ßT˜TÅCeº€™•Šþj+²H¡\é¥Ä"=é§S“Pît'ßÒ36> R` DŠKRÅóT)æ<­8‚_Ä)H}•N*(ŠKSöß\’b@yëHyQÆÔèI¹ÑTOº© ©Xܹ®[”_æÑ‘þeóö­(Eè/.:" xKŸ©¯b¤è9Á$ji¨¼Ü—OÊ™*†ª0©¯B¢ÈÚ‰E·±;'GånŒ¶bíÕi/|Ø1¾6ÕYÀ/*|bøõ«2D'ókÀpb=!ÿCIýŸ)q1c©¯¢¦ÒIù]¿¨©©˜¨4SÕ¢;†“I¹$e@D%‘bz}áEûuqR¯lš]¿¨©€¨ˆ)ïýèÙ(ÅÇ~֯ zQs¤¾ÇÜ Hñ¦â¤Í2“Pž £òž6…ÜÇ–nʽÌYe)õÉ-ºÓ|êâ)*¦ŠGEFQ4C‘‚¦ÐÖ^%Çø|É£ÍçŸ}Ò¯¤Eƒ5ù†˜°ùŸO‰‹™—Š“bŽÂ£¤SIñç&•g*ð%!õCÊ> å%©˜(UZŽ"u Ö Użý íúq¦òDq¤hFõ{« È7hÜ$tëÖ-ùçïRæ­Ej*€êô¤ÐvëÚ eFR¤€—ˆê®%ŵâÀlTL”EžšâQåæ(Îû¹âO8ëÞI8·n)$9}<ë  õϤÄ'»X”'•×õ‹òMñE FTl0ÅJ1ÅßTÅöüÀ} IAU¤ß F…P9Pìz:VT( ñ¡zV•[–ÔÃãHXñŸèþ 멹¹Ù¨JBD£FH…. ¤XS^ãçH%š:#RÅòT•¤,ª\Rðø¾0HT@׆ùU”+L›<õå©@P "v˜aó?œç^ñó•׆΂TÎf3!UÜT„T`,•Gj%)–^ù+ H©kÅ©êE¹ Ö7íÍq}» '4zzÅLÛšªƒñAE!S¡mË_J|‚"º7Õh;¼)Ljq1h*om)n$•g*÷eΘT¨Û§é0…=à*4¿ë‹zCrTº¢gxZÕ Bg&E`Å=ÑigýzLOÊøà…uåç/.ćÔ)Šª)ð›ž!µè7ûR)IŠ5œʿr%D*å¦@Êöû˜I^Bê®G*gÝ/êMž¨gÌ›LR` -Fª>Dû{ þøB"8P6E½Ï‚’Jõá} ’¨‚'–¦øŽ_NšJ•Nª ©³ ežTÐCI*•T´àÀE»|0=£|È’9ƃ ° ÷õ`±¯ÓssK 2D½·Q•ñh[ñßšŸlõ„{¡Ó“ruTѦîƒH'V{¥êH‘$õÒÜu~“™’‚};Pœ{ å¯×·ñŠ”¦ LTxHÅÉâñå|óÙøLn4„A!VLWá$?zw·FI¹7ŸHÏÏ#5Ë&ªS ‡B¤ Œ¨˜p_”¹ÿ’Å×ö¸üŤªõ6ÅÝ•ÅõB¨‡ '=Nr¢vww£ª¢ ©ÿ5%j„Ç*•—§"-=&*Bê9£"ÏÔ2ÏCú}üQ|9¤Øå lS†9*êÉŒ^Ð?ì ª•¹[(ðÊ÷éÀQ“W«Ã&lМ¥}Å@MMMYRÿCJÔ)jê4¤Â¦¢I*™'+‚—û°PPããã§$\íZ)ûg´<5e[%!•ÚõƒmýÌI…7j©×ŽI1vxQþrŸÈÀ´cW£Žî,R¥6ðýÏÐj£*z-fÊ%MáÑ'Ê‘ú/R‚ Î8{"‰ÔWQRðº2BŠAÅéaµö*L…z™Á× ‘ú’вõ> Ê/çù âœ#ÔŠ(Ì%-B¨\™"1^ùœøZ©{§‰¢iÊÚu FFNCŠ;*¢¶H=‘ò6ÏBR|…1ôð‘ɤ`qâ¹ÿ–b#Nê«Ó"yª*RLaX¾)®è‡Å’úÒ'eê}¦Ûç{r¨¼ü4à8y"yrú Ö—ëúqª”+NM´ªé€VÕñóVR¸A) ’ú»S‚K¯©RŒ© )ßnçŸÄTlµîiHýØ'¥FRD”TÃ5‰Nsª>ÙñÎf Û)(fݧ wýB¨|K~u¿-  ›ÂŸgŒÒ{O”©óIPHT­¢Ï‘Xž ¦HšòHå™JCuZSžàHšÊ'åÿ:QC)]î{«oÅôÎ=á8™Ô´•0ÐçÂÍ»Ù-=E˜hÛ¤®p×/-ûP2i‚¦‚¢ÞÓ )ÊpB¢¾¤¾Š‘zžCªš§lȆ'þ¢Û«KV6Í„(a9üG †Hå‰Ò_œãd=AR]Jx«'ü ]•¤hœ©ç””'«xžbIå™b^­*Ró¢Ü3èºÜÍkº}xï‰f(ߨ›¹ÍÔ8 ­ ä*KêŠë§q8¨pžÂY'( ½â{8åƒ:%©³‹3"M½ ¤)OUá<œЙòÒ"z©b¤øÃwq’Êú}ÙHJtû4¨ØBn‰Cûz|ê ms wŠtc•®¬*dʸrb‰U¶•ÇòWДÿi;T1OÞƒÕ| §"Žó#2…Q1Æ “ò{šè•Î€Ô )5’"9J­…ˆ Êë‹¡ææ:E`ÜÛ›C%[«G V ô³“Ž™ßÚ1/…ù¦¸ßæ5bJ?È«ñHýU)ñÝ$E–Q TlÞ*hн±¤˜]ˆ )î;øuËâ„*÷1¢S'*ж7´˜4»^•èÿñi ¥¨Ð.¦]ÔàYNª0)?r¤Ü×çƒr_Ýwš”»b)hj–˰1³y«()¾ÌÈ’òL!QàÐ篂 GTqB×&ôEdtík'Y‹vh¸MOÏco B~Ñ»µÐS¯c¥Tíîª<ÕLMé×½,ù„®Ø1\yŠ˜À¦üŒÔ$Ÿ¼Å ¢§^ŽÔ_šŸ!©¸©Ù¨).mEHL&%Æ’9¤hØ)I©zÖíàDE6‚m¹^µ T,{éùmN˜’?ÐõóÇ:âÙaÂÃ5[;,`ÊKªR æ'úÅž4ßaR Œ&5èúÑH"ÅšÒŒÐëaS?Ʀ*€ÔË4Rx$¥D©«œýõ¯'¸L‚âh‰Ü¯õ]œ£P«ë2¡T¡<å>P®ªæÂ¸ –» êÊ''¾ãèß“Y(˜~£ž`–úRâs$M‘4ujSaRäñh › “ ™¢#)Ñí{ûö.+Ê¡Bkb½Eå¤bžŸŸÜŠ·¨(‰J$*Á‚#e‹ %¸Q Peëñù‘—Å*Ê”1„ÞT’¨ï)®qÑ™©TS©¤‚¬òE©W wý~Œ:~´Îž“¤ô S™ ŒÂËý]ÞÎ\ËÉû½í……›Æ´½½­•ÌS²ðçõËÔK˜1˱àÂáT¸r¬ç(“¤jà'®7k?=KêßN‰ÏŽTrÏï|Iù/#•™â$EI¡nŸÍQP”Úþ„·iøë#Hzb9Ñßäœ(…Êvý\Ý€’)*24¦TZÿV•/Цߩ€p÷ Ù¿|ö¤Ø.WFB鈩¤²_J’R/ø«4…9ÿÎRmm^×ïlI™nŸ*öqûrPÞ2 ´ˆLß䈲K/¨¥ï’&ŒDQN Ïõš1Sb·x'êFDåº| YÒIýË)qî· ú/PHTîÑèg–¦jÓMy=¿â¤ˆ¨w®ÛWDSjfOV”åw؆M*O¹Å.xö) {ÚDY™* ¨°ãðÞå¥*9£K8‘Äëyê²)Ьb¬-RÌá§!•Xó“E ¦b¢’H)TÁÑTaR¨Û'VËÊÒ„(öå‰â7ÍÒ%«©ç3ÀÖÇ€ŒL¨Q g‡¢0§5@èzñªB“ZæEß³¾&7µK¾(['qeþDê§Ä\ÙVHTìê¶©¦Š‰¯Ý#œ¦p¿ò5!Å rµ‰EY??ÒÅ>·ÙõäoÙ@9ŠY®õz}®Ã擲,2°ð;júPZ³·"ƒƒÕ;Hiy+ÅyT¾*úÙåUH苉§¯9RôÛ³ U,M%”ýrI-æ’R¦ª#m™Ë&T’B¤$NÔC/àšÕ¢¢¦Øq,1(‚Ħ-R€!Îø8LQ!P•eeJÜàf550å%Ý€([tô³`m‘²Ý¾jN›eHUS H˜ÊŸÌ¼´¶t“ä©—¤o÷: ¸¶Ï-í»3<,{}þ™{Á5Gté³H´<ÞîöဢŒ ‘¨ze1}uÓtŠ Ö¨%+—qÕlqsGfÇPϹ¸Î—£ ©¿"%>YÅïÔ¤ªJS©¦’H-2¤nªÀ¤`žz]Œ”ûbý$Å“ ‚¢û*()Ü?bIÇI "†„ •i妟fD…@Í-ÁÐ9Ë–,PPS>)ßÕúr˜B_´ÛHýÅ)Q‹VAŠYèÊo…º~á@ ôÓ-r¤¬)o4U)²ZVޤ´(AÈ_rÄ@"k¸v寮&è‹Ú”2 …5]úsMÓv°4¨5úãæ˜0O·† ‚` `kí4Æý¯&A”ü¨%å¢(–¿v•´)©êLy¤lPR7ÍpŠöüª&õ'©l EîÍ…sº!O·š“E¡¢˜OÊOJA@‰Êµ^›¢0(óqí$¬+<Àr²xRãÐ5†’&šÝåŠ}XTM‘ªÿžŠÓóË'uª4õ¼)—¦Ræ9_§˜²t»%) *t_ X-Á.#àIMQR#>) jM&ƒÀå)÷hS„¢Ö¢+;¾òKí]` ‹™¸r‘Aæì}Ú«‡ IDATH*ÔŸŸŸ')n¿<ž$òHGÅÒyÊKS”TŠ)»]')±T‰â<ù÷ÕÜâÎ:âIùsTì¯v²…ÜÖì€HÊȨ"Ŷòà Jö£Ú[@Ôg!ÿâdÚ…WhôEy"à›a¦ ;臃‹E/š{«h”#Êïù…j~)ÏT1TÏÏ„í÷¥“'¸ÔÉ…ê{øfƒ_ Á¤(z&Cpµ[œi¡ŽTpb²€ª¶,hD­x¢æ ¨zF˜ËWU?ò~1„D±Ë6©?;%>M–:R$Mµù¤f)©¦žÇEYS7oz¨©jH½6³¼ IU*ÜUÔ±{—[^s{~”1…E™¢¦!ó”FecÚ!(åÐq:q…ø/²¥ )úki>õ|Ñ!æLR¿»H-#•l*W$UWWçå©SzíNpÑÅ )j‹Ê ‘¢D ¨"¤è¯~ÒíÛ$ݾŒ†0¥‹ ›Î“åzpK GaO*¨*•­LPÕ×))¢ÆÂUYžFÜ¢Œ]Ûœÿ¡Š ÊKj~ARØT’*øð©YGªN±i*¸+”ÞÓáΛ°Ý>n…õÒ„Î= —'¨(Ô$=QK‡¢!û~ üíOèšÐ… ñaVÓÞÞÞ´ˆì¿Ö±ÒT™4Øå—½½ˆ¼+DÏU;¤BO]Ô9J0ʼnrÏ!%M-²¦’I™$Õf+èÃ==o )nB—r*–ž€¨ © (9Øi—4ê[Úm£ÇÅò) Q‹Òž&4ª=°DÆ‚¦ÒIåï Šzo[ô¿˜çGJ-ícê<}I0Å‘ ˜ÊA…Qù¤tžòJÅH½öl–t'*Rßó9å:Ê…šª/JÍ ¹lSß2LaN¶z‡sT½%ÔÄÄĨˆì¿ÆÕžÆ2•šSfHU«‰– MLé]*j…T0ò!%ò.(B*n*" ˜ ºéÒT.)ÎÔë׶ܧOîv¤LŽÊUX# ‘r zñÊ>7¯”á8F¤@.‘ÿ´M†2¢XTÆ”z~»œ° )¸7”Ù \ó¤¾ôVM… Ò4MEHKSQQ8MQR‘4åž?—¼Mê­$ÕÙ¹±ñÊ ¤â¢Šç'†“£‹&Ú¨Œ†ëù9PÞR£¹9–”5$Წ„©cj®Ð-"Š# sÁ¥¦±¤þXJœûJôïyƒª$LŒ¨xšjãL-7ÅÔ%fg9SêE1© )ø ¯9TH¼MÊôûÐ2‰f?PŠBJüðOß÷Ök[QÀ“[}nÆQsv¢¶^׿ë)—Úô8J娡¡¾,ˆ*)K)ÒCt·IQR¤hQ" ʸÊåši/µíD™™Z3"òIE@™ñ×ÍR–”3¥P‰ÿd¦t×/D*Š ”ËyPæëwßñ¼\‹¤¼HY÷LÒ¦–ÂIÊvDLª»Û˜’¨td¦ŽÍhÊÕ'F’MAPˆSà·Íw§c-‘ª|ï‚I5•/ ¥)–”©P¸“2é«DE¡«®ÕN)Yœ+%Œ#\5GÃ(F”×~ÒEÙ奘©5¢©v´ù)’¢@’2å‰8©=–^…dI§e@YQŽÔ?žçNªbhž™`Smm<ª°)«Êü=^˜ðPÙ4%-eÁtýøˆ€RÝ>%JÞÔÑÓ#‹`G3¥Ä')<.gU¹°Mh‚닌¨9;­t¬«àY"iA¤â ì$ïž«ø¡ž"¥Ò”©O¬m*Rtú,š¯H/ØF j‹”G1).M…HEM=G=Ÿ+J?¥yÕ©Å‚¤\¢´¤d½¯§³sÃuû4)j‰ÎEù¢ª (z?á{¦Ö‡R”ôRP )¦p"@j…’òT±žB põÓŒ¡š)©(%Λ=Ë¥©`¿¤)¶ç×F„L±¥žÓ¾¨îùIS1Pj$E‹p—¡?zò–IìÆîqòUÙÇâå¤WìÙê9¨ïéºÜqK»›Ð¥¤Ú1(·²Ï’2ijd)ùö€©A:­ å81ßϽ{Ķæÿ/%.f^ª*Q!R|š:SRþ“ºw@RG¤B‘lʾã¹I9R¢8—È2{6b¤˜W1Qø K82ƒ!=­4'Õû|„Ô4&Õ7DÒÔ¨.PhSbc–8äÌ#5ŽWPPPTˆeH‰oøwƒ”êÇ^ L$UÔTcŠ’:rij¶@×ÏyRIªM‰zË&)|&Ÿ>T5LÊ´0R3&‡Œ£QTÌ“^4¡+”°w&岤ÌH TÑûàœ¯YR!óÔ±žð]YÙÜÜ6ijŠCEPô׉?Ý­¿—‰¨ß…¤èѯÁ4•dÊG…¤²¤ŽªISD”%%û}oxRhå]°K»=4¢¢Ì X³®œä¨=9O«ZýôA}¨£ýôž^åJ‘ý»æ4I]›èetWø2!ó”Zï'–Qdã©í.ÿ²D 'è|N´2Qs¤Øg?½(–Ô™¢¢è³bTmÖ$»~ yŠ~1²ˆ¨—Ìš•qu‚x²-Ãü Œ)Æl† õ¤¶Ò®€SÀ<­éõ CCÓÇ M¹þžù›­ó;R{Z¤Æ”ÅÎÎŽúK·ÍWò¯`M…ªTÌe¨¶uÝÏ}-¤œ^(ÜïûŽ’ ÖÇžŸ-©xŽòL1¤Lš2]¿Ü<åå(Yœx‡#1¤,PI#Rã¬'\—ŸÀOŒ€)[T+gÁòXpäØq¨Q©$%HiO;.¬©înL±4ª¹%Wø ò‹AN¹¤þ—”¨ER9ž©çùet´y°P·Ï…Ÿ9H týrò”—põÊ Cjƒ²×³:ܯ^SÈ‹‘¢Ãù4P¸|r”lòC£{º&7ç2“=ð¨ˆ:6©i JhÚÚÚZÏbK…aµCBâÒÅŠUûCÕôxŽÚEæð B¤þû”øËfÏÐçÖüª%Å‹Ê!udIÅÓ\¬d_|Ö't =F*<[$ÅE:}Ð’KQ®Úr”néÓ{ÇÀ:S ')%jOŠ (Æ”Š­-ÀL²R¦äÔ²0ÕÕÛ;B¾2‚Üe¾WAPx(U[¤8S§íõ¥’  *Òí rÏ •jÊH·m¦8‘‘p[¥RnZÉW¥ß‘CÊ5=”¢Ð¡FpÅž;&LŠÂ9Êdµ¼Õæ%=zÒç²è¢„§ÕÕÕååU&YiM.wiYÝÝ¢Z1¡/­Ài__í+Lê?M‰ó¾f xÅ/¯4Á ¦òGSI霔9T6•”Måš¿Ô §#½ =Hê=Ù4 ë±3$i§/@j.•Ý>7Þ飵×v)𘊄^'k¦x'&TŠÚÙZžT(SNÐú:!•¡Êz™zDÕ"ëéÛ½ºžÎ£ˆªÏ—EA5© ©¨(tR³yróT±4º}mš”LRº<7KR~sc,Bj„ï™%²t*ŠŠ‚E;SXÀIJ$Ù#Û³§†¹Gú µ¤Ï,ìË>:ã(zvë«Ëó&”*¥u‘)ûRõ¢ò·&ó”7ŒòJœI¨š¿C¤XQRÉ5¿”4EEÁçÃ`Òä…Iáž_tIz")·§W’r×´‡H±Yʵ4ÂÉ£¶iíÜîz²õ;»ÞŠê3µïY¢ ]wîü³ÄìyêóÞQ9j~¾C„B¥ú~ëë!Q2O ©®_{û’YòÌQ»ÔÔn¤à׌MYRÿHJ|Šë¯“7Êó RHå(òGS^’šEl‚¦Â¤RÓTœÔDÊ$)š£`çOtµÃ¤¨&~vBõ;·ŸÃKRªp úž9™ÏnÜÐçHØ%”¨!™¤ÖE’êhm5¨DšŠˆÿvze×oes³« î‚’øf‘!U¡˜ÓÍI:ñdÉÞ$«}Ô¡NSjÎWOSe¦©HjT.J’ÛÅig2M (©ï»–Jê¯M‰š™ê­ž”g*L*xH:Óïó:~ô¸>Ü!´¤ÞÁžŸ+Q,&õŽŽ¦|RºôÀÌlÚرaAm†‚ÜLíDÕcQ’”™W2Ã(´îÕ-$wý=Uÿ^5eñ(9ËkDÊiJå);õ»Ìd©nDJW($)å„E’OŠšr× |WHÅGR¹£©B¤bc©ºº*,J™çd¢áTÔsDêÈ’ºCHÝ2¤¦©A†”3 Q,¨5t¿ì÷…r8pbÈvë4¨U77»T™NáºZʧÖ©GbÙ&Õ ç|M¨4µî¥)=ÿeIÍYR~’ “÷H9SꟖÔ_™ŸæúëSÍK¥“b×Pp¤¨©ÅRu4IŠæ©6‹*xm0Cʘº£Ò"¥æ¥¦p}Ü ¸]ŒÀ-þY¡@I ŸÑl¯˜Õ Vá\ÒÜaÍÉ¥{tªœ'çx©C]¢p!LéÅN•!¥×9)S++–Ã)NŠ_ T[¤ä'þŒ’Jí÷{~!R³,©ÅR³i¤Œ(J ššeGÊLôê§s=?]F÷Iᓵ)S&w¤–—íb>C ˆj5ù‹’R¦DçÏÖÍ’$wI¶0U/® –$ªoˆ^2â\9S¶ IÂ’ú×R¢ÖIq¢NÛó›] z"UDO¡Õl`¯Çs{­T€”ì5{Å‚$<“˘BK&Ðn‹ÞšsËé`å(´ ŠËRfу]öº¬&¬æç¨CÑŸ¢tA]†La‡‡’“"åT¢H±ìg ½ŽÆ”Üå!.ÇÞ„«D¶¥1‰Šš Üc7…Þ\’Ê%2u:RoßRS`Äå×(΀Ը"e7j0žÌ2YpgµÏû§‹ÍÁr ;%µ e•Õ § Ü: ³¦O™š™ñH S€”XØ­MTªD!ò”Zbeg¯7eÞbIMMq¦ÈÛ¿S¤XQI¦+Ÿo ?„í÷¥%)®î‡Ñ&:²¤†Á*?{è˜ÜÜ1“dÕEç Üe“”[k÷uR0autØ}†nåQ«¥S™ÈT'‡v$妧dÏo~Ù,zR§$uÛk¨D¢:ÐwÎëÓ¦)´‡ž5 Kê¯N‰Ï“TÊ®)Ä#…—¤Ú¢ÐB‰w@ÔÝ»˜OÕ…M=·÷‰RR®>!§zÝјªæ7Økw@Xx§®]·çöºc>®‹‡–¹‰(Xš}>¼óÐ(¬*°ø•,>r;xíæ]WÃ0µt3ó«F]¢êg×±›Ý!ö¤‹‰istôœ:x'åÊèßiREê}9¤|S\ªÊ•LʆEMARaS†TOj …Ô6…¶@¡Nå!BA@¹â9*öARØ”BdPéJy!å@™Ù+7LF]ÙƒÀu°8iH‘ÒDZ£ùë3#õ—¥Dm**ŠAõ<œ¦â•ôh’¤’DEM¡ÃÒIÝq¤àΦ>!ø¨ª–s¥ëà8>pf'/Imã&€)“§ZÁé|†eu€óZÌ‘ör»ˆ íFt9M­Ç+ÿÔ¥£ò~@Ê.®G¤FªÎRaJ|’5~9»zƒ¢ª#Å Á¨xO´Þ—˜¤pžf÷κY}ántÓxWÕ[³š»qôÜÅ’BžøMÀ5H*å®Þˆ¨(©×©ÀdoДðCØ~'Š$©€)Ä%¤Ê¶æ%%.àúëÌJЧJKAžôò:zë¡uÊV û¬ª³îÕk–’ƒc¬v“©Fa½Å“Rs8Kù¤¦vƒÇŒ…Iý‰”¨UR) HHS!Q<©·^Ü¥¤ø4…LÙM‰¤„~’zkI½¢c)IJôûD—Od(uÄ01=Î`14F½®Î\(ï rpMØã¸Á»¬Iát}Fw¥ì²é NðÈŒ¥¥ìw†HÁ& ’ìj£«ê„!eLÉE%ª†î‘‚g6òÔwT¨ ©ª qQuÁ$…HݹCÓÔ»¨©6mj–rŽóHuRõÇú5Ú˜½åz$ ÿT"чû‰lÂþ€–®Û⻀pTÝùÑgvfX 2Aé]¸êBƒ d*êÈ|*ϵã":ÞÈ’BG {yÊ’úgSâVOœ(ŸTnϯ¸¨TRw}R4Řš%¤êB¤`ÇojjÄš›S­mÚü gQQPCN'é4Òžà†m6C†B=›ÓàjßBÁ¦!…P‰î_}ýÁÞ4Ó{ÕŸ†Ü+oIÙš¨N Ë패ËäZBÊçR ¤¸§?+OÀ%4•"ê&޼¡—¤øÑ”Û²PéϪ ×ûÌKKSâúŽžÎNBJž=! ~+Kíª×'/§ñòßé£c%ãÁ>IÀ¢çF¯w° îö9õéFªò- h½ö¬šm”ªäï’û¦íÑèÇf…ŸYˆf¥Ü¼”%…ET]B‡Ó¼’“#eD5› iÊëøÕ)öÙ…„3!Å›ªJT¼ßw7J*§Þ1¡ßcI¹Ófí¬ÔÊ\6’š>¹ü'°²“2¢üŽí Fó•WçcD±'D›ÖoTµ£YÙMÐíäàáïÛÛ²JaoJ˜c‰‚9J¢tÇ/ÓBDå“úRâ‚HY#UM¯/'IÝ “Š¥)ß”}{:)¹IÔû¦ÕÕîzÙ›Yªm—¨JSxµƒžÄáM…HÙC`|P´Náïi·ÍeÅ%)†ÔˆR¹£ÐSÂK³`ÚëêâF2Iª¹9hÊ#õ¤Ä…tüΞTÜÔlPT^]"wRŠ5<<œoŠVëÞš™ÒŸ“;uüÐj¤¹öã-ªÏ€Ú[ÍV»RÁ]ÂNʱqx ¦XI¥€½i‡\ <±Ý>[¢ ¡ZÂωΗõx»¶ŠÚõEiS)¸z¢Hq¦Î“TÈ”ÄS$GÅDå‘N$eQ§U¦ÌTKÊT'ÄI.b1RËÁž]0ÇmÒóI™uºý££^xSèí–Ô4Lw 5qWWy­žŠB¥ x#”ì¬TöT5|Ý0…æŒÑ±Í0Iy¢(©÷µGŠÝ/u.¤¸4Ååœ4Bu8fƒ|~’òMPyOiº~¦à§$!R¦„®¡·ØnŸ&%wMìÀ›å¦${ܼû&bJõéô[§(3 «7‡¼rpœžñ¶ÛzkRÞkZRÁ5êkk+~¸¼”>™…$)éè– €êéúÙæü?§Ä¬Dÿt¤òMU%ê]\”"囊©z$åÎH¢¤T¹o®þ’rBìl1¤à¶Y—Oà™™¾)3J"9jf»·dg¢%”3\A¥‰Á()pWªÙ OE¹MRºÓ7IMÙ‘”eMyiêýg@êåyˆâ»~¹ªR,¨#_š&¦Þ²AŸð®)f¨Ìt¯#5 I‰óÐGÅ,“šps¼øÐwa Ý9«ö?Ø£Ã]I»¾ž¹w€Æž%E2T;XüÙ˜FΘ \Ž"—ëŽx¤à]têè÷5æDC•£ø{oÞëu Û÷ƒ¤þ딸R/ÏU>©¨©µ=KRnÙØ‚×3›^G'Ìý›°›–G ôM }¦(7¹F^?Œë ™w¡« IŽ2¤P-Ý\÷â²G„vARä¶÷ŠÔ-캤Ú"ÅŽ¥Œ³Å­ÍEå‰âSTH»iØ™ ¨Â8)ùÈò°<¡/¿ïíR‹ûö) jÜÀ©f˜° ð°§Ýî²—N\WØÝ¼ÔžKQxniä Ì&:èa@0á.õF—j¹[€&³cÄž4±‹EYReÐ<ç§lsþ›Râ“d)ü"/qä¢I%ÌSaS”TAQy¤ª¿…IÉnEQV5OêyŒœ¤•f*©ð!ʼnâ»ktBŠ!uçn•yÛ]xl…6¥^[½ Ñ©‘ÁÞÍyƒ:2R-œpÇDZR*G ɺÌPT”ÎR˜”.ÉÃí‚$Ý!t>>EEò# ¤Â ¨(ŸUöÏ^ jpüì ~2IYQÏžaS$U]¾\ƒ¤ð‹ˆ_©Ü‡>/d ×ûxO±3‘)IT„–ý—zýXeJ¡Òý>UñS[/ØìíZYjqNÈõ²Ý6IÁÃ]³5ÉP&IµÔ“ÈSr>Ü[+ç ÒÈR讌°iÿ{}!MVJDx£y2%õLE…XÙvü·¤Ä'©øá7ª_ÕËDQ1SAQ>©‚¢îæˆB‰ šBoºëV]hSïÌùÍŽÔ AêýÔø`ïöÊœ=fLíßuÝ>eJÏIõõÉSÉå€K+”)¢“ëÍrØ={ê éôùµs©Æ#µÂ€Â%:>G ’è ê ‰òÖö»:åH9S®h›ó’0/eÛ|!UIñ¼Hš ˆbQá³0 ©°(•p>뮞ŸzHÉSÑ3RÍÞ‹‘Ôæ\;O5e¢fH…Â#uv¨NM*g.êî]P '  (yyÊm§}QŽ¢)›Ž\Ï¢Kïx1Õ‘bD™r‡W탋eS@©7Ö© øÓÄl‚©ªU¥‘¢GNäŠ ‚Bʼn8)ßÔ,J||#…LIR/n}\›359¹ .ÁUÇ é{¬Ui"¥î†K-Èy•Ü–n…Þ?­ÿŠN«hiŽ+”#Q+æ,=—¢2òU‘âD™±™åäJRL~Rï°­ùïH‰Osèz•Ù4SYéG§ˆjk‹’*”£ )Ž‘âTD™ÇwÊy 7x¦åíâ“ZqǹXR’²ØÅENÊò‹}”>èè½ÙÌk÷%õ_¦ÄTü0©³0U-)~š÷t¤ªaàã:!©÷è7¯š?ìŽô®ÌLËÑÒÖêºYÈ·£Rê"IjOûêö²Ü%Þ,þé@™Úž[ /’v—à#e¶t˜7¬€sÅ(©4Cæ—€«©^$Êf'äȉh¿¯FI11KLUèR¨„;¤°†M5(l?.„ ¡4(i Ô?aÂ^è—2äW[`XÓbû8Å=L嘪MR|ÇϘúºS˜Aå¡ES–Tg§(¡w­-IRC€”ª÷e=<)jOÎÞfÿê[^Ï,‰7ê›ÝS{Õ.:òH¯ù›¶¤¨'r›%m‚Uæ]øÔW¸'ÞÔáÆ(„Dü;(ÉG5…QVã”~Rx›hzš²­ùïI‰‹(OT—¦ŠV'¸=½ ©J%·ç½Šöû`ŸŽ”,Ìû_½z‘…BIexñðýøÚ’CRßóOHåšr|ÒD±Ûä=R¢ý„r ML…I¡n' çO”$õÂæ)DjwdEžØœ¥äô­s÷.¡Ë$Wøuo6ˆ‡HB3û‡‡' •¬«“[å÷©i{ùÝÁáÅ èöuu‰'î O¾ÚaΑòPMy¤"ýHE*Å”Oê¿I‰ ˜—jc{~I¦ü„yü"cŠ’ª$ÅŠº3ì¶:ÁR9KŠ¢zcßíH¡4¥HÝÚ”uïÉ,µ®kè;š”ÚmX™£«ùÖÕ­õÕÕeñ¦I3‡Y®ZÝ7ö⛫Í^p="'(ÞµmDU*Üä+.Å›RÜiEÑjD¬Å¤"¦>/RmUòRVŒíùaR!S9¢tÅöõ:Á_))X'ãD©~ß³g&O¹š_ç›gÍã]Kjƒü>ºÜ2ªS•¡îîõåÕ™ýåõåùÕåŽÉJ¥©ÿÆìÙ“3 *9ª]?[)WƒªzSÑ›[âÊä¦XŽO‰Õ¤ü X²¦ÏORxöý?’\Á;(}¿Q¥L±¨ô)cÕ KêïM‰ u3¦ŠR¨âˆ‘jc;~¡ E:©N&)]| ¨6\’z†Lé|'HlKR{Ó}’Ôªê×9RšÔò|ÇØÉ|GGöß“G—šššnÜh¤nO6̯®SêJDG ]Cv¾Ó‚¼ÇI¦"IНh ¦m‹?#¢â¦Ø|…I#¹—ɵ¢À0õY‘:½©ÜàHqyª.Bê]*)²ô•'õê(êW&sIRúghLé>䛇©9QèÞÒ÷±É†Ümïc­Túú¶Ö;oÈ^^Ção~ÔøôÉӧׯ__hºqûöääþaë¼ÌS}úny—¥Ôî×?Öȯ; bQ~0Ê(HŠAeßáÞçuôfø ¨)/œ)Gê¿M‰Z"uƦ£¦˜"z°èw*RŒ(k †ÍRÖ"5¸Ù.IîlÉ‹nTµ¡¢ÆR£r5yßÎÎúúä3' ­c.]j|""CÕÔ”%©™ýÆŽå-} ™%å6í¶À)\0ã<ÕÈKF¦œ kÛlåÀËK””»/Í7ŃËAEKšTØÔgE*Ôó;_RÉ©º¸©RvƒF²(ÆÕ+¥ *mJŽ¥z7çZZ²‘TŸ,<ˆ0¤v)9­»>2s{lfÿððOþÆåAã“+÷~þ;ÿÔ÷¯gyjLšZפ†ÜÅjU/@ÁÁ¸ö âá»u~'ŒÈžl0¨b¹Ì=½—¨ªn4VeM}¤Îf4U”T`rê“’=ßÔ+BJ˜ÒyªS‘Z“·Çu¯+PóËF”YXè¦NV·Ôõòð2•£„¨4z‚9äoÄx ’úÿuù2EÕÊf^ž"YÊ¡âUÙ4eIýw)qq¤˜¢ß9“ MøÆL¥Ô'0)<›‹jä¦Lþ¸BÚ)hJêZ‘çVöíHNËóóË«ò¨1Y•ÚY]Þ¿Ýt#“3)Þö£þà÷ÿä?ûúëo>~¼*Þ ¨ú'g;–w\–2;àe§ÏìÀǖcN¡þÜ8ü'¿ø ÈB¡ŽË>ª¼Ç¸Ëª}U»ˆüðf,)RDÿÅ”¸hRçh*™¥(G* BËŽÌ¿@ráu_SêgiÇSo©í%qËDFj> aJ]ª–D¨:öXÿþþ™±~ùü™Ÿþê/ýð·ž‘’ÿ¾®: ób’Ž¥äTTÖë“Ûo7á-`RJÇŽŠB¦p1.tp{¿ìÝC…Å™"Œ/0õ9ú$=¿ ©¸)Ž”w+/â4lŠè”DEŠä˜”‡Ê2x§ÞXR{ÓÝ;ó†Ô²#¥ãFÿXFê¶"õ§úKðÿðW~þí·_Ë?}º°=à°u}«’Ò¥ó¥¥·¾ÈU$¬¨$O0aU¸¾êDZ)„EʼnòEêð«"õ'Sâ‚HL)©ðhŠYëwZR&KÑIÜ@¿e…HYSâã3RòÙÑî­ŽÖŽŽŽLUDz<‘úxáú?ø3?¿téÛo®ˆ74>y*ªé“‡óëŠÔ´^-Ñ":}KêˆsÅ'ï‰ïÑy Š)a“9£¼¡‘×ÜùȈyx8ÈVï#¤|Ln,åÊ5@ üˆ )gêI0õiHù¢ *Øñƒ¦6©.AjB’jm•¦©,MõUüøi6xº~íç¿ö£÷U’º&He¦Æf:VÅ6`}V…îô-­Ø{x-Å ¡+¦ü‰V†T𩿿ˆ÷¨t›|)¼&©¦HÍî…êÂi*Œ#w­DšªÙüR7SI%íäH%ÎSt0ÅMKÝeI °¤ð¾()ŒŠ’¦ ©ùÃÃ,Me=¿¯>!Þ»ºººÞ*ÿzééÓ&óæ+®(ROoLv¬ª !šÔŠ>g›Ñõ àñÞž7+ăJ#åt˜®J1^§*óœqQ^¿¡–Hñc©ºp×/âɨ*J+T¡®¢HŸé%¢()º8‚’òÎäöLÙ·?{8²).çU¤öåžÂ¬çgWÏŠ”t_þgkkg}u^þµéFÿ˜yï×?û¨‡T 7N:äæzA*I­ØCÁÜy(~%ÔÿLÀØ%´œ5¯ãÇ÷ÌXVüH|ë°*¾œAoñ#P=²­ùO¥Äœ‰^çõü¤ÛƤħžO Æ õŠ!ÅuÝC¦²Ž[RË'ûYÏ/#Õ:o—ú‰Šž\4Ñ!îEœŸWÄ~—¼þèO¿¸ôàÁý+W®^»Þtغ¥.‰?¤(•|xQQ"tÙÞ{ô€b9*@Ê3o£7™ªÙ<#T‰DѬ‰Ú"ÅD×ó+Jª©\RÔ”!¥Úbl9’Ÿ¤:m1¢)˜Ž¬)BêÖÔ¶¼²£¯ogõd_¦)-æñ£'Oo÷?Ý?YïîÎЉ€ë[«NTå§?ý¯/Ý»wÿÊ£«O›öÖ»ûÄ%‰Çb­¬$…æ b=»HÎPÁÞ`øB„À öóصúFÞr¨šQ}Ð}î0”@é=/öÙÈñt9o†ŃH¦ºЉrü¹Ù¨1R^¿O‘ª;%©"¨B¤¨©PÇ/¸¾/”üá¼Â¢"¤Pïƒ<àÖî`ËÁ´8›ogk¾all_ôülºþ¤lfßVú²ÕÎŽRWÙš IDAT>e¬éúÕlõG~Q©î]¹Òx}ly«{bZÌJµÏ-­­mÛã•uOω‰C‚*¨ Š×„˜“¤Ðö[¦ßLN4ÉL¡çD9RÿcJ\À¡c˜6•.ªª‚iê˜Ê5Œ‹o˜}Qxá%…~Ù>´-£»uëýøÒñôhßÐÐÎÖjÇLÿíl4eü|¼Ú4ÙÐÚûyËëóÝZÛãëO~Ó¾ý'ß<¸rí©(£ Rjºî÷uGœœpŠA£¯`“U$¢œð=“‚_Fh ä媇d¼ŸâÌGã‚­Œš"ÅYIS…H%£ª–œ•Ê%eçyíO”EI1=–Ô‡©•ú½!y¼ìzÇáíþCKêÞ“™†e²²˜ïX=T9k¼þøö¿õíý©ÉŽŒÔžXÞ7gHJ^´Å—Ñp䩊{ByÅ~;üüN¿çž)ü4ä÷˜G ÎÕÛÖü?¥Äà|”l*OT*ªªÒT.)´p%)ð;’þÎ$¤øŽ=èúÙw\~¿=w,oÞYŸï8Ù¿mªyß•]_=»ò‡@•¢R¹tõÉíÉÖÕIJ-FR¤\Íœ¬0E²¨¿/åC°é+_”Òî1ºàWç à )°?'û±þî"•bŠŠ /¡8)0’òúôœ(H 6’§©®•–é¡­õåùÖŽ†ÃIƒäÒÓþ“ÃûPTehÈîùÈ:‰‡×+8)µ§c³Ë‘Òõ=¶ràC@uhî7Dö÷‚ÑU0EU/Š#Ř ~¸yKÊíÌ®%RlÇ/k®¾)ŽTЍT餠©8)²ºõû,œDR¤ÙÒŸ!¥fR.w­ìõɃ\–m¥¯ÒøháÆÌÂoRÝjÙ_÷ÎÖúêr…ÆãÛ3©é=½•× ¥à2‰÷`‰)q€?ê;ÛìCWpOxÙ÷„EÑì&B˜PÿO¬ ¡uH¦¦DõRÿ`J|ŠòDˆT“¦ª Uè8¿3"…Dùý>ðCb9…I5›Îß3›¦Ì€d¼wí`tk}–!®7>^hºzéw™Q@ MNé¸Ö/²Ôôì÷呺Œ@6Ú¤×hÉ—ŠP% ¢¢Ü+¿@%pž«Š> ¥N ¶ùWSâVOÑ4u®¤Q€T¤ç—NJ3ë%)„ê Ôθ<¥dIM n×Oeã# cáicSSSã(Iš¿‰Ëæ ©o*•_7=¿þ,KuOÈâD*©Ë$?YPö Å_óåÒ`H”×wLe†B<)dJŸDDéHõÔ")&ŽRM¥’J»i€'5ˑ¦|RÃ$E1­*B 7+€J¥)ùž÷ã½K-ÐÎ÷<¹ÞØÿÔÍøÊ5aÿ*NMW¤úž>øíßRo½r­¦c]j'¤ÜR {|$ßìmCG¿5üæ‹ß†‡ÒSŽ&6 ÊWc)†û[Æ ;šzƒ.Ìû^¹þôñB£}Cë~‡9½rãö¾ ¥†R7®?¹ÿ³ßþŸ}]©||ôXêÛ;Vä3R½º†î–!RàÓã:|: $渨@ZbSž•ò—¬¤™Ê%õûSâÂHÒT5=¿€©¨HÇšâHaP´Û÷ /|¨‚Ôe}ï¥y ™¦D{j¼ ‘ºÿñg÷¯^s½™kM ëCúþ¶Ž±±qÉT‡XSq£éɵKôóŸË~_ãÉ塽ãvuÐXFŠ\þD:~ÍÞnÆ“WlãJoúëfº»TNíW‚Ï‚]YɲòŒÁž_-’‚?}†T‚©s"Å$)os/HS„/ ¤m%ÅŽÙ¡)EêýûÝŒ”¼¹s¾cYnˆºré‹_þöÊ‚û./<í—ŒŠãÑW;&o­nm­·žÈz{ãÕû÷¿Ö[æߘ\í=¨×§¸¸‰Þ0©æSŠ‚¨Ì×í¹b³Sà{Ç“c© ²Œ˜Ò®˜¼åT:RÙÏØ¶è?¥Þ½ƒ¨¢Ã©S‘*’¤¼Í½^Ï›Žà€Y^×j¢¨ŒCŠÌÕØË-5˜úð~wwª·ksé`bkuU˜zpíÚ•Jå—üæzÐ*/ñê^ßëoÍx²¯kW¯|üV“jš\ï›8®ŸÓý>3+5!›}T`_‹k×è×  ž¼ú üyð/œ.ä\†HýZJ\©wÒ”9Pž-©XUiš¢¼uäQ±¤zNOêÜ‘©ý²QT‹…M%’š ˆâH1¤¸º„> Ü@Ãrä!4å‘rË„YŸÈLôno.µL-·žŒ5™ƒ%~³RÑã©'ÝYŸOd©¾õñ…þ†Ö-êñãÇW¿ø(L]zt­ÿ°ob¯¾EÎó’:\oîMìâ$E›²' œš8ÊTn¼8ŠìÌIy{1Ή”F•7å[=©QÅIE½±í&©X?‘jƤôr Ñ”%ѨÅhj|p{seî`b}¾aæÆ“'JËÇ?ð{5›Æ§rÎjzbh¨{«aìúý“CCªññÕ{©÷2R·†2Rj1•‚[8`½()|äjáÆÇC>B©ˆü“b ¥IŸTNæŠúƒ)q¤Þ"Sp@ÅU)Î’TDT!R¬¨èçO¯ëÓ[&F³dÕ:ÙÔ4v8H}ññcF*ûûdǘ•’çanÓ‰^LÊŸßµ_H„w6(6B•Ó³KEÒ„øÄEHmØ+(OMªrþ?¹$!¨J±š…¬ª"U [ñóI1 ¨(J «µ*Lª9°öƒaÞ%FS+K-ÇC;Ë·¯.<«TfÆÆšžüL<èGM­ÚÏž¼^¾aòúõIsžË“'×®~üøÅ7å{Ö'öäù}kÛfû!G íàðË}Þ`Š÷De!Tà[Átöò444G²]?ðÑ>+÷L >áŠè¿žEЍ2¨”ª¶â¨òHQOD;/Å“âS'ðE,Øt©[˜Þ@kH©÷Œ÷f¤¶V[ïß_¸qrx¸ŸýoòÆïü°Rùå_¾¯‹{ò¿ûO÷ß6¢ž\{ôMFJþk~gzïX¯ïãI…LŽTÐÔ³`o/"ÊïãÑ^g¨÷>¡‚ï†+’NEªò Êwï¾uá«HÂJ­FIåp¤ê¨(HŠ.êó/ds¤¸ÝÜl8R—‰(º7]þ}j¼wó {ÿFcããK_ïv´6´6Ìܾú£®’>zp¬H54Þ¢º‚OŸ4^}ðí7šÔjßÞA½>dV76‚—#íÒ#Œ()ïP'ÐN ÿê:óÝbP8²Þ(H“S¨ÃpÈ%04š²:Lüö½TÔ§ %Âc…f€áJhh•|fRZ/W”!åå(" Ÿ}ùÐ3%eËèN{2‘|ÓHïñÖí………þ±…K…©ùÖý«œ¨ÊÖžþoÇÓW¯ëRà“ÆG¾þæ u×TFê¸^:aðóNqá6ïÆH¹ò5ŠÜµ0êß½ò*u~Bä’#V³¡v}œ†KÉ£uQ¤\ÐŒ…Ò–„eGWaW1Ryžø“üÐùÍIQpüÂâç2“Hí†HV댬íNNΜ´¶ö7~ûÅÓ“Û3Wû÷¨…Vu4RßÖrÿã¯Õ±Í•ÆÇ×]úöã_|ñàÑõ™­¡ƒú{Ȭ[2ËœØbE¡òŸ¦`+÷@1¨¨©'®ÁPQOêõ8L!VúÙM×ÏòøC)ñ©ë¼IѤ…3,±ÇÒUZ’ `B¢Ž|QwI¯Ïk T|}@ ß§WÆr‡óãƒ*3RÛÇ3c‡ óËûYº¶0scÌŒ™}ýäPíþè^ Ô_»zå^ÖñûâÞ•k7ö·†ŽëÛí!³(E±'L€u*RôRÈÌÚ…|Q”|Zر Ê‹W̬ÚRw®ž²ð·œgtæ2–׌âEE<…@™ÅH¡õüHü<`u ¿ޤ¨(wŒ²=¦|°«}¹á¤¡U\,*¸üÊÇûÌÙç¿}åi“^I±ÜzhE5^{tåþÇo¿¹wïÒµ§3­;£õâYW™0;:¸ýñÈ3uIP=6 )ô;ˆ‚Jáä2K6_T¾>óäŸ/)ì üÕ¦,›°lºJ#•3•[—0Ã( ª“þ8^2EDYR.IcQÖS]íë­­«ë;ꈉ{?Vt&Ÿ<}¬'€[ÍùOU·ïÁ¥o2R—î76vtOd¤Ô‘Z”[ƒdŠœ(]¹òDLª¢®ß $*©Ç·N†i¤ò3š}vDêK‰ #5Œ"ÌÌa´DºÒÙJfª©hŽb1ÕyWvNt.ŠûÙ™»m%´{ÇQjv[;L’ÚµéÉ’œ²èíZÚYwµÍ,ç¥ß¡”uú®]»úàÒÇo3R÷-Œu¬ŽîeIJ/›°'"½~àâx¾*Á‹B¤zh<±ž6Â…:>I1¿éR@q²ÐÓ[8%.`Ù¬ç‰aŽY¥¬w¦8K:<)_Ts0Õƒ@u2?˜§žå¢jöDá~Ÿž'R¤„ Cª··k¥okuyykKuü¶:NUžÚŸQ‡Un€=W3R÷ï R—\½13¿5q nÀ‘;ÑcdÕyö™1ó»:*Rï£-ÑE«¤.©s) |WÃ(¢£5SLÔçKŠõ„ðßms•@5«k )&IÅGP‘©(?AáN;›¦òLOö˜ct»%%a(Q½‚ÔÚÐÎúêúÖÖêªÈTYʺ­{{•†#ª‘ztéÞǬãwÿÊ㱓Õîéã9³MJ‹Â;JÐçx ˆ2mÿ™|^Ü]s-1¤8R¯òDÅ’Œ*‡TùYâWp¿ÏŽ”Pƒÿ=€Ã¬ê$ªESþËIR¾'Úßóz|ÃúRëQð—[š)Ò³2+ea’²×Ð`Rò¢Â®íµ‰¡î-qÿõNwŸ@µn–"éšùíÛ×ÀÑ~×gYêþ½{_Ü{Ô¸p8ß=zв´&÷tÈ“e(»ÞÈ/GBOö·†|^DÁµÅ¨žÐz**…SˆT'ý‘ÄIÅ´”Ô?š5F**ʰÊP‰ 0åPÅIy)* ê-Õãn‰üž?4ÏÔ3Ÿéî¥}v$EîL“ xP“êêÚÞÜêî^ž_ßÚé‡öu0uåïêãrOü}Ù|,JèW.eñøzëjßD}ËÊÚ¦xeóêÞ‘b„MFâOHŠˆzEHqóFA%ˆBÏŸ'Ê}/ë;@Štúœ#ôs‘®«££›7M"ITÈ]'á8½±+b_‘Ÿú×/G?7ØÁm€º †Oh¹jD‹’œ²ØÞÞlßíëWIŽ íìôu›j¹ì^¿òñ×rM®ìË¢±±Q zðàÊÕ¦±ÃÕ­‰½–¹µM¹å¾2¥D¹M®yƒ/Àœ®fö‡#° ÐÏ'õŠJÂädž?M”÷,w;Rÿ{J\©(©;ÞéD”E•uÿêêd‚ Êëö*|`Rw@ÝoA!ö‡þE òGÊe(°î-8òDaRÛYlÎL Êóú2RÝÝ}ÆÔíþLÒ½{?ÿù ן>yzýéS‰Jæ©kýû­ë;Ó펔Õ @ è€v‰×¸6ˉ?ÁjI¥z:)ÂÊ'õ¥ÄEàQq?øq_¶úYITGuum$Syµ —ŸT‚‚Yƒ_ÖÀ…n}| À­‚sPvÕ9Æ„I˜âùà hü*E OY¬´LLèÓÅÄSò>Ö†“Ãý™Û7šú›ÆÆúo,\¿~}¡)ûS¨j¼zõêãëM‡Ë;Ý{õ²‚®“T6ŽÒç¾W¼é¸ ¼´×N·ÉÈ hÊûíCH¹vM1=´m¸ªŽ”}ðŸ)™‡"yŠ|ÛäwÒ˜:ºy%*–‘ .Œ=>Ðb^ÐõEvÏ«z•D mãà–J¸µ²*!Dõ:Qk+sÇÓÓ–Tª»{kµµµ¡áðpÿðädÿvÓBMMM"Y=i||õjãS¹cq§O'D¹OˆÚ¢ )¯9›¯I7JÓŒM ÇíÕ´qnL’‚í>ET ©B¢ðkÔ<©ž?Á XQS•*Tà!•' U&ȪX–“ûý‚‚ÛoÕÉ`q%Ìë0YR©Fx½=JNEéA”ð”ÅÊRûñÚh˜uüªõyY?_]__íh˜¼Ý£©é†ˆ…!êÚ“ëz`ßh½X8ÑÛ;22%’Ôe¤ìqÐÔ,hÆ4ß`PaPà§øTÑR~ã{êñç cž"xXP€ÔŸN‰‹#5+êÝFK¾ÖeJtþlñ/ž£¢ëÌíjÖ¢xQfµü O–PŒ(œ¡Æ½!Ë%Ü JŠZYYYšk9ÞÛ™jT™2¤*««Ë û™¨™¨þ~Iª1‹…“jµúÐDK¥²)æ¤ÆEmBüf¸eRî†ÙyG(lÖŒCZ*e~p´OHùõ)®­IT‰¢z¨)ýìµOÊ7$1%IS:O¡ðIYQüŒ.Bq5¼mMfF‡¬óo²€¥>8ˆ‚¢ÔàÉÕˈZYZj¯—¤F³è“YjU-<_^žßIJD¿R=yòäéBÿäIƒ|Àè´øS’ÚIJ“Š­šÃ¢ *×Rí{½‘2øx¢T2©¨(¯ã‡TÅŸÈibFŸ )Ï0W¢;UÌ€ªÇVþxT”F5GhI,w1(Î1ÐİÎÁßËùóP`JWû41âõø,(Óç“9jii®=ëúMHQ£b0µµ¾*/˜o=œÉIpê¿ÑZX¸¾Ð?6sÒ:¿,Ö/ IQ¤\žÍ4ÈQ^CE­ÌüäÌo!øNÞýÅøŒ¦°©©8¨@¢JËv§ƒaIýfJ\ )ú«Œu—œøà™°3¿Ò"sÅ/‘è¤c¨$Éàò·ŸBÝQSPø·æ«À Ê_˜g;p¦óæ0)½(óˆuä~—®KÕñT—Nzëmªã ¨mû*%Hdyª[ £:Z[%¨±ÛýMR”ø[öçÌI&j~Uˆê˜>n+fu¿Ï‘¢òZØ€]l ÖARQê­ËkÜjôTROŒ>,IT®'Hê')q¤"¦¸½½ú'§z\•B¨,+Ytd=Ù;‚ÓI`í8íÇ©^I”ÆSßt¦@^Šƒ¦£èPõÿ¯ÿI$õyG)卨=£ú‹/`†êGP=¨£õçAToªïëe¨n–ß}†úêÛo¿ýªH=“T·"æCPœˆ3'ðŠÅcÃRÎGÉ8…p¹SU¤àDwU”ýKKÔH¥sHÙ¦®ÇE<:䘵ݡLÖ‚¦E¾x'Ô°‘'´×Gï¿ÓE±µ¹ð,£¡ 8Ü/xdj4tä£ ñÎ[AUÌ¡®â^»öyŠAZ_6ïלx÷Ý~ Õ­‹þ7}üyøÇŸßè<}ÕÍöûþÑ£îÿ<ûàƒNTߟü²¯÷Å ³7C½ŠBm•41~¶èŠ.ËÈ:ñ醴+6ÝÁ@vHND$œ¤¨MÂ,íÑÊS4MÁË=ª—tEûކ(±€ŽJè2©8Ñhèþu‰êáÞÔfŒÄ*Å[‘Ô/ãä½~fÄ…aßÝÝQ]~ê‡gøË_Sîÿ稫×ýïQ‚êŠæß÷Ñ-ùÒ‰:JR}Žzëo¾Cʼn›Ãu^š¤Hce¢Ø˜ = :“lÆÊ J˜A¤"@{ÄÔHɧZT"õß=±© Sh5f* ­ÏÇ:EœiÎ8ŠŒ®àSOhÒ[*‚HêfJüŒL©ê‡T]篛9þÎX¦ëã·£‘Òo£-d*•Ž’QÔ<¢Ãñý·ßö=¹?Óùþâ7:Fï¾û‡î?Žþ÷¥.º?ë/H]¸6Š:JR]qâE,NÜ”ŠR»‚ )ܳ3Eñsyß@%ÍÉSà}’åH‰¯‘?ò&HÅñ=KÈýv³H=‰SUøS\¼}FTnâ+.Èk¯Ð§òx;}Ô_Ë=2õÅ8 ª~éTý6&¬hŠú` Õéè=uå».ú'ð¾=½1ôßýúõǾ1hzöhÌQGݾ¾Šøåç}tu¸?žO˜ÍŠB½tö­—Å:è:Ʋ¤„Bq)©HaT™ ‰ªËRG–RÝ œºRƒ¨ŽÔ3HêHÔµ9~ünAL2’’.óšš©LBb¤(ªÁ•_eùª¤Æ¯ãHêxbRPUÅM¥YWÈÕw¾pGªõ¬†ÓŽø)Z^.BñÉ`žì+i•X>¡<Í/ê.4õóôFT¸WØ_› wv=ÀarìØñë®6õ®Æ÷·u žºšù(êѪËQGݾî*×wÃ5©pWÇxwü2ÝæDz}HJžT|åxF»=·Ti ƒ”Ê,CJù&Ù)¼FÍT×…ÐI‘ûÔÇ~ .[%Q`VæÄ/쪠tOâPq’lœÞQý–â©DêÑ0ßü« ç1ŽþqxøUj$Õ5Ô¾÷׋®ñ¾Õ/Ú '̲)è) œ!À¦ØÔpJ‡uÒ)•ÈE¤¬ÔUF |âHê_xbERÐ2U$Q‰¢©D˜}y´a¸âÕ)x]Qšx”@y0Á…oùHóΪ¾º~œyÿûÇS–z ßö×oS¥bÖ[B¤ÇZßån uÔïëH=»}€Zp·-M“ J1•KS×R`HEPyI‰Å~3MˆÚ)ábyd¥Œ©Â°ˆÍ§k‚„Ç@Œ/Ó±Œ¯&˜Þ†!Ì‘`ל@*Râ*Vd³ÐÃܽÕ/ÐÓoCÏ/öûún_WõëÊÝÿÿ>újÖÅPÁè‹}CsÔµaFßí{¿ïö½xៗc IDAT5ÞÕq¬‰Ä*$QT\gô}Y¦zUÝŽò+R˜ô¨$õñ¦HñnšŽª;yá¿tQÐS\XeÌTäÕâDóaõ‰—#²–ÒM†\X3 ŠêV‘ ¦Æ¡TX«eH={b Õ—Ë¡¨ï¿G¤B­¯õ[Oê)º?\’Â7J‘V•LQ7&©Õá!¾<¢¡ª¥ÎT7E‘äIýKO¬Cêk Vøt¼ÓPè<îqJ¹tP( ¯eù‰œÈµ\¡—©!®o¤€ ÷梛:Bý'pÁ/\›zY x0¨GÃ`«§Õ‹êSÔµ‡šb7mB¿óð lg¤] ¢ )´Æ¨ Ç&õœTÔ5VÕ Î+C*–¤èF‘ÔÿôĤHF¹ –°5üáà± øT"Tj-æêó rP´!,·§½u~LQéÞÝ_†KU‰T˜táB˜?ñAP…ÓÎPG#§¾Î>ND…‰.Gõ õóa ô ¤B%6&)ÔÝõ#¦à-Âgâe UÙéç›#%–ÚFYd™`ø½rŠ>G…ÎÌ#%†45•ÌùT#¹ Á/Ü’E+Çu%„÷žÐM¾ñÖ)|gGšb>¤©1Eu9j\û¨C5²B¿ÁTêñ × ¾1L”êÃ/¾Œõóco¢iü1k ©8¨W¤€(Í”$JÎTð¾ý:S…'s{Ò–Y)’úWžX‡X¥{;aÅôÞèðIš9¬Äu‰é­º¬®Ç:y°H$tR .Öcù29‚sûŽ'Qýõ¨ÏQ×/Nõä:MÔ£¡cDuIêò0Œê§=õôqú1´µŸ®¿rR‚)#ž“ò;IU ‚JP¦©îwçÙ§Þ") UÜb‚7y>Pó’PG†7•‡qNbܪà¥%„=¾±Ë÷p,EM`j:¿(ÇSÈT¿NÏ(*ú/êRÃLÙ ×Æu¼¿õ~èöuˈyH·ÉZ¬ç'ä(L öûŠMñœU}Ì8Ôk2U±Wm›L)œU\Ž_t"Ï–æ5puŽ¥¥`ÕB9-‘‹<4bü]u6­j‰IEPÂ%ÞÔÿ» ç£'Q ¦!E}0ÚG`ÃýQŸ'Q_~÷0vûÂÔ¾"R‚(@ ¬á;Õk÷ ñO@¥n\#õ¿<±v–z“ÉW·o§¾+Ó¿EF~ë¾²—Ðΰ$×.¥”ó>üß´˜åèkü?|Űï¾A¤Æ}B~EôÏctûž¤"¦qj쇎“†9IÔ[ïô³eûn_/*=v÷4•F¯ðëÚ) ?¼a+”ª¸)‡±òö!eRÿÛ«Ž¥DRB•B¥ŒJ*¤D®yÂi'΀q6f+ø2Z%–d)0é7*j$‹èQÔ#ž¢¨žÔøï ¡Û7ÜiÿåØí{æ!} úÖYRt& &…o¡. ÜcD¨®p/ (ÔðKߨläSo¦T…`±*„ ŽŠ~«(wÿÃKä´> €^²° ¬®|,D,š¨œy¬ˆÔ¿ñÄÊ×¥°)XªKÃ*½h'NÂE†„ ‚"Ň«RbJž8¨4¯(d+(‹ÜÅ!’êÖr‘L‘zl?QÔ‡áß. —¤ÆÕûT÷X¯^Å‘`ÝÇ sÔóxï®’¤¸) ÍKëwqÍz„Š¨Â—E4îDöš‘¢Ï™Á½8M-ƒóYx¬h'Ìg]& $§j¼$þÑ/­ôcõðé0[öç8W–>µQ#…¦JĆNDRi‰·Œ˜$yùõ+ù fDQsú?žXo,%˜:f˜ ª,Rhâ5­5/é,HP83ÁšÃÀ*æ.*ê!šË—H¥ ½„TGI¢DP#¢ XTÓa?Wö‹˜£â@ЉJ—5RÏYüDIÁeGÅ ø3*¯ûTa3²¨2T[&Uj ]_b ©Î.1I”ØxˆßŠ+Š © æ+vG%’:D‰)J¶MA\.ƒ$5ä¨KÝEÞÐíçLÄ»b©Ø¢XŽ’H$QUi†'*+H‹ÿDUTÉ ¿6’ú·žXŸ”jêMf Le®-é3ZGN¢(šr ©`…˜ŠªÈß|)’b9*f(.ªû'`d’Ê}Ã\Ù‡ñŽxÓ!˜Ø¥’2r¯MÀõ}9*Úù{Šê9F%D­)ûZ2Œ+[ ¥?C •3EÊ|6'ð\©Áƒˆ:BƒI*”³ÒÐ,EqT,LàI Y).’ÉÇRHTÈQû5Ì?Oóø©PC‡¢¬…LœAU°ÐA¥ Ðq•%«• ‹J¤þ'Ö"%˜¢yêM§)‘Ô%0O\™+týCÅI‘²Czºë²¡ÔŒ®õÁn߆L¡Õ-ßÒwû†FR÷ Rc’ʉ²IÕH¨H¯¢z©¢¢Äf&…_±RÂcÑÔ4¥˜J FÊžÏz–“ÒD©¤¾QH}ç$Å ð o4¥€"%¾þ#©kÃT¤a®l×a¿¶lßïë.ò¦©È©!)IÔsS6%“Â1ü|R9C¥¬“1倿HRûO Þ†ëìú‰¬@}ÂAJ(ET“J³!úDÁût¡)pó.ë÷Á+R°ã7ÞØq9¬„~9Eü'uù2X5}¸£ãÇáÆø˜£~þ9]彇I¥"zê÷år%‘A¸EÁiþd¸2L?´d™¢ÆâG$õ=±ÊòZš¢}?“¨¢³‰zª&!IeH½Ÿ'õ &õ"ê –¤)¨âˆ—¥HI ˜ƒ¢~ù%¬,ûþG]VD"¤`’:Ié¢rI*šòÅ F*ª¹ê¥m*CJ7eˆŠ5úHêß{b͵'ø½¸äš¯.*½ì•¤ÔKN¨,)š§È$ØñA†JGÝÏMqTèÄ×ð?S9bøUüåµÔ£úˆ^úlX¾å|¤ÍQiEt”£ Ü”É%)@ ={RÖãu’m%«8OI¤`™]¬¸+¢àe¯íâ7÷’›×QðEl^_ ¥‰úˆ€Ê•'˜)B*=¨“&NHå h*‘ P‘€¨ŸÇÅ[Æ•eÇUûÂó¿VHQç%QŒ”’£øhHðÃ<Rà)ËÆ¸J4¥¥)í°BJúÑRLI}¾þ?:<³¤TR ÐÌX‹ÌïC‰ ‘ÒP!QèÊLSp’œ3 M =¿þçŸãè= sez}ã‚H}ýNœ»}gä% b”+R'È3’%T¬‡È=¥ÐXZÁT&K©¨² ©ÿç‰=!e›b¿ƒ->ù<ÛïC¢)ë,1…ÖàK9NêXc§¦()¶D쌤.Ä&˜z_2uÔ–eQ½¤þÕ¡¿Ø?X` vñ.å<šbž~;ÞÀžÞ/;½åÓNÔ0)<’7-׌@µ¾‘ÉQÒU©BRcû·(¢2¨‚©)-e¹4aRÿÑëÍD§¦ P’'*ˆºä…Xe°±¨¨ãi±¤\‘òÌlèYµªãáØ}tÖ!†n^o å·°©á-Ÿv—Ôº$õY˜-‹E¡G ¥¾žËQ|æ„!J3•ׄ†PwX TøZ5¥ 2®øb[è—àV¬­’RK~`jºFê3•Ô%ƒÔH•F%¥™J•> *’gÑj€Q-½Çó ªéuIÁ9¨§½¨a*ºÈ‹E‚SÏ»G*¤ž«¤jH©˜DO*bÊA*)x3V$õŸ<±:)þ 5ö˜Š ¯Ø'>@èÍ)¦º ‹½øQ=e¨RÙk’^Ý¿ŒÃ¾Ëë±ð7šQbˆÃÃ/Pª †Ÿ†î;¼É) ÞphN>ÏÔûœ¦tM'C45‘Ô4­ö ]ºp‹¤ÄgÙäEÑEÆì1’G4u•Ü[Ÿ3…®D  Ø‹ñüÚˆ ­BÛ‹B˜À,tSVìWiêsT(NÄg³ÝÃC(´ÎD(DÊ3šr€b‚UBšš@ Åu…ÔßõÄú¤h×O¹¨» )eQ2Ú ÔM…¹é”  ê_ŽK€U¨°‡úx_†ÀŽ' jÈQC·/'@·OXýÜ/j")¥ÇÇSÒ]ØDGSs“º¾uR©’Î{}2'q$4$CM¥ítVFVR‘V)b¤…Ù"a½²ÂÆÉ¹iKü)Th°Ä+ °N?d¨^T÷á^€[yÓ2Hô¡7©»CÇQŠ(ƒ”iÊQÞ£˜V Õ§Bšj¤¤D•LY J%¥=Ê‘B)éidD…M½OM) Ø"cB9 s_zVbªW˜œâ{> oÛoðRIá$…QdÌÐŒ²¢êH)%>—'žªpžâ=?XZ˜•ÔöÄ~âÏòÀwCý<>ƒˆb+ ‹]8Øç“8‘ …—‰0!+>óïiH`n âGxU_DIÛïŸAÚ¥UÄoH@IiÈö>º}p1LöpŽXå­ÇGJ©O(¦Ôª¹ÓUU½©”¦¤˜n*’ú+O¬KJ¸ä;˜âc‘)üÐÕM9'öôáOÓ4Sé¹lOSž8Û'i.{ŠÐ?»ö¢z˜nÎiB+²ŸL? ÷ò3‘à²ç™Gs8I™šC­T¤®_M)¤*Pm—Ô=6‘š"x¢+üƒF W¬£÷3ÝP6Ù‘që‚ùìD^zá(nhøŸ…ý$¨Ø*Ñ cIK‰ñ­!¨q—ñîxt[Ô0íZh?þ"¥™t)  )Ñýû÷`ìû¡E!+ù×ôo7CêÞ=L <—?“#™¢? ŽÈÏ”‘L}q;ùT§±Šm:\`I )¬/Éõû,Û÷ëƒDOLó°Ù!ó½H÷òÞ†¤PR¦©RR>Q÷apS¤ë÷ÒcJ@%ÿ Dêïyb=RèÙ,SÑŠHSÔ”ÜÌx`ó¼é­{ð©ñ§¢§X?€–ƒ©´ÅØ'$ n6¤¾´‚K\glLRp¥|'†fb×OC%Ò®F隸©QUÌS¸BÁvÛPeúC›Ø$©{,S¡EjøRâbArP¯~&å¼ Jiª*¡¦È¯Ë)êÒØ9¦):‘œ˜§*öúB·ïæ¸zºÑИzc5¬é¤ôùQš©£)pmJ•Ç'õ_<±~ǹêQ½-£’Ë~"(íEú¶ ¹ë˜ñɤb’’I]BW“‰)6v pŽï<„IªV™îMQRTT ):¦J¦`š2J+NA¯©À ÿ„¥"8Óôô ÷žÔs­ÔˆHá¹´â}‰NPãÉš<[ͤÃc"©«´|I]%óßa=™9*¢Ry2d(.êÈQôfpƒ”%jRwlR?VIÅGQ€]U˜Š¤þ›'V!¥!•½‘*“zÀ3 èÏÉ:âzëã?|ˆá`ì¼ÌDÇR)Kñ¢<¹ÄÆT݈‰ÓUšŸÆõêXu»sïö¥3üëð°D”=ÕO™á—e™zœ¡‚•t9”tUR¾ˆ¤þ'ö™N¢dJM<|) º®™µ$MbYZ˜THS ~wö,LRÒU.ÕT»<¨–#OTÌPaý–¯Ã|ÙtIJMJÝäDM%å¸9^3õE4ó”D•Uµ°LER]ØœºØR´ã‡×w¦ý¿7­ì”›(†Ÿ€¬ecs™ºL‘@¢”Éé¿Æ?êÏTüÕg„JP Ô½{Ê)©ÕSb¯ˆ4Ec¢ßIò ¿Œ)KTP5¦©0ö$yo™Un|e’úkOì)Zžøš<†€™qNt}À›vd˜;M]…t ÊLÁ¨‚(’ž"( êfèôãT^쿈GRÚ0ƒ~¹¿\šÔ][Ôc˜¦n§¼á@ªŒ²EÆÔÞ“z’榋¦ª|&’9á­¨\¢dR,@š‰vò{QáO_OT…:}QCÇÏé)‰’H±v­LD—IIiJ5 J]¿Iüï“hMÆÊkjÿI=‘PqOzçolä ¥\&Š–¤xe1%Q¯âµ[ 3aC(:ª"¿'ÓÄŽTëã&(K°¹²Ì“–‘tIyPRª0H¹º~²¨¨îÄ´RH¬YRÿÐûFŠŠúš6uÍ‘ì ÿ-ƒß#¾Q÷òÛøÍ\¢R¼Ø-U%¤ß°ÂEÔ˜ @†bse‘¨'(§¨©¤4Q(OETa»DÕ ªªÈT$õ<±)•F*µuAUy"˜ºÖ'½.Þ'1úªti ÑáÈIš ˆBœ/3WºúD5Á–ìàìÑ’íJµ>ûáú ˆ^RÐÐ{!hžºÃ¶‹h¡-· ¨¶IŠ™Ê“ºMIy@A%˜“< ~[¸ÅÄ‘¤)2þGAØ›×.² ŽqO4AqQCBTèI%n˜¤„±”‹T@óTD7SˆÊLT!EMÁ–}Ï&uómˆe%%ILtê†0m#‘B Ìi¹töÄØëƒý5<Å9ãÁ^*iô¾D‹žN‘Çï"R†M‘àéÀä¤/ä¢z*~¨ˆê>@%e%«Š¨ž‹¨"©ì‰õH=EÝ3:c¾ž”ðþàS’Šfœ©Tˆc 4‚¯$ ðlAô8ßèM”¦ã‡Žê ¿5’rzRAá¯÷BPYQâttÔ{ OÝå›È£¢v=Qm†R…:`÷Ä4epR³éÔ‰šà> RîÒ™âHÁ¢Ÿ¼.Ím·/æ¾ @ú`ÍPaiæ#Qõ™IÖ”-šKž”„r·LA¥`z€XQ ¦"©â‰}!õ@A@zbŒ”Þ§ãÛã ðnÄ÷Õ ÿ)L –ÈAU÷(q»è× ³?=øTO QÙôäÔ+òUŠ"\¤T¶)´ú BE:FžzmIݶAÁ¿V7 É÷㾩ޫEe!d”T2õ™(Šª¿{S¾- Î0<ÁOt*]Ü—¢=>§'Ômrôöh—Ï#JºÎ+’b¦À_æQeLqRÿÔë’{~\•4dºÍ ɽ9¼i® îLSì9r|”èƒëdP²a‚Uœ å<7 ϸA¢ì’„339×?Ï€Ê>¨ã®2 ::ÝF%E¥\¯‚TòÔkCÊ6¥ŒâVÁÆÍ…v›âº·Mé•<œ†Ð‡ß(“«ÒSükôiÂ'@OäR”wÌ”ïë ä$e‰ºj>Q•¦è#J=y*’úgžXÔ)/)6VàDÀ£w0sN±KT±vÏYIݸT­“ºu#ü÷SìÜïz3ÞO(|àô´(°Ú9œ}„Aå9½4(•Xgi£\¤íϼú ì)JMQù.ž®© ”8ò’Ê»âCªhJ#õ|{¤4T‘ÕøàOpÃ:Fº)ʃ‰’QÑ?E»¥Ù€ÉÉé^üXaÏÎP½ ™€dEµW ꋚJZø|FQçºÐQ‰©j4…ò”VŸÀ¤þâ‰H±&,gDyîìÇcT²ªð^Ô0t‘]ƒCNl¶„l¥N”Xé+ÅJ}”ˆ*c*ާnS´çÇH½ë‰-’Ú"êôAR´F!l[3C¯pç¼4TV>:¥¼ììO Ô ÈUrª2 ‚Âo´E™øI £êEQP2)fJÄ)§©„ÎSÛ$uÆjëRW$RXƒ”0UÜÜMGÖféœ<` ×åbU"5λ4Ì. QhW5± QRêYœ E¹8aQa˜J% úŒ*n*’ú£'ö†Ô÷Çì÷i¦Îd<±HFAn26ƒ4áyDˆSlå'ƒ(Ù@EU)UÀ 'a®„"Š£š‡€ËõrIDATG”ØüµÙ)bÊ‘¦`žRMm•”;)Xž¤ôQÞ’Sß*M}t¯pÇÍÆƒh Ûuhü’g•se¸ÜeŽ|!{²Dɘ,Q:)‡)@JÈSªDê+Oì)W¢Háp›‚/r‹:ÏÇi` Lœ-fÝ‘q nßc£V«eЕ*Çê$Šé¢” ¥‹2<3útR)Á…òÔIf* Ú{Rªçhª€”i ½‘é·Q´å´?ì– ÔÅ m:6NY“—’™gárEI±'íú®[” ’¢¢"ªÓ²©Çœ”xÉ¡Ú,)o5ýL÷LÁ×PQzHé*ýÓ{zÉ“Õ碠4O&*]•¥Iˆì£¨,)mj:<~wr¦"©o=±ÎLtT))­ù«Ý4m+nPÒöI‚ÆL?aKBkfMSËO 9UtpË9#Uš§ªa”áI© {º~]<é†0ßï%$õ½'ö…T®Âm`ðæ’ÙDqSI_òVÆOÐ+?J³AáÖh¢‚m¿Â’Ê2¥ƒ²žº»„¨hŠ’’ŽÝ]ÍÔAÊT¯ )½ËæQ!¥‚â#zéä%xb&¹Iò¶øX iý~Jº'C•+EñÏ1”BJ1¥å¨»ä>_ÚûÛ8)|qÿ*¿DÕ7+¥.ô §-<åpBšPCæUjˆ2&)WÚº+¯Tyâº<Bý0% Î !‹IÑ#†ÜƒÏCPõ'1’z䉕îê- Åç=T‘J¦¢TP¢*X“Àµˆ—ô¤}¥;ÓS{ˆÙ ¤Pó“üaü¢$P5¤DQø²ù 6v¤(*Â2¦Ë9H ¦r \œ°,R1Ç M„ Ó_mI^O\Õ}±©ÌÂdš'_Ž*ं"E??ôñ3pTÔ3O¬¸öD )Ù”ÜS:…¢®_Ïãº. ¡R‚¢ lH…ž8*åx'Ï–ìUŸ¢4Qå¤TQ‚©àªHêO¬ºœ Gu†“Ê›RDqS)[ÞKÑ$y:ˆžDMnHò^X[•lÊj7åš2±¿%¼Ÿj.QT:V(>üŒCªÎÔFI¡ÉÁ|¤Î«9ÊŠéÒfÀÆ 5&(ÒðJ“&JZ¯8ÊMKý[¾öÇÇšAT)xtÐGÐI¥JGçr#¤ÎóÊðz¼‹˜b\*5Añ™¾`¡P/d(ÿ÷·Ï“ÊÊ k‚&+<ŸOþ,%u [ÔE!Iу?-=¨÷—H}è‰}$…ÒÊHê ^€oFRHT-(\6GC( ÔDL%ªì‡Ù¢5Í“OTAŽšÐï;->ð‘^”b¤\ž©'*©ZSà…*¨ç8„…{¤1h¦yJ~FYŒUÆÕ áJÁÊþÏ(JHRè˜=^ ÕÞ“²º|»$_çŃ‚‚¢8¨Ù%©Úž¨zRIT$U$ šŠ¤.xbÏHÑfÆRt‘Y(~™&* Ýþt«ã 7¶å8)ª¦™*û»Š* Žƒ) }j*’ºì‰}!¥´üDJ¯Nè RÔ’ì©$=áy±±Ï‡šÚ’’LX•¨xÇÑâÉ_”Ž‹Ee¯JERñ¸E¥—¨6IJK&2)oŽIqN’(‰à‰‰‚}>T©Òʦ¢šKÚ”ðË¥Eé¤ÎERñP¤ÝuŠº‹¦ÒFR×<±¤Ä†/’⯷@QS‚&O^úI y–1CñÖUОŒpbTTÍ¡)~NÅÕs›Ô9"Š'Ü¢`¢Ú)%“HiŠÿEFÔÇ#Nô313å{x (yY£Ô4õ†Un©•–ªEIÙ»Y*²ÉŠr“ÒŽD4µ÷¤´NQ’H±[~ H‘ð§&ÛÓKäéÌP#(Ò°æ³ÄXÙÚŠúópZ4GrdI1Òqxœ#e}½Œ¨"©Ï=±?¤"ÔeË•2¦Êpr‚"³c%Q p2C6…›ýbž–íõY¹ ‹ò‘1µER"Å”õwº1ØÙËJ¢ž^Šq d¨[©Ë'´§p !©šOÍ<¢´}×EY‹MQlÆ,7e|£@T‘ÔžXŸ”šSRöŸê[«•u`g¨µA¥6µsS9JÛqƒ7¥‰: >»lÊLÑÀÔvH©˜«Ê.¼Þu¥TFÔu+#ª¬Ý ¦1ƒ©¢šž£&’"Ÿž’ºëHQÄT$õ‹'V •“„M©!½\çÄž¢2CЪ¦§,¤ymí•[”µ×æÑ0EIŸ¡rŽ"£©ß)ןÓK¹2(•;Aá[¢Æ³cõøj@McUkªŽÞc¯(sŸ3‡ÂÊQâG·M©&¾"’úÍ+º¢4{&)§Gr5Pé`¨ Pñ‰1EѪmI-eº,ùuܔŅ¢(pÈÿ¨\“ÿ8å@ _'LUîm†TF¶”5åô„PHTô¡˜D°`}¾;°n¾(•þ:7*ÍS%Æ:Q3¦rúÁ‘ǗĦHñ¸NVv@¨Ü’0¨ë¤ÃG’ŽÐdžDMdòDy<9 Áe¨r/”PÁFæ°Tšf&…>¼ã[!Gê¸'V ìÄÿÁQÕ{â#(ÚÇUð•<='Ð1¥·ñbe™*ot˜Z.*A-1àd¾ÌT$õ–'Ö!åÐý3Ðè®AaOq QUÎÓI2?6}ÏóփϹƩ\—¯ ÍjGªj=M"Å>´äJ?›%ï6ϘQ9<±K;)9CÑçœ)*—¡Ð¹v‚rªr5?©EíÂT½¨jIÆgg°œ¦hÇoI顿)#ìI{²4"%˜@ñÞH9ê¾WT ¨â® £]Á&þ;¥…Óp¢RÎ%õŽ'V#…«2®¨J1I% Ö‰“M‰Åò (ÜŠäöQîi.UìziWä]ö? æ!Ø)­$ÀMùôðxÎ@I#~1åžf:}Î ¥“ù¤‹eQ馄65™{‡}u.J%õ…'öˆãÅQå«èò’†ILS´l.jb p;’[‡& ÇrªHÃå®”(’#ÇZвßQàHúÒ«‘Ê”³QßÏ _®•úp©îÍѾä@QF†2ή€i6TÚËi;v£Ršœ÷/WeYÒP½¤^êQ¥Êß™܇“ò 'Eó“<€ /T@) ÅË)˪´%áßóÖ\ƪ"¢ä2cr¬JBµ9R†(è*ÅG´›  6 ÒH 5 þðõ[©,¿°ó¢ jQå_.¶ìÝ{š`©\”}„ S*©o<±&)=]¼DyJ騉A7ÎK bž‚BÝDÙžj@YªŠ[YÕ¼´–ÈJ墴£úéQàC<–÷¨*õRï~“’kÈ%•EˆHžÐ€JØ”,JhI³ˆ*3e4.üBÃÔcùÍæ)/ÊÀ£ÈÔ†HðÈ™òƒÒtpR²&ÔîD˜²›Xµ)+×Ffä”û°N Õ9²â_†ÔwžX”Ö¢‰«ŸÂ•*”ÐY´4!Sµž(ÅÓ¤²„‚b{’ –¹J¸ÊþdVD¹ë¥ÄT©¨ÈŠHê¡'öŒÔž*¤ Ptu’†fê„ ŠŠÂJoFÆ)—¿3KLùCn¨¬vL)§(#Êö”»ÃÔë@*Á¢¨ØˆI*/hš4S:&ê)‚’{>O™oÍÝ¡šÏÖd5Å„LOLªÓ•˜§"©§žØgRØ”ZÔò E¡BE Y%¥:­4 ïù^‡ÔDYÓ,Ὤûtõ ÂA¿¨”Ó_?R •tÉIä”pÜ@Iðbb£(eXáåüÚ\U´( ?Vúqý„hJ¬ü<µ÷¤2u7nê'ž£tO (•”͉¦¨ÇPSDM"e½ºÚae¿²ÒFUøAý 7>ªb*’zßë‘r°J¨Onƒ™²)y@™íª¢GR‡*ÿSPebº²à‡H>º’%É•'OERg=AI.Ž ¶j!ÑPR/QfNÒq›ò‚B¢Þ³¿¯µ“ï%˜ªhdâ‹^OnQ9Pe¦¦ê=- )y(y V%PQ7NŠ¡r’Deú?êÉw“b¦jÚ˜üÂísºèå•L…#vN¯QL"þïnHiÁ3•ʇ¤€Ó­4EyÛX¨Ò®ŸÔÂ<§ùòîƒHIˆµÖÉSã€ê´œ§"<±)¹ì¦™’®@ž 'æ ÇCMðÁ±Óçmh•¢Êº~Š(w[v|.Nó³šËSçÎñ<5„µ©“J1;¯ w³i'0!¦”„ÄâÎp1Êîóé§_?ç^TemxÖ†ìÂdìÇL;$os'š§†{ZÌSÆ%O|–®Oœ$u‚<*QT¾w‹ºA_fpº–‘ Ã(ÿ—·÷´OÊSË5á’ð€š²C꧃’ò”M*„L)ÄÎEý-¨ÀŸªha0ß×»ÅH9³ÈPÃ$*žjãû[=íÆ÷d±©¥špI89MØ#'§:Oà`StÂ_¤qÕ Ðòªpj¡„øs¢L55 Ò3½îÓ…ηÖ#*!%™ò4ÇeZpY‰ªÚ#§¨zPÐÔEÔãi¤vpé—Õ ÄÐP!Qª¦ÇäÄŸ.Ž:y?Uú2Cs¥øÎ|¹©åÚ°;Ê4U3”h ¢zúÌ„Ð.&StͺT•[”ÙÙC¢LPãÂÌñbÔ¤ìSj“úD~ƒÙ±7 öaÂÞÛ˜T8ÃFRh¿)¤v2= 4ïÂl…:‡Tê»M•žæ…*çÍÀ}î=¦ê£¸%W´ôEö„ý=ÿò™0Õ½é¹4¯1ÞÀ<”^³XˆT%*‰”0&ÒEå<…%ÅÀåÝòvà?û®m5¤ò@êÎ&(af•wd’òTÚYÁÔÞ“ºc0 E‰œ¨¸[¨û(† {Ž%4£­eAɦªs™ˆ‰‘Åv¨F”ëZ”b§ŒÔ§p'ÏVçÎERÇ<±©;•¨ä(%åuÚÈPBó°Z[%)‹‡· /Pt‡fIRSA餩43’zÓë‚1Ñz¹½="Šb +ôù@¡b67(Um[.qQNOU¦2ï4Õ“E /™Xm¡ÅP”˜2‘’¹ (°ºDVÔxìíçå&UÜŠ—ˆQ3“š”^óƒ{ vh«¤ìÌå"eå=8Œ2@Á[ =¢²-Î+Ê9-©ªÏ%¢ÊM™oµ4) U$õ¶'ö“T¶Gh’þ€â˜È3ÎMU'Ê“§ªò¬Q²|WÊrTf¢ä\ ÈÑÇ»ðúrªòâ)ê±j^R%¢r¦&5ä£t? «~æ»íˆÙåHê¦'V u·ÀTÆ•PPCôD9Å›á•\ÚæÊH©ËQÔGÍþ;?[ý^ÔŠbÇkFQêÁÿd ¤î¢vN[=þ‘3eåI ¢Þc fµW¤„=%æÙ¿(›Ô¬¢ŒƒIÝöÄ*¤\QÎÊÔD@½ÇOx ¸È§  ¤9äÓëlx¥¤öÕÜïà5¿¨Â£?þð5$E\‹âSŽ”å~ÞÚR¢V#•55÷;¬1*<üñ‡¯+)ÓÔL)ÊÿÃ׎”mÊ»óSmfsÔÌIªøðsR÷<±G¤îÓPMù½®K2”ª)KÊ5[¨‚”Õ2«@•| aÓÖ Õ|›<á½?Œ¤xboH1P‚+Ñ”.ŠÏ:rÕ$äoMWûs67÷i-iÅÙ?sD±¨Â¡¢Í¾-Ûü"¢¶JФÍ’äŠV)('Ñ“’¡2 ò‹dç yÏ£«5V6âšðiZìVåE¥}F?Û)€Ä ¼žÒº|j†2¯Cé={Gó›¥Û§·FÇF-…‘áäûxòvËAM%U~àñÏ"©'žX‹TqäLɉOœgŽ@‰ž<‹È ¤¸ÍEe#^&¼ûÌc÷¢JH‰Ÿaó¤£p™R†e¹™±M2Z×®H9ÏÿNbÂþTˆÚ]’’?B$uÊ{Eê±ÄÔ]“0‚š”k êf7sL〈»³[Q3’:ã‰="%ƒ¨Xíïn (ï J•Wȯ˜x&'5‚EcòÞLµã$µUR:(‰”òÖŒé±jŽ*&5KË›72»Tóyê?ßF#µ4)ËS•¾1ÎÉãI¼ì¸“–·ë¨øPÕ‹mÇ j}Q‰ÔyOì)¨g š¢ª¬m¢ P¿#R¦æ|³ÝˆúÝ‘âùè=‚)-ä­¤» • ÕŸÇ ¨R¾6ËYŸ;¥¼]þ8󔉚^Bß©(„ʉ) J¾ÃpR³}•ÖÇ.A‰o—;Ê|+’úØ+â4N¹Deo#ã‰â™—TîLÍÞA©z*y?ãmwJªß‹HêŠ'ö†”ŠŽ©¬@–ÅíÌI*s¢ù>­Œ‚r¾ßœ¢¦ÖÍ’R=åM  jr¬(1)ã-û¥Z;å{ÇYEÍHêº'6JJõéZPŸ(‹1WÒÏÐÒ- *v *ûŽæ;WšrD7JÊÅIù8i·¢Œ˜CÔN¾U«bÇ ìwœ_ÔïŽT@•1$kšÎ©Ô aB¨Œj²Þ2ûîU¢æ#õÜ+“rxÊç#Ÿ§  &’Úi˜ÒtvÆI|ÏÅDÍGê'O¬JjNLçHX"Ê×_­UÙV¼ø»ã(µÂÑütc¤&ƒ¢Œ\žK%©YšÀ”F°/4½;±Q¿R<©”2˜0ŽÙEÍÕòàÐßègj\%Qú¡œ&ÎúOBH½ôÄZ¤–uñb”s}Ë*Róµ€|#I‰[:,Ûò Qõ¹lN™­N<šz|ºRåœÜËY}=³šµ8ÁaAÌ×À±Tû^ò`AIxbR³€šÌiFR3·G+ÀYÊÜ'5»©™?Ü ï0Óç 'øõ#EA9-å5LµTð4ƒ@ʱ!Ô”V6Ó§Üá[MOR‰Ô Ol€”Te~YDÔ´ó_ÔVih;ü|³¼cõ}mI™)ª änp¾†°ƒ·Xêã½ûÎÞˆ#uÒ«“ÀØœè#©§cò‚’7µx{sµ„¼ÉR¯àÍwô6e­¥16Fª ”,ª–“‡”ð'»kÙžó½È¯•ò×_-ÚbIpRö³˜ÆX‡T§sBQbŠ&‡(¨9[TI[àóŒäë¹›‹ O¿*¦&{Ú©"PKˆÊr‰š»=ù[Ãa÷Þ@‘4‘/¶7ý[|?£àèpQ?Ħ²÷¤*SÔœ¢ŠŸ¾G ºÙH‚¤¥,õ+‰Åöw½0>Û,¢Röƒ.ÆØ/Rúýv‹Ÿ“”Ôb­Äu¦?H&õëá¯G‰kloé¿Ûk#–{cëëbQ©ì*â]ì)ë¨yA•=:}g |mápØTǨ³4ˆŠÿµ{SKæH3ÿÞIqIz‚ò<×á×’VûçÉ{¢3¤~4.Ù¸µX¶çimz‚"¡m‹”¦I›{äáF©­€Êú:D–v¬já7¶¶[ÇjD”´J+‹ÕHå-YžÜ$§Êú=Ý¢óD—4Š=ò‘H…6f“Z^Öòoº‹$õCl$› åH•‚úÁÕý›”yDˆÚ3­–'b#s‘ZŒÕ.Þq%R®Û‘Ö åô¤õÊÊËN<•ŒÆ'i™ldÆXj™vžÙþ즬-N:¶0>Ý©Ò.ßPéÈLåCù›Í´SÝkêEÅK¼‡¸‘)¿y{£ÙMœvla¤<—TOï )u UÓ瓎M=(gUÂÛl¦žj0]"’­V¾.UÚàõSDÈx‡úз7õè¦Ø2)uåõ”=ž8¹«|Þf3õLçÞûWwZZ+¼GÔu°g>º)>Hi,ë“2<ùDyj­§‚º¹³ÑL>Õ™·îbÏIÍ`JÝTùñÄg>ýk›¤hz²nÞð6/íÐÖp*¹åk3ågܱO¬Éî;©XüÌS09ÿà_á?7EŠƒ2&Jø—yl 9^Øu5”ÂîÛ«$ÌEǘè‰G˜4©q RB“å±)iWÜž¼‡]?„ÅÍÖ}ŽÍfRv¾»¶„£âP‡Ï=ñgú-©O<±)Ѷ¿Ëç?êsµZßη’Êý1wn5 sEÕÑž~„} 6B*ÃɵäQ®ÛþŽ6R¶'®ýÓ[*;ì‹Û¨Œê#>á{= ¢.†C¸R†¨9Z|}ƒ-Š|)Øï*ÍT;ô»ARSzå®%åú“õI€2š¼u†*›kidˆw?üû(6Qûè/O¤4&öŠ#ìµAR4iÖrœ¥²¦ºP”úÉí¥Ð>]g`q%e±ëã[ ª#u1‘rm~]RE¢´fïË>’š TõÉšé$F‰¨™r÷åoWö§³¥’Ã÷»"•ËPÒÑ[ò„Í{ž«"j~Qž°ß©ð¤ÔŸ!ïA›‡ÔE@Êu”V Õ¢Å6ãÐkïf‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hѢżñÿÅíÀºIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/surfdens.pdf000066400000000000000000000160641477365367100223050ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 5 0 obj <> stream xœíK®e1R®û9Š3‚ß Ñ†@ ±è6îô‰ømÇ+š´R¥RåþÖ–½¶Ã°ë¿~Ò'ÿ$þÏýßûþú‡™?ÿþÿ~ÍOùùÿ¿òÏ?ÑÿãWúùÇ_}Œôí§ÕÚ?¹ü|õY2ÿë‘ÿüõ¯¤ZãÓ‡UY?ûÓÚ9ÄšÑ>›I[Ÿ´®È³¯ÉAŸùÒó̪ÆþŒó®²Fù)u|ÖÜ$)«æÏ?e¥OšOâÙ÷üQ-ó3Rùó[Rþt%"y£û–^öþìò³û¦ôãKæ¬E¾>°ï¯: ’±ªÈTõÞnU¿§hUeú.?VɹÄ©öÚŸ: :–~ÄªÊØ”´yÕVC•`|J3ozĪZÚ‹kƒ¾ê§Z©|ì«.°šÞSÿ,û}XÕ(iq=ÖW=âTûTñû"ütÖ¹ß~ßòì²û§¬lJüYÊ–x㺳L‹Èø{•ø™¿/Òò~[ÞïEZÞOeËû¾JŠ[4ZÜïEZÜOd‹û¾HKû‰li¿WÝÒÉ+íû-li¦°{%“.ÇQ¯IêFóÈU9Æ*2EåêM6ž×üAÅ?§¶_ øù|VLÒufU{É^/•’’¶F 4¯%å$M#0ýn"\®î»#UKÜG;‘G¬É…+ŽK/0VÒs6 gäˆbÍXTq2wH¯ y$z1õë®x*ÕÍÏ‘ÔõɃjôx¹1À¾Ù]„ú›ÏèÃh‚†‡q!5Ï´½Iœ„m/IË£ž×ð.QÅ5·•h xïuVñÌäÛZ80SyÚì˜)K§òÌØÅ¥è™±qÞY}Ÿg¶¾¤&£ÕÀLÍ+3Wõ.3µØÙÆ3Ó"¬3­Ë«{mÔ&gz([<úþÖò­ š½7ßÚgUü¶Cú¦Ùç1v`Róþ(”œºæ9Z–¹ˆê6ç {†L_¦Æ¥ÉÑúxÛ^¤•ÉiÒÊëR L›‹Ëv`úù÷SMÃ3_ÿ€µÝYdS›Ý´`ÇlÎW“ÒÌ–ÁZÚizfKÓª<³–1)&ö5Y·ÀT%[}«7På3 2ÓäGhu›IÛÙ*ð3§"nã,#É#æ%µ¡„Œè#J4¹ –mD¨¨ÎÕyH©"!FÔÏæ›ïZ¨ë6ßBôEeWt¤*bD£®JFôˆÕYÙUÑ#F”¨¯µYºÀæ;¯„I°Š„è‹r§b¶ùbD¥5®ˆFôˆŠö`‘HˆŠ–ê¶ozÄ•ø†s2~¾èÕ¿9ö>bP©jÏã—ÎOûüV@}‹«º5Ш±ª[ê»,uë ª„XÕ©…šó¬æVBó¦GŒêÕBU ±ª[ ꫺õШ±ªS5ïÍ«ˆú&!Vuk¢Q=bU·*Õ#Fõꢪ„Õ«Œšy!¶äOm4­ kt®G+×»àÙÖLüt¥„tÊ3V­ŠÚp»pû›+0 žxt°æ›„J>¹¸­ÄVTž¿Kú“Ÿu´1—ËÀ Â$ç}ÝU9fT…ÆtuyÕe&E^ÜÛ§x™äyµ*ëcŽÈw¯¶ŒC2DKÏIÒò· yd,isØWk€ýúÀ¾¿ÕÔ¯63§Ô7ÏŹ¼k»«¨”Û·*«:ºPÔRÝWåw%­Ÿ‰âT4¤X館1ö+¿rè+ùä-‹W‘±jc½pÐXëíD†n|‚È#Öp¶mbà˰®fóì‘ùúû¥W䘪fª°€U=¦éM®Õ½\‚Ý\OšþJa[ _>idX»ûò‡´ (0µ‡K,0µ¬Ëu`Z—\ öý­ÞUgs–¦¿B|§êGùZ<ÿ¼)fŒæ×´ïòŒU ëÊÜl4_žUçuù ºÌ¤ØlÍôŒUkЫS^ž±ªÂc¬ºß\6 ”Veïå4¡¥ÃïúÔ<ƒ¥ —»Ï¹gP ô¢®<3ªaZºC&=ªL;/ŸÞe&ïצ.ïÆÎg;r­Œúq‹Á1SV^åjV…M]ŠžÛ¸Ü{UeÿèÊÁ!£q%ê™IÏYÇ3“wgiÏþXgJº»¿©ß†Oä¬Â_rUޱêl ÊίùÍOÛYdÏí>ÕßxZ¹Y´RdX™QU^ô(^u™I‰Š¢Kn={¹íE÷-0ßܧøƒÈ ÂPP9ƪ‰õ$ŸœgÇb«Ñèò9ôÈH•ëYgOY:áÈŒjäß̺ó›Óå‚ÅøÞ‹Ið¨SÕû;[:‚ ÒÃ^—AD¦´cƒÈ4óT‰}&5Þ8 5¢uꑱjEA38ˆ æáy/rˆsNÎ!ByžeV“oL ¿™ª¬LÓ³þ82ɹuíI ØAB@Z–^ä™ÚÅ%˜ZØå<0­S®ûþVŽª¢fëHâ;’x{¼ÚßÁR­IDF³Ä½±ÊfG‘•éñ#3)6[ù<ƒ ¸íñ#cU9Óöø¡´2wNNãZ5Ï`é߯@‘}¥×±¥™Q Óâ2é_™É»ñë‘¡:ÊÎŒ"3eåUŽ¡fÝÑŒMÑ3c—{Ï Âö¨+‡ŒÆ•¨g&=gÏLÞ¥=ûcáUvÞ²|c€÷Û8Ë€HCã¹™7ùs-ÎÈŒÊøÊÈH5?´~72VŒËV`¼PƒU-ãP=!Å(V+ñèûk¦3J±iEFª|F)vFîWG0³ÜÈê³^g¶ª°¯3²Šì«o×á[@¬áµâF‘ñž”íødôŠ¡ƒ=ðwd#;ôx*z<•zŒ¶ÑuêÐc4ïÊnè™Ô=;¦HKôO"ñº£bɸoO¾’E; ˆL+§PDÆÕÎKìo-l›RdZL–2Ÿnücdª²¾62MÏúíÈ4ïv Ùù~;–°¿µ "0µ‡M)2±«Ít@R‰ìçôšrZ‰4±W£Õôu:j;ЈŒU§íÙFdFeBd&Eã"#ÕFÏgýA@ô…ÔvYmÝG\T =¶s±ñÎìפiúo££€¾Ò»Øį̈Ե¤©æÚxû€øë±ÿiÇ ™r"ϸ6åcG›\`Æ"6ã±ê¼Õ–€GFcË20“ž5K`&ïÖÀý±¦Ô}BúöØèê9öt–Ÿ½Ôg:@ÏsÇPNo£ÅÁp'E‘S™/T+2Þ“*¼/SoC= Œ˜P¦1Þw@4òŸ”±Æ“«¿èÖÈH5Ò!9õ iÚÄ*iÎ¥½ÐšÈHU*`έÉÞV`¬º1Ï™žÜ’ŽŒwÀvâ]æÀý6q=cÕ ¥ÎEÂãBzýº©o‘±ª#Œ>F‚"cÕ¢.CÂ|ÀsìÂd>hð¶žãÒlå-‘±ŠþŽ¿¶f zŠ *ìöæZ%‚92ØkpôE/à' Þ™ÌXÏuJrd¬jhf+—]NÏXµ°üš[îbãÀ¸æaH¤6±q`¬:+ô™Wêo¶ß#ÑRžA5Qn¼6òƬ±jKµ"^62RUŒ®‰´çebMÅx¨´!^62ViHi«ˆ…cÕ<õµ¿ít ø9l/YÌkžŸVÈÑ Ï¶±joX¨$¶ »X §.r‹mÃn'fÔI¾³Caÿø|bžqC,FeT9¢*:Êlô)Ö ŒU9ÑÏ)îÕÄnœÞƒ _D‰C7¾ƒ¦!âXàçÜÁ¨âTbÍD¿SfŸT§1Ì)>52VÝSms?ŸÏÄ2WÊÂË×¥„“‚èW ßir¨Ö1¨xHSV‡k*Ë…c¤ž]cÕr;é^‡î ’Æ-:É´€Ÿ/DàQ.2#ƒ Q„e·köéÃøã3l`»™NeØkŠqcUE[©I+Ez¦ÊëûÃì«x@{§uÖVTøŒÚ²ŠŒU'j÷ÅÓ•gPâ¿q1Wå«:Úü‹Q:*ÏX…36ì<®Bã)<¹u£!ô—yj¯êH=bÍYy¡‚U?G‹'¬;s?T§GèëùÑ€ «¼õŽÊƪŒ©4ºk‰a÷ *ÌÙ¨+YÄš{|žwøÊKÏ3V3=ÔÕv‰LŒU ÿª¼Õð±ƪŽ5#õèñ’ÀÚÅl/Sh|>õjrÊ=2VMŒiŠ+‡#ƒ çµëңܑA…ñ%z#±±g¬Z|Œ›†lYLl +6úß×ÓgP›¯•Ôž‘Š'¸­-n52Vexóº³^u« F!•ÏÜly WSjŽâXbMÅœ¦î)~52¨ØuTǘ/ãAƒIUZñª‘±Š:sªŒM l?ïèZÒ3Q‘AÅ?gÓZÀÏŽ ³¡Þ;,uJVaFƪ™Ohž9o«êCãÙ˜ØÕ3¨ÐyÐß'µ«g¬Úç:›ÌëeWä4è;MÈÕ°žA…ÑläíåÝ3¨6{2š`-5­g¤b_Î64žß#ÖdT¿VÖó©As®H©I|jd¬*ù2q«‘Aõ®æÏTó\4ijFƪ /Ó¨ÝËE%±ÓËÖô¤m@РŴVd7 2VaIµálÿÕXú±Ötï)2¨0‚lmÉ^@dPõ^™d; 2V ÔÀÖKR{g¼ÿ[Šyjtï[-ì«VÂ_Í¥vŒ/ö‰}=ƒªqPÉTã€çèyï`KJ±æ¬M7>‰%¦õ *ôÁ#bžW ŒÏ«¥SåÇV¯T<…hÖñœªG¬É'ÄvÖ›% ð¼œ+-ºúÔÀ BÝlsªO *žb7žN¼N×#ÖœH|{©HdP•{…lDîÞZM¶bMEãZCv‚æ´­µÞ@@8Ax‡w’€È Âl¼í¢§¹ƒ ^d·©Æu¬Žµ=†×3VõÓ¶özð#lj ]­ë«»³Î':ŸAƒüžšzÔÀ Bíi¨S ŒU3Ÿ,q¬Aƒ6ÚsRÏT”5°«¢¯ìy¨O ŒU ­´ç%>Õ#h°ïÛÙ÷‰i=cÕYýê%/µ­gP¡½w9ŒfžsSï¥O5­C¤iéÄ•—)ëþ‘A…òêe˺dWE fY÷ìhw¾2O^d4Ü%ôÚes= ÖdôÌ)¦ *ô<ä5do=2¨¸KÀMϸ±æ\_Ñ[gê4?âæ€%"Ç âÎ¥ó1®çL=‚kö:ñ¥±êÌG;Uwñ¥A…žµ“¡>"²´¼N/—>70¨Ø@½õ¦A³Ï5skŠ}bÍ9Qׇ^îT\¬}”¡vþ€>ZWó:Äš3W,‘gPaý³óÝ /KAÃŽ¼s䙘×!hÎ5{³T5¯gPa°ÏVÔ¾ž± ‹Ê}½'Á#hÎÉÒ¹²X×!hN¯È4Šu=ƒŠþfu§à9êA_Ui`¬Â&f_]½©GWÃ"GJ-Õ(‚¾°¯­Þ40¨x Úq,XÞdkVþú®êL³ª®Þ40¨Ð×ѰP$ ð;_}ï¦vµ,ZËH¹©a=ƒŠ§Ð#Õ*†µ„÷¢›Ô«ÚÕ3¨ÐO4‹šÖ³«b°³× “ï½ÎÉãœÕ¸ž‘І ôS¿ÏS.™‘»ì {VªŸ‹‘ôZÓÈ :aÀy©/ ª©—\ö§r ªu. *’œ~žë¹¨©3 ª†ë£†:S ¹×&-õ¥UMêLƒŠ’¯E\©ù-O›zQ øù™o:Ô‡:6ŸŠ‰×%—kz æyƒÝ½XÕ²cÕ‚ÙÒ`Ç)Võ *¬TòÁjUÏ :Yq‡(VõŒUgOjPK¾îsŽïn{«U=ƒêœ&§âS³z}F¯Kj?oèiGïS-êTh‘£OñŸAƒ5ŸÑ·úÏÀ ‚5µ®eǺ kcTu¡A…wŒÑÕ‡Õ¹¿`ÐøëF}GÕ:çü¶ºÑÀ®ŠùϬ~40VÔÁ÷tÌ{·E`PaC“gu¤A…:86F¬ìT¼Ä4æNjg‡ W|ŠXÚ3V0±Š¬û{ ºãÁ16biϬj躿cÇÒãœÇ[kª¥=ƒ ·Ûí4ÔÐAƒ¾uì2ÔΞ±êŒfÇnzn`Pñ®F6à<‡5÷jjaÏT5SRTç~…TÄ¥z͹i&5õ©AÅÓ¨™†ºTXs"ËfZêR;9?{Ù3'õ©]ƒ¢^Õ(ÎÝa¹¿jÙéÏ®ÌÌ]×ü³*D²ÕaPáJ‹¼uÕß#hÎí>¸EOrîTCL¾\\lìTXKž¥ëº`¬Ú‰~Î.Ößxznf*»«u=»*>«ËëWb^Ï ÂbÖZÕ¾–e§êUíëThË“×/$A‹ 9÷)ñ:€XØ2Xx$ìM¾õâùØÀ®ŠAUë4˜ûNž+=T<¼™m¦§ßxzîËjzkd¬Êè·&¹^Ï«N|Åìz×ld¬êåÜUÒtå?0V­|Î!]ùŒTóÄ!̾tåß1Xxö{kWÒ•ÿÀXµê¹ƒ¯ÈÊ¿G¤áH\ߨ+ÿÁ¾«¾ÛýdO=2Vó-cÉžzd¬ÚçfŽoyìû®X+ïN¨÷ëk/_›xø÷¶ÿ…oûÿ{ÛÿÿÅmÿïòü{—çß»<ÿÞåù÷.O­žÿë]ž|á™iž€‘QÎó šG|"öo·ºÈäòäk¤nƒ Èjäÿuc«fwqNÉ–=×¾ÏÍ|?ÔñÎðÙÎõÎO4K 1*žÑârª#׋τ›9ªtNÑ«ŠÆçº€&án‘‘ŠP.>ê߆¹g_5BÑùȬê7É}þÞ»$p.2›ï% X‘}Í÷. eŠŒU wyx•gl?Œ›\‚‘e–{&ï³ÞM@ZWJ•‘|@F#ç¤x×üŒe…‰­ŠL+I¼a£GúeöE™Ú[u72«ê²™IoÈŒ. Î7æÿ³jÌL@\ÚçØú¬w1ØÓNä¹z"Þ&™é%Lv#S‹™Èh´²©©1"cÕ¹rÚ52ÓÖ,a£ÿüë¿é\ÄÆendstream endobj 6 0 obj 6268 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 /Rotate 90>> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000006583 00000 n 0000006701 00000 n 0000006514 00000 n 0000006373 00000 n 0000000015 00000 n 0000006353 00000 n 0000006631 00000 n 0000006672 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<8DC7A90EB5E28E3259AA9B7920A18244><8DC7A90EB5E28E3259AA9B7920A18244>] >> startxref 6889 %%EOF danieljprice-splash-4d1f09c/docs/figs/surfpart1.png000066400000000000000000001044321477365367100224130ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœì½÷ƒÕ•ÇIÿèå×A­Ð’ZR·rl%„"ÊY ! !#@ ’ÈY&[–l@`Âl‚-À›äÄà±ã0ã±=»ëYÏìl˜Ùä=õ½÷¼ê¾êêî×R·tÎ]¯â«W÷|ªï ÷Ü“N!©;Ö7P© H×ô#¤S!e3G8íï×RwrXªmO³·ÏŸ<À–L$XÖ镌³¿ïÜöQ<Ùhùÿ—B(‰ª3;ƒôTAªŸ‘vü#eÁS—I”äݼ×á¬÷nûØžÜS¤Âÿ£ê¬î ­*:Áy}V)A*´¹¢=BªÎÝälõ™ ÷+»»§ÞÇB)A*´¹¢ÿo ‰é»ky¶R·4ŠÚo¨êä‰÷†¯d+ÉXK®X[³Ù,CƒOá‚—ðÍ­^’cÑFýèR³©gHõ—U‚” úÊŠ~°Q {üÔ‰• øÛºƒT]¨³ØGE¤B_YÑÿ'…$¹ïj€T?s³OHYnqŸ ^7ü©jKU?ɺ^ïÑÕŸ‘ªYǯ'e9ÍÕkÒS¤ªþw:ÆH1Hýß)ÄsÞùýÿ1ý¨×9JìÇ¥>5ÊŒéëgÒC©R~ZÅIUw%ꨳèó"H Ré RÕcLuPEGݳûºR‚T@ RÿW éEe¯šHØw¥ÿ"å8ó²Ùl5w]7ŠCã{;u ös®ú R¸‡Þ½|­E¤"Hu_)A* ©ÿN!ýLç{Yú#Riƒ±ÉŸˆt`c:´pȱ~`]ƒÔ¥Þ´¥zïÒ½%‚TFŠKßAª.>R±K?C*A… %w:h1t‚úžIÊíì¸jßÖÿz}©~(‚” ƒÔÿ™B)[)A* ‚T÷¥ÿ d|=l2J\$>¸s”Ô2þ}Ý–cýSJŸBJÛS½û%µAªÊ‚”Òÿ#…ô~\ªZ˜¾(‚T•#Ž¤Â \×ÙøùŠ~ô¤ú S}©8YìÆÅ9Ô?H­çr¹ê†k[eµx÷lµKó)CõŸìQjà¨N*VTôãO!‚”-‚Ô‰‡TŠ6ïƒHõ¢ú4Râ4a=©j4¹»œ_,Õèœe!ÕÙ¥*ÎÁ£ÃUU¤[Þ­=‘ˆSïa딢w¿¤v"H×HAác­¿ÕΫèÇÿ–Bú¶¤Žk¤*üT¤²)‘)AªûÒg‘Ôã R'#Qm'•Ëe`[ÅõÞ:(ŒŽµ×¹‹DW#¿xåhPUÝ–¤zG©©”¿ÿL!½oKõ«´ÙPg»/ˆ U©Úñ«Úêîü4}©Þ½|­¥/âTM-]e4Jšñè £@«šM¤0nÀ,óÑNŽ`àz½ÎUOÿKý¯)D²E èÿ‰€TÚP¯ ÕUécH ¨H@©ÃzîëuüÔ¬Ž³ºW­æÁ v#œŒù Óý–^ã*ԯW/Hu_)÷¨ã©î‰Aê?RHoë|ÿbJr¤ } ©þæñ;Ög‰¥|:Õ.„‚ïf @AÛ*ãoª~jÀ³ç`­sΠ/l+YG°]‰þ¡G3ñ¯SéSHõ3¤©€¤þ=…R¶R‚T@ RM!½ŽT]]?²§úR©ì½Z ½À©š/×–J¼zî²Ú)a«pÕ§R@õ¦©Œ —¾…” AìªT‹Û&ëuu¥u{uŽ»Î½R‘:C¨š¯Ï¹Ë·šüàG-C=Y RÿK ¤l¤©€RÝAJ HDª¿u¬‘êlR´@šx¥èk6Nƒc`Y§º\y†XÂäIš·n¹ý“ÕÕòØ6‹…Ô¿¥ÞÏž_j¤<¤‚ZÚoR'N¤© ¸å\þ’ ý)UèèȱD*¨[©ÓûªIuÃÆEÐA‹×”:ˆ) Kp=¼ËÿÕÇØ¦2H%áTÁêXjpŸAÊZ¤Xú RÖô×ýÜc†TWò͵þYK_ÿƒ*àÆ?$x^&ŽH˜ÆÀõ‚HV(¼ ë¤cG•AêN!Ge¼T!J œ'HõE¤ú S‚Tü‡‰Û¨„øuÏò/~×ðQG™*Aªû"H R¤º/‚” Aªûr4gîènú^@}e…‡.Ç(tfݤ Ê“ðy>?» šøëb¿–§09ZP¹3wü9…R¶ÍÿR‚T¿@*ƒÔŸRˆ e‹ Um)HA?©®ÊQCÊ©{iÅghñ5Ê×PWI½SY@YL™TüKÅ‘Œ]5ȉtœëjrPU‹í(µ– Õ}¤©€¤þ˜B)[ŽRA‡VP£ðœëÕ l+{Lyƒ»”pB’ÓqtóTù×I@¡³_¿Tì£Ù¤º/‚TFŠ‹[{"§~4Þöèˆ •¤âbú—"óKÙÒëH 𢻖z4) QŽŠ;ë¾[\d 'Î¥T†9GÍõrzŸ`-­ãø’qJc·˜ ­ÀqÖ qk‡ ªúR½{ùZ‹ %HÄ õ‡"HÙ"H R¤º/G©êjeq¦Ë_£æj¤cø˜3Ô…R¶ôR®—*(ŽøáCÔG\ 9”/`--ƒÈQbݽsªekHð3Þ}§úË*ÈV}P{Óógú] 9å\Ä–¤©šéhI‰ åÜ@F‚ô-¤z÷òµ–^G* þ.‹ÝQ€’úèø|dœ³KÒ©ù<Èpo0—cË [ÂnrÆÐüaþW9Ç–ïl÷RG©ß¦AÊAJ ˆ Õ}é ¤œˆd©jåï nÏø(ù×ÉzbÒÌý=TÜÄ$ì}>Ïwe¡ä:}±‚ëºÛãÀW{1àé%ª©î‹ %HÄ õ›Òë5ÑOxŸ %HÕTGû LJz© ˆSVKãTXCKøhZ\ø_åê¯çµ´Ûº¤³=|K f[ü[ý»<g8À?´öMhú§"?[)A* ‚T÷E¤âÖžHÄ©÷­œ©jÎó¬§ ¬V¬ÿ.¾FùzØÎòlîØß–1Ö #T(,}¯ÂïÌñ%ÌW¹¨Ä+ŽU»žõbÈ:ÔVC©3ð µ7¨ RŸ§£1e[ÿAJ HŸBêD/%H R'¶Ô)gä©Óì.R¬‘ÁJd¾*ZzíœíÒh]Õè}V{Æ¡òìùΙì‹BǶ²œãADð­­Ö]g5èÁKñ3qw^>… ¨Õ˜*ƒÔ?¦AÊ–O†#Hõ¤ÜÉp©®J-ÿK9¾˜u—Ù˜p0çø+«½S¬ë„Ÿløi×Êï×3¤Üÿ)U£JuÖ!AÝì‘f3¤©€ô©hÕ‚¤VÇ.vP]Ò‰}\)A* ©Ÿ§P©S¤*ÿ¸‚Þ=¶¥ê,é‘¢=©R>OA€9xó5ÉÑÅÊu|”x»VêœQf^W’¶r,eçíjöò¦jô¹HÄ=|êRÖq ºO«÷΃ò—Á“ î „×kUï úW?^oí/ÅD¤Ò¤ô‰æ“ùãÒ“ˆTÿAJ ˆAêg)$ÑõàÀRg¯×…ý_zŒTÚ´¾¬£ Æš±h ðcæTúrÊ:Îr_ùmõ¶AÃ)y-9m;ñ,úrº*-öó±óm*—¶œÇ¦Ã¼ó“b¿ÕÉþ³žI6ÄXìBZj‰K¥êVNlSœX?°s¤ú“%%H R õY ‰«{uÈâÿ¾:íøõ³ža‘rÚ>Ö1Èdâýëx£Y_Œ‡/kº\~Ÿ'æLú¸…¯1/…BAœ·’,„x#ŽcðyWλºK­ÿ­øäÿ&ÿâþvÿøÈ`=ÏdçgÊÁc‹Tuãªê©N‘ê7L R‚TÍ‘ª ¬p¶” %H Hý4…„ãüÉúSÝã—ÄË …”j>Ëšªæá«.9'òé¨kPŒ2ÛçV±NÌq–qYVrµsò«ö„¹ª;TÑ\˜voÅÒÿ¸ÓC3Îv‡rþqqx:}¬= ùö)ËgaEkCºgŸ¤£ÎÑ}^)AªÆHõ‚’žÔˆ¤©d¤~’Bz]Ýû“½GHiž’æâ j”0À k´{ ÇíìèqH/š›­"låŠÅŠë<—+•JÆL³PbáKæ´Ë=v5ƒß õyŸg,C>…ϳÞ%2€\O êcHõ+¤©D¤~œB)[º»–Ò…zãêÁºàj½C£»×ÕIýÉê^™QrW™Båä|Eø+³[é¡–ÏSDZX,šƒ\Ï íN´û„9öï†oÁ¨¾ÏGõ&ò…’*µH{T4©ï!Õ°¤©¾ŽÔ‰âñ¤N ¤þ!…¤ú S=AÊ4`Z®, ¨Ö”r+)æCómª¸~c,.œ4¾¬Žîòï$¤pCÖù9O²Ú­—Ó£ù®,³Ìù¹Ö2g^tŸIàÙ˜×R¡j RG])Aª Õ_ˆêþÌ‚ÔñŠ”;sÇRˆ„zméÞ)…PµN¿£ ü)ç[0JãÐRÑSßúp²çªøP­ :fÉNp—ŠøÐD…’¹FÉúJǹ^¹[suki!ÿ ÕsQ r£N­fK!ÜÞMsÊ õi ‘P¯-‚” Õ÷‘êWÒm¤œ–VË@÷¯š§Ï„tžR\ µÄ:…ÝsÖ.ƒXÖëÀå8ûˆ/aœ~ÎùŒr†ã»JØT€0JÖ©Î ;€»´YÑá*½¶´ÜÇ^:AêXˆ %H%"õ÷)D²E¤‘Š$§~UâhHwò«òÄÛÚ2€‚mqö[”ø”åŒ/̨º‹”±•åxcwáDMÇa!.píìcdèO¹\æ«ëëT<‚8§ð·+T­¼wÎé3À[?‘ZÆ£éï¯<)cŽU¥Ë¡(¾©'HÉ©®Š %H%"õI ¤l¤)Aª¦Òe¤¬6ó½· -íñ‹5Œ51¦lØøf¸býÎi-gåfnàç„=%ÅhˆGVûË -Á(±µŽƒ­Sp¾v†½ï9¾Ÿ¼ñ³«Ÿ¤Ú”ø£õŒ2f@Lð1º¯#ÿqwÇ 2Hý0…R¶R‚” USéRñØb`“ÕØ>?ŒLÆô{x¿Ùn!“Ó'K¯‰£¶VïË꥙>¡Òwk#wÜœ­YÃd!À0™4sFŒ;~Öºu©œî#òŠõŽàKZïgÝPUypÎ3t£·=ÜÝ5/Hu_)A*©¤AÊAJ¤j*]C*èO Äw+ýz^5Óï·6æí‚wvèÖ±•,„°5MJ^[=JóaC¹æ„á¡T*᣺ ìÇv6»òŠ,™]ym6å´Ygݾº`n‰i*hË‹EÆqq:™‹q ªö ýþq]§Jê¾R‚T"RßO!‚”-‚” •ˆÔ÷Rˆ eK·‘âÖPD·…_°£9mA4ÆQ'5æ+§ÝâC†÷Ã¥¢Ï6¾ëwN›?YŸU´ŠbQyÚqtÖ8áf΀Y.—ù ë– žmk…¿ÞG*çØ^ÖkÈy¦ÎspU¤º• Õ}¤)Aª¦Ò¤RNÎCËjn³ßÕ !V6©œ‰¯òúÍ*¯6:¡_Žã‚Ë-guì°•{m ÝÌ93z0'Ø¥¨ã>&÷&ù.øî¬w€çx>Rî‹&þŽrѲKlAꨉ %H%"õÝ"HÙ"H R‚TM¥kHU«„”E&™ÕòFX]jµœSzÕÏáÈòàeMò9Ne.x‰ãh… ¼ ý_aÞxþrLu  ºr&@ŒšéOÊIˆã%|%§ªýQ]Mu7m?º¿Ê¼Nxs©r(ò)ó— \¡yÒS%Hu_)A*©Sˆ e‹ %H%"õQ 9q‘ Íð˜©ÄÂáMή¬1›ª, n¯(£ã«¶l%Ög K‘=á&!ÑÊ1}€ªo­-þ ¾$_J-1(û™b˦+èh.ÓÅHY¯þ5Œ’ónÉc2£]ëÖ³3Ç…%a—ÃU—‘Š$§ºöDp¾TAJJBJþK%I÷‘J‘ˆäôH|Î|Žªñ•5½=î’µÌé´p«C‡®XÞN§%F¹tЕõ¿¢ú8¯¡¡)Ô]¹vâêèíå Zy„v5wEıŽËšJK *oÄé¶fµ+2ëÑd­8ï–Ê35}Ç0ZqԪї¾b’AêÃr"#ÿ-H R‚T·%ª{¶” %H RUÅýýÝAÊäú-çläC,]Ȇ$£­ ×Ä`Mc}ÏkÏ_EU5BEm1$ìscJ¥ûàò:—›¬/C€sÚ&R‡¬ ¶cn,§Ÿu¨úez̉zL¼+øløñ0eîcwžµµÚe¤>H!‚”³Æ"H Rz"g2Aªs‘ÿR‚”ü—ª©t©Ä¯Õ†VCû&H<ôËê”sB¿l°d!f<܆”"ÛN¶¥”m¥³ò”ͤÐ1ƒÙõ^Ðþõúúz¾;Û-¿=)ûë™j˦bÊùFâNõ‚N#ôabÔrf4Kø™yï°¬Ùè7—»ž†*ƒÔû)ä„E*8å© %H RÝ–ºÊk[ ¤œ)Úœ¶ 0æ¢÷2U–ºäµCŒuǨ]žwñ+#T5–”ÞrÇ ÜÕbªŠ:áˆùâóòH\âð´ÞØXMºWX*jáSØyÈrw’¯ÊþÉ‚¦×ÐVAEÿF~<6]fT¢»«Úk¬J¬½›H}'…œ¸HȤ)Aª¦"H R‚TM¥+¶Tu¤òQbx¨YXÀdtéKG“5‹Uk0>È@i-‡=à¬äà¤ÈnF Ѳ¡¡;ÓÁ§,0FL!Ä9~þ ¾Q>”Ì2ü k aóÍ1¬’QrœèþãsZ$ël –©÷Rˆ e‹ %H%"õn ¤lé) †n;«™sNÝKã­²š9’œ3”Üd!¹Ù@9=NÐ¥I¨ôu.Ñ{klldÄ _êC“ÌMêÕK+—©wÈhYœ°!\Ò—bT¹×W‘\®ÀšÑŽüzp92¿ÞEÈéû}D÷™òÒ¼Æø8AêhŠ %H R5AJJD*’DœNèÚ!éÊ Ž X k-Í®À¡ ÎZ  e‰£ïíÑs ¢¼Žò2Ðà‚9%¯=ƒ´ô»hBµ8…èÁõ£@/-›ššØÆÒ&E‹:´‹K×X&„éÄÕùu×3JõÈ+>¢ñŒáP¯ûޱ‰Ç{­7\°…œƒªäAýx'…R¶R‚” US¤)Aª¦’)¿ Ãt9‡ZëþØ:D‡ã^ce-äõ8CV>F«¨õ” ¥ÌQJž=œäuP•yž78NqÚí¬ØB Ç—4<%xέKà ú(†Ì–ûë]à fœçò%xPÏç”F˘ɋg忹rÚ\rßd>BÎ<È®tZƒÂ õv ¤l¤©D¤¾•B)[)AJª©$!U}4¯Ë‘åÒu·AÈz©m–™Í(ãhγÅ(±UÒÂÊ‹CÔ.L0›RXr>CA'B!Ç2¿øŤÙÎèà£eC9·VÒ5*r|Šø[ÒiEýml~Y¿†¿SøÁðÞB¹ÐÈh -%Ì• Õ "H R‰H½•B)[’‘êŒ'n±Jù@nQ§gE8ù8î÷ä+¢4•“={L[QÇ[ÑñS¾6βC:¨S½8æ‡{{ÌK}½BQ]>”;„´ ÝDþj¸Kz|b!‚ª¨uydç h*j%{¹cȨLù$‹~PÎËÈEÅ,¯³À›ÏçIê¤)Aª¦"H R‰H½™B)[’ª†W'3læŒ3[›YaÛ)«­>ßB)¯ç]+𔏒.Á<Á&âõ¼.?Áj¬P8׌£€ ~àÀ‘À²²Fn0jØIg777ÈÁøÈèacA)é¡%ê[ø»ÍH^)èQŒüÃù5x¶.bá'_¢äS%HÕ\)A*©7Rˆ e‹ %H R5•ªHY†‘iƒ„r5ƒ9¬†¶l¨ø`VVª‚3þµ`Fb0mfë'çôåõ  ‚€³í”Ó[kÀ¨]ÂT:¤©© ”¨AÚ>h:+Œ"ï,š(3¤dʤ[”±sžéC¨¸ ‹‘åu”ÛÙœ²l)~r¼)oÞ@/ö‘I RGGªÎÚ!H¨H¹3wI!‚”-Éÿ¥\dâëŒJÖtøüföiÊŸãÛÊëPoI§W:O¬™¼‰•šYŠœq•†ÀǨÑÇF-œ^Šºo ¦&… ÷ Mæ¹êØ56*Äp>²OÝÜ„z‹àhÞ@®Þô rØö9)¾àPÅñ^-~Ü9ëIÇ;Ù~uWºÿR‚TWE¤©šŠ %H%"õÍ"HÙF*œÛgBº.ZVÛ9ý|÷£ïÍš©k³ÚßÇ&ˆezX>2SÕ¡Ä%,M…0œª.¡³ø*…$ðG6“ übWs³ÚÔܬ¶G[šWKK ­¨Ì'¸ñš æ@yµ•D—V;ó:É]–ØU¹13ß>–´¹U1ô)éçúUìÎà»ÊÚä4S½8OiŠä "µ'|¤©D¤’pª`u,5¸Ï‰ %H R5•® åñåòâ6·ïökL˜È&ûÍ zdže’pHµ g(}†ÙÅ¡Y¨|I›IJÏ¡Á#ø|e( TäP®6”ah 4A_ZÖ×+4ØyÎ!_lu0Àšà™Ç¥ØŸÎÐXeÕ‹º-¿ø- ^ :t\)ifJ¦Yù(åt¤zÅr_c¾mlÓ*T¤^O!‚”-‚” %HÕTª"•‚*n¿3â®yWcP]œC»Ü{ËëÉÔŠFU¡eíÌã.§þu6PÑ€ˆã”þc7Ú9´ ë70’fÝç«G€¸©Iuô¸ÏØÐ@‡ 2ž?\‰N5Oõ ´½Aå,FØó×kÖ™~å$4éêÅÁÅœü™†¤¬Çj=P¿RR­L•ŽŸ Õk"H R‰H½–B)[)AJª©¤³¥²‰Í‡H5#§ bÝG)«#šádnŠ¡Š[èL±I?ן`)÷Ço9'(ÛËÁƒDÁÕ@l$Úš›•MÕÜ ÃJ]àÑ©ØÄæ» U(_¡œ…ú{ʺfEõ–uÙ FÉr]²;æa^Oõ“3åA³ÚîäggÑ“e<Ê_ÆŸ’‘z5…R¶R‚T_@ê8Š R‚TŸ@ªç—è+BÊ›ñ&€”µÝáÈÍCsšÛâ¨`f«eÓ "3] › E“=gi (b”š€Ft@Ë!ÚH¨@Ù‰‡¦&‚ƒÖ1ôqÜC‡*ç8P¢S6l˜¢‡¤B¼+¢œì&^¬ÎÇWªñ!@¬¨+b”õ€Fë·ñ0Îu¦/ofKä.Yý&Êkª2&?ÒÆþ³ößwþºõÒ ™S©WRˆ e‹ %Hõ ¤ŽïŽ_*__¸-ƒ»²:Ó<¯ a©Žãþ WŠ4ý +!»ñx(:§CŠöxB¥Ôöô 2dð`åÙƒo8!•ÇÇü× IDAT–––&Õ×£•A@j |Ä_ÓСCëëé|œ  ð@xÕ({þ*Ь6q%ãé³Êf>g!™šÒœi¥V¬gLjş8#Lj¹Hù(_Ž}©“Ž›ÿT‚” •ˆÔ×SHwY¨ÓRYï±:÷¤©Z#UµW×ÉÇ)R޳O­ø­àð㊩9a¡Åêà„--¯VÞ”`0öÃT6¯8;ŽÇêñzÄcÙ–‚Cø¥l-JÊ0>œÎ#Z°B‡UGÎÈ_´ŸQW´ièP6§Šðña“ºN½©LÁÔöÖ›!‰øI%Æ»¤â$Ô%¢Ø Ê±§³úœÉ=¬ÇG‡÷wòv ÌÝkúZ ñ‘ªüq73FýUNé—"H R5FªÎúën®«~Àñ잤©þ—R'VþœäÙJXÇ¡$#å‹‹MX¬~¾QŽœV–¬‚ȶ”ëc6)qEdÏA •ÆF%ÉA“ ù"g¯¬GZúC nñÁpƒ#¾«8¢³€ÆÐH”³6"nh—ÀU[[[áw¨3é øÙUȘÍ5Ž&ó(E6³@‘åúÇ&«6?”¥¬GSò`¼ ƒ[†TÎLÛë‹óÆsšÉ'ô’L@êåRÝ.ry‚” %Hu©Š'ÂFGê\¬Þ\ÖtèÜX R,¬;èæY(A/¼ ñÒz]Ö¨¬«+«.B¾ìù㸫¢)‚cú€ðèqvQó°aÃÑNj܃í§]--ôh©%xõéÛFŽuý†ÒÇaÔ‡ÂúÈ/ØÀÑ^pÕ ‡?–tUMü:/„²ž'„;€ìêä_kuübo(/-Ýç+ãtø|ª¬ˆ||U¤X‚(ù^p£VO‚” %H‘~¼”BB®ˆÊ'ù/%H R6R/¦Ÿ÷Ô oKetõÀG§Gï·•ÛÒÁZá,èÂ笆̑›ÓLJ˜8¯RbñêêfÈ¡rÛAÈ&‚A4Xˈ#Z"€0¾°!\d + üàBŽkm¥­Ñ_NMÍÍÊ™ˆñŒƒ©ïQÉë t”ßT¯Ë\€¢zöW€1hæ½g Ñz¹¨Gç ó Ê´8ÄËKj^YÞjíM°¥ºT†èÇ‘R‚T‘Šõô,_…Y·D R‚T2R/¤@Ô6¸µ½¨ÓÇXÜÉp:3¤²Þ¨€@Ûl+KLÙGË”°LøÄËfþ4˜Qœý†Jbduasu\cE8aOÅgy<áðáÄ2ü]DÓèHFDBœŒ5 9~tÔ¨H`K#Bˆm-ä6ã+à’WëHdPÕ·bW9ªP„¿rñÔv]̬ž‡®ð‹nu<µÎÑ x.Ÿµ=±Åtù-m%ú¹™¬]GêD÷¿” %Hõø¿Ô‰.1¤¸×çwˆx¢’Õ ´¸âæw<~y3/»ó¸ÏÇy:ê/+oBˆÊÚ¨sjèý!}\¹õ†¥^Û°aÃFŽ$>°>~üøöövxúÆŽÛ ¡EÛÚT¯½x!ІÇñC <ƒ´>\uáI `¤ãè--Ê™ˆh/û•‡q]ÐÕ s“¬/£…ãÊ&!‰uÞ¼¬ŽŸãÙsžµ+Nø-sVEêïRˆ e‹ %H R5AJJDêù"HÙB*ŽŒê¬û±ÂÀÒôó³Z ¬6.è’ß&ý¼` ™+Ç<{¬qŒRƒžyƒC» 5˜OéŽ9’vk†”zN†¡ÐÚÚçßðá*¾;<2®mÆŸá°¡è”q‘€BÚäÚÚÚèê\ƒh;ÎZlc‘Á¥¢Äð;jƒ«T)´t õʯÓsÿ*a‹±h |š¡‹ )P•7µ'röõ›)[í£“’éÓ$HÕV)AJª©R‚T"RÏ¥AÊ–NèØÄÛ³^sú WÙ¥yÊù6W›`_1}€QÐ¥1­ 'B¸jØLèi½.7¡ ’£J9¨A6Þ0@¤úHÈCúÞ l‚Ç\2z4¡BÀŒ¥¨ÒU §‰'¶´G8Ž„.1b­ÐþQ£&Mš„íôÕ\ã8/æÕiÒ7Ìe*=Ú,¬¨yÈ¡Ž —x¨ Ǻ­éy‡30Æzüñï¶Lµ¯ÓÈU‚T÷E¤©šJ”ÿ¨Ý¶ˆÇ ³qá>¢¿•;/ô]Î.bçëÔc~N¤§³Ò)ŸŽŒ–ô¤k*Å3q¨!†H7'UÇÒ÷¨¿uÌ ".è¸ÖVÕËCŸ–´ \‘LžLŽ@3fL[àEûÇŽ%^ÆßÚJœ-ZŽ;ÂÁ:Ћ"L<Hc4Ô± tðØy¾ûz]î™û|œaUÔÞNÎJ*™éQÕš˜õ 8gìvÎ ¦‡Ñó;åÁ÷fU¤žM!‚”-‚” %HÕT)A*©gRˆ eK)¿B·`À¦  ã0e®"ySúÛ21`Paà!§À©%ô±ˆ™Þ5G H܃ÞÖ£&9 MŠ£Æ‘åñÓ\Œ kA"m ™4‰Ö‰„~aF7“'OFŸŠþFœMž:•Ö¦ð$´>|8í'@9 ƒ C‡!“4©réñ"ÿ°dJc²‹(õ”$emF1RJx˜¦åéC¥$ý)fÉ9æU¼ÙÜ7¤E—Ç• U ¤©D¤"IÄéø)ÀW#¤©D¤¾šB)[ÂHeM'¼ t,à¸ßo©¨‚‰ l'˜0=XÝØ„PÛ¡tªP9Æ4 þ¤ëb6ÁýÌËy¼á¨È?®FhŒ5uêTâ<©4?„t'L˜€%!Š7nÒ¤IS¦LÁvxÐi'QÙÞNKBlôh‚†>ŽEÜÐu04抜5Á[?‚H;ÄojÐìu±1F‡—õ:þJð°3R<@ÓùZöjΔŸ0K~Ú~(em)Aª«"H R‚TM%ÙãÇÍàrãÇ.ŸÛŒ~5g#A‰ fjMž>ÞL#_â¾ ”¾3¥„èà&DVò€x „„#Ò1‚8!•Ÿ0¡HŒC¼PomÖ¬YQ—nêìÙ³'M"t¦M›65BjòdBŽÖG>å”S­™3'B4|ãÆŒ¡¯À’h¥-a¼b3<~}úìÙ sçwdkMJ; ©Y³”6eJ[[mom…'q¢Çôm&Ð]Ñ.U' 7ˆ)߸T& ÛR¼Äo-éYÞÊ:¯‘^Ö³i©yª dB¸9ýµÐòßtÜl¦-«"•± d RÝAJJDêp ¤l¤)Aª¦Rç) Y¯Eb(YG9Íë¯ëJcErhÕ˜€m¥ýT .Îñ£MÌÇ¡]eCiϹšG Ö ŠP!Þh8G$“'Jp–O€ÐÇ™3ÉÌš;wîüù3gÎ<õÔSgÏž1c™O³gƒ«Ù0¸&··jpÁZ8™è„ó¼~wÔVÇàŽaøšT¦aTg³£$•‹KúA˜å ïŽz˜¿¹y§”L-P¶µrŽDªÙV.J¦yb™M¼¤z,‚” •ˆÔ“)D²ÅFªP~øheCb57!†¿¯ìÔ³d·ž)©ø2q]••¤*鯪‚ÉÓp Lš< Ñ×(W|²…ÆÀ)7zôÄ(ëˆV¨ƒ7{6ñ3mÚ4BeâDðC ÍŸ?Ÿú€ ®]»–>.\xÚi§Ñ. Eûñ‡öOŸ®<“&³ö±c[‘œÞÞ®Jmb¼¢ê^)¸ ¹š&ÏEª~ˆæ¬‘_$ x±,ë2Õœ³¤²óõümyÇ‹êPävüü¯÷Z´Eª¡R‚T"RO¤AÊAJ¤j*!¤ŒûÎon–¬ÝC…|9樃½ìîËa,l¢²®º xáùmý zëõ\*ù>3LÆF*Œ?C£¢Eª|Qkë0D{[Z׃2GDÕôéd(‘þ·µd8‘¹jÞ¼y3f,\¸pñâÅK–ÐrÙ²e³gZdc-X@|MðüÍ™3gÖ,âlz]Š®ÒÑ1ä1cTy¥¶6d¾A=&úÈ“x25Qg$ä¢îÚf‚!Uà€/g¨;)úœéÇ>ë™f0þnsC¿ ?cS R=–ÊÌ‚” ¥rgîx<…R¶È)A*ñ¿” ÕUéÔ–b„tbñ&nfÞiÖÕ诃¹Q»—ôü¶¬F•7ȩ̀F] “•U%Ø!Ê‹Šajäú0ˆƒ` Û ƒ 9sˆ#âgÁ‚Ó¦-Y²dÕªU‹­^½šŽZ¹’ &BjÍÚH×’%„½`ÁòåË ½%KÈÆ"ÄæÌ¡%!YWÓ§N:~ü¸qã©1c”¿ž¾eäHºúÈå(0O>*¤p÷p¦3DºZ&»ÍÙÂ,™¨°*:f»Ñí3V7-a!ä¼Þü7d0AªÇ"H R‰H}%…R¶¸¡^÷™{wJþqC_¥¯§û%\åGÄ3U™­ü.Ù`¦ã`žU!^3Oš*yu£‰B‡ 3†ºd´ÄøAôò)긡·G¨¬\¹rñâõë×oذ¼PŸoõê½{÷RŸnժ͛7Ÿ~úé‹zè.]º”(Z´H7+¢ì㢋(§Ô6r¤ŠOš4ièP•«Å£É=PèÙ*ìlæábHêA í ?î[®Ï‚Ž«,~S„@µ€ymåœñˆ7^5ª<~‘$â$µ'<¤©D¤K!‚”-‚” %HÕTêCJ=ðjh™¤1«ï£Äm˜sÊP-PUÔE"Kfy9Ù–*¡Ö[ ŠçjçÜn•E‡é4èPxüFDI¯ ¥‘#UºøäÉd Á=GVLëÖ„ØœHˆ¢êÜsÉ–Z±bÅglܸ‘èY»–6îܹsÉZ§+W’-EtE.&óëÔS )ºÄ¼yϬ(?¨%Ä´5t—¨²©ÐB¢š‡æ—Ð*ìâdƒ Ëzê67Ö]ÒU¥¼¬¾ BøÈ¯/«-¸ ž8+‚TÏD¤‘z4…R¶R‚” US©3†”]rL£em ´E6$ÖùYãD‡~ts–µß¼¨'-«¸5Xlr4éÂõÔ¨.ª>ŒÀ ŽÖVUaŒþŽOú="šòfâĉd6!(‹-!EH,_¾lÙ2¢‰>žsÎöíÛ׬Y³nÝ®]»ˆ®³"e;vì sêì³ih;óL2¤Ö­[·xñܹs ÐY³C`PÑ¥Q°bbT³¢!^”*SÑ_Äœ‡cr_LïËÆ!`B²"/ù‡—L-tUÌ Dd¤òfÔ!£•µ~3Z0ТØ$HõX)A*©GRˆ e‹ %H%"õp ¤l© eµEüY[K>Ä:Ô¢ÉYÉÚ5ÑÁUèèbáªàlI»‹Ëz|›e]a¬!r—Æ^剆]‚âb˜UwäàÁdª $¬šÚ0*U›6míÚµd>-_N,X°téÊ•+7lذoß¾3Î C‰Ì¥3θä’Kn¸á†;¾ð…/lÙ²eÏžsÏ=wÛ¶m;wÒ¢níÚU«VÑÇ­[‰?²µæÏŸ7oÞìh”È,ö7uÊ¢ú³£èàÂ'ª[¢iÕw98šGXeO d¿88J€SÐv¦z˜¹}™:ÜÁgœwšea ‹þ¤j ‚” %HÕTl_gS¶ùn=^&iÓ1ÉJe$¬ Î%çô)ÜðuÕkeRAÔW› vP>å+ÃøCê2¡ÚÃСC¡±<ÿÚ¤h” ÑD*?oÞd|DB¡´x1uü‰;wžqÆyçwá…nßN+û÷ï¿ê*êèíÙ³çÀË/¿|ïÞ½çž{Ùe—r_|饗R+VP‡pëÖ­›6Ñùt•E‹TrÖ,ê`Rw³£CUßœ0a†>‚uâ©=£¨î>”vÂ$$õ\\ƒ3Îçů,ê׊B ›Jºˆ’ëñã©Q HYúåqÞˆÖ›/€$†ÔC)D²E¤©šŠ %H R57Ô›,ºÁrŽå´VÖó–5Þ¨<ÏÀ +¶œEåU‘O |`äÔP<œ µ#T}ÉIY‘=GfdÌ5à ™wDå#f̘±hÑ¢Y³ˆÄq‰«]»v‘ͤΎüzçŸ>¡uÞy×\sÍÁƒ¯¼òŽ;î¸îºën¿ýé§Ÿ&3ëúë¯Ä¦íÛéÔ‘Wd†­YC¼a4ãܹs‰b]Ôl,F%Rð;Ò’n°½} n¸©‰,>öøÁ©Çñ[5>‘+ñ`D<…f Á¡e=¿1ÛRülóvaL%ÓBîz-vøf³1¤L!‚”-‚” %HÕT)A*©Rˆ eKW²áª´/Ö ¶¥r(UKB+èjàE]]v ££sûÊzÞÃhFH¨áH™C”ƒgFJM¶Ô´iªì´i„ÒÌ™3çÌ!EfÏêÕ« ©-[ˆ 2”.ºè¢óÏ'^ˆ¦ . dÈ|züñ[o½•l‚'žxøá‡Ÿ}öÙƒ¯ºêª .¸àÀÝ»wmgžIüÑ)ë×Ó%—/_¾ví¦M›5^°`™m'N™2…n¾8ªn;Y• C4TÄ@å …Qá_‹?œcàìYoàùsدεÑIñ_gÖ›ÐEÊ| 4® Õ3¤)Aª¦b'$¥åÊ%:Íh5]y©xr¶†꺡?S¯k¢stŠÍLò´DýËänc¯šµ’†FCýTˆwذ6ÌÉÖH©çÌ¡ÞßÂ… W­Z¼xñüùóO;m;d×.âú€ÔÑ»þzâ„l€Gyþùç©÷Ä/¼ðÂý÷ßÿúëO>ùä#CÑGE1§ápYªÜ$~`ª“x¤2Òñö)£4êspVw𩌂è?þøK06ÈÔÙ…•XÇïH!‚”-‚” •ˆT$‰8Ií O)AJþKÕTêNÍÑˈT[çMþ|ÖqHÛªlj¡ƒ“z-œë§>BP–‹ËI6âP$t“†’²bè!|j(JÙ6v,Ê€MA¶©6*‚ÁæY¹råÆ7mÚµk×gœqþùôçÈ]w}éK_ºï¾ûžxâðáôüæ7‰§—_~ù™gÞ}÷]Bé3²¢å¡CÄ!™U¸Äúõë·lY¶lÙ‚¨$Ù¼yóN9å”iÓȰ¢oÅ]ZzkëÌì‹dyZçžÈT¬ÂÖõº®†²™P^©wŒ™ÓN]øÈ?ëÙ¢%üLtç]g5b 5³R©ûSˆ e‹ %H%"u_ ¤l¤)Aª¦â"eµžqÖ§ÊåŒ.pÑÊD%Ʋ0£x¯.U`œ‡ Â0!«†B¼jÖè¼ØLÔ„ ='[gɲvV­Zµz5quÞyçíÝK®ºê*¢=þøã_ÿ:¡uäÈ‘÷Þ£?/½ôÒOÜ{ï½wÝu×[o‘õµ¯}íÐ!Z¿ãŽ;®½öÊ+¯$/ºhÆ ´Ü½[Õ¤è蘚0Ïñ41XB·@ÀG(Ñ¢.šžqüçàj21JEvá!ˆzbYWèh°†câYq•Ùjb5©2Ë-”†3¶GT RÝAJJDêÞ"HÙè穆ÂÎþj©ÎÇ ñr3C”C jbyö8A ê ojäÉÎ$E·O æƒïŒT´­ ÕÈÇDÞµvêûÍœ9wîÜÉ“'­µk×FC㣾߮]—]vÙÞ½{/¸@ÙÒ×^{íáÃÄÓ|ðÌ3o¾ùæûï¿ÿÆŸ|òÉ;ï¼óÁo¼ñÆoûÛW^yûí·©#øþû÷ÜsÏþýûœ¼úê«"¤öìÙƒ´ô5kÖœqƬY³æG‰+B ÝNê‹ò]µF“ú‚+5‡/(R¿†'¢kÔn8ë4y:_]NI@yQ+ËßÄÔ+mâ×¥†|Ä GêªÄl)AêDGJþKõL)AJª©¨P/?K÷ÙǓì¹xiLk7&=ÌåJÚJPhiCŠ–9ìâ™pôÄ0ªB¤Ò(ØRP;51. Q Ç›8š:u*ŠPJ3g.\¸pv$Pòy‹¯X±â´ÓNÛ¸ñ’K.¹è¢‹®ºê.xð~øáGy衇¾ño<÷¡C6Ó³Ï~úé§~øáGýùÏþãÿøµ¯_÷w÷Ã>ñÄ_ùÊWîºëú믿ôÒKﺋø":÷í[…h¤o‰¦É™£¦ÞA¹t²ðpW˜Æ· Iè0‰ $š2ý þÁl0ñ;¿^,ãÓBÊ+“³©ª9n;ãÉEêË)D²E¤‘:”B)[)AJª©Tl©ÄÇí¶‘q¶[©ü³¬z˜ÓsôÂY®B¹²dµ)ß1ãð&}ä9zI£‘`’AQIi'Nœ8r$Y1¤Ä'?„XGª—ŸŠ‘Û£òÄÁ¾}û®¹æ–[n!>¾þõ¯¿ôÒ‘#G¾ùÍo¾õÖ¯~õ«_ÿú×O>ù¯ÿú¯ßÿþ÷_zé³Ï>ûáøÓŸÒÊw¿ûÝW_ýû¿ÿ{ÚôØcwÜqÇí·ß~àÀùçŸÞyç!gpu$7nܲe Š©)wfÍ‚_ÌðáÊ™ÝoíEz"&Ž‘£ °¦ôì@<ª+ªõ9Ê(ž³·ˆyqÌÀ‹¢Jãd³þ±3š*@ R=AJJDêK)D²%œ”ÜÜ\Îôü‘§sâ¼´VÖ¥.¹S6³ÓÂÙר“Ñy‹fð€ßOé!P¢.Tk«(?~ü¨Q£H‘N½-ÌùÞÑÑ1>©ú† Î:‹ze¤ú»w8p`Ïž=÷Üsÿý÷“-M}º·Þzÿý÷ÿö·¿}þù?üÃ?¼ùæ›O=E½Á_|ñå—©ø³ŸýìŸþé¿ÿû¿?ÿüó§žú·û·7ÞxãÓO_yå•«¯¾úºëî»ï¾{î¹gÏžµkמsÎ9›7¯\¹’º›K—R„±=iñ„:M„Š%©jΘq3 «P/RòÀæRPXä‰zñîá¾\¤j”"‰qò¹ž>þèÌÍ›¢·î0¡Yu¡,Aª'"H R‚TME¤‘º'…R¶TEÊj+§ œíN¼›î§ëbæ1úZä÷{ë­·ˆºýè¹çž;|øðwìÝ»÷æ›oÞ»W]Ó,]º4Êò‹æ!”fÏ&°ÇßÑQ’#ÛÚŽ8dÔ(UseÝ‘_¯j£›p7çö)”òùJ2¤þSášNwÞX2üÌ]ÊLóø(ùÍ+HõX)A*©»Sˆ e‹ %H%"I"NR{“t¶?ðœ™Öi‹Êz)%¨øhù†õ 8%]½X*©º™ÑäÔ7Ô•„RÕÆ‘ëGK4ñLT sÜ8â ãÿæÎKz½hь눂¼/ŒäÖ[o}ôÑG_ŽäÕW_ýàƒÞyçã?&ª¾ýíx€Žš6­QÛ4t7tµ³ÎzöÙg¿ÿýïÿéOtð믿þÔSŸ}öÙÛo¿ýÖ[t©Ûo¿}ϲѶlÙ²fÍòåËׯ_¿páÿüÍ7ß$³¨½=È“¢õŠ+>þøãxà³ÏÞ{ï=:û‰'{ì1¢jïÞK/½tÿþý—_®¢É§žJYt3gÎäÙÛÆŒõ#@ý!jþÌæ£~ ÌÄz]B›—%F ïš"¿vtéÌF),9ÞËmÂ;ÀO‚øíî"u{ é¤úqY¤ú Rý‡¦8ø6Rñ§î1Äù²:n+&15< 'ZëÙÓKÐ(xüêõ`¼2j8ÃÓ§Ry¢ôV•›4p õ¦ÚÛG`~4£D´wÞ¼y¤â‹-]º”ôü¢‹6mÚtíµ×îßO]·/ùË¿øÅ?ÿó?ÿáx饗ž~ú׿þõîÝ»›š"}ݺõ•W^!ÿð‡Ÿþô§ï¾ûîÛoßsÏ=wß}÷M7Ñu·oß¾mu‰¦Ù³‰âùóçc "Q>6’ñãÇ#E¾¥¥…>67«)ÜàæCIL¦…GÇó³QJÏ2Z0B5Ù|}Žö_\Ö³·ÞxNÞX¸9ŸmßBªŸüª‹C%H R‰HÝ–Bz©ºþñŸªÎú[Ù&H R}©:-޾öªôð+êBW {üÂC¾¾p#sK£¤‚3‰kK”t´W QUŠÆz=ÛT(ƒ ‰qd@E¨Œ„)ÚHI1;!…Úä ,X¼xñÒ¥ëÖ­[¿~ýÖ­dP]~ùå—]FÖqðÐC>úèûï¿OTýå/O>ùäÎ;³Ù¤ègžþË/¿üãÿø'?!ž0Z‘.uçw^wÝž={.¹ä’¥KW­ZµaÆ¥K—-[¦òá‘è7%²`éÑÝaÎÞf¸.u:zs4ø°›0s<¿n8ö ÿh ü&#]…zQÇ#«‡y’ ErñŠIq”¬]j«X¡É¯=ñÅWL{‹ËIð p/ïhü›êYÿR¤ŽRŽ¢VSZóß(ÞË«K:±¶Ò¨)Aê¨ EJš©Ê?®Ðþº€ÙßkÒ}w})‡"ë©Ç¹ÊœæÕb‹h{ŒUP6”©4ÆH)Ó!^ÐÆŽåz UTflª¡C ¡aQ‰ÉV”Ÿˆ&kÛÖÖ6cÑ53ªˆ¾hÑ¢éÓ§c]Rñ5k”Þ_x!õö¿ò•¯<ðÀƒ>ø»ßýîç?ÿù;ï»víÊd¢ß±ãá‡þÁ~ðOÿôË_þòW¿úÕ[o‘þ¨2éû÷Ÿ}öÙ;w.À #!›Šn`ÁBˆ˜9r”B 7®^ ¨Ÿ´GlTêÉ .nTÀu9øY©zc:‹’=ê–Xèø‰}È}ì­Yç™3'ÕL!tü‚[}…ô¯q=~Ñ+ {_—ü_J¤*O®)R†Q—žD¤Žš$ý³ìôÜЩn¨7ø”+Ú¸|º,ެfÍEÉè9™dŠô4dJ‰ÀÔ¦ÌY8ˆ|êÙ+p²’š£IÃÇES¡aüyÛ¨QjôáÌ™“'O&•ž6º^kÖ¬Ù°V©]»Î;ï¼}ûö]vÙ#{þùç'"EÊ»{÷áÇ©»ø×¿¾ð ûÛß¾ùÍÐÕ.¾Xå:mܸuëVê@.[6oÞ¼•+WãÓ§O:•˜7NÍÜA•¸¢ð_b6’à”{djéÚHé–M¹Pîø•ô wNVRÖ{·eƒï6–jSµñQ±Ž_-ÿK©ÏuÞŽ¨tÅþÜ­ó§ R‚T"R,·$ÖMôT-°¥.Þ<–HYÒ}¤B½‚” C*„R ­4ú'§o!Õ= ¼Q¡Þ¤K+†è43{þ8Lj¨œ>pQáK3“G½žEþ¨l¸({{0™SC‡Ž€´´¨ÜndÏ‘ž¢ úŒ3àp#[jáBâjãÆÛ·ŸsÎ9W\qÅUW·ß~ûcLdKýùÏþÏÿ$Ä®¹æš ¢oݾý©§ž"”¾ým¢ñ¥—^zðA²­.»ì²›#!š–.ݼyóÚµk'Nœ;w.f–Ÿ6nÝÝØÄ‰ÄÝ(† "3‘–<çJA©i‡¹TTCƒ*ÂS‰ùQ¹}º„”zýà6œ2=NM ‡&é~ô×]¤nI!]@ªê©þITH)Aªw‘ж¥)AJê)ËÔLÕ=~ÇQ‰sõV‡Ìm.^ñ—&êåJbŒŒr³š ¬ µQha ƒš/ËÁQaL5 ¸¢õqãFcBÜñã ©©SUeÊ   &©¹rðàÝwßMÑW¿J}òÉ'?ùÉOþý߉o¼qþ|úÖ Ot÷;vìxöÙgžy†:É«¯¾úúë_úÒ—©«®Ú³gÏE]´{7PK—.]¹’ÐZ²d ÝbÐS¦LI[Tô>0 ŽjiDiŠÃ†©X6<çÚ__Æ¡_4*Ü bÞ@K=N/œÎK·yª@B;q‘º9…TGJTeì“Éžè·c£B"H R½€Ô‰,iJc¢ ¬Ž!scƺeuÚyž?šápŠ*=]¼F‰»: H ¤gŸÔI•Çy”Ďч˜]µ‡”ÒŽ¯:|S¦Ìž={f$+V¬X½zõöíëׯ¿òÊ+/¹ä¶Ûn£ŽßÁƒ=öØ[o½õÎ;ïüâŸ~ú)õåzˆ”?OKÊdæÏŸÓM7Ýw߯~õ«ýèGÿþﯿþúo¼ñâ‹Ï>û,ut®½vÛ¶mçwÞg¬[·nÙ²e§F¿SO=•ºŸóæªñS§èHŸjmm¥ŽB½¸FÇO!…¥JÖB6>þàA”Î0ž BÀyNDòû~¾§Ï+Ÿ”‰÷öÜ.<öÆ<~‚TWE¤‘º)…R¶R‚T"R7¦AÊ)“‘^ÍýçöÅù£5UD<꫚_/T‚`áìj®Ú8¬É…„† Ûo`ÕØ#*[.‚IÉØ±cÉŠAIL²¥Ö¬¡åÖ­[÷î=ÿüóÏ9çœ}ûöïßÅWÜ|óáÇ¿ûÝïULH}üñǯ¾zýõ×€ÍÍŠ+üjú–9sHOüñ?þðÿño¼ðÙb÷ßTLó6ºÚ•W’¡EÀž{.Ùl‹-Ú´iΜ9D'á<{ö„h:ù¶1c%Z‚'L8‡ôÄá˜NÓÊF±$ÀñCUæ9þ –(¸Se'TØ›ýŽ[Ï ù:ž=Ó.UVKÛWê±R‚” US¤©D¤nH!‚”-ɶT6Þ ·ÈYr#ZëV¿¶ÛÖø FMBo€Ž”ÉÜ>Fo…˜®W E„5&bú™)SÈ"³jÞøI$GŽyï½÷.¸@ %\¹’Ð;xðà-·Üyçï¾ûîw¿û/ÿò/ߊ’Ÿ{î9ºÄÁƒÄQˆôÁË/¿|÷nâiùòå ¨¹zÉ¢›4iÒûFŒ %;Ï›£Ê\Ù– ¨€{Ê9z€‚èôÑ/šz¸ÖÕ!(/ Tsšƒ‘²«f8u&‚TÏD¤©šJx¢ß.ZNÇ^'‹2ËÓÇ^)xü”ÆðôcP'h õÂØÍ›¦”L‡=•£‹ 9«ÞRK ?<êH)Ïßøñª ó¬YÔœ1cÆ©‘¬Y³æôÓ©kFH]|ñ5×\C¹Ûn»òÊ+_{íµoûÛï¾ûØc½ð Ÿ}öï|‡Ð¹åê¾ùæ›/EBýþ÷ýë_iùñÇ?ýéOiùã¿ñÆè ^uÕU—]vÙþý{!«W£犅 ‰j5ܘ1àŠÀ‚»¯}äHêø¡³:HÏÒ¦† ÈZ ºh€zçà'ãq©2Ž*s==e›õŒýfò_sÖvÿc …3Ê_ŸB)[)AJª©R‚T"R×¥AÊ×–¯Œî´Ep£-æ7 Év—Z€éPær@Ñv…œÉrŒâ‘¨…®¬Aƒ†bÒ¬ ð8Æ!Žjm¥? .œ;—ô{Μ9ó#Y·nݶm›7o^½zõù‘M7ßüÈ#<ôÐCÏ?ÿü‘#ÄÉ«¯¾úþûùË_þøÇ?¾û.ñõᇾùæÓO?M}ôÑ~ô£Ï>ûì¿xùå—鬷Þ"½!›á¡‡n½õÖ;vlß¾víÚmÛ¶­Y³iÓ¦¥K—ΘqÊ)§ttte…;èÆÚÛ‡#½¯­M!e÷ ¡:¾«Š¾ÃxäÌ!^•”ÎS¸qøQkô¡•Þg²ÿ¹eÜ×£Ó0VK;Û­–¤z&‚” %HÕT)A*©H®MãldF ÄE*ðì]ª2ºGÎýû¬âE³q½•Ƨ}ÃÊfb® ^MQ½H2”àOW>f”é6lXs3ÜéQù‰–U]\¯´D³õN˜ é5ríȺ!ª–-[²d <Û¶R„Äw„Öý÷ßÿøã>øàû‘üéOúÙÏ~öè£|ðÁo~ó›Ï>û¯ÿú¯üàO=Eÿã?þãÓOò“Ÿ¼þúëÏ?ÿÄO<üð÷ßN—Ú½{÷-·ª[·n]³fÕªUóæÍ;å”Ù³gÓ `€ †uŒÆD½t£ííà ­­ôƒ0k[ƒ™ü„&ˆâRÏ“"…ˆÁö€“ÜV±7œ÷¢«Ö¬.j.RI8U°:–ÜçD¤©šJR¯Ã=}îÜÅ‹oÙ²eÍBjûöí«V]z饗_~ù¾}_üâo¾ùæ_|ñ–[^zé¥{ï½÷/¡åG}ôöÛÔË£¾ào~óýïÿÈ‘#¯½öç?ÿ™(»ùæ¯}ík‡zñÅo¼‘h:÷\¤ŸŸ±eˆ ©U«N=õT¢wæL5·)œ}ÄÑ4fÌPÌ)ŠÞj{*%Ï!P/6©Ž† BŠè$›J× A<›‚ŽòæÌlmUÅ9P¨*äŵ7Ńü1¤®I!‚”-‚” %HÕT)A*©«Sˆ eK—Z6@¬9ªHÆ©‘·²k fTQÏÕ«<~<Oá†pf™3£M¤†J£ôÄëà é}­­­#¢R“m(‹MÞåúM›vÚi§Mš4iöìiÓ¦!ÚKë+W®<óÌ]»víÛ·ïÜs‰‹ë¯¿žTàС‡zèàÁƒßþö‡~øÉ'Ÿ¼÷ÞçŸþ»ßýî¹ç>üë_ÿúÉ'ßyçþð‡=v×]w=ÿüó×_ÓM7ûö‘á@fÔúõ›6m"ª–-#ÛÀ3‡š‚RM&Œƒ î·Œj˜ª$&g #Ô Û‰²ªÎî=¸ÿTµL/#ýÉè2NR:·D¬qÛÔzY*w‰ Õ}¤)Aª¦‚°‚ %H¤ÜÉp®J!‚”-ê¿Tb]̪ á@fõï-@Í^¥<Ô¡^5¾C×cÛJ©QT,\ÛR˜Ül djQ“â ¦B½mmô ?”$Ÿ>9’åË—ŸvÚœ9s©ÓOß±cÇ9眳gÏe—]FHeuË-7Üp׿üå{îùÎw¾óõ¯ýñÇ1Y΢ ÅC‡ß~ûíÏ=÷Ü£Jû÷ï¿ñÆ{ö!uÖYgmÞ|öÙgŸyæ™K–R0ŠbÒ·Ñ·Ïž²Ã&MR5'Pc'[ZZèÞa.aÈ¡*üÉ£YÌ;§^#‹ÓzÇ”¢Béªæ?Õ<ÓerýºæJntÿK R]AJ¤j*‚” •ˆÔ•)D²¥‚TBnŸ“úo­¨â¥)¨ '`XÁß°Êž0:ÄÅX›°t)g:þ’Fu"› UgéãäÉc0²bútUüÔSÉÊYºtéúõÄÁ¾ð ñ%Ûè¼óλà‚Ë/¿üÞ{ï½ÿ~âˆèyà×_ýÈ‘#‡½öÚkwÞyç³Ï>õÔS_|ñ­·Þ}÷Ý7ß|ó»w靈ϊdïÞ½‹Ïž={Þ¼yd@uttÌšEKº²¨ÚÛÇ ìDdMµbºFL3Ü ':Fó–uZ Ôv¡R'8ǯd °áYqå^ë™;Îtnÿ–qZ,ØÌÌŒH.RRˆ e‹ %H R5•ŠÝAÊon^óÉúÍêtNrº:~ º¤òq-ìBøs rþë§ÆÜAéTˆ±$ Å\½´}HT0³ip·Íš5 T­[·.ªŽ>oÕªU¨_¹iÓ¦%KŠ-¨”~á…Ô›»æškyä–[nyæ™gzþùçQž‚:z_úÒ—¾í¶ÛxÅWP‡oË:~Ïž=gEH¢tÉ’ U‹™R.Z3¢S„ È”0ŒèðHUvš1ÅO±HʨÆÁÁF=_ ¬UÍ¡¥E›<™”~t2eˆ¦qãhIz>u*-Iõ—/_½z5ÙP«VuÖYDeПmÛ¶]u!…:b¸ýöÛ¯¸bß¾}>øàŽ›7o¾òÊ+¯»Ž8¢ã®½–Ф«¬\ITÒ%õèáSÇŒ™4i=gÎh®};r¤r2\ jãªÇ½Œxá´Fö”¥z“ÓÇ¡^eoƒ¼•Œ1£2qé$Û¯ R‘\– R{ÂAJJD* § VÇRƒûœtšä4ßVLSÆënd8Þk:~ªö»¶´Z©ðeI×JÇÈ;îÿ¨€/úIjÉsö¢7…´$U1iÈL+?%ªJÔŽj„Ò´iÓ::hI½³Å‹-ZDú?{6ñ :n7*gœqÆöíÔ±»ð ·m£%™Ù»wS¯pÇŽW_MwîÜÍ¿”ÎÞ¸qݺu[¢‡´²xñâ¨ÓÜÉ“']úª)SÆ¡&m?^UlÇLò¨N+Ñ´s*´‹º˜e=c<Å´:|præ#¥ÀºðDåÁú?Ó<Üù®Öl1Šx Ô+HuU)A*©KSˆ e‹ %H R5•R ?˜4–õÄêÌó:‹ž¼­ÄCIIP{ N¿²V&pVºÊíCMt•Œ>pàHÔGÖ\k+)ïÈHc.ߨÐײmÆŒQz>sæD”›5kýúõ+V¬8ýt²‚N;í4BfÙ²³!k×’MEtíÞM+DÑÖ­d3sÎ9çž»{÷n¢o×.âoÞ¼y6O„Ò´iʆê蘆K—ÒrTär$ª2BËðᨓÖÜÒB†ŒBâ Ùe®Ã¡ë`–uøJï5[›ãä‹ùÌêœ?n·e‚-<À3”©‹ %H%"uI ¤l¤©D¤ö§AÊ…”Jós$`^Å“ÉbÛÍ~Ë–Êéê³ð£—ôćl(Ê`PÁ]¬Lؤ„e=m/2• …‘{pK“µBJ‹Ñˆ¨>N;áÔ‡ñ£F;–¬›©SO9åâbÓ&‚€Ð"‹jñbâ‚èBúßæÍ›wìXµjÕ–HÈ–¢ýÛ¶_kÖ¬íE6Õòåtêœ9s–-#ÛlÙ²eÓ§½¸:}Š¡úD{é®àuøuëˆBçœsÔ$óæ-Y²„6-_N¨ÑþyóæÏŸ¿|ùò©Séϼh/qEtMˆ„hÂ4ÁtU|}+FðÒóÅ«’˜#FÐ-al¼úA<’ø‡cwŠUÏ׌ÑTN@<ÄέºóÖ³vZ$ÜásÛÑKLbÑÚ Hu_)A*©‹Sˆ e‹ %H R5• R‰Cy“µÝi³JlÑ4·îçc —Ȅͤrù`4Xµ(taŠÒÒëõÈ»z8ý¸N&|d„|j¤·­­#GŽ$½…ETITž”|F$´ÏýYºt)!±fÍR䧯Yƒ¸íÂ+0Áï©«V‘…r7n¤íà€<õT:•–S¦EôLˆ&ß¡¯˜<™¾’ÐB”ÎÇ‘­­t œÐ‡âHÄòÙTE6ØPb·“z&œ’1¨êÙ–Òå‘Üx¯cCY¨ùÜÖ¢ )AªG"H R‰H]”B)[)A*©})D²%Œ”RÆ£I-M&Y–›Õ)z`¡ P–’aÇJƒMEíRg7²ò1Ãà(ë)têµÇYÁØ-¤¹ô#=0K.éùĨ „Òw>da$ÙVdÍK|Z 7dC ™OsæÐv¢lÙ2⊛1cÖ¬Ytö)§Ðq¸$ý¡«ÌœI\utt Ø¢[ o×ys³ÖÕC€zpR½þ!*€ s‘>æóœÔXB6𧆾¨ŠS±É}]y¯µÀ›Îj®0MŽß]ªR‚” USQ3wTëø¹må7 …ŠÕaáÙ) Q¬YÌ2Ñ9/Gu ‘‰ÎCÕPsôZ êNŒz™ÍÆ©9Ü©ü¨Q¤ÿã#§õý.N¦OŸNô`æyZ›:•ø¢ªÔåÔ©+W®¤£gϦ¨z9sæLÚ…R›“£:H˜”mÆäO‰.¨Ü|¨‰¤¾=*ÙÙ'ŸòüE¥šð8¥¾^W‰²’àïSï˜È)ZæÞ^W…³”‡u朗—q¼Þˆþq|¨•Τܙ;.L!‚”-ɶ” u"åþ—¤º*‚” %HÕTl¤üp›X l¨ RÁ]YãDh—=|P.¥90!8ŒCx¿Ú…B d¨âH$x£<ºª‘Õ‚*™*C™é„¦ó ÚÛ§@¦E ¡„™6P£îÀYd[ut,Z´ˆ(›0ø"´&O¦ítê)§Zd3ut¨îرŠ˜kp2ò¸Ãa°ðàŠ„Õ0x°‚ˆ”{ØFj +‰ÇbÒA„ÁŶS¦ìP$ø9E’Ü–ò“ãºIhŒP§HErA‚H9_)A*©$œ*XK îs"H R‰HŸB)[*HªÀÓ÷¹G{y-e‡¨oAgò± ¥<å&è‰q‰f ·F°©TˆÖFJ´¶¶ZÑŠh8†$b”¢*÷5rä8Ô‹|ßc0C!F¨´·wtt >m¢õ… ™É@´Ÿh›4IE‡1„‘³ïÂö"Ti…Ï1rCÍxƒÄ>ÔÄÂNsLÌKw £ã;ÔàÏöƒ˜6AäôGþÕ<<³ «bf½Éo¬gÌœøˆqC9oÄ@KªeE©î‹ %H R5•tH¹mã åòå/Í”mÖHï¢íö+s‡ý Æ+r ]#è'+›Z¶´(´VÑ^Ä]ÙØÖÖ6nœBmìXêzaH"ÜéãØ±¨Ÿ4e ÆNǘz/ê%Ž}´©!†“&CzST†)Ê=²£¢ZÍ-Ž-y ?< - ðoh`·Ÿ’z= ž_+Xç!ˆ•QˆzLf,k:z¦€sÖi`››±òÑiñ•nŸÔÞ"HÙ"H R‚TME¤©šJ )‹žÐ«bA7À^)îï«ð¤.@Qdá.‚›Ì[ʰ`çvaV7¥¤¨/ …ûo S€.U•…ŠHå£ìð(=%˧L™‚LrúHæR[­ o]MN?cÙVŠ.Dsa‹µESÖ+OßèÑtÉ‘‘‘6aÖ85S<†’À2Ä$ñ*” Ï—?ç×ÛN%]³!r|–ôk¤¬§rSˆåµõ™¢¼Ù¸8Íánó ¬S¤ÎK!‚”-‚” •ˆÔRˆ e‹ %H R5)ës藑ɘ9Áœ¶ ´¡Õ²Þ¤±9$©Ábâ‘e]Zèlb(jÒ¶qZ`£žºƒúTÉLDVaȨaC†ÐñŠ&Ì“•©Ž„–ŠÇ‚¬MÄ`¶¶‘˜Ä¦½ŽkfÕQu.axá“*k1q"íÇÚh’A1¢ËjÞxõ1 mEM IDATîp<èu¨~cS“Е4À~#=|,ꘂeH•LIv¢û±‰jèøo¼j R5AJJDjO ¤l©êñK1ü××pÑqQ+øhvûq’òzé®]™#œ_ÙI­g7²¬î­)ÜÌ¿"gçëJ9Žóšºîcw¼¬–ªF U[¤)Aª¦"H R‚TM%„T<ä[¡#(ÆÍgQäÖïÆ~‡ûÀ é¤'£³’ÇXYÊSžA £\”VM…‹¥šÕ óº Žº™Ãˆ‡95Ô4ï´†߉Ž6-C†Ð~²©p! 1û¸ ¨¢n? €T£ jV…&OKüAù UÑi®´›ÉúuüÓ­âöÆË‡‡ZCÇm½Ë|NÐò[4ŒÔ¹)D²E¤‘ÚB)[)AJª©ØH £û>°îYOvóšár–кv 8ü ÓÂJuƒU¯Çãñ&Îz+"+ñ^Œ˜P¡0éq”õW)F†ùséòé°’ÚiSk+­·EÚvPè5ÚÚ†úað´«±¶¡”À<®ßF¼ R˜Ù¹ÊtOeNÁ“ÎÔ` K½®šV޲÷òø•<Ú…É¢]…-ÏsôæómFñ3µòQò_g ïDXÍ6O‚TD¤‘Šäœ‘Ú¾¸H%Ì,Ÿ NOÄmNîúh™Ž_Y£¢‚ŸP#ä]P.ºëe=')ö*¥å"“èí¡÷¥æÌ ÍÑðyåñj£×‰*ÄqA‰*²„ލCopHK‹ÊmЦ­úèRjH!'5FšUo}@åÙU罞*}?§­èщ¼ëðqOÄ´ ÛìŽw*«=èø©ñ:î[6!à;ý¸chr’ zty !V®AT.« †¯òüAßéÒàŠ>¢¨Ü}£QÓÝCðÓ‚±õ\d î;Õ!ÄøÂÁQ¹#5 SÄ!ç\å@á*Þ„¡†NÚTYO8Lj•´—³ g1áwIÙzU˜'õ}yñ°ºÕ\î¦x8Rî©Ú#Usîc"H R‚TME¤‘:;…HÇÏ–ªHÅGÉEÏB‹½QN–4«Ô$§3Ò¥²ž±£ s°Ë¦XRÙ”§(FÓUn”ž·fÌ‹†ø/ÛXå„Þ³MÕ¨©P%-áñ£%B½ O¡ÞÈŒ‚A5HiÄ(Ã&]S¢“† ü—¼Tß©éf÷]ÅFâ‡Ù\Š&iË;?XºÙÕ ˜)çf8`n^[þ³î!ÿ¤¶§.ÿ—¤)AªgHÕ±ðzoésAJê¤*èTéåhHÅèUéò÷€Ô:ÔÂÚn„5¦ …C¾VÞ›²™œ:™0¯xW½¦Hë3Hñ`?e81ФFb@ø¨J•! ‚ùÖà'9ÍC Á.…ëWÆêBíª¤eFŠÁ€â@5[†ì'g”Øh¬×Ðó:Àc{Ó¼‘¬7˜õF3µà’iòwòÑb@ÙH•B|@*ÕUþ˜}ñMÇ™R‚T­‘ª«0Sgý­ì=áÜ'ÛæýÀ/·¤Û¿ eö‡;€X£ )”šAƒJF4D f.R Ã 2:œ‘^Ös´+„Ø#gâ²jj¸&=7);ÑT GÇ+à@#ÐQÎÄÁƒÑËk*I€ä±ûê0úP%™JGõz ¥…'qǯ¤ 9ã<ôú”+4«'å'—5õøY[ßYZU{Zë5þ/å±t\AJJDj[ ¤l¤)Aª¦’„”ÿ쎪µ‘{(Óãl·X:Ñ/oÜzVŠ[IS¤áਮ4Yâ )‚«pþÕëè•Þ5äà5ê]Ê0R_ ÷†*ð0d=E!è‚*éë€G%ôé 9Ô-qƹe‚ÍQ‘SîMzQ›U 5žìYÞÒŒ)Mïäþ9m“b$©;æ )–­ñ]ã–ZY)AJ² ¡C+®VÖ_AJ¤©H¤|”üN:ïäø9m­³ÆÀKœ7Ó÷šr%FÈôA»`ª°çÊ× ýèõÚ²RÖ B½°­T„Ã/ê‰s]@h©P­NØ„q†ð—ðªG1D…Uº ¨Â%¸°D=”¬¯HQ{ù­"ð†§ÿö¼kŽòºÌXѼs¬ £9§Æâ<{§¥ª6›C_2Rg¦ª¡Þý¸AJê=¤Žÿ„¾€„‘êF¥$«As^ö´åäãCŒN(áN‘)b̽=«ëd)'6Õë ߨ¨<~º^2÷«JºêȬ.¦¤ÃU·=Žûòv¤ Ön?åã«7Ó˜¢Ø%ŽT­n(¨QÝW„|ù®ð-¿&o‚ó/«Ý|qfìÀÇL•~xà5ÇÜš+c|º½†ÔIÇyX7$‚” •ˆÔ–rÂQ“(‚” %HÕTBHq:zZ®²¶øtв4Fç³8-ÊY¯§·ÈéÉç•þaÊ6>t°G°¬èJÈñãÚDH'd°¶’2˜À…ÊD™ ¬©Œrvâ ¬)5 Œ";#ÄEÊ{™i22šàŠ49|V[ØÓWÒ@ô„¼9üXyl\ Ýxø¯­j”UC®ÂZ€'©Í)D²E¤©šŠ %H R5•$¤ø©›ñÛÆm#k«ßÌUÆ÷›5EÈëÇ>fÐÅŽfU,’ôØäÅ•L\zζV=ÏꦋM²s½d&G+b¨G…¹L…F°ÎsP§Ò<éivͺ.#ÖÈõ. %®yÎ6GŒ­Tùæ‡òƒQÉ)¾ ºè?»Œm&YÏ8‘">ÎBÉjÞd¤ÎH!‚”-‚” %HÕT)AJª©„‘:¹Ê„ˆ•fòQ2â®óTˆf?)8ë ¯8Îô2„°SãJ¬‘œuÁÎtv_›ÉtØm]ÒÙŠ øà\?@D`{®Þ¤ýå|‰=íÄÕJÚ,ª¼øØ3nn¤ é*j¯?ß½‹,H¶¥rž)ê?^™xÛø¨±‰lU¥õ R›Rˆ e‹ %H%"uz ¤l©ŠTWã½fµZÞt>¸óRq`é%÷{”zq¡ R4:'ÈqõWuè´­"ÐX¨>÷öµ§Ž}pEÞŠ¥Õä½bQy™‡RI•YÇUJ‘3ƒ³ê| _Òt”ui§¢ÉDçîªÕ¹Õ¿VÕž0n¾œÓÛËÄs÷”Ü7Z ƒç¼ ƒ?Aªæ"H R‚TMŹC¤¼™;6¦AÊ–¤ÿRqnª&‹Ar¦0–1»”L÷Ík%¬h Sµõ“}iE3Z[/ÌCYòkˆ¿*„Ì5êi~q48õ<‰ ¸0†â9€E]ŽÁnÐ3 s ÚõKjêÀï shÅ£§}y=àÅ7 *â æ?~£Åaµ\¿ªq^ç¿” ÕU¤©D¤"IÄéx/Ë×e¤©D¤6¤AÊ–ªHÜEsŠ[0›jeŠ·çLÂkXјM;>Êþò’Qe¥¢Ì&®Û`¦¡Q*g9(8p }W‹Õªæ…(Š«¨äý¸t9Q™wÎÜŠñ§g9Ì럣€æ€©AÁûs:“Q“ü ¸Î¬õb;Ô˜YEÎëË}U{VJê‰R‚T"RëSˆ eKR~bRµ´Çe-Ž`Öùè„)-hTAû¸WWà"J(Y6“!»”¾k[^» f´’®Fž×5-쨬î3‚“zý§¬Ý% øP¾¤í³«pÅ»òùÊ\t|¾DÎä×çuæ9¿C¯#óÄò:)=À‹õ,«!äH•¡‡‚TÏE¤©šŠ %H%"µ.…R¶tЍòm*FÂBÊá%ÐŒ®zµPÞ,3-Y1*”ž5î?K\ÚØÖ2VKA[V¬¿lV±'°Ì3³Gã±8á’ÎçŒó¢þ¨ø@ tD‘™uþ¨oã[Áë¿ °ÎwÍh9O‡}|öëÇ©8æ¿Ñü7›Cµ´ö'5¼ Õ}¤)Aª¦"H R‰H­M!‚”-©m)«íâ´>Zê‘Õý|{ÎŒ¸ã0¦A‰4ØZ³”}­‡33Vl=§¯å_×9ƒùÈ$*°>7™4=€ Ú?nÅgÙã]ìdg± ±"å\Œ‡‚Mn_ž+îBØcî å¿¹¬gn‰*Í䬺!%HõH)A*©5)D²%]Ç/¹ÁR4§ß9±ú3NéL'/‡yRÝAƒ¯XAV¬×ëÂäÎQrTî¼¼÷‡D"uIœO_Ñxè f ¤ƒ,‡z­[1Ç™îè™í |ŽÃØØÏ?ØtôòŽç/ª„ärâ/S5Sb³ R=AJ¤j*‚” •ˆÔê"HÙ’ŒÔÉž9å”K²Ú(Æ·8{©ØD€ºä±ôÍ-3‘`yíä³|h9 Λ )¯ƒæªÏÇsÕrF4Ïyî¬×þ„¹%]“+aø¶“ ñ‚Çz˜i|)FL}{c#_"Ç?Âö2O\0”LæçI»»š§/A’ )AªG"H R‚TME¤‘Z•B)[:EêdS̉Æ òºøNÞY¼ÿŸóÜÅz9#¬ÿl#̸@cc•4ME“]WÒ5Ò‹‘?¼ Uœ·˜:.¯n&\T’וÁ¸P'äñ8’\N¥:&\àp€Í(1¥84¯‡ ªuýÂI ùVã#ê ì^¡ H­L!‚”-‚” %HÕTÒ Ÿ»iéÙ@[9_|ºåQjå  Ïé­y#V—ÊLÐŽŠ\I‰»RœòÃ],3è¯À#xAq$vïåMÂÇù8î{â(NlRT›aÑäÇs÷•ß9§&¨ù¹!ÖÒï ÆdLpF`Ï×&HõDê*bm !H Rz"g2œ¥)äDB*$ò_JêÂ)AªséRL7“¿tÛ:q“…TÎ^çhT,­ü£Ÿ=u”ÕØZ|H^çÞtb /+eÖµÁTÉù3f•‹¨ÙYÒµË N9$Sî¨`Æ2á[Š&ãÜ5¨œ§ Íy¼î²Ú³O.†)HuCêœo¤©$¤–¤)S·<~‚” %H…$4œ©“ã¹~ñ6ÍÆ‘âuÖV‹œ6 òÎÈ;3¸#o¦…aD”1¶© ßŒVÁ„vaKå´Í•3ÁW뢾ÃÀ‡ÀlÊë«3rEM¡ÅMΤòøÂb”îÇ@Y`çLqøxáóœgVño d­ó%}”ÜÇí‰ u4D¤‘:-…R¶t ©¬×|6 l²4ÊQ _¹X˜&W ™2ko8ª a<‚ÄîÀ¼ÎõΙbKÎ’Ñ⯮ôù JVwÓD‘ NÈØêÓ™wDA÷L º (¿9xƯ¶¨²Æš¯ÏM`»³Ë¥)5O‚TD¤‘ZœB)[)AJª©t ©:\F)kl)‡¶ 7í™È²Ê:¶”¥gFóXsVæ¼vãì K9#L_Ád¤ç´íĈଠ¶Ç1gŽgCɲéøÒøyíÙs¨É;f•“ª~Lq' ÏU6ðr3Hu¡¥©ˆ %H%"É¢‘Ú¾R‚T"RI8U°:–Üç¤+Hu>È#ܬjYír¦4+cydí¬8K)KÅ™&KµÍ:#æîröãÒE=„ÐåÃ\\}µ—o­ò` ùKœ€Åt0æ3F§ƒVž§Êñ«óú FÞùHAꨉ %H%"µ0…R¶t ©“MÌ΄‹(Yšci’ß߉'j»¹K_FS³º«eÅsYÿ‘=TáÁé¸t‚£äpÀ42`V_’…ÕçÌê1“:¦Chýpæ!OX2 Jó ¿®œÌôÎÚ¢‹­lZB)[)AJª©R‚” USé2RÁþz¶JOßRŸÀÒ:ÕGÌ:Ûè›…PÖSE­ñj:–ã~4¡Û<*ò~žìúšA,ûÿ·w^ ®êJ¼ÞðË9çœsÚÿšÞ=˜vµ°Œ[3Sõq|îò €XêL®Ú&ÖN޹wx\ê@b›”:ží~+ªÆý,¹Ëî/g쿱—7(õ¿PÊ‚R(…R»‚R(…R»r³RGíòM¾ÆëøðpLÚ†ìªF¡SxìAÒG;sº¨c”“¸—ºÔ¨í𢌴³ë~Nú5“oÒo™à\Óèr(WDY8Ù®ßäçÇ_ x™M5«ü1K¾‰›}rJý·”² J¡Ô®lQJîþÒŽÅÖïÚ‡GxH|pA(q=ê£åçÎ+w§C‚ò¸wNÚ¼´é…£/#Ø“Bsc8º^_gQTæ:Ñ#ß]îd[ñi¸úòø+Jý§”² J¡Ô® J¡Ô®Ü£TŠÿ²c _¨hÐ_‚ty„Ñd™B¼J\‹§¥ÿv sªŸ7š‡ñIœ%Ób ôù¤®¤£úL¹NÚ8•rŸææ‚ûLñç)µ(WH¸e*̺Rÿn¥,(…R(µ+(…R(µ+Û”:ÖÇúå_s.=Ö7Œ&ØL0ºªŠ¤ufÆ¥kø¤ 1L_1ÙùÊD•ÓR}“CkXz¨Ä/~,•?'«’¿4òÃà.gí­ø´HµÉ'§Ô¿@)Ëõ·v ÔSÊ¿¹ãŸ  ”eó_©Øß›ß ê7Ÿ‡E¼Q”ñ8±P<`uâ Ë›>ÎU!ñâ’$ËÒ’(»–ÁêÚ˜8-·‘²WMm½<Ýè„?-oˆŸ |Zž#Œ¿-‰?ñ7Å] )Ý4]Þã¯Ô'Vubî‰J¡ÔªRü•º”B©U¥þÑJY6+u̦ÊLì1aa"ÅEV-ÿ¶š–y$E,ó)¾8ŸLsÌVn”0›¸þY©cÍv‰U²Ò¨8-0šíIJXšù_szâ…óeÒ–¾ÈèH³ eÏûfŸPê.P ¥PjWP ¥PjWîQj©P5ÌD½1‘"ÁäƒÇ(%‰¡5º =-}h¢±LºzM|OZ7’^áÑÖ$«íø]r¹Æ÷1ÚY–N’ÌÙøUi¥²¬c zâe̯ñ=_¬*õ÷PÊ‚R(µªÔß@)ËJÕçdô_¿ ’ó J!ŒLä¿ä–htÈ-— Fc™z"Íw'mái‰ ³-ûC«ZÑV-ÌI lZöj¿nS³~ Íyɪ!߀äÞÞØ‡Rw‚R(Õ…Rï§Ç¥PjU©¿6°ƒ ‡ÏŠ7³¿UîSê¸ Jw²ŒCåéÄÒ«ÑU1ŒR&¤µ!Ìg©µøIí'øw2¸•ÓÒøù^õM¾¥]¼>Îu}¬P™‚NðøÃà˜´%0õ¨U°;}z–Rï”B©.”âÆ¥>ˆRi€?ËÝJÍV]ÿ–+J駉T“e²s¡û½ˆ?éç–'44ާ8å\ñqH—­¬Ë™-Ó7:‘µ7@ÎÁ,ÈѧPó²s+N´¼læ3QìnŸŽw*u¨ýÉ1ãÛMÆÃE§÷áJ¡T‚ÿŸð*TŸhv(3¡”¥PʆT-ÔdM¦7~Bi!¯‰¥Ã/Åj” 6¼çC-av1éÀ<Ù©©õè.F}CÖÊDwüIGY˜ýN¶Bd¼‹þøפR²ÁçK¯ª4¢ß_šÙI©ƒO¶JNÑ<á@©w«ÔŸˆJì-ž­B™ßËߤ’}”*žF\½L#G",†ÑX†Ø´¨«[ 5}R«¼e²ó)PZ>é@c¯6ÿG‹§Pú($gÿ›^H£ÔN>ïTÊÞĹjJµƒRïV)!UÉ4ÙuÙALC©PêÝ*õÇR;Ä”ÚJmî‰äëO‰‚åÁ6h[ÚÒì—TsŒ:sþÓ2§Äe­pÎbž ÑŒec¢Ùåülíü1Eô¥Öó‘1ƒþ@4]°„×Pê ¬(ÅßvP ¥–Mâ¿¡y"oñ{? J%ì¤TÒùTYõŽØM©c9™ó QÈ/¹`ŠAh>5þcО·v òAUÔŠ’÷À$ªr^ÉâÒýÑË~I56šÖOŸè.P›h»ùt´Jý¾l@Rl×2¼ P ¥îRꃳ§RÇelRÛd•ñÁè‚L>½jzƒg‚ÛíBòOñFNfš úQC¢œ»t’ùÔxb&µ–uЂÕk³Â~÷|3(µ”PªD•ú](eÙü掔zûJù7w Ô­ìüWªþ’#̰<¢(^ vÌ_²‰ÙÎDš z£˜K´ö2G´ÌaJ£J UÉ䓽hsáàŽ}ù<Î]  » ¹‚±ô.wraööiA•úm(eA)”J@©í J% ÔvvWêX±ª^©G&ë¨-×|I|Êúiº¼é¦|ÜÂWÇ[‘ñ¥tu¯9iZDJá͉¨š¦ºf âJ3ènÒ ‘$F^S©ß4€R”Pª¥¶óJ¹¿Ú¤éI¯D NMò›¯†R¥)ªãz“÷@£õÅ·#Ö%s}ú³pgãcQâ…É–Rv÷éˆR÷€R(• Jýº”² J% Ôv^C©ãÑøiôT’š<&ÒÆ4Ó¸÷ •Ÿ>~MÜëØ>³+£L<¤&«ÔúXêXºx ü¡òËrŸ®^ãÛS¥~ÕJYP ¥Pj;(…R ~î‰UÞõƒ[xM¥â ZVlŠ]¿©]‰’îâÞçKÕðÃ5‹ßÚI4–ω¸L±ã×½VWºƒWóéh•úe(eA)”J@©í¼šRÇòÙyyÉÇÜ6–—‹ß!]ÕpAšsÜ8Ù…·LÕŠªÅôX¾¼TšßüÀŒjoƒ7zBòéˆR÷€R(• Jý¢”² J%¨R?o¥,¯©Ô1LGÑôh¢8Ï1WŒ´¤ŸÖÅù%UÞÉ¡Ž*r¢ž«0%+~¸‘‰Ó2c†)uùÛÒ Úëµô (µ”Pª¥¶ƒRJ•¨R?k¥,¯¬ÔŒÌ×Ý:'…ª4è¢/£v²Êªò¹BïSg,GšýïÉÍÄîÊU¸Nèœ(—@‹äóÅå伺OG”º”B©”Ú΃”*ïþjýÀ>‚Ì­RÙì#/OrÞxÅÜÈtG>¶É=Dh<Ñ»¸¢zã—«ãnoókðÈ–>A•úi(eA)”J@©í J%¨R?i¥,Pê(#þìàô;FµË¢/.èü²SipVÄ8ÕMbœ»ý Q)ÉïôO5j(þ 5‹Òs•…‡…R÷€RJ• ÔvPj@©UêÇ  ”åAJ逿"®B(.::®–%ÝÏdðu)ï‹ûLJ©íñþPQ½Ä‡²®uÍ£ ªFÍ ÔvP ¥Pj;SêL:*)&Õ‚íeyPÑElžÙ©#q=éÀ£äÓ 88 k¾è‹§¥[)p²«xîóéh•úQ(eÙùe8×@©þ•ò/ÃA©[á¯Ô€R%~:—®Àt.‘+U³G¢ÚJðÉ*“EÇøùLÄ…R1È˺‘WÍÕ±\RRÀ†³ˆùkƒ jÓŒ*µ¦ÓE«gFpw J% ÔvP ¥T©4€R–‡+uÔ‡=Òà©EÜè^¬[ åÄImfê¸MÆ“®ùÍôê¾H×Js¥è÷鈔]5ÅnIDATR÷€Re°£JÝÁ3”:†Áé)‰ I&qÞV-q7~.Ý,¸UÉñM³aYšZió£;^ÿøªÔ÷@) J¡T‚*õ½PÊ‚R(•€RÛy’R3©Uc©F+yüëgõ@Н#Å]ÕŠtmð|ä²½Ëù¼¯¥¶ƒR”:£J}·”² ”¥Î Ôvž©Ôñ“UëáWþçBx¬‡¼YÖ÷íÔ‚ÚìâÜ^_ï=.6uI®— Ò=ˆ¹Rzê÷‚RÛA©t×(%ññPÊòd¥*w•¯·‘­6œUW¹ÜÍAV—Mn±Tn0NášØÏlæ3 ÔvP*9Èê²Éý”úv(eA©ä «Ë&7J¡TÉÓ•:¶ôûfqWÆkCDû`®uGuÝvIµí†–ÉUûzé Jm¥b–¥¬Rßj¥,(³ (…R÷ЃR3/«bù-ÙÆƒ¼&X"q×Ñ“šBþÐM*Ïêz~u(ÁÏ=±ªsOP ¥T©o6€R–n”:óòR¨å^úQë?­'꛹—K”‰›$»nRÈß3FbG¶,w#ÓUê  ”¥P*¥¶ƒR(•€RÛéL©™¹âã#¯º1H](¯{3\WdµòÚ.{“eù yö5 ÔvPj”úìðõPÊ‚R+ JÝNJ—‡>’`œ“^\õ*k­"cž¬}Þ Nš)þ¬æîT¦3(µ¿¹£”zþÍ_k¥,êtáEBËŸù¼õVk¨ 0jP¦‰õvIIéÓ¦ ªÔW@) J¡TJm¥P*¥¶Ó³Rgb×o=ÄÛâþ;"õÆEŸ´zˆNkPUê+  ”¥n¥Pê:(u(…R×é_©™¼··)îzSOšühXïÞ½LgT©/7€R”ªùRs| Ô­ TÍ”šããK  ”å(5ó’V«Ê ^iÖÔ_®6ÅëæPšIJ+Û½›fPj;(…R ~î‰U˜{"ð–”¼Z«VÌø¸7!^nPÛUíçý­ÞM¾)•Uê‹  ”¥P*¥¶ƒR(•€RÛy‹J1Ãÿî'¯[]{UÏ*o¢K·†*õ…PÊ‚RN%”:£J@) J9•Pê Jmçí*%ÔúкS‹=+’í’]Æ,oW%¥¶ƒR(• JM  ”åí+%ÔoW$Z¿‘»v—Ç:½}•”ÚJ¡TJm¥P*¥¶ó¥^ù/–¡> ™ñ`Y8Ô²¬(ôò“žñ]âcl¥,(…RÙ!/ñQ»r”² Je‡¼ÄÇ&¥>ôØô÷§”ÃÛÑÀŒRIVÝ^võÐZÓ[Sê“PØ©Ú×µþ5^ù’ûÙØ+ãã&¥ëJõsÎ{l¬J½4àýùÀ6ͼs¥/e|¥fi^–ÿFžYì·©ÔÇ ¥P*K¾ÄJÝJíÌׯȕëÅÆo}ãÕõk;9ܰå{äp[|ørp'ýÆ`gP `WP `_ŸaÀžÄ Ø‹¬‹ðÙtV¡Ã+Òaˆú”ªÃ"Aô(½ö¦ôW"è’î¥Ûiý•ºäÐ[ßEÇJuv¥ O½õ°÷«ToW z¦£HéV©3½– žHútM?‘Ò¹Rý ú¢Ÿ@A)xÓtÀ6¢wx¥ Kú àÃ埾èïJA—t8ʦ¿éµ\°¼s`_°+°+(°'Üøì Í»Òëû¥`þ±z"÷Åç‚IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/surfpart2.png000066400000000000000000001462021477365367100224150ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœìù—]åu¦­ÿ ‰Y˽Ü^¬,wâ6ØmÀiâ„4`7¶AÀ„É Æ$,1ÏŒ$H $ÐÏ»wÝ+»(.¥[B…¾ýCݺc]ó=GßžÞý…/$K–ìscÃ’%ëÃ>Ýúø,Wð~gÃþ¤oû¸Çkyö³yóŸýÙá‡>ì[ß:á„“N:éÈ#üû¿ÿñmÚ´{î¹æšk~úÓŸŽqÊ)ÃN?ýôáÇÿË¿ü¯ÿõ¿öÍ¿y0ß¼_!õ…¡õß`B*!Õ×ýëc@jhA•JHõõpïúøm ¶/ÖûÐñØ>ሆíåŸü«¿:ì°ÃÌk9ôÐcŽ9æ?øÁI'wÜq#FŒøùÏo¼ñÆI“&M›fÞ’9JMMÆECCCSÓrPɈĘ̀Àw²_[ZìG±X„«BaX±ˆ#Õ”Ï %+û”æf{¿½4—ÔÙ‡Øë,X0gΜ™3ï¸ãŽn¸aܸq#FØ·©ÏqêµÏâõ®ý©¡ò_UB*!Õןì]ûRNÓ`*!•êëOö®ßÔ`ƒñ«Šéî_ª‹ 1¤¾öµ¯üÉ'Ÿl(|²ùN£Fºê*[̆ÒìÙ¶¸—.]š…ÛA&'ãÂЂã.Œ|>œp§©iXÆÀ‹—´@]©¤‡òyÞœÃÇ2´ŠÅr¹Âþ´}4º®¾úêóÏ?òÈ#ã[|ðÁó7tÐgpÀú'{×Ç~€TõrÝgiàöœ®½±AEªi?Eê3° RÕ`Ca¡ï;JHýùŸÿùÿý¿ÿ÷´Ó.¼ðÂK.¹ä¿¸ýöÛ§M›öØc¶Ëcé³Uk û5#¦`ëŸ-^s¶wlø öt¼><¤H_kk셟ǧÛG@¥6„¼)>UÙØ¸pá¹sçNŸ~óÍ7ó§Ÿ~ÒI'zê©?üáw¿ûÝo|ãŸõ1¬Ñö+¤†íq³ß[B*!Õ‡%¤n ©„TVAêÃlû,$JH}õ«_>|øüǵ×^{ß}÷Í™c‹·%£Ã¸(•JxIpâ´ô±Héâ>åq“ZZøaÔà(ñ‘@°‰ø!@ûS^ØŒOÅGêO‘Ö§76.Z´hêÔ©“'ÿüç?¿òÊ+G9r¤}ûÿù??ë£X“í7Hñ÷ãëm ©„T–¸%¤R}X©_×`ClͲíÏH}å+_9âˆ#9ä¿ü—ÿræ™gžþ¨Q£n½õÖ‡š3gNÞ±|ÃA‚–àß Ÿj¹/}åi¡H©^|!»BP‘ó{Þãåz|Ù²žy/ð<ñsû|+¡à†Æ <ôÐCwÝuÓM73æì³Í±:ꨣ>ëcû VAêƒl0}©ÁûèÁ²„TBªÛV Q Þ_©«í§H}ãÇsÌ)§œb( ~á…ÞvÛm“'?úè£K–,inn­¬W6~”‘775Ù–Ì6~¦ƒ“¦¬IyZVzÞlñ=ÏÛ^Nô@_U¶—ÝŸ(⣸Ãûb©×ÙKØø|a@ÛΘ1cÊ”)ãÆýìg?;ï¼óöóØß~ƒÔ´„TBª« õ~ –ª¶„TBªKH Üö;¤:è ãŽ;nøp[v#GŽüéOzýõ÷ßÿ¬Y³æÏ/±ô©gÑmmmüŠEL®9 ö²‚råsåÅ­ÑP.‹›rYæÜáW=ÏçU! c_ìn ]¤xÝ9kÑßà¯ðl!óçrþ]›a}ÆŒûî»Ï< .ø¬t¿¶_!åþÔàþ‘úYB*!Õ‡Uz¯ü¼Ô°!ûKH}Αêûû¤þùÞõ±ß 5d˜ÚïúÇüÇ3Î8ã²Ë®¾úê[n¹åÞ{ï;×\–°„!Xç,ùðVÄwèÐ(øºŽ zäcËå²½´³³³TR«aÏ+¦þ¬)1ûÔr¹HÿÙbR¹¢ªP0”ñàðåò|%ÑY,’ VÈžk€¨+—[ýZ°téÒ ÜsÏ/~ñ‹sÎ9ç¿ý·o~ó›}ÊUÔÉú:ÁPŸ XÑ»>Þ­ÁRÕ–:ðªáœï‡H ¢ö¤þìÏþìØc=ýtõÞxã/ùK[y¤d… [¨††v[,Öω ª…@‚-]™Ý\„årÙ«)¤vIOEe9ë$ÔS»4ÂyvŸ;Ô$E1øG…B‰.Eʘ´'ŒZ§Øò =EjØn.œ3gÎäÉ“¯¼ò /4´Ž?ÞŽÁ¿øÅ/¹ÎÇõc‘ê÷Ìï_H)>1¸¤~–ú\#EÕÁ=XõóãÞ×»>Þ©Á†Ìjß'–ú\#ÕËO¯õ>Ô/S ©Ûþ€Ô!‡røá'žxâyçwùåcÆŒ1šfÍR™9•åQ8׌E0~ ßGôàS*V ë)Œ”uöTGGhâyÁOó²e¢Ç ß(çž›|&¾’½¥­MtSCXôRx©“æ¯éW($ ©o½|ù2lÆŒñãÇ;ö’KN:é¤Éì˜cŽùÛ¿ýÛºÜ÷¥Rƒc ©©7~¿ªÁß—Re³}m¶÷±%¤©>6~{Ö÷†³? 5¸_oûŒqúò—Í:õÔSÏ<ÓxºòÊ+o½õÁ4ª¡¡7¼í‘óÞõLa^ˆŠ±~ÙÆWâ%„¹ @Óâ©V{аwÜÅžW#b.×ÞÞîŸßB°wªàýrÏâyÍ•÷à¸>šoQôм(-ƒ®e´ˆDY ÁyÊÿì_ûÈ#Ü{ïu×]wùå—ÿøÇgœqÆw¾ó¿üË:á½ý_êí,!Um ©©ZS½ ©OkŸ1RGi+häÈ‘W^yÓM7Mš4iÑ"ñâË/[&´å#%›÷1l¼”Â: eËTˆšEÄøÈ»jQ³Þí#I kÉ;Ge×Á,ÅŸŽ¢wºã£Õ0ޟ˲¸Ëý©Ø[Ê TñÈèv„Âh¤BüjÏŸÿ ªšcÆ\xá…§vZEWs/­¯}ý'ïöR·„Ôç©Y©·j°AÙ6ÈŸ__KH%¤ú°ý ©¡ñûLÏÜŸüE]4vìØ»ïž5kÖÒ¥K]e¨…eXt3pl´þK¥6"m¼4¼™@°à5wòvp´@A4 Ü¬¨åó ÷V`°W77ëyN/PëÁ[D1\tvv‚”Ô3cèˆä³WÙè’“Hj˜—êÂÐÒbÿú3fÜ}÷OúS;&gõOÿôOŸÝyÙ¯b–JHõa¤Þ¬ÁRÕ–JHõa¤2{£Û'[²lâ`ÿºÙgÔAtØaG}ô·¿ýí#4ÉfÁ…¡)ÔS„ÛW¦ÇYÏ‘ÒmuQ0%WÝÛYâc¬s[Äp©Ù¶ÌZ£\0ú7p€pŸ„ë_*âñ½ž[Å­#d¾Sè›åC=ÏžßÍÇ·Âíª’[GË‚P}ÞÅÛߟ;wâĉ×\sÍ•Wžy晟Á¹q« ÕN½X ò–š;>ÁR ©OµFS b¿ö?þÇÿ8á„Î:ë‚ .9räM7Íœ9³¡¡©Ø˜úT@ŒmÂt^}Ôa5—=j Ëè~'fÇn-ï ìBË“»Ú°)UKAOÅ-04‡È±8J’ô¼÷ÁK3zôé/Œ÷çCË™ bÕ[Õ\”§µ\;øWêÂÐÔ´hÑ¢‡~øŽ;.¿üòãŽ;îßøÆW¾²¯ÏQ5RÿYƒ%¤ª-!•êÃR·„TBªÛ‘*Dí{¤Ž=öسÏ>ûòËÇw÷ÝwÏŸÑXŒZĬT•‰WÂlB*fdd+¹ b$]‹ÄÜXÌ—3J¬X±|ªööv"€/²ù% ß« ÈÖ6»Ï£T¯~žr¼׽Ç_Ë{ƒbÄó.£.Ï/+s_FÙ_ÁKÚóžnui'Q={¶ùTv †þƒì{ õ R¯×`ƒ_=‘"~ýXB*!õéWé)øBB*!Õ§Uz­Bë}Ø>FêØc/ºè¢«¯¾úÖ[xà ø¨Ü–ðJèÌËg}{¹ˆnÈTùPá±8Ãâ!¥€Ý¥)D¤«Õ5&J$Œ‰³Ãr‰JÁã-1ê„"áq>¥P±bVf˜÷¸ Ï“ ÷ªX‘>ãÓâufö‘´(ÚKézä%ü뛳2ÇeS¦L?~üˆ?úÑN:餿ù›}wžR·„TBªÛoª=TÀÝgHyä‘gžy楗چo„ 3f,^¼¸¡¡!x‰E¬¼^NbN+“êžVú#õêÉ•ùkU-ˆp¡0!»;í! âå]\)ïåàQÛÄö°à£ÝbZv%¥„ãOD:Ÿ—óO)øöP»>.ÌÉ{|j|‹³Õ‹Û#{mo²ôØcM˜pÕUW9òä“÷Õ¹ªFêÕlŸôK ¢R ©¾l?DjÈ0•JHõa ©Û>Bê/ÿòôÓO¿òÊ+o¸áî»ï~üñÇɧ²˜ó®!¤þD¬´¼7óU-2^‘=oG84‘êåÁAÑ[í©ÌêE!‚„ Óuu©Å¬÷ŽŽîG¾Ö> í–o¼®è(´A!ŠìUÈæ¼È=W)¬ž÷¢õx¼Õ»…VccKÌ·Ÿ7oÒ¤I×^{íÅŸvÚi'žxâŸÿùàŸ¯ R¯Ô` ©jKH%¤ú° R/×`É—ª¶„TBªÛ¯R~û ©C=÷Üs¯¹æšÉ“çÍ›G 2›{Ä–ó>•d‹WCp¢‰ƒç…„[Ο*xÊUoñf‚åz¾½½\é÷(ú ^цυ‚èµó¾öì yWÇ´Ï3Ê*tës@WôDßó-s®äž¯T&7¯ò#{ÌKtM©ÜïýÈåË.\øàƒÞ~û¨Q£ì0žxâŸþéŸòùÚ¿JÕ}XBj¨"µ»Bë}Ø #õWuøá‡qÄgŸ=vìØ©S§¢Ê+&e¶c1ç<ë›°ÇÞò•È^±">I¾v¹÷¬ýfëÆG«Ú¨Põס‡ôQmm*sêèhõzv8+g¥I%!ÊWSÙaØ%ÂÁ•ï5¶4(5‘xæ_Ûâ ó\kZ|nHlµ\´hÑ#\ýõW\qÅùçÿó?ÿóàž¶„Ô^XB*!Õ‡%¤n ©„T–¸ æäŽo~ó›ÿú¯gœqÆE]tûíÓ¦M[ºt)ÉTüƒV‚hqµ†p¢þ-¼–Ö«U ëTÃz¼¯³³³­Í~à )üsÕpˆb1G>5)zð/Ö¿Z¹…V=îÂÝâùVÕJEÊóÁNÿÊ­ ‹ûâ[G+%ˆøJþïÎë²²l™J›šìÞvÛmÈR|ík_¤³ö“;^ªÁRÕ6˜ÿK%¤†$R™Uz±KHU[B*!Õ‡%¤nƒ†”9P?üá/¸à'?ùÉ7Þ8{ö2Ú๭<)ÞbQÚ[Ù,3Åš‹^åVŽQkQ«G^ÎãÖ¢¯ˆ%[v·ªìAq{‘oÏyE\ Bž\Á ^hÇ[ NA®Ežçñ’[Ñ›@)3:—å|‹‚oÙ£[ÑSùèj$;ׄ‚;eá4ò¯ëýjÑè‚»õÈ#ÜqÇüãC=t°Î\f ©[B*!Õ‡Uz¡KHUÛ !uì±gu–Ñtå•ÆÓŒ3²žº¦XÚû±H+3/Z|xš½ŽuÚðbÃWU˜\yA7mÉ"_[𪠷ƒÁ¾àPI±‹à ŠI|Šò±P̺¯Jý¼ÝéêêŠ]\Œ‘ý%:øó>­à›úÓÁKl–¼›2´Çž]¢â!ÀÉÜ»2=þ¸íþFŽ98gN–¸%¤R}XBjà–JHõa¤ž¯ÁÒ|©j ¤¾ò•¯œz꥗^úóŸÿ|òä ÄŠbå(r_¬WÝw¿CÒà->E·àezr¯à"š¢[Ékþpxt¿£Cë¾³3Ÿ^:qxxIÑݤ’{fæsÙ§ó9‘¯ÏÏ»öïÓ-¯Ó³>DnY{m,¹“Vð`^®"•IVXA§¨]¯‹Z@þT•†.|CCÕúš9ר8åôË.;ñÄÿùŸÿy0¦»í_H îÇ×ÛR ©>¬‚Ôs5XBªÚR ©>,!5p ¤Ž:ê¨óÏ=zôwÜñ裋/nu]Ë‚ç_sÞ©Á"Rä;JàXœÐÖóÒÜ[)F8z-‰BV¹'ŠÅ_òx1{¶àK=øP’›’§ã]öºåCE(Ÿ0zÑ»ù ¼ IDj¸×Ýãý—¼ä[‰Þp”ð¨\ ·.§@é4¹a ’‚…‹Æ_óæÍ›8qĈ?þñÏ8ãȺS•¸%¤R}X©gk°ž¨¶:#õ¿ÿ÷ 'œpÎ9çŒ}÷ÝwÏž=›P[9iî[îóÕZ\ ’aÞ tŸE\ö m‘¢ÑDX¤E/$Êy6Woe%òÛåñ8µå±ä­%o˜„´¡cñC]»AÂà !ß ÙŸñ颵5k1,ùNµä)dQì_m¹g­=mí–÷Â$ŽIÁ{0];.¸ˆµI:œ N˜0Á®\^øÝï~·¾§qÿBjˆYB*!Õ‡%¤n ©„TVAê™,!UmõDêCùþ÷Ï;(ôE”Š•ÅÖ:…Ê\áý‡EΦ0_«k<È¡éê’»PhE>6T)@‹žòµÁK¸kUå}¸g7×­s&_‰'Ë^™.LJŠw>¤àñƼwC–½ö¯PéRÔãQyè©ärtAÂQÕµ$«úÕ§Æ•ÜùláR¡>wîÜI“&súé§{ì±u<“UH=]ƒí 9—Ó—JH%¤e˜d ©„T¶!5¸_o«'RG}ôÙg5êöÛoôц†|&r•-ÑQ‡E?iÏå/†À9NK)‚â®ц >Þ‰½®+Sµ,:5šž[qˆ´Ãƒ+î·ó‘öÖ•+¹“÷ÏÍó£˜ÕúÙ“ ¦Ôpg'œµG~—09(zøR%¦Sˆ,t¸QlÏG  ò§Âã“'?%šà€´„§e€Þ«©ËR>“]ºté¬Y³&N7nœ]ÉŽ9¦~§²‚Ô®,!Um ©„T–¸Õ©N8áòËoºé&š•©Ì yW~¬Šðyx‘ûd{óN—‚Yga[$Is•’c1«6ê¬ô µØj±Eô—dÃH7bÉ+ÕË1‚ áfLoèê²Ïå¯ê¯G6Ù«”ò+WÆ6TÄ+L¬C#ÑÌëŠ>8Î^ÒÙ©¸!_‰= "{D #Q]®.`ʇD׆BöÏoõD/»Áå´&U>zçw^~ùå§œR¿S™¸%¤R}X©5Ø k¢°¿„TBjPÖèPIVO¤N=õÔ›o~ä‘GÈæ*=Iª·©Õ5бXy9—d(ìÑ©ç£Øóá+x-ïî ØœeÆbÔó.Ù`·ø>¡îµÞ8Ze.ïR˜ÊGí^€è>\>ƒî+{1})Í9|´œË)¾H²œUÏ+úK\ •†I¡úGä1|¯ø 1ªÊtËGàS•(ìonž1cÆ]wÝuþùõ;•¤žªÁÒÆ¯ÚR ©>,!5pKH%¤ú°„ÔÀ­nHtÒIW\qÅC-Y²„}~ 5~e’šÜaé—}žš¼#ÞÂØ™JP½Åõ-ËáuD4>ÂÒ¶&²½bÅŠ’†¯© 0çÓoñfòÐÆª_³f añœËHDK¡x-ð¶'QÝ,xÅ žÄÃÇj8TJ,Ó(‰Wö>Qæœä£«‘:E—·ÀÓコ[ˆ1u¡íé4µ¸”Yccã£>zíµ]tQÎf©5ؾÙ6t,!•êÃö+¤Ô~©„TB*YfõAêàƒ=zô¤I“/&ÞâÒãE×-ºÀV.Zsí!Z½ë·j…e¯? J!ïR±±þ;ЂÀß/ˆ¿¦¸8õå¬ÀÂ`0Ô²*Á.}Tg§´&xËÊ•+£*"ª!ððÈJ•²?þ@©b€/*¹Õ· y þuЗÇùóŽ©ÑF9!ß^ŸV¬˜ó:ÇåáÆã@ÅóJ@x)…„hfμùæ›?üðzœÐ RÛk°„TµÕgNBês„ÔžÃpRŸÖêó¿Ôw¾ó‰'.\¸°±‘qc:ý–c§ ôVÍ‚oõéé¹»ôh[[ìë|*{‰õ¨ÅÆýö¬¾\ë>bd,Zö†*ØÀµÏ[A6¶\îÌR­â‡‡ô¾ÈÛ<_[„BÊûD(±ñËG<‘ »ºîîn>²àrìé+ød`ÅÀ¨DÇì#"ôéy]ÕÏó’œ×Õ«Æ/ ÷Ùãµø47C.K€ÕBÃâ¢E¿üå//¸à‚ù—¿ø‹¿Ø[¬z×Ç“5Xò¥ª-!•Úß‘ÒÙ£>–JH ¤†S{‡Ô—¾ô¥“N:éôÓïºë®ùóç766VÄÅŠ>yLãÆhA +4Ñq ŠÞjXöê8ù^Ñã€;Uô„°è ´*Ù`9<á½9T°\6~:³Ÿ­/ôSmž~%\"½îV.¯Zµª+cUî0¡Þ…g<øZJgÞYgøBá–å=kÛá­ EW=+ºéÛózÐióZ>ùR= øÅ8vŠž†0[έ¥eîܹFÕUWy晇vX}ÚVƒí›Õ>T˜JH%¤Ruµ„TBjh 5TˆÚK¤¾ÿýï_~ùå7ßüØcI[‚Í=+"ç}E¶üÀR× ]:5XYr)* ò?Xù…‹ðv¼®Ð–à­„£‹î‰¼)#’¬zˆpyÑ[uµôñ¹JÙ ¹ÈËFP¾‘HÙ*NOM!ôtbI4ZƒWâ{Èá;‰ø îߨ£%¤Rý"µµ:Ë}_ØÞ uÔQçwÞ7ÞøÐCMÈ7†z¹G! ^ÐJlVX±¨µâB/g: Ú/-_ÞÍz‘òmkkö)mm>F£*  ï9%öYÆ ^JhN°gäA»CêW/Í`i#?+í‰+”F€‚T¯=n{B6’ ÁDÕ$ñXÜ-:Ùæv—±`§4ß0s^ŠÛÛ80yW„/FÛ&;_Õ1ä>ûfE[[mç½téÒG¹ýöÛG½7-‰ ©[B*!•ª«%¤Rý"µ¥D¤†UÙàý•ºÚ€‘:ꨣ.¼pÔ¨Q÷ÜsÏüùÚÌs¦ušC‹ÌåòLÜѨ+»äB«K‡“ÍUF×zO±:!F {Û\ŽBµÚ,jP‰Å +p@EŽ³Žƒ<ªŽû•gͲ¥Ž·e/z'Q¬à¢ UtQˆ[­‹*„¿¨ñ+`nú–Ä!¹è*€/UªŒv!ÇywÃzÃyþ¯Ï@åòÓ›!Ïæ·5Æe‹O¹ßÝwßmîÔðá|ðPGjZB*!•ª«%¤Rý"µ¹KHUÛÀú¯ÿõ¿>|ôè)S¦,Z´(Ô° ¥JóÐ ^ʦ°q¤'#†Lçaí’«2hE‹bÕS„±q`bÝË1 ×$fóùöXw[äc»ÜìW£ˆæ-Ý…T–<~n/‚½•'A,³P°[hÓëô…–Gö—c‚Ÿ‡9ç¿F¼½à ✫¹Íž=Û¨5êÔSOýò—¿<ô‘JžTB*!õ HmªÁö‰œËaj`H}ï{ß»ì²Ën¼qÆŒ¬€ØÅ•(C'Ó© _GG΃xìþJA_ à_ìõX±±ÂŠÞU®pˆ~³Џ›c‹Fé±·‚7¶‘ÖžC×Ò_µjUkk<…EÚ+òƒ=¢"{.vé Þì (¥Ë÷X‘ÅË.Ë.úøÃz)FÕ®Øà±ÇÓö•m¹"¾gem }ÉŒ²õ‹P&QÕ‚SD޼… !AÛ>öØc÷ÜsñÅÿýßÿýç©!ÃTB*!•ª«%¤Rý"µ±KHUÛ§Cê ƒ:âˆ#Ž>ú‚ .¸þúë§M[°`ío<§ly¤æryÙ²e8Bqæ#d¾UÞK¨C‹Bë¨g‹•‡ ^Ü•á+ò³UÉT‘xò_ 8àž=._*«E=¸S¼«˜… åEp˜¸¾”¦îî=#Ë+ðÅâZ oÅçÛ?$Cß6]ÈS× ÝæýŽíìÁ~¹êŒc§zÉJ•˜.[—Ö^´xñâ©S¯¼òÊŽñÝ‘*D%¤Rû=RÐ4dˆJH) ÂC IDAT%¤úGjC ¶/Æ_öŸ¨Ÿ}:¤þéŸþé?øÁ¹çŽ?~òäÉ Ú¹ljjbY¨s.N+yÞ²wdà.å<~ÞŠvDÌ~aùáø'%W#/º„x ‡§ècfÊ>Ɇ¥Nr¶‹u 2ePðÞ5}• 8]ì^³Æ‚»³nÝ:|">EÁs,^ÚÁCÐ }Hoê##T¿"khTê—o¡{©ªñQDÝE­ ¢—ºJÞÅ"ÄBm +çš:&´¤Ä5…ÃîWÁãêÑA¢\°`Ú´iÿñÿñ™#5”x¨ƒ%¤Rý"µ¾ë™ ¨Š©OƒÔW¿ú½ï}ïÜsÏeïã?¾lY«ÞÕ®MeIHUVöx­~æó>º¶ì#mK>îBû$_ôEïžÏ±¬´b%bP¥{Q‰Î¢&9uÃGe:O²»SÉë{EÅô,DvgÔ*G===Ýݶq\»vm<¾23ÀÔGÇ^ÔÃ޽$è N¤à¨ÍçÛë(ðOÈ»Ú 6½¹Šè€àóî(HÒ±Íd¼h·†hvS“íËo¹å–£Žú,‘ªMC‡Ê„TBjGêsñKH€HõÔ`Ÿ€ÔÞÂð9ÎKvØ)§œrÉ%—\ý”)S–.]>T.‡R>|%öóüµ†EܪXÑF÷hW1ü…È÷¶´+Å4ÜR–EH_Ù-eò¬!O+.ò±„÷"2Ž“¤1‰Ü©—D+!²H,ýxrõêÕЦÊuÂ…]‹¸"Û¯t'* ÌŸ$>ˆÒR>F·nÄÜ'ê™cˆH  #5á>»Š“)Õ‡«°¯ìóŽ[*ó¹¶™;5~üyç÷Ío~ó3BÊ|©½ŒO$¤RŸ'¤ÂúD©Ï~Û=ûpë°kj¿O1¹#!u@ µçäŽu5Ø'ûR{ÿßÔ!êSý/õµ¯qÆcÇŽ8qþüùhIĹëÝ÷Ç—ØçíeMtx¹Ÿ®ˆ`Í´»O‚W¡&Až”Ãâ%reÆØtx*•¼j»û(í.Q©=\L\à(áÝØ}ûß§Ó[)ì[܉ÖDƒƒm§7mÀSgÖßXäO´;u8Ë'Kj³Í'àtq‡[e Мˆ®Ävר€æôp°Š>™Ÿ«àÚåÊÌÞð?[½ÍSÇ4 q ãŠÆ•ª¡¡ÁÜ©)SìœuÖYŸâLWý/µ¶l¤>¿©Þ„TBê³AjHÙ§AêOÿôì³Ï¾é¦›~Øv}%/7h;íÿZ+*>y"3ÙÎp³àÌh·±‹#ß[d µ{AwѳÀÑ Øá]îå(ë& Ç®‹çS uf>‡çµ%ƒ hÙƒ*LÒFŽDsì¹ IP‚qq±r¥}{Bý©Ül=TÙª )rÏ^¦^r NEþÊY¹yÑeBUÁå*ŸÅh-l«Ì& 5çʬҢa• Uœ–ææeØcÝzë­—^zégƒÔÛµÕÁR ©~‘ZSƒõOÌÚµÕÁR ©AFê@³OƒÔ1Ç\rÉ%¿üå/çÍkllÔ~Ý÷õ¹¨4oÎŒ€V»§h >>Ò7Vri{}‡²ÈË]‹8ž*yÙ^Fø^B†õÍÒ—ƒƒ#ÄÒ·EO„O‘Á+ô:Ü"¥|WgVÈ¢‹vŸxöëúõë]˜Âþ€"}«Ww¸²º½žá‘-ªö(Èu¹\ßBžì\>r®íÙA®º««ÕgÖµ{1cÞÛ0{Ã}:>·-WeÒâsŽå@Ѫ(iz>2Þ¿té”)S®¼òʳÎú‡šeÒR·„TBª_¤V×` ©jKH%¤Ruµš‘úú׿>b„ñôøãsî(ï˹¦6óda#µ«Û8í&IK"Xχ0¾‹»Í›5"ö\\[ÚĦ²Ý“ªrlbñÒ¶a÷]‘Ìž]C3G±hÚ¯øJvíÚµÙ‡µñ¬Â±"~®”¯+Ž­À1ЇVd¯Vo©#û⻘ŒûÇ»¢60.\öbE¡óu¢õ´tà|bqG´$F9`¥­³”‘pˆñ¿¡™ÞÔdçìæ›o¾âгÎ:ëïþîï>R«j°„Tµ%¤R ©ºZÍH}ôÑ×]÷È#,Y²„ÆxN[‘Æø–ÛF4*6%UåÑ¼Í B,F65‘%nEâ8úÌ ”i‚eÝ]ô³ÆCd…Ùzôc室„ˆ‚#é^vv®ñ–CñÂëµañ÷u²è©aÒŸâ­¬{qjµw8¸¢“¯rvGµN¤ŠùCñÕTî]Žd•;}DHÙg’)Tª7„ CuŠx`› iVÓ’‹.‘9¦œÏÆ‹ /U'¡¤´xñâéÓ§_{íˆ#Ž;ÔàZB*!Õ/R+k°„Tµ%¤Rû;RClÄTmHvØaçwÞ„ .ä´Jâ€àRCCƒU-_ÎçÊæ=k[ðN;=Ž>fÑGÔâ‰)_ë¹Ð¶=ò¸*è##Šc G +¸‡§Ó…! 5b]Ûɶ¥ŽãC¡ýˆž!Á’ïéé8¹e™wµJVáñ'y‰¸ÀaÂ×ête¥øJöàºuë‚R¾> )N‚…ížPÇHéíÈ ‡SY‘QR~·)ž’ËZ©£,¹´G‹¥«€Jv¬:MóçÏŸ2eܸq§žzê·¿ýí!†TïÏ„TBjè#Õ]ƒí;µÙ¡ÀTB*!Õ/R+j°„TµÕ‚ÔßþíðáÃñ‹_Ljü„ fSS577{qZ¾è— ërf=´›cMDEZGÖ“PðÑk ôzÿ¡Ü­ð3l½’äl£Y/š8X¤¬w¦•±.Ë¡]‚uÝé´­ ìh´¾}‘¯& ¼*kÍ0ì¯eü­¶_×®ÕKiÚàV>WÆ¥ƒÙݽ~ýúŠˆY¤~RynPË·îÆCóVÇâú]>P޾”Øp*£Ï£äÊå—RYòä8·Q¨cÉŒTp¸Svæü†n0wêßþíß>Q(=!5pKH%¤†RC…¨OFê‹_üâ¹çÚŽá¾ûîklTj7*_\6¸%f‰EJ—3{@ÕÙÉd¿¢Óïíw¥ÈÇb+²%®_A´Ãµ…bwT±³uËbf}+Ïšõ¹gO²[•Õé–Æ ٯзʕˆ®fƒÈK d Ç[á}Š*bçEüiû¼Nþ ’½¨PâAÞhèÈK`»Ý Ë.¥©X%ŒGݾJôµñãòÃEF›iŒ²¦¼¯5LƒèåZuí†TSÓ<`gò'?ùÉ)§tÐAC©ÏÛÄ„ÔTW 6t–û¾°„TB*!UWûD¤Ž8âˆQ£î¼óΙ3g66GD•Z}žl7ôæBà'FžÓ–ís¬˜‚‹#•=¹©°è”3™"%SA G¨“Â>’•Æ”ýZ(t!h‘=žÇ‡²;8:z]TßUªíVV"ZÏDúx—ý0ÔÖ¬QY9ÉÛžžP6{ÞîƒÒÚÌãZåTI)ÏÊž‡J}ëNo¤ôÁeoBìÄ1¢ô="~â%Š£„?ï㚟ëL;©Ý‚Ï7.¸ÜhεÑã´ºjVóæÍ›gΜà)r‡ÚèqZ¹o+‚,°v*„¤H4æ=¸'ÄX±á©‚œh÷)¡‘Ÿí¬Dô´ÞIŽRÔ呺(õ±­VÄÚº½òÜ6~p+(Tò-ÞZ·öë¦M›|¸– ÒWh;Hæ¸u€&Á@{݆ (1²×Óbjöƒ v&¸¶›l,ùWtûœÂ~+á¤Ú\ “ JјVxŒ/GRW9ô/ÉDZSÚY;•I 1y^AÁ˜8ÏÆÓA¾÷qÛÅÿô§Ç|mHµ×`2R8IH%¤†Rû#Q œ|*_*!•úì‘Úï«'þ`rI¿HqÆ?ÿùÏ~xñâÅœåkC ³èF†Wue1?‡‰Ý|Ñ»£dM€¸Q]MðO>+“Wj-“ƒµv±Hå­ {ɺB@b÷‰¹©5D² l½?{ ã\„L¼ZíQãOâp­áORä.ß G „¤eADP5<+^J°Pž]ŧRŠØe5ì ¢å‚xMü«K{Œí-ø8ßö¬s³s=pa¡ _ÔUêJF&T+›æß{ï½W]õo|£6¤Új°ýy¹ï û˜a@ ©„”ÂÙcNBê“-ý/•JÿKÕÕjGêCN;í´[o½uÞ¼eË–Q/¦säBŒ­Y[G‘ÑêêX%VJÞgóâ>Å㥊udùÌ?¬[#®Lh. Ë¡.W#3ÚÎûéœP¸H"‚EB绽lo}–ÅUm TtR¦G¼WÁ긿nÝÆ©T°ÈzÄí¡Ghâ{Á‘‚ìA%¡~}¤¿nML‹‹žêäleïïÐã_­ÄC9âw¶ù¬Þ’ÂÚ*©`ü[;]á[Q©Ó²¤FÕ„ vfkCª\ƒ "RUºû!¸}Æ"R ©ý©ý܆õþ¨zìãê—¾ô¥³Ï¾âŠ+îºë®Ù³›ššØâ|l˜ò·¤|c||ì óÞUçüÈ“ndSô¡gE¯Uj÷©ŸmüJ‘á;…õÈ‹¶»þä ¾±Ê—újzâieGm¹¥"Ö9ëŸÛ*8b]‹¯Unìå6lØ@)‘Ât›7ÛGÙC„óìW¶rlè"xàj#ÈÞ1¨Õö3"ñW™½¤¶«)Û½gž`›O{ÓŽ—gÚ}šIÞõ¬õT€Çå)ï<8¦v æ<±[ô^Т XÙƒušlÿÐCcÆŒùîw¿[R¥ìÀEê }üï™JH%¤êj ©„TBª®ö±Hzè¡#GN˜0aÖ¬Y‹Kú26ñQÎ-î•-7NoŸ+ð:vù%ŠÓI[Ʋ mÙîv;c¨™‡ïr¯£+5€Ñ’MÐN ‹™Åªü-‹ŸFÏoÜÈŠï¡ÉÇU#¾iÓ¦ˆø­_/:ADÐÆÆî—"|8Döm²üñ*|/¥z3ol-YeÊÒWدO¡Gÿüuî³­äó¡+Pj';ÌÒäšÄ¦#B¢˜PÂÚ2/TQU\X¿2è\»8ìJùº…dGÍâ h544̘qçwŽ5ê„>©b –ª¶„TB*!UWKH%¤RuµEê[ßúÖE=ðÀvlüMSîNÉ'‹Ù­·Œ#Ë{Kèè%­­.w^ö½ËQÅŒ/AsÅBˇ°©Op‹z­t5w°¨å±Äiäy=Îû¢ƒc¥k¥ÃIo„›õoOmܸž¾M›owGjmßZ>Rˆ‘÷µ_™¿ÃGË·"ÈßéZúÜ0{)ˆèZŒ„u{Ö¢¯×–žâ¡Q`áSÙÅÍ*zî¢ìBmerUrøË.—®ªÌœ[h¦ÛCsçN™2åšk®9ýôODªPƒ%¤ª-!•ê©| –ª¶¾‘:ñÄGŒqíµ3gÎd‘w)!å-ðŘzÞÒ¢s EíÔ¹îe>6v UòôdD­J½âbQ+ŒP­‡ œ!cTU DPO»62§XcW¨¼k{»6‚7nÙ²…­V$kãv+œ]™rŽÖEÃü† ¶;„"Õ,E¶ÎØË­#°°ûÓ_¥ÑQ eWÇܰôÊöU”©³·Õ=®8:¦!eT®—Bë™Fm’ö‚ðÂæZ—'Ž55J%¶êíí9WLŠ–Æ\cã´iÓ®½öÚ3ÎHHÕÝR ©„T]-!•JHÕÕúBêë_?çœsÆ7iÒüùóÉÆŽ<ï>”júB`8òxTøF%¯’¼Ï“e ´ÇlxëÑJø ÑÎÖé£×äH‘GUdÀ”­ô ß×0W0uMNoŠü,nÖ O+ÂqöÒÍY‚×~5¹Ýºu+·Dð„І öä:7þ¤qbïÃaâ+ ûtâŠøLvKÂØ^ ¸ö êòú|¾µ"~¤zKÙaÐ-u38”ª\W¡Ö/NCÞ#}mŒvóqò½øP1R9ç~çÍ›w÷Ýw_qÅw¾óþ‘ÊÕ` ©jKH%¤Ruµ„TB*!UWë ©#¼ä’Kn¸á†éÓ%0k8¡qC ;…˜€Ã½x)>’Nw§ôŠá;årRkð¡µmáx_w8P×ceèRâ²@|§ ä…ï'Ñäa‹>Xç@  ¸èÛ´ /guPØÓ_=ßU9¸~}ÕG𧌠 퉕®CV<_H…~4‡G—ç†Ç×åjœü[•ÈFY#ŸÉu,†fr\ž–óU—3J){]Y©ÎHggÑ Þ!š÷ }kSÓ²e˦OŸ~ÝugœqÆ×¿þõ~j­ÁRÕ–JHõ‹TK –ª¶„TB*!UWë©QÈ ÏkHµúÐ×V¯¡ˆNâê9jùHë ª'rÞh@8¸ÍËþB§@ ¸. ŽŲêpóÕ^J·Rnë¾B>"JVûäš*m‰õëUêÀú76n´çñräøÀ‰ùFø8B xxÉÚ¨zȸQ§qr{n˜|(þd‡Ô¹•ãD¯0Ÿ¿>* £² DÔÐÖ”•héâALWe#µ$r·¢ï#Mò’‚ ¡‡[ò‹Ü…G[ˆn_ üt1¤'ÇÜ©_þrĈ}ÍîMH ÜR ©~‘Z^ƒ%¤ª­/¤†;vìĉ.Ô9=Ìú—'m#\¡;g†"Rh£“ÚmËfíJJ’i’œŠïùÎ¥ õrû•EFŹ2¥ÄØ¢ò|e•».¥¶R7Ú­-õÀK:[-¶l=Äôìyv{±›Sª–Šs²ºñÒØÊ"ÈØÓC8°‡7­Évë¼=Þo‘U }X1G+ï:º¢ÅmT¬GëaXU&xèŠ[Λ«E‹M›6f̘ãŽ;.!UGKH%¤Ruµ„TBª_¤šk°„TµýRGuÔe—ÝvÛm3gÎd&oä 'âEäË»8‚öóУÓÉ>~E&^DÿÀ‹ÕԹіyüè¤Ô%¹ÈKÊë„HŽâfQð·:kœP“‡Ú'|Åö\µõ›ele†T’^^¶nݺy³¡B¶WH@ýÊû7oVøoÛ¶mO<Á'žxOM>–¿i ’@Î:B6…{¾È‡¯†Uy€xTªùãhDì?µÝ4uì8Ê/•Ôå+ið±89´&8WѲ§‘Çs\ —,Y2oÞ]wÝuÎ9ç$¤êh ©„T¿H5Õ` ©jKH%¤Ruµ?Bêþ᮸âÞ{ï7oI[6áJñ65Eû¨PóA½EøŠý¼ÎN™ÉvWù&÷ØÙ]ºPo÷ª¶nR,¿Õ.,®”.´ÙKˆu¯ñÖ\ÂѨ?¬ò$îšmÝãóˆ.ÐÀw²Å® ~5*¶nÝȯ›7_xZÑÔW·m“E¾­á;áXñmD3­'ëèý%¾~}DÔ×z71¾žÞ¥œ6ïçÂÑåã%:BmÅföú{hÍ<¥¢Ë¤—œ&Ï©í#»[ð©Ê¼¸ÅýâÖHÒ766.]:yòäŸýìgßúVBªnöGS;R:R{NîXVƒ%¤ªíþ—úÎw¾3nÜôéÓm[‘>ÊZßµpºx°^»Ï•-…zè"ÀW‘D/Åè18="|nQN¦“E¦@u<ú•è5FkôtTl_m>X·é1ºdq‹^z¦–Žh›‹z5t¿i\ЈÃJg^K7ôÆ qQˆDk=#ÏClðuÖyíò³¬Ð'2Ôä£d¶m›Ö?•}ö«(Ú¼yÛ¶mpf·7Š›'ŸT ˜@û5 ·o…F°­è™mpƒÎÞoí¾Öjþ_´ÇuË"Å«¿ŒÃÕx†k¼ÇR)×Üm'!^B€ ?54( ™}™Ì8M¤×õ<§wJ©_ÎQUäMô:¿œQª6íLß}÷ÝW_ý±H-­ÁRÕ–JH%¤êjÕHýÅ_œ}öÙcÇŽ}øá&:©%û5³»+Tzå9+öRßʵÇPJÏHªÑåÛ+ãÇ”žD]¡ u«je×^ŽE _›2Ùòu>iC¥?ñ:×¹¸+‘ªŽ*“åãXŠº¡ç²†H’Äà‡Çuµ¬ú°­µÕš6mÚM7%¤êf ©„T¿H-©ÁRÕ–JH%¤êj{FüN>ùä;î¸ã±Çì?ó¼gi5´sU-®Ã£B>nÉ-ª pôBR1á· ¡‰vjûŠ®”„;µÊÇȬõ9jk½\;’ª«Q6Zí#×ÂbQF,¤ì`ˆülŸoÌÜùX,v{QÀK¢¶ÏÙ²ÅPÛ–™|*ŒðÞ&¨¢Ý^‚oEjX>/ ÜÌŸÀ}ÛäG_eu61¸Ç[5ɲSðAJR¾Š2$§Wv‚Qnˆ(•²#hÇŒù9:Üž.óÔÄz QÉN¬Où(G+±ÖY³fÝqÇ\Ð7R‹k°„Tµ%¤R ©ºZB*!•ª«U#uè¡W\qƒ…Js³Î 'Š.‚SÔæâÛá5áhIkB§Ÿ—âC•]+l¹¬r‡Áî‘¿í¦¢Ï“ž‘êUûTõøÄ™W—´ý c\$ßèDäÛ46l"Yæö ¡CÜîíØ¡àxU†ÈöíO=õ>“^úä“Jãp…ãµ1 µË‹àºwŠlʼn‹V54ò•"¸Nå¡þøX$¬…ZH¬ÑPɸÞèÕìD3þ¥z¹6ÑZ¨Üzŧ*{–®r~›‰¬“ŽšÀ"c¢qþüù<0zô辑ZTƒ%¤ª-!•JHÕÕª‘:òÈ«¯¾zêÔ©Ë–µº”ŽÂ{ì¨ERY ¡$PÒn^„Û qRº¼¤˜‰"…¤fðò )_ Ò¥mŸVË«'Âb„ñ¢ÖÄØHiQVú µ¨ÙuE¤o{f”‘ÑÝÊ®o ¿=pÂ^Ïî T#<ÏïØ±#ƒl{ eðä“B ©L_Ê&4롨w÷Ù¾ëB¸“oMbXÛB"F a§æõ€nsÓ\ö‚pIq¤§V°ƒæ2©_x+VÏ»–UUÇ(t5{â×n®‡3fLBª>–JHõ‹ÔÂ,!Um ©„T¿HeÖ/NÕmõɾ°'RÇß|óÍsæÌ!¯Ë9°£mžÅ9ˆÞ¶œÏꕱs}”N½ö9º™½[voJ¤s¬…™ºP Ù#àÁÿÀï z$G…PTǑϥB\…väi ­w­åu)3çe¶s§"îÛ²c‡^½sg gf¿ÒªH¶×ÞdÏïØñ„»] 㓇µu«Ü±JÙŸÐÁ±òZEµ$Jƒ‘—®óÉáS1î£35íØqáQÁg§R·‘úL;|àCEäO~,­œ¸Þ†\ßèÚž3ç¶Ûn;úè£û@jA –ª¶„TB*!UWKH%¤Ruµ^¤Ž8âˆ#&NœØÐÐ@J·Åg|AW$œEk ¢/……Œ#ûyƒR¼´×ѶÊp¤ºñ#bÐnHGë]]œÂ¾Õ™ÚDy¦ß «jüЖØPѳ è¡MãIÂàOfn|+{hìÈLOQ«Bv‡ß¶ø§îڵˊr@8#ï6F IDATÎnE|^‰WÕ¥HbY‰h ýð…ÿ:|®èQSÆëhöX /8R‘ÚeÎqÞµÑõh•²J¾ÐÿP°œ6Pn[]ED§“8º¼cв·46Þÿý—^zé~ðGHͯÁRÕ–JH%¤êj½HsÎ9ãÇßwß} .tEÍøâìä*‚Íl”KÌåT*H±Éд‰ØgøÈ þݵ5¯Ñn¶Ñu,A‰šrÛªê(ZÉÉ—nò,®ÂlQÎÖjë]RV®-×öíâƒ= ½¨.zâ©§vîÜɳìæÌìù ÌÞ²m›n1ºæŸ~úi^¬6z"„lI÷·lQâ9ò] ]l¯¸Áç7esB¤MÍ.Ÿ¶·qŸÙuº6EÑ9—¥J8¯ÄåÊÎÈòåx$ús>U¥…JT¤‡˜"èÛ4iÒøñã/¼0!µ×–JHõ‹Ô¼,!Um ©„T¿HÍ­ÁRÕ&¤>øà /¼ð¦›~øarË–- ”8à%ÚÛ"”ÄæœMxìç§¹àŠ ’“Ìe¢ŽB+ÄøTøR!|. ü‰¨DdéZ/ïS¢v÷¦t#Řx5´*l‡™OLOºÙ}£n â(m‹ïæÍƽdÛ6CÏ^·k—=¸+ûA½ˆ"eƒÛ¡zñ‹bõ˜GQTÚ¸xH(v{, ÛÁÐmÕEÚúøT‹µ¬0ç7D-·n÷Ä^û, ¨^ÒùGªUåãèØÍic¶m›Á@ [¿Œ'8²§@Éì…´ñ ´2x´÷3^l/¸k—qZ !¤R]¢Kèm*âGö—äVÐT¿¡o`7Q?¿ÁÇ¡rYYKP@÷¡*²ØJ,1t®Û}Iy#AÈS1+_R "›ô’yÕ¬Ÿ0Ÿ§ ÉÎð²eöcΜ9&Œ1bO¤­ÁRÕ–JH%¤êj ©„T¿HͪÁRÕ6ì”SN¹ôÒ«¯¾ú–[n™7OuÉ­­ò©8±çô,C53BG•M|)fò†BG‡qAm_´Ï©õg€Å´ jð¥6øà]{ ðP›­[›-.|JáTa¾Õç¬Q~.߉šðªˆŸsõ4IZ ù"¦÷žï5D쎹Iü=ã Ùý_´ûd…EåçvçN{Zå®ápmC`“Jv9wx€ Dý¡œCÒØ[²ñqü¶‘ ÅQ/…ϵžn”û!5O ûÊ•B)›éÑM¡—»Wj Å™%&«ÓV2uôb« ‰(V‘?Nû¼yóî½÷â‹/>øàƒR{a ©„TBª®–JHõ‹ÔÌ,!UmÃÎ<óÌ+¯¼îºë&Nœ¸h‘|)2šb¬um%+X Í*]Š…ÌÒÑQàÝ e+s…hëÊ ŸH|4@àzÄr[ç*â⇬îÖõÂ+!’në×u1·ò8Írlè7TœTîÓO¿øâ‹Æ<É‚+ŠZ?3îÃÑ‹<ŽOe·öQ¼ÃžÊ¼°§xˆ‚ÀgiM¤ÜOù^¨2QËT"ÚãýF‘|&)Zï3|7ú8_"ë=Œ–I‹âêÌ”ò-—™áÛÉåpKØÓPt¥R²½:Ö8½xá.ž¸N¶xyŸhã ºpá‰ö³Ÿýë¿þkBj/,!•JHÕÕ†ýÛ¿ýÛÕWß~ûí?üð¢EÊýE™ ŠÀIî-ó-l&tnØ^PÝ[…›ŽfÉ^Ç;éBììŒIë+R˜¬¤5Þ]ñ=>Ác%‹ŽØY”ô¨[ü„OU¥8²E•”®-úYý¹ b+gOíÞ½n¸µÇ_tcïg?ì×gžyùå—íÕ/½ô¼ÛsNŸŠà®]„ýž âŠ1 N?ÿ±…m*ÿÀ ”‹Ió”⃖¡ÃE—•h¬§6IéoÂz!HMeŸ-ª*.XŠÁéc²À’Kn«2=:H9©ÚÊszí׸馛.ºè¢*¤fÔ` ©jKH%¤úEê‘,!Um ©„TBª®6ÌvÎW]uÇwÌš5«±±‰b/âAô – )fE1|'οF t>&ǣã3íZè] “ïì\ÃÌôˆèá0á>) †Ex]ÈMdѱu7h¼µ|dw[ËqÈTVNà-R·r«ÛÁÅ tR/¿üœ»O/½ô”½‚½ü²= ]/@ÙîÝ¢2ƒ- ò¡8mªhþù'‰'"[! &"xz[+¾T¤vù·Js‚ŠG®¡¤ÁuŒó(gIrÅTA©5«ð“2š\ѤEáU½!™.ZËÈò"@aÓ™3ï¼óÎË.»ìË ©[B*!Õ/RÓk°„Tµ%¤R ©ºÚ°C=ô í@.Z´*Ž9å9êùldJ‘:2"è²ÅÝRè6´Éê}÷>Tˆ!¨ÉÃuÀ×DËa …C…7±ÎãçR”$hN°} å ¦”.çø0¡5±Ã5Í•â%‚n†Ãas¹E/½dˆ˜»ôÊ+peRq»;û‰£eè 5¸ãÍDÔŸõþÄg™æ5‰“´*øŠ¡††Ç‡jçú,ø¿)®}Ä›ýë*×”†äTe}¹ÅPf”¨ˆÃJq% Šð­ªP¢×Fû’ÃE“+bŽ|6šNÓæ xà«®ºêÄ„ÔÀ-!•ꩇk°„Tµ ;äC~ò“É“'744TŠFuÜêWŸ×&E`BFÚðQ]ÕÈ&D-‡œxÛ·PÀD¼"}¬´-™N¤ÂzÑJIÈ ‰6Â}ÈÙÊ$嫘BD¡Kù4ÙW*ωôEEyT±{3{Ñ÷rðcèØ.Ïzå•×_-ß«¯¾jOTX„U³”qölV›¾‹¬q½‹b{ ¤A x¾*{>møHÊBãI””"æ‚"ä nBŠty´u¶W&Ì#ä\r‘RÂxU'$"9WÏ,ø«8Ë‘FhÍÚå ±cÇþ0!5pKH%¤úEê¡,!Um ©„TBª®6ìÿý¿ÿ7~üý÷ß¿dÉ’ÐN¤ÀlnDü”&²ÇCÅŠæ2B¯ì³ÛØâ\±1fó–]:A’ßTíQݦBmª³£_KR £«Õ0bf àeÝ>•ÍÞØŽ%å|º¿c‡ ÷XçFÕK™ÙúæãÁx!²÷2R¯ff·¯½öÚî݆>Ö+îfWzßóÏÛGE 8¼©.jxGÖ×ø Ådú'\7I‰¤~cÿPd5ÖÔåÁn½%ú1„>«˜ÌP¢—“c*ªàˆÚ¾b&RvT“ç ÐE=ÌPFŠž³ÆÆéÓ§ßpà ÿž¸1¦!!•ª µçäŽi5XBªÚÒÿR ©~ÿ—JH}ZvüñÇßtÓ#<›b Tñ`ºzÝZZtŽB =$¬xÓ¨Mz!«é“õÆlÏFµ™C…? ¤¢/æ«… „ëc®«ô@¬¦=oëÛÂ+™Õm!(A‡4E‡!òºÏã>½ü²èyñE»Å}²öª×^³×R¯gfÔð"вƒ:À²Ûg26\'"¥x=Y`¥ ¢“Ö· é´¸vlÛáQöDn›Qo¤8 ÒÝ0žp ”6çò„”G™~Š+ÉQ©ÈqD¾E—-D¥I0~5/š2?ÛÆÝ|óÍ#R·„TBª_¤¦Ö` ©jË’n¼qöìÙK—.mn.ù|qíê|×׫ÁXánøh»&¤ÁAUIçó„ûÊôÌo²5`+cÅ ª¬7Ñ™Gðoƒ+DF!’­´ǡ潈!ƒDÙ·ª{(ÿŽòó]YQx”‹+ÂGÿ »ûìLiÇXÊxCyTÙ”ëÀUÐö:ÛÚãhqZ´YçÌ©ZšhS!»§ÇW¬ÐrX½ZÞy\ÚàINç Ä%¼ ¨’àøæÍ;èëÛ²å)_¯ RZ‡Ž¥ øˆ¹‘—U^×kÌwÿç*¯‹O$¤ÞzËø2jà_Šß äx· ®^%HjX•ì^žþb EÅŠI¡¨´!övËUÑ y„èdâ7®÷Ñ%Ò …/Êü¤´'©—®Z%yQ®Uî©vÒZ_­­º|µ´à¼J!‰ˆŸ”‘ è´1‚fhjCn"æµ¾UX)d+õdÒ `¿oOeŠÞY÷aw·bø øH1ªVÞña^„jü"ìLÈù6ú Ñ$W×!ý€D°­ÜÉú&këèE‚毽F2w·ýúÖ[o¾ùæë@Æ¡óff@d·æNqÿõ̳zº(üƒ¢W=žW¯TjÿX©²h-Q¿y^® [}HåŠ[ oͦ¹Å?¼ÇµÐ#®Auý‚üùÝäEAJ.-:óÄÑK~æŠîåJÿƒ;¥lT2cêБOE°½9«ðÓ™]¾|áÂ…÷ÜsÏe ©[B*!Õ/RSj°„Tµ%¤Rý"u –ª¶acÇŽ2eÉ’%PuéÒ›n“V:œ hlÕ‹qúàŒ2?ýJ+B4ö2ÛE>RÔøqŸ˜±îT§úMU¬;'T-·9“cæÌ“ôÓÊaÙ¾©™ƒê؈H9Ho¿ý6¾“ÙoüêW¿z÷Ýwß|ÓÐ2”ÞÊìÍìÞ›AÕë¯ÇoR¼üe*Ì „B2ëRĸß hß–¨z’¡Â\;”%ÈþÕk£¨1TjDß’éñVu÷Mø±YM„üT‚塙Ǟ¿BÅ(éSe Õ|*œÀ×ÂâôÚ=󥌑1 ©[B*!•ª« »ì²Ëî½wÁ‚ÌòR„/6v^fž¯ô!j§·­­joóqóEöÚÞ£#NmrÙ„Ù.t.UÓS)Ð 'Öú—ÚnÙ¢2t½‹­‚èFû*fñ*âO4 *¬GX´b÷¦‚=èyƒ£êwàè­wÞ±;öø[oÙ­½åW™ÙS¯½¦ áoGµ‡„«Ð²ˆÊÂgPNgë÷lÖ£¨oÉ¿ƒÈŸføzE㆘á‹þ%ÿÊ5~YáhHQ]¹ðJÄO©Ý¬º¯ÈžO›mN‹íí2zm¾•âõ¨lkdèó¡<‘´×OPQJ2¤zè¡ñ¤î«ÁRÕ–JH%¤êj ©„TBª®6l̘1<ÐØØÈÐVU|ùD…ÿ Œ£½œøbbò¡Æ«´©oÏ0‹>÷FîÃey\©^\–‡´&p@LéÌ,¦_#͹‘‡ìÞÎRy12¨á°˜µ¨éD<Œ6WwïŠÞ<.hOo»½óÎ;æS½óÎ{ï½÷Nöóƒ>5î¼G8_L5€|¾”"¡jšÄŸaBð³ÏJmË–í |-ÒÙ›<Ý-1"|乬lBU-^ÊáÒô64'ð™:˜Œ’ô¤€ .‰éĹ(êqà‰v]fõ2À×Þ`+aÊ”)UHM®ÁRÕ–JH%¤êj ©„T¿HMªÁRÕ6lܸq÷ßo;h¬Úaƒ¡Õ‚«WÉÇ"Ë©Ð9ŠÁ¼{˜N7Ò²¸Q´£vuwÛ¹_“UòÉ?Ø´É–.‚\O® ;|ɇbÅ!íÛ=ËK¾×~ÕëÚ’FàõXèѬ…||&P²_?øÀxzÿý÷?øÀ~üú׿Îàz‡gq°Þ!ù‹{W¯ÑBÖX>èw—ýU¾²½è QG|l«7öªE… ‡ýÃК ¤®fo}‘X¼è‹\÷š5¨·µgaôbÔú!?¡oä2žóTÎÏX.ú8HùrY`δ´(š3›:uê5 ©[B*!•ª« ?~üc54445iŒüð¨b÷gýêWÚfÉà ©¨^"…Ì^Pš¯¼Sáž}ZrIÏ0Ý Ñ$óå–¹÷ÒHIÄýV¯^MU‘?ã†[¡fÇŠÊ-ž· aèyíÕaç>Y^upeŒL<¤Ð§ØNÍyÉ›Ls~ž…Oq¦—.]:sæÌq¤&Ö` ©jKH%¤Ruµ„TB*!UWvÛm·ÍŸ¯m´ËÄQÎQ~NºND(jGz¡  7^YÖÎÏ@ ‡ª#¢S]]ŠðmvËʆP€Üè#j €m`6̆ ½³dÈŒRÐm+q1)QNù·ýA|))ˆEM¥{ùÞˆï{™á; ¡?]¿þõG}d?‰ø–^÷Þ{äßâ#øHe_{M›Dþ4ñ—oAiü³PåÅò»¢Ñ© Þ]¹±r«Ô¯+ïåZ#ª<ѽ‘ܸ¹¤Ñ}ÈL<΄fôV*щڶDXÏUÐ5«W¾T”û1Z¹Íd6¤ˆùÚ­!uy©{k°„Tµ%¤Rý"õË,!Um ©„TBª®6ìž{î™7/çêSêà466ºF©´% J›s*Ììt¢Að( -ˆÌ57ŠÍ=aô+VP¶ËCM==¶Lð¥¤I’à1˜ú¤ÛJG³tvìÄ‘"Å«˜5‘sú_ñ¹6$eé4ì žË‡‚<(CæÃ?üè#û[%ޏZºïÅûõQ¸eæF!ký™ÃÀDCˆy9|áPj—ê,Š’C—ŠÄ6*j³Ñ“©l‡IYa¦#R:©?rëm>i’ËYÉG,똣@FóhHƒè É=¥výŠ©6^bÏ;÷®„ÔÀ-!•ê©{j°„Tµ1ùäqŠ‘›Ù°3Ðö±ñ¹Š´Ž¶”:Ó‰’™ªg¶ÍÈÊ•1A¾ÓåЋȡww÷x—¡"{•‚#5ãÁxhK,ºÇÎ@\¦áR~þÔ3Ï(µKºíý( G ‘Ë×)·[ÊÊáßûF>öxðd@ýæ7¿ùè#~ûð·¿ýí‡ ±>2žHë}ï½§š¦J#ýnx·Ïö}µÌøVè6 %‚•H:i’»¹ÍC~b^‰¡¥ÍqDC‘ ]½zuv”W¢…nÜt¸2l²•Œ§Qä¤w÷"©O WÉ8Ólý÷†“ú´–ùR'¤R¤.\8%!5pKH%¤Ruµ¬†köl‰ôè8È”\Ô —ÕŸ]k"tvzCI”ýq†µÏ§õ]L¹¡£àeè=6Øó=Ùzb<ŽÄ“¸/· GŠeg‹ísÿàȘL’|WøPx5áKÉá¡“7꽈àaPó¡»MÔï~÷;C*"¿ù ð}€7õ«,ñt†¬…Ê«¦ºñC‘]ºMO?ÍÕ`{È%ႈý+qÕ_èú˜½—Ž‚ÂïäèH6Jz¤xãØË¥õ‹d¥ÓP«BÖT¾QbN8RœìeË–Re¾aw×`ý#Uµ< ,!•ê© 5XÈÀÓÅTB*!5¸HUý<0,è]°e‚rhN°Óf‡Í8×Ö(è#hÎS%N‘u¢¶vnUþGÝYLêkÏšäVâ^1 ÇÌÇÚhdmÕJ1î÷ÿ£Ì/æÚíŽJš’<%‰ª úÓO¿è•Æe~¨—¿L'F¨K€Ô»ï¾«r>PÂ~‹}ð¡E¿qûÈ=+ÝË z`z•fEÄçÕçQ¹£1¾ÑäA 5y`›3Y‰Í®-¡®Äp2C“‚vŸ!8¢‹ò?äEùÑþ*“q€)zo¤ñÖÖÖâU™ò±"b^1tÁUsøR´"Λ7ïþ„ÔÀ-!•ê©»j°OÚøXÎT¦y½x±UŽÏCã}»Ü(ö"Ë[t9Rª”Øãi#ØÔ$ÄàŠ+e!JÌ¢XÓm55ÙéµßƒõCê {¤¹KH%¤úE*¬O”Âö\Rê?7~ ©„THÝYƒõ̰=nˤçÏou7J›oÊÒ‰#á(• =Ò'wˆ[U  ÷Iiǘë{W¬^-$ü*Í7»VÐ&ŸÐ!‹µ³5ÓbÜ™ªàTãGŠLt1Ÿ"â‡õµvÏ=·Ûƒ~¯úÈ5!…RQ¸÷^äs?úÈø±ûhM@Ÿ4Òß_?èÛR«"éö<µ~|zUÄOâÐeâ;!<± ¹$z%%è‰#E™Ÿ=ØÕÌÂz!‰)Ç©»;4(6dOö©=ÅꦦÏ÷ŠÇéø±yÕÆéQ@74ÓIñ½©T‘>¼ä¼Oò˜;wîä„ÔÀ-!•ê©;j°„Tµ%¤Rƒ‰”`: âYªwñâWÅ”¾|rUŽOð\=oœ;ÎPC"3d5ü†Óñt¦µ©gµÁD2:9ÖáH!·µjÕ*VÖúZ†J™Ü˜Ljã(Ž1ôæYw£D1l) »z4uì<ÿÈͨúè#óìU/¾¸ÅEØíÛØ§½ù¦º³W|„¯%ŸëÃí£ð¥¤‘Oÿ™ Vy!ú/D/$Ã#ˆŽD¦Q´i“jý0üG5qpm1Ôº»ñšz—¯÷@êÁäèØaìê*ûx<;XøR!UO&ž¯r"™JzqöP>mA"“r?=qvæ·-X° ŽH}á@ ø%¤Rý#u{ v`!óI–äZ¶,ÑŠ(ÁÄÆFª’J‘Çõ2õ¢÷Z·PÄãÅÈ0’vD«YÍÛ+VP•Ô+5ê» IDAT¤RxyÞo®“P($±A¤€{û¶m1“}»çK•ò}æ[¼d{µ˜wï¶õ­ŸY5Ò«»w3í­l_÷n¨2GPO¨¼÷ž½Å–ò-·ü‰Û_ÿõ_O™2eËãÄÞ’Åþ2ûÝï´ñËÞ‘”²QŒŸ!¥D3Ygö€T%=Cÿ!‰i®fB‡½+£Ü¢'S…I.3ÚFźýä²dÖ٩ˬ@ËK‘JU@¸£w@›r®q±EWòž-=áÝ¢7›R SR·„TB*!UWKH%¤úEê¶,!UmRøRŸí…NŽ€>¾U#Û¢~,çóÈÛ} y!Óf”&#Â=Eôº9ÝqÕ¶:ÄHé2ž,\{|åJé_"‡„—!¡ ~",ô$?˜¦Ùí8TôûE¬MrEDüè>DÓèmjÈAè#"|8R â½ñ†­ãóÎ;ïOþÀ.½Ô¾•½›¼ð{Y¨P"œ oúäyé0¹ç«Ì±—¾²ªH-Ü)iO ‹‰ ÔFèBêÕ¤ÌqÏJt~¬Ì.Và6jü DÇžsúú• _É­’×]î#˜Ká%ã`¼™Ôš^AêÖ,!Um ©„TBª®–JH%¤êj™æ55~MMMÌi‹Ê¯œ+gR„ÔråœÙSœØœ{R¡;¦´#¡Ûm·øë²´›|ÎVkÆ1äÒåk!Î ú(£OSowî4´"ÕK ¢ŠºôâEQ•—%zñ¥2WèC¢Éó*Ï>;a„?ä {衇 P4ŠÂ÷ )Í·ßþ•›²ÉÌÝêÝ{LoS´ù ¾=¢îú×QÚ>.4QÔ¨ñ,7¹éZZ’˜Ïò»+"ëKò6ÄǨªT× ->vOs]#9ÏCMYe_ÔpÚK—.]úp©[j°„Tµ%¤R ©½°?Îcg•èË–Rˈû‘òmmµ;xíHùV,ʉ’fò¼m¾ÏPÔ‰ÓŠI ¥¢D·lñPxD‰‚~4ȯójÙ4œ)K2„@ÊöOªêyâ ’§;éóCŒ’0ã:^'ÕKã¡mÍhpWw|„ïÞÙ­1·eKŸ<Él‹õÆѨø§J¿(`ÂùÕ˜ÞF9z$ ÉES4ÿܶmáF˜2«h=Œîø86\x6û˜ù5¦xVhõjeÖß_%Ýîĕݮ|„õ´•§@)D“¸xVÑgHÝ—ªÑúh°LH%¤úEêæìÀEª¯n°„TBêFj/¿yŸuöÃ&Ož¼dIΧ+ś͎/2¶5P*zºP(qà§ìiƶ0¢P¤º(Ekk[µj›þÈó* E`‹heé2UŠÍФJt|*iN¸¤øÔÅñNñËT'žÆkQóeèû(C×Äõ ¢‚®Ú¾ßýÎ~5ÚÛûAÊþáo¿ýk—£P hPè£QHŠa󪇇îhAÄÓ³_)J¯ª«×¯üëàŠÈ_UÊ—lïÆl:ïÀSPÐεˆË㯒S_ÉéAßCçgt”&Ï 2zý$:I‹MMA™R¾™?ݼg âM5ØÐEj/käR ©„ÔÙÞ@•JH%¤ú°wŸôT6|$u…­’¤Â‡âœ˜ÖÆ cZåŠ[U"q¼j•=e+¡»[>T6õE-”bÅÛ¶éùJ]›ÇŠ8SÞGÒ4† ¡æðÓÚ^zÉn™Ñ«*;‚è‘êEoì½Áöþû¿u¹ ûÕž-úAÊþo¾‰æNXzWs Æø_š; x êdÑŸî5ê‰ “ŠÉ]oó„Áz7º,Ÿ\·Nƒ{W®ÔÌ^ܪ͞¶cÅ<œîîn£ ¤ˆ£«· 7*ZÅ‹GÔs!µ|„ÚÕÈu4{üZ†ÝXƒ y¤JUßHM:uÉ’¼Kò%¤p¤ZuƧ@H ë“‹ßÛ×[3iÌE‹ò(÷.[VrÍfEö<û—÷î´—BÓ@Qv}T Û"¶%Í8y6bZßT#½eeß§ñ=”‘øÕ6töT>ßR¶~ßzKÎT¢ÿþ÷¿G&É>-›-ÿܨJzÓe’^³/D1:#Û4¹³ ßzW¶ýSÄ\öö¬  Ï?ÿq<}ÿûß·õþæ›Æ“¡³|qÇ$¢ôî»od˜P¼þüó1YþE Bó)T1wîÔ¬^ncæ#ÛøíI‘²Ø›™ô˜ú°×AT/AtÌÐR÷ޝ<>W{–¯L“‡òO=ªjtWn¦³ƒk‹|©5kz=Lx"ä.ýx‚çÈO„À›ÊüpuAD9ŒÊlÞhêÀe*"OQ¨4yð¬N/WÎÅ‹?RAêº,!Um ©„TBª®6ìÞ{ïmh¨Hd†WUÄ"»ßØØH‡ ^§ò˜ìLGq ¾ö줋*Ò—óè’_ JŒ#S‘ SG£›MÎæn²’ÔrH¢IÈ#=Ã` 4œµáËJ’2{é%M’óMÉQ‰Nù¸úC“ùÃ,ákoµõ·M_ùÊWr9!g¥†ß3H£Qþí·ß~ã U#Ñ"O—üK/¿lHù³[ʧv1j„Ý_$®ÙøIÀgÅ«X‹"ô— U%:ºI}À›=oÇ2+=ÊŒñ4Ä+àJÚ½ìFShUÚ=Ÿ…qÖ+¸2*ÝÊßÓQʶÐ4¤JH ÜR ©~‘º¶KHU[B*!Õ/Rãk°„Tµe-ˆH`š-[&_‰„ ›ì8àŸ,ßîÃä)ü+ø¶\=o÷ Gqf+fœÙéÇaŠ|.N„-«˜F ¡<¯ßÙÀJÓ|³Ls+Ã:pE¶3ÁcG¦“„õ<ý~!‰I¢ýÐ’ûmR²áSÉŠ‰üjÈOÊ•»W„XÛ¯—Ažïä¢ç¯,…„Vö+á"·ºÀ½ù9sæLLH ÜR ©„T]-!•ê©kj°„Tµe¢c ê˜ÒoHÔ•£lûj¡B®÷J>ƯÊ!™êÉ–C½YZèðÄÈ6 %•Ë ©…µ.?G›Ö¯ß“#Ÿ¦·ÑaëatájNpå…~/†H%‘mBý=ò³Š£ÿö·jÚÀ¡²‡Þ~;Z #k¯‰9áEñ’ƤÀ ºúH\uâFòHqŒrÄžÛ·úiÑù'‘PB”8&Re˺1Wj\[Ì­ëJ„¼(sr ¹vªÇÕÕ5 oÈŽ5>g$çñsÖŽƒ%‰Lž'SR@X—zÑ¢E ©½°„TB*!UWvÏ=÷ÌŸßâ&•òåh³9PVD~Õ-çªí3J¤]+¸­àCæË.IFÒ~ñSô*Ʊ™ ©b"~jŒÏfwl O+Šà_P¥twºñSã<[.bnfB$«Jz3Û§½%vÅèâájÎZDôPDÒ$yïŽ×Dyö‚DékÌìõבâ4¤B鹓ΦwR1¥Ᾰ0Pb¯ÜwVi/™P0!Õkèp ìW:4ՎɱÈ,ô(â?\áÚ\°Y¨±ûƒ¢¶èˆ+"ˆut!ªV `îܹ“*Hý¢KHU[B*!•ª«%¤Rý"5®KHU[6¹cΜ'@©G*‚|Å, ˜÷‘ñºp§ªzÝÊqf1PãYE׬1®(¨í P*²»BŽH~Òž·™ò¾ÝF˜ï\Â|’x ¹ï•l\în†wöƒ&•‰³ø¡ŠBò÷cR<È:Ììýµçø€±¼Q Èx"}¢G =Li¡¿þ:åè¯Á±ÑlžõñDü4£÷™gì[§¤LqGŒ.Á—‚&]8*b*Jç>¨mäWSÁ@×ÃìàÚ…ô|Ùç"s™kçœå+WbT[öAY“‹#éâ˜ËÙ}zìΜ9sîKH ÜR ©„T]-!•ꩱ5XBªÚ2i̹s%=•Õ|•­†öy>aõÞ_´µi³îŠN˜¯øÁ$±•hcLG/‡j5ôH_âH“‚åEÕÛLm&»E¦ë©§žŠx:ýO»ƒÍÏ»½ìöškAØ 7šHúG×Pœ÷3LÉQ$7p¢;ñ7¿ùýïÏ} û~qöHõfSz³ìñ»ïR¯“X†æ˜Ñ•‡ž¹mÐeÿ ¦¶U ¿!‘°Åe'ì²1 ¥+Û@VAã{£!†„RE#UªÖ« ‚.Òñídâ£éÑÓÜÆ™.‡÷‘Æ_´hQBj/,!•JHÕÕ†M˜0áÑGµS`Ëf4±õkÊíqK›u>^ÔÙ™¯HîPSŠ4"•/m# l´uwkcGÉ5"IQ›dËÅÐóÍ&”“b÷·À”=ùä“›6Eìl—‹$©Q¥$&¹«"‰Lö|šàñúë¿ò IÜw)&׆ŽVD6|B'ÛJII½ô¼ŽÁ¢ö>h¢üü *Ðùhm4wïV˜T¯ZŸ}vZžìöÐöT¼ P¢ž*Lbnóؘ׶…ðêLÏZc:è¡WÑ:©^.Sªú‡·=h‡?{¤ý·±~§-ˆœF•q‘dZ›.™ÐƦߚ7o^UÄïç5XBªÚR ©„T]-!•ê©«k°„Tµe½³fIs"8V:ì¸UdÍQÓÇë"Ò§[êŸUáyI!‰èÔ fMà6Ũ¶˜FÁ-zIUóÐVäÓ5Ö"ÖÃ;Bo’•‹T¦’¬/¾h10W3ÝA YéXf.лßË7UüyQzLsû€in´*âSÁÓ¯ßuÃ'#‹ü†w¾ Àh#AuTÆ?Gº}[¾23çìÛ£!!­‰'žXK6—ÆK®1Ò@÷JÈõ„ÿäq‘&N xmUFÇšvÏH¯‹©ª@§pRMrIå«+#I}{Š¿ÆÆÆÇ{,!µ–JH%¤êjÐ&¤R¤ö†3¦KHU[$}ôÑ&fuÅhŽvLnûlu"Ø‘}X¤z •+Wršñ©Ô}@¯–ƒë^n¢—¡jvo5VÀx c{·o—6:†|ª'ݶo×PœlŽ”½¢éïÙ(°{á!vïÞÍúglMèd¾ýÅ?"Ë‹$”!Hñ~ ôÁö:^/ßzKèþã šH˜‘q»ù)”^x!4'vîÜIªùŒíÑ~É¥•5ÜÄMkÖHmˆ9N§Äã7ºqÅш6”Æ8¬ÒÁ¤ž’+žrQëREB霮p ¸nêLú€Þ\¤KÆœ9sæ= ©[B*!•ª«%¤Rý"5ºKHU[vÈfÏÖƵâ;µ¢X GèŠI\,ƒ®•F^9LlÃuÚ"SϯT uy)‘ôö®.)Œ¡¤Jÿª¥ž[YĆLßÁtüÕ𸨢„‚¶83]‡]ÌÇAâa× /Rh£Ç:—/…ãóVFƒqðo¿­ ¾c|CKV‚²@Bµx`öþ7ÝìÝÐJY_N¼B’CGv"ó¦v‰*ºQ¢3h½—õmôqzgR…hLb: iÍÝâÊÚn ±ÈZDð<ÄüFÏÑçñÿÛ{ó?«Ê+ÿ·ùð&ݹ¹IwúÚ¦5Ääõ“N4Æ5¢í *_Å "Žˆ"b@TA& ((ŠÎPEÅP N±ÍÜm»;éÛ·ûÕ÷Õ¿Þg¿?kÕÞ$•òp6ýHëþÿ1#h÷Œáu´@Çïü]J¯Ck=Í#øPh^ü3Ž”ZÙo裩ïðí¬}R>®\ ð :Þ{ RŠüÑù!uL êË*üöÚ´¶Væ—®E~]{z4Bn8ìî ëy –‹%~­Œh¦ QÇR)]Y—,Y2=ªß©@jP¤¦Õ`TÑ©@*j¨ »ãŽ;,Ø´ie|ÚY{U)^Z j³8RÙKѺʕûRtš¦sŸ|%Ä +íûHTÁ‹Ic{Môû B\4y(-šÖ#÷i…•8ÌÇÑ &xN]môgñ©Ò-ݽò¥èÃý­×UÊ–¼/Ù_ Òþ×ýçþçÿ÷“Ç%¹ëÏKH>Ú¿zûp6’÷]¨ú•kßf}¼¿fF¯ m\>¸4sq&&Ý!ûš äZ6 çà‘#®Bû·‰¦vYãîN€Xµ^š]VÖW=äy½D³ÃF?ow㻾°gN8éÉ—zþùçó!lÃîªÁ©¢RT ÕP6eÊ”çŸß²e õæÞˆÖaµIBˆ³Ã1¯ØŠi!)~„‚N/¹C„zIèa’ŒM Úè*²òó×IkëJk'ýÓx:o¯YÂW·ì›|àmºE€"-e ”ÞÍ4´˜ ¼Ñ(©LÂsÿ’ÉCˆ WÍô òé¶PpZÄ ïýƟϘŽßdoH˜ï]C÷ŸàŠlszHZTLAQºóF6vNèPTÄ&ÆSstв»þK·Œ¯“F(ÂCÈNd¢˜&ŽÄæÙQ*Ò¥-Aº„¤€+¤&z ¢3LUÇt›ö~ÄpÙ &`Ñ¢Es©ú- ¤Ejj H- ¤©†Zöû /¤Iî/ý %wìÐ9 ²Ç¯Ê&7AدÊ}¢IÊëòÓËúÊ6Ç×@ZL˜UFÓ[‘Ê<’õßaqQžîH)8H ˜Å˜’Þ1´_üâgèýâLDû9‘¿w3ÏJëœ<‚¨‹$9Šßþöÿ5K„$þ°žÏÞý³„y]‚…¤ŠCk#µ}êrüíoÓ-â¿vâø–É·qûp ßAf‚HŸûNÔø¹¸˜øñ U~¢Šù8Œé•›w€Â:ÖøPé)\æ ^‚i~p¾¯b»mm‰'åíñ´ºº6oÞü /<HÕoT 5(RwÖ`TÑ©@jP¤¦Ô`TцMž2á®w¢¿…M}Ìð• E¦–þ÷ j›\:£ßuþýß%DËxÝ1i2÷©þÍé2=±ÿ´ÁˆpõpÅ«ÿ dÜ4Þ]‚¿_›úϬëžT†è2º¤zÕÕòöÛ†ãU|(Š þð¡(†<Œ“¹?'”ŽUwvý’ÊN¾To/?z½©ƒÓäj³œ)•f|÷d=®°¢ëøV ¢·µ577ÏŸ?ÿö@ª~ ¤©@ª¡–!õã¿üòË®…Î.Y»šW!IZ‡íAÉf„±Ó@G£ÝºL[Ò=pÅt v~¤M‰íîúܨÓ!Ó9¢’ŒÍy‡§ ôRz¦v8²½ð”ò;Úë(bCïû°{™B™f"zÖW¾açô[ÂÓ>1-â_ýÊÇÐ0„ð¹utb$4~w¬ï¿Òo~#z2A‰Œ*(Ëš ÿ™ñŠéy¼¥²É´&V;)eÕ¿AYz˜hM¨2ѳº¸ƒü“¼ï[ûö)ç R饜J‰pP y„lïþýò¡è'ÄË­˜ ¦hòL<-‰~õz+¢ë_rQTûŽ'í9}éú¹ukZ >øà TýHRƒ"•Ù 8‡„ý‰²i+V¬Ø¼y3)^ëVS¯¼+%QnÞ ¢S„î!¦ŠÍìí&Õ%v‘î©úÔs¯IÊjÑ8JlôŽ0\ΘT¦ÀÈÑ$®èºÇäEÕbþÚkiÓø¶ õP)#EA¹ÿE4‘ô×3ÉÎ 0‚’|®7l1»½×PF¢§R;]/LÚ·O‘>®)DÓÑPÄ à¾}û8¶é–Ü9Åè:ü„÷¼zéXÉÆï•ì u›–³R½\;Èãñã¤êñŸ}öÙ£'wLªÁ©¢ ;묳¦RTŽTú_jB U¿RT ÕPöçþç·ß¾pá„T&ŽÙA÷¡B&›Í:A¢Âü³jÖmcÁäS±wužªLó¬lÀï."€ªª&‡o”x’[E¶G ÄŽ8uÀ~’¥Jß!ŒæÚB6ím ÿðbÞAè±>у|¬‚~('É~ýkZ…¸Æ¹"€hVð*¡Å“y#¥tÿá$,ZÁ«Ìðç™Lgú4éÓqKëazœ u÷oòmü”SIaº·oŸz1MjB¾“(Û·/;"~éÀ*ègÒ˜ò<¯kåèjúħ’]Ôò•LíJX dVrßµ(6mzê©§yä‘<à0ìö,*Z HR µ@*©‰5X U´aÇ1‚¹m«·oOÇÜKý½©Š$nÉIL›u‡!|^¥[€IbÆÂ—‚Fù^îSQÓ2 ž#@/2‚éZTÃÑסÅH­IS¥~ß|3-Ö82jöpÁ/š;ˆ KŒü¯ä(,,}²tkü(8.Y h½òýY{ö¤§teãÕbZ»3}$f.åÅæ\ÆJ6k¥j³VÚí"èŸèáÒ™â W†”oA•œàŸbqHCˆK¿KPºuÉ«ƒ–è² A!è-†P‹"Ò/ðܘG¹¹"Qp×DaOázÐîr‹¹RªP\K0çШ“½xŸû÷§#H~©Ä¸…#ÕSr-ËåTœÎiãÁ .q…Y½ØmË'v¤›šš^~yîܹ·ß~ûÕ9Rj°@ªhT 5(R·Ö`TÑ©@*j¨ ©iÓ¦-Í·ÉWbsÞÒÒBPª„¹Eÿ=çHr•v™FB'¡ËJ̸“î)ˆnÂèâ÷ÉÙaSˆTæ“ ?ÍÉñÆE^õNÖʧš?JéXÒêóxç´B]•<ÑOt`-Pø¥&íîÑ´Í ª~ß ï)ñâhýüç*#%¨ÕÜžôRDÐõÿÄú:(Ø;òÖ[JéRãÇ"}Jܧtq¤H{»î˜´ÐÓCû2£åP>”un”]úÃ]Z/Í$÷f‚†Œ{w6¸HCqJùð›J–ºo·iË © 6,]:yòäK.¹äì@ª~ ¤©A‘º¥ ¤Š–!õùÏOš4iÑ¢EÍÍ;ò¢•ÖÖV¶pDˆªÖ£ÖnÕŠåÕG]Þ3Ïæƒlo—É2ŠÊýûËV/Ók&¥$ãç ›$Öé΃<²/Sv}o¾™~•–p¶<ßò õ´Ž-³*®ˆ¼iè}€” Q«ÿÈþL3Hß}W]‹ÖG¨ {ÄôKjþÑö„ŠðQèô³lg)ýKøäV˜ìù$ÐŒ±çÓ5Âw¸”ا‡öíK·t]j¯Çµ„c¢yy&êzzÒQà ¥A¢Tq%«ÚÜV/úR´•_»-ÛŰlF=,( ,v÷*Lâþ¦M›ž}ö‚ .ÈBÀTýHRTC- ¤©†Z†Ô¾\̹sç®[§îöíªWf’)oKbÙw¼q­d#ÛÊG‰&qúALÕѤIO"Œ~€Âk\ )&ÖC&]VðwȳÀ8$r¤ÜÛ 6E«;î¸j&HýÌLãÞ‰Õ©OЇ¾ÿÊìw ä7<"„¼ÒÜËùлä!¡E¸ì²R¾ˆµ{¯ä[9ëh£øÞ’¼Ào?óä¡Ê„B ˜©öMœÑž|¯û«ž^'°ŠˆçoÝÊÖ$Úi²Híp¤w!ØÇé\·nÝìÙcÆŒ9©›k°@ªhT 5(R7Õ`TÑ©@*j¨eH}ýë ©Ç{lÙ2—ÂT­"c¤ ÓQ'ÚªH99CLÀB×iåt4—<£‰$tùÙÝ™¥3Oiã_äCáZ@~‡ð¢^³~<çËJ|w Å.Ie¢ÍRÞ¨¡9¬óÂ?ñz:é!j•%j•Ò…:*åÃllîšÐr:ó“ñ×ûÉ¡CúÓoe¡r}*¯éct.ü !ô7²ÎËô`â…?®-J(¸h|®Â–¼N8r %-t‚ê…?¼cƒÓ sb—½nPÓÅÌ}§=B½©©iõêÕsæŒ7.zHRƒ"uc H-Cêä“o¸á†3f,Y²qãF·”’øáˆù}@Òf¸+¹&§±“æÕ~Û³gOz¤\,)=DÕ5%7G,¢§ú–‘jï³*´òØ5¥õKU’ ô‘Sâ#‘Iv{,q•ƒ{y8±¿wس¹ñ)_ /#­I¢X)_dŽx‰ 3¿ÃÞ]`ú”ßoÊ6£ÊLwüO³R¤×yŠÕo½uĦƒ*okÝò¹Jp«,¶,ñJ-îH¸Ù/CŒr,Õòûìô{Jà Êžn'\¶VC]]ü”yóB«½}óæÍË–-›1ãŠ+®¤ÞŸRT ÕP ¤©A‘_ƒRES â…^xÇw,Z´mÛ6øöíÛ=Õëj™Ä‰„‘"öï]ˆ¸<’BW3OªbzÝ=6a^šY…Zš¢h WB±.Vý…2oE¤¯ÏòŸ‡­Tݽ¡DlíͬvNŽ-r\¦_øÒÿy&á^’þIObJ ˜^à²öàOM`â§¼ÿò·–·ˆñ9ZÁS¼+9â¿Òl:®îDBÙ‹n*Í>î” û(ðÓ`Z=6'¹“Ë“D•¥bxÜ÷HnUÙD’ªÖwØJ)&€)¶›©¡o]´hÑÃ_{íµÔû³@*©j°@ªhT H5Ô„T²›nºé¹çšššhêP«¡q¤™½%+÷kÏ|™cÕdfÉú@T_–ëbÒÐeÅh4µXX.{ö(2}f¸ÈBîól°Å˜¸¸$ý‡¯gÖ[8,ð…YZò´Sè>œAÖ/AJ¨W¿°;xW¿â!»ë—ðöóì ôn UϘKò¾MóÆùH6üC¡EQ"‹ žs á‹ò•òíá­pài×$r\«zºÌÌyíΛ:„W>ÒUó¬\RD—G.š9ÅÒý­[_yå•ÇüÞ{¯¼òÊ@êý“O©@*Gêèa8××`TÑúÿ—5jÔÌ™+W®lnn¶±ñ:gœ‹ÄYÕfˆrB´ó w::§¤ÔœÍ¹N‘F!ÉSÀéÌ´²(Â9’u…ï£ ‘MÿT@Œ  Êµ=(H 9Ýåéù”}«öûða/RÞnXê’Þ$ ')M~•è¡»íáO­æÈ‹ÊÕøló¨:ú{h…¾Bñ;2ÒBìpö±³ºz!%öù§ ª;Â5šé#ìw˜mïÙÓÛÛ+q6Õ¾»£Ð_¨äâÚíµµyõ¿7Êëtñ{ö€ÚéS©WÆôè¶mK—.5kÖĉgŸ}öÑÿKRÇjT H5Ô©@jP¤þg H­©óÎ;oêÔÅ‹'¤Øy³ÉV„/ŸÕK O2H´¿•MhB¾™EÝzmŸÏê%âçQ+ü‚=(>R‘ÎÊ‚«ý^€í™N’ ò±2?$ó:lÚ›,Nš„ÌëÙ$_UÑYðMWP2ñÌþ¼,´( Lį|$AdIŠIpå¯5 AìšDó›¹Ý‚wIù[<Á7˜Äaª—Ò>Âa"È'ytz3Óã{÷¦–¨©ôcw–,÷+™jþüt0ÄÔ’hr¥eo—¶/›€•¸òêͦ&IbŽó¹Ï}îh¤ÆÕ`TÑ©@*j¨RT ÕPëGêôÓOŸ4iÞ¼y¯¾úê–-^ù¥P+ŽRa3ιéòtaæqɧ0í牘Ӌ–…ïëÉ+%̲ؓ5$ªÉ#Ë}F…AŽœi±™$ƒÂÍÔö‰>“?bÄÙ‡#”É<§×‚ວ‚âHØè··]¦£V¶Œ· ’ã~)5LÁrM“C›Ä³'ÉHàá½ý¶žòú묌O×G …1W_@½Eoï^,‹÷(Ñ ¶•L^Ç|.GÒO»¾’19ӲɊuØüeIbª-‡ zkkëêÕ³gϾöÚkO9ÅVCŽÔu5X U´@* ¤jýH}ík_»õÖG}tùòåMMе´´beÍk+±Ë#Êä½oÚÒ(O8°âUIÞ0šÏN8ÊP©_ÖHZQ™,ñ~8IˇÅÅš;„ ¤fª“ï%ñ+ê˜vA£¢ëdzEúa“!òˆŸxï$&×ߨÈF½ "ydƒ’u :…o}ÜyÓÅ™x6|¯›PsÿPö NÍa“¸dØg#ØÒã½Ù|U} ›Srˆ &Eåw¹•î5ûf¿Lq_ÇÖÊÌ;²álíÜêŠGj×7€lɉ핽£Ô¯ Ž™~Ÿö~‹_sÍ5à HÕoT 5(R×Ö`TÑ©@*j¨ +Ç+¯¼óÎ;ÑFoÏ­dbèT|æ—mÞ…”O|õÞ¶ªM—àŸ’Ê´sM²7Ëö’êM§¨é*Ħ´ðž„„ˆøiT-2‘ø*è6ßëð›o²:vy/AàãÈab½žò²?c¢/–·ʱâ7øP¢j=LAF’¿&)ñ6µ|Þ_¨ñÁþ©ÈÞ ‘,›ÝÇCÊa[<³Ï¦ó&ïëµ}v59àE;™ÍËeˆ˜©Òè== âÙƒ»ðk¹ uX¬Ö'îuXÓ(*mÜ/™ùÔåt»mÛ¶%Knºé¦‘º¦ ¤ŠHRTC- ¤©†Z©o}+Ø lÞ¬©^VVfçÎéÑ&œM:éô8jéÌsf¬ @Á/›;¥ÓÏr¡£nÕl>¢ —ïB1g²¼GL)]‹íõ×q¨^#£ÊCrhxìîë<…ð6¾•2¬Þ™Œ…‚ã(€áV©¥Z=ïqÅ0|%Åãy½R¶¨ë¢‰òC6à‡—èS2t S« ¢„ÐõE‘T㑌AåcÉÜtìAw?4ñÃðœÕ.o뤯VmN²gè =9œ1]q»öûꬣº™$× (Ìð…«=<êIR µÑU’å“=ðµXŸ<é „^x÷f6èM·ð ŸDAI>wÜíBwé £NtB O¿„$.BBwÕêQ$ûŠK‚¡Mé>yâÚòÁÊmÓu˜Ž èr6ÓáÚ»WÕý”›SÅŸN·~ë&»ëzæ%•ð{AȃŠ",¢ ô––­[·®Zµjöl“Äü}¤®®Á©¢RT ÕP ¤©@ª¡Vô¥Î?ܸqÓ§Oê©uëÖíØ¡H:n•×(cÿ^±FÙêqb¶ôÈIÿR%f6$GAuÒ“4*HO9´i±uw«´Í3¡k†¦ôPZÇ ‡ïqÈ)!Ps´àÂ;-(üÓ4¸Ã6ú ÍŠ×=+ìóÕ Á7Ю€:½>˜ÿÞøuµöš‰Šé£9Õù"$úl¢7sø\¶G÷ìnú‘hÚ¿_Œ&œÌ3ô;4`ÈŠ'KpÜ&Ýz‹!°”M÷’š>ÓцóêMeÛÚ’#õÜsÏ=øàøñãOéoí("uU H- ¤©†Z HR µ"R'4räȉ'ΜùÊ+¯x½=›Ù«â0+¡èôÎ |,¯ž –Ë¥{&Ÿ5€4‚\ ûØÿKSË$hw±‚º3°$Éà±åCV}@ã¯Ô˜ñ8½–OKdÑŠV¸Áuà¹8"Â-𼫯D’c„£Â{™\]‡¨Å×ò’¨Ry¡.(ˆµ#¡æàü|(>2¿¢T¢O©/‚;Õ×—ŽFºï³~M¢T²brpÞÜ¡k>UgvóàzÉfõºU6q±íÛ·w¢ rÉZZÖ®]ûä“OÞwß7Þxúé§€Ôè,*Z H ŠÔ¨,*Z©áÃÿò/ÿr̘1'>óÌ3 ïйñB…Ô¯Ï-‡3µÃ‘N$P¥ì/‘Àr&Ð#- Æ‹¥[ï­#ò×Môð}Â|,7¥xÑ_p”Xº‡¬ÃïU2€ @oIÄ<|Ç(]­o=Åoó”­²Â}}?1¥#ý©C‡$³Î¶òPVê®=¤ÿ©lÊ(^œX¨Dç‚PHírË·ÝÏWb([BŒh›a®=J›»¶9ÇžËmŸÝ “vç&‹TÍŽª4«Ê¹D=lâwpÙ+ÙF]gnË–—_~yΜ9wÞ9vìØO<1j€RT ÕPëŸÜHRBêèÉWÖ`TÑŽþ_ ‡ê¤K/}ä‘GÖ¯_ï]ˆ‰8‰3š>TàçÅbœ[zãz\ï=ܪŠ«Z&Rú 8 šæ–KgÒv§Z?ü mQ²:¸ƒtò±é¶€§ÇmÚAøÒÒ1ÏÓÖ+DüÐ0Í$+=høš»YÔê¹G†ªùáL¶B¾ ’î(äèš¼ÎâÓ¥·¤ûPMΡ"z|Ådè`¢Ë! QŽŠÜ)Ž õ‘%¤m/‰ƒì«î&WéTñhãP —ݽM”ŠÜ„:4\SÂÒËò‘óHÏC†¢Ý†Zz+o‰3¹yóæåËzè¡qãÆ]rÉW¿úÕ@ª1HRƒ"uy Hm ¤.½túôé‹-Z³&!E¤¯)¦ð*mèÅèÜqiLö„:­ìÙ–¬Ñ#~]À*ÙT8¥1 p±¢ÒrK‹Œ´hŸ5"¦ȧ{Ùö~£H[ªÞÞ#6ì,­Ø^"nÄܬãïˆÏü%?«à E•—!¯Û#¦´tõ×3YsÕÉÓï9Ó}ê…ØmAÁÆôi¡›ûm ¿Ån¾tkïÇüb.(^Vî¡RÏòî4Á©ôö×;Œ:¦ReJ ‡¹=ï!!fcåuQlnnnjjzþùxàºë®;ãŒßYTýHRTC- ¤Eê²,*Ú@HýÙŸ¥£üØc­XÑÒÒ’¨jkZœ!bbG¯ú2ë?Ü bdÛ­žL•ꬂ} LÑ—ˆ‹ ¨‹º4¦77*ÑÉ:j}–õÕóÌEÙtÐÄ(=5Ìbî÷•@ú ¸ƒÔ­S³^q.ß Žd€ÊÓzÈKå QS¨„´W$ò‘Ó_ëíÕ§â#ó¸î[â^¾ hyèS¥ú¤|·#Ò‡÷éÑTùXß#%œÎõ’ ç!:---r}©P÷²¿äc­]»vÁ‚©S§^{íµG;RÔû²@* ¤jT 5(R—Ö`TÑB*“ùÈ#,Y" ¯éfè w¨éz’Qý ®ÓmãûºàÇhLJ |ÁyPª˜Œ'i9r»—ûPsÀj䞦 u»Ï¦ÝúïØ´D%ŒA/=Ÿy„Š`÷õIE‡ ¥ ÑG6ZŽX¿†^Íþ¬ãeøt ¡ï°'›´ù]áãØ”M‘U÷™Ë†+«kçšJ6­m‡©†èò–wŒvlÝúÜsÏM›6môèOC‘êgiXñÎÇØ©@*j¨RÔ H]\ƒ R¦FJvë­óæÍKîh¤ë„d2*Ø£° ‰LÉóîCr;ófY-^Ç2Psy_.OgRð׳یøù!“Â<`‚âjª >·JUt^ ˆÃBêõM¨‘à VJÖ’¯} KÈ]ñvïÁá¢r°Ïã醀PܽY1EÊÙ¼ìùðaoî8r„<@¯qtq |¨=&3!‘c€X¼Š9*:H×"Åè,Ã]ÄâÐ[b«§  6r¤†yªÖ;Æý&WD0ЩU ØÂ}.ØÉß=”•+‚èBŸ{m2ô"€}ŒáUü)Г&Û](ÓN—Yv.އG¨>'u«ÈŸ§Ýfö:1 ©æjU\ñ4¦Ã·i+¿t锂‘P´ÛB” .RÐÇ[Š:æ%\Ç……¬®®!ðTɾ¾\%«íW˜~D(ñÔ­Z}$×ôê¶6ÕWrÅsŽð‚…Ö† .¼á†;ñRò{«ï#o}Ÿ@*©5ØÇ ”Ú- ¤©†Ú°*G*ÙØ±c-Ú¶m[g¶u—ÃÄΑ»WŽ{ O!XÞm3|&À‹º¼¸)çcȈ§ûxCé©,K}‘o­GKžö±~ñvxPÞŒMH;ˆëbr|Îj[Ľ?OË[ðÖ‰Ÿž 8j ÷Zó`o‡RðA¶WiÇáñäz_·(lôf bûpŸL~7ýž×å¶b=›]÷¢HïC´Â¿.r4oèØsMóÓ“ŒËa'‰ß;š››—-[6kÖ•W^YR?¨Áþˆ‘öûåõT H½OûT÷{!5zôè¹s×­[W(i¶mF;q%¯Nò(“*ÍyˆZ%¡ÂéåW]&–$Ôl“ÓÃÚA-H­â„ý´5Ú½[My¬ÄtkUF2t%ûlýî·0›ÊÅYᣧ'‘¢íôQéýADBºè÷[;Z/ɳÇ1t¤”:vq&"|Šôy<ÛR@Õwã[±¹í²Iw~mñ.y…ùlG7ƒMtxwíÒáöé(~&¼žÍxg&2šž¼}»Ëš¶“ìM§´Ö¯_ÿä“O>ðÀ5×\HÕc¿[Âc?# ¤lÎQÃp.ªÁþ˜Èâ©@êþ— ¤ÞÛŽ© /¼pÖ¬+V CÑ‚ÚN¶=oE“B‘@ç…3J¯Óg‚yŠ—’h–ƒûT’¤<°Û Á­¨ŠYz(S ÜE–VˆY‰Ü.Jäø•\3a5!ÇóˆÈ ×0:duåÜÛc—»Sò†F…¯–´=à™|O{þvŸ±&Ÿ Q œF¯X0Þc _½¹Ð9!O޾8×.¯(סNºJkUt®ìEš°W¶6Pæ¹UM?³½µ5¹Ä/¿üòüãÉ“/¿üò@ê}Û€•ÀT 5(R߯Áþh‘LÇñ ¤©@êÚï×#½7Rçž{î=÷,Z´híÚµ™H¦Æõê\s§ÓDäQ‘fô,/g¸Ë”Ô«&^"ŽÎJAõ8Ðq"Jõ’|•EG4i‘£–ƒât™æ~|#9‚ W÷ê;eYü¸SòتóÛ}¦_æqû=¦w&”Ü—"¨Nä›$¼ÛËýh%Ü—¥‡PРhQ=˜8‹UKwKÓðr¿7{VÉchÞè²è:OI÷Ñ+ë4©²I}Pd¹Ó³ý¦Z¿öö¦¦¦¨a^~ù—¿üå@ꃱ@*© k°@ªhï‰Ôi§6qâ£>ºxñâæfâJ;8A¨ñ¸D»ÀNT±ºoR8ÝdmµŸa×DzðMŒßךa ù $UÜE˜ÏceüVw@ ƒvõ IDATö²eåBè©þfC§|-™U"„ÍËé=ÒÞ’¬2»¯ýFWŸMÞ èÔB·ï5µ[ä),ön>"׆}ÖŸ^ÂöV{@bylKŒç‚ÒmÙ[}VmNkÙ&s”MýR—-vÖl¢uù"ìGÍRÅ&ͧéŒð#mÑׯá…|ðÁK/½ô½Nz õ>, ¤Eê‚,*Z HR µ÷D*ÙyçMž<ùñÇ_¿¾¥¥¥3‹ó)äd'¶“sÚaÃä3yT ! G—•û©>òs"z^¨€®Aʈz9 o­ÖB/ûÎ’¾V“‡™ãÔ V¿åBä ÃØw¹e ûÀÝ"Ÿ«á ꥀ¼×4Ï{ !fü©â<ÝRçž>bzv¥"Ú¨»ÇÝÒàj‚·Ôa’òë3,™öynœc²3‹‘VÍUµ?¯KgÂç c¸¬mU©åöíÉ~å•W~xâĉ#FŒ86¤Î«Á©¢RT ÕP ¤©@ª¡VRé°]wÝuwÜ1wîÜ—^ziÛ6µ ÚŽ½ƒµQbËÞfæ³Á¬(M]Ømå{Qï÷™p-ìËâ•O…§µË…Ÿñ'ª&¯Î«vY?ß n»ã³'Ÿ$O«-î–Çá÷Y¶v¯ ~SíïBPÝßbÅÓá«y ÊÅybOáÂÕnOH{pܵAù6½™ö¹R¿G;rùé¦ïƒ¬ƒüLð–MÀ *`®D¦Š™NǾl=4 ¢“ïMoܸråÊùóçO›6nܸ¯~õ«Ç†Ôwk°@ªhT H5ÔjCê”SN9rä˜1×^{íý÷ß¿zuKKK:WtÉÃO‡›o·ít&•²5F¶vý£ÜØ1ú2¡’½ÛŠ«>úͬ³;ÒnÌËÑÑ9æ·Š¹±‹òË´×Æhì¤fÉ·päeµH ¹½ )- až ôÝ6 ÕƒˆÉî¶Ôí.ÛfºpgäÇ!¿ÖEe9Ÿ³Då8èÙÐ)*µàÉ7„:lž.÷©'žöQm<‚$í¿áËó½ÉV­Z°`ÁŒ3&NLû÷šNw©sk°@ªhT H5Ô©@*j¨Õ†T²Ï}îs_ÿú·¿ýíÉ“'?óŒjý¼ÑÐ˦T±©ž¦¬Øè¶Só!¦¥T¯ó¨Væ\¨0xª µË“Èìq÷É‚}½Ö}¨mS¢ÜçšêÖ<¸•Šô2¶ä e„¢ÊùêµnE¯T…:>èøŸÚE¶Ø…"ø¨^‰Nxo'/ỜìÁßt´¼ÑËÐKY€Tå‚\(ºL¿£bRó~ *vøt¬q·< ÌáVæÿ6]¾ZZÒææægŸ9sæ”)S®¾úoþæoŽ©ïÔ`TÑ©@*j¨RT ÕP«)·+¯¼rúôW^y…&cNp›I)hNï!vƪZ—¡7xƒ‚bÆ=¦½¥ :Òà]6v~<µ«ˆ5Èà•Ðæ·‹EÚ“•ëyJxŸëS÷ ê¦?¸|ÍÙ!»Ëë÷[áÞnÿS Êãúæ5õp5àyýˆû„šüS`%kKöË*_ÍsÜ\-t@zzä8YÊ¡Œ Z1}yïÜÐeŠ@®he›€ã}æÂnÛ¶í…^˜5ëî»ï¾ñÆ¿÷½ÚÏrŽÔ95X U´A§vRŒH=¹ãì,*Ú1ÿ/õ…/|aìØ§žzjkf 5±Åkmmµ­_§oFuìk*¦Gìís¢Œ|éŽÊ×Ú#e6~Üzž·ÛërØOu媚>‚“÷eo'êX¡ìÖ°hæ‚ÑÍ•jÚÚx°Ì…‰Ç…[?yr€:éôÜ•‰^—íÕU«9ò+T”q€93›7ož;wî]w?~ĈŸýlíg9ªß©@*j¨RÔ H}» ¤ŠvÌH Ï¿÷Þ{ïÒ¥K››»qŽ#Õn¨N“A—D¦OskkÓJ±ññÝ,xð•Äû(Eì+K¿9J® ‰—Cm7a@ÅèxHAªìv[«b___w·D1 ½ÀÜ2…é(Ðë5ùŠYâx Çó…"ÞÑnšð¿Þ‹º“iYÈIƒ ù*øH…ЦGôЕ⤠N¨.;~mò(*hqÄ:sÓaæ°#\EÙ‚ÍÍ/¾øâË6W­6p¯9Xjî5¹›æ©^²½|Ž~ó`x— ôá ¦ÌÖÕ§æÛô˜ÒßU-ˆ>ù&8wGI蕬¥cY6¯U·žF§×³Å jü^yeöìÙ·Þzë‰'û)ΑúV H- ¤Eêok°@ªhõ õoŒ5ê®»îzòÉ72[TFÙ„¸Z¦†z° ²Nj|Ê[WWB‘ðö~Î#;"VXº¿Ó‚z*HbŠºçE ·y,M1VOí6µd%_iEd½ª0‰8`¯u¦¿RŽŠj¼œ]‹ß[õ‘é­mœÇF´éŸûh1ÜÍp »)ËLÌàä[je¸[ºäW]&Ñá ìj.ïW .~Äq?t>JDM AA÷S¹C=eÙÄJÓåjÉ’%=–.{—]vY u|- ¤©†Z H ŠÔ7j°@ªhõ uöÙ£G¾å–[îºkÞ¼yK—.Í êטp;:Лç&…HUQÅ4Y -Vš:ªyg]ZdîSQçV±2ë|§ Äí²Éf»,8¾ÛdÑd'rŽ›&ƒºôWéÇè1ˆ=&¡¥Mó´WÅ Ogt€r¡£¿4æ`OgwÙСä(x¥¢ÇË]”Ã;6*y"ñøNk˜)[—¢'0¸¦•6n\±bÅœ9sî¹ç¦›nªqøM Õ8 ¤©A‘:« ¤ŠHRTC­¤¾üå#FŒ;öúëo»í¶ÿøÇkָ㤮^ÄOå'x‡)+H£cYÛ·WLGAE^-‘OÀQUÔ¥ÇwY-ŽHÕæã9ÂÜð°ÓTU{Îí$To¥v=<Ôm¡q‚ñ½¦Á¾ÓkþÌê1‡io óN·ßej´=V¶¡JD|(¾Ê.³²Õ~ì$Q@1£ûR ¦`:Ê,w”£¡‹Au~%„š·´´ð¼­[·®Z5þüýèG7ÝtÕUWsÎ9Ôñµ@*©¯×`TÑêAjøðÓN;íüóÏ9òâ‹/NT=ýô«¯¾ªÓÏÖÖÖíÛ=3©T/)^ÓbcGã+´´Ò¼Ö/—ƒ¬°˜}ÿÚR,-O®j_•cà ôÑpð§|*a:G Pµëò u¸#˜×ɘ ß0ò{‚Zß9zúT»L–‚œvm#»\õÒÔ¢:óJHö¶z{—ïòü“ÞJôU-y2=‹ðñ<…ZÓ1glüš5kž~zêÔ©cÆŒ¹âŠ .¸à¤“N ¤Ž¯RT ÕP ¤©A‘ú5X U´úJöÉO~òÄ?ó™Ï¤#:qâ“O>¹aÃï*€&¡BÞ·lSÝø§#$Ô<°Å *¾p°ª6Æ[§õà½ìä-{¬ÏÏÃy,b¡¬{…óöïïòò?_ÊðC˜.Ý÷æ ÜŸB0‘%ïn“‚‡¸eLqóO).`X× . ²Ë²¿úT^ãçr¢Èfte-,6oMÆc}%Ó’è´Œ9£‘uk×0£OŒ®[·î©§žº÷ÞË.»ì›ßüæ™g~öXä&þRgÖ`TÑ©@*j¨RT ÕP«©‚õè£._¾|óæÍ …mÙZwD§d ßÊѨXS‡ü¢ÉøšðçÃq(äˆøEw\@´j]½,bÅå¹Ó‘uÏ 5V4ájy7»MEÆ&µëñxÜ®²‰…‰ Wn÷§Xµ_…ˆú.´èùVe‹ùŸ®liíSÎ(›Ìn—宫öE '/JÁòªiѶÙ@Dôè¥=KÂ"=Îl¢+VÌž={âÄ¿þë¿~Ÿ§4GêŒ,*Z HR µF uÙewÝu×ܹsUÍÍéoß¾¤.[Oñ–­ªÚk—J6h¢âÐÊt%+DôXd^.-!ËœVÙ±…LATÒþ©FWw Ö'¡ÆÕ³”Ë'Tj×:wº~“W¸s«àڒû½¦œmbÙ.']Vr¯wå êƒçæ•Y VµlÚÈåÕFe~?^ô¥cê-‰·lÙ²bEÚõMž<ùâ‹ßÿ) ¤ê·@*Àr¤N¯Á©¢óäŽ@êãŽÔÑ“;©cµFü/õïŒ7.Ë'žx⥗:Ì=ò}~Éþ©%‹wKuk^xÝÚÚ_ÂfôyìOY_Ö±‹Õ`=vYs_ÞM.1:Þµ‡VBÜ£Š-Y÷¡ÜgÒºæývZe:ÁÁ CoXÄä¤=e\¶,³çƒw‚š#ÓÚÚêuò¼Âÿ”çº;lÎq7N"´â@¥ß+€êÅë 4Áó¶‚ðP%ê¸Ãâ¬äÓpwš¬n’Ü5âúü³‡l/üt›–EÕ€”Äz‡}ýu~¹'S9ë´I‘Ý–XN÷y7¾R•£Æ¥„«G©ËäuÉAt˜µ™4™Ü®ÎΦ¦¦äÊÞÿ 7Üð…/|¡'4Gê´,*Z H `TýÖ¤’x≣G¾÷ÞgŸ}vݺuðUiS’ö?¬ÖIÉ’£,b–EɦNTl´›Ìÿ *ZÇåJo }‘Í.ÙàÞj¾«K‹™­’ïÊ”:æ-õò¯lä„–Oª÷âuŒ‡ô'|¯™ëZzž6=)}K^%üS8øìhÓ³¼¾Þ¥¤¸àT¬Ì¼lcâÙÐõ_0¼ðÈ7Ó~üþ–-sæÌ™0aÂXgÙùHÕoT 5€åHý_5X U´@*À©ú­aHÉÆŽ>}ú“O>¹f =qíx%i‘0NŒŒ¥|(œËæ>É_ðÅí³}wfr+„S¤Ï›öXôU³S@ç¯(éê‹•N­·RÇî~Á‡|RÁ ¥Èô±Î»M³\oÁëª6˜Îÿ‹æŠ)\x#ŸZîYyÜ]øtðÀ­ªõø´P¥/GºÆ6硹ñìíÛ·¯_¿~þü믿þÔSOmäyÌ‘új H- ¤°©ÌÅ©Xkö'T 5 ÅÿRõ[ƒ‘:眛o¾yÆŒÏ>»uëÖí™2ºÑ…ŒÇ˜óš?—NP Ù},ë2MÅßÉ„V­]‚È3”M´¬âëo‰[¥†I²òVBªj]Š]6?§@'ñ}âç]¦öÀ“wº*'©_²ÌÞ¼áhîtÀü­\¿Ò³Æþ]žk ΠÇ=~žKµÉ˜.„ÓÙée--›7o^¸pá~tÖYg5ö4úJ H- ¤°@ª~k0RŸøÄÈ‘#'L˜ððÃK—.]·nÛ´²Ú¶m­––/3÷å‘Ë?z ¬ì…ÖD }×Õm•ÞÜjù^±j‘:½Îš K^±îº–žµú¡.^/=ž öÝ—×6ñd‚…]Ö“_µ¡²}ý³+×ôä‘(á©ìÓNØw´^ÓÄ·ÓÆÍBŠ×ÃyéUÞÝhrHíЖhljZ¼xñ½÷Þûýï7öfHÕoT 5€åHZƒRE ¤©,GêË5X U´#…AÕÌ™3_|ñÅuëèGlcMhQÑ1gb߸¤|=Y1T´˜Ý½ªZ­:÷•J–.dR«VîK´ä±Èåöd*è÷ðHñz W`ó§ñÊFK—ÍYSdÑ, œë6¡ÏNó+6›NŸ9¦.Ó’ G²lþ¡„ÿIªvÓ»,™¦hÉØ¢h²Ó/OÜ_¿~ý²esçÎ?~üg>ÓøSHÕoT 5€Rõ[ H `9R_ªÁ©¢}H%;唋.ºhÚ´ióæ­^½zëÖ­¤%R¨cI3 Â¥X8F ºÛðÙlyÛ§Ày$׫é¨Å“Ø‹½”ub´Y(¾šÇÙ=[ì|z£L¡,“£ † RŠÏ{_¢']»»{{{Û²™¹U«Ýë¶ÖÂ’Édtùô]8÷ÊEòºål >¥_01¾]5o54aÑ*‡Ct¹ûµ}{SSÓ¢E‹fͺå–[N8á„âüRõ[ H `Týö!…}÷»ß½ñÆgžy&mRØýRâ‹-3Æ:XÁìsv˜üs{.ì\±‰ð%+^¯Ø·.vV¶x‰¶L]¹$²‡ç(!ªXܰñã%;ͺmŒ†ª‡œ^úÙû©Ÿ}˜ïIù *lrD¼²ª”ÉBSÐT¯̬ër‡«1ó)Ì$–Ç·ióB$žâ)ßtYÚ´)Óûî»ïæ›GŒñº©/Ö`TÑ©@j ¤ê·@*Àr¤þ¦ ¤ŠöA"•ì+_™:uêsÏ=·aCBˆÊsÕ«á V‡M¡H¾^•:ùð/TòÆ ãžW»¹#Sµ„q—ÔULÀ¡’Ë`%oQô”n%×¥dÉw›ÜºÂpTëU-ϵÓÊ©x¥ya„=?[BkÂÿ*n“¨mmuÏ­œ9òÁK&ÒQ¶)ne3Å7ý)í6ÿxÓ¦M $ê†n¸òÊ3Ï<ó:oTýHRX U¿RÔ–#õ…,*ÚŒ6iÒ¤gŸÝ°a‹Äñ$Õ¬­B>P€„+ëYag º—Pið<-÷}V¬‰¯Íš4 1éJŽ(•í9 ]6(®j‚è”ïdÓäÚM´¬?Ÿk¼•­Ó£HTzÛãê>tØRþ>ýÂ|+€,»àš=Õß§ƒ·Hß©¥åÕW_MnÔ¤IßùÎwÎ=÷ܯ|åƒ;eTýHRX U¿¤FŽ9qâc=¶víÚ;Ò´J%ßtUØó)Æ¢c±U¼ÕEzïýq—ô¥N-7Öi¨Tm£¥]›Oö \µB GC{B/›ftW>,ĺ#ËÆ“*ÏA®Odžq‡Å»­ÞS¿¾!ôðoµÑ3 fžQ&TéßN¿vë˜Oß}ݺyóæÝyç—\òÁŸ²©Sj°@ªh†ó^H}¤:zN u¬ÿKRXŽÔÉ5X U´ãÔˆ#n¼ñ®»îzâ‰'Ö¬:ùÌÞ’)#%®<×icÈ*6ÖB¨åéβ}ø™E§É©—r•MÂwU«íÖ€^ÖuÚ`ÝBÎÊÑûË÷òVÄ.<¸Ül·I%SHêô ñ¼g®Ãº \t- ¸sNGÅŒ¼¢í•³éج\¹ò±Çn¹å–ÓO?ý8œ±@ê}X H `TýHRXŽÔ_×`TÑŽRßøÆ7FNËáî»ïž3祗^Ú¸qc&3ÖÊ"ë0bpå)àÎ|pëRƒu©#ëǨ˜öƒƒÖa›«Š+Y^Ù:]]“õN]>ŒO F„øÑm›í^^ÈG)Y>‡I÷¡·le}v¹(Ù\ân,§¿îù[—D³IÆ^ìèÃŒóüîŽÍ›W¬X1gΜI“Î9çœãpº2 ¤ê·@*À©úíx •ìë_ÿþ÷¿?jÔ(èŸyæ™5Τ|Ä0}ù Ó}êr|·V¶õ©Oç³HÕoT 5€åHXƒRE;îH%;ûì³Ç޽þúë|ðÁ§Ÿnjjj·)éì¦Ê¶"ZVò `§^ƒžªMÕV‰çy²Õg#èáAWN*{°Ð7vÞà~TS%—3ò¦Î§)d—ËY÷{ɧû˧lcYòŸç°]©µµ’Ï&m7|Ó‹œõ&lñâttFŽù!œžÌ©ú- ¤°©ÿ³ ¤ŠHRX U¿}H¹|òÉ·Þº`Á‚µk×¢—é‹Ñ%2åXàfyñºÓÓÒÒ‚/ÕaÚBŽÿT2•6?÷v:‹3Þ;ÝË•.ܧ©äÃ>ÐEê0÷JóVU•µúèÒ¥ëׯoÍòœ…˜r» -«˜ÐƒÔXßD²;­ïOëÝT"|e—qp_ãõ´Ò¶¡‡ÈúÄ.“ fNÅfòz\w’°Uâú•¬¡‘Tr…~¥¬P¯3ïä(Ù4ŸRYÈ\ m Ëã¶ç’˜6§xÛ¶mMÙøÝ™3gÞvÛmcÇþð‡?<ÎùÝ‚Rõ[ H `9RŸ«Á©¢}ÈHa_|ñÝw?ôÐC+V¬Ø¼Y£ÝLó( ³eiÓ6þÙŠÙþIèìž\\Iåã Äâî°áZÌ X=Jû9ßH–,å+óÆwÏWså$>JÅT2õ'd6pRÛt'¿øö”‚#/¹·ï“]>¶m[¹råüùóï»ï?øÁ™gžyÆŸù †Öj9RQƒRE ¤©,ªß©@j ¤ê·¡€T²/~qÔ¨QÉ‹X¸0­¬ææfïàc½I¦Âu(}˜™ 8à¥xl­ËÒy¨bh”-•+‡ÇE·yëaɦ¹„¨ÜºµÓ|•™{×¼ŸŠ}÷1¦tÄ_­Úypöúܱrö‡DakkòµÖ­[÷ éÛ7î²Ë¾ýíoØg#z?HRXŽÔŸ×`TÑ©@j ¤ê·!‚Ôðá'œpB¢jòäY³f-]ºôÕW“¿!Å/É ñXŸB ’çåc~M ¢ó¨¼¬‡«Óý––þÔ˜f÷ ¾IDAT®ÿõá6>OZi¾(d‰«Ù¨žJüJnðà¾éOã¶›•òœµ{v0¡ø„Rúô›6-Z´(}çéÓ'L˜pÍ5×\|ñYgõaŸ‹@êýØñ˜ÜQ“RC©£'w|¶ ¤Š6$p*Úå—_~Ï=÷ÌŸ¿bÅŠM›6ÿÓÌQbe,Îtô8%FÞŠüåa;mÂq¾+SyÖߨâò’ƒdÁ¾V֤ݚ—ûô8.r+žD½µ$¡õ@4ܲ%}»åË—?óÌÝwß}ûí·?f̘ôÝ¿÷½/~ñ‹ö9(þ/õ™,*Z H `TýHRX U¿ 9¤’]zé¥S¦<üðÃóæÍ[¹reS+´-bÖaƒÖ=«uMŒÍ›úJ¦*ÎS”*¶rvEêÜÒS=ìÇ-\Ègrñ%óŠ: ºlÝŒxf;,ÞHäq) h°îEîV]Ÿ.ÍÍÍË—/\¸púôé7ß–#õÔ`TÑ©@j ¤ê·@*À©úm("uÆg\}õm·ÝvçwN›6í‰'W›7o¶Þ £ b{óF§5W(\Ö—Gº½àΟ'÷Ë;*¼¦ÏË™¿ÆïËùpïÈà-ñŽÚóÁríÕü¡O—7mtæ"dP—Þ¿¥¥¥©iÙ²eO<ñÄ­·^vÙeé»~â_úÒ—N;í´3ÏüÚ×¾vòÉ'ØÇÞ,GêÓ5X U´@*À©ú- ¤°©ÿ½ ¤Š6‘Jvê©?øÁFuÍ5×dÒ´.X°`Õª-[¶$$†·™¹ÅúUÔúúÇÍê°>Z¡è3xá¯bÅ„<ï°2¾² Dxa^É´ÓE¯sÒÚ*3ïKWLˆ6]Móçßÿý7Üpç?ýaâA-ªß©@j ¤ê·!ŠöùÏþÔSO=ùä .¸ v÷ÝsçÎ}æ™gV¯V—"…}lô„’¯sG‹ÅLVWC6„%­ƒ»\œÒ³À *úØwRÀ˜Göd„ñ:ml0z—¢Û?’ï%ù4Û¶m[»ví‹/¦ÝÞÌ™3ï¸côèÑû·ûaÛ÷°©OÕ`TÑ©@j ¤ê·@*À©úm(#u´uÖUW]5qâćZ´hѪU«6d¶5›¦£uî©_# êÑtñÅgŸ}ö'?ùÉûh¾‡åHýY H- ¤°©?­Á©¢RÔHÕo¤°´G¾ýöÛ§M›6gÎB”*¶nuJíŒNtß©#oÝuIXôÆ:<ônå~%›¬z§ »éȳÁ•ÌÓOhVð–í&h®`»¿å¦M›Ö®]ºté¬Y³î¹ç¦›núÒ—¾4|ø§?ýéSN9åÄ?ìCX“Rõ[ H `9RŸ¬Á©¢}ľóï¤-ÔÍ7O™2å‘GY°`ñâÅk׮ݼyË–-i«åá;¯<·Éi–¼EíÖ5è¹6kô<­ꂦ ®ËY8BÚcò¦é­Ò__³æ¥—^š7oÞ}÷ÝvÛmW\qÅùçþóŸÿ°ر[ U¿RÔHÕoT 5€RõÛ‡€T#þä©§žú­Ì.¾øbŠÖï¿ÿþÇ{òÉ'—,Y²~}SSÓÖ­[ѬèȺ]½”³+%Ke:Ycî 3 ‹N×’@M]34×ˤ‚å±1_g[f7n\¿~õêÕÏ=÷ÜìÙ³§f6iÒ¤›nJ<}ó›ßlÀwmÈ;Ö?Ù¿>>QƒRE ¤©þdÿúøßj°@ªhT 5Пì_ @*³a ð}D‘*Ø_ýÕgœñÃþð’KÎ=÷Ü믿þþûçλpá—^JV¢kËòÁ;<Kð[>’R4=³a>Ø'ãEîÈú4T°×Ö–Þ*Q´cÇæÍ›W®\ù⋉£9sæÜ{ïäÉ“o½õÖQ£FwÞE]”>ÍùçŸÖ0‰8Rý +ÞùøÚ:]ƒŸÆ÷8ÉÇõÅG!5lP¤†½¤† ŽÔ°A‘J¬–_çHPƒ ŠIÿMà ??ÎöÑGêè_g½‹×]wÝ„ ¦L™8qâwÞùØc ,xþùç—,yuØ«ëÖ­KT´d¶eËæ¥QÌÞžUŒ+•D_k«žÔÚª ↠‰ÎakÖ¼òÊÒ¥K-Z4oÞ<þc?>íî¾ûÝï^~ùÕW»üòËÓNôÃøÎÀ‹ˆT?ETãÏÓñxq ÕH pçciè¾Çö¸¾7T^<ì=~_÷ßøø¥a8aa¿cǶ>þÐ’²Š¿<‹:,ìãmÃügXXX6l€………ÕmÇæ˜………½‡ ûÛ°°°÷e¥(–vL6·ÕCì㸠Á#6m.‘aCª!ø‘†¢ ½…2T뤇Þ' ’6äÊåhCÆÞ' ’6l¨5Ma¤†Ø‘ šÆ*J+eè"5ÔŽTØP¶!´R†,R²¡ú¹Â>D°»f謔!ŽÔÐý`aCˆÎB ¤Â>Ò6ð ¢Á#6$mè-àaý?†– ½#6$mVÙ ½O$ªŸ+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,¬Q3gÂÂk¨°°†ZÖP ¤ÂÂi±ñ k¤Ex",¬¡6TçK………………………………………………………………………………………………………………………………………………………5ÄþУ‰™5±gIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/surfpart3.png000066400000000000000000000617471477365367100224300ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœí÷cUUÖ÷Í0:¶ÇÑGQÑÑGpTÆˈ‚éHï„Ð!´4B%¡$´)$$$¤’HO¨¡£¢XÇQÇwÚ»ÎÚgçœà‡”{“ïç‡Üܛ۸ٟ°×Úk¯ýÀ€ƒ îm|4çv8\~§æ·n·òS<Øél(õ 4²RNf,”ƒU7×PêçúoJáÁª›ëƇ#(å\RA)Ž:Œ@³b(õO 8Ã@o: PàPJ¹Ô»px P¥ì¥€C©ÿgFìNXH¥€‡QŠßCã>}C¥€(e(Jýb'ó ” ¥þaÆŒ¥ï© (8ŽR.FŠ¢ñ^¥AR@Ã(å„@) ÀPêg @)3P (€RöR@C)¥ÇSû" ” ¥~²@ã¯K¹8QîJµpÔ¿`—»íŸ¯£”Ó8¥Z8ª_°&Ô]:VÔ-¥Ì@©Žâláwî€J9‹QPª¥ó›JÝñ7ïXJ‰üDã¾HÃ¥Z4\uð«M_ëquããïpšÑÞ$@©ŽîOu7ÝÑ)(e(ÕÂùíX J5Pª…s¿±ÔhüXÊ©ÊfU“mÐrøÍ‰ßoþÖë†ãJ5îÓ74Щ…s¿ÿKýÍPÊ ”jáü–RV—z¡Ô½¥Z8ªyýÝgûPÊ>P (0”úÞ~d[#?Ã¥€‡RÊÙ2~ÍýËŽˆC)åd@) ÀPê; @)3P (0”Òøö4É”L;±±_£Á€R@¡ÔtªÓª‘Ǩ 6wgDZ”ÂDàôJ}c(eJPÊ>P (p@¥œÅ((TJ}mƯž@Æ89Ž¥”35Æ„R@‰¡ÔWp¢ñÞ@) JÙJ£”éøkgJ†R·,Ð$û¥œÅ((T8 RNã”  ”} P`(õ¥ ”(J}aÄRf PàPJ9U…”JK)TO§ÇPꦜh¼7P (€RöR@”²”  ”}pr¸ú'w|n(e:†RŸYJ™R@”²”  ”} P`(õ© ”(@)û@) JÙJ†R7,€ó¥Ì@) À±”jܧoh P`(uÝPÊ ”  ”} P¥ì¥€C©k@z ” J)'JPÊ>P (0”ºj(eJ†RW,Ðí\K§Æ¡”r™P (p,¥÷é(J]¶”2¥€(e(@)û@) ÀPê’½':2~ÀÙq(¥œF&” ¥.Z?3P (€RöR@”²” ¥j-ÐG¶9P (p(¥°_ 8?¥”“¥€C© €Rfp¸ú‡á@©{:†Rç-€XÊ ” J)ñFšà5(8žRÎã” ¥ÎY iF»³8¥€(e(8 RÎb”* ¥ÎZ I2~û ” ¥ÎXÀy†{S¥€(e(@)û@) ÀPê´Q)÷* ” F)'JPÊ>P (0”ª±”2¥€ÇRÊ™")(”JU[ IÚ¹8SP (p@¥œÆ)(@)û@) ÀPªÊPÊ ” P)g1 J¥Ûä4FA) ÂPªÒMqüuc¿DÃ¥€‚UÊ™|h P`(Ua;*£ Õªœ‚R@AÃ)ÕP69•P (p(¥ñΡT¹î¢ÔýÊ€u)àX<¯A—O>ùæ›ovìØQ\3ÿðù_=¦•¢Xê>óP 8÷§”D©’r¿mý}¸ 0ks¶‰NîhéÜ«RõOî(³ÀÝc©ûÿoÊiŒÂÿR-™çž{îÃ?0`0óÉ'#™þýûôQŸ>}ºuëÖµkæƒ^zé%ó# ¥J-ÐØJa©8-F)§J9=øCçÎ{õêõÑG4«£ë=D}¢1|øpWW×éÓgÏž=WgÖ¬YS¦LqÓ˜0a¨Qã˜aÃè!O=õTÝs6œRN6kk ”ÓÓ¸J•XàÎÆ8Õ¬­€RN£+ÕÚ€RNÇïoü¿û]×®#FŒ˜4i’«+)4`À€!C芻»ûܹ ,ðññY´hÉ’%~~~«W¯\¹r1ãëK7ùúúΟ¿páBºëĉ|ã7êžJÙJ9M«Ô) @)3PÊé€RŽ ”r"~øa —zôèÓ§O÷îÝ{õ¢piذacÇΘ1ÃÃÃÃÛ›¢KOOooï•ëÖ­ Ú´i³sç.ɶmÛ·oß±cÇæÍ[·n¥{yxPlõñÇ×½’¡ÔI @)3Pʉ€RΔr|ðÁNzõêE 7a„ñãÇO™BS6š¸y{Ó,nÕªUþþ$G```PÐ6Vf÷ˆC‡æËøøø£G&&&ÆÆ9r$66öðáèèè}ûömÙBΛ7¯o_ýå ”} ”sÐlJ[J™RÎAkVÊÉŽ˜‚RÎÁ;ï¼3xðĉ§óÂíìÙ4þ½¼–-[æïïÏQHHHXØž={"##cbŽ0ÇŽ%''?~<--S'›9qâDn.}ÉÊÊÊÉÉÈÈ {9ìí=tèÐÇÜÁ”ªû ¥@ƒÑlJY éºÍ:ƒSPÊ9h6¥ -¥Ì@)Gá™gžùãÿئâGmÚ´éÓ§ÏĉóçÏ_¤áëëëçç·nݦM›(f:p **Š"¥¸8¡ÛCÊäääååä剼\Q‘X˜å+tI3¶ü|ú?†îÂjÅÅÅmÙ²`Á‚~ýúA©ûJ9 Pê7ÇhÝWg0 J9ÿó?ÿÓ©/ÞöêÞý­·ÞzòÉ'åÚµk7|ø´iÓÜÝݽ¼È£õëׯ[·yófšèíÛ“””Âdgççç“ùù4ÊIV¨¤¤äÔ©ÒÒÒ²²²òryIßÐú¶´”ì¢Ë“'É/0&fíÚµ4½ü“C)…SÁ½âÈJXÀy†{S¥(Õ’€RYÔ·ïðáÃG=bÄÀ»téòÈ#/¿üò„ fÍšåíMãœÂ¦;wïÞqøðá£G¦ipØ”“““››[P@ï_*Émì%%,WRQQA?eŸ¸o˜lrD·ÓOóóé©çÍ›×ÅÑ”r¢y”rY©| 4~,å$™ J9ެTžZï)ˆª2)(ÕÜ<ÿüó=zôàM„nnnÜbüøñcÆÌŸ?õêÕë´È),,ŒTЉILL¤˜)-íøñãÙÙÙ¹¹¤ÅB¬ ‡I"Vb…$¥ZØD¾”óW†o?åY(!\y9©¹mÛ¶ ¨”C:¥zOPª¹RÇ-”ÖxõÕWûöí;q"MñfϞ͵å‹ÓTTÚ»woTT\\Û”žžÎUD¢²Žçxl†˜ë••UUUIodÛröE|[U%•+a8ógRON“’’ÖJåZ 5+õëÄ ”jn ÔÝÇ­ñÕÁàÄ b)JY¸Ž]=qÛÉ%Í=¢Z9/¿¹Ì¿üüüXC©l ´^¥Püï ¥š(Õ€RM”j @©¦â¥—^úøãGŒÅç¤yz®\¹rÕªUëÖíܹ“lŠ‹û32(6)à¢r½€¯T_”­÷r=·ºZ(Ã^°:õàÛù!B=ùsYÓÇVÉ»ˆKŽ­è ˜”ʲ”2¥š (ÕJ€RM”j%@©¦OÏuuu?ß›{˜sÒü€Ö/,žÃ§ôt©Ò)½WD©Q€W®ïÏ`ª+ë¨ÒÃ$q¾‰.“è¦ :+#–†¥W¬=Eg×9"ã^999ñ†R™€Rf TÓà´JeXJ™RÅŸÿüç÷ß¿{÷!C†Œ;–ÙX¼xñÆ|¦Æn½·QRJ ý•'• ‹‹‹Ù¦rÝÓNdòØ y¿èi?áß•.«ªDY:_J»Ä·åf*ôU`Y™N†RöR”j¥@©ÆJµR TãÐ¥ ©4zôèÉ“=<<–.]ºbE@@ÀÎ;÷ï'•ââ⸆/;;»°PðqìD—2÷ƃ\„KüŤ’ÌôÉ(HOçÕÁÑ–Ì J»øYÅ%GTÂÆÛü*/)!¥Ž?nR*ÝPÊ ”j T«J5PªÕ¥š:M®®3gΤðÉ×wݺu[·nå¶a±±± ;ñ¦|î].;„™b=É-Ô22æ•2<Ò}©2|©©©á0J„S2ö’™tÝ¿*=Y9 &{QðKÓí\à—˜˜¸ÇP*ÍPÊ ”jhZ˜RÇ-¥Ì@©†Jµr TÃòÐCƒ "›¼¼(€Z»víæÍ¡¡¡‘‘‘Zô$§¼¼< XøBÞŠ+.e•C=äøʰ?Ò28±Eb7¯¼QÞµ^lU©×ʲÀ ½bP¦ì9ƒ^Z\L¶S°¥ì¥–§Tª ”(u¿<òÈ#ݺ »;+•áK¾.D«¨8«Ï…uü`ñ,œü“KÀzyzµ>Ѭàý‹úimâÝ•”ˆB¤ôtú‡lÛ¶mùòéÓ§÷ìÙówPÊ>PÊ*­T© @)3PÊ*P JYJYà©§h˜¹ººº»{{{¯[·.$dß¾}ÑÑÑ ©©©\f.Ò{œá3u<ªÐòzr3 TG¤ó8 ÇjÖU`yβ$;Õ)Ä>ÑMZõ^5ß…)áË ôª¿JY!(Ó{Fì¦!+ÑKKɧìììädúQp¸x1EŠÝºu3)uÄPÊ ”²”‚RÖR€RPÊ:PêüßÿõîÝ{àÀ£GÏš5kùòåÚ¢îö½{÷&$$%%‘M¹¹"cÎ…|œ®;PW6 çt¹ß¼UPFzÔt†¯K%øq?¹©ƒï-,”1•¼¿v™jÿøÛýU«õ-"•zÛ QNÈÂóŽŽSÅÅyyyGŠ¢àpÉ’%sçŽ5ªC‡&¥â-¥Ì@©;¥ Ô½¥¼öÚų̂QîîîžžžK–lذ!D›îÅÄÄp†/77—#«tJÛû^¥5C.­Òm7•þÈ¥\)‰¾õý´!Å] áQ.&Œ<×K¶r‚§—ŸŸ–öÉL¡\BÖ_G,øò³H¥Êåt´¬ŒÛ!¤¤¤Ð 6$Ä××wÒ¤I£FõèÑCû ”} ”(e(g(eJ)€R†RwÔɼ­<¥~ÍÛo¿=|¸››ÛÌ™3.\µjŸ¼±mJN>vìXvvvAÁI¶‰Wt+ôÃÔdm·¬ù–Ý LQ«#‘‹Z)NöÑô5)))::00pÁ‚Üö9@)û@©z@)¡Ôa @)3PªPJ`(uÈPÊLëUªmÛ¶¯¿Þ¾}ûG}TÞ4dˆ§§'ÅP!!!‡Ó°ËÌÌä&—\ËW¦µ&b©ÊÊ ãd´*½g¹(Ðã(çœV4Î]Ê«Æò¡'yXoäÓÜDÀ#»CpD%žú\B©z•èUZI»¸”è /Ä»ä7.µ¢¢¢¬¬øøøÈÈÈmÛ|||†ú«JÙJA)(Õ @)(uG¥¢-¥Ì´ÒÃp(fêÓ§Ï`~ýúõì9bÄwww_ß7îÞ½;""&&&%%%++Ÿ)*:©÷6¯Ð j䢪¬ª“aÇ8"Ð1 ì„?, ©ÃÞð)nâR;.§”ÛVÐC8f«`w96’Š^Ö8#7,ê=(Îèyt[ Ñõü~…H•óÚ4ýmàCo8´|ùÌ™3é¨÷ÙÔ? JÝ+­P' (õÛJi@)û´J¥^y¥oß¾cÇŽus›>}: *w÷Å‹“M;wŠFÌ|ØZNNNA vÎðÉ’±¤+ Žä¹jzn¯Ê´µýªÒ·¤ó`–'É“ZœÔ+ÓI¶‡ Ãé’kx%Vö×,“ÅégÎÔÖÖ^¼xñüù .ÐÜ'˜²Ù’´—W{«d3$}âW®ŸJÏš››ËÅç»víZ»v­§ç”)Szõêõ«OÈPê  ”(¥ Tƒ¥ Ô•в”2Óú”jÓ¦M÷î£F¢Á4w®··÷Ò¥KW­Ú¶m[xx8°›‘‘‘›Kã›- / ÉÅR‘ƒ“‹¨Cñà®óèŒ~¾[Gã˜c%S·‡’ö¥˜Ó|¤g¹¶OԵ˘Š%(×_P¨sé…QW¯^Õ üjôFu[e¦OJ©ø ¿z^^^jjê¡C‡ÂÂ6lØ@FfÎ>|øŸþô§_}HPÊ>P JA©JA©;*i(e¦õ(Õ¦M»víºté2tèÐÉ“çÎëååµt©¿¿ÿ¦M›vìˆæólÒÓ³³³iœ‹Â;Þ^!G(g¤yÓ`ç´å6 ï"s.—t˵”¹°RÛ "Vqé:ï ÉÏϧ§æ¼< ñ‚¡PAX„åÛ9y.b/zªÓ§Eùà¥Kׯ_¿víšLžŸ;gzõJMsù.EÞ^_ß-å/¼+…"Ä#GŽìÞ½{ßY³f}òÉo¼¡ú° ”} ”R¥ìÓ”zâ‰'H¥AƒFíæææîîîã#6ÀoÚF¾Ã‡ù ø¬ÂBÔE\·#Ï€—e㬒ì“,¦Z²•²Ô\ð#–reÒN{²2^ÒK½¬OÉ'qWý°‘–“Ûïù;zUÎû‰%ä«W?ûì³+W®ÔÖ ¡åmú)¤¦Œ_…~^ˆÌôq RVFÆÑ£G÷íÛèã3yòäÁƒÿßÿýÆGf(a(eJA)PÊ>P J)0” ·”2Ó”zÿý÷GŒ1uê¼yó¼½½—,Y²f «íÛ·ïßG1Tf&oŠ6d¥¹ì-$û[ê'ŸUòâ­ìkÉVUðÉð|YZ*«ôtÇP'ùY9ÓÇ«¸âh7]ݲ“'ElU\LO-3\QHWÄÖC-š:}éÒ¥Ï?'¥èRË0Öñ&‹ åîG»dÁyÅ‚‚ú›O@‚‚‚–-[6mýyöÙgó#ƒRöRPJ”²”‚R ¥XJ™iùJ½øb¿~ý(t˜?ß××—O´ñß±ƒbêøøø””ôôtÒœÁ–뫜~®Ñ;x™6oð8Û*dÒ\¶ùâ®%z%¬ÒÒäE;IEèu8/^À•ƒ¼Í‚óìô  ±ôË_*´žô J}M™^êÓO?½uëÚµkòè6YYÈ?—í&äÖCÙS4>ÏÍ¥¿‡æ(ÊÏÏÏËËküø—_~ùN”²”‚R  ”}Z¸R|ðÁ°acÇŽ1c†—׊+‚ƒƒi$$Ð ËÊÊÊÍC™gi\h$¦LÜ˨\ŸþIŸLÈ®ÌR¹S§è‹XÚeE¸úG•—çææò­"Ó§OùŠx]—'€¢Ø½°P ñº0]òíB©3g.\¸póæÍ[·xÖwÞ8¤F?ïC®E‹…iýÌxŠ,ÎÉÉII9xðà®]»6m¢?(žžžôY(6ÖÇPj¿ ”(¥Jí³”2¥ ”(eŸ–¨ÔsÏ=÷öÛowîܧO77·… }||V¯^½iSHHHtttZZ×òqæMdø¸šŽ1U˜ËœšôH·ÁKºb ·vàrr¹^[ÂåºS<¤«ªJ8yWP ŠÙ9ÀâLŸXÖ{OÉ™¼\ Ý»TwîÅP_ýõ矓Z²:¿Añsy°,/”yÇâbò‰þµ‡“OK–Ì™3gâĉlÛö.!”²”‚R ¥öZJ™RPJ”²OËSêå—ûöí;jÔ¨±c]]]=<•uò"Oɳ>^X¦×£·”Gÿö€ooošð}ðÁ‹/¾hñC„RöRPJ¡T˜ ”(¥@)û´<¥†_¸p¡ŸŸß† [¶lÙ±cGddLL o1Ýô[*k¶kô³Ø9|2¥ûä&?þV\r´R­ü.[Œ—ëç  Oø‰å "‰Ç?å°JŽwò§Bë–YÆöñyiXT¢óýù%jø¬Žk×®}ñRN?_cœÉ++Ïyu×t$W r×óäC‡è_OĬYY¾÷Þ{÷ò!B)û´¼“; Ô}*UÿäŽP @)3-K' (Õ ÿKA©{¥…)Õ§OwwFAAAÚ™6Ú¡6és]Öe IDATé4Â(†’ékN; ªÌÔ˜9Í}'ysÔ"î"m”ÈdËL}»F =©Ÿè[®ñRíœJ^•1+Dr…!_9Å…}¼Ú+šŽ••Ñë_½z•kûH©7nð~]&Ñ+ dy ÅP| /ýÃCC׬Y3sæÌþýÛÞui÷v ”} ”R`(µÛPÊŒó+õâ‹}ôQÿþýûôéם߸ñãýü¶mÛF:ccSRRÒÒÒô-ð'yª%–je«K™éãÚn©’< MÚÅ…HFKe±ÈZRRÅI?Þò.¶²$0«Á8±ažáUa.€:Åjñ·²l¼LOŠŒßéÓ—/_þì³ÏH©¯4.\¸ 7Äó"/çËëÁPZ¤¨¨¨°°0­’ÏÈ‘#í|¨PÊ>P J)0”Úe(eJA)PÊ>ίTß¾“&M¢aölOOÏU«Vqƒó#Gޤ¦æääp&N¶=QG•Þ5\fú¸†O\çºZ­õdµ~üF~殈ä%·È¤ɳ{ù©9ÍW¡/â–Ê~˜ÜùˆUë»R=Nr; ¡«ÄBñV¸:)õ¥Æ­[·ØñÓúîà =ˆã·XɯGÏZPMFÚ¼y3}žžnnnï¾û®JÙJA)†R!€Rf ”R¥ìã¤J½øâ‹ùËo¼Ñ¹sçñã=<ݼyóë¯é&CU=&d>þäIŠ¡ÒÒÒx'G``àš5TŽ?þõ×íÄPÊ>P J)€Röq>¥žyFô8×N^Ó:îÞ½;&&æÈö)S_×-ÑgFåõNÛ•«·g9©§Érš,b•ȪK—è’ºp='tȉ Û(&ˆül<ÄåÄuËÊõƒuy÷`¥¾EP-WqõãåÅ„‘w3 OØ'~7×®]»¡!&~œï'Ë¿ ü…Ó|ÜË¢Û =z4<|Ë–-K–,™={èСwéy~7 ¥¶[J™RPJ”²”‚R  ”}œO©öíGŒ1wî\íäµ5Û¶mÛ»7–“|Cq31™p+×[„˽5ò„3îsɱE)—/_Ö¿P/^¤Ûk5øçâðÙtŒ¿pÛ/±ÔËÑÍiÍ¢ºñÎ98ºIv “æÊš>-ÇwŠ“{ôxŽ¹è‹´œÞŸ~úéõë×Y)¤¾þì3rºJq¦/77799...""bãÆ+VPpùá‡÷ÿ!J[J™RPJ”²”‚R ¥¶YJ™q&¥ž|òÉþýûsæÜ××wÃúûH#)!!==l*.–ÝäJhÝê.Ã…y¼mã,KsåÊ•ë»\ºDWèòêUÔdÕåËR-‘\×Òìgäu·NëçŠXˈ©jøUXdz™_—Áï.¡ûɲÀ ít;ŸpC/É*Ý`«8]f9ƒÎÁ[¹¾§¸L︞•••œœ°pá¤I“ºuëÖ5”²”‚R  ”}œI©^½zÍ™3gùršð­_¿žÓ|III™™4Û;©õv¨0’|b"ÆèM.Ŭ//¥ŠŒÚgŸ‰A|íûtõÊš’]/Ò²‡½b»juè [%–€yBÈ›OËŽégÏÒí¤À… bâǧ¿±rÚ)jšd LV‹rå yÄ6±T7>ÿü‹/¾øòË/¿úê+miYLbå’þµyyyéé ‡âžçK–,™4©á>jC©­€Rf ”R¥ì¥ ”(eçQªW¯iÓ¦­Zµ*8844tïÞ½G¦¦¦æjÇ튂o®8/ר­Ð•³Rä ý‹y¤~~KCtÿòËO¹–ŽÕâæº^]ÕÃ*™×kké )tù²¬ KÅ2Ü¢k.píàiöJŠÌ—äMÞe³Z?ü—­ÍÅ®]#Á¥R¼ûPR\„.R—ºO¥9Ò¿=!áÀÉøû“OsçÎ2¤á>lC©-€Rf ”R`(µÙPÊ ”‚R  ”}Y©gŸ}¶C‡ýk=FŒ±p!ÅPÁÁÁû÷Sü’’râDvvv±¶…CtmÐ7>”Ë<î"qIëá@Q )ô7~øáûï¿ÿî;¬¤G+³ˆ‚ºO?¥qÌvÑu°hDóxÉöë×éÊe-Å~A_%®•–±bg´]"²i™€Ã-.”å…bµ¸ªŠîO·rìÆ6}ʯ~Cç³Ïèý}ûí·œ¢/Õ;­—ð™Š'NðNޏ}û(¢ôõõ3gòäÉC‡ýãRöRPJ¡T ”= §mÛîÝ»6Œ›yyy­^½:(ˆ&|111ÉÉééé|®è5Ä]Îyû˜…]ºô™>k"…þþ÷¿ÿøãÏÌO?ÑuR‰ç|<û»Å—_êZ|….oÞ¤ËÏ9éöÅrÝ•¯‹ÙûÅߊB&-Gx‘U»ÈsE¶M¬ óê0OôÄv|žƒò6|Nó]áç5HzòQ¼Ïúè%y+60ž<™ŸŸOFŽ#ŸöïßèéééîîîêÚ«W¯üì놥îÔIJ5ŸRPÊ>P J)€RöqD¥^{íµ¡C§N:oÞ<Ÿ+6nÜH6EFÆÆÆR¡õ>Êç¥]‚+/Æ^×"¦ot‹~2`•Dõ­©"¨¯¾vqæôÍ7ò'uܺ%ÕèÞ‘x7®Â“UydYÅ_X)cqÆ“‚䑨äoµ{^ûT‡×œåê³HB~ñ½%z .:;rrŽ?ž””»oß>ÈîîcÆŒ7nÜ Aô5ð¯ÀPj“iÙ*€RPJ¡ÔF ÜIö©U9¥ ”‚TÊôµuàˆJõíÛwútooïå\θk׮ǧhM|Ú.w §ñG|ÿý;ýùñÇŸt›¾ûî;Ÿ_ÍwþžíáLúwßkÐ]øç,$]!+ù't“¼d¾ãÔ;[ÇwfÅÈ/NÂß”°"œ›GX1^®ce†¼Ôü{ÄvÉÚ>z2$òñ¾yyyÇÓ§¾c‡¿¿ÿ‚ zõzë­·Þ}÷Ý^hø_”²”‚R ¥-p·‰_ë ¦I©Ç{ìÑGßxãaÆͻlÙ²uëÖmݺuïÞ˜˜²)/¯¤¤„¦L׮шãUÛÙMÝ"þ]’ûyAßj¦|'”ùAƒ%Ê™A¾Q\²|É7þÀOÁ—bÉ_ØJaÛ×:$+Fèž(ä'¹ ©–‹Üyb'TÒfŸ³‡búÈë½l-Ý™þvM²I;}7tóæÍ«W{xxМ¯C‡ÆûU4œRÔ[æj @)(¥ÀPJ¢TIRH¹˜oÇį9R¨Ô ÜA—z­Qê¹ç:wîÜ«W¯áçM›Æíè7Åi¾ÈääÜÜÜÓ§O_½J‹´‡GÿßtäuqùÓO?òê._Jµþ®å6ø‡ÁÿÓøå—_èÛ_t~þY\Ê»ðýÉÞüƒŸÿ'~i•¯ïôíúª§¿åUczüjÌ=°®]¿.—¿Véˆ^܉žú³Ï¸æ\#==111::z×.úLV¬Xáá1yòäÞ½{?þxãý> ”} ”R`(µÞPÊ ”‚R L)!S«ÊO8‚R?þx·n@¹¹¹é‡¯­Û¶-<<<999??ÿÌo4t9p"EØ"Ûp`$}úùg¡_ò:ïzyß/ÿú׿þýïóâ¿ÿýÏþó_ q©ßø_¾òÏþó_ÿÔaõ É~–/Á_eÌõ7}ɸn5™×‹¿ÒRâ¢òP˼ÉëÇ"YαZŸëí&D²þÌ™¢¢"òéøñãGîß¿Ÿ‚Ê€€åË—{zz²OlÈ­¿¦á”z µ%ü ”Ra(µÎ­K™»áJ½þúëƒM™2…†ËÚµ›7o¦›‘‘qîÜ9tzîGc¢÷½¾D+'vRaÏO?É)]' þõ/òE¨rÿÐóг±_l™œFŠ !'¿×I@}x‹Óœä­_pñ;ÏõD1¼¼üö[zèåË—µ9rRRRâââ ŸÈ&yóæÑ¼xРcu·PÊ>P J)€RöRPJ¡T€ ”GPêwÞ?ž|âŠóÈÈHIee4Üh’¬’,¸ãš;±XË™QŒ%üûûß)æ*..ÎÌLMM=xðàîÝ»7n$ŸÜÝÝÇ9rdÿþýïç ^«Jù[J™RPJ”²”‚R  ”}š]©6mÚÐ0Y¸píÚµ¡¡¡±±YYY/^üöÛŸ9^/:5zú¢.§ÍÍë¶úàþ…U⤸Ì7.œ”¯Ë¯ÿü³“ýôžÈ¯ü 9¿.*BF]ôó[·*++ÓÓÓãâȧ;vpÞ|æÌ™Ã‡ÿóŸÛ¶mÛD¿C©µ€Rf ”R¥¬òëuìfVªmÛQ£FyyymÜ]P ×ueËïŒÍ‚²µ¥¨g•ä„ ‹Äz¬\¯mBþýoa3§–kβž]_«Ó²r]ïÔôÕ­[bi˜}¢Ëêê´´´ØØØÐР  +VÌ;wæÌÑ£GÓä¸)/PÊ"Š –P J)0”ZcÖ«”j7”‚R Z‹R÷ùΕuöͦÔ+¯¼2lذٳ)XزeKxx|||qqñ—_ŠJoýð]½FrŸ è)¡÷»ü‰ÓmÿääÛ/¿Ü›O¿üríÚµ‚‚‚ÄD ã6mÚ´u«è¾™“C·“%Ö•«ÉQÕWJÖÃëëÀûÖ —ó‘Z$Òåùóç?tèÐîÝ»/^|xÓ–ôý C©€Rf ”R¥ìÓJ½ÿþû£GÓHY¸páªU[¶lÙ·o_l,MøÒÒÒŠŠÎŸ?ÏûÈå„ïs½Y¤<ÂóK¾Ód4MûõŒ)Ô÷|j›ìS);#1<äp( ô6IY~.—v剦?½¦yùZÚ$lûöÛëׯ—••%%íÙ³'$$dãÆÅ‹Ó4kÖ¤I“ Ôä‹»õRöRPJ¡Ôr @)3P J)0”Zf(e¦Ñ•z衇8u* —Õ«WoÝJ#(666%%++«P;v—ÛA~+;Eòil•PëKíw>W´çKyü7z7§¿çR99Ž9Ý&ÏâvIn/V—×nï?|'Ž™HQ~Öè1“©%§øjl=ü›éÝñ’òµk×JK333éƒØ¾]ÔôøúNŸ>}ôèÑ#G<¸K—.>ØØ¿˜;¥ì¥ ”(e(¥J-µ”2ÓèJõìÙÓÍÍÍÛ›|Ú¸qcddBBÂñãÇóòÈ§ŠŠŠk×DçHΜ“E|^íR,ýxq¾Ù§ŸÊÃÍ„j|¸¯“r¼cB ^=³þƒ<ÊMÖÊ¡/‘çÛ0Böo7íÔ0ÃéqÃ[±©þ»Áúq¾?è}ÆDÙ 7!£Å¥Kååå999G8p`Û¶mË–ÍŸ?ÆŒ®®Ÿ|ò ;¿ùæ›?üpcÿZ”‚R  ”}S©çž{®GWW×Å‹oÚ´{÷ˆcÇNœ8‘——WTtêÔ©Ó§OóÔ3|âhM>]ýÆ<ë“§mŠ#9¯hðñì|þæMã(NQ¸ÄÅë_i_¿‘{ëÒF¨À 9qyû)oR=y9WcUè&~6Þ¦O~ð¥°Hoái>æ´Þy#¤ÒµkgΜáÆÌGŽŽ Y³f‡‡Ç”)4ÛëÝ»w·níÚµkÄßÅ=b(µÄPÊ ”‚R  ”} ”R`(µØPÊL£)õÔSO3fîÜåË—ó)lñññ©©©™™CÑÈ*)¡@ŠÔá\Ÿ œØº‘F L7˜+W.^¼xùòåÚÚKÌåËô¥¶¶öêÕë|Lû2Y(Ö…93(;+ñ’ð-î?ÉiAÙÉB” Êš;é¢él8Ó’²lÚħõ¤7uM1ØFŽäHpú›påʹsç(|*,ÌÎΦ 2"bÿþý;wî\µjÊ”)ï¼óΟÿLxëw`(e(¥@)û@)(¥ÀPÊ×PÊL£)5bÄú°¶oß~àÀݧ̂‚’’ £*+Ïž=ËKµ"S.óãHÉ+ä ÙtîÜ… èòüyœ~iR‘_µ×®]½z•ìºz•b,ºËtÿϵ ŒTã$»TŒ¬¯yK£Ü/ò•ÞÜB.‹ë ?D|˫ʼ¯ä–Þ»ü{=8“òˆLÆdßjOè-Ð;¾¦¦¦ªªª´4???777=b¨ØØØààõë×ÓŸ™iÓ:wîÜXŸýý¥ì¥ ”(eŸWêí·ß:t¨››‡‡ ž;£¢¢µÅݼM¨ÒÒRšUUñ¬ï[.<úTƒ&zŸj«¹Â‹7xXjÕÔ\`Ξ=Ç\ºtæÌº^[K?'µ._&ߨ:R‹'„¤Ï 9sø¹žA¬+pâ=ŽÂ6>Ý“o{ó¹ð‰\–Ûô¹ü‰D~ñÄД¤oyVøvú½Þ%~cÕÕäQYYÙ©SüåT^Þ‰'’““cc###wíÚåï¿páÂI“&ýå/ ýÁ7(†R‹,¥Ì@)(¥JÙJA)†R>€RfX©7ß7nÙ´rePPО={L" xë½E¶è<ÇLÕÕ•••¤}­¨  Å‹'OÒŸ‘ÔÔøøx¶iË–-ëÖ­óð9rä»ï¾Û°{ƒ¥ì¥ ”(eŸ>J9¿RõÃñ¶”2ÓÀÿKõê5gÎ???í¶ð¸¸¸ääìììüüü¢"Š¡h°•—Ó°£Axõ*‡ "yÎ6}®WøÑ ŒNk?4N«ë Ç±bt;ý”ý¢!­}wŽÃ.ú!«F·_Ô¨e®\¹ÌáÖ¥KWØ6KØÅ¯fZÿrCßTR׿‚3ëtGxø ð[UUÑ_ ºd›èzòäÉÜ\Š¡RSSãâ(€Ú´iÓúõ+W®¤¿5cÇþéOjØÏ¼1€RöRPJ”²”‚R ¥¼,¥Ì4„R<òöÛowëÖ­k×®ãÇûúúnܸqÿþ„„„¤¤¤Ü\ò‰B M¦òŠ 1òhrœÂJ‰A|ýºPëúuôÕZ&ºš·çÏÓýɦòrºÂ·Ò1¤ÙºÓ:ü³šP"ù^[Kƒ_äÙ™³g)¬¢Ÿ×jÁ—²Ø¶+W¯Š>+uÓ€«88Ï“€m¢ëôoâšø›qòdAA—ó‰ÃmBB(€Z±bÅ¢EóæÍ›8qâ{ï5ÀÞøJyZJ™RPJ”²OC(Õ½û˜1c¦OŸNƒfÙ²àààýZÝyVVVnnîÉ“§N*/>ñÄ ñÎÍÅê.Ã벜±«dªªx=¸ŠBJVñÜŠ…¬¨`¿ÊËÊè’Tâq^© Ò8çd"ICß²lç Μ©eËÄôðüy^-7±O¤Oì8H—ü†ÄôñÜ9~>B¼;öŠßJ9Ïdùò$Û”ŸŸ™™™˜˜ÈÇÂÓß??ŸùóçÏž=yòä!C†tèÐxã¥ì¥ ”C) @)3P J)€Rö¹¥žx⡇jß¾ýÈ‘4fV®\¹~ýú;>|ôèÑ´4^EEE, :öƒÆ;§í®_¿Îé>£(†úòË/yå” úÄ`e…"l VÎvi?ˆ$ ©Ò~JwæqOÒ°jôs޲DìÅÖY^ æ{qá ˆ©d¸ÅûF®òn³ä~Î< µ4KT!UbëɧââbŠ¡´_\xxøÎ«W¯öòòš3‡¨qÆ ëÞ½ûO4ذoL ”} ”R`(µÐPÊ ”‚R  ”}ì)EuíÚµW¯=z 4hÚ´åË—…††FF&%%¥§§P Å™eq&¥8-ÎÛ&>×ûŒqaŸhÑ ýá]¿%ÜžBªtJC¬ûjwªâqMƒ˜“Ùô-Ç:¥ gÖùU9³^ÅW•V!XÃðj0]çKŒ­´Â@±¸–·Žðª±‘¤¯bueXÇïN¨TP“““–––³wïÞ]»vúúúΘ1cìØ^½z‘J={vîÜùùçŸoà¡ßXJ-°”2¥ ”(e;J½ü2 “#FŒO“šóùùmÞ¼™FRLLÌÑ£4ùá&H"½Ç>ñð«Ò‡> ZNöñ>Ã<áãb*ÅëÀl£˜åÑ·ÅŬd9+Fœ³ßÿ¾¡G}£¥ì¥ ”C©ù€Rf ”R¥ìcG©¿þuذaS¦Lqw™¾àà}ûö‘OÇŽãsØhœéeçb‰·Ò ºú*¡sé/ò^á0ªºZÄN|ÉVUÈq«ÕÍi胺¼ @ìbäp‹n×{•ÊñN p×¶L¼$ßÎJ‰˜ŠàØHäy5˜‹ÙÏiÝÍdFðM1”)–ºz•B²²™ô†%*ñ„%|·dí‹(b­Ñz Û%î,m–Iv¹_„E«¿3É]¼¡ñ,ç×eÒœ‘ÑS¹WójmÎé¯ýÛ##wìØ±|ùr²iæLWW×É“'?pàÀ·ß~»Á{ӥ쥠”(e;Jõè1aÂ>4’"""ŽÉÈÈàÝðE<è9Ó'.õÙžX¥qzá‚è=Ä[äix挼 Zž3ŠÇq®à¹¶…Tá9%:•ÉJõªª“\ï®M«x¢X©×,‰YÚÉ“rZ-k—ø‹¬U:Ç;ìY%.‡’» Ù&1W”O¥¥5rs333““““’:ºiým¡Ið¬Y³&Múä“Oú÷ïß«ùÔügîÚJÙJA)†Rî€Rf ”R¥ìs/J=üp§Nzôè1q¢§§g@@@hèÁƒ=ªq#ÊÎiЉhÅHó‰î <‚¹3’8›÷æMq‚fDÇ^tWŽ™Dí^q±ð‰#$Ñsˆ½¡oùG•Z;"‘ñãr Å>‰t¿4_)cH=¶oäg*¨ IDATL®æŠ V\i.}kÓÆZ²\xý.ùd›¨¨¨={¶lÙ²víZ­à|ÎôéÓ)†9²[·níÛ·o۶ц{S¥ì¥ ”C©9€Rf ”R`(5ÛPÊŒe¥Úµk×§ÏÈ‘#)ŒZ°`Íš5Û·oަx‚wrœ”…wúÎ<1r9|VɨåæÍo¿ý–›LŠÅTþ9Ç'"ùÎ^Ò³•—“¢§ä‰2¼ð[XÈ­òe; M®bN–‹ä::ü$"|“ᘞ™¯àXŠÞ¿*}1%ÑÙ#Θ׭ó·üO ‡jš¶‰ãÄ ^×Mæ.ç!!!k×.Z´hÁ‚®®ôÁ :tРAÝ»;äÙ»÷ ”²”‚R ¥4ùPð€Õ“;^}õÕººÎš5kþüùK—ѼGvgÖç[¢û¥I)žEUðîuÞd^[[Ë-1iÚW[+¦X¼¤Ë*qOäD:M´äM……b\jн‹Š„urBXXÈ™Æ2žõѳÒœá“>Q`$E’[ ¹Ü\–K™Ösy+&|ü¢™™™ÇŽ%$$DGG‡†Òàçç7>ýüðÃñãÇ»»Sè°jÕª  ˆˆ£¸»HeJës@#ßàq{ùòeîŒtõêUînÎz8•sÈ$2wlSQ‘Hç•ku…lÇ©SE|«\–»ù’.kþêÁË6ìü…÷ž•KºüÖLÈ7ÎÉA~Vn,Q-¶ÆÆîß¿çΛ6ѧàîî>thÏž=_{íµFßÍ€¡ÔL @)3P J)€RöRPJ¡Ô @)3Ö”êÝ»÷Ô©S½½ýýýƒƒƒ#"’’’222dòÜèYa Nq©·“<ÍÛ&nܸñÝwôåâÅ‹¼®[©7—”ÉoÈ„š•èˆX‰c*öIÄR¼ÔK–ñ¦þ‘xtQÑI.ë“ûCdy!Ÿò+6qðÒn¥¾1‘·|Èw]¢w´儜·§*%åСCûöíÛº500påÊ•¾¾sçÎ¥àòµ×ž~úéFÜÍ”²”‚R  ”}¬(õòË#GŽ\¸pa@@XXXLLLrrVV§çÄú¬\×e¥x·{]Í·v ÆY^W=þü—_~yëÖE>,žskZëL1ÅâÅÜ2ý\NöHÌòøYD*IË ´Þ›E¼Q½ @T¤s;+'ìæõ`6Å”ÙcµÎÈ$ŸœíqWfÎ?–éeNb—••Ê'Âïß¿uëÖ7®ZEŸÂرc‡ ¡ ßC=Ôè#»Ù0”šn(eJA)PÊ>P J)€Rö¹«RmÛ¶7ÎÛÛ{Æ ºOɲ ’Ì­é‰&D¢ZÎ8ÒV â³g¯]»vëÖ­O?=«±Vª÷’Ñ‹ô$?Ÿž’.9:Åí%%…úên~~~nnni)]ryŸ¨õ“ê°àeZ);ûtJn&䮿²ÕåiN5Ê¥]YkÎ ~ŠEÍÏÇÁÇÄ„‡‡‡††nذlÙ²+VøúRDùÁ4Å n^ ¥¦YJ™RPJ¡ÔT @)3P J)€Rö¹³R¯½öÚ€¼¼ÄI7‡%&&fggk‰ëb™ñæñ,ã’*ù-ßjýÈ4ϵµ7nÜ Xêòe±BÛXÆû åS‰ÁÌ×yC£¸· аРúòòò EmŸŒädxÅ™o¹ÚÌ6‹®R-Ùà\®çVé[Kd…!¿zêZ‡sú‡>|84tÛ¶m^^3f̘9sæ”)ƒnÓ¦MëfJÙJA)†RS,¥ÌÜY©>úÈÕÕÕßïÞ½QQQÇŽåääpYø)½õe]¦yyèŠ ŸâÉãXäÚjk?ûì³ëׯ_¸ ŽêäAÍÉ9!§óÄvû¢"žç ¿è&Þ8ÏkÊB)NÇñCJô=ôr+¢lkT£ÛsFŸóÕMøêu>bûJuXåâ'²²²hf{àÀú²qãÒ¥KɦQ£úöíÛ½{÷.]ž}öÙ&ÔÍ ”²”‚R  ”} ”R¥ìs'¥ž}vÔ¨Q4¨¶m;xð`RRRff!ïÔRc¢;¹Èøé}ÄyhR­Óò$w^å½zUÔöigtTË•V×2r®Ñ…{ô-×ìqŹè‘.—€¹l½R?™ƒ#º“|IîiÎÇÈWo©.†2zœËÕd.7ÏæÎGááá!![·nݰaƒ·÷È‘#_}õÕ^h²±ì J¹YJ™RPJ¡Ôd @)3P J)€RöùM¥:vì8`ÀÂ… 7oÞž˜˜˜¥-ðÊ&”•zƒ Cñ`•µ}"jáÖ²ùdmmíU ºä=ň‚<^\•™p™Q/Ðvˆj;ù#ýhÑè§€Š;U”hûJ*¥:ÜUB†q•Z÷Ë ý„`yY%›Šée…§ø)y9--->>þàÁ°°°   µkW®\Iÿö¡C›r;PÊ>P J)0”rµ”2£VªsçÎS¦LY¶Œæ?ášP4)¢q.›OʃÕ9kVmÀ³-Y„njL¾+W._¾Ì[åCÅâ*{Ãý.‹x‚ÇŠ1òxŽr½ks1a…Ë\ˆ$'zò’÷ŠëœÛ“?¶ªTîèçW¥Il~>wcNך]ÆïÙ³'(hÕªUÞÞÞsçN:uÈ!-t¡ ”} ”R¥ì¥ ”C©I€Rfê+õÔSOuèÐáÏ?~þ|"ôìÙ³]»vÍ4ž(e(¥JM´”2¥ ”(e³RíÛ÷íÛwĈcÇzyymÙ²%<ù|B%ö…Õ©äÎ_œ!pXÅ ×äK˜Ô•ŠÉü+õ%ÝJ½’PøD1TNNVVÖ±cÇ"#8°cÇŽ DÒ|òäáÇwéÒ¥ÙF²Ã¥ìc> JA©ßÝ~Î @)3æÿ¥zõ¢Iϼyó||Ö¯_OƒOЧùçÖx¢V®'ûÄ¥\ò5dªÑwÉ‹ôÛ¹sb gþjù°ã¼N‘Îã2ržà‰Îܵù”Þ‹YdöØ2~j²“WsåKUÇ¿WëG®IÁY%Ù°SÔ8q…{nn.›Çr/æàà 6Ð wþ|www77·þýiæÛlCÙ‘€RöRPJ”²”‚R ¥Æ[J™©SêÕW_1‚|òóó ‰‹‹KKËÉÉáCÓD®M–õé>UÈ}²À›—VMûþ¸3]aµd!]ç¤_™Ž(àÓûb–pÍ9÷*ª Úô@NË0M¯!a¿S¥¹ì=ÁâÊÞb+cnnzzzjjjRRÒ¡Caaa,®^½xñâ™3g6tèÐ>}ú¼ôR3Žb‡ÂPjœ ”(¥@)û@)(¥JÙ§N©.]ºL˜àíí´wï¡C‡(Œ:qB¤¯9°©Ô7ûñH—És1Þkjê¢yø «Å °OçΟ7eºÙB駈©JK«Ø2éÃiÍ;ÙÀ\ô)“µ|·7’à%\¹zÌ©yá Kÿ€¼¼'Ndffr±ÈÈH²)88 `É’% Ξ={Ô¨QíÛ?òÈ#Í8€C©±€Rf ”R¥ìS§Ô‡~8uêòå˃ƒƒ££?·ŗêK°¢Úˆ}…Qޤo:¯Ô%½š…bºgX%žû™J…ø[a#׊³b©—KˆxŽ(gy§åÆw™Û“³<á&_ò’p¹>ç#ŸhæzüxJJJ|||TÔîÝ»éÆš5k,˜1cMX† 0`@§Nšsð:&PÊ>P J)0”c(eJA)PÊ>B©_|‘>™%K6mÚ´ÿ~­R&·¦I9=ÍW.ËÇ¥M2Š1h?£ÓQGMh…©›!b¡*~=«ìcɹ<Ù³â,ç ¥°ò5#«Ô…*×Ã'^:>É*åååqÏ£ää䘘ˆˆˆ={öÈu]ww÷‰ûöíûÜsÏ=öX3\‡ÅPj´ ”(@)û@) JÙGSê•WÈ'ŸÀ@Š6bcc¹°Oìçàæ“2jጷŒ†hœs&½¨–›ÿdrŽ©ØQãwúôùóçÅM¬œì›É¾ñCD9 Ç`|½®jO®"×ÔÈŽa•zŸ(äw%NkãîšÅÅ@¥§§§¤$&&Òˆ-[¶øûû/]º“æÓ§O;ö£>jîQëÐJ²”2¥€(e—víÚõéC“¡5kÖìÞsìØ±Ü\Ñ IïÎ\eT Wòf>^í•*É´@¶)Ò½8-svR¾”…J¦©Ìg¾Wëû «ô]î™Ù«Ôû3±õr.Ó§O÷õ¥@ŠÔTö©˜G*[T®÷“ƒZ2•rÈ;5ä·B¶MÖöÉêߎ™d8vN;Á·^R^N²v¯Rïr&”â|ZŽhlž™I`BBï×åB‰¥K—zzzΟ?mÚ´!C†´oßÜãÓ 1”f(eJ†RC-¥Ì¸Ì›7Ïߟf}4(Oœ Ÿ*´š99Ñ«Ô}AÙS®ój=’jäRo%÷¯äëü­Xò5z¥Ëšry¿*­Á„(¬ÑŠÌ«ôge„²²°\Ÿöé¯_©Ÿ%’»\¦¥¥¥§§9ÂgoÐt/00{›Ož<™÷o“O;wnîÑé”@)û@) JÙ‡i€RÀ þÉŸXJ™qñðð <|øpFFFQ‘XÒ5ê<Ô £ô†Uzéha)lÑÓ~Õ2“gXÕzã±nË×ù¡â~l«ôHVŠu]¶‰Â§üü'NMÇŽ:t(""b÷î 6øùù-[FE†Ã†uêÔé½÷Þ{ÿý7ß|óÁlîê”@)û@) JÙJ†RC,¥Ì¸Pô›™™ÉÉs¹©C&Ïy\Wéë«ri·‚Ã¨Š Ž†*ôô¹)©nBìБÝÍ|¹´QPÒb¹„œy«nqaa^^‰ÏìÒŽˆØ¼y3©äå5fÌúS9xðÇܵk×§ŸnîñØ€RöR@¡Ô` @)3.4k:x0++«X;Ä]œuÁ­*ôÍ~r¶ÇC½J¶´4fküS¡šTªÚ@Ÿ VÈ9¢žË«”eå|¥J«5*/—‹Ö–ôÃS »A6ee?~üÈ‘#‡ïß¿ûöíkÖ,^¼ØÝÝ}üø>}ú<óÌ3Í= [PÊ>P (€RöR@¡Ô @)3.Û¶mÓyµU^9¤%r|ó™{“˜2~ŒTH.õVêìÖ¯,7ì¬Ð/YY)o§pŽ®ó½'Ožd›(€JMM=xð °¸fÍŸ3f¸ººŽATsÁ–”²”  ”} P`(5ÐPÊŒKhhhRR~~>ïç›:¸‡Û$ǽ ˆ*ô¼¹PŒ2ÉXʤ»'Ôª·~ËMÄäóq U¦¿½0o.9Åë¹@Qø”š¥e°r%ÅPžžžS¦ >|È!={¾òÊ+Í=[PÊ>P (0”`(eÆ%2225õ$7EÒº-×g}u;¥eìƒLÛ™fq2Ç"ÉŸšæˆÆT¯®È]*$Ïêå%fz|æFnnnFƱcÇâãã:´wïÎ;¹§ùÌ™3ÝÜÜ&Ož2eÊèÑ£»tyûí·;vìøÜsÍ=þZ ª”ñc—Ö ” R©:´oZSP (0”êo;zR·ùªØÄ¸Ð ÍÎ…ÞzzO´À”[Ëõ2œâÛkød󩽕Ò6q>Í­BožÄ7É|¡Œ¡êz™³JÅÅEEE¤RNNZZ÷4‰‰ ß±cG@€»»û„ äÏþð‡·Þêܹs»víš{ÔµhP©:—\ÌWZ0P (€RöR@¡T? Ü‹R-ß)M©¼¼S§NI…8ª¨·ÿOö ¾ðÏùþÕz¹_'ÉËõ} •z9 i)—(òå±qìÄÍÃH¥üü|n$AáSlìa®á !™¶lÙ²víZŸiÓ¦Q üúëÍ=ÎZ†R’¾ ê~XH¹Üv;”‚RÀPJ¥Ò¯ÔºË3_´x£p‰ÍÏ7JÊe’nˆ˜ÓÉË ãÌÞJ£E¦œÝUèÝ3yi·Boo$x«ÇÜÔ’ËËI¥BmWaVVVFFFJJ|||DDDhè®]»¶nݺnÝÊ•+-Z4oÞ¼iÓFݽ{÷§žjîqÖŠ€RöR@¡ÔÇ€Rf PÐJñe 3JJ>à—WªŸfŠ•äzmXZcˆ*yßhü°š3|åæ>–ÒIq}âð‰§"mA7'''333%%!!!..îàARiÓ¦M7®_¿žlòõuww§jêÔ©“& :ôƒ>xôÑæg­ˆFQê_>§GõïR@aA ´4Q¬¥€E ”5\•À.aaa¹¹åzá]…¾ÿ¢B_Ý•±ûTk"ß$ýª«ÃÒF¹‰£¼\ÄNeeâ@Ýü|ŠÒÓÓ“’„Jûö…††ò!6Ë–-óñññõ?¾««ë˜1#GŽ3f̸qãFŒ ©Å›8^·I1”êmV¬”˯Ëë¡P¥î…Û–ºýüüRSÅît}ÿa¹áƒ˜­±j¬R¥¾t[ª#n—5F2Y(3{|ÈF1'÷¸¼<]#%%åèÑ£‡ïÙ³gÇŽ›7ûûû¯^½zÑ"šâ‘E£F‘?O?ýô«¯vëÖ¾íׯ_Ïžo½õÖ£˜ö5)Pê·¸½4„oSßJý œz‡áô²@kRJþ—wJÝ ·)EÑʾ}ùùùœŽ“™:a‹<Ë]®×ÊØ‰Õ+Ó{SðM2c(b'..*åk±SvvvJJbb"72ß»wïîÝ»µ#uýW¬X±t©‡‡Ù4xp‡H¥'ž¿TöêÕ×_ýlαÕJR–PVC) ÀPª§Z­RB¦Û3~P ü(e‘_×#=àÒ±cÇÅ‹hüóŽ Q‹§oÂ0…S3ÉÛåèRÄLò Ý|'222H¥£Gããã‰Ê1RöR@¡Tw @)3P (€RöÑ”zï½ &ÐŽŠŠJLLLOÏÎÎ&µ èK~~>GIdONû“™)úWr›°„„„øx^ÄØ·oßÎ6lX»víòå^Œ‡y4gΜ™3§L™2bĈΛ{°+@)û@) ÀPêC @)3šRO>Ù·o_777Ÿ€€€;v„‡ÇÅÅ‘*II4•#uRRŽ9’¤Ã[cbbH¡={H¢={ö„iÐ,oݺuË–yzz’Jóæ‘B'N;vøðრêÛ·gÏž:uja(ÕÍPÊ ”  ”} P¥ìãŸàOÇgŸ¥€güøñ ,[¶lÉ’%Ë—StDÖ,_îÏöøù­X±ÂÏÏoùr²oþü Ì›7ÏÝ}Ö¬Yô8úpßy§W¯^dÓ»ï6Ûh €¡Ô€Rf P¥ìãRï“|õÕW?þøãqã¦OŸN–ÌŸ¿hÑ"//¯iÓ¦L™2mÚ´ \]]gkLš4©ÿþ}ú a† :tèG}ô‡?ü¡™Fh` ¥ºXJ™R@”²”  ”}\nÿ0;uêÔ·ï°aøOå˜1cFŒÑ­Û믿þÎ;ï¼ü2JÇ9rÀ€:tyá…_|±iå q1”zßPÊ ”  ”} P¥ìó+¥ˆöíÉŸ÷Þ{¯cÇöíÛ?ýôÓÆO}ôQR©cǶØ:ز1”êl(e†i¸íó„R­šú'w¼g(eFõ¿hõ@)û@) JÙJ†Rµ”2¥€(e(@)û@) JÙJ†RïZJ™R@¡Ô;€Rf P¥ì¥€(e(J½m(eJPÊ>P (€RöR@¡Ô[€Rf P¥ì¥€C©N€Rf P¥ì¥€(e(Ju´”2¥€(e(@)û@) ÀPê/€Rf P`(õ¦ ”(@)û@) JÙJ†R¶”2¥€(e(@)û@) ÀPªƒ ”ÕÉ USÿä(u¯@' ÀPê @)3P (€RöR@”²” ¥^·”2¥€(e(@)û@) ÀPê5 @)3P (€RöR@¡ÔŸ,¥Ì@) ÀPJãŽ:™k-ÀP (ÁÿRöR@¡Ô«€Rf P¥ì¥€(e(Jµ·”2¥€C©v€Rf P¥ì¥€(e(J½b(eJPÊ>P (€RöR@¡ÔÿYJ™R@”²” ¥^¶”2¥€(e(@)û@) ÀPê% @)3P (€RöR@”²” ¥þh(e‡á€Û¨”ºW P`(õ¢ ”(@)û@) JÙJ†R/XJ™R@”²”  ”} P`(ÕÖPÊ ” ¥ž·”2¥€(e(@)û@) ÀPê9 @)3P (€RöR@”²” ¥žµ”2¥€(e(Jµ±”2¥€(e(@)û@) ÀPê @)3P (€RöR@”²” ¥ž¶”2¥€C©ÿµ”2¥€(e(@)û@) JÙJ†ROYJ™R@”²”  ”}pr¸ú'wP (€RöR@¡ÔÀRf P¥ì¥€(e(@)û4ƒRk±£¾±æøÕß[J™RŽúÆšU©‡,¥Ì@)G}cή”ñd.­A>(eà¨oÌÉ•ªóÈÅ|¥åò[¿®;ÿïòKƃýÁ†RZàŽšÔý×äbúÚ’Rx°êæºñqßJÕY¥þ÷„;̓C)Å•Éoý ï2=¶÷¤x°³<Øå.?·ý-ß(q·qoãã·†”~ƒù‡M1¨hÙ¸(¿ØÄEñÀ6÷˜î‚Ëm—€ûBf)T¹ À=áˆÓj{;ü¤€â€CÄÅ1¥rÀ·Ç(ŽZ'íxï8$7PåhŽã½#à¸8Ú¦iVÊÁ>)à˜ð(q¤‘â¸J9Ú')«”ÀQßhF”»kg¤8¸RŽûÆ€cá8J§Æ°ƒ&Ñð“‰ã `—º/Ž…ã}RÀ!qÀ*Ç{GG}_ ¡À™34,.0Ð'Ù²GIDAT €FР@)LühHž AqÔó¥@ƒðÿÖÌÛÙY¼IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/surfpart4.png000066400000000000000000000146241477365367100224210ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?íIDATxœíÝùŸew^×ñ®ÿ`P•T¶Q@QTDv‘Mve0ŠË HØ‹‚Á°C0C'™,¤'!&™Ng2“t‡Ç ˆ²(Ê" *Õéú~«úÝ]Ÿþ¤ªî¹uŸÏnUÝêS÷tïëqÏ9uîýž:œ[\ÛøXå^œ­eWº¿ò] ¯ýÂ#©ß+8â¤Ö¬XIY8ݽ;>Ô©õz””…ÓÝ»ãc I­WT’²pº{w|ünÁqŒ÷õ9b;à7~Vð5K]±Ul£Ýñ±œ¤Öå©JRÃRWLR—jZ‹¦$5,uÅVšÔÿ/8ê3~Ó9ý£}¤C!©a©+¶éIÍÃõØ©o©Ãˆ•IýNÁ: ôã#)‚E%µµçÃâIŠ@R}’"IývÁö5¼PR‹IjgŽöÇ6IHªOR#©ß*X³1Ä$E0’úGy,ut?ú¨HŠ`9ImSG÷(‡JR‹Ij IŠ`$õ $5“¤ú$E°¨¤ž?ž:Ú9<’"IýfÁÑÿ]jkÎýIê„Ëxë ×ÏïŽÅ$µ6MIê„Kø¹ xÇŠÝññ’šIê„ ¸°Í˜Ôº%©“îŠI]uË/+©‹ç'ŽöA¤N´«.»sº½Òr»ããÿ¬Íh?’:ážïg×î]WmJR}’:á®|,%©£!©î…Kýï‚£?–Z«ËfÓÎ6'Çwü®¸Õ÷N†³„¤ŽöÇ69p/ôYê× $5“Ô w¥¤ªê•Ôµ’Ô —öëÞÛ—TŸ¤FRÿ«àȧl;⟸$E°¨¤ÖíŒßª7K´¨¤ÖŒ¤FR¿V ©™¤FRÏùÕ«8–]²ç¦@<êÇ84’"I]-§Ý¬ŽxŒnyqënYIy "ko$õ+’šIŠ@R}’"X`RëR”¤HFR¿\pôWO8ãÇš[VRëôƘ’"IýÏ‚5ïÇ@R’ê“Áb’š¦¿^—p%E0’úÇòz©u)JR$ Ljmš’¤ú$E0’ú¥IÍ$E0’úf’"XTRku…Ÿ¤ˆ–•”«'X{#©ÿV°FãýHŠ@R}’"TŸ¤$ÕgæöÙ;sÇ/Hj&'‚‘Ô/Hj&)IõIŠ@R}’"Iý|¤f’"TŸ¤$Õ')‚‘ÔÏÓüRkr¥Ÿ¤–•Ôî­¤XW#©ÿZp|/A\‡¦$E ©>I,0©u)JR$#©ÿRàU½3I,+)¯êeí-,©µ")‚‘Ô³’šIŠ`$õ³G~,µ.åÝ!)‚E%µµ{³$E°¼¤Ö§)IŒ¤~¦À8Ï$E ©>I,0©u)JR$#©7¸zb&)‚e%åê ÖÞHê§ Öh¼IHªOR‹IÊŒòœ #©Ÿ*X—Á~<$E ©>IHªOR#©Ÿ,ÔÌd8ì³w2I]+9Œ¤þs¤f’"TŸ¤$Õ')‚‘Ô*ÔLR’ꓤú$E0’ú’šIŠ`$õ $5“¤ú$E ©>IŒ¤þ}¤f’"TŸ¤$Õ')‚‘Ô› $5“¤ú$E0’úw’šIŠ@R}’"TŸ¤FRo,ÔLR’ꓤú$E0’ú·’šIŠàP“Z›w3?’"Iý›‚«&ó\PÕ”¤/©ªi‡¤$Õ')‚‘Ô3$µaUIŠà“Ú>–Ú¬ó’"I]SŠóî·ðâ÷6©)3w°ÏÞ™;~¢ààc©JjÕ%I=] ©™¤$Õ')‚ÃKêÔ8 Ú’"IýxÁÕ‹Ùú⤓Áa&µi$E ©>IŒ¤ÞP ©™¤$Õ')‚‘Ô¿.ÔLR’ꓤú$E0’z}¤f’"TŸ¤$Õ')‚‘ÔHj&)‚‘ÔS’šIŠ@R}’"TŸ¤$Õ')‚‘Ô…IÍ$E ©>IHªOR#©' $5“ÁHꉂÍM*¼3¨¤H$U“þç’"T¤(I½®`““ºüÕ$E ©š)Kq0I]‹}3—¬zã±D#©×HjÏW—¬z#²—Í%©ÏRHR×BRh$õxÁÆ&µµçÃ¥;W½ñX"IÕlíÞL÷­zã±D#©×lnR§.¿IR$’ꓤú$E0’z¬@R3IHªOR’ê“ÁHê|¤f’"I=Z ©™¤$Õ')IõIŠ@R}’"I+ÔLR’ꓤú$E0’zu¤f’"I=R ©™¤$Õ')IõIŠ`$õp¤f’"TŸ¤$Õ')‚‘ÔC’šIŠ@R}’"Iý«IÍ$E ©>IHªÏ¬ì³wæŽ $5“¤ú$E ©>IŒ¤~´@R3IŒ¤(ÔLR’ꓤú$E0’º¿@R3IHªOR’ê“ÁHêU’šIŠ@R}’"I-ÔLR’ꓤú$E0’º¯@R3IHªOR’ê“ÁHêÞIÍ$E0’zÎUsš_VÏ)I¤î)ÔLR’ꓤú$E0’:S ©™¤$Õ')IõIŠ`$uw¤f’"IÝU ©™¤$Õ')IõIŠ`$ug¤f&ÃaŸ½“áHêZɉ@R}’"IÝQ ©™¤$Õ')‚‘Ô+ $5“¤ú$E ©>IŒ¤n/ÔLR’ꓤú$E0’º­@R3IHªOR#©[ $5“¤ú$E ©>IŒ¤NHj&)IõIŠ@R}’"IýH¤f’"I½¢@R3IHªOR’ê“ÁHê–IÍ$E ©>IHªOR#©Y ©™¤$Õ')‚‘ÔHj&)IõIŠ@R}fî`Ÿ½3wÜ\ ©™œ$Õ')IõIŠ`$õC’šIŠ@R}’"Iý`¤f’"TŸ¤$Õ')‚‘ÔHj&)IõIŠ@R}’"I}¤f’"I}_¤f’"TŸ¤$Õ')‚‘Ô÷Hj&)IõIŠ@R}’"I}O¤f’"TŸ¤FRß] ©™¤$Õ')IõIŠ`$õ]’šIŠ@R}’"TŸ¤FR7Hj&)‚‘Ô¿(ÔLR’ꓤú$E0’úÎIÍL†Ã>{'ÑԵ’¤ú$E ©>IŒ¤n,¸zRÓnäFÁHêŸ\-™ž6ª)IbRÓíf¤ú$E0’úŽ‚ƒvü6ë`JR‡—Ô©=æÚ’"I]SºdïÚšï·ã/š“úö‚«³µçÃF¤ú$E0’úg’šIŠàÐ’ºÓFŸÔ•lïМ9sÇwÜu×]·Ý¶ê•9n‡—Ô©M;á'©+’ÔÎøø§›•ÌA$ÜrË=÷ÜsöìÙW½j»§{ï½÷Ž;¶oV½RÇJR}’ $%©>I’I}[¤f’Úã¶ÛnÛ>|zàsçÎ=üðÃ÷Þ{fÇ£®z½ŽÛHê[ $5“Ô’ºHR}’ÚCRIªOR—Ü|óÍ÷ܳÒc=öøãO>ùä… ^ùÊÓ§O?úè£/{ÙªW¾¥@R3I]"©‰¤ª.ÿ;¶¤¶½øÅÛ;|<ðÀùóÛmïð½öµÏ<ó̃>x×]çÏŸ¿îºëV½~ÇOREá–’z‘¤.7’úæ‚ÍM*½LR/’Ôå6%©¸æñ:{I=òÈ#O?ýÄO<õÔSo~óßøÆíšÎž½ûî»o¿ýö׿þúë¯_õú­ÄHꆂõMê^#/©HRÁÆ$õ¢’T$©`ƒ’z!o‡›“ºdÕq5^·ãÂ…7¼á Ï>ûì›Þ´Ô½ÏÛ>–ZõÚ¿ËÞ eë› Ö>©nUž¥.'©lƒ’ÚŠ]—M‹nnR7ÝtÓO<ýôÓÛ;|çÎmßÜwß};{{wÞyçùóÛ_¬zýVjS’šŸ[ˇE%%©` ´o,Xߤ&ý¤ü©÷y’ºŠ Lª'¼—î†&uæÌ™»ï¾û©§.\¸pîܹ׼æìÙ³§OŸ¾å–‡zèüùó/ùª×oÕFR//Øà¤II*TŸ¤$Hªo#“zÅ+¶˜¶ëyøáW¿úÕ;ï1qñ¥‡OII*I}]¤f›—Ô}÷ÝwæÌöÔã?þÐC7Üpê×g‘$Õ'©U¯Ï"Iªoó’ÚöÒ—¾ä%/YõJ,ÚHêk $5“¤ú$E0’úšIÍ62)"©>IHªOR#©¯.ÔLR’ꓤú$E0’úªIÍ$E ©>IŒ¤®/ÔLR’ꓤú6x"²½“á|e¤fr"TŸ¤$Õ')‚‘Ô?.ÔLR#©¯(ÔLR’ꓤú$E0’úòIÍ$E ©>IHªOR#©T ©™¤$Õ')‚‘Ô—Hj&)IõIŠ@R}’"I½¬@R3IHªOR’ê“ÁHêHj&)‚‘Ô?(ÔLR’ꓤú$E ©>IŒ¤þ~¤f’"TŸ¤$Õ')‚‘Ôß+ÔLR#©/-ÔLR’ê“ÁHê9WÍiž”€Sfîà2{gîø»’šÉ‰@R}’"TŸ¤FR§@R3IHªOR#©ë $5“¤ú$E ©>IŒ¤þv¤f’"TŸ¤$Õ')‚‘Ô—Hj&)‚‘ÔHj&)IõIŠ@R}’"I}Q¤f’"TŸ¤$Õ')IõIŠ`$õ· $5“ÁHê $5“¤ú$E ©>IŒ¤¾ @R3IHªOR’ê“ÁHêó $5“¤ú$E0’ú¼IÍ$E ©>IHªÏd8ì³w2œÏ-ÔLN’ꓤú$E0’úœIÍ$E0’ú›’šIŠ@R}’"TŸ¤FR£@R3IHªOR’ê“ÁHê³ $5“¤ú$E0’ú¬IÍ$E ©>IHªOR#©Ï,ÔLR’ꓤú$E0’úŒIÍ$E ©>IŒ¤>½@R3IHªOR’ê“ÁHêÓ $5“¤ú$E ©>IŒ¤>µ@R3IŒ¤þz¤f’"TŸ¤$ÕgæöÙ;sǧHj&'IõIŠ@R}’"I}r¤f’"TŸ¤FRŸT ©™¤$Õ')IõIŠ`$õ‰’šIŠ@R}’"TŸ¤FRŸP ©™¤$Õ')‚‘Ô_+ÔLR‡šÔøöÖ&Ä')‚ÃLj·£ç>Ù€¦$E0’úø‚«v²ûâ« ¨i‡¤1©Ý–¶æ/N0IHªOR#©¿Zp-Iü¦$E0’ºäã‚ÝoîR[ûî—Œ¤RJ—¥uÀ›?œø¢$E"©>IŒ¤>¶@R3IER;OXQáPRR$G’Ô©ËFßÚKÿIŒ >¦à¤…R')Š$U³®–ÁHê£ 68©­Ë/¯—¤®Å¾?u¯zã±D’º’ý—†ìÜ—ÿŪ7"KpÙxÙú¨‚MJ*ñ,Å$u-$Å$U¯–ÁHê# 66©‹19ãÇÁ$UtùõH’"‘TŸ¤FRQ ©™¤$Õ')‚‘ÔK $5“¤ú$E ©>IŒ¤>¼@R3IHªOR’ê“ÁHêà $5“ÁHê¯Hj&)IõIŠ@R}’"I}h¤f’"TŸ¤$Õ')‚‘Ô_.ÔLR’ê“ÁHêC $5“¤ú$E ©>IŒ¤þR¤f’"TŸ¤$Õ')‚‘Ô_,Ô̬ì³w掿P ©™œ$Õ')IõIŠ`$õÁ’šIŠ@R}’"TŸ¤$Õ')‚‘ÔŸ/ÔLR#©?W ©™¤$Õ')IõIŠ`$õA’šIŠ@R}’"TŸ¤FR¶@R3IHªOR#©,ÔLR’ꓤú$E0’zI¤f’"TŸ¤$Õ')‚‘ÔHj&)‚‘ÔŸ)ÔLR’ꓤú$E0’zÿIÍ$E ©>IHªOR#©÷+ÔÌÌì³wæI]+9Œ¤Þ·@R3IHªOR’ê“ÁHêOHj&)IõIŠ@R}’"Iý©IÍ$E ©>IŒ¤Þ§@R3IŒ¤žsÕœæk-8%)"ÏR}’"IýÉIÍ$E ©>IHªOR#©÷.ÔLR#©?Q ©™¤$Õ')IõIŠ`$õâIÍ$E ©>IHªOR#©÷*ÔLR’ê“ÁHê= $5“¤ú$E ©>IŒ¤Þ£@R3IHªOR’ê“ÁHêÝ $53ûì GR×JN#©w+ÔLR’ꓤú$E0’úã’šIŠ@R}’"TŸ¤FR¬@R3IŒ¤þh¤f’"TŸ¤$Õ')‚‘Ô»Hj&)IõIŠ@R}’"I½K¤f’"TŸ¤FRï\ ©™¤$Õ')IõIŠ`$õN’šIŠ@R}’"TŸ¤FRïX ©™¤FRïP ©™¤$Õ')IõIŠ@R}’"I½}¤f’"TŸ¤$ÕgæöÙ;sÇÛHj&'‚‘ÔÛHj&)IõIŠ@R}’"Iý‘IÍ$E ©>IHªOR#©?\ ©™¤$Õ')‚‘Ô*ÔLR’ꓤú$E0’z›IÍ$E ©>IHªOR#©·.ÔLR#©·*ÔLR’ꓤú$E0’zËIÍ$E ©>IHªOR’ê[AR‹­x©+¶Šm´;>þ`¤f’–ºb+MêHj&©a©+¶îI¶µ ñIjXꊭyR»mÍ_œ\WÚ\Wߌld ¯ûÂ#©·(¸j&»OM[ÓíI&) §»wÇÇ Nj·"Iþv²ðÚ,|I…/N¤+ýØ=îýP ¯ËÂ[|¿ý'¿¨‹“áÀ>×6>®4¤ž¿cþæq j8Ù¶â§@ÓVø h»¶3à[û>/È¥³é\pM–¸[½°Õ¹d¿)hCdk™Q-p•X¢å ”¥^'½¼5b‘7PÂåh˰¼5b‘¶–ö¢é'µ°ßË´3J–4R–›ÔÒ~S,Ù‚FÊb“ºh©ëÅ ÅW×,g¤,<©å®˲œ")ÖÚðBO¢/ð7Å"-ooíÞ,Ëò~S,Ò¯²YÞ]´Ôõà°˜s×–¢àP) •¤à0ÙñƒÃäôª¥Î/À¡ø}Ò/—ã2/Z¸IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/surfpart5.png000066400000000000000000000604671477365367100224300ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœí½ùUçy¯mý¶±]lc&ƒcfÍ€„˜ÌcÀb$$„Å$F10cì̎㸉8CÁI¤©›¶iÒö´I‡ÓszzÞá ïÔw>ïÅúš½Ú X{Ô÷úa³öÚÏöÖ}mt?zžû¹ï>cŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1Æô Œ‰;‹®LÆ (¸¿wn·?zƒ¼9E¿¹ÍÇ 0lذQ£F•””TTT”••Íš5‹ÊÊÊ©S JKK«ªªž}öÙiÓ¦3†Æ>øà­×•úÿ"b¥Òn¬•ÊŠkdæ6±aĈ&L(..F’‚Œ©@£Ù³gÏœ9sîܹsæÌaãù矯®.X¼xñg>óö̘1cêÔ©EEEþÔSOõ¸FV)•v§¬TV\#_•ú#òOó¯–V*+®a¥Råé”*ù"udòÚw@~Ýæ£>J4räÈ)S¦-ar,Z´hþüùóæÍ#Oš>}:‘9ñÒ°M’§çž{«ð ÛhÃ#;e<ùä“7ÝJ"ºþŸ¤%ÜÓ(••JJ~Ýfz•ú¿#Ž`Ǩ´Ie¥’’_·Ù•úĦ49e¥’’G·9tèPÒ&&Br&äx.]–-[¦< ]Êž ˜6m†-`ƒÃ9 Ç.\¸ ׬YÃn=úÆ­$¢ëÿŠ@ª;Ñoú3Yj¯tã*©ü)›,£?*•v¬T"íJýŸHÏŸzûG÷„I-$a À ¥AøÁcuu5IRyyùìÙ³ÑbiÀâÅ‹QMépÈ /¼€aì¡ ‡k0Ť§ýªU«8„ó“N‘™=óÌ3×/*õDÀJ™\! ”ºNŸ:¥vŒ_ü# o9Uo§¶RùK(õ¿G —Æøô`ÅŠK–,Qo:º`ÛRJc+H¡ð I›‘ÆxÆ#§åBsçÎpýò\©ûúîB´RyG6)õ¿E ‡zünÍË z–a¥òŽlRê@î)þ[ЋTV*0`À˜1c0€Ø¯¬¬D "3.\ˆ8DÈ#|R Åip„´£½zÓ§¼Š1äI˜¤Nw68-¯rˆ:ã9ò‘Wáå”)Y¤”">¾î‰[•êõ©•Ê#²O©@*•JÑùúVê™sïd\©OM”ϰRqs›¿qù©|cРAšÚNºC–C¶TTTÄ6‘N’„Äþ¶¥‹ö`{8„fšÅ!‹/f'¢à–ÆÉbRUUÍh \J½ììä¨Êܪ®®®©©il¼ù©ÿ%VÊdY¬Ôÿ”›Õïbñœì¦Çûn£˜•Ê}¬T2 bK«>9Û'ý|·üéWM2æÞÀ¤§Ÿ~züøñÄ52a h¾;O5êASÞ ÿ+V,_¾\c%°Jí•]á‡tQ=$ÚÏ/˜[RGõšÏ˜QP0{¶¦Î+Í|Ò`[4ݸ‘&‰èúŸ"z¥Äqº‚ÿ5õòÿŸ•ÊqÒ¬TAÁŒÙýY©ÌtH˜{#½J°={vAAT¥þÇX)“ L™2E99Mqq1ê ”’ ‘Pß¶|’(È${45Šf‹Rè…Sp?hL"¥ÿhÆ9q+è//àœló>Ñw§M›F®®ÎøššÝ»C¥þ‡¤\©ÞžT^0Ó±aîŠÔ+ü)”J·QV*GIßÿRጣ»Pê¿F ‡þ. +•k”””õÚ@>Ä*ÔÄ;Û‹/ÖPˆD8á mØÏ†ž"“j#)yÒÄw ‚€ëÃ( ¡ûçpÑ+ 4“¾`öl © ýRÆ&8jË–={B¥þK¬”É,9¥ÔŽ@Ê•Jóú V*×H·R7ýâ—“J¥}±+• hÁr&uèQ]àøÜ%@ø G©®®F ššžj¬«Š“Tñb©¦F@hcõêÕëÖ­»®`ÁBÒ#uÀëZóæðH›‚`Xn"cc#1,wùòŽŽP©ÿ\šÕé‚™Ž,Sª`º•êã‚™Ž )·(5/ø °2²R×ùïû YŽ•2=@¦1cÆLž:RüâÅ‹•´aá¦M›0¸½ýæNt+e²‡¼P꿉€•2é!/”úHy÷DA|“z#]/Ó‘c>ŰaÔ(}!mR ÑÍ~•8b[cfÙ D÷ºuë–,Y"Éhƒ«V­¢YbL+Ð`Y€¡™†ÐjfÔíMŒ/ `É N¨ \åŽêêê6oÞ¬ÂçÊxÔX}á¼ôBbÕ××oݺuË–-l)+ÒÌ*®¨AµêçBœS9=Ñ !¥úÎ¥¬–¾Q$_W}&|BM®ÞÕÕE*UW·xq|JÅã=‘çô'¥nð÷½Ð{÷voÝÞ¹õ—++•vú“R½©ô)µ"Di*ˆ+•.† 2jÔ¨ &Êh™AU¸$´I€¤…&3©Çš ‰%ꑉ”(1ɉĈ`'Ì‘¦¾¾~ÇŽµJøãi–ƽ²QWW§T‰m–Õb8\šËÑŒœ ¥xÊͨ;ŸKh²”¦Ô«£½¬¬LK^«^Ù1›c·mÛ¶wïÞS§N544ÔÔ,X*õw°Ræîè—Jý.}ø’öÞº8°RéÂJݹRiï­‹+•žy晢¢¢’’¢•L…l†Ø$Z‰täP™I‰Ð˜ Z y S] Õ %ÍP †m¬’äC4Û´i{8\)ìT%$½e'²jÂSbˆ„VÑQ>ºÐF4´²”æëëpn•4–Ð;wîܵkWggç‹/¾ˆÁ+W>öX¨Ôo#Ч1iî­‹+•¬Ô]*•ƒX©´Ð_•úÛX)AƒiÑBⱸ¸xΜ9²FF­„<*hÅiö曀:Ä8‘˶´ÃÍt_ 1ÄòÖ­[y‰“°MBÓØØ¨!X…+*É”%êr9Õ¼Ä*2<î019ôFT(]Ó¶6p6TÞ¿ÿÞ½{qûä-Lž<ù“#Tê/"z¥Ò;?ÄJÅ•Êb¥‚åKåVê6J]çW}†ž—ÆÌAz¨´´4±65áIlª69iñj"<B‹Ïæ µµµZÕXõ‘cƶDá3êëëOž<‰.4à)ºÁàYWW)”FËîܹ“0׬) _µ$޲1UNR÷¹&li¯$Ó`^-‚­¤ŠtJyžÖ½Ñ´xÎÃ[@_dâ–}Koí™gžùä •úóX)s+VÊJÝ|ÁŒc~`¥n«ÔŸEÀJ™Lœ81˜A®éæšØD`&ÆÃjj©šÄTuõCkÀlkIÉöíÛÉNb÷îÝl£푉ÄE{Kº»»ñéÌ™34PfƒR˜GƃsÜÆÊ•+uWÊÞÔeΆª˜ë5“ØS^^^\\LÚ‡[š¿¥B˜²±ä“†ñ>|™N:EJ§¹YEEEŸô ßŸeJ¹&z®a¥úRêO#w5ѽdÛ½a¥nQªÇ’m¿Œ€ÿÔk®3|øð@¦ Bqþ|©£q©3Ø£¬ê~&®±„ÀÔè¶$œÉHP“HÚÚÚx$Ty$l ÞŽŽŽ_|‘ô¨³³“WyÊK‡Â*‚šˆ>~ü8ÎΣG’{‘èÙh¹lÍ€Wm$Õ:’.ª´Ä]ék€=ì/++ã I)’?²ÃéÓ§kyCUǼÊpb¶¦jqó<â%͆ ~8VÊÜ9V*’R+e®c¥rA)¯(Ÿ <¸²²™ ‰Ã3fÌ[UU¥8Ug¹*Yj"”Æh„ ^jb:òaÆíÛ·cOÔI(…+dEJ¶8@.…@ä.¨C"E³“'O²ÁQÚæ‘³q9.X G9ÆÉr§Ž€ÿ—êïX©;Pê#`¥ú;VÊJõ‰•ŠÎ˜1c”_§Ÿ“'O&ƒá¦ qªää d¶Ñˆ #*·nÝŠ:„¡*ˆï¼J^BÌÖÖÖ’$uuu¡ /½ô‰‘Ò#d¢=® ö»;vìôéӼıì?wî)£â´¼ÊµHต±ÔÔv¥nª“„(h¤ýÊöø2HŒ§ 3D)­…HKÚkÉ.×ÔÔ´/€ër'ÆíÑ’o–ð/R"Tê°Rý+e¥"`¥¢c¥îX©?Š€•ê§<öØcZô™HÓ(SÂIC –.•iÄ)AJ‚¢‘ZšFSÒQŠÌCSÛ‰GR“-[¶hPo:XÂ#޼؆+„.èÈÚ¨¹:³y$ÍÂ$µa¿±‘RWGnnu4)*±öŽVÅц3gÎ$KÔò×¼½QM¬Ç'´æf°ŸGÞ‡ðàÓ­‰Ôý7+õóX©~Š•²RѰR±Rw£ÔÏ"`¥ú#„"A8'@óžÐd};ož^'/!ú4—(®¯¯¯««#fÙOþ±'4âĉ<²Lš¥úâäRÄìç?ÿù³gÏj~<ºì ‘F MsdBS  gãiCC’«ûœü ­U;A) ©˜ :—Ü'Îq2ñe1#€WiÉQZe‘{ãÆxäÒ\Eã8•O‚ï”1×K ŠP©ŸFÀJõG¬”•ŠŒ•Š‚•ºK¥>Š€•ê_\hÂi…z›Uê¥Z^u5¡J žMJz´M0"AWW×ùó瑃Ä$òÕ•TiI IÐÔst¹xñâþýû9‰)vÎ2ˆ—˜Ê«œ“m|¢ "rˆ9$ÙÒDy £Ð •ÛÔj6|#pïhÁN6æOX¢‘ z;œ{ãÆ¸=®Îµ¸ ãU>˜Ñ£G÷þ¡õ¬ô‡}æÚÊiÁJõ•º'¥úÒ)¡U&ã?X©¾±R÷¤ÔO"`¥úÇ/))A:ÐÚ ”Hi‚úÌ—,јY‚”섌GóàÉlPЍ' %!I†Dì³±Î;G¨bÒ°ŸàE/ÚЀ“°šuéÒ%Ç?™ci†aEÆvæÌR.^e›4Žü‰Ks'RJwª‚—ìÔŠÖܪ^e¿þ NÀ«(ˆš*„©YûÊùx ÜOkk+çáûeĈ·ýô¬”ùV*¥~+Õ/°Rñ(õa¬TžƒL“&M"º4~@s‹ôHÄjæ»ÍŽŸ?_Õ8DèmÛ¶méÒ¥zŠ%*&DT²M„.—/_Æ$`»-@}äøwúôi Oà%R%¹BF{Ìã<$4¸páªÑ˜ïîîf' "Smm­¦ìkUŒQv-xˆ[l,`?™ÓôéÓ5õ+QÊï/®Å¥yÔŒ|®Îýp{Ü$ârªÞûÎX)sV*N¥~+•çX)+uoX©#GŽœ8qâäÉ“É,´– †+W®ÔòX…2Z7§¼TSCŠC’¡záÀÓºº:MB£]:A`ò*–hF”†£bÛ‰'4 “ˆbt¡ ‡«]S©8!ÈÊ~ò0¡¥¥°7èÈ¢´ìae€VáÖÊÛšìa[_lhŠ?Jñ­À_yå¥nXËMêü|BÉ?ÉP©FÀJå-V*~¥~+•·X)+V žxâ ²ƒ²²2b¬¤¤„h$Ÿ É–4AµÁÉ&Ö­[‡gkÖ¬!g!Á Öd“ #Ø FÍn×…—.]z1€Ø¤©;µ¦ ¨@\aáýèª|É~^ÅRÜ¢=ÚqAÍ•W*ÆNóÌ3“'ON %%ØÈ¢4 Ðhiy):`!GžBðó¨D‰8zËiB&„XD"º¤Zô†ƒ>ûÙÏb@G4×)PÐ9hYiš‘0©ûüìÙ³œs¾üòËøtáÂâW1L³²´è"éW$¯J¬S l“BIdRR5kÖ,Þ1_ÅÅÅ|ƒp,-Zƒ#Tÿ’¼MEÖÙ¯q÷®n”P©÷#`¥r+•>¥¾+•óX)+•Jú›Rš®ò–'K°±Cx¡«««•H‘T©SZÁ¿!Yˆ=ò*[`{×.< —B3ÚrOqBz¡ÑÉ“'Ù&NU\üøñ㨃d*çÏŸß¾};Wf'Çâ ©• ^¾òÊ+ª”ÙÝÝÍ v|B2áU à@ÜB Um$ À0râÝhü¬fÏ£YJñÈ›æ{„÷ÍkÚ÷Ã…Ž°Í[ç(ßñ‡*õÍX©ÜÆJY©c¥¬T •z/V*‡!mB&2 Uis• '›Ð x’Í~bƒˆMÌp'ìÑHE{ Ã3áÀÕ«‰>²DI¬³?@‹¢§!ö‘C.y‰h‡"(…:œ›“\¾|ùôéÓ:DY8„O]¸Å­!ŠÆìb0·‰Û<ª×\ºh©CÞœ’-î”÷ªÁ³<²­µqxëZb‘wÉ]i*?—àpæ’’’»ùœC¥Þ€•Êa¬”•J=VÊJ¥P©oDÀJå?üð!CÊËË58¢*@¥ÍUHœ„‚c?”°M¸bOÈI64/ˆö ‹Ú …Õ@ L»¹/œŒipB5,yŠ„Z‘Ó*it­¦FŤ/´Ñ(‰sçÎq2)³A)R(­®£q²ÁªÛ××ÞV7¹ªv’ú(m¼¤³jÌ»WF•°MS¬4J´ž62q -I5ïò·RùŽ•Ê˜R_€•Ê=¬TÆ”úýX©£¨¨ˆŠ ‚`#ØÆ­™3g’JQ¸ ®qÜÒbЄkbš5k[[[Ù¯dT‰ð«¯¯'÷‘A{ö "va TÀ'•G„à B•3‘9µÞ€¼Š6/^$Iºpá‚V8¤±’7^%Áºzõ*èÈÆë¯¿NŠF~£…nØàö5¡KKm³­•{4ÝKñ¦µ^£Æ‘jZ‘¹m|Ú»wog€þ*ÀÇ0gΜ»ÿÌ­T^c¥2©Ô;°R9†•²Ré%•:t¨Öt–R’ªD’HÍš5‹ð#~4“HßIFW•"Uù²¡¡AÅÀyˆ@qUáJMfß·¯&(‹®:è„?V‘*‘}iIÔikkCŽ#SAB-g­¢JÇŽãdls2ž²ŸôK#d9 Û4&Þ9 à NhÙê {f·“3iÔ¯käMÐljo¯ æMÐŒGÞ’?] “Õ%8êÎÆÉÞB¨Ô×"`¥r+•y¥ÞŽ€•ʬ”•Êy©ÔàÁƒKJJÈ#P'QäRˆ`c›¸B#"PG´&Ácj¨,ƒSys¢Z“ž´>5i‘ôikã%"€Aº¥d4ÏJ%0±D“ˆ_Ò&^â(MOGv²­±—.]âÊ‚£+A°«D»R(jg§êb²‡ý¼e€´äëƒÏ€wd¼W^RЍÚî¼ ¾ x7ܧЏƒÊ¥?ýôÓ÷ôù‡J}5V*°RV*sX)+•B¥ÞŠ€•Êv @8¡qˆ=ž zkâ;•°‡í;vì$†1à #£¿1 IDATÔ`V¦îêê"üÈ¢ÔOÎNöœ;wŽ€ìîîÆ…½{µfµV¹Ñ Œö-k£Êå¤@ÊÅ£Òr&.x,€–ZtZÕ‰4G ÀäFÓÜç΋Iï«m­ÅÈKú^H|)°_SÂø*!CÂx-¨ÜŽ/ÀÕ. šàS),,=zôC=t¯?‚ž’¾Ò®” X©,Rª/Ze2þS€•²R)TêÍX©ìåÁD&ÅÛŠ+ThÙ²e„yq®¥ÕÝ­‰êD5{ˆ^b›œBÓÒ¥.°G…Á‰vš‘]“ì§ ìT·zGÇ«¯¾š÷JJDΤ ‚¸páÛ2Y”.ÂSŽã.¸,7…Ÿ¼ª‰JW¯^%‘bgàU,AÞ¦ô+Ô W­rÃ~­xÃGG¯ÄH ¾5x£šç¯Q¿ØÃÛ%TŠÈâó@DR(|zì±ÇbøAX©|ÁJeR_Ž€•Ê^¬TÖ)õ¥äRy´d‰ñ¦dĉJ©x¹âŠÔ†H#€U¯]0"ù _øÁFæ„ì×b4(pþüyÍ%'ò5tâxg eW›Z0ëð:Æ @H´àúØFžªøƾöÚko½õ–j)¡ “ëpÍ‹/¢`¡íÕà]¬âi Æðæox:uêÔò¾DHy÷l¨ð9-W3øù*QN.Ä-)·ã(Áâ‘üoÔ¨Q±ýz,ÙÖ/•Ší£Ìùx´¨5Ÿ g®««ÃQ-©½sçN凓———Oš4iÀ€ñÿ€B¥Þˆ€•Ê¢ ÐG}ô½ìA#³¿ðÁ Éþáj¥Yš½óÎïÿþï³ïòåËJɸ.Èù¸§WGøàþá~÷»ß!ÎHÈȺØÏ±œùÃ1“+ýë_çL\«0ÿÚµkúà ÷­áÁºuëx$‹’OZs­²²R˜I°´/©2óÌ™3ghY^mrÕÖÖj¸9Ÿ oHYÔÎ;ÙÃU’ÓÿÞïý^~ˆ¡Rg#`¥R‹•²R¹ƒ•²Ré!Tª;9¬Ô}7È÷eà¿-H£ŠÆõõõdT‡& á·mâsË–-„fDtvvªO b‰m¤ÁÕËÓœ_¸|ùòûï¿O ƒXxö¥/}‰äŒ4«hÌ™ñ -pâÇ?þñ÷¾÷½>úè?øª}÷»ßýøãq„IŽ~úÓŸb'½ûî»Ê˜8/q‡s¶·ßf—BlÍã¸téÒ’³©~ ,[¶LÃ%´¢®¦fh¾†VàÕØXåLäU쬨¨à‡p‹ˆ¢ÙZ… uôCLò©ð5DþÉ~²4ìœ0aBjçíöM¨Ô™ä²R½Íç²RV*vzVHêS§Ü+Ó—+e¥b'Têt¬TªÀ„å™ rìÙ³‡øikkC â‡×ÐÐÀ~ZªÍŽ;4n‚6œÛè‹_üâ;ï¼ÃGöøD:Lî… ¨€4Êw%"|ç;ßyù嗵ĹJ»üä'?Ñ`Wüûæ7¿‰Il|õ«_E¬o|ã*íBÞÄÎÏþÃ?üáÈ‹œ•hõNX555؃+«V­B,õ‘£2Íž=ûÙgŸå%,!ÁÒ2jØC„O˜¤EÙTÖ™8ß5¨³mÛ¶¦¦&Þ¨Öãà­ó”Ïç8"¦d=ŽèäŽR©¸¶•²R±*u*ý_*¿vZ)+;¡R]Èð/~±K•%J=þøãê;Ç R"¢KxŠ D¿=z”øQe:ôã%r-­»sçN4¢™²«‹/²AC.ÃSŽ%¶i£á¨CÌk¥ .Êx¦™M$X؆|ßþö·¿@ Ã!d!9â̈ƒ©œ‡£pŽÆÁ:¡›UÍd6P„ ™°G),!—"m•éÓ§“6}&x5ѳÎKZ¡Cc%pE#&°Gk•ðBÒH"Åi± ÕhÃåPvâĉþiæ”R±a²RV*vB¥NF ”Šõ¿*+e¥b'§”*ˆ»¢m6(5|øpD!/_¾ÌïÊØÀ>t½h£tžÒ@sÃÉ·PŠë`›C$"ÂÛ…c9’!“J.iê5Õ¹4º(…âfhÃN.A3-õK³ïÿûl°ŸÃ1,â=Ò[Jw´Þnmm->mX³fÍúõëI›´Þîœr&­ÄÁãÌ™3§QÑfùòåµuëVòÆÆÆFNË[&áÓÌQú¥©ðªÅ¸;Þ÷˵ª!&­¨¨¨HûíN•:+u¯X©~¤TG¬Ô½b¥¬”•Š¢¢"Ou¿‹×7ÊœÈ]pˆ(Ö\yB˜(b?ÍÔc1ÒHÃ`?ûÙÏ’9±¡ŠJÄÞöíÛqBå…”´G>ö?q^UŽ¥Ëq-LåU,ž·\TC*Ôgsœ–öº÷©q \ˆ î},к…äR$:h–Ë2ñvÑ™0Oƒdyä›eÚ´i¼$KdÞ ÖzäÝãoš³q)Þ §Ò´*OïÏìÎ •Ú+uOX)+•÷J¥w¹6+•÷JõX²m_òN©t}ÒÇ/))yî¹ç?õ!oذAC€<‚@’aD±z©5~6l“î(®/_¾Œ%G‚%¯ßxãÄXZ :Ý9ƒdC%3ˆ3³D鉠’ºdÒùwîÜIV¤{~Ìš”¤•yØOŽÃÍð*aO®´~ýzLReò^xaõj-`˜È¢ˆz¾/HyoæÈ? £%ï{U4ãÖx£|¡è=q ìá–1•ëTUUM™2%]?°{ Tjo¬Ô]b¥¬”•Š+Õ•Ú+uÇ 0 ¸¸˜ÄA‹úi¤(ØÐÐ@¤“2ÄðÉž©÷XSµ´‘FÌb ‰ÁÃ#Û]]]xsõêUQ%sºtéÒ‰`}^E‚M% È„^yåÌPß¹².6Z[[9¼3°Gµ—ƒf*™©^yåm¤JÊ«iŽ¥¥z¿É“´ˆjíD ,@£Õ«Wc:ÉQ#ÈÕYÎ÷‰”r&Äâ½j¹^}6€ Lé'àL2‰¯MúbƒûåÖøÌ*++ɺ8ÿ°aÃRÿ£Š +•b¬TÿUêÅX©;ÆJY)+C† !…ª¨¨@)¢‚`›>}:ABì³x{0µ]£ˆ",AôêîîVHÍP'g:sæ {”cÑp¥4–ðçUÍn×äu$Ó¶:¢ëêê° ±È4wJS9?Û’’X(IdHa”ûüêèf' hÖ{4éiÁù¡ºæ øÖ(---))A¬ÓŠÖ| 4@Q©¨yT\ª=˜Š¯ºŸÜšV5ä«(//;vl*Nq*Õ+uX©þ®Ô®X©;ÀJY)+ƒ š0aÂäÉ“ *4ÒœqÂŒmÒ)‰’´‰X>|øðŋɟ°„tŠG”Âr ÂŒÐ"³à©^ÂÔ!•!,‰=o½ví^–*†Äâp €Å9 à$”Ž4ærÎ=½´|1Xa[½ÖíA½LŒ×¬v-W½dÉ mU±#¬Â<Õ¥ Ò(TSXÌ âír4Çq†Êò(¥°‘Ó “nMeMx—ú+ošTlêÔ©eee|„O>ùdj~H)#Tª5V*VÊJÝg¥âÄJY©ëѵ3V*ZÈOñHŒ)¹ ‹"¡ NÉfˆbuŸ>}úTOÙ©òEÄ>/¹$XD:a®µÙ !&1Rà PGSŠp¢¥¥E3¥`Ó¦MZ•FƒW5€‚¸Õ¬zýÏOTƒ&Tn“ö$RìÁ3­U­úä*X´" 1Ÿý¨Æ{¼iPˆºÒ•´ÑX¶•àñž´¾ ß&º>×äns ùÓ¤I“ÆŒ“ù% ï‚P©–X©HX)+uß'\›ûÀEÇ"c¥¬ÔõèêK§„V™Œÿ ¥øý_à 3’ÜÒÒ~š(„ „ ¶ê 'ƒ¸zõ*Šœ;wŽtGõ/UŠ4´ “Kј3ûW®\QIKœã$*nDzBXjXJq y±Gêê Ç›D‰®°RɱRVê“è²R1PZZZQQ:ÄZõï…^ÐL#¶yTCø£ËŋɢÐisÕÒt!ö+ðÙ¦%±§ÂçßzðàA-‰ƒ‹ä^‚ª°.{4^©’zÓ×Þ˜Ù”¨Î£q¼ºÆ5'ôkKÛ*dTUU¥NòÙ³g«²%{pG]â+Vhœ,¯¨Î»¶•Iª[«Q ½y+ܯ†Œh¹l”Æ'4ÆÕ¢¢¢Üë2ÿ4¡RÛ#`¥’`¥¬”•Š+e¥B¥#`¥nË AƒF=uêTbC“Ä«««•M ”ÖþS…¤ööv ЂÕÄ…=°7Xò\ ØÐÜ&ŸGÍyÒ˜ˆCÁ†È‡1èxéÒ%¶w5Î/9›J"q fÏ<ª÷‹Ã$[4fƒŠûÔ &ìР îS_|1ð”Z²P™ÊïàŽzÖƒú—šK¯¯Pj¥ïZqq%ÜæÙ³gõ %¨4B—Ó?ñÄñý<2G¨TC¬Ôm±RVJX©˜°RVJ„Jm‹€•êQ£F•””TVVʧիW`ä$"äC¾Bä’Ш]2iô+f {PMëãí –@$¡A,¿¹¹™CB¼A8”‚H:EFˆâ™¦:©p&b)abÇ’ÎhM^å*ÜûÙÉ­ªw_ ‘²% ~ànyš ¥%ªÙ©zæ¼ù,YH“ºº:•BOL—§íúr3î‚;⮑I5ÙùjЪ†|È5ÇÓ#ÓX©8°RV*A¨T}¬TïX)+• Tª.VªH¡ªªª¦OŸ®ôˆM²5n‚`$œ‰7ÒŠDH"šÌ{´Ž ÛÁGÌ«ü:@&D°û¸…C|øƒ>S$g=VAܼSêž?B+e¥n!Tjs¬Ô­X)+u Vê «À"‘È"}P'4 A§r@„ž†Ö*Ï$%(EÈ«ž%aöÚk¯i/^ÔhYUËóçÏ«b¤Öƒ¦dâ<ÕÕÕd"¼ªr)…‘*]ÙÒÒÂ9¹1¼QB¦‘¹|ùr­ÁœWP‡äI“ÙÙ. aR÷¿EЀ=È4eÊ64:XǵÈÑ•„‰»PµÍö`ÕFÍ‹Rw?·¬Q¹œ›o¢G}4žÎ6B¥j#`¥z`¥¬Ô§±R÷€•²RŸ¦g…¤M}à I=2dˆ¦Â㓆 °‡XÓЄ-;K=Ì<åS$؉7Õdˆ@eêJW¡J¢‘¼J³á‘Œ=šKN{YÅ#A‹@ñ3Væ£IDATJH«üybè–ê\‹溜A]ìÜ–s3äIÔJjCTÓ †Üee%IïEC'x;X€L%%%*TNËʶçÌQ%«Þ¶+»ãú|`5\„f|ãB=þøãy˜E‰P©°R!VÊJõŠ•º[¬”•ê•P© °RŸðÀsh‘>âK…ÃUN’¨Ôz*G¤…eØ ðˆ:bŒ`#ä4öáĉX¥õpš››É±?žÒÏöpJq5Ü”„ )qˆˆŒ‡“«°†f(z5TVÓ¡hÉÏé—|&¨dÎ#©’&•;R:¨t•:×4¨ÄŒy•Á¤¥ "APøœÓk1ï³gϾôÒKXÅ—ónxëZ9›ãHÆœ·2 +uWX)+u;B¥j"`¥>ÁJY©Û*µ>Vê”[”––ªV €«s·øþ!ƒ!„5¢A3¨T¶üäÉ“D=±¯‰ì*fÉNâPÓßÙI(ò*9'!&‰UM‘W%uIBA]‘“s6ž’í’{᥆šWD€«Ö¸ÂŸˆ#x‰S¥Ȥ\‡ðÇ0b³££Ÿ0Ic]I›ØIêG,uº«ûh£¤J Ss ^â¢êÔ~H* ¬Õ IøÐeêÔ©ê5-¬Ö(^Õº=z#ì×#·Š©ºCͼ?|øðå âP’ÇuµNN¾®isׄJ-Ž€•²RV* Vª¬”•ºsB¥ž‹@RŠ,C“ú–¥Q“TÉpbPÙK”‰äIìQm$öæRAéá¯Z¤ZëAkyC‚€å)<‹R´ç)ñ«%k0€sÎ Ö ÑP M|gâV_;æÑXóõµ| íU“$w¨¯ÕXẩ¾®KòtðàÁ3gÎtww«×üøñãšÈÅ» KÓÉKJJÒ§9„•ºVÊJÝ¡RŸ‰€•²RV* ¡R‹"Ðo”Òp‚Y³f©¤Êƒ+° Î’’²²2 Ð8¼¢ˆP%œ•垪#Î6¢Ô×׫{›f]ÈxØgèÈK,ÛÊiTÙˆ«$zèÙ£ræËÉi©ÉXèÊýr9Ý’*!©]ÅËUž“›ä@ ¸PΧûAMîgÛ¶m˜}àÀsçνôÒK‡Â'r¾¶¶6ÍôÒW÷ÓçC%ÃJõŠ•²RwK¨ÔÂX)+e¥’`¥zE# ˆ•'\IUT)(&©WùGåL„'á†O<Å!^RÉL>5eE[:/Ù’zÖQ H­48Ciû9ƒ i©jel*sε´( g–p\š{Ô0 Å»ÆG¨ç^ýåz+lhÒWâþÉ¢4íž”ŽlIõ-/_¾|éÒ¥—_~™\ Ãä7)ù®é…"*µ VÊJY©$X©^±RVên •šþ¡TIIIUU•º—„˜D /– &È«¦ªž¹£ª èzªE¤9š˜E)%XäI¼ÚØØ¨ä‰ÄEƒd•$)­Qù§|HÓ°ØÉ£jX‚æ¾kÄ„ê3É-¢^÷¨lLé/%²®ào³”r`ss³úòI›Ž;væÌ™Ó*ƒÔÑÑ¡{àÀŠŠŠqãÆ 4(Íšs„JÍ‹€•²RV* VêÓX)+uô,:ölä\Áóô¢Ô¨Q£¥Â5JýÕêWaÉ3”¬¨’VT½" ŽÐU #9N³—^*”´¡*ƒ2$vªbŽò3Šå%-èŠOœË)ÇcƒG´G\eQªh®úMí¡qº}ök1nC(ÔÙÏS­µ(¥>ŒU˜´{÷nD'ÁâÆKWOž<Ù2E$Tjn¬”•2I•š+e¥L¬ÔÍŒ=Ÿ!W=IýÍ6±J(ƒÆ%ÁŠ7ìÓT2 TØjÈ* Õi­Áª¼DûëªèƤM¯f,)'ÓIHÂÔw˜A6ÃÏ`^°@J駢п¼:-@žJ7©w_Ø555qÁ6lðxîܹóçÏ£”Æð644èNø8ùرc ‘ØÌQB¥fGÀJY)“+u3VÊJÝ3¡R³"×J1‚€T×·Ò“ªõ‡“ŰGõ…n &á™F+æ„ ªc¤ÜhKΤâèš\%ÃØÉ£ªNñª²1¥\:PJmÞ¼Y5”ÂérJ›¸ÍÙÒ ¶ÙCÈýrcì”å®äŒ3àÓÞ½{µPõ‘#G<ØÖÖFÚ´ÿþtvv*ÍR--,,|úé§3˜¹K¨ÔÌX)+e’`¥X)+¡RUÈk¥! šÐhý›ßvUGHA«qªóçëãÐÌ$Í{Q¹J^\»v­R´`[=âz*o´r‘®Ãe¨£¾v­?ã*½pc©m+P.Å Ž„–mÜ7(¥ä7¹‘çNZZZPgoÀéÓ§;†U‡Öª‰šR//Ç÷Àd*$s+•ÀJY©8•š+e¥LB¥*#¿J5JýåJ‹P€@E¦’’’ÒÒRžP ãH¶¤,J\4ŸIY‘’5âU)1« D®® §H†Id9*5zôh¢T³Ë Qb’ÔFÉÉS”¡€r%‚™Æsæ(gRg¹F4Ì V Ä’êU'’OêÒÖÄw•ÚÔ¦DÎTQQÁ‡KΦ9Ø£¹ò:ùŒ3H¤´¤aii©æÄë´‰¥Õg½<Ù³uëV¤Á²¨íÛ··¶¶îÛ·ïÈ‘#(uìØ±½{÷Ò€[RqM®ÂýO˜0aÈ!®n;VÊJ™X •*‰€•²R& ¡RÅÈ;¥xO‰òO2ŸøyÁB6¼ŠC³ƒ>ó©S§Nœ8qÒ¤IyIJdS.¥*ã<õ*‡‰ÊZÔS®ºæÀéåúèÉPJõÖ9¡4REsÉ®h€»Ϋ ÕÀ5okkëììÄ!Lz1öìÙ³/@£$øF߈1räÈL‡]>c¥¬”‰•P©¢X)+e’ÐÏ•"hÕ– /ÔYCdXE²ƒR¦a«ÁhY´à8MW"UÒ94ÕIY; |­r#ÿTpS"*aSÍMõˆ«”‘’3Mªkõæs”Ê&577³¡Ïž={éÒ¥îîîtttìß¿Ÿ—Ј«¯ à–¹«ÂÂÂÉ“'»Îeª •*Œ€•²R& ¡RS"`¥¬”IB?WJ£!Tþ‰¤4‹…m~ÏŧñãÇc.¬]»;4 >H•ˆô„4Ø ™õÓI•8BåÌI¡Ô®òEZ$GóÝu}YÅKlc¯úô¹g®­­­¯¯×ØX-§ƒO;vì a:|ø0¡Ñ¡C‡ÐèÈ‘#ª| šƒ…ˆ—¯›”6B¥&GÀJY)“+e¥L¬„JMŠ@Þ)EôjÍC’'r&žæ‘ýªÉc¢ ¥¦5¡C°œ $l v2¤D_¼ÆÀâY ð ÕØ‰Šª„@ê;ç:ê&W)v ŽÀj^Òº;˜ÔÐЀZ?½öìÙƒOûöí;þ<)Ô©S§Nœ8O»wï&»B£DÙu9¿¬;ö‘GÉtœõ#B¥&FÀJY)“+e¥L¬„JMˆ@Þ)¥•e”é̸@äk´ƒÔ”(MoW ¢`ö¼f™k@M4ôUBòûqaa!š‚Es­£Ã!fËSÚ£+þi%<\eŸTˆS§Ô ¾-`óæÍdTuuuhDEæD uðàAôÚ¹s§Ö²¦½zâ¹4g6l˜eJ?VÊJ™X •+e¥LB¥ÆE ï”R:.ZÿST×(1ØžL’šû šÉ¤.pü <áZ°­YP*¯)ñI•Ö¹ );åŽØ(..æ@5¯©©Á¤7jé¦4B&u™····¶¶Ò€L‹–«ÁÈ:dÈLVÿ%•º¥þLA/õh¬”‰P©g"KJ$îë¹us+eâ¦gѱ>uʱ¢c7=Þw;¥´Æ52É xVÅvj´zI&z j¢ËCu«Ä!{x‘ʇxªJªnrâl£ÎäÉ“1O«¡¨Ë\ ÑpnÕ)G”ÆÆFM¿rå ù“f½“<8p@C$ÚÚÚN#j¥,B?þøã™©þNrc#CJôøÇJ™t†ÜÓÈe¥zÍ¥¬”‰›|WêÖ{¾ƒë•Öˆj²˜P—¹2 d­®®ÖÜ)-L³dÉö|æ3ÒVK¾id„†Þ*I‰õ³UøœãÇçš2ŒÃW­ZµtéRN¿aÆ-[¶ ËŽ;ZZZȖ𦻻¥Ž;F"ÕÐаk×®úúzUÁDÜÑ£Gg:†LB¥ÆD »•*ù´R½>M´·Ræž)¸å7¡^Ú¸q#W!yâBœŠ¤í±ÇËt™[ •Rê6èVʤ˜üU*°Gï-¸ñð©ÌÊJ™¸ •z*9¥Ô}‰L±àÆÓOýH‚£!X JãU&ÿ—Ê– H‚oóN‰O©›–œÉzü žxâ 2•+W®_¿±H…ZZZvîÜI.…,襋§­­;vìÐr…KÛºººM›6-Z´hÁ‚*²‰F3gÎ,//7nÜÈ‘# У¸QA_ø6ï”P©èS©›s+•ßæ*õ`ú‹RÉ”*HªTÁ½+•´E:NáÛ¼ÓSX©›4hùÎìÙš E6´fÍåD7nDåJµµk×’!iìCYYYIÀ¤I“8º°°püøñ£ F1¢¯Î½, ‚L_#¿n3Têô)LÖ{±RYqüºÍž’®Ó«J7è3>ï˵ÿ¤n{»IßFò÷™/§ðmÞé)n]qýNÎYPp³j9ù‹Ÿ1±sgÑÕGtÞò¯1æž°RÆÄK.þâgL“ôWCcŒ1ÆcŒ1Æ“EôèÈÉâž,½­ô¼½,þMйþs¿éGŸµQpË}f=¤Êæ;5©åÖŸ}¶ÆB¶Þ× nù[h¶ß®I·þY<[c!Ëÿ|_ÐãŸ,¾Q“r>¥T–湦T–~Œ&õäÊ×ë­÷™eäÊÇhRAÏÑü½‡jöEDŽ)ÕëSÓ/¸Í/TY 9ö‹ß}½?7ý+ VÊÜ ÷Îßì …,Wª÷Ï1{oפޛjÜò<«ÈÖûºAÁíL¿#ìíý¤Ho–öþfë}Ý q7³ûv1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆônZÁ6ʘ8±RÆÄ‹2&Nü¿”1±b¥Œ‰÷ø+^¸ÉcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcŒ1ÆcÌmøÿ¡ouðµ>IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/surfpart6.png000066400000000000000000003301511477365367100224170ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿ‡+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœì½{×µ5|õ·8²,Ë’¬ÞI‘Iô>ƒé3ôÞ;AÀNŠ¢,ÙÉMr¿÷}½÷Þ{ï½<ß^2íľ¹Ì{cK±ÏJlID54 »œµ×þ«¿âàààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààøKÆÏ88þ¼øù{ï¿ÿÞ{|øñ'Ÿ^½víÚõÏnݾ{ïÞýûŸ8œP8ðùüPÐçu»Ý^Ÿßïóz\N·/"Äb±h$à]Yzòðþ­›W¯\üໞþ«+÷¹À)ÅñŽŸ¿wñÒ'„+W¯Ý¸qëÖ­›Ä§‡ççŸ>]XZö£‚ ƒD¬1ÉãõÓoÃô(*ɲD” ú=NÇÂüÃû·o^ýäÃw¿ý g”úÿÎï™Rßùô?ü‡ÎñãÅ?½~ûîý?™ŸŸŸ{òøÑÃGOWVN§Ëí yBÁ@4 S”òúQQQ C—‰O²Â¿×ëv®,/={ôàîíëŸ^þ©Î.çÿ÷ø¾£Ôw…Á7ñÁsü8ñÎû—®Ü¼óàᓹùEDzciiqaáé’ÓÅàö Ûóûõ!JRþ¤¦e™ªB!JŠR´òyÜÎUzìÓùÇÜ»uãÚÅ÷þàUÞ*J}©ÞÈgÏñ£Ã»/}|åêÍ;Ï=]t¬¸=”Õù‘‚>âE)7àB´ò€TTAy½Ù$†¦(RLˆãˆPDAçêÊÒÂüHuçÚåŸÿþ+½e”bE§ÇŸ/_»þÙÍÛ÷>™_X\^uûüˆE‘•IĨUð„èDTY]u}Õ“ðøÕ4t]ÓT¢”Hw øÜÎ|èWPê7ÿäÉ£‡÷n\ýƒ&ÅÙ•üÿœ? ¥~?T½™¿Ž Þùàƒ÷ß}çÃoܾwïþÃGsD( Q^TMáH$„ü®UÐÈ N­,//Saåñú©d¢(S5ÿWUEDŒòzœN/ ø<+ާósssOÝþìR¿³+ùÿ>~°Äï/ô†þ*8~øù‡Ÿ^¿yóÆ[çË+hB€<¾ (+²$D£QAˆ"ðx¼”üîU*¯–+Ä*™ÐîD1¦(š¦Iì~«ÄÜP}vÊüéþOüAê÷6Qê9ßׯô¦þ:8þòqñÊ­;÷Yíäñ m󣲪Ê1‹‰8…b-¾PÀ¹¼J­º÷yÜTS…ÂBLÑ(ùB¬+±¼ìôÀ© …èçX¦·8wëÚ/ßùÆ«ž]Ãÿ×9ÀÏ¥8þ‚ðá­ûO(7›s¸!-ùÐ}p{#xЗMW•˜( av åFb”ŸJ¬€Ï…ž…7(k‰TÂüçŠÃAQ‰Â”7"AŠm>ÅÐdÁë|úèÆ§ïý²o!¥x{‚ãï‰wqXôÁ•‡s „%O^Ðçq!ñóŠ²ªÈ ÕGºihŠ$?‚AJûœHû–W=aA^ºëªÓÒâét\zÝ+ËK‹ 8vyq‡HDP¬LJC—cáÁ­K_÷(ήãÿóøaŽz9¥8þtüüýK—?ùö·îÏÍ?¾ûîcº No”ÂR,ŠZheyŦ?ˆ1„(ËÒYŒü^v£Ã±ìô…U|îÕU·/ HF<…ý®UëðÍ-8Üþ¨ kf:[Ì›1Ϫc‘jª¥…;×Îâ§Ç?¹qûÎíkŸ|ôÉͧ—uÑ2±ýrAÒT)J1 í¼€ K‚ ‚R¦¡*8¾ ø¼.t.èÞÄ8I×)›s9]Lƒ¤›¦fißâü“ÇŸ€RA5íL.—Ĩ§2-ÍÝý諾ßÙåüœß#¥þV!áý{âøËÀ;^¾ópaÑáXx:¿ì†£‚¤Èa?’7—Ç/ª– AF´êñE(i‹JªPÚ'F‰S^·sv€ëòÆ4Ã4$JôÜÞ`8J…(çêŠcaþñ£G/®ø‚BL7ãɤ)ÜK `ÔÂââ²ãÞÕ_ÌÞÌï]Ò”Nß¿l–kü8þápñÊGO—WQ+9}Aªsbš¦„|¬vòøbzÜ‚D)§;Š ‘0ñF×p„+Çb¢ ¡Êb'SÞ¢†.Q–èöøq {Ð;_f¤Gž8\¡hLR)Ä™Šès¡¼B'"âÓ»—goæìrþßÏÞñãxûðî'×ï=œ[qùüLð‰D˜h\x©>r£’iêJ$àõ£¢,Q úN)Š"3åž×ÃJ‘~lhÈ)0QeE%eƒ++¨¤æææþ(J1–9Æ¢'zîN4èÝŸóñìýpJqü%ãçï^¼rçÁüâ2D !6ˆ¦ %ÅĈßK™œ_Ö Ñ“"Áø¢©rL” ]U5Ã2éús4Â$²^pNUQÊër,- e¾²ÌŸÐî[\t,»ES„h$*(ª$øÜ+hªS0 ¡ÀòL”~F©ÿíø^k©¯ë)N)ŽóàÝ.^º|åæ½ùEJïL°‡¨’D!Ц‚Ó¥`D‘(¡|M5- Xª¬ª£ Û¶ ”Â}P £S^×RNÖÈ[^f'UN'º+*bÅAQÓU‰RK—Û¤’ ?Šú?boëì’þ_Ïï“RÛ oø¯ã-Å»¿üô³[÷Î-¬8½HùBh&Ì.íP0)òx|8ƒRdtʃјlÆmK“E°NÑmÛ Û‰€aÝe¥ a׊cy……Ã]Ö¸pbúÃtC•!&«ˆ}8Ñ‚¾B¥è§*ªrŸ½³·…R+ÞðßÇÛ‰Ÿ_ºrë§ÓÀˆ¦o#¥d!Jü "óÂ2¯(—° ]´˜@7C1Õ²˜†"†ª¨H¿“Ñ Tåh}ޕ奅ÔJÔ²‰*_0ª"uœ‘ˆÊ5 ‹QIÁD•a¦¹ÈÎ{9¥8þòðî¥Ooß{2¿°´<ëÔ¹=lWŠ!åcbˆ0BVLÆ\†D‰](eÊÕbÑ A-DE“LL"ÒCbUPtÇX !Kˆbãèä­°¹ôÑWV\¾î!ɸEÄ0h¬êq;™LØv2£ÏáÍQê9~ áN)Ž¿ï¼ üâ£ë·>^Xtà‚g‡On?$a¨IŒQ舂(D eú¬ ¨¨,\ùYD#úQhBñIŠfÅ-TU,dE#¡P(èqBL±¼:›ùe’Ùe—Ò&w  ÃQ™J´D2•´SÙ\ïñm¢Ô…Ù?¼=Áñxÿ/~ô:wŸ8¥8ÞÞyÿâG_¾|ùÓë7>q¬¸Ü`Àµ²]ì²'ÕÑË“pb“IBŠ¢4ÂÕIRŒ²¿0ÒÁqê*Iûá×$Y7ènBÄ£ÄN¹ © e|l¼—rÀÕeëESŠ93"£r-„ *´,²Od²…B±ÞœÿÙ7(õ?ß?¥^³ŠSŠãðáG—áº÷Ù{ç–]L,ò-/>}º¸äôP§È,‘#®ˆÄ ƨ˜n@+ ¢¦)²RšFw ¢Š¡Ë!?wýôÃUøq(Ìê*å‚*‡DÁ(½ÒÊJ2W/°azðƒ¬ÂåñÓÃ%ݤJ*Wlur œRxïã+W¯öÙ[wÏ/º|Ä !ô`²Ö±âö…4íp.%áP(GÙ´âq¢TL6 LºÓ-ÈûA%n«"ìüÈãü¬çÎ&AƘ|AŽ…ü ”2DzV¿×½zôî ž¯š!þ ¤NŠQ`¡¦›V2«µ[â7(õ?žß;¥.ü§Çwàý(>ݸqóÖ½‡ ŽUºÁ¿ ‡åU®ì˜mô Á(Ó¬¸×IÑMÊìØ\¦wƒáxÒ–¢ ”Çãq¹`”4so PìdxŸÄ …E1&}ž ³û >¯—…/?=z•8¢œR¤ûP²iÚ©bm»(õ]Œâ”â :êÚÍ»wïܾ}ïFÞ½Ìi7—ãµÆ‘†H$Î*$âF€¢‡eÛ‰¸¥k:ýËÐ51ôS †D-×p?è÷–+6ÏŽàï.DBD±¯G#¨ú¢ðä¡×¼Ä$ˆŒr­®¬zT›QØcMDQÖ3Åîšçò[E©ï›þÛäxóx÷Ò{÷ïÝ»{÷ѼÓýZáÊÆ‰RhÃÑ%9RT¦‚)@ìpS|œM¦ Ù¹&2øÂápDµâ†ùùê²Ã±äXñ¿öó ÙYñ…0sñ#žFcš®)”,^ × w!Ä䀔-zˆQHû@(D;Ÿ?SSùÖ0þäŒRÿÃ9À)ÅñÃâ½+×oÞ}¸°´´øäÑÃÇó«Q` ÁéXZqÎ: èFH1!àe®|n_ÌHØqÓ²tUÓdI3•¨×åôR0d‹’A1`6Ì‹KN¿ ™V/„Æzˆp¼ñx‰¦";ëB”  ª _ Ͷ`¸ÑEÌöyY€C+#³3͵¶qF©ÿþøÞ)Åe³ßÀ/!‰]vûBA×òü“'O”¸}E)pÊ 8Û@ë‹Ïåò‡µx"nê&Æ7Y6,1äÂ1“Ï/ªqK•¢A?Ò¾%Dz/,ÅÐßó„¢1}¿@ðBBûëÄʯ !(Ã" kª;p ÌÆ:^7,‚)‘i‡ù·‰Rß9âø¦ÿZ9ÞÞýôéj $Ä(ÄhRÀ³âpx‚¢DކTglŠ„  ’ä3aYYq†DÊ[$碈³)CCWœ´xe]‡ÜÕëÆ ”Û.}ŠQbtV]ðyœèÐqg=D¢ë¦ŒPJðRÎ9-´J.„)/S8E„˜š-µ7&ƒ³Ëù¿;øT/džϞxé2—b4‰Å‘¨¬ÄˆR8`¥*ú¨ôÐâŽbÄç&F¹ªiÇ M•À2*† ´û¢¯˜OÕe‘j%k…2·$閥ɔ7Â* rÛPøç=þS&±&¹,_ˆA…t8GœY¸,¯µý¯¥H5²•Îh2ä”âxëð‹Ë×o?ò†±€FÂTºBÜT#WfQÊí—uÓ`#¹R ÃKŠª©Šò¸\¾fÙ8ß…V¡ŸC"Nü’E”Y®@T‰…ƒ¬þ¥˜(Éf<™J&âñ¸Š9¨ˆ ŠáÀ¢”x¢TDRM_ ?PFˆ>ác,4³0É4„¥òµÁúôkJý·ç§Ç€=u¬¸¢3Y8įXD£›ñ¸!Ï(åqÛ„ù?7¢¢tF)T¶–Îæ ¡ðÓ)ë£(¥Shòc˜bNåd®`„žÛ0ã‰d2N*1½1BØ… nÖP‡ÃQŠy6U_*ª‚_Qj1вÆÐW„B-'JéêÚh<:»œÿ›s€SŠãûÇíyšx’„òcï"æ)¨<°SÀçñx#R‚8`¨Ê̈™3ú y0Å´¯—iË]žžš ø&sÙQŠ^ˆò;óº}숊¢–dÙT—ÉbGÈ€Ïë\q,9 G[=Â$é¯9‹ç‡ãÍ·ŠR|Pþ'wï.¢N¢¬ í\Ç×¥tLF;³`X6’鄉̈́,Ž1‘ªÆ„PØLç2 Ud *¯ð$ n¤_(¤:Êç™­hó°¿³‰V*ŸKk2½ú¼>?ŽƒhÎK,»”0qáºeñõúB3UûkË â”¨'º£½Ý·‰R߉7ýwÌñC⣛+X—‰¦ 1‘43=bSðP*@SMs6A8kÄQ5%c‚R¯B1“ <¢"HŽEC¡ šl¡ B–JASÄæÞ}°Fò;S,dtE› ²å×!"Ï!-~B„mEœ-*@ËÜKeÔë·˜‘ aJ³›ëûg”ú¯ÏN)ŽïüòÒ¥‹¿øà“Û+ž(únÐìIš*˜ˆ.ZÌXø±í“-þÄŒ!»œ‘ºá·QÉH%ãq;U,Ò+„^³5¡3ý¬G$¶% Üp³Ùw'´°%“/ä³ ËÐäÿ>ˆ0\?kè± ¾×Ê ö鸼>z{HGÑsgÏÿÚöBÕxm}²Ç)Åñ¦ñΗ?½~ýê§7-ùCBgC¡pT3¥Èl% ý™-wÃÌG!"È6ÌBµJ¹O¥S‰d&_.*k¿É Ê'&+’0´‹ý ª0z²¹B¶¢mÅåél.›M%`~„Øä‡’ÏÅt²xí@8 xW1„ˆ)DÈ )nQ© ˜Þ/E\¥ìÓ°‰R“3JÿÕÁà6;[0Åe³?1üâÒ§³%ï+ TêeDň«ÁÙFlÐ…ïC˜m@¥Baƒ½ Ævµx2GµP:_¨T+ÅŒ" 1U'Å"ŒRˆŽ¥ëHûfÕO„˜˜)_AA3(†Åí„ k$òÍÆä—)€yéÕ#½«f}-h,1ïÍë•0¬¥0#³L¡µq0>»šÿËs€ÏKqüÙñÎGW>»÷þ¤v>f˜vRA›J¹Ö*Û©á KŠÈ?$‚AÖ·ˆJŠnèF"™N§³ùR©Z-å“’“1{hI ”ÇŒšñÙÆ]íÛ †£Ù°%tO$ÆÎ® 3×S ¸V'“÷pOÇâüüÂ{£"E”ŠF ˜õ#14ñ5Ý0 µîæá6§ÇÂ{߸y㳫W?»uo~qe….o:jÞˆ¨™q ‹]X¢¶ÈÄ?eÖgµU€ ‚R²ªBa¥reB!O´`-uͲmU„R0ªX˜ð€"ÝÐUE’TUÂÐQ±ä ¢¢‚RL±Ž£eâ[зº =.|&(F¹W3µ½E"Ìtƒp·`o"¦àì‹HœÈ5»[û_wüþ‹s€SŠãφ‹×ï=Áúè‡ÍÓÅêœ5§Ø]—<)LÙ—ƒs ‡7BW{$èe‚:?zl¬(ÎŽ¤4;S FÓIÌ𢯘¶­ËHã"1-nâ¢GjG¨©b$„)w§‹ù¤+z7À7Ó4(“Ä Ï _f?;Êò£Œ¡0˜å 1«°Œ1MQ3è‰mË¢J®7ÜïîpJq¼Üy²ˆ¬Ž’º—öPw¯P±"Ìd¡E‡§–a˜æÍúl¡Küf'VD*.çb1ŸµM…SQnÆä°®Œ)&(eZÉT:‘ˆ[†ù^f€ôšRš™LÒ v2™´éfŠsáÒK?‹R~+™îÃH6á-K¥E)b”¤›Ét6›LäJ•ÞÆæxúu{‚SŠã‡Ã{×z|¯¹ʽ²üz›»×Ïâ6L{Ü3[J—ÏÏ6@¹=ÌÐÁ»=áÁ,ް€bL*eªFà‰Ail,Ub)ù K§ø¢ÈBµÏÙüTLÕ-D°d*©æ€)‰l,‘-r[¡ÅF¢¨´ò‡£²“g]™°O¤ÊͰóåF£Þ®Æ›kg—ó~ü?¾²í§€KŸ>Z¿ê2` ØBÛíeL ‡Ù”‡uÐýȽ–1źqĪ ¤*±3ˆðaßÑĈ'P¬³þ.|lå$YÇ‘²:4õqC–4C¥ðRÁP„¬Œp˜f ©i±ˆ—Š-Ði¡Ôéfé‰RV–©ÅØp4‰Šª™-¶ºkíõÎÙÕüŸü\ŠãÏ€_^}8ïcƒNH°À V¿Š¦ÅÅh˜M ÌúV½h`ÃV13i¢â˜Ûb7ÝNÚ¦özðLÚ ÀgYÖ,‹Ii*݇Y)–%E.󧘡SÒ— jˆHGÍJXJl6yµ‚]¿l2±-‡!C˜«0kÀH€[‰VºÒܘlLOƃ:§ÇOï,®†p\Ê–k Ó=ëM`ö™çÁYj$1ÂtA^7üþ)'ô³ù)EQíl1«I‘P'ÀaAÑÌx"Žk0ž`”b­ YÆø¢…:Hl؃â‘̈ELE±;³oïÐÀ eQ$îlÖ¾_™9Îú^²C^IK&Mz>y&nb'Ϫ]ª&Û‡»/Í3Jý§ç§Çß?÷ú÷{—/yƒLÏãuëÌKÏㆣÁÃVRõO#æµÇ,&ÐÀfxM3,;›Ë¦t9¢Gù¢¤jv:ŸMÊQ\à,o$²ÐsP6˜L Ûgj2ÜF(Ä&– Àø]YžJ騾Ai_œÒ?]p ì†#™Û 40ùt;â–¡kš"FfBZb§¤åjÃÉþñîóWí·†RßXÍÛ?Nüò£/}tñâ'7Wý!A¼®™¢u2+L²¯zÅ"²¨Ñ0 ·Ë†s®M§²(‘L¥P71ϨГ¹B&.ÒÝý³ê }8SSt;¤´Ï²ÔݯDŒ°àÖÌDì(ÁT6Soг&v"•Œct»{}Ð×ú‚D‡~?å—èÎÃí¶]*ŒÌQ €¨[Ùêhºÿüðè´];»¤ÿ“sà‡™—â”úâýKWoÞº}çî½GóKN—/€) V?ùCLq y‘k­8C1+Áž…ñ[Ÿ7ŽÆd4¸鬡!–èšjØ)[ŠRcÂYAÒsÅbÆ  ‚‚"”a¥R ]K抅l&°U‘ Iù‚ŠAOO„£’m†OPe§rùl1ÊÒÙ*l÷±>NÈèubØâ .!A¤š &¶¦ÉJ¥|6_¬Ô6÷O^lµÏ.çÿøà”âø‡Äåë·ïßðàÑôœ/ÛØ„î4*'AVc3ãˆU· %ÓÙ|&a Tñû 9²RéL&[*ÒålêDÙJ% !ìóØÞA6rÅr’‚•UÄ€EžD6“4l±\ÊeÒI›rBÔk¾fÚ‰l>ŸMÃ;IÓ- xIJ÷âé\1Ÿ±­D2njôÂ8òа…,cè’DJM´:è1 Û2ªÁÀÎl±R¯•+õÆÆþó㧇ӯ›èœRß>z8¿°¸ðôéÂÂÂÓÇ*š,H¹Ù6™4B3 jÄ¢xQ.%4™#+ˆ Tä$SÕJ¦GHØè‡’ô3µ],†+;[(Å UÕqž›¦EᩘÏf‹E¥, â&ŒñЦ/UÊùlÊÐ43™Êär),É ™”YaÛÂ$¦)+¤ºÉd‹HE ">ÃŒ§R)ÐŽíw™ÿR2[ï¬õ[íõç§ÏžooqJq|ÿøðúSŒ( D«åU—k6^áf š¢"ä=,ˆ „墅r……%ä&Ó…\kÕØB…m ¥Œ×½I|#F$ãVœ(’/äó™T®L‘#ŸËçKD©”¡ ­¤²-3…‘-ÐUƒî^(ä ˜0ãYPŠ¢#1Œ½4¼,U'FéØO%È3alUi®­÷;ë;Ï^>{v8ýšRÿÑ9À=Ñ9þ¡påÞŠÓÅFK«nhçlJ–õˆ’¬©"†&4+M§R„ UNvœµ°-ƒ‹{r!Vbî`1œæê&z¹R%“JeòùB¡XÈg2Õf”¢B§£ˆ¤²9 ¯/,ÉlaÌÒTªŸ2ÄS¶e7^(—²ÄåB>7ÀSbý «ÜtYbcø˜ ާèÑ–.ÁŒpaq‡‘(Öúë£ÁhçøÕñÑþÖ×Þo¥þê;f²ÞôÕÀñ÷Á;/}òéµë–¼ìð 6±fqcbèõ€`HP Ötƒ3,A”³•r:æælÝgL¡æèê§2'&‘öø£’F ;;™iõ»ÅHO×êÍîdº{µÞg IDATttx¸>ì~ÝñûÎN)Ž?¿¼ýàÉ¢Mˆ×òT‚ÈHÇ¢Lç-H”]) Š@1ÕÊS ÈÁÝj¨ó4Í*7Ê…r% K$lbƒD Óé1hVÈjºX­Sq]ÓM;‘HåêF³V­T Z.Pg„b>Ïlå5Qê$¤˜ˆ¾Ôì¦N§l ϨÈb”MÛC/âY±’ÅR!c UÇüÜãG?™_p¬RÞ*¨µ^¯·1ÙÙ?ÜÙÙj‹œRß ÞûàÊÍùÅe¨zVgÖáþ ´Ṳ̂!Ƽ½¼°¤hŸaÑ®Sí\‰ò4º°-¦PÀüºa¥ëõB¡ZIÛóƒWK䵜#Š’–£ô.GQâ5ÅJ­V¯W«µV»^­å)ìDBÌc™ù<3‡?‘^Ö²ãÌ“6J)aÒ==žN³éI–cQæÃ6ÌG™å™–Ìò©¸ô8ž<~ôøñÜüÓÌ͇D9ßÙŽÆÛ»ûÛÛ“^:}F©ÿøc”ú.å§ÔOWnܸ¸âAë‹k˜+JÛ¥‘rQ2 ÎÚÌÓcµºO·šÕB>“N¥ #R¨Y“é|‰Õ9¤`з6X‹ 骷 åvT}%«T@UåR±X®wZ•¼&ø¡¤%:‡"¢lèˆGEŒ¸©€;/¼’<þ°‘HÄñ 1Yy£˜sRXÓ¬dÊ6ea¶BdŽbïlm/ÕRĶÒt{kkº=ÙšŒ×-õÏG©?;™8¥þRñþÇw<]¢Ø„«ÿ0»;J b¹U(íózf“¬—]ºÔªóÙP©ŽÑ㉠ÕP9Ì]$“ðР-×ѵ0X%%UÏ+•l’Ò>»P¯KÕr;J½š¶"f¼cX fé28 žCQ°>Ç”ÛÃuŒRAI‘±;›yÜÂ~)6²Ñ}5ò­,ÍÏÍ/:g3¿O ,(z²0ÙŽ§Ó­õÍõ¸Ä)ÅñçÄ/>¹}ŸÊŒ¥_P r)€Ú‡m—„à&°¹=¶«Ð‹Õ¸’¢¡;­ÈŠ‘ÇÑlfI—éŠV4"K)“´àÁlδâº Ì ¦Ré„¥@''ªY Œ&©¢*ds…zµPÈç ÅbÊŠE¼.”r?]ú†JÆ 3z ò91Šå¤ŠèuבYΊ¢Èú|2ÜgƒHQOIa?ůzØB{ä ô¥ [éâÖÑÑád£ßé ¶xƈïøã”ú~LÉÞô5Âñ§àý÷– ÝóF%I„Y+ÔÃ1RDV•s§?ØnÐ`Xa=7 7²‰“§Äà¦NÁ#Õ|¹”O˜*^aydbC¨‡:)Ï¡´’Yd!v$“©l®T.äòÅj£^)•Jôи ¹TÍawo(ªCÁ—H¦“ì•dÊÒ”HÀ»Š}†îˆÄ&< 0­àÁޱø”!™bNc±Ï 7?Êgö·‚ ÉŠOÇG§'ãµv«ÕéXÂ#þÝsà×Rõ½„ª7}‘pü øåÕÇ Ìþ.QuEExH†ˆQ1M#ª í&ŠafÌâõ‡uãõBó‹Qš ù¨Z*çR]Ô¼EœB³=žÌf³™L!ch²j¥“Ä(Jè’옷˜ËWjõF« ·¤bÖP"A7š#ðT ET+‘N§)ê1Æäj¹¸¦„ýžUf)`å LY¬8¥Wİ…9?{x‚\ª»–ËN}30 %v¦4=zùù¤ßl6 ýÏG©ï oú*á87ÞÿøþÜŠÓ…”ÁŒRÆØŸ"D˜gö*a¢–®PQâu{þln ³¹^hБ‹ ‚¬Â59,R„°TTR1ÍšQÊÒ˜l”"É$z…œ¥²Ñ&@J䘔(„Sëuˆ!*Õjw0l—/š‰”mjfq­8´{ÅR>• Vä™"ij1 &ý‘X<™Éf“6&®ìt©Ý®SæW”ªë˜B…,]ذÊ*tØ¡wº<0>!d–2ðºeîÑz²Ø¨6_>;öµZ)û J}•¾E­¿›vN½é …ãx÷Ë_þìÎ#ÇŠ 6—GPf#zlUõl‰1KƒnÁÀ¾A ï)ë-èlM¡eÚÙ|¹\Ê&ÕXˆ9™I%0 5ºRªµ9ì5[ZµÞlÖ³qèðtl~Ò ,ˆ'sÕJµœŽkªj%sùBBS‘!ÃjœˆÏds٠ųD6_©·ÚRÞÖA©eJüß¡°W(æÓRðÏE©ïÌøS)õÕ/ß$Õ›¾^8þ8Þ¹rýæ»÷2ŽÜHÂ3-¤1cÊD*“I1?/Èö ±ƒë6’Ì”â<œç¦`±L¥Ž‘Êó¹T‚= •¦“¯wÚT©äòÅR!kŸ¨¦ªU Eba2É«ÍF)k²¬eòØÃgk UÓÔ¥˜lÐ}  SDˆkŒmAû  >ÞH*†C&ë£ Ñ€wÅáX¡ VM‰¬ Ó1;™)×z­Ù]ÛÞÛž>;ÝmUŠÁå³Ëùß:þÎs©¿_Ú÷ Z~ýDoú’áø£x÷ÒMâÓÃ'sóó Ë.¶µÆ€T‚Í5©š…é"™.BfŸŒ±YMYðÐY.…<‹­¢Ë4źm°—€{l!e[°>"d³¹1¨˜Í`Ü)mèÉ\™Êªý¯†äKµf£ÅÈFù4M:Ur‚¤ZèÛiqÍ¥ØÉš‹IŠc±0W` R¤DÔL€môžt‰­·‰ø=Ëpë„^>"ÈŠD¤bNš©l¡Ñê´›ÍÎ`´w¸?Ý;8ÞnQÖ—I[®G6J}×`§Ô×ï‚Mó ‹+QI£l;óøD…"MfÖ#ØÆw´›©äÉèpò—dI¶©lîµæ#v:_ ‡VUįL.—Í•Jù\±R«–sh`d’V¼PH§2ùR½Q/#îdr¥j9Ÿ‰Ç‰Iv´¥ÈP+Áµ2ŸKURÉ$E;˜N*&v)M$êlaŽ‚xÅHç(3„ñ˜‹²“Ü ×½ºêö…£Lq¡Q“a¥ê­þ Ûé·öŽŽ¶·&“õ:%›)3zóóËùß<~¸©^N©¿ üòÞãÌ¿/.¹B†©1.øIj•0èI …b£A_¾Z«×*éT¥R$TrIËÊ•jn³¡sNy]:›NÄgobl(JMj•R6M/ƒ‰'ì»QXNGÁÆ¢*NÂÌ :¤ ÅÂâ$4~a¶×€9_#0‡¦p {$Ʀ‰R­î`m8lŒw·Ã͵Z>eÛ‘ÅŸ}M©ãàžè_áo9\€k•(µèðÍ”¥Æ˜¹Û2’…R!Ku>úØl#@(jÚ ”Eš"™6Sÿ¨l*ÝHå*ez<&ýlÊYÕ“ 4®T*Ö{ýN¥@y …«|ºÒ$j5t¢ÒjÖÍf¥˜Àd•Èå‹”yA¸§`E”È\-$„Š uhD tHÌ“¢*›ûˆi÷êUÌ C/‹[¶ÍijBL¡·”²U)3Íç ¥F«Ýí ×××7·÷¶÷ö×»Ýá ^L[ºãê7(õ¯Ÿ\=Á1Ãû¿¼ýd9Ž„\+‹ O—Vü+A‰-þ P@²’y*|`Ї6Å®  Q¥¡) t šÃI0è„þž•È—+þGБɀRÙtŠ2»B¹XéûíR¡G“"Sè4jD¨n'“¯Q¸*•+å‚…ÚËF<›@{ãõªy,H¤l²Tɧ tì±ðvØZPæ%¡á`r>JÑèÈ$X¿‘™“p_R$YO¦3 S#QÍÎà5k.%}ƒáh}4Ý?ØÝÝv;ƒ~½”1äÇpJqü©xïã+×nÜŸsù (8——n_DÔ!vÅžQÕu#‘ÊQ¦a:6ÌŽn)%-8£°‘‰H˜ù…ITôÇ“”æUk…4M’SÅ\&›Ëeâ–™ÈÂ8¢= ÚðZ™X¦?ê´Úív¯QÊáD+™/•²–ÍÖÜ$èÖX\elRËäJ•tœ~&²}èÛEÙ–7¶Åp¶Æ0’Œ\±R.Âwm 9Ãà™gŸ ÃÛ&ºeÊ.KåjµVkvúë£ÍÍ­£ãã½ñ°Ûnw)J)ÁK?{ë(õí¦á›¾‚8~¿¸týÆûO—½l«™w×ᘬ©B„j_P3 3µ8²>¶o:àDÓù¼mH‘°‘#Ä&ü €HeKÕz£–KaèÐ(WYË{v¼¿½I”jµk…”è~÷gß Ô¿v|ÿµÔ·Iõ¦/!ŽßÃWoÜ{0¿èò°}K×ʲÛFGOŒb¯š+(Àª2™ÂÁ‹²q©ˆ`çói[“QœÀ±~E(À2øR£ƒCÜt\5KõVÇLyôú’EJñèËm4ÙjW²8©­õ'“A·Õjõq]–5+]ÈÓÿrqC·lÛÔ +ë8¥• lOå1›hÅqq‡ÍA†"¶ʬ‘sæ“n§™á¥"1züÐs½îh*Ke#žªÐÛítZ­ö`}<ÝßÛ?<œnŽzÍF£UΘžÇøˆÞ&JqkÌ·\ºqûá‡ÓëcÓn×ÊŠ7Åb˜„«®PTÒâ¡ïƉ*f¡˜„åq 5pèƒ-³IaÅN×ÛÝN«V¦Û“åz«’O§‹¥Q*‘¯4[ýþ`sû`¿SÍ婆é&cPªÙ*šXË‘@u•§¦ÅST·aS€c2ÌZq;W*)~%RÐë¾æ*'xÇ0ò¼níÅÌ0R4ƒF³hNØÛûËvS.ÉÜœU#A”êv»*‰RÛ{Û»{£á°S«Õ›…„â¸ÏèìrþWÏN©Ÿ4Þýð“«ŸÝ}°¸âõãßïó:W—W‰R²LIŸßíĨT€Í¾ÅØÉDf–®l¶Þ–ÍðÂ{"QJÝH1¶×*fLM7gC„•fÙÆà|²8õ;›;{»ÓN¦ã­Ñhss­Ûi6¨ð¢Ë߯àaЏ¨š…R!a±õPº&Á÷Y7Íx&Ã4êñ¸Îš°«ŠRPQ›Ù÷aµÇÌi‚-ÅØÚgñ…0[uGYCf˜Ñ· ÕV§Ûëu)znïl¬úTFеj\òßþÓÙåü¯œœR?e¼sùê[w>Yu3F¥<2÷)™‹F°ë¡ÌV(Çèf)[Järp§d‹¢º×v2—Ç;L¹J£1èÕ3 *¤´T¾\*ÖÛ[ e×7‡­Öh<ÞÚ趪ȇÃáhH”ªåA)•®üT+âÍd¹\H°!þˆRôغËì‰RÄ ¦üA5žN£“ç@•uð㳑X6lÇTÜbžë¯ídEæo%¼ñt¡Üh‚S½µý££ƒõáZ¿Õªåó•’q^fŸ§ÇùðþÇ7ïÜ»ÿèé‹QôÎf\ËJü(—‹Ýð ò"¶üÝß@DŽS¸¥áh«Þa¹œÊf‹¥4vЫµö UF3PV’%J ºÝ:5ôRuªQëÃA¯×iÚýÞ`´F¿¯æ3”øa²=gÇÄù ôu‰¯(%É:ª õ Øxp”¢¨c¥p Ûfh5¬Ø “õÏMÆKø”aÙîòxÑy¡[$ÊTíD:“-«õv‡(5Üœú²X,ðLóÉT:›+Ö×6·ûÕb.A¡Å²ûƒ•%ÄZ£Ýé´›Õb¡ÜìÚíAwÐ'fUêíf½94*y¨[)žˆ¢Fï)_ª5êù¤®Ûé\.6z 2~¿‚ÌlDW’fKI“ÙB><&?˜1[soN¦ˆûÂ~ç }UÀæ)"ñ43넹”óØÒhöG£íÃ/ž?Ûõ٠ŨDÌwí«OìŒRÿÒ9À)õSûo?„­¹ÓëÆ4#‘ÉçR±0M¥è²cîbÄHSz²ÌQÃÍ¢t…‰m3=Xà ¢¢ãÄ'“O'R”CUÛƒõÍn¥˜ËdŠÅte<êÕŠXñµ:.(Uªw†£~¿Û^öÛµZ“x5˜Õg:F¢¤x2™)UjõZÖ6Œ1*§t˜oñ!å0щD)Led˜[`ÂT á™BžB¼&àÞ‚#(%63"£ÿf·_­•¯è•ry1Õ‰R[{Ï÷òxwÔ«gð5c~õ™Qê_<8¥~Rx烋7îã yvI"CœâQ0 ýnæãúÚ%2Hw±=†Ò/•¾ÿÍDšM.ºA¿¤†³qì)L¥ éTö+Ö`ЮÃú(·6ZÛÚ÷è–dºØjyšVmcØÛØèw[­ñF¯Ñ¤ÐÕök•z%Oä² ƒÞP"Wª7Zj>Kù½"e¦ºÉ¬ƒ¡h kv0±%03@;U*— SÐÇ‚xh‘î±AE…ø§IQÊZ1ìö‡ú`>œXWÈeRé\µN/ßîoLw~÷v'ëýV.“´¥à£ëgÛÛB)¾QþíÇ—®Ü›syÑÜ ¢Rà˜géh4D¢!˜‰c[T€ÙÉRª¡61møÃ" K¿¾Æ±M#Ÿ2Q¯hex™lr¾r©„4¨•à%–ŸNFã½i?G9V¦ÔjÕkÕöpØÝ÷FC Xíñt²Önw»íV·Z,¶šÙd¹žOʼnœÉbµÕn5j…,DðÞÃz îLìÄ×ÄÄ(«±4&@ •ÜŠ3½9–ÏÃÇÅbæ}°šaæMÁ@D¡‚ SÆ9 V•f¿Óî­&ÓÉç¿Ý íB&a…Wo]>ûØÎ.éáàQê'„Ÿøéõ[ «~Ö‹@×!ÌlÂ!‚{íi‡ž²# O¦üFãj'Ê÷Ìxº„Žª Ø-§‹åTœ5¨M‹ª™R©ÂfÜ+­~·Q¢Ú&»öâps8Þ;Ú*¤óùRµÛ–z÷ùáñ>±¨;Œ·ww6»J)éË—7Ö»^§”ÏW«¹B£³F¡®”°(³ÐI°á“‰¥»°â£Ú(†%lÖƒøNÙ"ó•ÀÔ;AìÞ6Ù0ÛæCê(´½®‚m4}Pˆ*•ÊåKP«Ã­ét:ÞšŒ·öÆÓõA§˜«Î'×.}pœRß>þìæ½eÄåp0£ùÀ%M…³Ûå\žùu…Ø 9ÖA%±0™;ÀÎa0› @ÂÎ2Hß ÁpLµâlÍ4S8 `ž±,ÅX"¶Æ³„~~:d³”ÚTJ±qGpªÔmî>;™l®÷ªõv³–KˆþùûŸ¼öÑqJq|ï¼÷éÝ%l´€..a®tibÕ'Š ù@©•Uo`f•ôtΖ6Òv2]®µê%ª> l®^mR˜ËW󦑭tÖ¡&o4š­­õV½†y÷F½Ò8|~úl£WKà‘ןlŽO¦›ƒãç§'‡Ó^«[ÍçrõòÚx{sX£˜HdP’•±kâ)6RÈËèeó¹LŠuÓw˜¸>ëØbÅÕD14ó‰fc³¹Dl‘g!ü:­™Ç}‰ÀXšžºB‘·PiM¶÷NŽžîÙ‹¥Zµœ6Cî'÷.½söáqJqü>ºríæ­§«Ø‹Rv$3në %PmF(ú‡ã¾Ûbû7£QA520"·°ãM½RâO¥Új`ÈCK÷z Š>µf1“¯uG“!å{åFk°³Ñë G`ébóäôp:ÙÙhÔ(Š5­~·ÝÞýâÙþþ³/¾øüxsÚm×s”Ø5kë“ñZ›2LÛJëz)›Íç1Û¤ÃeÛڲֶ̀Ù.x˜ªƒN^O ,²Þ£ÜÎ=Xææö}5ë˺.Q„%<Ø6™;äUSEìשvFÓáúþѳÇÏNOw{ÍL*“Íj‘ÕÅû7ßûúó;£Ô?{pJýðÁõ[wî?vQE5½ GTX%ë°R @CA ôú8¥~Üøä³'7ýyñ˜0³»Ã1¨"ÅPTQÍA1*âônè0¢+7•/—ÑÃNÃv<Ÿ+æR†s±tcs­UÈWZƒÑhs:o®÷&›ý^¯YªO÷&ƒáÆÖö´˜I¥‹Ý½¿ùÕ:œñ'íF¹±³¹V*nî¾<}qúbÿðùñt¿V,´z;'/¾8Ùµ•t¢µÖ-fL]•E6‡ÅN”0: ã%ÌJM‚þ`Œ›Ñ[Mb©6vîÒ×F‹Oç?~²àpû#ÑpÀ‹CÇ2–¢zm9eÚ>¬0¥úƒAo°>>ú|{º€²o\É¥mE ,<þìòï}ŠœR¯qñÓ»—]n'QÊÅl“ocô2%¶I0ÄÜY³¯&E'Ës3…b1Ÿ¢À”+³t ²4’dd[[ëfg0XÛXŽ6Ç£Ñúp÷Åt¼Õïw›•úÆh8íìîN¨*TÖŽó9j´µ3¦{»ãQ¥²¹ûêūӓýçLJµJ­Ûï½øâô`{½Óªç3ýA+›˜bñ†Š3ZfÔb‰Ìn"аà…!­dÂd ‡œ:ý—ci~îѣNj˘å^q,¡É •df`ɯ&ì]¬5Z^m8 P{ð|²9ž<;Üo–²©¸öÌÝ»üÁï}Žg”ú§ÎN©)®Ý~ððÑ“ù…¥ÕYÉšì"³Ã)÷Ð¥G_òl¹;“Ø3 ŠN™”EÌç2(þe¶G@©ö&ºîöö×{õþ¨×ëNžmo¥úÝF£Þ\ÛÜÞ úõr±Xêí!ïÛÛO‡ÝÖæÁöx´¾¹wôâ·_£xùb¿ÓŽFû‡¯^îïLØœo­U+¢p"¾S‘ãZ¨^U–ôQÆÇÆ$È^º9Ûk8›ò!zQöê]u JÍ¡–òz\«Øk½ÌÖ††£Zmór·¹B™¹Mô×é-íÒ[Lw&£.¶é„=ŽÛWþàÃä”âxïÊ£ùÅ¥Å%ú¿[4½8F¢ý•eªC"3FQ6H—g‚Í£›¢˜ºÀˆã M6+N¡M&ÑCD)¾6Þ™îlOÖzëôõ>Z_ëvÖ¦Ïv·7ûýµA£VëÇãµ>•ý•b¡´u°½½±¾q¸7™n®õ·öwvvO¿…ˆ­£ã—§{;“%aMªÇÐéƒUKXRu°nºÇ:R? 6bs…°øƒ³3lh¿"á€Ï¹¼0ÿdî)ñÈIEÔ²cqiyÕ £¢d&ˆHÕZ­Z.‚RmJûúýõÓ—Û›ûcúؘlõ«™´¥ùWç¯þâ>NN)Ž«÷–VVWW¨^_XZfËháÎð‡¢’ ~Dq}úa¼{ù³…U8ò9—ضâôx}˜ÙõúdM†¡˜í+&Üí° 4‘Ê”*%Œ:$ùb>Ÿ·4IRLLâY¦Ê´tVqmck£Óémm§k£Ñh¼5?;ÜÛÙê6{µÚô`g­U«·ÚÍj©ØØÝýâ`{k|z²³{xôòùMóâ`{úâôàùË/w²EeÖÉ/OŸÑ 66¥,&2Ll”gr\‹r¾¶ß ù=¾àLhÄ”{6ÅV[”ôQˆŠÒ¿ƒÌhf ø¼ˆnºÛç§Òd{¸asÖlb ²6X§8»¶~ôÅ«£éöts}Ðív›Xº#æï^ýÖ'zF©âà”ú‘áÝ?½~÷‘Ó€SìâÓùù§ ŽŒ†éÞˆ¤ZÉLZÃÑXT° $ÅôF2•Í—ÊØ¢VÌæÊ¥b©h©±˜‘Êç“ñT\cÿVnm}­G· ¶¶¦[èølLŽž½8Ùß® ƽzc{w»S¯Ô»½v­\ììîþêxoºýùéîÁñ³ÏŸïñë¿9ÝÛ¿zqôêËW¿Ýmlî¼úÍç'ÇÈã~>…bÎ4mŒ$m « sÙ„e(² úü!a6`,¢üƒuŸ†f Ûƒ:(…ᔕe"µ¸¼‚JlaÖ-×oµZÝV¥±¾¹¹FAòàåÇÛ“-úïêtZÊzå ëáKßúP9¥~²xïÒíKî%CÏêâÓ¹'sóŽØ …è‚sE ÃMX^«+&Ö±3+‰™Q§R©Z«Tº½–­Û…Lckõ´Î»ž,ö:Å”iÙµÆ`ãÅÛ›G§G{{Ç/~ûÛ“ÃÃÝí½Ag8ÙšT‹•Ö`Ø©W‡{;Û''ÏwvÇ“/õåÏÆýõ—/Ž??ùÕ«­­Éá_ÿî‹g‡»“áÞᨛIسM¥™l6m™c¼£ ª®àÊŒÆÚ~˜56Ù&6 S8¿µ„pÐçu»]¨¢¡)÷e”ÂN6ýéR½Ýëv7·[Óí­Í­ÝãϦ›CœùÖ+™•kKs7.¿ó­ÏõŒRÿø9À)õc•›OЈô­ís¥ž<ž_Xq…E)r;WÝ1=ÎV¡r)ÛJ2$Yg9‡}¸™\¾Þ¨4FýL²³¾Öû½n.Îöò–f“ˆåJ{óÅóÃÝӓý£ç¯~÷¼8:>ØÛR…?Þª*íµa»ÑÚ;œŽ§{§G;ÓÝãƒýõí/_¾:9:u‡/ŽŸ=ûõ‹­ÍÍÉÁ¯K¼ÜÝ\_;9õØQ¢T*“†ù2•y³’I×4)¿DC˜•®à¥Ø~P}÷0Ü^¼·keyÆ(ª¤Ün_àõjmæ =tÇ;“íéx<Þ=<Ý›lPÊZ.Wòq¿Ç¹<ÿèúGßþ\9¥~¢øàÓGOW]^¯7™@ǹ@AÊá F$YŠœ«(Uó’O°»p`IR1‹O94)L+]*ô¦Ïö†­•ìƒn»»¹Ñ ÚªT®´è»è÷·wwww&Óýƒg{“a-°“ 5¸¸ðtþѽO>øö'{F©ìà”úñàò­§ÊtX‹ÊuJüæçž:}Øœ.G¾€ !*Ö­$œŽ0’›É ØôYÄ–hCSôx¶0Ú?Ú 6Öz½^³=˜NûM6ÑhÚI «cÚ»Ï(Þœ|~rxúêÕË/ÿúW_žìíŒOž½ØTJ•ÖZ¿3Ú?œôûýµßžînMž¿|>îí¬w:›ÓñÑáþd½¿6ÚŸœR!6Ylo p«MåØÜ0†ðmÔKPš'a!©lñ!~¡°(CŸD\£tî(5ÛÒãó8YE§§¦-ƒ·DzhÄs•ÖúhØM‰R{»“éÁÁñÁdP‚{»uSá9÷àÎÇï~û“=£Ô?zpJýxpgŽ.#úfÆÑ¦ A¯kiÁá pqÕJŽ|n—òmcðæ²ò•" +ÝpŸcJªÐYöÚ[[k½v«7œìL†Ý 1ªÚÛõ‹™b¥69zþ|{2!‚ŒwOOõå¯óåÉñÁѧ/¦ýj¹Ü™Œûûãµ~ÿäÕÞæúÆÎt2ÙØÜ½ÉÚæñÎV»Þ†ÏOöwwÇÃõƒçÇÏ·¨R3âÙtC˜ÁOå iÛŒ‰Kù ¾ •mÛ%FE%&HšµV’è´SJÈh˜‡çlÄ#a3+``„ù‘if®ÜØo ×7ö÷÷w'Û‡û‡{”@·=ËósOÝùìýïød9¥~š¸øxÑåöxØ÷2%:b8à]qxòŽavJ“¤0öpø)g² rIÑKµ" +Ê´lKƒA±Sµv·ÝÙÚ:Áhw²5ìa(·6šl jÅrµqðìôd²5ÙÙ­mì<ÿâË¿þͯOŽŽN¿<}5í×*åÖÁÁÖÖþÆ ¿þùñæúpk:\[ާãýÃ×½iëh²Þ¨wƒñËç‡ûG»ë'‡Ç£b‚ê§4-™Z³Q)a ©mÈ3J…QK±ÑBÓŒ'³”¾Æ±:.zø¹ o(*F0âÇæ+ìꈩF¶TM¶F›[/¨ :ØÛ›ôËq1äs:æç=¸ùéw}´œR?E¼õ®Ã A.¢6j‘ Û-ªñ4„ä–®„}++._(¦˜ô}±Õ!õI§DË6U´§#^nwÚ½ÑúZ¿7líŽé[½F”jO¶ÇëÝZ¹ÞÝ?üüÙæÆÖUZýñÁá‹W¿ùsrtü«ß¼øbg­^-7ŽŸïî¯ú“ƒéÆúÿÏÞ{0Öq^×¢!öÙ–eÙ–Õ+%J, zÇpzï½Ïœé½Ïœ~pPRÅNyI^ï½×öö(Ln"ËT®’H¾Ø¶dŠ h€˜5k¯ïÛ{- äŸ UUÍÑB"Ui ü ^ôcÎF®ã™¬!…x8‚§Ý8r¯P)&c™J»Ý¬V+åb>þe^œ¿^ˆÙòxÖÊsét<âGµù$u)ôý àÅöÎÁq(‘ÄüÆS„-Šœ,k£‘¥ ¢ªD#Æᵕ{~ðî[¿úÇ'èô÷ õÿ=GÝBê¢^½»½·¿·³qÓ÷¡!WðfDη ˦“±ãƒõÕGëØ1…ã8·‰%35œÅ+³hs^ÀªÀ,!(‚À  hŠ’eçY¢IÈ …$‰îö,<‰b¿KíNôd?9ŸZg×O/\¥Óh‘pŽô¤"ÇÐh2ZµDNÐóD-QUØŒW+æ“Ñp育QävÉæM¦ýaŽ8.•’ÉrÍï:+å|æË˜à›=þ}ÌAGáãØÆÂ‡{;_d­Cã·¶±½w„<œ„RÐîµ;z)•HQ¢ªº.(Á ™cê…\â¹måÞÝ÷ßyíWÿpé¦n!õï]ýÉÃãããÃ=\G%…›˜Ï Ieûk;hŽa@T®Üj”Keô²+ÖZõ|& …CÙ–aX†€â–QdŽåX’Ï2%•P,tEµÑ&¶Û‡†ÎðÆW—×cýüÉçy>ñ¨-hšc,'K¢$pxÌAHž-‹’ùéLätWT†lÖ@]¹Ó‘ç9“¡ªJ"]N…ÃÁP4“Ãôh €P)¤RŒ§nÀç™Iøê(˜ööön|ü¢éB­V*dR±ðŸ=²µˆŽÚô‰:A#šB¹†RD¿Q+Uš”¨ÑíÇŸ\9—‰Ÿîlm¬=øäÃwÞüåϾúÏ÷¤þßç¨[HýÔ{«§˜N†a™¾á%@êc˜Âé,¥B¥œIÆqp.p“ЉçÒÉLDJ½Öìu:€Nº¦Ó¹lC–ÝqeLÔEæ) ðd»¶!‹¢*ñ@Z†J´›­>Ñ# e ÏÎË…¦N¯ÿüÉd<é²¢j¶m–"Š’Èó4EöP“DYW©V_Ñœ‰Í zÃІÐõ9Ó‰§Jt« ‡C±t¡˜ŽÂ 5?•ÄR®ToÖp"Þ¿žÂí®_N„² ÙZwÐÑ„½ï†ßûbþÁÍ€ªÕé‘,'P]F2L×óF£±ER4YÉ¥£§;›«+wï¼ûë—¿êhëRÿ^Õ^}wã ŒF`¸¥wsŠ6ÆÇÁH2S(ä‹å¨“Hз:8 †bhäŸ/µ:íN»? Õì¶«åB¹Þ•€Zdwl0œª«2° 5`,ÛÒ%žfTCÞM¥ßê D–¤i–rÇggg³!@êêbì¸Ã‘®¨ØY=WH ,ϱ$éãK3¹N½¯jó=¥ãXC Hj>qTž(¥1y4[ª•² ô–-VÊ…›M“ºeBëšÀhùãR¾1f(оæ…l&ooBˇ}ëèóâ³ÔI}5³8ìÔîõ9ZNF4LÇu]o¨Šð!…k!wÞ}ãç?þ]ÆÏ õÿüÒd:‡—K1 Ža)€TŸd‰F³Ó…®M”4g¾˜Yš¦I’e‰¬dÓëv(ÅrlSdˆ½ž ëº"²‹7S“¡ëÍÏGŠ,)ÞH×5U]>9‚þ†btôè4÷ À1ð%ŸŠa¾`8žÌdrùj»‡;x$dzjþ€î·;ð3 <ù£ÙÙÙÒ3uMR†¶¤XºHN_Tu GL] ²j¹¶Ýpê Gîøârnó<+Ɔe©úo®'®;2e ešCKŠ ¬Qi¤&#×PÑvŽáL–gŽ.5èñ’…*Á°ÍZ­ŠQéD,ä¯îâ¤fm༟Ÿ/à{hà´zÏÛq 0t°³áû¶Ü êáÃG«›ðOà´,Ú –Z= [€”+K:BÊÑ%š Én!“ ®=¸óÎ/úÇ¿ûÏù¤¾NÏ`u ©ïcýðÿôå_¿ûáê6fOG£±Ð vzhk4A¸u‡sÚ¸±›@“4N!<ìK$’Ù€„àDŽ Hô "‰¼Ç)EÖÌÑt1s-x‘+Þz¥û C$YV ]ÕG®,ð¢e»ÃùÐ4íÉäÐp²˜"ÍH¦çZ³Ùüb6qÅr9r¬hÐ<²ª=$ÑìQ¢2ñ,Žnµ‡Þ™­ò“³¹*sr*ž)ך > þfJC§‡#þÆ1&!‚ðî ÓP™fÙ`Ái}[0s…á#è§ëç’$³ùJ­Ñ¨w­œ¨è¦*[@ʵE`©n=“ŒmòÁ+/}í÷-¤þÐëü“Ÿýâíî­ìœý¹RÐP‡GLVóO“wÑñääøèðè4x³Ç$‹PÄÿa¦Pk´Ú]rÀ°d·Õj6ASžúÄ€“DàŸñÐÐP9Æ|ìÚ&Ú8Q–5×64ohH"` ½‘ ­áÈs&Ž;[Ks¦ã íùÙå™g9£ó‹«ÅL„IÉ¢ÀÑ|— 8}êT¯Ñ…ŽÑ”ùÉ|" T«”NV L­×JèLËyàŸøMRFÆÓ@¶¹hMd¡ŒTJ¥\:ŽŽcGûhà‡ÔäßJmlíù7W@ÛÅ\¹ÚôÃnX^”x&@ hJ`¢YJÆ#ûëwÞüéWL!ý½z©ÿë9êRß¿úÁ ?ýůßüèþÚî«F"¡QþÊ8FDïìÐÐÇÞ}ÇýÐÍ@7Žoû®ÕF«Gýn½ Ò¥Ñn·á™#)FàXN²\ àãyîäxD"p”>ž¹¦>4dA0g:Z2? AçÏwj‰$‰½ðÚììbf¨Îtùøñbæ(ŠaðIʼȳڀ¤™ÑÂÓˆvžÏMx¾'S‡¥ºR&×lÕ«år©PÈe.xY†Ym'è#s|Š¥R¹|)àÇJ%R@dÅT,äËo? ñÙÆ£ôÝ}ŒäÆ{¹BªX©÷ú$ÃqFÞ°œ”@÷;¥l"ÜzøK‡ÿvÝBê»^øÙ¯ßøàãëÐÝìàÙQ_àÊ8&ÕC¸Ý$µ¿µ¹¹ð#NÐî.x“¿V,W«Ð õ;•‚¿ç‡ù„mBÕT<2W4U•$Ý2 óñÓéd¤ðš9õtMq=Çô†I°²ãÎÓ‰0èÓ’iM/L{ÄZ-Fƒu:tó¡(ê“åÕå ›DA×ʶXEGð‹¹ j°gCIà-è#»õb>¥ZÙ·_O¤ðÞ‡·6¶˜o“HãÂx­ÖìCÏWHGÃáX¦…«®ÝÐ$–æuMU$þâùÉräyšlOæžij†aè‡êt%Ãv¦#Ç副æå¹f¸Ù¬Sªm;³¹39¢`NÏ//Fºbʰ5~n1ª®MáÊÂuLà¥Á‘Áº|£œ+”Êtr9>>‘äçÃûf~¼Bù„6c!ß© mÓ|ñÐÑÁèÆÍµÕ‡<\ÙÜñï0s$îo­”ªU c ‹klÔ ÍP™ê3Še[¶2èRñèñþæ×ÿñÎá?¨gú?ž£n!õ½*hù^y÷îúÖ.º˜c:´u8zä'êÆSÅR6&ò÷û¾1+àíƒ÷ŽcÉ|´z£ÕíQ Õ®¥¢Á`¶Òèt:í6©ë–.[†n`x bžU\UQ/{ãùrl«ÞPuL¡ÝȪiȲêPý®l&cSV ™oÖÝvFó%Gq†$/./Ï ƒc8žeí“Uwz>3Œ±gŽBrçžã£sÄÞ³T­d⃽ƒ€— Žn®­÷°£=ðƒDÑÛéoí'à…±ƒ'ç˜Á»úè(©´ùÜÛ?8òû½|„sUD§Ùêst¥¼¢Gªº.z­TôøpãÁ‡¿øê!¤¿_·úC­?ùé/ýæ;¯ =íàD(vDÑŽìaÂf6_.¥Ñ¼ã3ÃAÐÛÛøŽGð…pJçвÕîúŽa­ ‰HµÙj¢ÚMG8i¸šO"òÉÀIˆÇ—¦5{<Ñ%]ÕFÓé8^A꫃~ßN&ÀcŠn(ödbΦ΀èªuvq>B»Çª&ñæhlÞ eOk²<›ÞÕl<õÜK™(¢*õJ*r°·»Hf‹ÅLV¾èó“¸wo°…mÝáMùkñx·C²þ•Ôž?­´àÇŠf‹Ý+Š8ÞK6°”7 -Ë`ˆn_PEªß©GOv7ï}ðÆïGÔßAꎺ…Ô÷¥^øÙ«o¼ýþ»Ÿ?"È}U‰Æ1Ú¯ê ŽÞA±hèdwB#ÉD­&OéB¥ÝíöÛ]’¡{v³’ÎdªÍ°A‹²$K’,ó’$ ’ƒPp(ÆY\]šEöT¡úIô©¾¨hÃ[Co<´TÃ=Á].gççŽØï3£Ùül4Ö´ÑRDQ¤¤ñøÜÒìÉblx3Çvœåã˳óÅTÕX"+¥Z³]/Ń€úp¢X.åpPþi Ý0ýaØ­í›Í Ldƒ÷É.è§Õ‡ZP­ƒ®>ƹs?õ8M媭¾ÍæxêÈ#¹Ó9ÀÙnúêwÛ¥øê'ï½õó~ÿŸü-¤þ ë‡/üòÕ·ß}ÿ·ß{´¾{š¯]I©l&‰Ž ™|!ŸI&á’±h$x/íýýÃ@*ÑqpÉd+-r@ö[ÑÇÓêr¹Xk5êÍn—ÅA#‘ç@ýSŽÅá×áòr©PDŸ0†xv¿CŸP SÒlW×]ÛÔ‡³‹ÑĘ.¯–çK ÅçgS{¨ó Wy–6Æ“¡(¨Îth¸3×2í‹ëål<O,Í“µj«Ó©¤ŽC©l¡“µi@ IDAT\.dÃ~rÀÑþÞÖ&NÖonlnïììøSæxãØÚX{ôðÆïü¡~ƒKQ{>âvo’’™bµÅ)¦9O¡OÒ¬39›Ù†NöºÝn¯ÓªÇ÷Þ}ãåß{0qS·úƒ«?ýÙ¯_ç½>øà·Ÿ=J*/²è*äÛ1¢¥B"‰%²…R•„~‚§·T«— …j§Û#:F³G2 pIçáWÐI ªÂ³8ýœ5:ŸY²ÏêƱÑ,Et†éÙttð¯Xžç¹†çMG³sŠ9 áb明jº“‘¥Ðk†d§Ñís8[gêž·˜M=ËM{.÷¡í´j¥t>­zµÚ¨æB8±äOíáÜÞööæ:&´åC‡ÏÕ•÷ïݸâs.Ü@À¡k_gªõVŸ6³'Ë©E’¸8¼˜)’ìÏ36J™Øêû_a2ñ;ê¤þ·ç¨[H}÷ë‡/üâ×o½óÁ;w|ÃïŒ?Â,õX(€蘾øŒzÉ`<5ªO¡L¹˜ÆÌ¿JµÞ¦hŽg;•\¡^+ä ŒÄ²d¯Ùlõ> ãÙTd],ÍHªÄàð0V¶p-õ’ z}>: i];Š(p‚¬ÛCSWe¼^œŸÍç+¸.”a«ª5Z25`lOí6ªõFÏœÏmÃð Ç5œL-kÈvº}¢ß­•òÅF«^«4ÚÕlÈOë8ò3îq*P³¹Ž·¹«è›»ƒö>G­À‡Ö0JW7×z;)ºûáî|ôàѶŸb ïï‚°:>ÁãqÅûÑX<M¤’q¼×9mRÌçËð<7;ý-ðt£-7*ù|Å0‘Ä.nâeÛ[,ÏôÏõ[µB._¬@Uµú¢£¿Øæ:´w¡ß{øe’Vlc*îqløq þ‘ßêêú¦Ÿë}J¤Ñ69×›/lšЖFv­¶¿à[ n½÷óçÿ&<ƒÔÿòu ©ïtýàG?{ùׯ½ñÎû÷WÖ0Ýå“•À)ÆÂìá…gðpgw9 =˜³ù|*‰íz­ZJáÊ^$‘ÍÀ£Z.—«‚"µr©X¬t¡Ï£z¢)€ M! rÀ«‹‹«Ë3‘U–‘%aÐïvH‰§hU¢ÛÐ4‚äbYÀ+//ç<.¿÷º@c ~vr‡–î§c šFcy5õ¼‘§Éš9ÔYJ5 ià¯äOžž{º®È‡Ã؆©ËT§V.7;Ñ'- b©ÃpԀ⠥×H¢)E‹±]Weëà5‚d˜n«ÅLf³‰ÕkºŠÁöº´d;†®{ KÍ©#³‚3¼i£³åÂsŒáÔ3T Å zõ>Yœy£ÅÈvêt¤³$¯7kõ:FÉGR~ã$ÒÈÆOŽv·1«ØÔAû·ê‹(DÔÞ“ß.üù»QÜGY…G8€~|cP˜¯´Ú-€¥X¦é8ÇIL»UÊ ML!x¸ùè£çºú²n!õS?úÙÏõê»Þó'vöOâ¹tøt{}0%ôä§ßÂøŸd¡Ri6¡ç«U;d¯êǰŽƒÙB!ß"–ê÷z„nj<Ï t»ÍdrÕÚ õà_ª7ê=J³ÏZ|«Q¯W ù|PΦ۠th‰.¼õEWá9hرE·ç8–v© òp124Ë6Mq´¼¾¸<Y ¯¦ËsÓj"odzéxtñx6qK7h;›¥r©Œ…ÃСV* ùð’¬QN„¡íó-ùÐÿçàf–âKw¤?Pj׿”Ž{÷¡3fú†NOq½@ßý§àS<|ýíf!Š&bÁÝ­¾ñM¾Ï õ?=GÝBê;\?üÓ—^þõw¬íàKyû O%¢ÁõÕµmôhö‘ ¿E;‰ ø¥O¶#ùt›ÆÕ×4Zö' ]‚ (™ (Šf»õ\&•,HŠ*³,Cö تÛîÅ’ZuûëМdpk9¦9€TÏÖhÖY^štGpFS[ètú4¯h²([–â:ºÀº#ÏøÅÕõ“'W—³¹çyCgtq¹˜ÆÃáhx>±-EšIô¹L®\«Ñ‘< Tš/Õºý^» ãÖ×öÍ||ÕÐÈEƒÇûþß!fóax¹‹§é>¦<|´¹sˆ¦A‘ñ·jÀK¯øì-Û–ÙHµX`ÿ`góѽ·~ñ5kñÿ¸žAê|Žº…Ôw²þÍO_|ñÅŸ¿ùî¬nmoÁËxec{‡¬AeøŠ½ÅŽ™t"8>ÚÛÚ9‚hBá(†<û«|åz%†ÓÕESšN’‚`¹n½˜Ïdúš&ó¼(2Œˆgú¸¨';j§Ù#IbÀsšÚíRÚÐPR(8S×ö4v0޼‘È_]>ùÍW »,]à­ùõùåräCjhŠ;Õùv­œO¦³•:ÞBEÐ#“-7zý^«Q-"Kù¼ŒYè3KÄCÇûhÞ÷å$:N+¡–Z]Yyà×ÃGk˜ŒËøÛ倽OŠ/(ªnZ@ªZ*‚8e±~ÿ£W¾ÁqßÝBê ^üÅëo¼ùö=z´±µµ¹öðþýë›{‡ÈRǸZXê4“KÅÃ'ÇÛ›»‘D*…ÞÇ™lÖ7FÊæŠÕF%?=‰—»4Ãp64[Ýv‡:j¹P0¥–m…“{¬@õ ‚Ñ<‹ì2ô`ÀðœÌÀ»^Peè$ITEZw c6yC™£(Né~Ñt½œL§3KìwˆñÈJÎã‹§þÛÇ‹ñH•ØÞÀ™Ë­ÐÉ0Z¾Bñ¢À²Œ YÞx:29zÀ:–‰'ñ‰RKP 7ÞyMfwh©J¿^nP .ãàUÍD^¡%Ý4³Ï>w5E’G@lÉ:Þp6¹øô¯þê‹ßžM¦CËt:Øß÷ïð+D‰tЭøUXÈç2ßs/˜.åÓ艉+‰¨¦Žüžïªîû“³k{GئðýG'ƒvO‡îhl;p.ÍÊšÅL:ÜÛÚxp÷+â­_ÝBêû\?üñËo¾óÁ‡Øøí¢øÖ¦ÿ:^Ùc4.H¥2«›N"SÅ0*0S€0›kTjEx ËF»ß­çÒÉ,4u$…3å=ªÓ¬Vk­Ùcdn0¥ ¿e"×lXÙ‘wº˜N]CáÉÛƒj2™©“Ç+¾&G÷ϵ4h4àg9–á5KAöæ3-1 Õ²FO/—ª,+è«‘Çîp<Ÿ_^ÿåßüù“Éhm£Î´‚¾ bj‚ñb¥UELù^³éð1º`¤K… Ž'ùøÂ°}wåæœïþý•µýc¿ÍMg ÀqÅb‡FW±Ù|âÆ@”–Ìã˜=]†?ðÉÎæÚÇï½øƒoüMy)¬ÿîkêÖmö»U?|áÇ?ýéK¸ÈñÞû|øpmskÓ_cÝÙÞØØ ¦x#šŒÇâhËœˆ¤¥žUnwqž•§©^»Z.×ñ°‹ì¶Šùb»Ï EØ~§Ùéløˆ×M‰UwPˆF²>Í0¸%E1úùõr>:¦¡ÚÙTîWZž¡Ouš¸+Ñé0®g:ϱ²¦J¢ŒáÇI“/.Û1ItÏ—CE–eo2½¸À>o8?ŸÏ&gO¯Ÿ ½©Îô«…øá>íãjràÔ:D0!¦Ê˜sZȧFAH1tó/~wpþI šÞûäã1àúÁ£@Èô. Å:޴𳳉ímÛÒH¢Û'›ÅðññÁÆÊ'¯S…õ R_§g°º…Ôw¥~òÒ+¯¾þú«¯¾öö»©plm}}c{¤ãX2Žþñp(€JÄ"A?4•Í”–chü«×ªTš=7o;- *Š–eQÐ4ðS­Ó¨öñ°N5Gt·“‹FJ= Ű4söÙ“åÙùùÈR@ÏkçaÐcÎßœo5Ý^·ÝaÛÐ4]S yGŸ-½‘eÀÎ.–K°&&×WË‘k»ãÇW³ÉxrýÙá#tª©Xè`g‹|;£p,•k4ë\.c2†qczOÉéB>9Ý¿I=8ÀðUœ˜ø!uï÷N0–+VªÈn¥:s‡`u 56Ï´ = ;™8šqî=ú䃗~¯ÒWÔ3Hý·ÏQ·úŽÔ‹¿þà#PL+÷>úà·wïÞ{€ÓÕ€ª=|•ïFR™$ZOȨ¦¿'AVrÊûƒnaÅôL@5±T·…z=‚âxÙ°µA½\ª4šÍz¥Aã¢8+KЮ±ÕB"Öc¡ƒµ!Ó/.—(•c9^4g–@’Œ pÍ1D«Õ¡é^§Ã[†gK2öu*ϳ4 l¥éÞìÉ|dYº$/.—“™*(ª:½~2MSŸ¼¿½¹æ¯zÜóµ²¾µ¦rèÐÜhÔ«Õfû\N3F‹¹§}šÎ×+õz)trr8ÜZýào2,ûwõ RÿÍsÔ-¤¾õÒëï߈¼ôšš{¸„;àk›{þ‰Øq"—KEqHÊÚ@De2®D*×î6›}ŠeèN£Öhw,Ñét»íV^Ù<¨uµS-•+õMT;\ÚD†¥Ì ²¥€éê ºÉªö§˙³¬¤hÓ©Hõû^–gIxÕ“džéÌmi@ ª©cÂ!m›šfö3Mr Ùºbš™‚méן/à¦_\?ý µ8»¸žN{¥tø'©0C$ -^¶­`q1…«þ¹|…ùb1:ÆQ¤½Ã££ƒ½›ƒ¾ØöÝ»ÿhmkgÿ$äCªÙLÕ»$t¯ ðŒÑ|n†¥)šØ(WkÅ ˜ì>ú䵟ýS8êRßÇúéû¾mà8&º ÂŽt¾V½qè‹ÅãѨ_*‘Êæ‹¥J§Ýð[ŒÎfŽîyx"Ǽ4T![¨µEä§´£¾±šú†™b)›8 à9ûáñ1€âæv÷L¬š+æq—?M¤KµV«V)e³Õf½ B¤¡‹ù1Úºã<0@+‘.’Q´vß? œœîïnm®ƒ–B'—«7/œ½ƒÓH¶Xo´:Ý^d$IÒDIÑ¡éÃK)Mâk¥r)Ø][ùðo~xþ·u ©ï]½zgõfÃ0´³»³$õp}sgS8ö¡CªÔ+ùHðS•ðB3®á8}”+ÔêÐéµÛ}M n΋5‚Aß°6æF7Hª•Ëä*¢n—dú $±6A ú¸Ü‘)õmòAr¨º÷Ù_<]Φ—3A˜N Y”%²ßÃÙˆñåH¢‰¥º.ŽOè^^L‡ã‹+]×L[U¡œ_9*GçÒkWò8Qƒ—p," h®ï‡*ËŸîãÔÚæ6nî"pNnâ¼1r8‹bî\ðó¥xÅ}©Pè,[@¯Ë"¤à¿¢À±ýf½AÐT§Å"•W¿‰ÑÄWÔ3HýÏQ·ú×­?~áõŽ‚áÐñiøä`uÄú‰ëuÄ Ž–GId¨R¥šO…‚áh¾\­5ZMŠyz@Ñ ÇIÐïp²Jvš]¢×i6 Z‘EY85]¤YŽÄ‘¤I8EV•ð_fZ:ð”a‹Ë«3C3tW' žQNÄë*~ ν~|9²dÉ9+ºc_,uU‘˱,ÝpçÞxzy1ƒoòéõd>´eI²TEçKaЬ’mè9“·ë§XGoâƒ1ê¾*'#AL3Üó™CÜØ…¿A¯G#ÁP2AwŠ( *ˆ­ž$îïsÐp)žàTY~˜Cž£ÉV½lžOFØöÞyýßõ»t ©ïEýðGú“þê[6OC¸=ÚÁ+©½Ã :’Äêzµ\Èa°z,_D¾z½šŠ€ÄˆÑ=¶Ó£ý.ty ´Õ€ìŒªV„Ñë“´‚CC´–è’¬ )qª®©}lª€U· MLmo¾<[, ?üìñòÒðɺj¸ãùòrÁôkÅ~5•L€–Ëç2¾Ó„¿Šq3=^*W 1Ìb;òC¤xìwxtŠ'q1 ¤–ÍÄ#¡pþ†®Î‡8yqøeëŠÄ’ÅjŸE{@%A»;è¡G1H í¬¿ÿês† üîz©ÿü9êRÿ*õ£_yííwîܽ¿µë ‡ÀÉi`sg·Žq—.WAtÊ™H4_k÷Úu¨r! ÅRð–0Ò¹].–jn·ÓtCç)œFêP4HUæÍzµZor® Ȉ^I ªáL_:À.–¡+Š ²îòŠâœA÷6Ù–£+d½«©š]¥¨ŽggOÎ@fQœ¦Z“Éâüú ÚñI’2{tZ–kYç‹Éhtvñô±ÅÐÙüüüòñh­TÈäê Ðréx(Ê(‘ÀõÃd¶P*¢ÒAtO;nî4ˆÞ„GÇÁ˜?rmb ÷”#¸^½ÑRèèräc*„ä•ʖ룂"4æ"ÃÐhrkÕl<8Ü^ÿðo>xþê¤þ³ç¨[Hý«ÔK¯¼óþG¯¬oF‹#¡«+<\Ý=¼êh¦Üj÷¨~!™,´{}|H*e”T‘L¡T‚W{­Óªæså&A’½®fóT»Y+«õ1 R¼*’ÍZDWÝ] ÐA¾ÿeƒÔátùdìŽÇC ×d WÊEÓìdzÉ~F1M žJÆ"jd–瀥¬ùµÍƒôRмuvvv}5Ñ%QíÅÜQ ñ¤_,†Ãáìâé%àU³¬ñÅã‹ó§×3zШ䳅J£V©W@Mù·Õ~~)¥j-—@‹'_¡3!´v§áfÉc&I ~uº»X,|ú·T†d †¢Ñh{29›OÆ=üúT€„掆ž©Ò4/0ýVWšÎ]…e9XÉ;“é>i¦ãÉd~¶<_ºš(ðît2Ö€»YÑålèy“˧SÇYºÎhþ›ÏÎ/>ÿtÆRÕb;¼b©Rørâ7ŒsG±ž?6™ØéÉ!!’ *€é>7§y§§¡X””ßöù:¼‰-Á¶/’Êf²u¦WoQ<´ ¶íܤ#T«©Jüä`{óþoQ·ú®×_~ëÞÊ*¦¸à€õñiðdo 7ýÕ÷ï=xˆFùðØeKÀ1éD$Oû÷I@Pñ4f¤¤ré/Çf³åZ ×ÚÕ(<ð/6Jõ< 8Dyºß§9Ü!$i‘m”²Ù| h¡^ïPã«ÏΗš¢J$Á.Çö‹ë÷{­f­ZïH§XC—íw;Í6‰ë»×K‡°Îã«Ç³ë§Ÿ^-‡ªJõ»½>ËaÍèóùb1ŸN“åŸýõ§ãóÙòÉòúéõœkãòS0²'™Î¤Ðª%€éX©|½C2ƒZ>xz‚G2_¶u‘D<8ÜÝñÇ÷‚áH~̦Cè}éÜ’Èæ‹ÅzâYݶUIƉ>€”ÀZ¾P®Ó»k+÷ßzù[ùŽÝBê;]?{õ“G›k7AÇ¡Ó#4ÃÕµ ®ƒãS´Š¬Tr)lˆ‚‰L©\ʦb±D QAseõ£:* DT«ÕÈÅáŒå <ÃãEßxpÆcÏä¡ú}Q”-½_Ëe)~P¥Ñî±Úx¹˜/ÆÒèó«™ÂôÚF³Ýí÷:o´8AQû  Çž€g캂yØŠk)ºýô·—ó±c)˜F@Aq4M/΋Åùd2;¿¼ºøìÓ¿þí…íÍ&6è-½•GÐé$N¦S‰HP‰¥³…r‡ še?W8ŒFÑ „åQ¬Rˆ‡vÖÑPlu}çÆÇÃX¡P‡‡éb¥7 X >×:–¡[–m²$p1ÞàEŽÖVÝûðWÏ‘mýõ RÿÉsÔ-¤þeë'/¿óÑúF$ù“æ{¡èñÞ‚>Xñó’¶ŽàJ–kÅ$0>†™\.‹AlI¼-WëÍz)•Hø—:ÅJ½Ý£Ý È”|2VnR>â’eZÃñÈз¯+xŽ­I½z¡j«dÃå¬óOÏ …Æ×_\}kõ61Àˆ6çzTÕÐ{xFÇ›†¥É,ëš®ÖxùúérlYè–à|H].gË‹ÉtqñøêâêòÏ®F@¶Ì¶˜Š~é Ndž"qx7”+5 ×2|i¸ŽEOð:êè(R(ç㡽Í¿^ÛÞ;Âèݨ_hR Ýì}”j>Õ@všŒMÖ K§ûõb:ÌÄÑö꣇wßÿù7õBúêz©ÿø9êRÿrõƒ?ùÅë?ÜÞÛßÝ‚ï÷Ê:0R(ÚÝ„x¸ºŽ/ÐêìíD3Íf.é»å£˜FBVÊäJ8¾SoušÍj¹\,â}o‡UŽ£ +‰È"üƒ(ëÞxäšå:l¿åGÂh —dYP"°ØÅF?ó4ÝÐñ…ÎáP_«E£ãl·Ç*HJœ¨2=ÚfÎ3žæ]—y?À"Gœeò,?+]_}vuhZLÆ‹Ùd¦IÐ#UÎçòù¤?úzˆÂk C‰t&1rõV»YÌÆ£a¼½Ž…O9 ·Jå\:x¸¶r­%Vüa ›˜M’ÆÐTôq•+Tšxo¦È*ú3f¶Ä²¡vjààéÑÆcòÞ?úv¾s·únÖ /þâÖ¶öv·7D6w'ÁSPÑ;†‰Q{¸µ·È”µT,ˆn‘1áÁŠ'á)ª”óùr½K¶ñ”«C‚b‚®N )0€ ŸšãØCÏ1dIµ úRÀÖ9<•‰Ç"±dµÓéÈ–eh²ª©ºéMLbMªåB8‡±ƒKœŸ|ôÖ7Êøšz©ÿè9êRÿBõã—^çÎÊÆþÁͼõšßâá™ñÞîá1žƒö>ôm¿O2…b6‚©êA”æhĜˤ³¥nêe åvÓé’"Çópê•è“‚ JG–eÝr\GW$sãŠb»Îd2”Œ­· áOb¢iÃ#©H’ ¸ÍÑM€PRœêL‡,Ùëõµ‘K–Ý º¬Ï©ÐT^\.ŽÎ •Ÿq}y¾\ÎþçsÇRš¢)¢]ËòÑÀi ÝóüiàSCxd‡§â‰$|UE´–Í$ðë ãpš©%ãÁÀöÚ$©‡Ð´) :½ÜÍô}¡MÇã©ÆÀ[ÐÎÚŠj¨’¢š""# 2! ÇmúñÝÞ}ógß(KàkêRßÁúÁÏ_y÷ÃO6vДÄ_ÝÝÝÇëÊÓ““££0šJÀßÂG¾gÐ)¼ÄS¡Sÿh+š,U­N¯[¯–ÐŒ+—+VᇥJµÖìŠúh6º80N‘š;ÄA IRtèø0EÍs]\ÍPTÝšÏ] ßm7›”ÌõR¥FŸÖ 5‘åY úÄ€áe§“DÅèÃŘ&Ј MQ°‘eiLËÆÝ¾éÕ§Ÿ¹š< (F.ç³Ùlùô7WŽ¥ót¿×î¶«ùD&8îÞ=a¿˜¼!0(èxs©dºI9soè8ަª_4?P4ÝMû[¿w?úàý·^ûå·#¤þèRßÉúÓWÞøð“Û¸W¸³·¹ @CPaèî0> øS¡T!?=Á¸Ðd¶Ôl“Ã2íz]êšÍz½ŠŠªÑh¶8u2'ŽÎÒ4ï¹6Ni"¨ Ë4 ʆN3‹¡Ð‰L¥(±JwÀ)"ÇrÏK Gà~è{Gáí/oL‡4«š íÓÐI3±×vFWOžè²8`dÝ™N'ã¡wõùÅÄ2d ÔX£QÍ'#‰ã½ÃÓX4 ìc&õ‰¿ð~€è¡‘ÀØÆt É8ˆÞͩԗR ^,ûë¢ÍpT4™Ë£ùl&WÀ5ŠoŸY*´g6¤Lĺ(ˆ©E´b+îÝýðý÷ÞzãW/ý;ŽŸÿ½z©ÿð9êRÿ"õÂ/Þ» º`ÿ09ñßÕa<ç‚Ç)‰¢…IÚ»L §Dñ8 Dz5„MŸ–TWëXÜ]àÙ^«†.(5’áX†åTË0mÇT]34‰a8I(Š–tמO|Ñ3Oçg#fÀàÐÖu{ì ZµV«×[]Á°–“yÐ$J²ù‹Óí¬¦Šþr¢¢YC~H³²L3¤2´MÛ¹Ž­K,Íð‚î€ ­Ñd63èõ;•b: íî@§w°8=Åôš7¾#¼ÖÅÙ?°‰§S€°¬o:–Ž…1J~ Óãw÷Nc…²oB ]fö][:¼ªñ2n¤w’yž£È~¯Y>Zÿø£Þ~óÕ_½øíáéþÛìß|MݺÍþ‹ÕK¯}¼‚É…HW~ŽÃ¸·pêC*ÄIÒÌ{]2](•òÙt¶Í^·Ý¦xUFDñ¸ ¤È\·Ón5õ&‡kA CÑ¢jGŽë M…0ÑðS ÍH®7¿¼ZxÞûήŸ\.'¸S¥Ì–@eºª Ðü•Ê4_'8Iàd×à M5,™ P°æNQ’f¥)r  ÷Ÿ=ÁÉ×vA¹Áÿ#ÇámY¶;ž_&Æ:eà¨Ó# cœ÷•¢ö0ˆýWŽ¡ÝÅ`?ÎX+–LÆáUâ;Æúfû€ˆ¾‘t¥Þlâ\¹_©V«ÝaUø*0 ؇Ԁô7“ýN»šÛyøÑ÷Þ|ý—/}[*ꦞAêëàô V·ú篿üÞ'¸´‹wN'þbjÄ7‹Å¬Ý“ã“0¦­JøÌ´:v›dà¥;@;Ö0Ý‘m ÁeU³Mà&–ëÝz¥Òè ôö7LI€ÆO ÀŽ*Ã*Ë8 ª;öðÄ~,ªãδÊ8JDÈN½TnÑÊdÉd:‚çÓ½ñ|<CUD† hËÎ Œibˆv{ :¦a;¢áhì(4P§hÆ®e;ãÉòÒTU†ê·Ë…(µ ‚¶70øéf­Ò‡ÔîÑ1îïbhèÆÐön†£ñl·*shÜ ¿M%öö3•N¯ßïwZõz§×iâÆ2þùæx¸¸Z.\ÛÒUªƒ¾„t¯Y«¤Nïß}ÿÝ·^ýÕO¾]Dý¤þú9êRÿÜõã—~õæ»÷×öà!Ù?Oàa9À–'àSOéL¾X…>§ˆÆË2í›ñ1²¢[ª$ˆ"º–Âó,ˆ"t´³Q…·w“Ð,d¬¨ A쌠š“ùrîØ†*‹æ€ÝXVéäÙlhº&˪Äó<Ó/×$Ó‡£Ù'ÓG‹ùl:^,MÕm“!€ØÌÒ UÀà FGl“‰7™ŒtžV5ÙŽæ®åxãñÓÏ<ÛæØ~»’Ÿžú´„7Ú›©ãf&ìbÛ`ÛÜX_÷ÇGÐéè8M‚R*r©D4ürâÐ,Ô{}‚Àœ¹VduÉA¿Ý&8}2^,ÎŽ©‰"Óiw)–l×KùÐîÝ;ï¾ýÆ+/ÿÉ·ü=¼…Ôw¨~þÆ'+k8»·»MÄŽ67vO€¥‡Ç±4c×»=ÿûõ Rõu ©ÖúÁ»÷ü¨jøk÷$–„£µµ£p"›MD‚áÎèõÐ@ :f1½V©˜Ï›„à pŠ®º=žÎçËùÄÓ5s¼œZ¡4‚ªq<ÇHᵌÈ!¤€v¦“ñd2­Á èÝ3ˆÎx<3UT´kº ›7œ?vYUEQµ'°ÕtîY†¦ ZLè¾7³í$°áCJìw;=j¶XB3Øm6š=Ã{ücC瞊ʅ“éæRÑðÔq`C†7÷`ú¹Àq,ÐXluSë>¤²éx “Oü 7èý©£2¨§v^9 ‡.-ð9Zë’œ2HJ»ÕêƒN«Ýë6kåXà“w_{õ•_¾ü“oifâïê¤þƒç¨[HýsÖOßÛÃÓcìùŽ©Tô`gíÑúqŸ“>Ñï“ÊwžÐÕ‘cÈz¹ÝO¶Öa[h^1ÌéräºãÙ|š-sÛºð³þ¶DZ½éâêñù\u†:O1Ša»gççËåÅòly6ŸØ0 ÝÓà¥ÍÙÄRdIT–"àå.Ë*@G[!PKª–øGcލú»¿²ˆp§:í–jÓaY~þT&|»%gñÅŸ=y|ýÚL<Ÿ©A­€‡á‰h$x¼»µ¶ººµ³ˆÆ1µ1™IcVüÚ0¯¬<|è§V¯oî…Ñé$pxpø¥ÓlÔ¿àÆ,žÌ¦®ãM.—óñx›ÃD¹xô4°»íwv{ §x*ã»H`(èú#P÷ïßøhcëÄB§è|î{#ŽÃ1¼÷Íü¡ÆJ­4DJâÛüÿÙ{æ¸Î+[´Þ?ðøÎxì ÛKrƒ,Ù Å 9çœsîœãé>»Oçœs@#ç `©,‡™ñºu_½º?à}û@æÈ¾|×$íW…mˆÜíÆYgí½¿½×‹94&W€ %cµ4·Â  ˜ ´Ôüà[ûß¾ò•¿ý?3øãq©¿–øÛ·®•@ÂScäõõU¥×óJJ;@ƒ‘Ô 8¡÷Æ& Í`1Fo ô2„6›-i42¨ôqå*ÂhqzÌ*\¡ÀÅ`Õ©VkU2X”Èp¹\©UÑÆ©àGˆI…b!_¤PŠù‰Ôaa%tr™T,AŠ¡é02288†j0y$,D™#J6&mhp„Êd²œ°ylÐ:Âp­Ý¦’{"A9{Œ!ë›1 cêZW™ÝN.U„˜1ÒÑÒØHUW–æ¤Þ½[TUS]C"­º<NÎý¤.]+.-++…öxóæäææ–U¶†°÷ÔÞNÎ× 3¸"ôÔ¨¾csøBL.ÇXãÍMÍÝvwÖä½ùTO¢~;CÊ÷q©g?x³ ¬ºª¢¢²©­·``˜ˆ/Àþ‹11626m½þ¡1›nÁì‰ññq¬¡ TŒÅác!ãÓèlWi ³ÕmÂ¥R… Ãu:•Ú¬Æq…Fƒ‰ÑýZŠéu8&‰¸,Ãåò„R¬ ²¡» •Hq3ËpŦS5Ô¡Þž& ‹Ç—«Ô2¹B†¾“XC}=½#4N«×i´:¥@Àc2ybÙf&´Z+ЋIEB™Îl”òp¥Ò `³èL‰B¥PX,Vk¨§µ™TÁml¨©.+Ê½ŠŠ&0U#eÜÁ<÷*YGW›sçÞ½x½ &•@þ´Y¸r5—œ°¨ÕæÖöŽöŽN`)€*×x\6›‹ % #M `HÚÑV_ögÊÉþ‰8ƒÔ_E|ù¥ ×kš›êkkÛºátG …€ËD܃ð322Jc³&€0ä8Îg D€©î…ÁàðÅ„I&ðù|¡Š0´ƒ1”\K:A¯Uªt¡W*´p\IP–'à°ØBtÝñ¤2læá(är^²>TW‰åNè¤õ ŒŒ3PV)ôf“V«”‘\Z__ßÐn²(sTÉ$B.Îäj,v³^©R+ (P"7iU ^«AÓ/W`rµŽPŽ÷u5i¾VW‹ uíÒÅ‹ˆ£H§‘Fõ¬*=e®w/\8âÝKW®£´8ïzîµk°ÚB©æ\/‚-LpúnlnG\ØÕ×? GÎ@±0ÑÇæ!æs©ˆö[@ÿ¹èòŸá!ðñRÞ'ˆ3H=›øòO®”¶v€TXWg…ŽÊ—áq*K(!Êrذ#(àSG†(<NíF =‡©Á'F o1ÆÉ€ oa2:…B«C•R¡"l6 µip\¥Õ)P¶cFð+¨¾JÄl67ÔF³Y§qzp—ƒš Cé ªóÅÀ]zB˜RHªUB*_†K¹¦B’Õb9L–Ó¡GÕêPõ¦Ò"à D ŒÇc"PÀêïëíe¡gÉçK¸´.pÚmÅvË«ªª,ÉÍ/®†Ù=Xâ…åäÒ‚«—aÑÅE’€d/çôð—„TnÙñ¹€º†Öö®¾6ºSÀ0<ð*ŸI£#T±™Ô0«‹ÕœŸ}çÙþ5CÊóq©g÷ò¯Wµö÷wwuu÷ôS‚ Ä>>ÁáJ• ÇÄBK¬ «&\­VªLf#ˆÚ`±˜,6›…„„Þ •òØ –@‹B£‹0­VÀˆ¡%¨B03½2 “(Pr(W*dqR4¡¥˜\*@ÏDnD¼§Ô&B&’á„N±\¥3ÙM96•Âà*T³A!“H j”+rù"ÎëDÚBT/G,ßÑþ–¦Æ¦ÏW0€¨kJ‹Êª¢¤šZZ[šëªŠò®\FÀ¹rõ ¡ @ÚÄƒÍ ê7‰_Y9¢©ªÚú–¶Þa*ÊŠ¡±r )6F}™C­õäÞ}Á•óß}ê'Q¿gúK¬î¾y¥®m˜Bí#gÒFXu|ltœÎd ä a4¨”(o`j¥U?F-—6A¡Jµ:u`J³Me¶[M"•Jg°Q¨¶˜mè©ëŒZ¥R¯7˜MzaG°$t ¥Ö`Ôk=>B£AÙ!h†áB¡1¢R£–Iy,ÌNPõv«çq¹LrÎl.mtpdœB¡2˜Cý£áž1ÒÓ~l°„\SרÒÞÝÝÑZ[uªÔLnnÔ¡êªøzÎerz/ç¹×Dzçïå˧þZ¤½TA ª¢|Ûz†¨º¡R’Np¡LP(]ÍõuÕ•¥×¯]8÷£?[ ùOÅcH¹Ÿ Î õTã¿}õ…ïþäg…躈è#ýè&Þ?ÂðèÎQ0¥\$T ¾Z§×“Ý2“™0Ø=~›F£1Yv9ì OŒŽŽÒørÃkeÐ9lÊø•&Vh4zU0|zÈ2…0êY”‰ W&ãBccB(“É4&¿Çi6ˆ¸,:Ói$"…^PÞª”*DEˆÜÌ£Y¯Óë2™Îìt8ܽR®Ð)¥SpÒ'Åj…àt$CÀ£pƒB=w}td”ÅcŽ÷÷Á@] bq¬ê,‡ø IDATÅ`Ò»Û¡l¬.ÛûºæŽîÞžŽÖzPrª&£¦š›Çéëíëëjomª¯ª(-.©¬i@µT3¹ƒÜPýÁæ2ð@|„â99¨¨ë«§E:àääççå–Ö6 Ô±¯§­¥½£«gˆ›þ(óãqx|6BÔÄx_gMY^Îå çöÚ÷_|:Âb,CÊõq©§o_+().®hí¢‚” Õê\‹-”ªµ:©å2•Þ SŒ¸Te´:=.¯C§V¨µ¸ÕfÖ«e˜X>Ñ¡EŽÚf1ê´¨¼q†¼ƒ^¥Ñ©¥l}&a2f«Qás ȨÔrèò‰ý‰t2 Ç£z®ÖÚB&ƒV«WkÐ×5jô \výnL 72ÓSèüÑ Ïf6:9†ÉUZ³ÅdШâ‹qÑÀ¥<žD®²š5 ™ý¿B=¤€5|áKŠi £‡åù¡ØÛïhom¬«*+±¾†Ëh„^zUi*P]UQVDn!ž’ôÍ¡šº ßéjTéÒ;‹ù(ï«oîìïïן!ž‡ÅaÅ‚:s|b¬·£ªøÊÅóçÞzýÕï¼ðÔöáÿ`<†”ó â RnüãåÒ&ðÒè§0XlÆÄºkCWb˜ÆK¹l›+”`)†®X‚0è£Vk´[ ƒÎ`âjTV©tàza2ZÝÁ€@ßd2â2 ÃŒž Çç³@Ãïs9½Ån2úýV‹Ííó¸>ŸÇaµù‚1§…  Éáx¼v³I£Ò¨ÔZµJe±;< &Ö…”f*ô&£ÑbD$©@ÉL®T*”•Rg²Yôj­ÙªU©qæÄØ8ƒ¡\Qi±è”¨ªÒëÕ˜6²ø<°ö%o|*Û0u¸¥U<5µ€7*«¬®©©®![õ u`P]ߨÔPU–OëÂØÑu²)žúü$êø„þ—³aQIyckOß0Å ôv÷ŒòQ}§‰øÚhwgÏÀèÈPW[ùõwÞ~óŸþø•žé!ïiœAêyÆ+ç«›ÚÚZÛÑ]ul‚B£“~ƒ]ݽýT6 0Y,¾”PŠ…"©ÚŒ8Áá F•É€A‘–€S\ƒåifa±šÍ„A¯W*ÕJ¹Îéu¹A—Í;åqÚ­ZQÊ!ÂbqyÜa¯/ºt:½+‹{ˆ é ×åòytK—éÀvÚêp;aPÀ—¨×È §Ín3àJ”‰¦Ù¡‚O*S[0@ÜeTÓÇ¡U(J娈B@×èyŸP ‰¹T*†Þ9‰TÂg wQ FÁinmeyy¨xV}®×R_¶5ÍMõ%yä f!üƒTŸsõÒoN¦rЖ¡ÿ*›Úzú‡Ñ Š9Ô;02XVK\ÖÄ¢­Þ¡Á¾ÎÖÒÜso½ñÓ×~ðݯ?ƒ1ÙßÇrU l¬«..@ßTV^VJzæôÚÒišæÅ&p,)-ZkBÀ€Féét¼–ŽÆxoW{[+ þµ6^}t[^ú泓ýÝxšz&ÚÏá5xNñå‚úîÞÑ‘nÐêçrè0œÇ  ôR´±!±V% t¦LGnèI$˜×4j=a6H:ÎǧNŽHEƒHI ÃGR•Éd0šmFG8‘œIÚ]n„Aƒ)A J'¢a›Ùâ ùa2F’IJ4ÒSA_(l1;ì®h4‘E¢J*UéÐC¹=V‹ÅZÌ*m0 „ܨb³¹x$"LcÑC³O€kTr1ª 4j•LÈáI$R¹Úçp¹Uà/á |(õ´j1¥µ½ýCtê ˆ/ƒŽ9¹þdzå¥ÅÅåeà¾VZŽÈ© ;€¦êêª+ B*­$M¬‹KJKŠ®_»táóƒÞ¼‚b–@p;…J#[»{úG‚ùB²ŽÊ•ŸEîh' æ–Ö¦Úü+oýì'?zå[Ï!íû¤ìO2¨gªçñ"<ëøú÷ßz'§´Âp‡{Z[U ŽP,”YYl©\ŽIjj”]©Õ‹]§†’H¯±Y<©‚°ŒáXÀï³ZL„B&WX³ÝkÂø7éPÙäôF&ƒpÜå1ÌädÔAàè7[,›×çv;"S“Ó‹[+ÁÔÔüL¡Ç쥧³É¸Éèr{}¡Dfz*²¥²^‡Óé‡\¨H³Øü^«+ »”°wEq±H¦1™ä"Xg« 5†®bLmИm³É¨ÃlˆmâZÎ`TŽô÷öw÷ö5Tçç]»réâer.elE…%å¥ zTÞ9ªŒ'€#²ª `°êšj”æ@!uùZN^AI)–Y]õ¹I /õ 109&–éÕr)ƒŽRÈ  ¶6§Æ5å×.¾²¾o?ûnÄSƒÔÿõ…·gú­øòùëÕ =C({ã v·v Œ 1Y(Gb#H‰Qí¯Õ*`A®PèŒv«ÉfÒk&©D.e2ù¨æ÷¤c>_Àn$5®·Ïòâè'„†€ßìøvO  R1Ÿ_Á„Ïc”J¤ ‹Å #ÖŠx\‰d2»´Ð=4ÐÓ^YBºÀ_ºDJ‰!¦)¦*+,€y"¨ˆÊ² @´¦¬²äÌÁ U]•e éPÌÍ/,-¯®&—9j«JKIHµ´«0W­ÁÑÍÇ ±ht†@À˜l©;µ©ª¯,¾rþ§¯~ï¥o>Ÿ?÷cDØž þ4¤ž~<Ÿ—áYÆ÷®6uôö 31©€Çfp…ì~ð±à x> ‘cz•\*BïrE˜\Ã0¸ÆDèLV³Y¯S‰d&‹É`2GÂ&Àë¶ë  è ù4"$If&6§ÓíNe³ñd2Ev›;àWè :ÿÂlÈçóylf[04;=5¿œ™™™ŽG²ó³é™©drjv:äv{B óë«sY'b%_jÚ¨QÈ­Þ`$KÇV«Ý ø¬&½š0,özÍ&)rêq‘H"…£d«Á^£Â0%6›`üáÍãqÙÌl ³®’l1\AEvëAUµ5e%ˆ£@¢VÞ‹ áܶ¸SQRTPXòÀÚŠRè¨_]¿¼‚ÒrDRuu M½mµ¨”ªoliíî§pÄZôRY¬fµŒK›nêØ`suñ©Ó|Aι7~ôÊ¿>ÖÄÓ„ÔY-õ{ã\igOoï0+ⱂ$"æÐðÐÀ ¥}žR­ÕëuR>özÀ#Æb$»x:-zß`°ØÌf§ÍªU`2Õa·z@ÄiÐht‡Ëf3êÉD$¾°èñ„¾@bvf:ö¸î`ÔåŒØ­VG< ÅÃqÎL, ,NÆ“™¸Ëå‹ÃS;0• }ÁÉŹl"1™MgR©T6‚ž‚ZçŠDB¡XÔeµ¸…¤^¸Z×ÖV—ix°‘j}¹¹y¶Šªºº*ðwÏ/DU!~)ÐL*Î;äsí=ý•Õ R]ý ¾†¶ìN“JÆcP©LÖÄÈ@S%ªÓ@ú0¥}¯|ç_{NïLj°>AüQH‘µÔ¤~'^=ŸÓÚ‡7¨’‡Ú‰2N¡0`=‰Ãás…<žD†+t 5!J£VëÌF\¡GY”Ýh´:Ü.ŸÏ‹øF(µ~‡ËꘙtºB‘h"¶:N«5æóøca£žˆÏ-¯,ÍF#snT=9¢ÓÓ“ÑD&F¦ç§ãjµZ“Ø‹&Ó©Ôò¼Y£Ö|Àh©X$:=Žnìú¼ÞĬ=ÜÆúüd" Çl‘Hrz6i3FO,éqجv›Ùj³yáHØkÓâ˜T®Õã8ºð%ΌۅÐî´«U„Q§–£r ž­^)`´#Â!Õö®çú+EÅå`_g½Ðh £8/7UWðayeyÁõœk×À؆»ž{ít $ËOÓ¹¦¶Q:³¿«§»­­{ˆ'–+TzѪ“IÁð‡Aè©.B˜Ÿ{õ⛯ÿðûßþæS—mùCñDœÆï…ÒoâwAô…ÏŸÕR¿_ýG”h|§´¡T¸92\„8 ô')T¦HŠÉ”zTÐ+ #®Ñh¥‹%Õ4r¹Â¨‘ãZ£ÅbEyŸÕ’2·ÓåbXŽú=‡Áà‰MÏf¦B‘X6Œ{-•Ê3·²”MÆSk‹‹±€?<3•ËLέ,LOÏ,L/¯OeÒ³SéL6BMls{ai9;9‹†ƒ‰Io,r;®L&É̤ÂáH0ŽOú-0—dYÍ&„ò`0 …£‘¨Ç¦Â¤Z³Ùd²Zt˜D‰ž¥Çïq›U†CËådFH…ô–ú²bRkD5NuÂJÀ©°Þ“ÂÊ ¥.‚i½Ò²20s,-‚$´àÉ™£ë¹pÐ{œUó@Ž‹ë[‡iÆtPûƹÓê´&¥T̤Q)ô‰¾Îò,OOPK=uL=·WâéÆß½ðêk?þîrºÆ9l&‹%«Õr¾XÂg±˜t*›ËáÊõVB%•H1N­{•Ö€nüèc8RÕ#J0ín“úyæp*©Ãlˆ°|> ªSŒþÌüL<>577;ðøýˆ>t*CbufvfjvaeÕïõúÐ×2+ëë[›Q33³ósSáP<†ª£T h#¼þàÍÕÙ©™ìò2b¤P81»¾¹¹ê gRÉT<35õùÁH(à÷êÉå,)–Lƒ¡ôl*èØ¸ e¥F“ÃBÌž`4i3™èÿ ÒA˜€WjµjÙDouYaa©RSö"$ ^ Ú¹%åµu5àmXóôYÈ÷òs.]§BêK_€”ù â RO?zçjQqYU×08…q¹ Ë³Ñ .Äf3ÇÇit¦P©TÉ%8a4b‚S tè4J¹Tav:¬F”»9íz=J®*5JÍ„NÊh—G‡sjr2å÷Mf‹ÛÊ\O&œJM"JšÛ[\^^_[^Z˜Ÿ_˜J$³éãã¥éÌd&»_Xß=>ÚÙN§Ó©Å•x$º°ºF#±Ä`4 ©Tfc:M- ÷fâ>Ÿ/¶9£I”#¦R7æ‡+ ¢··ÛåÂNÈÍO à2šívB —ÉD<µA-eNô×”Mu>Ù’ £øÔ8¥‚ùÕu õÕ0€^N)“MŒÓMŽk× N-®a·$(Î_¸ ©`9œ]ÕÕ7·Ð9B!ܰ„ˆõ1.6“é°Ö%­õåW/]8ÿæO_ùη¿ñõg¡-öã)Cê,ñ#ãoßÉ)ª¨jh¢‹Db %•Jø\6ؤ±¸l‹ÅÃÐÍßfV›z‰X"ÓºÜn A¬VÉíÕ)ÐÓ³)%R8w2 4P(hZÉÉÍ›ÈN}@Øeõ%“sK‹+k (¯Ën,ÎÎÏÏ/m®¯­-!¢šI$â™ôú Ê—7vwön"@Ýüx%“ÉìíMù}¾ôÂJ"ÍlnÌÍÏï­'’©åõåi„±ÈÚÚÌl,ž û|A;€Êªt$–I…B!§ÇçÔv§Ûåò:“Éãé>¯Ý„X Êõtˆ{1\®75¬ÁÖ’B˜( K ªòòŠr2±C*@h)(©ª©©†Ì¯)ŠŠÈŽÏݾÑ䓺r‰ǼˆXª¨´ªìÚšÚ:Ç™\¡Üp&ø&ãÖìÄØpGk]yBÔÛ¯ÿø¥þåkÿ7Ïó©gßË/«®«oéáŠI…F‰ƒu”îñÁ7Îâ*'f£‘PH¡-ä‚°8M*L(¡0¹œÍ¬>—Ýîp»}A§Çq%‹ÇB!\¦ ¼«ÕæxK›“Ks““ «SÙ…µ•åýƒí¥““ÃÝ[ÇGkk‹+++û‹³S³›;«Ë‹‡÷>üà÷·vVoîlímnínÝXŽÄbûw¥ç|ÒÙÕU¯7O$Ò™i¯ÃáDaèÕV§CA.uy‚·Ýj÷½·7”Ir¡P¤°ýf Kat©§®4ÿzNNAIeU]Ssc]M]M4'PÞW— £%e@QЪ€¹rè ‚Û÷y„ðì€|1ÿzîØé}÷âèø•×5µÂ×À0¸Y EàË!+:Ž@Ìíìïhª*/ȹ|þܯ}ïŧm"ð§ã1"LObz♸å<ïäiÄW_Ûæ†Xo<¡DŠ+d0“'òÀŠÁ àh ƒR.@Y¡†‹„2‹ßm7(%t5’“èzÑä¶Möp$Ž% JÞRóSa¿\†c « AÊç³Û£s‹óÙ©é™ùÌdvsoo{gso%Þ¾sëäh÷ðèæíãÝ[ÛKKwnÝZºs{yio}íæÍí½›·o¬®îìììÜÜYJ&‰Ô-©äìR<ΤC.“ÉL$“óóv›ÍîŠDÒ¡`hj6árœ*)) ®PÐí …C>×ðéÄ&‘êíf„Áþ‹˜Ei(ûÓëeÕõ -mmM µ•¥¤…c1@-'÷:JŽ+É©ÒbrW£ /çÊEp#¾v½ðt{£cú|c>¯ ´¢®©­§¯¿dœÁá‹`/ ÎÀ+Ž/  ö÷÷uµ×U©ñ¹·^ûÑ·¿þ\ ŠŒ§©gÏýy q¥²¥¹yT “ ù(Ù£NP &âqùj£^ÂæK$<±J¡TH@n’Çáàj§×)•È•6—É`P+ä®ÒªQåp„Õ3ATá„¡Hf6F|N§ÛëÍ­ìÍF™(Êþæ·ṅ<ohæÎîìÌÜvÊ7=Ï®®­¯¯­¬NMÍ,®¼wûÖý›‡ÿykóÁÃÅÃ÷îlÝ=¹}çÁÍ{w÷76¶nl,®ool.Ì/¬®Ìnm,/$ⱨÇìpØíno0ôÅfçB‘8*¾b~‡Ãë÷YUf‹Ùkw ä0Úa¦Ým׫äPOÇõz¥•‰c¤‰OYmgW'¹#ÕÒÑÑØPW]Ú²yk×Ú*@qæ‹JOûëR¨’º|†JI‹:pM­¨D°+AUXUMCs[oÿÐ(º/!HÁ®#ŸF£¡Øôñ¡þÞîŽúÊTz{ëÍ×~üò·ž;E}é 2>AœAê‰â…ê¶Î>:,—Ëå2!}å÷|1—A™`HR>O$ÓªE ’ðÁÉ“#2›m¾ ×D¨ÖW› *‘Pˆkt:£9!²HEÝn,‰EBPÀ ÃÙDñC0 VOîÆ<Þ¥ †¥ù™Å­É¹¹ùõťŅ›7÷w·¦g–nܾt÷ähcçÆ'ÿññí££Gn¯®­Þº÷àæÍ[û‹ÙììþÞþîîüÊÔTzfei*J$­0„æ ƒ‰Lvv6GÉaÈmÐé-°zåpz"IŸÛnÔéMô¼N‹ZÌd¢Q¡ÕédR>«¯¥¢¬¬¼¬±£· >Áv¤³­£ª‚4ÍɹžnYuuµµµ•e侂ÔÕ‹.\€†9b$à/T€ÕÔÃÞocuxÅ7µ H syl.dDpà¦Òi`ƒÓÓÙVUôîÛo½ù³Ÿ¾öÃï=·ÓÝߊÇ"ž Î õ$ñr^ïˆG˜Qjµ*æØÈ(8ÃŽÃÛq*ƒËãYéB¡T®RÉÅb“ÖÜzzƒêU“F ³³JLŒ+ Ia±úg2qÄ!/b«¹Pzz6–HŃ©ùéééP:•™™™Y^Y]ÛXßH§ÖÖÖ?øð`{kûÞµÕµ>øàáÝ“O>þõ'¨Šzøèýï>zðÞÃ?ø_ïß>yôðƒïÎÏß9ÙY]ÙÙ¹uo{ûÆÞÆäa&3·¼¹2·°¶³ F2™Ùi‡Åëó: „ËnðÄ“‘hv: lö@$â°º<±ˆI£P`‹Áä (c}Ý]]m---}½m­¤bGggß@O{s} ÌFîÝ¥•õõ°×[_UANÏ–ž.Å_¼t5¯¨¬¦¦¡‰”f¢ëèêíAoû†'D°Úu )ðéíèèêîno®Í9÷£ýð‡¯|ïåo^^\8¼µ¼qãàðÁƒ}Dk·nfg×Ö6¦fæV76W#Ë “éd4îñE£ÄT&MOÇ"ÑÉÅ©¨Ýl²º½~«N«µŒa±Š¸ÔѾ.ÄJ]äjXOO'˜»¨:ÚÚ{û:Ám­º¼ ÄXòË«ID”ËiÛìwð…:G(쵘 :ÙfÖ9f£Ao0vŸÁb„ CXX÷'#^›Îœ™òzüéÉX(µUzvfag}{osqfý`cmgçÁÁêÖÚÊÂüʃ;ï?|øÁÏ?ºsçþÿóÑÇ7÷>ùèÓ_þûû¿|¸±õÁ{·o¿÷é‡ß¹óñÃ[·ŽÝ¿÷ðÓG7OnÜ»w¼»½½5¿¾²”NOíîíßÜOÅbI”]#ÉH8±4==•]YNÄÃáxØ¥‡au§SƒI$rÏï2hÀ±½¹±¾¡¥½œgú;ZAý’Ôliiëêjokok©ùR•µ §ª­íÞʲ’‚<8ؽtùjAIM}cc}=͵¶vtQ©c=ýƒ£T Žã2Ò‰ò€¡îºÚÆæÖ–ºòë?ùþw¿óò‹ßúú_$éƒ8ƒÔSŽ¿Ù+Æe°‡'â1&Æ'PN2<<26~Ÿl®q6‹'à0A@œ‹ÐFcpdJˆ¹* ÁdÂís9`[Âä²ø}>ÐgB‰¡-à6Âl…Æ—LÍÏÅ⩹•X,Ý>xJ¥f7е¸³³±²rãöƒíÃ{x¼»{òé‡ïøéþÿöààh{kë“K‹‹ÿãæöêú£Gïín­¯<|øé¿=::º}ç£GœÜ_Ù¼½¿º±>7½¶´°07·½µ2·²·±»¸¸Š­‹%6·0;7;‹x]ÞPÐãtyB~§¿(m– IDATÝ®7 ,WåóÚôJ>­£ ¡£²ª¾¹£»¯¿¿»½M]m]C#©ÔÜÔÖÙÝÙRQ\çRù%ˆ‡P€OGC}Ù¥(üÜMþzYuSsSC}}c"60‰G474Áæòx¬‘*K,S©qXÉëëëëíl¬ªª®©­)¸øúË/½øío}ã«Ï^¶åÅcHéŸ Î õ§âŸÎ×· ¥b›Í‹ˆ¢&F`; ¤M˜lžTÌÎbó8t* a]žÉ ¡H(yc©hÔë÷¸Â`w;ž@4ž2šý±dJ "Êg&59Oe§¦g—–w—·vnì./¯Ü8Z™]ØÜ^¹½½‡hæÎñÝ÷?»ñÑÁÁG7n¬Ý:¹÷àøîÝ£ÕÅ¥Û7——VŽî®Ì/|ôËŸß¿wïÖÇÇ'¨Þº{üÑþòÒÒêâöýÕµÅû» Ù饥 ¾¿Ýmµ¸çRé™™G¯1XìN¥õø½âQ½Ölµ”ÁÆZÒr­¾©½³¯¿·­ô.+«jêš›@š::»ZK‹H–*,GhƒQˆÆ¦ÆÆºÓÆY 4D¡ŒQ8\G(ä P¢ÇåàZ•F«VJ…›I¥²@VY%³wѨl1n L¨wz«ÝápéÄLK`vü‘Xff6‹‡Ýp(”JÎ,-,Ng’ñxfk.‹/Ü9Ü\]˜^ÝßÛ?¾ÿþ½­•å_þüý½[GŸíÌ.ž H¿ÿ`wû‚Ôýãã­Û;;K‹·níߨ[Ú88¸sigwmõÿë?~þÞÉ'¿¸÷ðƒ££½í­Í¥åOïn-ÏîoÍ/ÌÎ.®nL¥²K{[3ss§Åòª‰ðÔ¬Ó Õh~w4“ò9].­ã±ûš«*ËË+ë›Z[;»:ZÊKàP÷z~qY%*—_•ÁŠ|>‰¨‚ŠjR²¹0éƒ }EÅeU¤}GœiVR­míCãlT†ãdÀ‹¨ã}ÝíÍUe§sƒ%yW~ôÒ ßúæsžéûÝ8ƒÔÓ‹ëMCcƒ# :‚Õ8W@GDÄãóy˜¤ÃÕ2‰¦Ò¸B¥RŽÉ•*\Àå ‰D¥…nNÇ¥"¹I'òa™ÊâO$£éÉdjnqgkojzjjjfmuóè`1™L®lÜÚŸ]\\]Ù>ØÙ¾qãàîÉþÁ½ãû¿úÕñÉ'ÿöéÎêÊÑáÝÍ{Çv¶n­®~x||px¸·µµ}pûøƒû»ë‡+ËK7ööö>8ÙÛÿ¿oÜØÜÙ_C’ZÛ¿u{s~u;^˜ÏNMMƽÞìd$2Ô*½3Ä£«ÅáuX,ÖdÒç°ê%"îHwmU584Cû­µº¬æ‹.\¼’ST vÖ%…äT:9`ž_TZ =‰êSyÙb°ÀÎÏý͘RM]SkGgggÛ)˜ÚÚÚ;:»ûƨˆÏAòœÇ36ÎP_wWK}!´ã QöÎkßú:8ð~õy!ýÁx )íĤþX¼Þ3Æég²©(÷ã‹ycCýÝÝ=Ã4S Õ¨å8ÎOBJ¹\(aJ•L€. N˜ŒJL.W!D Y,6¥6|@ÒØÝ¡H$ú=žäêúÒRfreuqîp>ä §¶÷f³ û;Ûë;»ó›;›û7ïïn}v÷Þ¿|÷³>zïxw õàÞíý•ä—¾¤²_Ê,ߨßÛÉìïÜ^]]ºqk÷Æ÷vwÜ9>¾{óæñ¥¥¹ìô=ôÓ3SÉD" '棿7JFÈÐZ‰D4@„e©§?jCu”cõ´ç€4DCKkcmáõ«Þ}ç˜/*×j¦(<íõåÁ¾á©Œ_eyˆ‹!†ºn¡àŠRA•ídÕvªËÖ?H¡óÅ™€‘~.—>ÐÛÕÙT—ƒp˜ŸŸsùõïÿÓ×¾úµ¯~å/13ñ_q©§­£twŒÇåsÙžTÈìmG5wsÿȪ­èb +ñÙà:ÁF…ƒ-!À—Z.Óº6‚P«”ƒˆÅd0Ø -&àKUJ¥Ûç²Û`<ÆÓé`(÷¸=xÅÂt6›Š¤–Ž6fg`ˆowsoifaýöÁáÉöææöÞ/>¹wtp°™øÒ7ØÃàIWnnÞÜ?ØXY¹ûÁÝ{|ôèû'?ttòðý{ë3k‡Û“шßjµ:Âñ„?ŽDãñÉ„Ñ@X"!¯ÏdB”Çg1U¸56:ÔßÙ¥RõédyYÞµwß#ø·Î½s)§¤œDNQ!i "¥eå¤ÂYì&]ÏåÝkùEÕ MÍP>¡Ô„ÃZÚ†Y˜>Acq$§C^0€Ä¤ ÷÷t´V_œ«çßxñùíþ‘x )ÍĤþp¼1JcðX4>i(K8”®ÖƆ†–Á1‡E¡ Ä ­Z$Då›2Øov_©× ŒP®ñJ£Q§Rkä8Æg ”\$pº<^¿G§Õf«=–v;=Ó«3±Db:†¡(ÿÆ6kbavznviçÆ{÷—cÑØòÖG·o}øááÍÃ_ýò³““â?ú´9“+»»++›7þë÷î=¸çÖÑÁþáÞ­ÛétzùUp„( Ê€?OÍfçBaõºMZ5ØfB/³¨½=]¤Å ÊãÀ|£(ÿò…s`Zýæ[çÎ_Î--¯(ƒZ‰š€¬6<e‘™àé:oaîµ+`ЖWX2ΟC 0ÕÒ:ÈT©¥,.q:JˆÙ,É¢ öu·6¢ –è¯\zóÕ¯ÿå:ç_ˆÇR?AœAêÆ7*è m‚Á§­FÀ¢vµ644¶SX!FereJ&æqØ,•©U 8L&‹Í36®TkT \¥”ŠÄ¸ZoÐHä …Fïò¸üá€ÝÉ´§Ó“²šÌ±åÅTr¤Ï}¾€Ïá $V§ÓŸF1µ}xð^<¦îß~ðÙ§7÷÷?üì“æÿõ=mÚüââúÃO>8¸ypøéG'·Oî½÷vwwÇmìf³{ós+3Á¹ÕÌLÐïv©ÔâJØm²ºÝµF«1Y­.·…ÐH8àñßÙÑ‚ UYQUSSQzqÔ[o¾ñÆ›ˆ¥Î_Í+«B8È…º'„Š!Ñ»~ê@â+ïŒ"]¾’›_VY×ÐDöøP…0ÕÒÚOWë4B‘T.ñ¸\“J¡ÓFI5TååNØÎÿä{ÁÎùâ RO%¾R1Äb p8L¶P‚c" &â·±d2©pÎzGil rÃWJ(|*ªè ¦Hn¶9]6“Él1hµj£Éävk¸ÂíuÚÌþ ÛŸHuZ‹×ëc‘H8 šMoÔcSªt:ƒ=œÊ¢J+¶{p°·qãÎÉ{zsuuïhsyeåäý»÷œìíÜÓ{[ÖÑß~ÆßͱEtG?þìdo÷îÝG·ß{ïá£_onÎÎL£Rj6;½0¿·…¢ ¸ä ¥ÒñÈôl"5™ÎÌdSQ/Œzƒ©„Û¦•q{ÚšP¢ÖÕÕÞÔT_SY][]Q Ë@QoŸ{çÝ‹¹ùÅÅ%ÕÕ¥Eù$ž@¥¥€<Ñ…ŒôµsŽK00{ñÒÕœ¢2°FlýeÔöÖÖö~ º×(¤2…½„&cbQT_Os]Iþ©Eâù7_ñÙ[G=QœAêiÄË—ú¨ô‰a”ÑÑ©4¶P†a¸B©ÄEJ.f   ŒSépò/‘Ë¥…†+X´‰ñ _có»íf#a´XÂêpxÂ*%®¹QÉâ÷;¡0!—+ 7NOÆâ±hØi2;]V”o z½sy9àtº§×Ò‰Ìâáƒã“ã;'‹°/¿{øèŸ~öëO77ïíÞ>ØÝ]ò"rx¾ò/ù÷÷îíÌÌÌÝ9ºs÷înoßÜ\[\œŸYXYHfçæ§Ò3“iŸßép8‚¡p2s»}ñx"á³ôZ±hÄkÑ[›¤ÚºÚ[šëª¢Ê‹s¯^8ÿö[ÀPïœ?ñrn^Qqiueqa>¸BÁ&hšE¡un.”QQä>ïÕÂR)`=µíêloï¤"Hi¥NæÎ ÚØÈ@_oèÂüÒ…óï¼ýúÿ«Q¿7CJõq©ß/µ ŽÐ…‚‰qK€I$¸FOd"6›Fíï›à x ¦P(…|‰\ˆê*•ÊäˆåJN"P¡Réݱh(Kg¼&‹Óå ¥^K%—É-¾d&ê†  Hr6‘HF-³å‚–í©É¬'˜Ý¾qc/±3?¿}´=»´»±qwcýуûGGŸ¼ÿï~xïÞññû÷vv?ý÷_¯-,¬|ôèÑÃ÷ol}xg~z~åxkûþÃÃ;¨ššŸ_ÙÛ݈F"™Õ¥ééìjÜít$'§f³KË™t8âÐ BƒÕã ½7rX,Jnw+ø­¡<­©¡¾&Ç«J ¯_¹ôî;o#‚:Š0Ô­ª(…†tÐÁ0êÊ©‘¾Q¤ê9úèÒÅKW JkšÛ;ºº:;Ú;:{zzúǘZ¡—J¥› 5ÔÝÑÖÚX† yåâ;çÞüéO¾óœ´dÿtœAêϯ¼58<ˆr;¡„=Aañer^J ŸƒŠ(ÆxOO_ÿÈØ8‚”ÏI4:€¯Q°é4K F™!ޏ '-¢dr=á1íÞP8àu9AÉ %|~·M£sZ­V›Íjµ»ü™ÙdU5îP"µ¼¼LN¥C‘T:3»pwcg-‰ÍÏ­oÜ8ØÚX¿sëÖííホ÷ñðÞÝ“[;»Ÿ}òŸÛ[ÛÛw?øå¯?ÛØÝ|xïþ£»+Û[['·ïìÝÙ™ž™™ŒF²“ ¨. {=6ÂÍ,ÌÅSñlÆ(By«„ÈNÆ6S,äóû]¥½¹¹±¡¡¡ &Šªà0·¼0/÷2©qþ]'9ˆ£ÊQÚ ¿ÓúézÎ2Ë»þ6—I×PôÁ•k¹è+W¯ÀÄì)¤º;;¤zû‡(\PK¥"“ͤ t G­)ÊϹzá·ÞxýÕ|ó/90ñ[ñRÊ'ˆ3HýÞøqÍ(•CŸcp-&àò1•  %|Ú`ggg×À-äqyT(r\Âa±˜>HPÈ%©Ò`Àe:“ÂʼÆh€¥)«7‚*™H8ôÜ>·Åbµ™&#a2yBÉŒÏl2[§×ƒA§Ãîð‡B¡ÈÖöÊòê|$³~sïÖñÖÎÖöV&35¿yãð`2™[ßÛܼ÷Þý÷öv66îìm®ïÞ¼}÷ÎÁ½ttn~rnc÷ÆÂÂöö2ÌäÒÂL* ©E€®pzc¯Ã¬TÈdJ6‹xÝv*ûÔÌ‘fÄLµ5à_S ²–0A.ìB2GâæZAeM]m58ó–ûñ¹ŸÛYC À]ºxšð]½^†¾|; ŠNYª³«¶®úFÆ82Âd“HøL*IF0ën¨ª(+¾véÜ›¯½úüüÂ37µ~òx )ÅĤ~_|¿xJ§1è#ýã ‰T€næ,«9”T ´÷±|.W ÁÙ¿T b'|!il&K¥&·Çb²[•°@…~V‰ ™ 6Nx} x>éñÇâ.›ÃíõyÍZ­5:‚ñXa*”K¢Ñ…éPxjáÆþâÜÜüÑúÖîÁÞÖÖÖâÚÆäÁññåE—-0½¿¿¾µuxoo&µ´»upóðÖÞÁ½»[ó~ àñ†ÖÖoìž$@zlv:K$––Rz’<ý‘PÀ­S«T«Ýá F"©€Y§UI™­õÕäüCuMmuU©Ä D”G6! ò9 Êêê`۬¤èznèUBCáÝóç?‡ÐÕ…K0–ÞØÜÒÔPQZR^×HBªw` |9&„J“Í,ä3À¶ž2Œ¾ÔQ[^R\pé<¨ô½üâ¿üÃ_Eûü4C âÂéÙ¨µüÿRoQØ<c‚ÎáŒö÷tuS¹˜\ˆÍ6«Q‚Ä¡NPFzB\£V`< ':A£3ùR•ZÉç°Ùb• Ýó­«Û!䉙2:<2ÁbJ“%âQËåZ³ '‡ÍlFßéˆÆ±X&»;£QàJãôd"ÇC‘Xfye{suq&IÇNg$‘L-ݸ}²»‘°˜-–ÔÔÂúúöâü\0žÍÎ¥'Ӊť¥Y”è¥ãq”JÆ7&SéXöèpga2èD?àZLÇ“ÉX* ÃAª;·Ëá øí„F-—pš«ËJK@ļ²ª¦º¢DšAg]ëŤ^È._έ¨mll¨«©©«¯)ÎGpº€º€i!TSPP]ÉɯªƒÓݶö޶¦ZØ}B)_Wßx0h,LI¨Xã£ÃÃÃC}Ð ¬*)ÈËyçgßyáþþ¯N!…?AœAêWšX<>‹Feñ8ƒ½Ý=#"¡L"’jô„NÎFØ¡QÆ\>NáJÄe¢ OŒ#œÑrµ^‰Å–©R‘XÚ—:ͪÃ$\6‹ÅK0™Ñf·Z4*Â곫”JÞh4›­ èv…ÓÓŒ©ì»Óíö Ë?qckuf*î·;£>)„¼©å¹©Ù•¥¹8ʽñ¹¥•LвšÙÉÙ©ÙÔÌZÔë §fçâ G‚óÜÀÌt&•_“9‹GB‘D4”ˆ‡ý.+J9ÝN›Ëãõ ´TÁ§ T•ÁdøTWW•å¡\ïzqyЙüå\/ª®ƒm(„‘&)蜓B}çÃQ€§«×rG5þj¨„êhj†MŽÎ®®þ1›#²ù2\ÆFêïïíFj®„ýß·~òÂ_Içü q©?3*GÙ"BãXƒ½=X3E%“ýÃcPÇa‘Jg²xB(¢p>“Á`2hc£ƒƒÃtÊð¸RB EŸ ‰¥2\§7¨p™ª.hSèN‡Q†ÙLÈ1ô ‚0»·Í —ýA‹Ç&H.G$=37J'\&áñ¹â+éé¥9Í.¬Üô:œ¡å•¥ ËjñÇÓÓ³ ‹+û›K(™t'¦¦ç²³Ùd2âózC‰ùT$ìA¬ÉÕùÙéÉt2™NFü^§Õ`°Û>Ÿ×®ÔèpjKY1Û”UT‚ 9½¹¦,ÖJÊa™¶ús}°¯©(%Ïm¯\XÄa`_±5ˆÉHgxP硹~ Äü@ݹ¤¬²¶!ø©g ˆFëíéíŸ`¤¸B©@ÄÏêïhïhok¬Eð¼záÇ/ý•%}!%‚8ƒÔïÆwk(“Îb 0)Æã `8L6âôƒJa0©c#CÃãWC1>‚O(–pÆÆÙ\!©B'pÀu2>2La²ùB .cÒ&½Q!4X.‹Ý—J*„°Î ²ù=65lÕ+5j•-27;éqÛ,„ Zb²HΣiiÞˆÅ^ïÌâÜ\fr~qwwe-å÷ºì!J'Qæ—8mÁÄÜd:J'зú£ks“ÙlÊiG´èõÌÌ/-ÍL&Â~¯o2êAÉžÛíö¡/€ý€ËJ0úk*À´˜(¯Í8p*(,+/-&.ƒm!¹§Q +Q õuàÂFvÏÏ“•KŽûù@iyeM-°YSKk÷ º±èCÃèN%S**¹€;Úß×?€0ÕGNUÔWƒžìþõ¯äx÷‹ñR²'ˆ3HýNü}ÕÈÊ옉\®×jU#l:/’@>'å ¤Å…^9nÔ)帱‹D†+bäv`|#E×ÎàðŽrB&‹ÃCsbhx”*ÑX>¿^¥P ß„ØLl²U*µZ¥À$" ®Q)UVv2h2È4 •‹Yýd~FÌvwhv*K,®g2ÙL:œÌNOÅâÑP8“D‰àâò¬ÇHØ©T:Ž%B³Éh¶{£ˆï,6w(t˜,¾…Å ßïv{#Ç•„#‹„V³ÍiÕ3ûjQÁ.…5MÍ`YXZœŸGÊÇ‘jç¹ bþî…«9yà 6ÕåÐñ+̹z‘”7çü…«¹ù%¥å¤M/é¾[]] ©Þa:ÃåPÐ]… ¾®‘õµ´´uv÷ ô÷@!ÕTxåÝ7^üç¿ôð{â RFüÝ7ºÇFF'èl‘X¡C;Ž*)}‚&¼Žª!™DŽ‹„B!lwcè”…").óH|™^‡ QÕ •Åò9B±X,¤Ž³˜£6†ëíáNk’8lTŒéѵÍçK•Jp@¤B·oƒ#pØmæØè(•­6ùíV³ –E-®øÔÔd&‘ŠÅ²SÑhtjiq&u¹=`Âǽf‚°¹B>_$™ÌøÍ.‡Ñäñ˜uÂ`ñDC^‚0bñ@Ðo·9ìJ°èQêCñdT««t:IOC%ÉÃ(^ @ª²¬ª'¡²r€TÌ]¸”s=åt¤"¢ŠŠâü«WÞ}ç rî¯l?A†¥®±©±¡¶¶¡‰\äèCÅEš ÒYÀå\%îj®ohjëèíïíBÕX wñí×þ ›_€öq©ßŠ¿ùƫк£qÄJµý§Fä! ŒŽsx< zü¸L$˜Ðu)De›ËŠQÅa¬”‰„°÷=62sˆ} Í§ÐXÍrDx˜Aë,ˆŽä2ÂDèT”‘‘‘QšP¦Õé´`˜h0b³QÇ¡Œ!LQÄ(•TÞ€Ú–ðÔtÊë¥Úd4Цìr™ÊäNd“¨`ZœL&Ü ¹›½^¯G‡ž§B¥v¸ý^«ÙâðüþH8è´Ù¯ÍéDI­ZiÔ`˜R…q8#­¤ÚriEcsK34Èk««ËŠa÷½ ¾µ¹¶(?÷ÚeDEï^=u\Ë/(,›Ãòªò|µso¿õÖÛoŸ»x%¿¨ü kkëUËÖŽîޞζ·Ãå‘b2è –P"«®,?Uˆéhomn¬*+È»vù­Ÿ|ÿŸŸGüÿ·8ƒÔÿqüÍ×^¼H§°Ä¦F¥ÁDb1g|lŒ†Ò4LmÐ(p ]ŒäÁ.‚ŠDÄeF’HÈc2XôZ*»ÅrT±¨ãã(D•JíŒ&©ý›Ëµƒc“Zo6ëpÁÄ6>.C\¢–c2½Ùa&ÌFGÄgNи_"7‡]v‹ÙŠFQ9ôzÃáX<âqÕ ®s%ƒn§79™NÆÃN£ÁDèm~¿×¡P(p܆¼€rÀ`Ðô: z½ÕMhõV®6×2L®ÀØm50ZTVUßÖÖLŠ…ÕÖÖÈÊ*j;:ª ós®"H½{)7ït· ´Í¡o‘{å⻿YJ¼Š U‚=¦Þ.”× öuvO09èžÄž@bçwBFWEJkê[ZÑc6Ô‚{Áåw_ÿÁKÿð×±ÎñÛñRÒ'ˆ3H}!þåÅWêÙô1G*‘ȵ“Z%KY¨€tPå © ÅcQ)T_"e1ÙlžA‹Íc0QÑ$Cy!Ÿ+ÀTÒ±1 ˜÷!6WŠCµ$–Ê4:Âê²Ùì6½VmpÚd|YjáKÅ8“" D/• úÙ|6_¢ôG¬F‹ÃKgR¡€Ûð'ã«Å¬Âp{¥„/K¥¬:Vo÷D¦S±ˆ×ãó8줯‰øÙ{ÏæÆ²+[ð/ô“í.U•LY•\Ä?z IDATwYéȤ· H‚‚„÷¸¸Þ{xC›¦ŒÔýúÅLÄDÌ÷‰ùq³÷A*%Íë–Rš7­ªÌÚ*+iÁä]g›³öZãéå¿ý;´mÐ?=º¸8ŸB›øðÉùÈ5UU`™z~î¾Ïsi2P€Du†*GÉT*q†M²Ê×66q`¾¾Ð9"n‡{;ë«Ë‹ˆ¨ûK+›Û{P8†N¢1dÜæòåJ¥\©SíV­ˆÒU‘@ŠHiºXœ«,…NcñX$@-ß½õÞ›¿üéwp:ñGH9Ï?@êñÊ{_,Ѧ 6ÔjãÙ£KÔ>uù­ i²-sxá9]×ól¯§³×•5Ç1ÜA0Õi³¼ÕëYšÀK†­¢dYÑÑMÖÐÙ9Ó‹Ë'ß|ýäñ“‹Çÿz=:4ʪã=|ñúÝ!î÷†¤4w49?Ÿô{“Ùׯ®¿þêëo~÷¯ÿþ¿ýþæá·¿{|90Í~¯~u955Ú¹þhxñ|Å—³¹ôI89Ê%èji´@L‘ p>úÛÞÞBP­!{ouM¬‘€NìˆÅâÒú*‹çñ $¨j­^¯U«õf oÆU· €ƒIŠå%]W*¨–¹‹Í×qèpo{eñËÏ?x÷—¯ü#¥ÅþóøRWüü“ûÇiªÕìz ˆaõ§húš=:wLUA…fAÑ Ý2$šÌf£^¿7šLGr«^­VkíÇ mŠjµ©JÝ(š‚hXº Å"q¼fÚ®£ÊÈhbݱЄ¢Ú‚D®§ %®?~xO|¿çˆœè.®¯ÏmÃìýÕïþýz:š\=ºèw»Ž*²¼ç:¿~xÓŸÏÆ£é94c¶Ùg6’´éM/Ïg—ç]'`säÊ¢J6)1u=]¤j¹4Ñ**d’d…=ŸÏ¢*D&W,ä ½A©X”œ8ô£aõ2cWÈBáÊêÚænÞ®,=x0Ÿö­lì'ì£p$ž*U›ðÐbùF‚“‡á%U3½žÊ³ÏCÅ,¨º!äpKq‡,Ôl¯.|úáÛo¾þ]bÊþY<ƒ”ýñ¤žÆsw#^nU«]›§!}£¾)«£ÑÀíf–˜Vê]ùÃаkh²Ù¡K¢j F7T‘¨1­:âÏ—¡ÝÒE8—U‘5H®§‰4 Xâe]¦!—ñ¬€Ý”jõûÃÉd2¾~xu9éBGf© Mórÿb扂 ZÜfPv³ ¢gHÐñÖå×ßúýï¿úêñù˜ y¶M‘Û0mòßÇŽNQîùWoГ)j¿k´ê¥B¾@IÎx2›Ù\><;‹CdòȰË$â$I,û ü;AJú!!û…Žö÷öö|ÛH†Ž]Û²°<´Þ£È ôÆõWßü˲f:†€a ˆ©áõT•$nxËåjæÍýúæR‘¾úúÉ£G×ç“é¸ßµ”MÕó¹ ­Œ&½¾H%PQývó…b.ƒ~è K¤°‘BH…öæüÙ`íu÷vÈ´ok{Ç÷”JñÝ«w÷ü¾ím艂¡H4–HÄÏbÉJëâV›ˆèe(¢ è-Ȭ-¼†ë2{v°½µ³» PÝY¹ÿÁwò~÷Oâ¤Ìçˆ õOÿôÆ{ŸÜ]\^ñgÛ4Ûï™ ßV ÍFÁÑ'èÎdÚó$º©ƒ¥Ùì^û®k†åX†¦u§Wß<†T!îäÑõl¬I’ĵÊmÉ0ѸW5 ‰…G Ú3ô%Р,C÷D·gkŠÀKše÷'×SÇ˺7@Áɱ˜!¹ñz½ÉBRÝüþñXEÀ—eY&UÖÍó'ßÞ TmUJEˆ2͉’üèñt<»ðlw<í{^o0 öì²Ô®S ”¡T=u)(pt|šÂ›ÖT2C%ó“ù°®Y+:$”tœ•ãâÁ¾ßGÜ7ˆõî6Ô}k[;{Gáh4:<8À«ã^GeÓéZ‹c;øóž_ xnÀ!áõzPó l£ÞPQÅôÁʾln®//|öÁkßÍ¡ÄãHýMñ/o}~ûŠþDëuz=Ó”XYè4êõ†l¶›”]ÐdØíAf€ÄáhÞrgzžëö]Óv MUÞÕñ‰HqΟ\MzÐ8”xI7-ËDI-™Gf:i" ±Ó ¬[Ùö R”y^PtotÙ7pK7Úª@œjS²Ü®C«S¥TgöÍ¿>>WEÃCÕhøÆ–ÎÑ­¶äL_Z«x*•ÊUšái8@ÿ8IR§W]o€N‰ùfW«˜FÿýýÃp$–ÌB•JüRñd®P.2ñ£}¿ÿàðµ/÷[()¶‡Zü<¢…„¤ôÃc\ƒÙd´(ãär F€*²ÔÅ7.Þ!èpòô ÛŠ<ÇU¯ÑÝ ²ª¸ôàÎï½ù]$LüY<ƒ”ññÒCê—_.@›}ÿÞƒÝz«Ó‘íQìZðÜ5꣛®Pk° Ôkž7ÏF® ùd:»º¸|26…(<·ÛÍf㮪ڶi/ž ¡ed„‘$p]LSS\Û4$é`0íf³ÍB-g@EÙíumøÓ4t ï³]:X–“A€”iTó8CHjæå¿ÿoϧ糮g[ðB§V)•*5J…–øV³e_­^§ÚŒéy&<ÔHúxøx`â ayø™:ü¸V5A©0Ù{J¢Üç{Äqã4žÍŠÙDôpsnB ‰ÆQà€¨Èî‘*IIØj…á#²ò‹‰*9Må*MQ5dn3ÒÕ7ßœC–ÖTIu\E˜œSµ|*Þ_}°pý¬?|çï$_âÏãHý ñê‹Ðhß¿{wù¢Vµ'³IÏâ:mªõðÆåŒ¬(¶k9ƒñеçW7ÃÁlâ K³é pˆ~~Þ·dQpucË,$ ç|¸Ï¡xW×—SÏPpÖEµsº®ASÔízž‹S jC–勚áu=ª:Q1ûS«œO§Rñx¦Ð1¾~t1èÈÏ8´ç©– 1Õ:hnª³Tµ ™µVk´{0pØv£ÑhóW H‘t»R®µZµR)d"¡}Ì8¡“XœLÏs¹d씸²…±ôËd3‰hй`‡}¾=HWÁPøJAßœßw€šçðÖCœñA#€©Ðq4™­Ñðsi"-çäæ›‡¶Ç‹ ê†(ðí&¼‚R&yØ]Z¸sû³?xçÍ×^ùN^îþyü©¿!>»¿² 9êÎýÝ$u8 {pĈ{snKÞбº0DM7 ÷òâbfK4Íáª7¤,Š0Ër]M´ãy"ÇŠ¦Jð$¢´³6 =è#ÁÄÛ=GÑ›T Öö`„üY¤ rL‡ ž%øª½®©Á§B¢ö\€Î6˹B½%"ýb2ê{¨^ÃŒT-C¹×FéN]U$Ll -*Šáô2- JMH~V­ZÍÅ¡- â!~lìÏâèñY¨Ö ÙXs ÔnPü £%èî®Ï€>éøèз»½µZ‡hË5à’(çˆB?¨`8O×øg€‚–“ÌÁðúÚQáp u $+å|6qz¼³zçÖ'¾ù«_|gÇæÏ ¥?G¼äúåÝ¥dRß¹“†Æ]’µ^%e¡ârº—SSšL»]—c%ìãV‰ÜiKÕZ›WÇ“®mÁׯ“é^­V)ŠÑ95¼èÜt·Ûµt%û(’Õ$Gó\ŠWŠÆ“‰;ŠœEONS¥J%›BcC„@ê-x‰“H88 Þ>xǨD±³Æ6;𒦰ÚÇSHH58ËqûBÈçSCQ îìTË„NQ*dR§Çµ…Ï?yïíWþžœÿI<ƒ”öñRCêÇo|¼¼ Y ·(xÄ!ù@7?vÅqç#C;?õ †S¡ÅxÅÔW Û¬‚ý™º)zÏ…tˆÒ‡Ó­á6°Ê3Œ*˚ʳ’¤€¼ÛGû)Çíh(êÍ‹’b{Ý~Ϩñ¼¬ÈG¼´úÍûŸ/.o F xä5K’}×ìÇç“ç˜]Ïí÷ÝœCY'Û†À¢QK±Ú‚ŸåuoÔ7ìAzo¤¡q›FD1mÛÔ kúäÒ“QJÙ ƒß}=8P‘ //­C±X’Á×AÆ‘Äu:¼¨¨Ð‚‘[)Üšº²ŒîêãA¿7ÀÔc›r¹P¬®gÐuAsU/ås¹rS³u¡•K%âIha´Áh<õ §Ð´  ¾Z—–Ò±½­µ••Í]2– …ƒøøï!öHÄóÝ¿‡¤p;&6»OÉ}ûR¨#q€ºÊkë[ÐZá ¬v<…Ô[¸ç{|r–)K¦ãº†(HÝñpÐH>ͧ‘:ˆ×][k_~ôÖ¿|÷‡|?@ê¯Ç¯Þ»·¼¾½ƒ; ÐlídKá­ž«šãé¤çösx•Ô:¬;’Õ³ *ƒÇ¸ ÂÓÛ-¤¦n¦Ãë'_=šÙ /4û}HtðÇXç /j7( öÍÅdhkd¯«’¬#Ÿ]d¨F³ è2l×ó\g»“A×2á ¼¹;™ ¼ÛÂîj|1'CO8œÌ˵BŽ5=ÏÒyªœG>Q"S¨²¢Õu¤ Š&AûOs¡KGÛP®!ms"ÁÈ1ÎépF‡ÐÁ;§ýÃÐ\L"ˆ¢¨Û|¸Oì î@íno®­®­£ÍÍ^ DRÂjNYŠ¥RÇGЇ&’éJÛ„Ç1 à‡C¹šG·ŽD<ŽŒ§ðþýÏ~ó/ÿèßýßÏ …¡ü…xyÕföþç¨=²»½…[@[»ûUÁE€‹bNgî×sìéÈ ?œN'}g‚â|l­/Ù]ÏÔŒÞSÙåã¹ÕÍõÀDâ9notq~9A¡DS´(‰a™H78á3ºTd¼b¹€›N£A³®ÙC‘Ùµt÷úb6íÛ€6Ô'$Ý‚êIÒoÝÉt6îu=[ciªÙî¸Ìçöº]hã¨r¹Œ$ÝT¶HÑði¸ÉʼnŠÂRå* Ùdäho? ìí¢”ÄÎ~ |rr η…n†Dðrg/xŒÅasY0ˆÄ©|¥˜89M¦óùÅy}8UtIÒ¡+í· y\„Lj<­ýýïÐùßÏ õ—àô V/#¤^ÿíÝå]ÿw‹Œíȶ 6d’Éը߹€»;¸žàš”óðñù¤×¥J…BÕözÃþäêúòñY›¿zô»ß_x&îWY–ãÎÞôúpH;¦j R:‘˜E¾¬mHÞs5Ž…,"¹Ó±£ð8'DÚ ßu½þdv~ùè‘«*È.exB´މ«Îhr~LîÕ¬VJ¥Ó_>¼¹¹@UÚ©•Rh!œ-¡=ÝÁû/¶Óª•‘ „‹€eLgÁ¨ÜP4ì'âaÔ0B9¾HñCì ±¡"†x“»K´\pÀ·Cr9Rf‘ï°µ89=ÈÅâ±3”“M—ê´¢ÔjT»C·u8é{”½mAïŠy$¹§â§ð)'ჟþ£óg<ƒ”üñRBê­O–6 ž!ÇöæöÎáqZ‡ôÁ9Ž¡_ÌFƒñȵtM³º=ÞÊ›OžLF=§g~EµÇçÓ«›‡7³ÁØ4Ìáùïþmæºî˜{z>ÆíA«;õ\…ts¼½5ácáï–‚ˆR8¿-EWPŠîôz¦ÓNq=ÊE¢Q‹f5¡ÕÇuÁZUõtÀÒjVÙuÚ\Ü<¼œxH˨—’ hU ÕY¥D¥µR1þ"•z³Žc¶“Ã=¤½Bj†ÌFшH!áü(¢æù.a‡#/–Àh]n'6âÆ±¼ºsš# —~¡œËåòÅF›3,ŽæxQä$u0—°’M…¾8ʧŸ|_¾ûþÍÿñ¤þJüèÓ{;ОCÝ·…7—gÚp$±?†ž=õ{†@7›´„W¸’7 mK¡q«¨Àx® yãær6“¼ 2¾ù·ÿñ­Ýë«èèkφý~Ï2Û0-ÛFwDÒQp;CU‰‡pP s¤-»7»˜Mº2fÍrLYµ÷©–ly˜è,ƒLÓU¾Ùh1<ßiR4n™HÖ`äu{žeh\£ÜñóxAñ+±Mhµ2™L6_­·iªžKF‚¸ì¾µµ»çG!$$óeŠåB::ÂK§p)óÝù/q Æ ök+¸õ`e#p=;#CADV¯¿4ÇçP6ÖQe¡s<ƒ”øñBê“…Ýý0N‘‰úÞQ¬ -½Ðfχº@W³™ªë°Õb©¢ê²Ñ=Ÿ] TE“k¥|.[’=£ƒ>Q¦'sœ`ñ ú'Ç>þö›G“>¤4r9¥«²Ì¶ŠùL:+4[ÐH9ŽŽtAåúñÍt:„lˆ*ëÐMñª‚ûM@#hf÷üúæÉ£á œsN~žn— ™t¡\m¶–t]Ue,ŒPõJ†F”ªMVP4 l¥TšûrPûÁù4œÈ'?@Ξÿ0ršL£u:|H®rCǧ¸Æë8ØÛù@¡û 4aD£yyý Œ³¾(š <ÝYÌÔ,·Ûë Gƒ¾kÛŽ ½D›@ ù»T1èCí¥;ßÏYß<žAJxŽxù õËÅMî> À¶ç;NQ-èRZòd*ÑT:‘n»¶P«4;š$™Ãói:‰«WàÑÔF¶Ú¦(NƒàXµó ±ê÷z(âè+,à t‹ƒ†Û‘ Ña($öÔ»†Ä·( Z¡¾"°,¯//>º™!q„ƪÿõ5$oàÚCƒí˜2ÝnT˨É©§žÇe*žnÔÛœnÈ"ü8¦ÙhPÕ€ ÞÒq ¡™Ã鸇æ;‡d½N+—ŒÇÙ6Ësíôú=EÇZÝODÅ’™R…0Ó3‰h°÷@ðä'ÒùB¡˜: … gÑ#¼tz:=F{›[;Èš@Ïøp8rO ÝÏ·½Ž¶7DÁh—ÔŠ;Û€ Hí'g1„ÔÉIɵ8žH•›Š;ÇÃ>§lC’eŒR²s*BÞÆâýÏ?ü>^ðþ1žAŠŽxy õ³Wßùàó/V¶ðârsËÀ,ptœ/6¥C«£žZË%cYÕ›Ì žtŠbMÕ0´ÑŠ£e 5"ÝrúÃéPbévGL¦^OpKF•$ÅüújØŒº¦1Æ™Ÿ×³âö[ǽ-XžÅsª mU++MhŠDú & ø­å3™\­%Cå& ¢éõä,ñhGZ¯–P§Ü…"P:;;¼ÆSRV–Úp츞£›ÞÓ ÿ66o©³H8‚ýV`wíî¾ûÊ?âWþ¿0~€Ôÿ?{ýíϾ¼w µ¾Ž,€õmtu £‰rI@–ëô¸r.EYÝÁèrfó€(Ú4,CeÏj×kÊ͹ÃAu8˜Œ‡ãó^ Xoúøúò|60‰0‹9è÷\7îX^6¼ÑÈ–9¶ÕHÑœhŸ=MVtM¨Q“2]jpl‡%Û¾T9•„'´Öçk"Žk©í:OÐñ$b¤®ƒ¼Öj5JÅJ½Õî´‰Ô×ËÅ\"–H`/‰%ÎŽÉ ü~çâäB7…ÞÓq„Tâ$ ½Ôþa(x°‡ç(ʇkŽ0}…£©t: ‡Ðå&@ö~ÿ€( â\0‚Ž×1\\LçKùT:S¨Ðœ‚Æ[²Þ¸:Ç0 …F'Aô@<=;=ØZþü£·¾·÷Qˆgâž#^H½ñþg÷ˆ,ê2žÌ8ÅÚÆz ËV«¢ÈµYÇ1˜Z¹ {ÐÍœOu¦ÙB Ës%mÜešÔðf¢òz¯÷øÛë«Ç3íX¸z1˜^]u1pq|­{¨›ÞwñÚ¨Íp/›¦Æs4ÍÊjóYï ™v‰ ªÈ«ºªâ ­*7­v«\d%Ü Æ™½m Ål:•H&ðò']¦…T49ÍêHý¡É†4Wõâi˜Ô°á㣜û‚‘h$ `0rI* ,‘Œ†PÃùü;[kk««DçucwüDº%&-Õ܈mŸ\`ùç»»dJÆèg]iÐír±ˆSFYá9N”m›#Êåð@vk{ÿ(r m.|úëW¿/‹†ÿy<ƒûñr@êÇ¿ýôöâƒÅÅ……¥•µmä¯mGÙ@8…$²-J-¦Q«hž«[SOe(Ö²=§?XÝÉPéˆÓ OU»½Þ“‡×/ME”'³~¯?Ÿ?º™Œ<jDŠ:{4ó¾ÕbpQžT\á‡wºצ((ôšÅ|®T©µ!j*Î+4…ƒ‚O¤›¢Ž¥¡g[†¥vwÉD /±Õáyš*¤ã‘ðQ(žÂíÃz‹æéÕl8@T¿B¡Ã}ì€ü'§¸A@8Md³©Tj±x4Ø÷!±Ü­$É¡ü]YArù6™|‰g$ô½]ßSé܃ Îú­ã“ÓX&W,7Û[¯À‹àY£™W%DÓÈì¢öú&®_…|þÎw]PìyâHýOñ‹On/À™¼´¸¸º±åó!}cÚˆÀI¡Rç‘¡:®k²T³Õ²aY CËŽ3ìÏÐÛ}vaZÃ1¤™éy¯u>;"Ï‹½q·ÛOf?êjŠ®ÛÝÞ`xùdÒ•™Ív¨fƒbC‘ HcXÍé¡8m¥Ìê¥b©ÙfEÃÐ5‰Å5)UQv<‡®kÃ;p *-WŠ™x Àk‡ªås©“p pÏ@ÝUm¶8jÆv3Ǻ “Hè`ogg×t?HCÈrq€NøÂGóZnŸôQ¸#¶J¸å„0œs´ã•±C?äºÝyžB¡¤§kG˜¦N¢±l¡†z¾Y«5Û¼(AÅ0«>¦SŽ­Í JßA0t°sëÝï¸èåóÅ3H1Ï/¤~òÖG PâÀS´± 7õ/ôï!=vs¾(†×N[ëkpÚ !Ç  ‘Ùk­8ŽB‘ÈQ¸JŽDc¹R‹DIl¡¡'C±O(F©Zìeh—±Øó­Üýõ÷gþ/ÅúóxýÍO¾\Z]]_ßÜô¡‰o-ý¬n†åªnót£Æ<þ}O‘z“‰Ùj°Ž*ã6”}çýîñl]ïê|<¹øö!´:¨ÖÂ*¦‚j°Æ°o©P!v{“ë«««›G¨Xưíf¥R¦2V /=Á4xªšËf2ùb.›Íš4&­f­Nµ8QÕ”<]ƒ…e:íV§#É2Q“ð4¾Q#séJ½˜: ìûé|±Zo´¨r±\…¾ì4Ä©(‚ªahî”Káen: Í3L€°ìÍ÷ÞPÛ­ñµ±²´¸pa 7Èpç}w‡d1Üà%Bb'‘§»‰©“Óx®Übáå‰mª…Z„iªÑ@’FµÚH¦ ØZ¿ûÉ÷jþ?gêàÜ?D%K„,»R»;kË÷ïÞþòËÛ÷Öwö¡@Ü­,ãäbkç šCj>œ@†E"]ªAyªh4”²ŠB¶t‹@ªš; ï£ýÆâý{·>}ãûÍ™øc<ƒýñ"Cê'?}å—o}~çþ}Ð2yDüþ­õÕ‹ ‹Ë«Û»þÃÀi¾-Èlµ¦ ûž©JPçé\£cÇÐ1Y½þpz}92•§Yy|è9cõÇŒ&.¹B2MÇÑ4EUÀÕÕõ¨k ʱ4šgŠÜÜ.Q”8ºQÊAä«ež*0B§˜-7Z­z£Ói·;¢@çÓ¹álŸŒºK|R»Ã"™½Þ¨Q TÂ,U«¥Bj»,ÊÃúwwÈ\á(xLÒT,™Î¦SIôs‡d‰*ÜÛAÊÞÆR°È•ª³øçD£]ßÎúʃû÷îÞ¹YjËíïâÅÚ²­ãRýRx+…>-_m2œ†šk²¨šÄÒoƒ¢b›«ËN€§»_|öÞ›ßáË¿?@ŠÄþêk¿~ó·_ܹ{(îw|~ßÆÚ T}‹«èÚÄJ<äjðUÃùáìRhÉyš$ëÝÞhvƒ†l«A)Žmh/úȲw®bdš†í™ߦ-›ç3úfª¨ùl踌öP ®0ærÕ–(놉ƵÅjEÀ8õ5™)e‹ TDé–c‰Ø†ÕšdDzC#q·P,×k¥<´IÉJííBCäCÿÁ£ãùþz2‚ì•Bû ˆtÞä”ZŠå(MJ£º!˜³‘gÙ:$žN›V ¨æf3K’8Tg å`éÎ`)HÖm\»°ìž§0¹dZe¸îh`ãÂS‡á‰ôP•:ÝaNà™64OÙ\³ÃA Ù(á:C„M~}ºg‹FQ©(Î@Ïìû é¬"툘Ì%ÂpTáßG­0´„_YF»ÐµÝýãèi4²Iìv fßþ!@Š áOÏI,' ¥J«Ã+¦¡ièìhØ6îÄ7©f)¾†*ªŒÞùò³?xëW/LŽúR$~úê;ï}üñ'Ÿ|ö%tÞwï­nùˆGÒÆê2º÷­ï`_iЪÛ5iF®×tCΆîè±m¥ÕbRÓÙH—¤t2UÓEfQ­ÉÜN½Òb4h¬§ëÙ\#~Šœ†D¹ã¨¸ªµá“ëGLU`y ¦ ë( …MT­Tn¶Y@% ÍJ¾X®69(q cÓ|Ciº4ÛA÷èJ½E|‘^HáÇq¨úB¡ ®?Hù¡@‹ž’&Âi'’©t¶TÊŸCÒYYÝ€D?<:¸üQäÊ¿»N˜«;Gad—ŸøæÚ†›€C„Yæ€.XøÂk®µI³¤€”ÃÑE5j©ªö" nñÙ‡ï½óú‹ÒGa<ƒTë9âE…Ô+¿ùðÓ/naŠÂ¸uÞ>z÷­_oôΟ'žAŠzŽxQ!õöÇ8è[ÁxyiuÅèöö|›kÄ}qi{îD‘å$§ßw]®VëõúçÓóé¨k2Ûn‹¦íM.§ƒ^WYð†²©¥fw`´2éT&~5_ÌFÃn-A™ãhËt!'‰vWð”AAwX–eþÀSAÚŽªÒµ\6Wª7+ÈùESUJReIVá{õûãÙt¤p¬Z8Ko69´EÚÓFùèF ¿M•SñÓ`Q‰$žkˆÁÊ`(zK$’¦r¹t4 µ¡oŸT¼“¹Z˾%@ºªÃý=¼™ÚÚÞE–k ÷¥"¡aOøBÑt&“Bš{¦\)×(^èjµAµÞpl4£ÓuÝ´õN«Z.Ä#[dÿåŸ}ôÁ;o¾þ=ðŒú[âHýÓ?ýäƒ[KH`CѬ­mÿay ;[«+8zð`yg?Šd+«ØýAßdj­Qo6^\ô]J¶NGq\ʰI¿ïè²j;®Z-•êê°«5Ò©T†¾šMf/ÆC¯’Ž#÷M°=,󬮥¢á[­Þì0ÈÔA—)Fˆª„ÈWó©d2S(çãÑ`àè$^l"Ï ê°ï9Ž×›Np«ýT­6Çñ¢å˜–-3•b.—G[¹S/gâ'ƒÝüÑ‚a¼7»ÞÓ³“ðB*O$ö©"Z?ú:éÈý.º­‘·“Äl¤Ý½`ø„|"q’? ìâÐŒ•K…L:[h±ÈýU®£GV@§oÔn2 S¨z1› úWÜ»ûå­Ï?ùøýwßøÕ?ÿä¿àwü_Ï …ñáôªÍþ·_ÝY&ä5ì5|ûÁ#ß6ÑK]…¾­Õµø$V¢¸Ž&è¦$ ¬Ñu.hê˜öÐÃs¬îp4í-Mw½ñÀl”«ÝÉõŒ¯d3ùáùl2žÝLG}¯‘&žœ±„6²¬ö»šÐjë4Žg™6…ëÀË‘LÕi¢0l"Ëgâ§á`èø$WÔð,ä4[œ ¡ ÛA³)œ¾cjã ЬF!Ž_…*Ý/YA÷ ßÖæ¶:"²þ~<>Ç8c˜ær™ÄI˜p‘ü;óí¨µ5Ô-ÜÅIÅîÑ’Å¢¹Ìyˆd:hšŽh<•,×à%5àlhÒŠå*ä$ õhàEŽõ2´€šÜªåÓ‘€ocíÁý[Ÿüáï¾ýë_~ßÏÿz<ƒTó9âÅ„Ô+ï@·•Þ.Q÷##`c¾&µAÖw±u¨´™6Ó’ÐäB÷<{ÖsÆû®å ,U¶\¨mFc€”Ú•³¡C5ÕÉìbÌT %f8Üþ`ÐŽZÙStä@jumc>ÉÃRWç… Î  p%2Îø%¢8€'²šO!ň¶7‰¢îºEðÎ2ßnCY[N…ƒû¾uÈQŸôÖ¯_ýÅ+?ÿé‹4–øC<ƒTã9â„ÔoÞýìö(÷ö¡4"äÐíí­õÕå唿‚Ït\9MÔ;X•U*TGòúÞhຽî£ßC©g Æ“®ÙõûC€”©iFwÜ3Go6ÚŒ2èŠb:Ž}=åë ³å+Ûëó~×µm]^NŽgȪȖó¹B•Åw¨á:å|&SªÁ?{µœ/$b%$ÿ¡Ka1s@'“,VÛ¼† W¢:íF£Ù@Òm³ B£L³^*dÓ‰¶O“T*º·µ¶´´ºŽË_‡Ç'‘¹nžsV$ˆ¢ÌÄû!ð™³a‰4Yí ·¹ÄÚš'âk(&RsHUçâ”.šì@–2º£ž)‹Ónµë˜z›õxз h]Yº÷åï¼úÏ?ùñ‹A<ÿŸâ¤êÏ/¤^}û‹Û K«PÞìÎÑD„ò '—‚ @» Ñ%h¡Y…¼X­Ñ®7™NËì~ý°?ô†çÓq×t5Õíz(ª¬ºÂz= =Ñë ±g+’fhЬ¨T)qzVhɆçáM|‚7{üÕõĵà!”…r‘F;6AR‘m²Ù"vø¸ Ñ,W;,‡bt=Å5¥@(’̶$Õ7qY–n±«VJA“*Ô+”|H¥ÒÙB±Øh¦O¶Vï/à6ŶÊ·Cÿ®‚mûäÒ ë:¼=ÀÒÐK-󧧈ZƒìæÇf çóÛß`8K"¦²¹JÔ}”¿ã‰gYnoô­=øô·¿|õç/Þˆïÿ/3¤~ýþ8µ×¶|¨C‡û>ÁPø4EE»³(N§à‘:$•N Ó‚Á7Ë¥ª ™ÞpÜ\ª,ËQͳD–S^мÑhfpΰoj²jib»Yg{ð~…)ÛhKS­³PJ$. x­?_^ÏlÈl’ªà5/ÝdM'JÓ¬Ãgµ©J©R­ÖêT3Ÿ8ÇyA’¸f£^*SŒ¡QÕb:qJ´(Ñå-Q4™ +6¨<9Ü]~°¸„?"¹··Mü²vvÉŒ—X¬nø£€¨³H˜S % kBbsè#+ñä wè÷ÿ¤ð+UÉîf³óîëkýn›jáv­ZÌg³©ØÑ¾ouáƒ7^|@ý ¤ªÏ/¤~üÓŸ½òú{ŸÞ½·°´‹,k|@ÈVBxî¡9>ôû|hæŒK­»gõ×¢ÙfµR“p=Éò.nž*æJ”©uèŽÈŠŠéöΧ¶Â2vÏDJ›$tÚ´Œ-:/ò-$2P6’Z%ê>žexÿË Q3¤] AOÓtUâÕr ÅãÎF•bš%|nsÐåãQ”È‹v4[oWs™L¥£êðJp7ãä$A®n¼‡Ñ´ð˜,¢üh¡ƒ]hŠ6·ýPÌÂL„Ÿ°}ÄŠwcåþ½{ Ö·ƒ‘ÓSbh}t¸·wŸ88 fS›ðÑ›ó˜K°AŸDŸDúÕ3d©ó‹q϶U‘ãéZ­Þ€[ÁMÿLìäп³xë7/È*ü_ŽgªâÃ;GÓÆÜNéì‡Gá“x7‚s…b­ '…n†¨+(BõÛ 2Šj” ¹\¹N¾­{Ÿ¾ö‚Qþãx !õ£Ÿ¿þë7ßzû½oÝ]ZÝÞ#šva¡CÿæúÚú¶ÏOÖõvüGaô{>8ªt˜z¡P¦(—m[—:œ ´Êùj[1U‘îØ² (ªÙíõl ×U€P›“yÙä™N»Iµ(¨Ðš2X^Õ5ÏωvÒãëó«É¸/vxYCç]ª-Цí8¶Ä‹²Ð!׸€ŒT2qOüÉÉÉ)|g£SÍVdGï4¡Å«Uó©ã ±£Þ÷ã6àuXvˆÄÞžo/€? Né/¸þî{zmIg :©¥•íù !‘ Cšã“d’È΢÷÷µ¹³ _ÍáQñ…-*µ'Éz5­8xÍíF¹‡A]2ñÓP`wsù“w^‚ªïŸþRåçˆRÿüÚo½ûÞŸ~~ú¨=LO¸9‡Ò©½mÛØö͇길Š#ôãz§S¼E«ª1tU8…yà§™*à«/p’¢¢¢¥“cƒÜÒhË *üµLÍÚ’µ¢fºg¡!Ñ€UzW7—“É€g4K—P€¬J3ºk»¬b IDATåv‘×LÀ —-g¡¼Â?Å ¿Ó³´ht]¦^éÈÛ@ƒ¶2<¼¡C€?îࢨå! +¡…oww/t ¹ ~– ¥üNæ ÚX[^ÂUÞýHôõ'0É…ž¡“D.}:ĽÞyž"Ij×O¤d‘Ž”Í7Ú4ô‰¬j躮jªˆÔ_¬qke@y §©Dô8°¿µrÿ…Ñkù+ñòAêg¿zóý¾¸}wñÁÊÚ®‰5Ø@D‚pŠïm¬,܇ú‡4ä›;þh<…¤pkQõb&W¡yUëºt=²BU« «èЩcªÁ‰²êÚºfH‚$TQð2M‹i5ëÕ&òìJU¢ Áu‡žm;º¦3(²–q}1žŒmH_š*µªÅ\®ÔÔŒáÀ‘TÇQQÕU±VDm—Jµ”@’k"]j Š©3„Ø@çÂÄéñÍ w¶Äœp}}sÎÑÛÙñŽQg…ìA'…;º‡þ]bµK¸"«[»‡¡Hä)7KÅ£àY¦˜Ž…‰F3i¨žvRþÀY"•œoYUE ]!AÛ¸hHzDHÌÁóédâ4zìlÞ¿õÑËQöý ¤JÏ/¤~ôÊ›ï~òîG-¯múæBÞGð$!¤|«îß_Z›_{níâ(¥§¨z¥”)Ö;¼$[Ý®-¢ÒÍ&Ó‘tÛÖzV­LóŠjë²jÊ‚Ð)d’éb³#Jt³Q«Rm¤Ã¢âB»#'Ý®çè†JÓH6‡ RކOE–ס=ÊeóUZÖ‡W3]Gd\3j–K%4Ó­$Q±<•-T:‚,¶›ðäÖ+é8¢ ½Ý9Éuû¼¼u‘“]ÞƒàSs¢Ï‚qˆMâÜ“ci‰@*ÆY"²#ˆ´y8’Ìå§a"Ô Imçéb{ÿ(žFÁL._n*†mY–ÓïÛ¸h¨kh ÔB‹úb1Ÿ‰ŸEÉ zµ/>|ûEg~žx©âsÄ‹©_üæ£/Ox ³¾å÷ïnÍÇ`‡ð<|+×É“³¹½wOgR±X*ÌÖ«•jíhM݆‰g:œs–¶w|p"K¼HK•g@×ç¸è–J|¼5´€Ä÷ó9´Ÿ:@ZßÒ¿ùúK1íÃxé õëwoÝ["ê“Î1HÄ`ì4‚º_Ø ­#?qw‡°é7VáhX&ºÈ{ØÙ;D™sL=‡8ÞD“TÿŠHªÜ½sûö½›¾}ĹÞCÏ€ýÐIÍ S§g§H[ŸÓeB')€T½ÑhÑ¢‚ˆHy®e¨ª&s 4†+¡‹v"ÜY_^¸ûÖǼù«Ÿ½4ˆú#¤ ÏßHýËÛ_.¬£oÀRG·×îß»swa‹ì»îùvðÜö…Nc±èjšB‰t*_©±+ªt%_Èç zÏOúÞ¡X*]­PJ…qôVÎg³/43ɳ³¼dkŠ(¸WK¶UA`8ìÚiÍ陊¢Ø2þ0KÑŽ uRºZÐmK*¦b§ÑxE”QþD×åv³ÞÑ{.×¢‰—¡Ä36ÏÕQÝ9“NÆOvˆ‚ò:!à?€íÝÕ¥e„qZ[]'zˆ¸ýÃP4îÆ·µFXဦÛ_ÞºuûÁ*¼ïýo|DôeÏe{åÁÂÛ_B ¤nß¹÷`g„d•ccsgo?HŒ>‰|æY,]¬WÀhœ‹ãýn“@¡$µÂ#+‘ˆ;w³Þ,e!¡EÂû;KwÞûÍO~ôß~ô£— NÏ •{ŽøžCêoß]Ý>öwv8(;‰åò…ÓlŸwÙJ2^eØ;F­sÝîêt½êçÞôñ·žR¯T\«S‡B»,üDÍðlËì]xBçÿaï=Øã8¯,ág~ÂŒ“dÉÊ¢E1ƒH t髪«CuuÎ9çˆÌ ʲ=ÏîØ¿ùÝs ÄÎÌ·ëÅØJ¤pmÙÝÔ{ê†÷Üs*h2r¹Z)C[2_jt/žž¬ë¥|nóôh9YQ;Ò©¤¨˜“SyÞ‘Ž ¦ãb9êT3IEŽäÊõzg¾é—#!pˆrwRµZ½ÙO‡ýF‰€[¾…½ ³™õlƒa°ºBRXtÛ Ô,Qìíí²ˆùîÞêåˆÒ•ao›“Ô#P)øÝ}&ïf«ƒ}CÙÖMŽ'‹µéj±C±T©A*«V­µ‡è\AhcС&¯—Õ|:)âÂáÖÝ;·?ûøÝ_ÍÐü¿Æ¤Ò׈×R··,.x°if³‹äAì^G‚j1“I5Y-ÂáTZ…Õ\¦\¯6WËŸ™K¤Æóï¿¥Šg8{v²ž÷&óÓ³õÙñúüäâù4Êû«çÏþz±RGG«Õ³‹“å¸[kÔ ¹|BDtV•ÔâŒRS»–ÍVú§ç'''G›c*üJÙ„ÉWêÅùi#+˜®&HÑQ®7Íá°Û­d©¯œ0¿ xaåwYM‡pÔ;|¡H<*:-?’v€Ö¡ÁôºÌî£?~ˆxt™©vöö/m€°Ïìó³±[\-ÖfëõbÚ¥'EÞV½N³5€Ù÷fs´Yκ¬ÍÔó(Eù+ö>¹së“ßÿÓ[oœ˜Øuãשß|®·ùAª¶³§o 9œ63ÒÔ.=à n3í P£%H‘H\¡ÞAôËéb¡Õ¨AqyÐëÖš£ñjó?¿ƒ@ij¿¼|z<MR§ëÕÅóoÏWCÊaÏ^~ûÝwgG#‚ÔxÎ÷5kÊ-ív³¯•“RcùÕfÖ¯Ã->WÙ¬V‹1Lz‡ƒb:¤šß}w\LŠ~Öx¢¥FÂbíV£^.ªö*ôz\núüRX1‘0Yì~‰j³tJXôÈN¨mö"ÙÓ-Ô"A.Ìã4ö0;üèÁýû>æ!ª?ÜÕ²r ´`:/E”B}²<>>Zv´ÙÀʇzÉ9ÏÎ× O·;Z1J‚“žˆ8¾üôÃÞ÷¿{“å%þnüZ õñC‹+à9ÇÆ\ð|^›æ“¹³k°¸ýl<ðœÂåg÷ DÐËW*ôhž®ÆãÞpÜíÏg«Í__ ‡ãÙ·ÏÏÎÇÃÑæ|u¶Z]<{y´õ:ýo_¾ü÷oŸ>ŸÒ—L/—³é|©½V±P/fV•TŠóå¨UNRƒ’)M'Ó~›Zûf¿›§SÍ—½ï_¬‹™hðRÍ~§QÇjµr>&a– ¤ê¢FÊ”£Ña…?w(ªÒÑΤ$¿ñMâ_ãîR>ÐSå /!E5áö“GQO¶·áµ½³Ïâ†ÌL_ìÇÞX$^¨Ç|=}D¥ér6¡ì;1U~6êÐûê¤JLPJ%#Aýã[ðþ{ï¼ýÛ_ÝXâU\A ‘ú;ñš«Í~³G^·f7ËNV‡OðÙàͱ·³³oqøðÜ'HáwÂV–†™¤è5\š7Ñ{£^QÇ$>§ò{\£nïR”£Px{—&Ÿ:®þXTÊ×F³£ÓÓSªMOO–sø6Â…c½^² {»ÛíÖ+¨û’‰xÀñøë?|ÿ½?ýñ­_ÓMÔŽ+H%¯¯/¤Þß7‚ºçp¹ì6-rsr6eÓ[4£g‚X=ž€Þ@Xô{ÜH¾ÜŽ{í“Ír:ZlÖGØdßšÑh8<[öÁ}íP¸‡Ý^g°8þç—ßCøèéÅÅñr>èTÀz­bH6«äeYÆÍNoÒkA>ÊdJÕ|2ÇÓF¥˜¯ΞRµ:>šcþ@ nMå44(såA—JÃx4¦ˆ7SÌQ–ê¨`Ã;<ˆù Tè1;JaShá,„-€Åx Û¤>ÚÞÕøŽ:|ý!»æj~Ôvˆ³á(Cjs|zƱ¡†’mf”­º,ÆÞ¤ô[-¥“¸#sí?üìªú zùÃü{{ãשßqh2Q³A•‹‘8ìODuÔ¿X³ym ±apá"¼,!y]N1Q¨ô)Iµ.NÖ³ñr½ZŽ{ÑÑj>…ØÊðlÑ£’¬Ùtšú Gçk²¹xúìtýì»oÏÏÎOϨîvA$¥ôòåñªZˆF¢Peîû­JJM§“j±’Œˆ¡œ¨Re×]Ÿ>;›'gGó²–İÒï3 n„R•N#Á£FÕ.æâ…˜?®íʉdJMD$:aF\H¡ŽcãOlÈ3eÖí€xËþÎÜñÂEõLtˆ¿³CêR*),ÇÅÆx~ ©ÓÓã£# Uó9§¨f£'¬b.¥´i3<¸ýÉG”¢Þ~ë·¿ÚNê?@J½F¼®zëóLJô¬¦& i£Ôª3ÓÍÛÐúg¸ý僩Ð[M&aÁëöÄ3ÅjwԪכ³ãÙt4š ÚÓ“³““5Ãåñª]¯ÕëÃn­V­öT™-—“F¥3èr>_ÍÓ˜¤…bãý‹Y9£(j&›+4:S¸ªq:µi;L±l½Aà„)éh´^Ï[UJ8ÑT±VÎ%b„-IRråR>—ÍÚCØŒ”À/Ç’? *ûBR4*ãë|N‹YÛ4ýãO¨"ù9K™ô:fbíÞÀdz-$0/1ˆÂ/ ÄâJ*×èÍ–)г§ÏžžŸoÐFM»F½ZΧÃ,v!øÜVãÎÃ;·>~ÿOoÿá·¿ùÕöQˆ_¤>úf›JƒÍÁ£ Hiy|ðJ÷ºìF)HÔ9]~A’„p$®fÒT?©ñ°@ç\Í«qzJýxw´¶—§§ç'›é`0Úœ·Qía›U¥Ž¨>Þl†íB n×T‡óÉrÒA–*VZÿóåzTÎ&àã^(ÕZËÙ¼[‰G¢j&ôy=þ,’T½=M&£ÑtØÊ¥`ü™.VÒjT±Tj„qPÃa­‘K[ÇðùCe…Âá³jjææW²@I6½~ˆ^0”ÑquD]~1ƒŠï½ÝÐd*/w†‹%©óó‹§/^<=;=^S,:ôJ«ùŒJ¨f9N›~ÿÁןôÁ;oÿî×ÛEiq©Ä5âõ„Ô{·Â(þ@oä¦]g²:]è½Å Ÿ·¥è9<^7H½C$™Îf3Ôߤ” ü¾@¦P©Çõúèøèx1j÷—G“îd¶9;]{ƒÙÑÉi¿Ñ,-‚T£[¯ÿ·“Y5_ì{½Ñ°U«4:Ét„ì5˜nŽ7‹i£‰®J§ßïŸlæœ$FãÑïõJ™V³R­UŠE*4ǃ * éÿhB‰F *A*’,ç“ Þa‚Ž{;9Ù¡ÆÃr4,”9‹Kðn²ä¥Þ—KS£ö{¨Æõ6›ýÀK€uĘukf!t»KŒg3Õz£Ó›ÌW›‹ç/ž½ x~~vºœ.ðv)+—¢’Œ ¼@“~ûáç¿÷뽌úq)åñZBê·_ÞßÞÙÙÝ£GFŸü<Ñéáo •‚(|TóÅ)ždÓª©P¶\«M†õæò䘪Úpµ÷zýÍÉÉzÐí/ÖëU¯ÕžmFíZ­?é7úýëñ¤.Ãò©ß©ªJ­?ŸuÛÝþp²Ü¬W³V9›É–›ÃÑhBb+#ˆà†û}þTµÝ¨T ™T¦0¤’0ŸR£á Ïã‘৆˜˜NÕÊ™Dœñ‘5i0¶Ã„›ÙÈôN''-öåeÉËgm,êâ „v¸*0q62iú|PsÑŸá\¥>—7’¬Â)x8ž/7'Ï_|{A˜zŽ$5ìO§m¶’ʇ…p8äÞ¬×=úæÃw~]ôØÿ[¼ñzçË½í­­í]Ú‡'ÛF›Ã妌$IbÈãrºYlÌ狪Ôà$¢áp4žJ&b±x\|A)ÛlÔúíJóèb3›Ô˽٠Ӫ5G‰n«5 ¨xë_¬‡­ééfÒõ’‰r‹Î\¯žN'ÉÊçíf{´ÜlÖ³n§V.5z£ñh9jWs «ÅHR,Õêµ[µ‚ª(©öñ¼×Ht?ªSÍ·FŽ(É|§™ŠË"ú®;¦…©ìs{ü,¿Ò ‚„Ëåä¹&ˆ³Ä;¨ðƒ)T·Xì¶KE>M‘$¨èÀ§“Ò™,öFÓÙ|µ>:yöüéÅÅÅæäüâ|=i×ôQE*WéÇz©¥Œ÷äÁ­÷~ˆãø&Ä©Oïïí>~ôèÉÎþµk°`ªDW-†¼°Ÿ`É éR(©"qÖgDéì¥4AªÕ(Uç‹Ù¸VîÚj¹žh«ÑèwG‹ÁðìÙñl¸^N‡ êŒk ¥ÚªW›ÃF*©­õÛñ6Ë£££é ‡?ß!HNÛÕ|üü<ŠoJ¼¹úìžÞâ°™Á4GÉw 9Ä[Ôš3s–Õò)ø>Æ+*qZ·7¥S`&*‹±r¿[ʩɣó³U¯˜ËÂ¥"_¦³Å´ÁÚÌ&œ¤æ­t²ØÒ—©<ªµÛ½A´˜šµRk¾CrU°H˜J¦¡~9êTä`8Ù›.çÃHæµîé¯Ónæ’ñXž J,òãäszñy0>€L‘O Ó¿ˆä¶Ènᕽ=ÞÎÀ¶û¡Ûwö)gïg2Ã_¬Ù«† ŠGžŒè»`êƒ9š)uãÙ|¹\­—óñ+HÍVëa v<•r^±¹¨ËaÜÿòÝð(¾)q©È5â5‚Ô;_éLv›ÕxÈ †Téõ¬d¶Ù ° %VêãéψÅeÁ‹Î?@Ý~XŽÄ1àŒÅ3õi7ŸV³k:aƒR%›JgêýÙÉñÑt0ÍÖÑz6/ûhÚH§Úƒ´ÀËåj£ÙO'›u·ªÆä¨¢¦+ÍɰQpjÑx*Sªæô-2™öhI¹ ^) •z³Ñ¨ÕÍz9™ˆ'’éL*“ýnÈAÈœl €ÄêJQxIIì_í´›ô¬Æ·½Í¹ØéÀöƬ@íîð#eoûR^ÍÚÇ®õNÔ ‰ñ|‰PRÊE#ŠªBÌBI–›#¬ìR,` JœÓ¢”Ï`pÉh3Þÿâ=ŠoJ¼©úâ±Ùî°Y ûP¯‘× vb³šõzpl6XÓbo–žÕH˜,ÓÓ; ɱt&©*ñt®5nçR©Ò|¶ÜŒíþÊ IDATl:“íN߯†0KïöŽ×‹åt¾ÚœLêÙÌ`Ø­–¨ì+×ê­Ád:9ZÖs1YŠ*él©6ï5’1Nñd6“/ÃøfX®g«å¨W-—JÅJ­‚‰Z½^¡RSMerù|V {]¼)IA8h0›<(R¦#HIx ¸\v«þ+…;{FM¾0€/ïþ¾†µ}=k¡…´a.ó¡d¾Ê*ÕŒJ©4Å©ìÀÿj¾X,æƒ^—…% /AÕ+ôe‹EUFŽ‚&ó“[üAâ›o&¤þõ“‹×çvÚŒFfXM@”Þ`a¯g«Qó¨õ Ƌµ :`^8!šÍ6«ÓŒPÉ•P¢‘luÐm¤“ÔøÌ¦'Ë騘͆“õéÓE0ަëõÑñzÞ§OŒšÅÒxØBiT)תÝÉ|6v²yØÌ²Ïãñcˆô€óëp‡¤D2•T¢Q9ŒDƒ>êpOÔ“'{ßïv k1œvw 1AùjgOovR¾ƒÖ³Ùj÷ã¦8™‡K;Á7ëÝn ÃÌJ½7œÍXßúK»]D»Î’—UD3æ²ßþ•qü·ã Rò5âµÔ‡÷,.( Á—&§Í¬ÇŠƒ‰Ž¤Ï‹Ï‚î ‡á Ã&gAª¯àba„6+T!j¨¤T•[:]ëS¿´¢:¨šÏæû£ÙpÜoFÃÉj³~v¾7[½årÜ.W&ƒ&§V«týÙb$Fâ¹2½;ŽFw0 ûÍJµÙŽç‹ùtÇà&¢Ýfw›„™³IE@ÇaÒ}ýÁ ûèÿW _#^H}³ç¢ Kz.È‹QáϦ輫ê‡&uùÁpD„ä8\s:ÙYÝh´9‚R8Š{ÖP"[¨Ö2ÙÆË…°¤(gs­N«RoÔ¨iŸQ‡õý³I¯RëÌgÓ^µ:4j­n«ÞœÀÇc<µ²É¨+T»ƒÑ ^«ÐG‘t©\Ȩ”„ªu^‰¤&ý*54y69T 6 «eÓ1‰ÙF‚ºÆ”ŽkÞŸ!Е\Ü7P$¤VP`HñZáîöc¬>¢¦jÿÐ +k›Åd4 RA!š(T[¯ ÕŸ.f3z,´{ƒÉl9å¨ß†',†9Uá!•ˆˆALÞíVÝÖG7£óÿK¼‰úÃWfw·/HAØÐC%,ùRÆ"2lÉ´`±LzøZXÀ9€K:¯ô§#åR¶Ðèvªùt±Pìus¹bŽºœl®Ón÷û£ÅéªQ*6À†µgË!=Ô›ÁbÔëMW*– 9jŠjÝét2¨Ã :›©Tré$Fñ¥j;±ÝÁr=ïTªµ¬ r‚ŠV3@S’ç}ð<¤º4à²ñš”;Ð ò8œÒ¯nwKS ÛÛ7;E –>v0“é7=xðàá£ÇÔTÚ¤«‰V»ÇŠ*…Ú+H5'ëÍjuñôähst~ŠÁÿdÜã…רh4ê5d(1ÀŧÕ|¸wç“ü$¾1q)éñw õ/¯â©[[«%`ƒu¶ uçf›Z½ýô˜–e1tÅ"©uå;[X`›Š€-æ³¥z³–O)©T¶ßƒÌ«’H$3­uö³ÍrZΕ:“錒ÒfÖCÕW-ûÝùÉ,E‹¹t6פ”5éSmG3W*VRéL¶\kâDÃNtЬV +$–¥¸Gi¸rD`!Ê%žÏf§üÐ`‚Í;;>ŒÝô;O Å÷„¼}xGÈE”möv=¤p˽wh²;´e0²þQB-­–ÖKµW§ÇëÕÙóÏŸ=v4C]bкDTE)µÕÄ™Ép¸ýðã_­Jßÿ;~(H½ú6?4¢þH}µc•ÂH3Vŧǹ檀ŒX$È…^P€ì¹¯¿¡Í›(üA’Z^¢ð‹j&Uí4j°k—ã ¥B2¥X¶R,6›Í´Ÿ/´SJCóY¿\ÀH¬4žt»çë!5PÍb®T«õðÌo×jTúå2ɼ§Ò™\‰R}8ì¶*¥t,Œ¤ çw1ª¤2ùœÊfDc±˜,zcÆ]€ÑÊv ×Qóg8àTôðÑøÀ&“£]ŠáöÖ@Â5÷þ¡k¾&ãå:‡Óã—cÙr»ÔèNΟ¿8[­6gçOŸÀÔf¹^N¸ðkT3œ+ÙLÛi;@-yÿ›OoXç'®° ^#þŸ€ù*ÃÿæûùÍ[ï=Ô»Ãb€ kœi4;Í («)ê‚̨aQ£’(ÉrNë˜â ¼/# FRéTsЬ¤Õ8ú«Z!“£~"$ÄŠ¥|µ3ZPûQ¬túT)×J&ɤ&ÔxÍ»­^¿UÈ«õîpÐoS:¨UJ\áÆâð`/Á!ªPëu›µB>J=Š‹WNÂEM3C)JŽÆl™¸lúK66dл(©ê÷w?¤¶÷,v·–  ýán÷ °FEßëóé/q4sP •)µÚ¬Ç2^?ûöÛ§›År¹:yúôühµZ­çHqÖ‹0Iø/Ñã2>ºûõW_ÞºIQ7Þ$Hýî½¾¸}÷Á kÊ8ìB®ô$9– dCˆÚ•LJQ’i%ŒÙ… ž¶.NQ^æŽ ,¬ÐWekJ!“JHR4‘Qãj"„l³ou;ÃÉp€žRÍ ›Vjš²T¥×îtO§íÕN¹L&W¬×Ê¥R¹R*fS¸MŠ%R”Ìð-•xªX­ÖjY ìt̉ð†N+—UpñWàà–f.ûX–¥©{¤î?x¼c0Ã`ØAê}Zt—Hø@+¦²ž®‹ ?%«6`Ƚ¼xþòåËgG ŠÕz³YLz°BMbV/øš œÙ°÷äö'7K»×ˆ+0׈ÿb~ŒñÅõßÊÛïþÕ½ŸèÙk‰ -Úòù‘®ü‚(Ç`Èx…SXŒ'2é¨`‡P+´ÆXÙYkTİ@™*”ÍgsùZ§\ ‚M–“Ù”« %·R‹ê½v»×O:íV{ÐI6¡¨)ÂJ¥ÙhuަÑlÐʤÒÙb¹Í½†‰Fc|‰›Ë‚HN -”55ô¹\^A’#±˜Â<´ƒ˜ ý*“RÃ;A ÷jØÃ9ÑÉÖV‚ÔÞcBήŽRª=hîSº½­Go±ƒ‚&Òb´¸/•à±çá iXª6;ýåé‹o_¾D–¢X.†ƒ.uXµrN1ËçÖŒJM{÷o¿{3ä»N\¡áUü¡tÍÙÃÏ ©{÷‹;· ðGÖ&1™­äy¼Ôu@zAKð× ‚¾'‡EQVRIÉo5°,ïäªðÅÔd,ì÷…“Å\®Xl5ËeêÏé™^TµP‚ˆI­^(CÅ®3];­N3ŸÉ¤ •lù”ZºýÉb8žvÊI•¾.›â1ªø¢IFÚÁ=òe]O¦óéAÊË«±8§¬ï¦&SÙ+5 R€ébÕt&£Æ!‘/¤J­TV*ôä.&Õb«L§Ÿ§ƒÌ³¹D—kn·;êUK¹b·Sm/5FÕv·7Î6ëY­TÒ…\*Ûï·‹ÙtºÞn5‡ýn§UʪéR@ÙBÐïPz¢ÞÒppŠP!™/dA[Q G²ùa=ÄÊýÉ8è‡h÷ì¼K¿py¡ ×e5èt”béÈëv·>¸ûÍ7ßܽwà 6”ge¶÷qx‚¹j‹ÐR„/•ŽÄâ©l¥Ñé§`ÈòG—ºZÕf*ÿQJQ¼LÉp÷Þ¿R·¨ÿ~\Á!xøû˜ùq.‚¯ù>>þòΣ­m^‹ÂÒ«ËHÿõ:—?$Ãþ> åqÚ]Ú¨>Îáè+ZHbË¿¸R'¼€uBdˆ|µ\ª×ëh–†ƒj©Xé¶k•zåõ>6^gë“u-§$2ÅB¡ÑoרéÊ4ÚÔMÁˆ©IfKù,um1(„}þX"Ž ¾7ç´‰'‹¥\:Æj~XŽ ¹„’ \Žž’H(²$½Vpí6Þ×5s@–2è-6‡ÃjÒílÝ¿{‡â›»÷>ÞÙ7\ò‚/õZœ~©XïöÚJ6… 4®¨Ùb£ÝŒ^Aj1îbf^ÊFÁÂÇß‹Ÿz5£á`ïÉןÞð®Wx\#~¹úý­Ûw>†\‹ÞŒýwáÀâ`=.JR°¦Ýß79ƒ—Ýî¼T0qz”cà&AO!Ï¡)dÕT©˜Ï¦Šõr©Roö½î´_)•êhÝëÍj©RmŽÓÕùQ%Od+•v¿]/ç2©\³Í• %¨|9ŸK§”(«Xú‚1ó8E…#XϤJ©H‘HL-R¡§ÂV& øæ‚ Òá¶bâryÄYÜÓù#•ƒôü $¼¿ýèî7_ýõÊR¶öؽ.¢\¹Ôèõ»­eS*,“©L©ÚéÁ~d¹ÂÌ|=w1æÏ(pAÛ)è¶éµöM¸÷äág7â×R?[éZïâïùõ]æÞìÛ\ÞPXð™Mv¬îb1Þi7ô&{0ä÷à\òÄ "Iìʱ‹‡Ë(ˆMr,ž¤¤"GSÅ\2‘«Õ‹…bÎbg8lA,¬Ûjw`ÃÑmõ§c`j~6-$ãj¹?¨Ìf½a¯Þ¨•‹•*}EJm™.Kƒ€(ÃLú2EQ®’¡l›+q1ŽÂ’·œƒQS: !˜°ÈÊG”C±Þáu³»5[Ø×¥Iõ9œ0Ju˜¶Ý¿óõíÛw¾yððñî¾ ‡&ðýµÛŠVšý¥©*,Jf« Ý <£ÖÕ|Ø®¸ÞÓj|¿Ç¸ºíueOîýùo’ÔuãÍ€Ô;~uçîýï\Þ $‹*y@‚5™ñx7›Ì.d+ÜTY tA@O‡‚¼0ÎS 7(Fx)IæÒJ¢Ü¨©`ê÷aÎÑ(—;ƒ^gØkT*A{™åÑô»e/—JäÚãɤ_¥þ¿ØÚõf¹X¬ÂMÜï¦TEƒA‰‰ TÉYÛE¤œ˜§j0QR¥jµ˜T1š rw%`ŠðAªÏëÆ½h~ši€¶/ïöPWò[ OR_sª_Ý¡ÞðÛ•B> ø<^!Vm¤:ÍZµR.×ÃÑd2ÎëÍFÃԤ׬äãÑWˆ zû‘ño=~xÿ«[7´óëÇ ü׈_*mö7Þ¢Šçµå&3¤”¿Ð\p@ÕÎîôx@‹…¾LAëó—T "p *Ð|°ÇUÒ©„’®ÕÊåÆh2ÔjuÈ+wzã¦R[Ï:Ô‡Pš:š4J™Lº6˜LGr©Xm úÕR©\,TZut/eª´’1{÷ØÀgvê¥DQãÉt.—Í&bø\œÀ•GäH,‘L'£Ð £ ÁCtC ÖÌürÖè¼æïá½(ÜÆƒ'îCµQ{:ƒÙî„dW"aøPú•”Z{€+'ê é½L\ïP­–ó)õÕBœ•¢!õç1ë¾¾õá‡}rëÖ­?ø›EýñF@êŸ~yÙCX]µù’ðÚ-&~˜Ûy“ —Š‘68w8¡yL€ B#J‘xâ{|2&€%Ke’)ê§* K»T*5y›h0ìuZµÎñ²ÛN§£É¸[ÊeÒéZo2¶Ë¥R»Û®ç²¹%©V½Õƒ;  ÃP ¤ P0$%R™l&©"sÉØ#Vã‚fh“Våp4—Ã1úÒ˜ ôT°™ lö¯Ãu.Ò˜(I^'Aêñƒ»ßܽÿd~‡§†áX<*C ºG‰:½öœ{À<Ÿ­)3­7Çg§zí½fƒ!%R‘î?úä½·þðÖÛ|ç¡óÿ^\AÊwø…Bê÷|}ïþƒ‡;{‡(ÁbVÆÚ¦´vžm£ì‹kòunÔFh8œð±¥V‡Ò E\e’J<‹%jA¿”M¥Råj±P*–lóž,úƒùj1µ+”£ÒéB«×m7kµF«–M&¨A*–[z…’ýn<"‚_Ej“R‰x,,ø1cŒ'à"_³GŸ‡=)¢R)•^F""z]vÍ,€[vÙ%^óÂò¤¨íGþàÁö>²õW0’3XFBŒ²1Yj8ècC·78ÿöÅÅų‹ét‰N“ɳ”n镨}n‡nëÖ{7¥Þ?Wò^#~¡z÷³û0FßÝgc$ âV5è²k6¢)¨ty}8œôk4î>÷ön)…L²Çí Àñw@ôt€5”R© +N›Mª“Å2eŸL©ÕëÏNÖ£Á`¶˜Ž†"•*‚ÃS«Š ª’/¡Ú­×* ]°? ^Q„ ”Nǃð3x‚0.¬äh"ÁÙK§ÛGµœ¬dÒIŒÐÃ!—ÃjdÎ,+=±|Ú¾ÁlC³$2¢|oÙÝÞz´u`ijÃMÉ ‹-ôÂ+òb2-}ÂõPóÙtþôû¿|÷Ýwϧ½þ ßÑèèz>£^ îô†_¾uƒ¨4ÞHýááî!o±RŸa´ø¨™’c(à´Ö‰ÕY,,ä´cÑ\”å×f±ØÝ‚¬Òy§ò(è5%'lô€WRTž‰Év#—µÆpj*Óhµú‹ãÍh<NƣɴU¢Rµ¢š*×°\ŠÇSÙB±Òî7*Åb¡M%b¸‡‚ŒK†~ÍÄn†P/‡e(d.•:&·‹Ý¯Ìf›Ã‚â AJ‰ ~–üᬦ >ƒÙéxtf¡áéq[º½}½Ý=*Þ(@b –©ÇËçq7=ž-ÏÏ6ËÍÅÙÅ_þú—o‡¬+Ñi5¨i,æôD ú¶½Ÿßà韈+Hy®¿HH½ýåÄ ©Õ8€“’Û.ÅØÿ )×ejrzC¶=³Õ'ÐSã1úG"Ô~Q€¥îóyýBœ> Heš%ð‰Ô$=ê•D:ßl¶û³Õl2Ç£ñlÑ*¢’™‚U+HRe R¥f¯[)æs¥è±0/¥X&£F°uëvñ,ÄÚ/šHåriEÀgmV˜Ÿš,6ýx4)€”‹ƒ&ìê@2Ú;0Øœ )Âx$ˆ×ð{m¦«Ÿ0ç‹G¯ § ¶Tƒaa¥ÞêçËÍéÙÑjµ¹8Y?zÔa]‰v£V*d8+‹~åðî'7zÌÿL¼þº½mÅ­¦ÍÄ~I·Ÿ*8œb1àÔjì]àRë"¸á¦Õï2[œÔü¤j6£R÷‚Aˆåqaç5=—P¸XÉi¢\W³¥F£ÛŸL‡ÓùUÔtÞBá—-¤"²Z­7èð¦ã1BX¥×isÙ|«É«„Ðq¤ jL^BAþ¡GVÈ«± 4o­¶K£,%ð`L[°‚øúÉf9ÔAOF¹ÖD±M‚OC>Ndf;t4„p,{©°’ÌæÊuÀ¦=ãŠs‰ó“%½‹n“ ¬)b‡8FiÐm×=¾˜ÿsñšCêwÝ90_Zøaàò*å°—ôgF=ä0íÚÀ™j$":­v¯-'UªTËY5ªÉ9„DžœÀ2¡”2u 씥QŒ%óåZ½Ýé6š£q«^©TZÝv-“k7Ë)¬Öµæ<«JЪT«¥T²L9‹û îd:“Î+Äèð(yƒ7«­ôr£gçt#6ëá–ÐÏ‹É~‡•ªýýC£Ý GBpn”°œì¥ guyAû•”tJ¡ŽïGŠº‹0­ŽÎ/ž={zºa®ÄæéùÑxÐ&4ik‘˜‘@7ÀãÐm}ôÛŸæà½¹q)÷5â—©Oï<ÖC7ö’wãÂÕ§ÃïÌçvÚaJ{/ZÂT5Ïå Ãæ JXÓM¤Ë•j1•ÐÎK‘XDt;¬VúZ9‡ÑB¥FýO\A;$¤ å*%¢Z¹ÚAYGu]µÛ.Ô[•lTަÍJ¥žŒ†Báh*›Ïg”lÖ5ƒŸj°X¿ð¹12¡RÎc$¦¦’  ÊC,9÷7ç;$v^‡ök‡F³K›KliCù,¡&âÔqÙíl-’“¹4º@‚— ÇÒ¹µx½áììéóç/^<;?Ƶîúèù³ÓɰÛn6ke¶©CHAŸÍðàFäüŸŽ+H¹®¿4H}ðåã=l¬:°æŠ]Wȇsá…#ï19Ý`²»ð”‚Ém•(|Ť"-›Rä e…˜šÉ$E? =ܾ`4‘ÍWéÄU•'I‚'üÕjElê–KÙ Æ© }˜Pâñx¾Z-øúÞ𥦠ò9`YŠñ|€Ù»@|ðÑ0¬NŸæoòÁãfš)³Ji”exræ!„ׇC‚~+ÄúèŸu¥X Û~—Ë‹O†BÑ4Ûèàª˜àš§FªÝÍŽŸÃj÷ÅùÙéf½^Ÿ\|ûâé¨Ûí4ëŬÊÄ'@ÔiÙúúfãŸ×R_Ýß&Äèô&Öavóm“ÛÇ Ìy!~ 7Ú]ôÇFL¤øá }2™ÕN ,>0ä±*ˆñ ¿@T…,;Õ$Ô4V*C^–„°Z,àÔcñ-èƒÑH<‘*°µZ½ÙÂ¥SwxñÝŸ¿ÿþ¯ûÛ_¾ýöd=ívº½n»^ƒ{2Œ•f¶þØ»óéÛ?Ù™{Ãã5†ÔÝm¨AxõE!ž,nvlN@ʪۣ²ïñŽÑêö]úÿyèW …úY§Ïç%Œ%F£2Ì{/×A¬Þ`8WïµÒŠò{½!‘NuL-–Û­b2| =ÿ[ù,¥©¤ š©ÁŸG‹/E(EC~ðsm¸{‚Ó¶?ÌÎ5©„•ƒ>j¦ÓvÈ^ØA•‚Ò-Üt½²¢Æ$zlP²­¢Ä#^´‡;EO È2Ó "®+H©élFMdr” Š¯ ?ánw8ù—ïþú—¿üåû?ÿùÏO7Ã&ÖnÔ*…\—Œ~ IDAT2ô`MÑf:ܺ÷ÁÍìü‡Š×Rx´o fÞ¦=ÐÅ ×ÆÒ (·¼¢è²è`³«ÇôTj œNÖl jûþ€£Ü’°uyÇã›/$—ÚZ"ôy¼¸9Ž+É\𫬋F±ØÔmV`ŠR¨ÉelXaòÎQ6 úDx](€’#1%.‹>ýâ°!'Z—Ÿ@_ W2eÆËÅÁ€'J$¬#°ÜïRÕ‡;l ûÇÛ¿¥P8S(QEp¢WÚîöGãñp0,Nÿò·o¿ÿ+EZôj¸hT #•P*[L†½­Û7ç?\\AÊ~ø%Aêí¯°`HÝ}0,Ñsr7‰§Ë+m& ™ínÌ*äHT ºPŸ—4"jY+È›¶lxÚqF±ßç”t©Õ,gÃ!:éB4‘PaX]«slOm²ËÅ|..C1W:þKúO6›>·Óéƒú:®‰ye&åR޲Z˜$…c300v êR’è5 ²,a¢ÎT*»3 j·Ö’È6¼À]ÀÍx„a(Ò”‡içb¼D©©ÕìôÃád:™ÌËåb¹úîoÿþ·óóçߦ¾{¹žô2T­ª J›’à²B©ìþ7·>¸™ÿ€q)Û5â—©O䀷º,bÈÌb'Ú¼7àµ"]Ymtàà(~ÔZ¾ ‰!'aŽÆ¤9¦(‰D\ðj‡[DÍJ•rN…f¿/¢àfŠUúLŠËKÕö°×nY2BbIÀ ÆUH¥SI\{=>!,j3{‰gð6§¯ö»­¬ ÌZʸh²1=ÉM8Æè‘ý8P7BT– …=`IâAº!Å tj¨ÌÕëyC™!%)•z£EÒ€Òl W›ããã““oÿö×›“óç¬~9w’Q~ÁBÈç†EÁÃ{w>ûø7s‰2^WH½}o[§;4Ø]~ú´xä(­S±c<@¹yürTö»qt…°¶I!±,ö+èCE‰J;ú‡æpF`ͲìJ¦îq¥P.ç¨Q¡¯Mæó…F³^-’TƱ­;ïíIÔ)ØŠ½\ùÃý0TèKRŒº(8‰xV– ÃÂ;D$ &õz¬âMCVoÂ[a#aøÈ39cvtRnm#Àïgºµ¸Dƒ`y0œ H5¡ƒ6šLç«õúìâéÓç/_\œŸÑÇÇ'GëùlØ®ÄÃO/µq†ƒ­û_~öþ;7[?t\A aý;ñ£8ÝüÃzëÇÛûû:=oþËx DÄOΔ©üÔì@qÖá# 8æhé S²8Øn†Ô¡ÅO ÎÂÄ-Cÿ(ê=RÉý7“Éä*UlBÅ4c8¯ÂŠ˜#PB iúë!^ü)‡Á¤:¬ªP¤ôº.GM—z¶Ó±\€^/¦~¡áMBØa ì˃y„?Ñv°•´±¢S2÷qJ™ ?ê¡Ãñt¹ÞlNÏŸ>}öò»çOÏŽg“Éb1ŒGíj>ÂWfÃáî“»_}ôîÍüWú{pº‚Õ/R¿ùàÖíGÛ;Û{vŸçe8rÈIVM Ò-=ÆéìŒnŠ*Ížƒ¯Oã1 ‡p$‘ʤÁŽÂRÀcðŒÖ±[ëgL  .µPÁ6‘’ÈäRj2[ÄŒ:› Š‚£5Ñï¼ÒZÒè„PeDR¥éóPûc† 3`³E*3õLSìNŒü0¿§fÕ*îˆmLYôú¼ â`]r˜ì‚R¯µg„QÇãcÂÓâÅ*õR-ÊS)èmŽž>{ñí‹gÇKˆ´wÚÍZ9£F5¶àîöÖ½;¿ûS¶_G\AÊrø…@ê7üìöÝÇðI×QÑ„C§)L°-…M+ýèéíáþPïÈ HÙÝ^Æ,C‰Âä»áR4.øœNÆ€”,l ÍÂÔÂðx¡X/åÓñh4žÍ% QeD2&ƒñ§B­i]ÜÇ÷I^Öe¶†‚€-†n°b z(±h­'ªKH᪗ðÍše *VïM³YתAŠÊ<ä>mc$D­a\‘±ÉM”ªÍö«Â á盳§OÏO—ýd:_*ò™T<r;L†ýÝ­G÷oþîÍÜüG‰+H™¯¿ HýöÃÏï=Ü‚7­Î¿ÇÁɉžàpáµs}DoÁg1R†€§f‰Ê)L¯ÞDw»¸Í‘¢QþˆÄþ ßÑb9V ‡ExcBRªP-ÃjM‰©t*©òc³w5'D&“jL¾Òdó]Þ ‡°J;HQè²@[†^‹nÿ@½vË% ˜„Là“ ÊdðGà j Ì ]..m—a ývÕt©VÉ`,’ÊÔÛãÅñÙÉf9›M§“ ¬»ƒñdXŒ‡.Å‚^—è{üà›;_}që½×€)^?HýþϾִš÷Ž À¼<ÌÎ Íì@é³,oøYÕbcñHHc+QÐc@‘pÑé)Ñä_ePüpGkC!Ë`++Õª0˜¢Œ–'T"¡¦³åR2¡¦ÒI„/÷7ÎQ”E 4K$“ðˆûA‚2[?é\ØýDÁY—CFج±¢˜Nw¨§ËíÁ·ÄÆ"!ÊËÌ6ˆrù Q [Yås¹r³Ó*åry Mº³£§/¾}zºœSß4V«Ýª*|Qìg—7»eÿÉ/?»õѺé¢~¬xí õ›?}ôõ=F”Nïðƒ~\HA„Ÿcº Õ'F¤Ê?ÊW¸JÑqâvËFÍõ:"ÄÅp—Ê’,PNÂW¡Þ¢^HôyqSˆ¤kõz= ›L.‰ ª±Ò”µ ²œ¤¤`Ïl0@?;íÈq5RcšüQDò¹,F êýÚ+D½‚@D±s¨Ž9Vz hJtx±Œ›mz¿,?¥¦ó•J¹Ti÷‡ýF¥T¢R´Þž¿xùçïž-!„;ìµ›ÍF½œ‹@ Ï7!ʰuïÖGï½ûÖïnæ|?Z\AÊtø@êí÷¿¸óˆ-:¾PÈçvÀûïÒz‰Oë¡^o´¹%:I,€²¤„ë`ÅÑóiÈ ¡1/ˆì RŠu¿€A9 zaBïIÉ|¹\ËÀ]-•I+1Ðí¨™ G0)¤Œ•P0×£€•AÖVg½óx6Ïøƒ[Œ»Ép ;0Z.‡•G—â E­O+°µ ¤Ýú«Kgn§Ãé I¢ßâGBHIæ …bRaýñt>öuH5‡«‹gÏŸ?£âo5Ÿ”³™b©˜Wc"ïqÙeÑï?¹ýénÐôãÆk©}ï¶‘ÚךQ–ä‚DO t0õ6(a6Òœ¯ý^7ßUQÃEÝ> ËégÍ~—FwƒÝ =¦lO$“ ×§¤âá ›WáDÀ£?4U vذHz¸tÅRŽÐ’'R—” ‚—¢fJå\*¡Æe29\!š*3¾C Íd±»Øê 7V´S¬~¹`4³Ž+iP™ÉäÒJ°EÅ›ÛQò•þpÐcÙX‚Ôj½œúN§¦ìd2™nŽ×³Z’žÚú2õšÆÃÝíGï}óå­o¸G?z¼^úÇ÷Ÿè¨²#ÐxCصó@Ú`ÒîOùÙÏä‚sÁ_]’R’ð…î*\¸»BŽ‚`Š$ItüáÿÄŸ?¬ÄB~^ö±°xý*šÈd’q6xójÒ–>?„ôàÒFݘL%˜‚ K¦X©Ur™tRrÅf³9Ü>·BF–ñ„Ã;oõz}h—l,ñ¢ÇpïÎÌ×Nðåt¾T­dBIP‚{áh4úý^o4/—ëÕ|Š£Ñ [¯+õJŽ*b8{8ãþ΃onvëÓO?ùèOoß êÇ+Hé¯?;¤ÞþøÑ.Ž#=òƒbc0f"˜x4Í7;‡h¨ôÈUV‡W¨+j© ¯¿b÷ Ô1P‰ñ„! @„E øÃ±ˆè÷j;À~܇ٔFc0Õáö×ï!@!°n¬Ç’˜ ¨ÄÁA‚”D@ŠæJ•J)›I% ßK+¸?ùr R”£7X‰gÞ9)ŒìÌ¡Ã}/g)ts²BˆªW3ŠbE 1š-ÖZãñúæýþp<‡ŠØb>°ÍѬf“J4Æ™Cw‹Y¯ÛzøÕ­Þ£øÓ»¿¿™œÿñZAê7ï}±K“ÕA9Fx BÓ“ž¨lÚ£.ËhâÂJor`³œ Û¨ í\èùQYlÞ ªµp²]¡ôȽyr”­2´.Æ óê9}­æ¤Ë”s$:óbÂ×íòˆÈüÅš3“Vé\‚/Šìuj“:+áƒ9*ñàÏ®‡‰½Þ Gh”aà¡pÈBxƒQ%[n6ªYU¦¦ûj©ÖêLyJ>„‰áæâìd3ŸQÌãv.Å4*ܰwÎþþΓ{_øÎÏîO¯¤Þþ䎎N£ÃÍk ÿh·»ÔL{Ðàß?4kƒt£…{)0UÑh™.¶½¨­8³E#ο_ˆÊ¤°DO§ €Þ ô15„L¶è)ù€ÂêÃüÐçU0y<“@։ Ãé’éOØ—ýrøÍ)Í0¾b¹N·ľ"èv@íPë³iŽl>BnºÜjÖ*2f(J"Y®·»³[0Ž'³åѳ§gGsÄb1læÓHXú·™ôûôwòäñݯ޻dþ)ã R‡×ˆŸR~õPo4Y¹ññÅ*ø}6³ñ@GxzòäÉöÑfƒt— .<Ÿ‡à‡3Œ# &éuÙnAŽ<¸Ì% ì¾ Äp,&±E$NüR˜uR07cB,+,ù@5§+‡¾y0š`[]Þ˜ÒÄÃ`Áã %q¨Q„üÎK†¼‡xðäqñ~¼Æ8‚#}…ƒÐÿÊó2iLE`ž®¶[b&Y‰d2™.Õ:½Ù|6L¦³ùrutþôâdNßbÞo2PŽÅz•ÇÆ"†;[¾þü7†?e\AêàñóBêíîmšù.çÒV~›ÔþÎöÖÖãÇ[»v7˜;¬ I-Á¶.œ±vîvñÒ‘Óã“ã %JOr5(‚ßö9Ø’â11Ä䬨Ë!x%ú1ÕÀv…¿‡Û£¥Åp1¥P2Rã`2ñ8ƒa$j¯ØT; Ý†i^eIÞ†Bè×ò¦ËAêñÐMýï,ŘröºÓ6Kôsâ‰t6_¨6a€Ýåjµ\-Ç£åj2œP-8ì4+Åd1EzSãáÞÞÎöÃ{Ÿ}ðó®_e¼6ú×ßðÙ–Îúº}~êû0lÀ•Ëö“­­-ÊQ&7“$ìX" aƒu÷%.ÆÑT’‰¨DYÎ'ˆl5u)eä¤(~ùa@(¼ M’èÕÈÀ¶­ªÆb‰tîQ,÷Où k<Ýsø—´ºËfO[äÅZ¼$ÏCzú“/@ëwiB/e²à¥bìï Å«­ÎhÖƒt"‘É—Êöp¼\³e5Aj9k×êív»?ô{íVµœM% ýçu™ôº½Ýí­û7;?u\AJwø9!õ ‘2kämíâÆi5áh±³ÃÖKfm³´4Kðšy߈%‰lÈëñ†U‘B~ÊQk¿Â†]: â®XMŒÄcR’D.Öþ¼|™åÀÿQb"•Í@ 3=L¯&©:ˆ?øœù¶Öa»4‚§šÎ`Ò^Ÿ&䉹¡uøXµÉã´òÌò«Ê¾Kÿ6W$Ûlwf«ù°œÏ¤ÓùZ»ÝÅä| ‹Ý£#h]¶«é$ýF³Õn7µj1Ÿ ‡|TöAVbëÁ½/nœm~êx] õÛnÝBM‘R[HÞŽ¿$PàŽÔÌŒ#°^#ñxDÆô;À,9FîwaÁUb²ô¹}BCmµ.vWx¢$²¦J4•C>6ðõòÊ-ˆœ9nV¦M$Óé\¡˜M+Q!ðÊ¥ÔCIÇãÖD7µºÚ/§]cžc–§7YYYL“ô¨Wy¿b逆“&—^§øñžx¾EZ¯fÍr.›)Ô{½~4-6gg„ªÍd<é‚Ó›*”*µZ¥R)sªàwÙ ¨G¾¹ýñŸ~ÖãõkŒ+Hí_#~>HýÛ;_Ý?0Ñ9µpNñ‡DMÍî’0§]ŸêÍV,‰ ìÅáƒÝG>™À•CoЏ=¢þ݇I3Û¡±äž›µ¿<,ý¯i93P3)¾¬ëxÛ ‚‘H<‡Ãd\fý?Ü9\h§ÜNæB˜¡Ðw96× :ðЭà”ãÛi&S˜øaÚ’ ä¤(LVJ]ÚÄP‹©ñb³w+¥B¡Üã˨Ùl¶XÍ»î ×.fክz<°[õûîßùúöŸ}ø§›ÉÄOWÚ»Fü|úÝ{÷¶QÖÙÌ–yİ,¡nfe~#_îê-PD‡ˆ²¢&bœ[-Y€™Ä˜‚ö+RQIÊ{©DdcíW'Ê5ð1Ps!%I\Ðx‹Z&؇’©J©ÔPÉ!¿ƒÌT®á’É®UzF£æ³Í’{f“þ`_‡û4 ÓÃc ;|ï­›»ÝŸ>^H½û¥ÎdçÞ*Ç‚Ìj)A§]ÛãÒ$‡ôF|㡸œËF‚˜¬™-ØC÷±"“N‘ePÛY¹ÁãÑLtœv©æüáò„XsªNþªÎÐëhå5`¶j¸EQ ð»lؤ>ÉøAÛ/’>ŸÖÇigz£…oŸì¯TfìÌ祗+¥2‰¨èqZÀ1›m.\س+™"õRÝÞtqt4õÛ„/pûúƒádÒofU!à‡î(†‘0õ‡6ýÃ{ßÜþâƒwn’Óϯ ¤>¾g´b‡'Ù¨ÝàZ-ÂoÆÂ«¬;df£ —/˨A·UÓsfDM¿ÕiLXÉHáDœµšŽpƒ)¡ËÃçßEi,¤‘k.M×›õ”£N7_Ç£T92$VŒà â…K” ¶z†ÿ꧸MU‚—³ òÂA“ Ç2i%H¡M´¶á~Å~*/5Z„ Éìèäh9í¶Zmý_·×¬f”Ï J=ô9¥%¨'ß|ôᇺQ7ÿYã R»×ˆŸ R¿ ³9ØãjèïGÔ´*{Ý>¿×Æ¥›™†Aç C*ì¼D¡7-lẤ¡ú&d`­ùóRšr0kÝI9 Ã7·`. ¡Á°äGgÅŒ&†PrÏd<ØßÝ݇`XMDÌT!Â,À)Sb±qh4^v}‡|›ËÓPXQa?ÀÊΘ^Ðç$H/%3ùB±Tƒºùr}|‚aļV*W°d\­”Ë•r1!3Ð\³:ºû_ÝèIüâµ€Ô¿½¿­Ç vð|ZSaNeUÙ¿N¼8S6Vïs8ƒaXÆ›49f#+Ð:´øç2,6üNxÔ .§‚nP&iêãNe‡Ë¯PXÔ¬2(#:Y½–Rï8™Í†CxRïù7Rf°bL6_Û€”&_Î|.üuT'^ÂGz’J4 ¥s8ãPsÔ'RÙ"¨…„´:>===Ù,†¥B¡X®TkÕJ)ŸË¦#‚ÛyùÎxþÓǵ_B\Ajçñ3Aê_ßùlÏÈw¨š‚8OåRE¦l%ø ÍB·Ks¸B’äw1ýœ‚Eˆðy¨#A@Är¯‹>d?¬éñxÍ¥=g@cS¸\W×Xp5”Ï%¤¬µ/€„ öÛ ”£vv÷Ì6zQhÀx!^osVÑ­¡~´b“q€¡)á÷˜sd×Z31K¦±+|zx"E•„šÊ–<}ìl,©êÛlæ£v±Ï3¨*¥,ý!àÖnì6ãÁÎ×·Þ¹YÝø%ĤÛ'~>µÙûàó{:Þ+„à%îIqó„…?IÝ {\!àe/4»Û/I‚ÓŒEˆÂ"•ESÆÓÄÈPÔ±~¦o~ƒ³fž‚p•£XJÙ žöà¦Nyy)ì÷áGY̶pwöC¼ÞH‰Ò¨×éôfoÌÕW€–tÀÔÁÞΓ';{:Ófyé ÐÓ!LÄY˜O`¯øp4™Êæ •j½1^ãVw³˜ºu@Š@U(‹ÙTLzM7Ó¤ß~ðõ‡ïþîf(ñKˆ+Hý=8]Áêç€Ô¿½uëë‡û芘3að€IQOÏ«˜!ÎÀ” KA«áàs2j@>ÃÌ(Ò†ÚÜî¢ì’D Ife¼x,,`6ÈÌ@7$†#‘h$̲Ã+—MTáaNXÙ»t6á«X6ˆqšlq‚&_Q™µÅB~9‡:P{éëY= ­ %Dz9ÙcßCÓ«Á\¶­éñùùÅ)aj¹÷š¥bA•Ëå2©ë¢aÑ¢ßxçó÷þøÛ¡–_B\AêÉ5âgÔ»ŸÜ{¼£;€ø‰C³AÃn`4ñ¹¬°Äîœ9<Ðè“"‰„äw a‘›ŒópÝíÔjI˜ÊÐcAöCÂ1[\^ª1«°™©æÛÞ¦e Œœù`+…©ʾKÂ,e²CoqY,&ýÿ×ÞypÙ}WþèÀ $ÅLˆ@ &Ï›—sÎ9çœsΓJ´lÓþ°Û·ÿcÙ«Õή$ϬŸŽDD¾Ëªî®ºW¨QjDJáä¦×ëYÉsEòýv.›IÁß2•JâÙÁÕÕF§ÛíW¯^¿¾:?;;Y/¦ý ×T6Œ`Äø"ÅÛ¨WÊv?øêã©HÝ î¾¤î?>@oÅ+ÎfÌÇéfŸv¢+L˜çãEN›Éâ !\ÓiÖò»’br¥B&“kôüÝ—‡j4?Ï Â,I*IeS±5m¦eá›Î%åuâîÉPˆ…-“•# ûCDßäÛ&ÈÃÐ"¿Úꆚžû4óq)™B‹ÀcÑ‘H"ßì™À‘_+Ùšô ¬ìdA¥©L¾X©5‘l3ž_^2Ež,gÃj‰)*—NDàÅ„ÔkvÆÓªÄ‡/ž}óÕg}@EêNpç%õ{t} ~ÑcV£ 2pó™8ViXyplmÍVw4 ¹mj™hooÿèX®ÒàÝJs W–y¹Ñ8†X7–³H!(†›#¡Bù¹¦‚áDZ9_áÂÅÚ>½F%—bá‘Ua~ï¼Vœ›*Ù†Ô<ܪ¡f).ø zþ+$R5†’ØÍçäÃ&»»µXNjå?!•ø]^¡T­ÃD¬3˜Ì§³Åj½Z.f³édT/°1ŽLl¤É±¯HÃ*ÔöãG÷¿øä£CŠº\Kêð܆¤>Û)øUƒš»ãåþ{n”½»{¼ ôÆ ¼VƒLt°»³³{(R¨x†V½¹ àN~&>?Ĥɧ+Xå³¹‘ºá…·éÃ"n%ü8;»ùÝ×ù†ñRɱX¢PÌÜÒŒ5£«™{°kôV;ÖÔ5ÿ9{È[½’5Š %Ùœžp4t9ø„¼ÃÛ[­æ-&%&¨R¥Ñ¨–Š¥2ŽQLRÃébŽMÃùtÒíô{R:Š mäÛ[¹U‹äh÷ÉÃ/?ÿä÷üŽuW¸–ÔÁ ¸ I=:–3I`‷k˜9À8„ Š`ß16 •L¡3»Üv‹F~¸·óâÅ vC.L”0 dùùQÔŠ… ;X *­ßHXÝþ¬cá/&¤BñÖø¼Na.›îØs× kù2Š/JÁiÙaGøæœ.‡I¯Rd2¸Êr·nˆÁÎY6O(žNÅ">¾èïð…ú«“õ¤ß®WËårµÝé´Xb§¨^³|óÅ ç“a9ËÎZì Äî¾/`LPGÛ_J«wŽ;/©gR%ÓÜÃù “°DÈÝSh€©ÖÁþþ¾H,Õí6£N&ÞßÝ~±õbûPÊ>¿þ€êä9‚|ö¹iZµÖdÚø¼¨uPӦˊúby IDAT‰Å¬æFž5¿Òæ’ Ÿ}<ñ+kÆeR”(-üÿáíŠ&÷¿ÔéÌðB³´B}bJÍÿ=ÀšM>ÊaÀJ16ãÑ€Cèî`´³<9YLÇ­FµR©¶»=&§þ^-ƒáx41ƒn“»²Có|Ó¹*éót!q¹–Ôþ ¸ I½c“—Ç w ¸óÃ?±CèpwwwïàH¬Ö› jÅñÑÞÎöÖÖÖö±/H<€uv.»IN@•â6¯\R¨°‹0[±? ®($!²fÐë B×nÛøXà’ÂÀoñ¤);¨am„»@c–ÍŒ§ÛçsXujnpŽS”S"÷FcÇ,W,“˦±Pó»¾h¢9?=Y¯Ï†F½VGŒá`8BðF¿ÙlÔXáª7ÛíF%“B®)ëL7SNz­äà>ÝE”jìÅ#ÜɶBÒ…ž_:0db+JÛ/¶wöeìs,îBR;û*÷o±a~Éï±…>+W¸K°p<ÓÌfn³g¶8=°BòûƒüyH¸Psa„ÖårعaßÓÝD¯q#>F_aãǦ‰ðí°Ûáu„žO&•©tjõºyð†öÞP±XÈføŠ}8‰å µÁåÅÙÕoΧ¬ `p ÓØa§šJ&Y]â–x‡ŠEÂHk4oÒ£Ç4~t7¹–ÔÞ ¸ I)ùma“ÄŽáSÞr7!lƒï¡ÏÛÚÞÝ?KÄÇb~`{G$3ÚŸe«Ýáñ8…”D WK› Î_ºëd\“…5|~?ÂB‘(„‹ ®êH)°o,q³pIñA'¬ãN߇]¾Î+Œò÷]>¤Ô™œÞ@(ägÇ1öÁÄŠ˜?^.²Ù\±˜‹Çb‰T±Òè]½¼zõ‡?~~ºZÍÇCîÂ<é7‹IExœT"Ž{>·ÕÈäÌjäñîwßöG‡øËÜyIIÇþFû³A¿B¹¹L“ŠE¸ŒØzþ| uJt,Çß+ôf'O%´ð}+Ñ0Ú‘uÈðºMúŸ­À°p¡×#åÍ…dî‹ý#ŒL°Êb²ù/ÇJ.;­¡ZjU<̆ULò(ð““ŽT¾cè Ä“©D,äNP_´P+r¹z§Ý,å2Ù\µÑî./^¿yûãoß¼~µb’šN§“q§^J'7e IüÚÜd‹ž=zøðá×_ÒnáåZR»7à6$%ÅÐ6† ´šŸw#¤R~™†o³“Ô6SÔó­Û{ÇRü\¾óäGå°õ‚Ï«_u;½a|:±›Á‹~Ž÷å–K&‹Ë#æ“TˆIÊç‚ߺFgؼ_™°ÊÈ~Oö…à¡—§BBØêÀ2¯÷‡˜DäŠ2q× _4™ÁU÷áćÛ+5*Å|¾Õïw›ÕR¾Pkv»£ÅÅÕëÿøöÕ)SÔp8Á%_¯]Ë LASL‘‚““Vyðݧüö·¤§»Ì—” ûŒÍ3su"‰DŠ‘#©Dt¸¿Ã%Å4µ/Rêì.>¯òó¥çëÌn²¡¹c˜°ëa´³¾LXãà³±'ñPéÍÂúfÏVk¶‡x…⃫¬Ô2ögH„é@‹`ö"\¢_+J+t¬ž)ØW&a’âïч/ŠÆÒYvbJ'"‘X6g.l–„r½N£\ê 'DCMF£é|±˜ ã);IÍFÃ>SÙ`Э–p‰‘J%c0šFx*û¶S}ºûÜyIñÊ„-#Öí±³ÓÑáÁ‘fßLRRHê`owgûÅ‹íÝ…Áãñ p¯Ý²YnrÀkþ#b8*y=x(¾¶¬Ôð_µÞŒ8)?€qp¿Ý¤”áÁоàã›÷üæaãÏÃßy>†Å“IŠ?ìÝ~;ž+–Š™d,M2iDBt>‰$ºÃ~»Ùg'¦ùÙÅÅÙj1[œM‡«[ýf¹PÄŽa±XÌçð$ ¼ƒì<ÿŠvß®%µ}nER¨L¢£#±„ßtŠd0Ã$ÅþÎDµ³/’šüE)àõ Éh6‡H|Þh#)\E{‘1umËw%­ À@!n^‹^wUj| r€±š+ç÷y8Ï!|G«QáPw$¤3ªÔðc_Q¢P*Ó‰X4†¤lö—Z#›J¦[ƒÑ 7?]Îç§—LS'‹ÅÉÙ|4è÷;ín§’KÆ“ÙæÒ3ÙL"ôš4|Ëê`oëéCÚƒ¸–Ô‹pKU þÌGb)SÒ±è`ÿH,vc¥2¹`4{t° QêÝ\> aÍÁŽ;ƒ‰/h`»}þP8«½V£îgOeîñ žÆhwÃ3àuµ¸Q±~ÐæBÖ­ÅÈc€…Èww³fßb¿NŽ8S…„}‰Gø¹U’3ff,U,3I%ãÑx*“I'Ù^¯RÈê]vŽ:}óò|}vu‰øåy»V»jLQÑp8A=r€ý.«JzŒJüâù·ßÐCÔ;Á—ûÈ‹‘ Í>­hüŽÅìû">޵@Ð+Sšl.?Ÿuõyœ°ÄÃrÖÝþ`8ˆ\y/>£‰D"Œ)~^£W²^òH$†8tf’ p{Á L¥åYLP6#Ÿ‡mNaz›…¢,)sptxxÄd.SèLžÎl‘x¦Ä$•ešJ¤³ÙL&[›ÍG½v6†£ÅËý×?ýéOo®..NÃfd;IÊ¥cÞàmÙ(„‚%ç×JV+¹¢ŽXé”) V_(M ’ÊÁA“I*›ÉÕËùtØã|““?üËO?ýôã›Óõ|:èTÊenÒRb’bm*æb±\ ߨÃÝígO=øòSÊ­~G¸–ÔÖ ¸ I±#Œœ[ɲSŒ}žèøH¤Ô[XA rï_Ñà^-_0à¶…,QNpwá~}Î îÇá€ÇÊ%ôo2ÑÁÎÎÎÞ>KuÍŽ ÆÆ±}ËçŒ6]=&… ¦ÑXŒÒa¥‘‡`óå舩]©5Ûýá8Þ·bi&)îd”B"A6_™­NNÎO1[>™-Ö«åzDÐÉdØ-e“ìË‹$SÉxćd88bÇêp÷É£o¾üü²}w¸û’Òr7WŽR"¡l.Läá:ÜÊع-Fƒ¼Üb’ç òûl>ápyÂÖ|n»A«‰ùY 7ñǘÜÞÝ;Ä»°‰oÐñ^Rül«ÅÄ-bÕʤÄb&%´È£Aùƒ”W$‡¸Ûg¿‡ÎbDÐT,Y,•J…|.ƒH‚|>_ž,NÙñéüd5Ÿ/–«%öGãa¡Øÿ4†ý×Á€V-½xúÕgŸ|ô-C½C\Kêù ¸ Iñ9ìïxŠ”HŒÏºÛ燠"ãÀ¾¼NÈqCUÑ Y½r¬Öã•Ho€÷¸F•N'k y oš£Ãƒƒý=Ü¿³*%œ¦¸Mç×är¹BÅÍa1Qk2lÖs¹‹„v3i¨åïÄZ…¿“;߉åØhDô|dqå‡Õöl®Ñ¨Õ›Ãébyquuu±àŒñÆÛkµ{ý^5Ÿô{œN¯Ÿ‡˜òñ&J|øìáG¤¥wŽkI}wnERܿƜ¸JIä8DÁ±ØÇ-Ýö±æŠâ–ÈfÃfl VyP·¢å;¨7<ŽJÌ‹ÝÀxÚÙÅt XÌM+ÑÕmâ= ­à2I Ë›ùn‹¿ÇšN&©œÆÐöI•“ÓŸ)äÒ É—ËeÁÕ¨Ók·»¬Ý[¬Ï®^^ΰ½1Á­y·É¤Ön•s ¿ÇO ¯öëèùÄ;ß}AïPï w^R<íLÆ‹”H,•ãއ}:ùË,ÏãB;f3ou¥³­:ÁÏ| wžÅL“Tr|,”¨ÃããÃýÝÝ=®αL©ÁøžP¥¸4šAÖÝÉñH¤Üv‰'…•V§ÓÊ%‡ìw8– NNoµâ¥J1Ïg‰Ò¥noÔïÔÊ¥r±Z²Â´\.çLLƒ`Bb?)™cµ,ŸI<È¿±ÙX˧ÓÈÄ;Ï’žÞM®%õì܆¤x'&Çe(Åát:¬ág°¿©g’âò”ª°i±;ér¥TÀ,Q*Ý_Ì–óI—5}½Åù9;D1MÍ=¾ßë6Ë<*-`0àáɈUJ¶P ü»Êµ¤À_•Ó-¹Íªt:.)~Á§XÔàqQVÂ{e†Ï>–¼]ã3~F8/JŒœ^pIŠå*åñëÙ„Û:¼*iø€ßÄÂq ×z¬²ªÁ¯ùÞæò‘ON¨uLmRÜ÷‰ÔFL-9ÜžX¶RÁÝ9.%Î^Ÿ¬¦ƒvg0»dg¨SV§C&©.—T5ÕD*—˦ã>×f_­í=ù†vßY®%uW«”cªü%½˜ùj<m³ä‹£“š}îf«ËÅZ&-–f-”ÕÄs>lì_úržäƒa ^ìÐø‰Är£Ù¨•‰xr¶˜·t¼¦i”³.ÌÂÔXÒ.õö±1vpˆR©Ø Q°&ÔÈ=gf¡áp"W©”qwžÍæ_þô/¯®./Næ³Ùüä‚ij9›Ïǃ¦Ú2WŠÅã‘€ÿ À° ;BݧÀêw™kI=½·2=¡Vâq…ÇTd2ñÈ °b¤ˆßîaÿòvŽ2B­& $Ù-zB¨Q|†h“”},Qhmv“]Sb?€B.)áÆ\Âgfñ‡h”2;/íap;Y2ùÆX.—f8£‹¥_«‚‘D<™«T˸;Ïåò'ÿñï?¼~yy¶Z.WëÓÓÕ’£¦ãa¿Ëé4k¹t<‹EB.›QÍžEû/~Icï4×’zrneQ¶iµ8ÿoì—ù:†`!µÙxMZô‡x¢…«žÅjw»]ìt¥*T)³™åI³‘‰…>ˆà¹Î·t…C¦BÄis»0­šÕ2¦¨Ý[[/v0æÓy|&B€ï:ÊxB½š_bp“«[Ï·^첟)HJ¦Ðº`Nkf­¢Þ‘à–æ¹F¥P¬T1Z„t¨úÿöÓŸÞ^žo$Õ®V›½þ ßkU³iLš§¢aŸÇ¢;üîÃ{÷~ûáGdjþ^p-©Ç7à6$uxÌgÐ%B.b V~-!,«ÃìÁdóú\½L|ÄÎDpᎴDË8­&áêcR&)älh &ÆZ?xÿËùR¡ògY’)¸g´Z‰bñ“ÔöžX¡ƒ%¯z{¹°|v`ižÉ–‡½zµÞ`´ZÍV§»¼xóöûËsjµ˜¶ª¥j«Ý¬WÒ±VN<âpçÛû·ý þ®ÜyIñÅ(>ŒŽ?µÖdsòؾ[Ë%eqx½6£F":<<–¨´F8yùB‡Ï!$ð"vì|Ä÷Þ-\Rv›Ù¨’ñ°%ÜÛLÓró2&)¤…èt*ôœ éáÞöÎÁ±Zoæ+ëx 6{`¢îñ°zçcŠ/›+OÆÝV£Ùjw‡ãA¿?X¬'—ç'ëÕr64ªÅRÍ©˜×édç<ƒôà1™ñ½o\KêÛp+g)>ZÇ÷£¤ •I3ÜSE%¬Õ‚˜µ\ttp(Qè »+ð€uÚ…€kØïñ‘­Áb5[°ë˺B¯×iQ+ÐPjPÇXk(ØÄHùEû±D*Œ'©ŒfƒV‰—fµÑÉxì,§2¸Â‰(ý~Ž•¦j©X,–«åd4™"¸p½˜Ž§Ãáäìüìd1íÔŠ©d&W(–й¨æž¥dû1m¾w\KêÑ ¸-Iñ• †R£·8}^‡Uhûø(+ûAÖçYµ¸–;<’)õF›Ë x\ܨ܎\˜Fõf\°Ã¨ˆÉ€·Õ¤2MÜê\!¬BQGBvªt6»Q§’J¤r³Ãçs»ÜN î;X2 àVQju{ÃVµZëÏO™~æËõÅË«‹õ¼?†‹õÉjÔ«æS¡P,‘ΤS1ÏѲãƒ'÷éøôÞq÷%…ño ;º(xH”ÓãóØ­¼æà–@"‘°Œý;_£bJ]®fç$®wØs²Ú~–” )ÙVO¥vútƒ‘[‹àç‡çaÌ” 7y\Q|®þHXlšØ¡K®Ð:½È! xP =”L%¡`˜Qî G—ón»ÝŸžãEwuzõúÕŪ× £ÉlÚ®f’¬¤aW7òÛXÑÄâÆó¯ÈßòýãÎKJ"‘²U›mNkØà?nÔªøx:ÒÜqTb ܱH"Ui¹U%;@q3#^{¯µÅ(÷d´ÂáP =§#”ÎÃÛ<‘NÄã…ætöö§ï¯N`v~>ŸÎf¬\-ÇíN¯zµ|,fÍ(7ì4ë™ ¶|I‚z¹–ÔÃp+’’)°˜dÒk5:¾¥ávÛ‘SÈ$Å7kZ=7T+$bVÇ L<6«ÉÈêêò 1;gw±O3î+àì ±8k3 nð³ZôÞFò›£¤XÍsùÃ!ÔE³Ñ`u!1M%£0LJùl*™-fÓé|u¼X¿þãÛ—“Ñh²:[À‚y<îwZín‰ª×)eد ð´n§ È¨ÒݧtÕ÷¾r-©onÀmHÊÊÊØaÈ!\Ò¹v,@h…ÈŒºš°¹‡:bCÔ*š5 ‚AN¢ß±ò¡H…ü´_¥£L›¬¾Â7:Tj5Vòr-,Ÿ£¸~…‚¡D!‹¼h4^(7ZÍV»7 >µ×íMëÓ«—WgëÙh4].úv»Õ¨¦ch÷<.×ÏÙØ|uDv´û £Þ[C.§ýß-ÜÆ./|ÔÕhÅ.,›Çó`Û ¬h(‘önâ¹×&›ÃÍ~‚C .ì$´qƒöœx$¢œÿ†<îò§^¥!A§㿱\­˜äž‰b¹ÑôÃÑt:A”îl2NçËÕÉ)ûÏtÐΣn³^+’‚¤œNÁ·L±±ÐØyJŠz¹–Ô×7à6$ź=l#vÍiƒmÕi0õÇ=[,vÖzý°“ ˜äP©Œ|ÿΛu*V‰Ì(XØ´‚W:’ Y‘Òê)Ê~¿ßäÕˆat¹ÎåsâpŽFSÕ~§’O&âÉÊb>‡»ŽMËÕ’}o6ìÏæÈ°¦“~­Þíõ»­2<üÑHÐaÁ]‰BŠy)ÑÑáî‹§ŸÓ¬ù{Ì—f œ.V_¼˜!á¥Õs Œ—«T³ÍápyXùAä†ßòºx~š «òBh6¾¥öé“Y˜ˆÉ‘¯(Ü ›~–”Æ`²ÀÆŒuhj“+žˆÇ™( ©Xº:´ëùl&×¹¼¼º\Ÿ¬a6EÞ;8†ÓÑ ×iµûÃ^µÒhµ•bU-äwéáQ&;ÚßÛÝÝÛÛÙ~úè+òhyŸ¹ó’òzݸ¯Ãõ®¹%R¥Æhâ¶Ira³ƒ‡£™‘È}>îE†a$V¬,&­ »6“±¸…àžÍZ½ÙÊ  ËÉ~V@„a;;«±šf±{‚©t2KÅ‘C˜HÇSx„ Æ«ïxûz:ž³2Å$5Îç“n»Þèvêµj­Ñn×J¡Mp„²ie{>zôÍý/¾øò›|õ9]¿ç\Kêþ ¸-I¹p'aävab‰Jg¶°Ø±ÙÜØ Yþ`8äǤFнÌFÀãH÷ªäÜv3ˆ-±L¡3Zmn×Í%…Wéø®OwyCQxÄ–òixòe ¥É|±ä³FßÿðÃëÙh4X8šÎ§ÝVµTkÔk•r©R­Sq„(ZÌfƒæð»¯~}ï×;úõï>þä“GHï;×’úêÜŠ¤@ÍŠ”AËgŽ%#.À…tl¿#æIˤàä ~5/†$¸i&8>g·åM€ û>vÛe°“uxÙ/pZI¡DݲÛíW OŠùBµRH%S…Z£1_¯×'§§çWoßþðftµáÉïÃɤÛ,ç[–ÜÆ"õÙJüô êò~aÜ}I¹Wm7c:BŒ w“Ý?>¬è2E$ÙXì.¿0¸çâW<7P£F×Ç×ÚÙ9I%)ÂÒåøHt¬Ðð,Ñä»Ënf à{·Âä¸BÅNEÂ-¹·›s”‘ù1I ûó\RФDÇb•Ölõ1näñ8ø½‡Ö€D_>ôä d åÚ`<„l·3Y¬æs&©7¯_½zÍxõæ|9öµZµ\,7ZÕB<ìqñ˜Dƒà¡fí¦øèùÃÛþçKüsç%…>ÎëÆŒ&‹;òY0êÀMÈÛعpOt‡ËDª(bq‘¹:|¸!EÁÑRHZCè`mŸ+„‚ÑT<€Œ7Î씃)o‘b¥Ù™.×Èúg볓õêä|½<¿ºzyvöêÕùr2tšÕr>“LfJÅDƒR|pJ‡üÑÑÞÎÓGT£~\Kê‹p+O½nV¤œLƒÙáôD¢~Z:•ŒûòI%b ²u‡·ØP$ìÅ@žÇ++“@ÅÒ¹Q‹dÃú@V×¼ñd4Í’a;ûy¬{įòxƒ¡`(^ªuú³åÉz9ÆX)<;=Y͆ËËËËÓÅúl5ކv½šOG‘ûØ¡‡YÅþÎÖ“G_~rÛÿt‰[àZRŸß€[›õø‚ÁäôBaŸÛjæÎ`B`.nÕ庼ÁdÂE:;O¹N_Ù7á Ëjä;òØÏ…¯’`½ '$ƒ×ç§Ó±H¦\Í¥Ã^¦“ Ù©L>—ÍdkÑl±<9;M&³åêôû7ß¿YM:ýõéérÚm7A­R,f’aäeoâ­&­J|øâÙןSú¥r-)ðWåtKn³»Ž s&+ßÊÀ,·DHsWcg =FÃçŠlNXN¸O0Æ3£»ÙlÔqûL`X†k˜ÐZ™äbÙl"š«ÖJÅTØnÆ¥a$‘*Uëì„Tn4Góår}~¶œN¦«õÉþùí÷§³N{<_ΧýN£^­”Ћ¾èçIk³A!ÙÝzôõGtWþ‹åZRwµJýZì ù<›Í|.ìçZlFa!C±$˜”#FÊd6Û]üÂmÉT¶P*dnžÁ¦QëV‹žûÓ²s. ü™t*],fÓùj½ÙªB^—7˜H—«Ã1;_©ã²<ö"é|£5_N&ãé|:ì—«ÕéÅåÙl:_­Æý‹ï__ŒZÕZ­”‹E Vž\6ƒ;Z7J²µ¢¯?û€ ÑÜ}I}¸“H„Ý“”Ïí°XLV víqšôüt¤Ñ™Ì¸þ¶9ùŽ¢ÓéƳ¹Z½ZÊEXÉ5ßcá²f§“µ„Él¥­°å– QIDAT\*4Û•R±Rïô{­|*gŠÞêt>²cԴן.V§g—çóÙbµì·:³‹Óf!W(æÒ¡@8 xíx Si f;æå-:V£Qè/kI}znER÷îi³¥ˆ×åá’²Ùn‡Õá Ç¢AŸÃj24Äã øçNr§2åB¹Ñ(sÉDÄïÂ/ FÑ`ÆIÞH$_®Ö­z³ÑŸ·õZ}8šÕ<£4šLÏ/ÏOç³Õr8˜Ì–gg'ëùl<™ ÚìøTÎÄý˜Ïõy¼þ€Ÿ[5©øØ…Z­”ï<{ô1 êϵ¤>¹·$©-o%v{ƒ!¦»ÃÃ”ä ÆñpÐOr9ù`-ö:uíô–kÅJ£Î$•JEƒn—Ãå‰$ÒÉL>òûéT±ÞjwÚVg´ä‡£éx4ê¶*åj¥6Ÿ—/_½<[Ìç£Ál}zh]L˺F­’Mú\üãï$%Ç]¾èpû»_}JÓGÄ» ©ß>··«±H4cuÊ:lÞH"•J$¢¿Ój±Xí|RéN8L9=ñV³\mÔÊ…l&ŸŒø<¾h‚é)ßë× ™t¶\®Ô£Q¿Ýê,/_ŽÛíöôd>›N{Þh|v1­X:a*ަ«‹‹Óõ”é­Ñj7›õj1p±Òh¶Xa½d5c)D"í>ðåGt)A€kI}|nIR÷¾<®·Ù †•œ? »ì¾H2N¥“‰ YœN?¶Ñí>µîtúÒíV¥Æ$•Ïd éxÀβùBq2m×J…R­Vk°žnÔkµÇgX÷ºÑÉÉjµš †³ùÙÅb0˜­NV£Á`8M–«Å˜õ†ÕJµVg)¤}Xža£Ñl60%:Ø{öèS -$Þ IÝûÌo†*+;éLÂçò†â&’|.æGÇç †`Úï‚o³Çí ä:V‡Uª|&W*çc‘d½ßéTËÓ“iŸµ{Ýv«5˜žÍû½^~†MÂÅ挖³ùbµšö‹¹|¹\(T.+OåR!—I§óì³i´•™|¹RÎ¥3¹B.L¦2Ùl2êqÂ(v³Í¨Š÷¶?üücò#þ“kIýþÜž¤î+Óõùb6ΆZ* ÆÊf¥T.&™†\žH,f߈&s&*_´Ñ.¦£&;úä;Ýf­Ú;9¿¼\gççç‹ñt2ŸLæ«·?¾}9 &gHÖX®_bÌül1»¥\&™ˆEa érº‚Qt˜1xyÝv‹F~¼·‹„ß½Ýí'?¡ñ߸–ÔG7àö$uïy8;žÎÇÓõ¼Ý,§£Ñdc8l”+•\,à÷xcLLÑd¡˜b?*wÇ‹ù´Ó¨ m„N_½z}¹^œž_ž/æóÓ“ù|ùòÿüÃz:­Ï.ÎÖÓéêäüâêb9 z•|6‰—\DéXí_8F°ïrZ ²£íÇß>}öÝwO¾}ð)•'âã]‘ÔGŽhk8NÏXëVM§²ÉbP­ÖËi ­&RˆõŒÅS¥J1Ë´•mc§½ßnV+íÑd<Ÿ¼yóæõåùéÙù«Óåêâòdµ—/1eeSñ Ïn1™,V›ƒOÝbW¯VÉ¥Gû»[ÏŸ={üè«Ï(»†¸!×’úí ¸mIÝ»÷Ù®Xc &’‰d&›+vÚÝN·×÷;Œöê|>:ÿþtÎ:½É`ºè·ëõ“P£Ri4Z£ñ µv«Y¯29Š…<Ó–ƒŸÇaâ ôˆ'PÃ×Vt´¿ÃÄôÍ×÷ïþ)Í7æï&©_ýêãNñ_¿ÜŸ(5v,ŠMø\µ ˆêpÈjO³18÷ÛËÙh±˜N¬puêÕj§×iUJ¥R¹3ºV³Q«Õª¥"v£r©˜×iGYr¹„Dm57§PJÅ¢ý½ígïñð?$E7çZ¿¹URö¿ÿ8I±ã”T©Ç¦{8–ÎJÕr1—kôûÝZµZÏ:ÙZ·5™ÏFýV«Ë$U®³¿TK¹l¶TÇ,ûéY̤3Iår™xSå&„wXa&8(É¥‡{;ß±uÿó~óëúõoèEü¿p­ˆ_߀; ©¾Þ9”ʵ&›Óާ’ÉT2‰§ªJ>ƒÝøD¼T®wX×hp×ÜAÔªy8ƒùÚyþàËO?$ âÿ“wMR÷~ÿäÅ¡H¦Ò[mÞP<GþP$•Ë¥â±X<²ÒU©·Ú|Ç©\* ÅR‘ýM¯ƒU!Åf5êr…Êh¶ ZîšXÊEbC,:ÜÝztŸˆ¿¿Ÿ¤~õóÿüc%uïwŸ>|òb÷H©1˜Â¯ÇD\›Çíñúü±d&Êäk¸Ïd2éD<ö{ìjéþîÎî¡èXttppˆ÷ÛÝ­­­;»{{»/ž?}üèÑÃß|õ9¹±#׊ø§ðWóòÎü _ó'_<|òüH¢TLV àfg«€Ÿ;Bx‚‘D"O•Ù±‰É) ú½n›Y'>Ø~±µµ½³ ö˜Œv¶¾{üèá£ÇOž=}úíï¾øôã> M âoç¿üE)ýê/ÝçýêWþãÿ¨Æ ÞM~u#þʯÿo%âo‚$EWHRñ÷…ÎRñ÷å¶Òr‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ þOü/“bQxÒYIEND®B`‚danieljprice-splash-4d1f09c/docs/figs/surfpartfinal.png000066400000000000000000002314141477365367100233450ustar00rootroot00000000000000‰PNG  IHDRR¨J†>þPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿ€ÿÿ€UUUªªª  !#$&()+,./124579:<=?@BCEFHIKMNPQSTVWYZ\]_abdeghjkmnprsuvxy{|~‚„†‡‰ŠŒ’“•—˜š›ž ¡£¤¦§©«¬®¯±²´µ · ¸º»½¾ÀÂÃÅÆ È"É$Ë&Ì(Î*Ï,Ñ.Ò0Ô2Õ4×6Ø8Ú:Ü<Ý>ß@àBâDãFåHæJèLéNëQìSîUïWñYò[ô]ö_÷aùcúeügýiÿkÿmÿoÿqÿsÿuÿwÿyÿ{ÿ}ÿÿÿƒÿ…ÿˆÿŠ ÿŒÿŽÿÿ’ÿ”!ÿ–%ÿ˜)ÿš-ÿœ1ÿž6ÿ :ÿ¢>ÿ¤Bÿ¦Fÿ¨KÿªOÿ¬Sÿ®Wÿ°[ÿ²`ÿ´dÿ¶hÿ¸lÿºpÿ¼tÿ¾yÿÀ}ÿÂÿÄ…ÿƉÿÈŽÿÊ’ÿÌ–ÿΚÿОÿÒ¢ÿÔ§ÿÖ«ÿدÿÚ³ÿÜ·ÿÞ¼ÿàÀÿâÄÿäÈÿæÌÿèÐÿêÕÿìÙÿîÝÿðáÿòåÿôêÿöîÿøòÿúöÿüúÿÿÿcÒX˜+tEXtSoftwarePGPLOT Graphics Subroutine Library5ß?í IDATxœì½‡“×¶-zö°Iï é!@! ! ½‡Þ;lÜ‹¬®OŸz·eõÞ›${ßsî9ï¾{_ï½÷Þ{o¿7Ç\²ÂÞ‡`‘¡¬‘€mI¶eñ ϲÆó/þBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBâaÆï%$*Ì]¹¿ë ’Ró C©ÿ¯ ÜcJÝòËÿÖ/„Ä¡s9ÿ¿]à^G©[…Áßú’¸3HJIHÜUt(õ¿u{ZKýTOIJI<Äè\Òÿk¸—”ú¹;~ëHBâÎð Pêgñ[¿@wI) ‰»Š¥þ—.pŸ†;$¥$b· s·ytWè\Îÿs”’xDðì³OÐßO¿¸ðý%K—,z÷…¯<ÿ nxåµ×^zþ×}éÎåü?u{O©6«$¥$î¼úöâåË¿÷îû¯þô‹õ_~µaÃ×_}ùåúµ+—~°ò“O>þèý·_dÆý2HJI<.xê…Ÿ{æÉ§žeñG«×}¾z媵_oÜ´iÓæ­;vvíÚ¶q¶~Ýê½½ð•'á·é\Îÿc¸ç”úÝ_HJIÜ <ñô«o-ZºtÑ;o¾õÞ’Õ_lؼù› ·îùnßÞÝ»÷8tøÐ¡#GܹeÓ–­Û¶nܰæã/|î—}«‰R·bT”úÝ-oüÝ-o–xܰàéç_{sñ²ÕŸoD0Ú²q÷Û÷9vâäɧÎ_ìéé¹|ùÜ™ —.÷ô\éì½pìøÉsçϜؿk˦u+¿ðK"ÕE©[aþáVÜùÝÏÜ.ñ˜áéWÞxgér"Ô¶ý‡ŽØ»{ï±³=—.]ê¹Ü;@î»ÜÛ?0Ð?42¡¼x¡§ ÷ÒÉ£öïøöó÷ß|þÎIÕ¡ÔÿÐJI6=îxâùWßzûw°jíºo7íØsôÔE HW._~ážÄ£B©[Þ")õø`Á3 ßþpåúo¶ì=pô؉“§Ïž¿rupp``xLCœ! Ÿ4­Ádèã‰I½È¤£0¥¥4““°t‹EG$Fiµš‰±Ñ¾S¶­\üT×Ϥs9ÿ·]@RJâAÄ‚ç_|yáÛËW}ùÍöÝûŽž<{îüùK—û†GÇÇFG'&µD=Q ¹œÞd2h™R”ùƒô •Ž)ÅÁ‹ˆ¤3À7ä‚t0F†.Ÿ>°~õ›Owûl:—óÓ`JÝ*ñ“Œz,°à¥×ß_²dùª¯7ïùîà‘ãgΣµ××?¥~Ù üÏ6Ñ%¥u<ñìko¾·äÓ¯·nÙ´ý»Sç{z.^êé»:4ŒÒIc¶Z³Åd0`QŠ›zzdt\Q‰Æ7,&Ð@$´)è>4©Gˆ3è5çŽn]ÿj—OêA¢Ô-1ÿðs”’Œz´ñÄSÏ-|{ÙŠ5Ÿoÿîðïžèéëïï»:0446N Ÿ4)‹B¬2¥pðd0šÍ&²;­èøq_ŒbJáxj’K(‘ñ Sꨣ0Fœê¿phÇ’gº{^Jý×]à¥Ô-´G·j­K<:xùE‹—~°|݆ß;ÕÓÛ{ùâå«ÜÓ›@Ð!²hQBMŠà” (½ÑhV¬V«ÅD¡KOÁ•Z¨¤ÆqT…O'ÚÀ?¥&ø+ÑC'F.mYÑÝs{(%ñ¸á™—/ûdõÚÏ¿ÜþݱÓ=Wû¯ŽŽ‹Ä ‘Æ` H¤§4Ïb±˜”ùἉ2@“E¡Ð¥ªf -Ñï'NRú£Éàääøè(:"œ:øuwÏ®C)࿺ îƒÛ¬X0%å%~Ï¿üúo.ùøëÛvì?ròRïÀð(el”FÜ×é¸H“^o0˜¨vÒ#\©ðb—Ñl5¹Ó‡Ï@YÎp3‚HI±Ì@! ¾†IVg¤Lq…˜f¢÷Äò®&~;WóÙä¼”Äo‹gßZôá‡~²nëνûOžïayž]†InÖ!ä òLhø˜ÉD\¢bÈd2›ÐôÓ Ua 8¤ã3)A(þ ¼¥ÑôáLªÍ¤§¯@qÎDdÝ/~ÕU×ORJâ¡ÁSo.þìëÍ›7nÞqàðÉó”ê!y#r ŸÀQ ºãZ¾eç¸&³ •OZâŤÉ¾€M|¬Ë-?Ä6­®âqâ§Õ̪Ո;>ÖѧŽQj8tøë·»x–Ëù¿è’R¿¼ôƲO6íØ·oïž}ÇN^¼J…j$£Ù¨ãC%DV•ë9wCßAgBDÂcLF-åvs$-«cõT_qK ÊqdÅí -ª0³Š?þˆRÄÚ±³»?éâyJJI<xúÅ…K>Z·aï¡'Ž=zúüÕQ®(·³˜ôD©I­;0¥Y@-ÇŠK”Î!´" Aáצ8fàæ}QKÇÚ„Í@Ft×5½Ç7uñL%¥$x<ÿÚ{‹?^»~Ë΃GÏ÷ôõõ^¾Ü70:¡g‘«¹«‹Ð¢ci¬ÞhQÐÐrëÍ&†V4Ì!£Ð›( ñI¯˜ë0Š45Jz0Š ;É¢u —kt×ÄÀ™åó?ÛÎåüŸwûÐñ“+Û$þ O¿´hÙêµ_mܾïЩsРsψ؂+_Oñ‡Ok!UU 2>-‹ùМR8(‘ zƒÙÌU’†c”HE‚¡%HiX4!¾±r¬÷«×ç}¾«ù?ëò\Jâ>ãõE~úå¶Ý=~êüžœçŽB1:¦ae9QŠ®ˆ<9:«ª(6›áËÀ7‰ÈñGd¸’;*—Œí#aÄ+0§M+„4N …¦b²ÝË0˜ GÖÏû”%¥$P,xò©_ÿhí—;ö=}éÒÅ‹—®ô ðáÑ$¥o£c“L)Öìq(¢²IUÍfÕf6¸®½‰Q#+`Tqµ#7ÔçÄè8üE…M J FRFí™mó>ï¥þÓ. )%q_ðôK ßYùé短ÿfç~*ŸÇ4ÃCC#£”³1Œz¡Ÿ˜4š(ö`dc’¹ÃY›ÁÈ”"ʘÐLF€ë#DŸIæŸuè“܇!Ž++³…+kYL«iYü­®o¾'ÿ Pê¦á ÙžxÌñÔï.]þÉÆm;vìÙwøø™ÞÁ±‰IÍÈ0æÜµ´R¸Ñ³æ-=âIµ)‚!PLÐÿŠ• %“™Ê%4 –EåDa†¸G4ↇ+1Í~º{|`¬·´)Å’ ˆ”tˆQDG³Åb:»j¾ ßÎ%ýŸtû3/%)õ8ã…Wßÿhý†M[v;}þRooOOïOrš‡dAïÁ¢p››B‘Á¢:l j'C¸EQ­ŠÅJ } “Y¡ MBÕù9×Mœ¸‰Ît!ÂÍõÓ¹Óµµ"qË‚e¦/©éÝ4_Ó¯s9ÿÇ]@RJâÞâ¹—ßYüÉ[w~wàȹ‹}CƒW¯Q¨ç¹uHï+ˆNŠÕJ!ÃÄn¶T«™ÅõE%(ÎéÉ ú™ð)VEPÊø'”B»Pצ7Ô9ØqPÏ:ÀIѤ€gVTíÕkæù$¥$<ñÒ[ËV}ñõŽïŽìéå)Àñ±1>ƒbG¾¼u:â€Y±X˜@®“ÚqÐBîg$Ω6›báŒh?Y"N}'Y.OIòGÒ>ÖüÑwÐòWá³+±ô"óÓøzñ¬¤”ă‚×-ÿüË-;?±d|t„On¡ˆ×€R|†¤S¸À- ”q®ï€1ƒˆZ¸øÕæ°«ŠÉÄåS(¯èH+˜‡øp®ùg>/¬ m“ #¶,°Œ²èÇŽlœg±s9ÿG]àÁôD—x°à÷ ž]ºjÝÆ­ß: MÄ„ðü”§(1£èD™\›RÈã:8)¸ÃaSTÕ»•†ÂˆÞEpâ>7A+Åæ°!+¤¯€‘)Z­ƒÐï™Ø¬=qÏl"Z1LÅ1Òfw˜&Nízçö?Q‡Rÿ~¸¥n¥|”’¸ž~ù½e_nÞwøø…ž¾þqÁ#MÛfç»Ú¶> ŸÒŽ5*÷ÎÑÆCüaP:¦0ƒT‡Ã®B1Á‰‚6ºÄ0àd ´²ÑÝ`‘‘ËÊqª-U2°çK'ÍD}% ­¹X…QÊ0zjÏ{·ï¢ß=JÝu2IJ=âxöíÅk¾Ü}ðôù‹½W‡'¸·7¡–ʦ\Ç b„•ICôXlÄ´á$ÐÌ·¡z²;Tì˜894™íN§CU¸£Ç§½(¯T+2E‹h`(ævÅgÆÆ¹qœÚ- ‘yê ÌJâ¨nøäž÷o¿ÆMRJâ·À//Y¾jý¦#g¯ô Âv\c4éÑÀ6о†-Ð;g]§\ÄÝ=în+V ÷´¡‰0¢™n²Ú(DÙíà Õ\V³Ùê JÙTTHL›'àq ´©ÐԚѳhŸp™E)#wÜuºö9”,cŸt®ÒTÕ2Ö|÷ÒÛ/œê0âßë·§Ô½1%»OÿÄ÷ ObÆSï|ðév¸H„ÂÔ˜Î+lM„ÞƒXµ(Å-o ñÅëvÚˆR¢1A© °ƒÛ V•d§rK±ÒßFv@‰}U›Çï¶£ˆRÛ,mJéíG€Rf!^¥è»XÐä°e²¨ô‰”6ŽôÝõÁí¦:Œøw»Àík©¿¸'¡êþü;KÜ/¼øÊ+/½¸ð½5_lÚ¾çÔ…þ!¸$£‚Ò‹˜€c ¦Ð²Å%Ë`ÊO”‚ :{hÿq/Â‚Š <+Q œBþgWRÀY" ’ŒŠÝI7Ó'ÒC(Úq—ƒs î±sBiàÉ£i.`Nj)NÚ(RÚ-ƒ—ïüð¥Ûþ„wR÷ ÷é_Zâ¾àÙ×—­ZóégßlÛèä¹+cšñQ,ÍÕ``‰²93B^ô؋ł¨+ Nò •5ò™-š g~V•Oyéºèq¼kG4!ºááVcñç™ø´–iA~ˆ¢ gZf£˜ýå3dNûˆÕÊ!¬t¾d°óS©4s»Ôþs{7/¾ýxG‡Rsøwn[O2ÝjÂIvü$n‡×¯ûvÛÎß­0ø3™Uú:ŸÏ­öùú“n5~ÿv¸Ç”ºe0¼?ÿÚ÷/-úìËÍ»Ïôôõ]¹Ü;8<®áƒUš£K`˜³[awJÝn.„¸R;À+R<»*$V¦G.>Ê”²ÛV µ)E ¡³:H&D¶¨ò×ãÜŠ7·5ëz^ú¡s!ʬ8=^/àw[.^·lž£w‹R·̸SJͽ¹™T÷çŸ[âãÙ×}±…×»÷NL¶ÝÇ5cã<ˆ+ÛÈ­PKgä: Ižõ‘ª´Ûç§(d؈Yt#¸€ë8Âé”Ý®YTèül6§Óï§Œ|ºÄÝwŒ(šÛÉ —Tí”ÏÄ{<Äy3:·Ì«ËãCA—ñÒÑOÍó£v.ç« Ì{.õëÒ¾›hùÓº/ÿà÷O½óášmûNž:w©pˆª'ÊîDýÏKt'0¯Ë×¶r8LTÀ•œ¸‚(“¢Ú¬"`ÒPaŽØTì´QD5Åíôú(JñÁZ题Rñ±Óév@8‹~»80¶tZ¦ö·c‹Päò¶¶S’p³@ƒÞåN…NcϱOçós¹k”ºÕ`†¤”á¹W–|¼aÛžãg/_é¤ÒI\¯m!ðxÐè‚æ6zâV»jf)žðbá5kÜï³™²9œ=™Y™JV‹PF°Ò[„‚•UŒÔÓ—Rm*Ç/â‘^˜áëŠñ “ÍŽ6þä8/ª: 6d‚ìÂG<ªî¡UoÌóãv.ç³ Ü¿©^I©G¯¾³|åúo÷§•›<äÎýr+"ΓÀ‡Óíq;UÅ¢ò­˜ã° Š©‚gªU¨ÿ@ðÇh˜6©Ö6¥Œl(AŸA¯Í7*0±‘7a ÅŸÞÔ¦T"ê4Oœùnù+óüÀ&¥d-õ¨àÙ×V}±yÛž'Ï^èíÇ6(~µM‰D@ˆV!#RX(D”ðx 2²ö\!%kÐëÙùd9›»oÈö8ÖµRœ¢Š+*0ŒÏro¢T»XbvòÙ0ax+‡ º=«Y<“›^àËËåY–Žø©ÚíÞP,¬ê†íXüìîô9\.Á$º“¾€•'A>eŽR&ö’0ôí)(vHjO‹€J…‰*~RíéG£‚"QÊi·Œ\9ýíªy—‹JJIÜ},xí>ùüËûŽž9w©whæãX ¦×bO¡F'Ö¥‰`…¦_ÖÄ¡²*¢kgá‰\ÕFÂépyœv>fbÍ‘Mi«øè‘N§Ûíâ0"Ê)Ü£ˆiDñ}rÖ«s^'æ°ØôEQô¥y`DÄ-ÖÏ¢©ah;O˜Ð³wB?h3\8¼öÝyøŒR»ix.‰»Œg^]ºò«o·nßìlÏåÞ«c­fŒ(¥‡ß …¦Ï(èÄg°h*Ø ¡Z> fØm|0‹¨åt¹]ŸßÉÁˆèeçôOô%ˆR.b”ÓA¼Bê§à>n¢+ âä{ƒhÂóÞ)ŠGÂrŒ2F°Š Q\!CŠ0w±B=HqÏ…¯ïPMWÏXyËpþµ.pïk©¿MªûpHÜU¼¸dÅš»ŽI@®P4“ˆNfE+ ÙžYA˜qá\ í=§ƒe6J$â‘Çëø ½ëuØ)r9(°!%sÙ<.'x|åsC]íHöÌ|€ 1»‹™°ÆÂÚ[ôòˆˆ”$ÚÚjŠv‹‘’?ÅÎ'ÊŠJtöylŠaâÂám‹ækNp‚eo.âšÇã¼ä.:‚Q[‰.,^LÂèFdV (|gk#`LËkstm¶› ¢Ah¶",z}>›®çÌîoWß~ —ѹœÿ•. )%q¼ðúÒåk¿Úµïè‰Ó—'ÆGGÆ&&Åy©8={Œ\´(âZr<\ë;7¸õ¹+g6nµ9¸ŸÇó…6¦…#4$ˆ€°”å†Å1ºÝãv:¸“ ²[‹‚b1©(lf¹ïÇ©ÝJñîEuR†§`ðÇ8Ls”â¡BQÐG¤²jÎݶ~Åím'’Rw ¯½·ì³õ›v:væÜÅþ,wŸÀÒ ^û‰],Ekgt«§ÚÑØãC#h…¨šr€ GNTQv4ùˆœqŠF”òyQ6Ù™RNª¢èäŠÒìíà„á(«þå}ÓY)¨âc´*ôyõ¡Ùjã*ë'J¡’òy=æ‘6~öA¯Cçrþ—»€¤”ÄÏàÉ×­YÿíîýÇO÷ô@j΋¨õ¼NF+x…)ƒê:=Y4­|,Ä]:ÔL¸I±º(Ù‘À‰c\!éã`ä@cÏã÷Q8r‚lv·Ï‹#+p•¥Šþ`À‹XçàÆ†Cåó_6õc·X¶¦Uí¬Xâý8!„VwÑÓÊçËm{M•¥ýc—öï\÷Ñ[]¼¥¤zâ¡Å‹¯¸jÖ]‡O\¸<8<22"VÜòȬv’kf•ÎÄê:½ÉŒ¦žÝÊín«É´–FÄnZãÀˆ)eŠòƒ$‚@'Ò@ñÒïǹ°ÊCVv>þUÙR“@ì*v´ß¶;#<âÛ^…m¶°`‰]Ëž ¡¬“Ê:ëÀÙ=[×,}µ‹×â¢Ô­pϯ‰_—Þ^õÙ·ÛŽœ:ß×?4Æ )B¡ø:†Ÿ Ø›ÑzƒÉ ‡Xö³2eœ(Æ¡•ît ¸øTWumœÜUwº(@¹Üž@PÜB ¡×çv;íkˆ`hâØJCTÂz³ñÜHlÏI J)üÍqþ$L)à6&Œ‘›Ä`¾•I ņY{ñèæõ‹çSÌ2:”ú—º€¤”Äß‚ç_]¼â«`+ÒÙ IDAT»žëé€S,÷÷ ìè ð”“˜„'9¦Ñ+.«èÈ!&9Q a³ÉãEûÎ Æ©Ì#'DIô^(àr¹ŠMôÖãrÓ]Ñ\ÜÀpp»¢M³0qVXsÛÖ¦3Ó zBó‚•OzÖ£sžg[v݉ªƒƒÝØÙƒ_¯ysžÍRJý‹]@RJâÏñܲO¿Þ¾çØÉ‹½ƒC#˜ÜÀŠlZ›˜Ô̪ÃÎîá>Ôñä†]©Ÿ(õÏuI) àå7–¯þvÛÎïö>v¡§PcìjY,ù•ö²4tÍ„, & µOm‰Kt½ºÚ¸ K`*DTòùü½ …#á NOXÁàáªÊí› …‚è²ðˆg¦øLËÁ~ŠiζmÛ‡(iæö¹¦çÖЋ±X–ì,I2ŠøÆu„>»el°ïìáy½Æ:”’¸C,xá½Ö~¹ó»ƒÇOž»80<Î&]XU­7ðvý7·}%ø]£pµDŸÏƒS[².ÏÍçKD_À?5 ›üAD¦ÀôL$žÂ{¡é0¸†HÅÙ ?é\|ÜÔ>Žu¹ŸÝn³p»ÎÌ¡Q”qBòε"Jq‡\¼5…<^Ïìæ²(Â,Ð"€:­¦Ñ+'÷­œÏ©I)‰;ÃsËVõÍö=GO»Ü;8ª¥¢Iƒ „¹ë´nI·mZXùPÁŠU‹Êýq¤n^ì*ôû^"™Óãs èš"LOMÏÌLM…‚Á¨E©`ÐÏZsN =<ÈÁÝxîÈÛY¢„UâôVᦃ©mkÁ¦ oì­,*´ç&ò’mHäõb‘3Êê€ ¹ŒÚž3»¿ykÞù9t(õÏvI)‰ß]¿iמGÎ]¼ÜO!J§-zS»€Òͦö¢NQæ‹ f6b&Bq q9ìNo0< Mù½â70ž¡ dJMOO‡ÃSÓ‘™i¢Yh Ù#@ò‡Þ¹—‚Weh¬Xó‡JÍi·Î¹Ò*sjY…]`TN˜Å E³}“¶ º^ÌÎÃ⥽;iŸËKÕUfæÉ±ËgŽl\û|ׯ¤”D÷xò•÷Öm>v¶çROïÐȘf|l\,`g'ïáÔq™‚ÿ…ý¸Mki ^µq·ÛÍtðøS3á™iD ü?§RIb¥}tÇt86EÂáiú ¢  ‡M‡|=")šN¯o&Q¼)±m5f2³¥3»”ÙÛTæ9²£°³)s¾IèN²¬ÐÌÂSÓj£ççs)&ÍHÏÙ;¿]ÖuÚw¥þ™. )õXã‰üÙöýç¯ ô÷ŽŽOj'ÇÇ5ìË C<‹XÈ$ö9>±e%›ª¨ëY…à úy¾@xf†ÃE¦p4žÈæ3‘06M”šŽG£Ñ0ÂU42|”µ($q ¡–‚Ü‚´©i?4ÜîãÁF(Ši s73¥¸•o>¶mæý¾ì›Ä½s-»Œµ÷dÿD)³a¸÷Ä¡m>}«Ûvßïo¢Ô?Ý$¥c¼¾øÓ¯wí;tâÌåþ‘‘ááqLéÂER«7 ³Ç*9\¦ö¶ø›Ý‡xòÝjºVN͈þ7ƃӑèôt,FIßt4—ˤs¹t·ÓíCE¤š‰D¢qB" BÑX*“Je³él6•ˆÇ¢ñd†Þ‰Eô‡‹ÏLù‰RS~J‰Nâ\ÊÓ²l‚ÞaQ†ËiãI_6ó³9Ø;Šc+;†‡…ï˜Aœ< Í‘…m-œ"qÅÁ¯®KTÜE§&®Ùû媅ó,”ú3HJIÌ‹¾÷ùÆýÇ®ôò&VÂñZ3á$až¸ ÁŒ²£zQé éWÞPÈð{Ü>â%mÓÓS”ïÅ@2¡Ä¡4Ñ(“ϧIª¢èýd"žH&"33‘h,6©‚ ø)X >žCdc%–•(Áäiz;{ü9Ün¸Í¯Ŧ²|W0ª]EA‹ná•UŠo‹EÀHXÁÜHdjüÒÁ]Ÿ4¯eóŸBRJb¼°pɲO¶î=qnóºðàuºÄéya¡^œú°»+Ÿºò1)U0¾ ]·?œ™™òz§f¦A¨ðLx&K¦SĨt*F¤¡÷Òéd:›)ä“ñd<2Oe’)ú¸D”ŠÓc¦C¡ðt0iEPœ^ùØj¬­—å:NÙÙ(·µ9=¯½‰Rs>}\Lq”2+V‹ÅÂtæ)9šò^Ü¿}ÍwК:”ú'»€¤Ôã†WÞ|éêu›vì;sñ*VCO°ß$ôš x2ý~ÿ|[!üvX-Âç’Ç1—á1™Â±ŧp8™¡@” :)›Ë¦“qX”æ%SéT4OPª—H%“‰d4<ÍA*Á§-^!™õ!Qò‹Ó(®`ÀŠÙÄpˆ÷àÃñSl"eý(„e9J{©‡ðni×WÜb±;xÒmWÍönZÞßÄÍèPêŸè’Rž[ôáÊ5_oÚ{èä•~ˆÍ…÷²N—Z­ææí®iØxç§Ë¯'˜äáá úOtšfQh*G¨¤ˆE©t&+(EüŠ—ˆS‘™X2Ž÷¨¤Š¥¥"3Ñx„¾ÀŒ@ xݪªü8šb?¯ @ŒvpýäàÜÓΖvœQñÆ)A)“˜…´Š•òbÿ€XÑ+\ÒÙê¶f.‡Ù é=»kÃânü&n†¤”ÄÏáÉ×ö寭ß:ÛsuC…ó¡=†Á"-ïŠÑs‘ÏgPìñEÁëÜœR1¯r">¡%Qöºˆ(5I$¥(¥2¹T)E·¤Òé|>:ƒVE¡Z¢œÈ‰à节ñjz*p£ÁçâÉ*(i…ÝMïzؼg¿ÄÖ=ÙùPŒU»¬žU¬m¹ÖäÏEøGëÛ5¡ ?…ÍéFø³)cý=Ç|µê¥;}Ù:”úÇ»€¤Ôã„§.Zñõ¦]ûŽŸî›Àê÷±1D)޶o²g—ðuEòÇÅ ºÜ,òø Í #"3áh"ŒB%133§ ŠQ<O¦2™$+bU"ËdÓé4q-I—ëe$}Ñh<‘*¥å÷Á—‚-eÙÖËV˜N˜w9ÛQÊé¥oÏ–~Hð,‡ØHªš…˜k„[zÛ’9(eæôNO àqZMƒOíÛ¾fiwÓñ7ARJâVxîÍOÖmøvóÞƒg{†Æ±jI3>6 ³K½ÉÜ>Õµ§",6£pÃÿÏ Óg§½C)Ÿ­]ÄG{a‡QŒÅ‹µl0!óF‘Ä‚Rvo ð:Ý>Y?xiï·kÞzἂJý#]@RêQÇ[ï´zûþ£§Î^ɀE <³kÂp»Ø½n¡:^uØ`Ùç~84`.'¡ü¡>M‡B3±X<<ŽãÄ6›ÏiˆJ抅D’ê¨t±˜K%)ÕËUJôNšTÈç+µF•’¿t‘˜V&nÅ)Ze²©øôD~Ÿ×=9N6+<ЭàÓ)â»ÌâXÉçãQ˜Æþd2k™M]’XmÚqvÁ •“rV¯c*š‘s‡×üþê&$¥$:xjáŠÕ_|sèäÙ‹=ýÃ~gOc^«NAȉ֞E1ŒV^ŠË”P ÁCÝÞ©H"Pd‚.6žŠE£Él:™.äsqÊà"Éd*U(åã©R!“.”‹©D*•Ε ( ò…J©P¬ÖÊù\1Ÿ!V¨¶J§Òé4ºÓ¡àÔ4 ÒsŒÆ SŠût‡'¸|R+Ì0U³X"oá£^ ;º vj>>Œž}ÂZV±»|~¿ÇA?óÄPïÑ]Ÿ,¹ƒ¹Ã›Ð¡Ô?è’R4ž_öé–GN÷^íBÒÇóðæcwöjÇ:0bnÛŽót…Ç ùÓSS31ŠR‘d®q EHóré\­T)'âʃ(`ųÕR6“/•Rqè'r¹|ž>(× ¹\±DÅE­\ž²Âl>—!¦‰–3ÓáHFcp&ƒ E‰ _,iƒ©&vpèpMMµ÷T͹ÊZ˜LØ:€5Rl=MŸ…œfñÊ=~¿ÏmÓŒõ_>qðÛOßyùÎès”’hãåw>ûvß‘ ½Ãì"¦aJ¡”g¡©ÍnU„‘fu­fϾ£rAúå Ï`lp&Ç)T4Fü!ò䨜RùJ©^£”/I UO™x,Y,ŠE(e‰6àO±Z©(ó+R¬*¤yŠTD¶L: aE&œ)„ÙxPÊç‡=å˜H佇öŽWå¡¿“w¶ÍÙP˜x%°YHå͆ÉI>Tãй=6Å5†–±áËçöm_»ì2ê'Jýý. )õˆâ‰g^}sÑêõ»_ê×Rm!®:´!°%Z0‰=c­ªMÇ-Šƒº6»/‰Î@\¡Q4EõR6eÍE)î‰'âÊñ({Ë Q^ JE‰o¹B¡\)RX¢»ò¥B6W(2„b½VÌ%Såb&O&RYœýF#1 &bZÊ´ÎëGóþJ^^DÝ9v¾Ùx•°‡f—LE,X$ò(b7·Ôµzƒ…=”8+DtÀ[Ñõ]>ypÚ·îüŒ·¥€ø6n³.žyóÝe¯Ù¸ãÈéþ^PM6¬Œà%…|5rÖ‡á ÞÔ‰­OT²8]Áp"Ä).X¢hE²1P*4IÅbrÄ B¦T*e“ñJ¤¥ƒ…R¥RÊ«ÎòèÆL±\.æRÙ Q*FËÒçÅ£TœÁÒ…*6>Köâ ½ú€×í#»ìÉãøùQ¼á*¥-82ò²N[),éÄþ`-f <ñ¬•]Ì/êFû/ž=¸s퇿¤×'СÔíèÔ¡•¤Ô£ˆE+¾üfÛ®ýg/^î£wpc{©-çJv«‰ÃÅ4ýecm*\$|©d:‰%“¨†(Ï£ð“ŒÅ0 •ÊÕj•L ·–ÊùL¢¾l¹ZB4ÊRüÂC+µJ‘xU@'BÔU¹3vÛ¬&ýPÏéÝ›V-ýå1ê&Jý½. )õèáÉWßýüÛ=ûŸ½2®ÕNh p—‚2 ¾\¾P*Ò£ÓYÊ élµ€J,ÇÑw‰T2B¹žk.AÃѲƒ(E”¥à¨îÁY•M §Ûik/U­l|+Vt˜ç(Õ6ïãZ‘7Þ`F2ðºT‹A{õÜÑÍ_,þeÝó6$¥k,|wÉÊÏvì;~úÊÀˆÁbÔMb ›pQ½¡7R<² ‹~›],nB¬R„™Dp:’̤é\.DP?ÅÓ|2›Ædaíz%ƒ‘]ŠVél¥Ñ(e‰ %u›ˆ:¥R9C‰^¦X(²ÙJµ\®”k¥b¥ZJ%«"g2—ÍÒ}œ÷%)—Œý^›"N¼¼Å×á †ü^' &ø´×&Š*ÔŠø`6 G1ƒ©­GçT0M‡ã °y¶¹¼©x,ì¶›¨:ñÝ–•‹ŸûU¯i‡RÿP”zÄðÜ’«×»ïè¹KCc£Y¯ÕLò5h4è&5I±Á<ÌÊSð¼Ý‹Ú­6XêÁü?B%“/S±p8ž d2:bS½úµ•L¨ˆ`•F­œO%óÕZ1›'U+¥21+“ÉSÖ—±¨¨ªWˆXD©RnI%V…"äêÉ|> xÝ8­Elšâ®„«Ýžp²%´Ó†q^V÷*8éãU"ºÎ~kT‡L)Þq¯7Š7n_0œˆÏ8Uíxß…ï(FýaßMèPêoº€¤Ô#…çÞ[þå¦íûŸíÕòü$6Áã—º ÎûT@9a‹,v}:íœ{°#UT$Ÿ‰Pˆ¢ê)—I…§£n'€Q”Ê)©+dÐO¥sùr½6+ͨb©VÊæ+åJÂÙÂX®Z¦GÔjåb:IT"ÞåÓÙl¦R'S”ý?÷%¦âÉwøRTõóÑp41‡eÑ·#¢‹YÊ ã‰Tž‚P¥R+QåT¯—KårµÊ”*— T{Q½”æ*Õ:å~ç¨ÐÊç²)º«\HƒRhºû]6P SìÜ“ |{tØ3M\¼Ä.v ¨l•$öÛèŒí%R»ÙÈv³¨¯ O´»|áiŸ×ïs+†ÁËGv¯ýðí_ûÂv(õ×]@RêÁ‚__úñ†-{ž½Ô;4ÊŽàâr£Ø¤5á‡wGãÆ”ÚÖyüXT‰`„=Ïr 馒‰R9•HÆpD!&C(º7I¡¦P€³D!›&Ê[ …|©V%æ4êÅxW(Ñm9tÑ ¸·H(°€"‡™yègé«§ÑD.椢Îbµcï û_:Úku¼M”§±ÛíBëÜjóx=ÿf`Y•^«ÕÏÙ_б/‹ÅŠÉ˜ŽF`\¡ê(íÛ¿å£w»Ýú³”z±pѲÏ6ìÙìto?Ô|¨ÔyÊŒ®„.'F£Ø/hç•ÒbÚ¶)¾ÀL$2‰Å¢3ÈÌ£ñx,GÑ& G¢¨û¥ãÑX2M©Ý‘ÍQ˜#FÑGùl®V¯Õª­f¥HLÊåkbQ¹Ù$Nå.‹R…|ž5~ižéMÅ¢ÉTØù«ê@÷mrŒhÁn‚Y¦ž#ëÓm¬… êÙmйM)î™ëÛJYÞ! >ž`8ñ{ªyb¸çìîo–¾ñëz¿—”zñò»Ÿ³uÿÑó—®²C çzlhl‚ë‘YÅ¢¯dýœM”S- ,ÃfÂÓSÓRh’Çâ©L&Ý9ŸÌ&3\C¥!'ÏdòÕ úåD6ÔNé\½V)UZµT":ÍΖ‹åÆl³E _®X®ÕJ8J§Á°\Sˆâ+쳘ÌV±“=t‡ÃÃKq@Å?vÃäU¥xº6ðz½¡p4ð¨Æ‰Þ‹Ç÷µjᯭ¤n¢Ôßí’RžíƒO6ïÚwüLoÿðèø²0/fK$~:«Ã2ÙUü"ç Öéñù<¦Àî§i¶‹…ml ǹD!"Q’–ŒGáO@ù€©|G¿µj> ÇóLµR,d T/•ˆ:õF¹T-—Z³Õ2ŬjR½l±R¯ XeщG×#™NS L]Cl.T…jÝG›‹×a{!ŠòðH1{6Sಠ‡Ó…]S¢aΜÒN¶÷²µ[€H"}X LQÊm5Œž?ùݶO–ü ÕÄ:”ú«. )õÐ㉗ôÅ7{={ip^—ãðj—^ü W!ë†ò§@¼Á© Ø¢;5ºÓp5ŸÇ0‹ …_*K),.Sé4ìÍÁ©L¶P@0_¯æaÖ’JW*% ó–©fªRœ*+ÕJ³U¯5¯5‹å|.“)Tª”òQöÇFdyôÒSÑh,)$}Nž)q°òȆS'Jü<¬yÀ$j*Œp‰_V«b%ÆÙ­0êcN¡€ú‰R§Q76paÇWïß©Uó­!)õøà…•ë·9y±whdbrR,ß JYT8­ê &È„ +¯]ã"— †þp ôGù4¥aD£8½‰Æ3hîåÒÙR¥~í‡fóyâV–¸P«ä¸/AwÖˆE¥r‚Q&]¨5›­V¯!(ño1¦T¯T¾v½U/Õj(©Jĵj¥J)¦SpÇLOy,fþ—NÞ½g1œëò®ºs±ýÐ&w Âò’g¥ÄÒx‹%:]tQ(Øò o2·jºzîØÞu+~u¯O C©¿Ó$¥f¼´xÃÎÃ/_¢ôlÄl¶špjc0cŠÏjæf:/ŽVT*à]m›IßTÒÏyù™p*E?–“¾šq²÷Âá=›?~ï.½Î’R¼ôÆê GÎ]E‡oFbZ½IÈ³Û ƒ úX˜òó2CœõP„òû°³ ©p4‘Ê`>#Á7±xºØ¨äòåJëz=WªÕÿêûR¥T(—1dùx–‚Os¶Q®Ôч¨R Êe ÅF£Rk¶(X•ò™r«JŸ@T,V+¥ZµÕ♪x<[¾>K”*e1AO7¤bnÅdEëÑ#)'Úãb;=èpm† ͈LFá%;gÙÂâªNÕ^Ï›ÑÝp*úñ±¡«'|½vù¯ø9t(õÇ. )õ°âå7–¬Ø°ó\ß0G”ôi&tØübµ« «H¡Ï1³A{]òõêòO‡ƒ(¡¢á©ð ¤æPH$Ñ%ÇúÏt±UÍf+åF«’Ε«?¶*µ2M¥ºw‰D¾/R¢W,Sô¡Ì®Ñj Å1‹2ºj£UÊgë×)·«S£Ï*"N•á3Kd¬\oU«r.K•U&•ˆMÛ¨òaJÁ¶™qU±H TÈPíñRC³'Pb?#©P hÐa🥲Xªâ0˜=3|v³vd¨¯çÐŽOîlÃõm!)õèãÅw>ZÿõæÇ/Œj ËÑñ˜8Uе¥½±½)À̶|*Œùü!¿:Ú6ƒIK4‘ŽÁæ²OåêЕç(+J0ËóEJÜ*åB¶P©7«Å|*]oRª”²ùfµÙV³Y°!Hµz1›)ÕkÕ2J&bÜ'ŠUŠqùt2Sªâ3ª5ªÕйT,è6[nÊÒ¼>¯« ?Çl”ÕñŠŠŸÂbä½ôV(%ÐäÔ!;ÌêxS·Ø$³>ŸGŒ»-ºñþÞs'¶}ñk¦xÿJý¡ HJ=Œxzñê »÷|wèR?E(-ÐP E)‘Ë-F¶UT¯ DÙ_0 Gà'1ã¶[<•ŠÎÌDÒ•r¾<Ûª³T4QVWÂ4G©L)]PÊS&׬ré\ëz…eEÅz£T(¢Û7;Kïä³”Í*UzL©,º~­: î˜å*ÕX©DþI9b,¸šIFÝ6‹êöbM/ïõx˜RX.à°©8²E¤¢C{§ÙØ.dJi¡[D{bî<ʬ8=FöÁÐí0hFû.8øÍšWܽ×[RêQÇKo®Ù¸÷ø‰“çÇ…*‡)5©×›”vA‘]Õî ª_u!`u¡?ˆ3PìJ 0¸‘LDg¢‰E’r«U-*µ"Ñ¥ˆ¶7Zwõj¥ÖÀÔ{­ŽYøbc¶Z€Ü¯XŸ­Rª4êÍf!Ñ"L¹Ö¨”)¤:ªR½ÞªQ¡•Ч+`_Šª°\®#žBô—ЇmŠÕΣìbmL"ì5T²`«Ä+b.~nÑ‘~wè~¢”,V7¥³ÓSì˱+š±¡ËçíþbÅ] R?QêÇ. )õÐá•wÖ®ß~àô•¾áI½ët]ÛxÁ(fÆÙùH3¬èôñª?vFb”ìÅ“ñx<%R茫Õl‰ ¢kÍJ©Ly\±YøH4ø§»T1+õZ½ÕjÁ¥½S*6¸Q)åstG I]¥LÔ«Áª×®5qHUÈ$óµZ–hÇ7Ë@¤/ y,^Âæ†nó»ìßìâ'L¿¬È­^!'Yƒ( Y)‹ô–÷ [Ážc8ŒÂF{ìüu›4W¯œ>¼uÃGïÞÍ—¼C©º€¤ÔC†§_Z²zÛîÇ/ôŽŒNêxƽL´òÞg#öC± ’7±Ãæ2 (/ MM…£„X* JE#±T§FÍr&_®Tg˜!„]%Èf¯]»V„W q¡R«5š­f‘î¬ÕëMzhýÆ5¢2¾">¥”ÏS4+Rî7;[+UM*ÃÐ1Ìd°Ž —o•³VÙTÄg·(|þäq±‹—L¹…Á,rU–÷1¥„ “Çd@~;©5šç(Ŧ³*–O…¦BA¬vèF._:wdï7Ÿ¿ÿÚÝ|Ñ%¥Y,xwÙ—[œºrµ¯h||bbR˽0­N,UW…=ƒÛàU«èJóVÐ`¬œžò¦§©ŠŠñü;„G±™vªå+•TªP®ÕšÍ:*)($xÕZ®H¥Ô°ž(¬6ëÍ:Ìc+õÙôG‚°U çRTT‹ôn™ª*z@!OYb­JwÓ½™TºTɤy68›Ž†=6Ž,~QEQ5åŽÍðö2sëÌpïlÛõ¡Òà'6ˆÓ)ïè¶Š}=PÛÂ>Ý8xáðï6½réÝLû$¥]<¹pí×ûNôôŽŽŽ£oŽU†Zqè‰JÞf£ÌI3ØeÇ º;СH>…ÂᶦÒI¬M¥Rð]¡j']®·ÍF­\Z]òèÛwŠÄ(¥^›­S¸¡$¯Ùh€Tu¦HPªWL2ÚB}¶N‘Œ¢U)—N•«0¥@™ž™²SNêäî†ôCA/åÅî( œÅaÙifciØd[Y£Q7É”_ÛhVå`Ä8—ÃbÒO^>¹{ûæõká6ŸE‡RÀ÷·t›}¨°`Ég[žêÕŒaášÁ(::acgAPòzÙŒÑ *9 ©™™H<†Õ‘X$M¦0Y $82§RY $ðƒÐ¨P*B[.W›Íj5ÇÓP¹|±+ךõj•"Öµ•<寵Fõ¼NªÚhÕªTH•˹,T™l±\á¹y— ä™R­HÑ BŠDÈE‰‚ñÏa„(aóz=‡ª˜pÂÄ>íìÓga\¤‚l3¦£à£Ï+Cµ9xq6åŒô0ƒnlðä¾õkV,zó®heoB‡R·£S‡V’R ÞY¶i߉K—G&õ“ãØ¸fÇ5:ƒX±„Ó\'vÛbn×î„á’¾`xf&–ŽƒR±$(…5ïp Ã\ ½)P „A(´$Чz§\½6Û¤x“C—+”KÅz£NÔ©—ª×oÔJ¥j…n™­þñï\oµšÙëj™øGŠÕJ6—/QJØj±ER±Pª•‰§åz!OÜÅ´ˆWµØ\>&ØûðQ$Ų¬Q°œÃܶ糈!dŠZ¬åCÒLâ=£YÏbØÊëåÕÙ.z˜~r¸ïÈ®5¾÷Ò3wûµïPêF”z8°ä‹£g®Œ ku“㸸ø`†·(YÙO±óÜ]l¸ÊœNÏ ÍÌ@$‹E¡9ŠEã øZ&3lÒÍgsåRž÷l ¸”¡Àƒãr‰"fà 9Êø‚ª"Îõ¥~õR±Ó£úÿØ¢’ªuã‡ë×)`Ó™R¹B œ/W¬7¿ÿ«? ç«WÐéÈJÍjúRfÊg1ÛÜp?GÃÔpJK¬ÂÒPœJS\²˜Ä?‡"³QÏÉ­N˜žõð"«=£~bôòÙ_/zùη[Ï‹¥®wI©‡/¶ãBßèøøèðëù4““0:Çù'úÈÜ—À ¼M…°Ç‹Þ´‡R>¬p"á`—²=J»Ð™À ›öâ´ ¦×³ùRËÐ`à[‹Í:SŠ-*D(Êïš×gëel ¸S¯–ëßÿÐ,WÙ¨ JÏãQ•R©%RãÚkõz£I±­V+⬘rEº¿˜ô9Ì»›èäñb Ž/„„£‡HYá-ˆ?%âhMíPJÛ¡6ˆbÕ=zîXDïA!æ°uš‘sG7}öÆÓ÷àå—”z´ðÜ+o­X»íPïð„fbtdtl’vµ&žÍCÏ;AYenGBµ»q¹úéLód"_JÄùÜ# Ež—+sñD.OåN>‹œ =r*Œà.F (qß,…JµEÅR±\£xƒRÙQ¥Ù¢l¯T&ÂTQ:á4JsLóÒ;¶&q­‰2«\)ª T£™ÆÜ¡Ã…QxxɺÙ]ôhöb˜Ëƒ½¼>€WÚX9dA ¢A%Å· 5/ … v#Ž ö]8µgóª%÷‚Q?QêZ”zÀñÌËï~°ê«o÷饯FÇ&Ú”ÒsOÅ;eA*£ì"HÁrÈåpÂÉt:A€*ã‘X.OËL:o”>…d2_ªÖ(󣚩ØjKê " †ÝóÙL¶P*™×®a?(xRÌå Ù\­Ziýázîj4›µR½A¹]¥Ñ žÕ[7µV½Zƒ+f…ÂÔlµ\¢<‘¾ 儵jÜKb’ØÉæÄtFâÙRÐ!Æ#ý>'6cîPÁÐ$oî1r%5éŠË(¡ü<ý+¶s¨ŠQ7xå±×ÝE©ìÍ”z”ðÆû+×}»{ïáSWG4ÍûJ°9Îv­6›U±9ÙTBµ‹Õk6v˜tÂTùbJ¦RéúDœjóÆl³R¼~ƒÒºz«^o6«ëͧF¥T.ÊÖµJ¡€Ó+v-çB.¤uN7¯"¹\0ƒÿÛÊb"Ñð9Tˆç WˆÄ)A)$ÂF¢”Ão~ÖÜ:V‹~âʹ㻷¬ýèÍ_¼•í¶”ztðâ[«Öí>tâÜùÞÑ 4$ VÅH•;vš&v g7~ö•p‰=00·Î£‰ñD:%<Òì {‰\2AUNc‰FÕ&E¥B:§­P ¨t­E©\£–/ýåßûáUD”úQØúþÆl£B/UjÍÙëÍJ:3;ÛjPÁU*3‹µq°EP>™¯Üø¡”¥"‹»ê•lbÚnó p‚å¤ñ¼bž‚lébŸ›íP…ÝK@^jгn‚e"¦T‡ÎN¡©©ßí²[º‘¾c{7¯\üê¯Yxs;t(5Û$¥d<ýÖÒõ[ŽŸ½ØsypŒ¥8F‹Ãn2ZDßܬ›cxsûËíÅ/nè‚¡0d‰WÉx ©3‰8Ú‚Y¼`-“„U9Ü‹èÿ*EÑâƒyl;×f%t"ò…?üõ³uämÕJ‰ˆÖ€ûQ­Æi_µ˜ÉÕkõz•i˜£Ï­Õ¯á˜’ÁbõÆb®H8UÊ'§}ªÝDdqb†—ݨ"r`¨ ¿ø÷†‰R8è¥8\ñÀ¡V'¬iŒ&›Û‡|h*<…Í9íxßùï6¯{û¥{ÐëèPªÕ$¥\<÷ÞÒO¿9xªhxˆe0*|ºiå!]›]ÁV(•)SV×X¿»ávDˆÄ±H"ç«ét*‰#íko%,AÄ—/äq8å1Ã^€˜¯T`Ay³Ñ¤U,5ggkeÌÂWê³×[?Þhb‚ªÕª5éO½Õj^«ÂÆf³µ¿üC>ßh›®ß(—pÊET‹ÒAâ^¡P¯çÓA—Muøü°éã9x‡Æ+“ûþªø‹W4*°K¹ÏLé…Ó;LðR)‹Ë¢øD?îTÐkSMú‘«'~³fñ=ü—”z4ð»«ÖnÚsæÒÐÈèÈȸ.˜4 ñ³Ðg1áÂsέá`JMO…¦‰P£Âá™D:ÀÂéD¹–Kgb¬[KçòÙ,¶¼#1+¥()Lç ­kP“g3ÙJ¥5[¢Ê¨5Û„ˆoöÆ«pÞTkͶþø}«ÉVWoÌ^»þ}ƒâÝ]­Õÿ毊"Z¹òà .0Jߜ塪§²q˜‘C^¾+ök·Ã:'…î6˜£©"dYͨY¬• òA¦TŸís«V£vàò‘½ë?~çþSt(Õì’R*–¬ùzÛÎ#gú‡ÆÆÆ'Æ5ZŒ@¡e΋51@޹ŒC¸ùh† ¨à²!¸ØÂÓ3¨ b‘h<“-WrJó2ùR!GËL»m(·kT1´ž‚l¼ẔN¶:Û,b T¢£ÙÆåÌ™ åúÙZƒ…}õF­zýûÙÖìõYŠZ**M*½ˆQÖµï[ÐV³uâ]ë‡f¥Ñªægè=ø¦y‘b’Ý……7Nxyoo#¦Ù±QÎΊ?œIµM&L8ÎÆ"ˆ|¸g`’×®Xtã=§÷lY½äîØ‹Ý’R=^|õÍ÷ÖoÞ±ïàéKC£PM€R¼M]¡úB8˜@4 ³;77“éú †XlRal݈F¢‰b¥QËe„˜¼€}¹ŒXäaZÔ¬æ²ÉQªVçy©R*7ÒPc•àÂÜh•Š˜Öh6ëÅÊl‹Âvß@`Û¼>Kœ"JÕˆ_8‹¢¿›•bµyíûji¶Y£ÏªSL›ý±U­×sqŸËîpyC±dç`gäu F —L¦Æx-*VÇ£\4Û =P0tg{Z—»åBö}±˜µ£çmÿfÅ»÷ª5t(Õè’R^{oõç¶8wq`xphBËÆ“¼¥ŒG !Õ¦ßà ê(7äqÄ'?¶ДˆDf¦¦â±h”UHñ,ç ¥b2žI'ÓùZ½^Á&Ý\>W.Óß`R¹T*ׯ5Ñ,/S©B¥†[0ô^B°ºv­Q¯–Ëôö¨R±yhÔºÑBeUj^k4Z(¾jj¹X¢@V(ñÃ+ÍY ^×ëÅtÂçvBéàŸŠ†±CÀÉýI óò|”…ÇRXÞ‡©Ï&›æöGñP¯ÑŒ)î³»}ðoŸúœÊ uÚÑ«Gv}¾ò×oç¸:”ªwI©Ï.ZñÕÆû.öLjGG&&µ°çÓa‰5oˆâYEU©¦à\ÊK”ò¸XF¢Ñè /æ$Äæ±¥s°Ö+ñH"¡àCa¥X!Jáp*ŸE»EC­ë­j)—+ÓÙêìuìa«UQDÍ~?ÛhGjß_Ÿ­×«¥b£Å ¥Æå‹­ÙFcvvö×›Mz|­‰=nP1•«”š¬”ˆ¸]t"ý¡é¥Ÿ­½óN¼l@UĈ?LÆŒ¼4ÔÐÞÉ‹ŽÔIÂ’Œhå â—FÈﱫfýäÄøÀ¥=ß~ôþÝúsHJ=ÔxöµŸoÛµÿXßÐèääæ8´z6Œ… ›“a‰ŒÍ¦Xy›Ÿ~[{|A삟¦‹†Ã3Jú’) CØÝŽñ§\ºøL,](•+”½U«Å|¾˜‡™©z-Ÿ-Ug¯µàrY)çr KŒJ¡wýÇÙr­^­¶®£(•+qr[¿~½Á®GåÖl‹Àëýãl³Z%¦ÕKô%)—¬TZ•*«j12írc”ƒBiÐÏb Èó¼ÎÙÄÉjå"Qlï1²’hô‰}ñ8‰³Îqʤ(EiŸS1ë4c×Nm\ûö+÷ößDRêáÅ‚g.Z±eßÙ‹}ƒhJŒS5¡5˜PX˜XJjz.@n¿ºQœ¦¢IŒpP‰$’Il(”r™b¥Jq%—ÉÖj©h znŸ›n|Ä#±ÛÊå xíœx¼~KP"kâS'aÆŒ7ÂéÜ47n¨§Ð‰¡ß¡ Ï£ÇGú{{ÎÚ»ñý_½åp>t(Uë’Ržxõ¥Ÿ|uðôÀð¸fB(p4ƒY'OŒ³ê凅÷Úðˆ„‡·®E ?¢ðg>D¨l–BS.]ªâh(ŸN—Ji Y%HܸѪæè¢¯”‘Åá ’‰zG¶µF£T w+TEͶD0aãjßÿx½Õ€ýD­ù‡µÊì?^o”ÊMz̵f Štb$®‰˜U*”š³UÌ 2aäz¬‡nÜÃf}NŒr¹mVу@gܪ*&Þƒ*FvíÝÖl1klOð‚RìUáõºFMï…³'ïÛ°úÞˆn†¤ÔÊח|º~ÇþãWµ³¸¸Œ­Î‚´È*†ß¹É¬ð%QO Dœ ¨âÉ8öíF#áH<•ÆðF¦PΦ0Ʊo¶I×@¤od*䱎Þ–%ºü«4lÌ6*yøÕšß_ÿ«¿ùþ‡ï¯]»ñC…øwíÆ…°ôEôEj×ÿðG v¿¯U(Ì]û*+ln£˜Xk^#ZÞøž¾f!›Šº…²Cl %J é”Ë…íQÑŽ€-‹•JE£8æµ*sëâáUÓv™àÓa<Ï©ûÿÙ{ï÷¶Î+[øùþƒ;ßÌIoŽíd'±“8Çqœê8.)®qÜ{‘-Y¶Š%K”XÁ°‹½€è§7à ÷‚½‘”Hª¸¤ýpç§oï÷КÌ$q˜|Vñ}¸%R$Pyvy×^«º¼lßî§»÷wÜúík.æ¨o+.@ŠÚFì@êʉùêMwüòá§^xußÑò*ÂÊ!Z@XíU' \†Â™.![[olmƒWìÖ£±¹½§¿¿«£³»× ûu&Ÿ „¦jxì§ûÌnN`ëêp#6ldOʉ2°HÃ,ÃXPowžo@‘$¨þDê<MÃýÜÅò¢/àáÝNÖC åæD‘¥”“ȶ h„àÖÖßÕJ,Bëu÷ÐzŽÍdêW]­Ï$ÈБjk«uHD#Šjeú6"¢‘¸ŒÂ7àè¡=»žøÍÝ?ýþ7¾|qz\€”k±©+&®¾þö{Ÿzþ•½¯”ñ¿?qõ·Þ÷èK»÷xãð›GËtA¤J™D%’ÞjñÄÕØÜØÔÖŒú|Dfµ¹€Õ‡¶ÕÝ€&Ÿ÷÷õ "SÖb4;íf³ÙF±4ŽÌQ] ÷qžvÁgd¿x7”‡Ð y<[ìèºËI,ôWn(±Gb¯(7NÅá^‚ÈAJc8Q’9Ô¤U¼ å÷AFÄ`Âù£\”ÃÜÙ°e´ÝP¿5æC‹ÃúZ|‰ÐIH5:þ[øß5 ¦KùÖ¼oËÈŨQM£aKIÓPuäÐþÝ»ž}ê׿úáM×òŸ/ÅO礜ۈH] qÍ×o¿û>úüËûß(ÓÝœ••W Õ¨fRUS[SY-=nq@ù×ÐÒŒ4îFS#zh¶4·œèêêìêêîì@Qæþþ¾®îÞî4µ¢Ø¿Õ2Ø70Dq‚ˆ‹€XèÙI)h³À‡èP2ŒgYYdÞEó<͉<*û±OC¢](2 ‹C’žìÂo%  ‚ì²£›Å‰»¿Œ€ío³R¶–9~8Ô#(P‰H6céGv¼ôY ±ðA–Uµ¾ÏK:p„^F}ª uH²‡ÿ+ ²¡¦òÐë¯<ûÔ#ýü¶o}Ðâb-v õ!‹þô·úðc?óâž½o¼‰ÄÑãð¢]Qm¨®®«7àf¹¡Ú€EO]Mm½Î@ÂZ£É_ksK[gWg'Îúºˆº¼õöôöYвÆf…òº('@Y)<‰@ Ú\.žuãvN8–Õ^…q¸8 š#ÞMó#¢Šƒ¶Q ãh·äÌp<Ë©> àc·s’€ûˆšŒd€OžcyªÎcm-Nöêõ¥ÃâM/X ’Eäj½›ÂIÌqý„ Œº”)¨úªà/!È•EÍꊃ¯¾ôä£ÞsÛ÷¾riʾH}è⪯ÜþÀó/¾¸{ïëûÁ9WYU] êUU×C7/ïd™j‰®ì- IDAT$ñ¸ š$K5·utwu÷`­‡v†dÙýÛÍv<BÅ"Ê5„­|‚аð'Y±˜Ív·€îŸxÖ—‚[•%¢©”Ý%¨‚$~Žø“q¢yÃó¨‰LŠ4+ #)ªÈP6» HС© HÑ,Ò“W_÷‰ÖZx!ÀB¯Á´©&44%2Ôl! ó°nm¨7Tú]· š²¤QMåžÚšLõµÇö½òü£ýòŽï~óªK„¨ÿ‚”c±©Ë_¼þ{·=òìÞ}û8pðÍ£å•ð¢]Y]A^²+I/éh¥/èé“ TBÁÕˆÖííÝ}ý6§Ã:„ H½ýfìŸP;Ân!úC6QƵu ]4"—Úq7 ÃQ„y™Ë-ùe€ËK ÃË¢Ä2²Ê³´¨ÈЇÁý\,GKšGÖÜ.^ñŒWpT­˜ÓÁ{TEÆ”ÇÒí(k›‰(²×]P–\ ^Ž)jõ‚O'Ì¢ÁÜ1ÜW©Ö%'ÈNTUÕ–”‰ˆÇ†ºªr\8|ìW¨‹´ÿ—â¤0ìï;j³—?þ÷Ußùá¿|ò…×|ãàÁ7Ž–UqÕãÄ«‡Ç´‚6ÔÕ›@œø‘‘:\e­­MÍ­'Nt`×4„¢Ëƒègh³ÃGý—˜oXmv7ƒv´E°orÓO¹p}ƒåp©b(»ÅÆI*GÓ.7ò³Œà‹B‚9…úx]ôÈE± íõk,í¢$‰È,@Ïåf°t:YÉ«©ùëÛ¿ýµE é/ÇH½œ.ÀjR—1þõ³ß½ý×?öÄK»÷<„N/Ä>óè–CYEE–E8ŸÐ÷`QúGÏÈï!”‰–Ööh0`Æ'ëupò“Å<ÐÒ±¸¸k£ÜT§ÄexÈU6àÁ#r@š‹¢EYÂñ9:Iɪ€”$œp¹\‚ÂP’%$žì~DÆíæTÍñ8°U—;hšXßÀ£D—£(‰·Ymæž6|ž xÌ[OlC uÄ«n!]±¶F-ÌêÊ­õ/"2{ÉIH |Áÿ›L4P&j`ÖªïåÅGîùéõ×^´¥ø¿ eÛFì@ê2ÆÇ¯¾áÎûŸxú¹^}ýà¡ÃØ‘Ñý2éúÅĥФ¸Õák=”Mxu"¹²dž¬¹JÇÚÍHЭÝmV@ Êi·Ò"ú½9\ŠGæ)Üñ 8Ò ²D^ôy‰Ê%:D9P#×Ç8X–EJ=ÀêUX¼­i¨Óo.…@rD‘qQŠ`ìjkÂq¥© >ÝÏÚP¯Ë„5ƒ²Â[C {ðXú%B˜ •nÚQIøÂ®=¯|ãÄÌv‰²XóáÑ.^u(Iœ£ªñb#â\€¨æŽNdž÷vwô  Ž4P–~Ôç³Xœn7dX(·upý>íh¯‹c ô¨v±ÐHAZbY—ÃŽ-ëtØÝxÈØÀé„ÒŽDKæ@–§Iõ)2@ŠEÒ…›‡”$pð‚®.„¯´s°»µ¹ŽôOðPWK …‹]­­Í¨ }Tmƒ±Ç-Dvpk?êø1r¨‹ª­%梦¶m-m'N´6ÄŠãǽþäCwßöõk.mŽúHY¶;ºLqõ ?¹û7OíÚðCon%§£eï- aaD.¸*B+ÀżÊz#¶èè¡ÙAôðXw`p``Ðæ´£^˜Â,òÁA‡ ¸‡P [*¸òY’åÀU'ÉåH~Õ©çp«ÕE%#»OtÐ)9r'h7Ž2p3Šá†%Ž‚Q’R j‰1E½øˆcD²š¥»½x¨Éú.ÚÕû¨†f”j®Çs6’É^rÃ-¿üõ3/½ú ¿?C<ÜDHÍ-]~ ‡ÉÇ¡›ªÇé^{k[WwO_OwWg÷ÎõúX.¸£•­ \æ!\´[ÐȺ'Ü„‚Ë•¡ÄÛm(ÌìæÝʉI o¼¹Ð¤%awò"ú°ä2^’YFÒÈÌÂïSD' ƒ¾n‡ :.¬ûTªÍ͸f 26%Yœšcˆ$rÈ\ä( –€É’ ¡;¾e J0UÇuÖð5סã:zhïî—Ÿ~äŽïí —t2AbRW~|ê‹ß¿ãá'wíÙwˆ0úʈ³3º¥'tÑJBÕÁWp¸Ò**ªêZZOtàvaWä¥~T:Laš\™<å´š-bœ.2e)€ÜŽ;½6ÜÆ°»T•s£(c·¡LpPÏs*ø¹¡š)¬QL²nšeMXA•Ü”TYÅz¼ŧr’O`8ã7ÃÐÎ »e°¿§ÒÔk€²U§ãš©b#WK°j:[A²:çCß“ÚZBA rÕÚÒ\o¨8vhÿË/<ûÈ?ºéÚ‹¾pøçqRCÛˆH]úøèç¾ô£Ÿ?üÄK{ö¿qmÈŽCÑï#‡ß,;Nºtä‘’¨ÊòŠSs[{GwOwwo_owWo¿ÙŠFPÐ.YÑk= r‹†#.ûÕå*´àþ ç‚~ Yè€0»Si´Õ…Ääb8Ǭ(Ð(íDá’ DdR°4~ ÙIPžep˜WekÍ­m-M¸nHxTD@Œ øjðàw«…"é·\ßÞÕ÷w·ôËŸ}ëK—>Gí@ꊫ¿òí{~æù=¯w9~b eÞFì@êRǧ¯ûÑ÷=óÂ˯¼¶ïà‡ˆ¡!颎#}““wWšº‡úûPöß‚ HwEðØìÈ…µC=G’vHB(ÉâD~¬Ëå$²ƒÐY¦(L>.‚¸ò¡FsãöÃØ‘#‹ÈrS,CF|nâ׿Ä^޵Û–AåfêR@ÓÄ‹¼ Òî뢜 Ô”¨åǰÇñâÖþq+JW PAÝV¾ånCèØEé’å„Ê·u´]‰þXï©ù!÷œP†Êãoìßýò3ýâg?üÖW.õ¬O ÜFì@êRÆÇ>ñ©Oí{÷=üø »öìÝ=w·…`‚î©¶¡©¹µ£½­µ½kˆ—Y ÈÃÉaÂ͆hØñØÉ^º¡„¶3X»¹Ü4€cS¦#À ÅH<+JlVtáu`ã$@=G9œ.Æí@ÑøÂŠ ;‰çY<£r¹¡¾cY^@¹f›-TMBèùD‘g9% ¢n¦Äº§³¿½©­Õˆëð udc²Ž,IÕ×nQtó]ƒnÍ åd‹ãÙÝEÓ\2lزL@Þ:¤)cåÑC¯í~þ™Gî¿íÖoé²ä¨H]©ñ/Ÿ¼úúo¾õÞ'^Ýûêî½ß îèGޝ@x¸€p:ÞÝÓ×ÛÓ?08Dtö,PÒQP9¬6È?†çÜ´$¢J‘W±4Ãû™]¬ ¢,å¢9"®‡Êav ^çmwRÐQô¼î‚æ$ŠåndSذFt(V!7!™-Г—fú'Èp¼¬ùs)´úÞ/v u%ÅGn¸ùÇ¿yæ•W¼Ykl<Ñ5€OÐÈ Y(Š6Wdv¸úeIõ ,°áPüÕMJÎá7‡õ‹yIbU¿å`OVà!p•ãv­ìSYd8YSQ‡EÒÐ\C@ qÍ—ÌÑœ¤*<9 ŒBþ"Š{4EQ.Ä‹s Ï‚;©7ä Váh2ž$ñèÊ‹óÊøãL #¨2¸€ŽEÞ*¨ È£ Å x%UV¯ÏçW¡ŽSUo(¤ú4E‚¬=àó)ŠB»à¾ð¹ˆè“DMT¿ U$¯‚§³P×AM9m¯Ñ‹€EA2È[PÑÑ6œà;8\×u¢w¯ n–q ª*‰4-ªU€f‹wYûN4×âæª³“A]#…Î4¯!f:«ž°"*ôÃ]€Tþ>Çõñ:ÑÓ­#u” õÕe{w=zÿþãó¿¤ÿ$¤.Š6Ååþ]šøçÏ|óæŸþüٽǪZOôô¡áJÀ"…Îa§H_ƒ"z8jðx=2J9H‚¨ˆ¼çI2a9Å£ùUžÆ¢S´@$¬©JPÓ|Á€æÅ¤&ùáH(‚›%@*yj*å`Ä$¯_…rr™?ì•áo½QYR$@*‡Ü1'Z Ð Ká²ôFNu ÝÖŽãx«…áœN+ôu8Øs‰¡Ã ú<^x¾"ï´öv65R DtÞq>a ޼„( ø"}•¤ŸÚbKøry®›¤h¬7Ô64@õòs¿þÅÍ—Hüòýãz¶ï ÔEÕåþ]üøèüøW<þÚÁc†¶Žî^¨¯‡èHc¶Z­ 2Ü9gášÇ WjH<ŠâQá ™IRT¯Ï…›èÅU Žùý!¿WC±p8à\…‚š/úý‘ˆ_óª€*øªÏ«ù4UõàÄïxÅãÓ<Š ¿¼`@…ü(J²ÀÁD–{<vW.¢+àö» ‰N—Ëa!gÌvœõ1º sªŸ¥Ü¬æe̽-õõDkÅøž ¬ r”A=Çr¯†€«š‘øŠcºý.Ù<¬"tô*LgȨ%F7õXzm×cÝñƒK%~ùþñAêÿù“÷;ÚnüÓG?ù…ïâå×Þ¬76£Ä^oÿÀÀ—ÎmPYñÄ6švãt[$‰ ºEÄüðù¼*ÀLôÆ}Šªx=HòV¼|HQÀ’*{á€×çõÅ’±P àóz<¡hЦyŠ y ²˜Oõø}Pjš Å$ÜGõhAÒzš"Ê"th¾°"ºÝ‚âWEh®ð æ4x\¹G)x °[­:é–Åc2<îu+šÅi)\7¬«7™–zÂèÃA8ú[ã.ù½çŒp\·ŠÂ)  ©QW¨®Ô%ŸPåÙÝXKk‹©®ìðÁý/?÷ø}¿øÁ·¯¾tÊbïѽøÛúàãrƒ.f|ü›7ÿäçÏí7Ô7Ÿè²ØmCXí9)›§ ÔW¼‚ vŒ›$´ÃTŸ×3¤*³4«Eü^ ôK’ªA;ä F#a¨¶qH;Z0ŒG8ñªX±D<—„û`òòûƒ90ÌEBšò”5  à‚쀠i¼W€¯ÊCkE‘Á Îñp¸çF§D+±Ê&ìY4 %Hh€¹þ¾®M€ƒæ¶–æÆ÷¤$PÇ©Žx[_€”.%q\Ç”î‹æ:û¼R—ÇDÇ)£ ðNCå=O?úË;o»åÛ_úü¿\î(‰R;½ÔßÿvÕ×ï¾ï‰Öµµ÷ôö[ì8 ¶ã†ú~"ÓOCm%Šœ‹âq8 J<Í ªW…ÔÅÊPŸÉ˜ÃUÓ"¢ø5Õ ©’ì…Oó{½¡t*Ò|áX*™ú´`6‘ˆ†sYÈEÁD:hZ8a{Y-Eü¾P< ˆˆ(”Єù|ªKŸ—çák#¿’Çqn–HA‹EzQîW³¬f+jøAû‡Û¾™bØí¶ÁÁt 566·67ɶnŽºšjC­~2¥~D9Mw&R˜ÇËŽÝ:èÅ­0qî­GåLüJ†Š²×v=rßm?øîׯûÌåã ý·¸€ˆ®mÄûBŠôR;Ún\ÿýû{éh¥±¹w` pÐlµØQy•A7@ôËÅ5$YÜ„àQ\R‘!Ehª(ip¡{¡ÓÁq‚~$îãX>Æ£ñTDó ‹Ò"‰x<™MFÂÁ`( #él:“ͳÉX8’HDBáp(–‚pŸx2“MD}¾H(‘ ©‚ä‰FcQ- ûƒðü¾xšç¼M•᩾±{ó#VQŽá8§ÃÍ¢œ¦“¨hºìd.‡ÕŸÚzû;°s2ê ÝâF×ðl¨Ó%%*ÞÓêÓ7”qCª=†«uÓ¬rÂóÃuäª×7[Ú±ª.;zøÀKOýêöoýºÏ^EÆŸ B¿¥÷â‚èOnßé¥þŽøçO\sÇov,onï@Ê7®6Ù)ޤà5Ýjµ#ËŽædÅ…pº' <¤¥\äŠíj «B.ühįx}Á d˜P,`‰%5™Ž…£™L2¥^( Ãét¦0’OgR±Xà/›IÆb±D*Ë¥âñt"Ïúákª¡P, 'ãñ8 Óïóüá„$‡>,7}>Iõù¡™ãYHh€ÞE;ñ ˜“PRÉ…èr8XŽq¡'üGú;Û›pB×DöLFNèÛQÐJ‘å\\ÒÅå]\>Dd‘!z.ÈãЯì8ñI­ cvô¸16vöt´6T;ôÆþ½Ïq¹¦ÿѱØÔŸ¾áí>ÔÒC´”[¬;ɬ,ÏÙ­=’ä‘D¤$€4ãeOÀ«B. $"~ >h‘¢¿êÑ4_$‘ƒZ.žˆGá]4‘Ëf“ÙhÒR!“ÉgK£#ùl‹»‘R¾0\(”йx8™)Œ’É\:K éT&•ŠGS‰D ‹Ñ@8KÆH~¨)}þp  yý‘@L‘ð —€^U“iÜÚ…Ëífd¨ yŠâ%—ˆ»;P³7âëQÿJ¾ú†¦FâtØ`¬«©Ü²ç®ÒÑD2ú$èÞ Ç‰ÍM±@Rñ³njéèl|sßž]/>õÈÝ?¹ñºË³¾ûWâ†ÔNá÷7ãÚ›î|þ5CÓuÐlFý”@v£Ñ:ÍP¨Nät±R¸%IbáJeq!VTÍçóȪ¦ùUE Æ¢á0\Í>Í*æ‰t*>ž‰%9édn8•ˆFCñD:3<œ)–FJÅ<Ü::1: ŸgÇÆÇÒ‘B!ŸK¥b©|1™-•†“‰d&™LgSÉd(Œ'"±X Ò\ ”HE‚¾P4W CÝù `æSI•EXÉŠFš&)2‡.ˆ”Ó ¹ z@QVݧm¨¿ÿD«‰øq è2ŽÐ¯O¦HÂB]ËJ¢>MÔ&ˆ‡ÞDÓPbÇVvœ,ø’AŸÑh"˜êèj1س빧sïoùÊ¥Ö“}ÿØÔ%OÜ|ÛS¯oí"î¸f³ÍÈ” 7œñ1´›fEQQDžW²ÈɯWóh T[¯OÃû‚Éx:ŸŽt²Éd*›Š†BÙá‰B.76’K> ùB~|dx8ŸËe²™ÒèÈpªXJ¥GrcÅ\an~¸”)b†š(e²Ùtò]<Ë@•‡’1–‚‚ÒOc É呇ðû½ÐM©Q”NY’!¤O`ˆÅ%D”î##íœ6Kw+ºˆÔÕÐä[(¢½‚È0ÕVy'ä!¶Pæ©B÷Š:¾EEB2Ry%¢©LΛŒDL¶¾¶æèžyâ×÷ýôÖ¾tÅ &ô¸€ˆÛˆ¿Áž¸(n9—ûôƵ7Ý÷Ä¡šæB:….2ðPǽ=ë&ÆíN–xYâ7¯úáÕßãQR^Åãõû|@ ×a/5ë IDATv ö{|qLM‘”w‰H²˜‰Å"ù‘a¨úŠ#¥tvd$—É—&KšÂøäøØX1—-NM–ææf&‹¹ÒÊÂäH>?=:\Ëæg&2él©Ê$R™t.åŠép$“Œû´h<•Žg²ùÔ!H~‘@À§yYp_—G°+¢"q,ãfEp9Ià•­vs«QçîAviÐgD*¹}FÝ¿ºe˜ ïA ó’nŸ@‚ÌÒq…‡Íím&]߯òؾWž|ô׿¸ã»ßüÂg/÷OõÄ©‹—ûôÁÅG¾ú½§öÖ6¶w÷ šqõZÁ!2š€×whEDÙ«2ÈŠÅY\;÷ÈЭ@±'I¯Ï "àSÔ`4 ‚¡€æËf‹Ù4΋ÉÒx¡˜Í O‡ ¹|:_,L†G@Kã#£ã‹ë«ã#œŠ33‹ó«ËK3Ós‹+«c¥ññébq|~a²0R+䇇áA€ŸÑÒðh!—ŽD Ãéx8š*ŽgS>1Š$ãñD,Ñ|ª$ÈŠ7œ «Š€´Bôe¡„’^#P"Éf5÷wÔ@aD¬¯ˆÄ„‰øZÃ-hÄAƵuä¨ÝnÊo¡‰ls”‘™–{-íÝÝ­F"5öæ¾g¿÷ç·çŸ¿ Ú—#.@ª}±©<þéÓ_¾ã‘7*Û:zÍCv'åžuÈbw:n ¦¬M? áI¢¾Œ4ÇΠÐòù}ΰ½áp(L8 ”kIx_ÌLJs‰D.?: ¥jbjffiajfqjv~¼Tš™š™››™˜^œ=yryéäÒìüÚâÔ€j~afbª46=312 @J ¥Žg3±`¼†ƒ‘D6 õe8“ˆ§àƒ¤/À«ª¬B~‰ì‡H‚€L\诈Ù!¾bX;Û1+¡/±¡nK9–ÌÁ°4vlU¥n@¨{Ä9Tì;vœ¸¦â”ª± ÕÓf¿?vðÕ'ºë¶[¿ö…˾ÊñçqRmÛˆHý£ñ‘kn¹ó±ª¦¡¬³¦4Ü H¥ÃÉ’‚{ï »M’ªHª|ZÀÕ4-/‰EB‰D,’ʧ’Pù¥ ÙL2U›.•JÅ|±4 ¿§ÆF'æ——'¦§æN..,­¬ž\ÝX^œ]?µ23uryqîÔÊòÔÂüÜÄÜúüÜôìüÜâXijzeabjb²TÈÏOŽ'“€ÎL*“ Gâé‘R.•Nd¢X*À3«0@IU¼~œækŠä á @ž£YYfñÅbh¨³ÝØ@ÜwI¹W‡²„òZk žÕD¨å©üt.E½Î¢¨$«‡D®ùx9úˆìeSSSK뉵‡8xà•gï»ë–o~ùrJLüÕØÔ%‰¯}ïÁg´uv÷ö¢¾?Š9°´ÛåÒ_Ï4'H‚ËÁ p$Ê A/%À^Í  òzU¯§}>¿×Î䓉l¾K§¡±)ŒåsÐö¤Óc£SSc“#Ã¥âÈÄØøÄÌÉÅ™ÒÊÉÑѹ哧4‹§NŸ_Ýxë÷k'W×N-,­Ÿž;µ´¼zvqznf~qyyqbn~~zaj~j ÔT6™LO.ŽdSIHQy¸9–Œ%b¡D6 úü±¨?öAÞ<©ÐW" O“E´Çæ<^¡l–¾f#ú6™3Ö@váÑJ7á st @QóŠ*ý¯kÈš­"–•ä,ªZŸf N*‹µÔUîmïÞWŸ{ìîŸ|óK—Wcâ¯ÅHµn#v õƧo{ðÕ#u]]ݽ½}fô™F qÔ4F\Bb‰§Ü¸îGÆçPò¬à} x¡• øUÕï÷øÂ‰T._ÈdRÉl>.Jùb6Y(Žnr¹±Ù¹…险ñ¹ÙÙ©‰¹™é‰ÙÙÅÅ™©¥åS§×V6Þz{}ý¿ßÜ<·qfýÔÆÉSïž9µ0;5» -ÕüòìØòÒÂÌìl©XH¦ ¹\6WËÄ£©Bar:Å’ÑH<›ø52 ¥g0äóø|²ÏÌëÐûá‰ze^P¼ÏÛ-½õDq¥µ¥‰èô!¤P}O9G›9TAÚ2àз ðÕº,s…îw¬óÜVܲ´n2U}õå]/½ðèý?þî—>sÅ&þ[ì@êÄ·îÞ{¬¥«¿·oÐ<ˆä#bÖŽúFnšr£'y ØóúIàAjÀç‘OÈï BžòË¢æ „ð”( &3™t~x$ÎAŒMæ“Éd"_L¤ò£ù‰é…Yˆáüôò©3›ë«§ÏÌÌ<³¼¶¾qjýÔææúé·×NYÿý×7VNžkãï®Î®¯ÚØØ\_™\˜›_›™™Ÿ}kse¼01·PœœÈ¤²¹|v¤OÄb©X8ÿX,‰&± û¯×‡«$>Çå @Iäx†²žhF#Žzccû‰öVœLÅ݃á=Ÿ(Â…Àa„>4G߀*²¶KÜw‰‚aÑ6˜°âk!òd&cmõáן}â‘ûõ“[oøâ• ¨?TË6bRÿPüÛ=ÏW7÷¡·*’C8œn^â‰4MSX²7¨iª,ÞPÀ Ý¿ÄÃÒࢠ*JÐðG"(ˆÅ †³iÕäØp*•/Žä†GK¥芦ç§fçf——Nžyksye~aceyíwøÝÆêÆÆoßùí¹Sëç~{þôé••Í3§ß>ÿä«Íµ•õ3g6çæ¦&&ff×Ö6W§çfF‡‹ó “ãùLa|b¤ç‹ÉX,7&£ÁH4ñŒ ÊR-¸ìñ†BOÓ¶¡¾#Öz€„¾u»xt·Akx©ÚZT˜8Vvam—l¢R3îÃWëóAHs­­mmÍ&ÜY$³óǺ÷g?¾é›×^65Ù¿;ºèñû›z­Ö¡A âÉ‚4s-òÈ…Cr)¦,Qæ ³bE€”Ç õ”æQ!=£>Ü^ D3Åt8·SÉP8ŸˆCa6šÏ%SʼnÑDntr~òËøðäÂÌÔìÒòü©S³ó§ûöÙ5@Í™ó¿{ëÌ[oýçùwßùýÞ]=ûûÍ3¿;»¹øÚœ]9»¾þö;§×ÖÏož^]?·¾873³°81>^ŸYœšœž™-f²¥L&7<<’MçG& ÅX4Ð#C7ì÷ª¾`Hóù|’àÅ+I°›;ZM˜“ ð#ÕM3™ ×Õ767Ö¿WÝ!­¼K¿2}m·\Gl¹FUêV8õ ­'::;;;Zk*ËËÞÜ¿÷ù'~uÇoüÚ5Ÿ½ü-.@ªy±©$~¹«±³oÀЦ–¡!s?ÚMÛì4‘’`yÖM´‡xÝ:I–T¯êñ{µ`, GPNE‹$ Ùd`æÕâ‰h$ÅÆ&S*¦²¥ñahx¦—¦F§fGÆ''–ç§fWάÎmž?wöÔòêúú¹?llœÿÃêêÆúúæêò©³ë«gNÍÿÃé³ç76Þzçí3§VßÙ8szuíÔæêâÌÂôâÔØØð(€knjbj|rl¢˜.ä (I˜Ž„bQ¿?gAÌ÷Ñ—MàU‰U™èjl¨o4aW×`jnniÓK?芚ZRÐPaÃDª@r´‹˜zO ‰¸²¡m‡ÌÚ©®îîΖƪcGîÛýÒýì‡ß¹î Ÿ¼"g}zì@êâÆW¿ÿ@Es__߀Íj0£… q0[YކüäF :’ÍYäp³œ¬)ŠGö‚¡H,¤Ê’(…¡@ÄŽÅó…X$/N¤¢±d®˜ÊLM³¥é©áâäÄäÂÒÌìæÙ³§gÖß:½°ñö©“gO9{úܹók‹³+c‹'ç—Vf&¦ ßš››šŸ]šŸ?wfí­ÿszã­sçÖOŸ;¹±¾0?9»´pòäÊòÔôLqxruujjld<—Hg'†‡'r¹|&‡,‡†Ê‡ÄŽ€¦ r”Íît˜ÛL$Õ’÷ d½™JÕÖ›šL(2+Q8å«Ö—â [‚Êê:Í(3«‹É¶47·¢juW»©¾ìÀ«»^|ú±_ý즾t%êO Õ´ØÔߟ»ëÉ'úÑ Àjr8°“¢Ð;ÐMá¯ÓébXIVdIVy†á8¢Ö¢ª²ÀÕõ€‡ëš'à‡Ô”HD¢©t!Ÿ‰E’ÉL}™ÒØìT>8™›Ÿ]X]_9¹òΙ•¥Óëëo­oþnãäÊæé¹Ñ™©ñù¥‰éÅñ‘ѱRi.U˜XXX[^Ÿ;³>¿´öÖù?þñ­ h¾VΟ^]ž˜,@§Æ‡GVON†ÇJùôèôh1+3éT©@"ÎÎç…¯*?¯"°n»ÝÒß\OŽw ºK(ñ©iÚ‚”±ÑÔ@ …»•zºBHm!j+ ­ÂM_¢Ö‚q¢£­©¶úÐÞ]Ï=óè¯öýë¿ø¹Ë«&û·bR3nùÕ¡ºH‘µM]'墔äÜN»òU?ÎÓYÓx†S‘fDÊé‰ì‘æ=²ä „BÁ Oóâéx.çL®ÏÅb±Üxadb¼€š›™ž_,dfç¦æ¦WÞYß|g}éÌ»ïþ~ýÜ[gŠó3§'F³AkO}Ù.xFŸÂmòk_{å‰û¿YiâãëðUΜzësçÿö©ÕSë«+ c“ ›k³S#£ “##¥üðH©46VH&R¸?+¦ã‰L!“€$ ÇãÑ„$H’ôÓæ9û@[S}½Içó!¢êÈ ‡±ž@ª>¨­®®6lÙu“^P Möø{Y ¥ÐŽF¨R-MÆúʲÃ_~îÉGÐ+ôºO^„‰ÿ Õ¸ØÔß×>ð|m[ïÀàÅ‚b'¨ÂJ¹Ð߉sÚ‰“ÍévqŠGaubi”ó Ö“_(ÐÉëÓA_  „Ò©T*šLGFF‹ÅRaj|jj´P(ÎLÏÌÏ.ŽM, Ó'×NžÜX]Ú<³ñîï6Ïž>{zsbj¶À·|ú¯þ¯¯þÙó»áK¢46ºzvmeõÜÏmœÞü?›«K£Å±³§OÎÍÍ,L F&ÇK‰dnd8žÊ¤!O¦cÐÚÂB£áH"–ˆBåñG‚*Uko» úôe$NQõ¤"¶Q„¡S(ªk‰­5™Sè )ôçÀñD9úBBkmkkCÍs“¡úȯ¿ ˆzàžŸÞúåÏ]¹s‰­¸)Ó6bRWüûö?Ñ;h@HÙP­Å‰Ž‚4Z@Sv]­•r EæX|‘gq3B‘5‚Êzñh( øÝçÁD4r<ËFÆ'‡ÇG†Ç‹Ã¹ÜôäÈäôüÌÜÂìüäÜÙÓs“3sÓçV7ÖÏœ}ëì©?ž›°ýõÖã»G[J¥•³›k›§7N­ž?{òäÉ·O-Í@! ™jt|jGŒÅ\4–J%ÓÙB6žÈÆýÁH$œŒEcñ(®C~R¯­­s’bqnNª¾F"Ù§S'jt&”…µD\Œ÷V¤ôQß1]ùe^ ‘:q¢½­¹Uåo¼þò‹?üà/î¸åÆÏ^Ñm‰H]¬ø×¯=º¯­Ïj· ºq{ˆ¦ÑÍápÚ![±Ä ƒg^¼$ñ*Ê´Hq³ñz¼Iñ!Kß±8ÜâÇ6*¬j±X(’ÊŽ³™t">’‰ÄÒãcãsk3ÓËkk§ÖVæ—æW6–¡›Z]Þ<»1sà©÷y’T7È£ëç6—οóÛ?lœÂ“ßõ•$ÕNÏÎMONÎÎŽŽeRÑp(‘ÍfÓéd:_*¥3‰4z1H£È=„vOU‰§ºO4°a"fŸØK5465·µ¡¯µ,¾WÝ]tèÀ­Ý-"_EÑ-×Ïw±Ä®«¹­³§§£ÍTYìèá½/?õè=wýô»7^û©KöãûÇcR+þý'¯W÷Y6ó …aG»íÐL9¬ÐUÙu34ŽôuxU[7£jšæ÷û=šêõBÕˆ&b¸}˜ÊÅ"!¯‰Aý•. '3ÙÔH1™ÈÎó££¹âÌâdirq~éÔúéõµåóoŸ?¿¶²qnc-åªûÆuí9XmraãÜÊüÛçά-¬¯¯m®­­ÎNOÏŽOŽŽMÍÌ.Nåò øWsù\6›ŠçƆ`Qºˆù¼¸}âõû$AàYG‡©®º¦®aË0Ê` ŠH­m¦:²`ˆ†(Óª«'ì$Â’¨ ì#r$UAü 0¬©3¶utõöt´Ô*Ž—:ðÊ =xÇo¹þß?vÅW}ÿëO eÜFì@jûñÉ{^iî4›ûûú­v(ó(Ýn)ʆ½í°Ùi4‡BN†ˆ²Òè­Ë ¼è줩Z8‡ò* ¿ ðÃ+ˆ9!ž‹¥Š¹d"]È%âÈ£.e‹¹L®°¸07;·pjóÌæúéS «+§Îž?sîݳçÎÿ~unžíìãš †²×}ê‹ðäöüf·•MÄ‹ +gϼõ»·Ï½unõäÚ»oMM­,Í-ŽO®•&fgf&‡‡‹¹±±\:Y,$ã±T2•NÇ1¨G™¨ß£Ê²ˆª~Œ{¨¿½©Î@&Èrm¬%Ü (›[©¯‚$!´¸èQ$d"CÙ#HL¸#u¼¢z‹±TÓÐÔÑÝÓÓÕb¬,?rèàÞÝÏ>~ÏÿñÕk®ìAß…ØÔʼnkny¹w {ûì†v ›±<³£|‹Ëfq°21ü„ìD»œå&ÆO<Ç«D@Ù T(žŒüþ@0ŽG#-UŽ¥£‰\’D*—JDã™l!—+槦 ô+ OάÍOÍ/.Í<}úÌÜâòÆÆ™3Kgßùã™?þç&ä¯Ñ\!쥔¾îЉøðÔÈÄìÊê©“ë¿?öÌæ©…“‹'Ïl.-ÌC²Ë—f¦GG'§&ÇÆÆó…bzx$¥Óá(”›Å|<–MÊ$ƒ^AeI–—ÝÖÓ'N8¨3¢,@ª‘elhj®7T T?ªÐgä(ÿPžE™P Æc‰d*ž.¤£ù\*žÈffÆó¹á"Tj“ËóS3¥å¥©™å©¹Í“+§N¯,ž´ˆ¿çÎï\…HÉn#.@ª~±©mÆÿ¾çùÃ=f ‹Åý“Õnw8Än*b° Õ2ÑeYÝð±ÛaãeEÂ!ºGÞƒ{‡œP@K¥øÂH™õû‚Ñ7"#=M&P-,‘) /¬ŽC£S(L¬¬NÌ/—’Ë›s sS“ óKgÖ— {^;¹²tvqiíÌIøãÔ»gÎoœ^=}òìù·ßÞDfíâÙÕµÕSS£css#ù|)Ë—FPD)369RH' ÆB‰d<Åâ1À{ ÖDI‘ì–þ®fcm.«ÍëëjëMºA´Vu5¸oˆ˜ªH½y˜` S9äÅQ_Ù‘7áƒ*Â_j4Õ74µ´··ëª*ŽÞûÒÓ¿yàŽÝð…ºÜ?ÓmÇHa¼/œ.ŽZËÿ•ºú¶ƒ5­½½æ¡¡!'ä(f'Bëcy‡ÝnµRH‘E P'íñh^žyÚnGŸw"0.Ë(à} º¯yÑ[-½T8E£þ@ÞùQc–¨ÃÆâÉdfzvb¬”)ä2Ã%H1ã¥É™•¥±™¥¹±É¹©ÂÜÚòÜÂòÉ“KËK§Îœ^Xxwmt|n~f~öôÙÙ¹å¥ÙùÅ©‘ñ‘©ñÑåéùÅé±Ù©bg©Üh6O$Ò¹L$ˤRрLJ{ZÐKAºÔ4ÀÀÿ UúêÈŒ˜Û@VÂ3^Ôí#v7xºKä±¾;~ìè‘ÇßLé¾»[ÞQX–—W#ë¼½ 0e‚gj¨©>~ôà¾ç½ïö}û†Ï]QJ}ï U·ØÔöâ{V7µ÷ô[†ÌC¨NŽ£œ7šÈ8ÐJ€fšá$‘qŒÐ"”gÝžWá¸BPž£iVñr¼${=¢ kþH<DbAÔzõES‰8,N&â‰L>›‡êl¤0œ+NϤÓÅɱÉÙ¹™©éYx›/M-Íͯ•ÅŵµõÓcSK‹“ÓóóK'ç———–§&§æçJ#¥ìÄôôTir¢˜MC2Ê冇q‡$“ˤã¡X: Ô@:‰A#§yPC`i§¥ûDCmmýŒŒº¥!’&ôýø:Ô“­Åó¨-žÔ}h OÈç[HÇ+ô½^CCKkÛ‰ö´qk2ÕÕT”¿yèõÝßç÷núê?öáIR;ºqõ½»Mmf›Åluà2‡•Œ)†£]Nû¡s»›rºÐ‹“s»y@O»P±™ŒuH¡ß*+²êUÑëñ†ãPv¡¦r"©¬BÑ8|µ_<[Ȧ²Ù\®8:^È2Ñxffj¤025Z(MOMNN•ÆÇ'[ ð{|vu|zt|rbe~¶4:7³8W™˜= y-?:3Y›˜Íz£™R.•Éä3ùb*FB¡PÀŠ'B~¨FUE„J9œ]­ÍuÈèkÀ® uö¶Ö ‰&Qb1Öªõ$…4‰£G`Š:r„d*”A:^¡ê‘/ÑÞŽžØuUåGß<ðúËÏ?x÷n¼þÚ+x•ãÏcRxÜð³ýu]½ƒ6ëà ÝiµX\nÆ 0âЬ¦\,ÃBOï¤ÑÉ]È""~¼ÄŽÐ˜¸Ìð’WxYàE 0¦üad©BgNÆ£„¡P8 §ÇFrÉl*Ž£KG:«Ra$“ÇŠã³Ó³“éÂÔpº0\*ÍŒ —ˆJRit|||f:š™™ÈeKcy€&ôO££Å|®˜D2Å\:…Ú›1€‘×ã &âaèåb)ŸΠ´ôuu7›ZÐwׄ†Ð=5á!”ˆáÉê‘3(rôDDĈ˜QéÃ÷eÇÊ«uU±†¤Éž,nÖ—ÚÿêîŸ}äþŸÜü/\õ‘+u÷/ÆHÕn#v µøþõ=ýf« åÀ CÓèV˸ Eá!…;¬ì•y@æ¤x}Ü%ôtRŒ„$YdÚ-ýdéÞšÇC'¥y#èòRiT&åó…2©p,WÌd3)øÊMÌŒ‡Ó™Ñát:“+ÌÌåR¥‰ñB¡I&ò¤]dsÙá|û‰SŽúH¶;úÛño7<ùfW÷ Êâ`pØgƒ¶ ÕŒ)7ä)7Ë:(šxtœF®¬PGÑ´“bY†ƒDÆ‹ªW"t?žrâ‘|^ ­C¦DÂïU¼©€É§¡ì,Dåã‰H$šÊF©L:“Á…ß‘Rnd$•ÌçF'ó©L¡8:V+¤RE(ÓÓ#ã%(Që9O†Cñ$Ô|ùLôñHz8›K'“ÐRªü¾0Z-zƒ‘x<âõŠà´ôt´`­×‚&=G5šÐHµ xYãl½²\%5B ³“ÎéÓ½áñ‹¬:4⬯©îèÁW^|þé'~}Ï¿û•k?û!9á½;ú€ã‹?ØSÕÝg³X-VN¢ ¡fh”>wÓÐ3vxYdÉS%wi—ÕêtãQ/Ͱ,Ë«&sv;t˜ÍNVôx\HÒ4¯KUÙ i^¿¦Å#ÐÞøüh £i(£˜X’ù±tªPÌEbùÜÄDZ¢‘|!ŸÍ£´e:‘ÊOL—JÅ\> ø+@Mˆ5$4c™D(‹d é±hÔ§…b‘$ÀX,¡-N8 Ç|*ç¶š;ZL(µ‚ÝSrÏuy1ƒÎ“¨&Ó¾zbYŠì=²edŠ—:M¹RxˆE¼ÜLÍm­ Uû÷<÷ôS=rï]·Üxí•âm¸ý¸©šmĤþvüô É!«Ãå²ÙYêsAöqX‡(—ÃMM3ètÃѼÊPn‡>„÷PÒ ÂŠx‰"ŸÖåtAÙGû9^ðh‘XP†bPó¶<²,ª¾ˆßç÷‡Ãª &ã>¯ÎÄãAO0ͤQÍŽÅc¹L6›LCc”IçRÑT*›ÈeGÆÆ‹©x"Dc‰X.‹é/'ãá`"—Œ¡N$ øƒ8•P}Ñh4 *’(ʪêU»µ³½±¾ÎÔ„ËÄ•ÐhljFsxb´[^YM–¥j‘vn07}Øw„,Fél¨5V‰| xxsKK >î^_wìÀÓ>pÿ}÷üâ'ßûÚ>ú!õmŤ>ØøÜsbÐb%‡.ä¡7çÑÇ| IDAT´m9N‡‹‚Ö š)œõ9H6Í1’”ÜEÑ’ˆ¶2N§‹¢pžTqŠ'Òd^UQ ûÑy €„ÊΚOQÂÉádÀç@Mç÷úü¡Üp"êC ÀH,IrbñB!…芠jE J¿<-“LÄà†p BðqØކ‚±DÀçG²Á %Å0)ƒ¡pÀ§ðX¨²¼LÛ-ƒíÍœL˜[py£¾¡¡©Éˆ‡º• \‰BþyUeeumc#@ 9pʧB¡j3^UMmc d8½¬‡ž •‘ªíyø¾Ÿß}×Ïn»å[_üì‡Qÿ©êmĤþV\}ûQÓÀ y°pmœNÈ<œ{hÐât»iÊýP¢9‰wZmĬ ~»NZRe Ò/˧8§¥ÀP8Žç87#{šÀ²¢" ªGRD–••`DS0g(Z©A„,[YñjÁpدù¢‰T-U_"§µÉB>IF£‘H0 ,IŃñb)‹CÅË  „×—Š(ª/ …4 °5Àë °2QîdCV›ÙÜÓ‚-T9‡2}f=¯Eu–ã)U:¤Pº¥Ž¸ÅWÏÝ­exœIÔèîðµ ½æ®ö¶¶–¦šJ¬;º÷¹»~tównúÖ7¾|íG?\ƒ =.@ªj±©¿·OèÑ|ñ|Ð i* ‡#PÛpÒX0‘Lg2ñX4‹…ƒ~xNªg8/$+­ ½()ͲÇÑŒÀZúºðò75Á[²%šæJìáIÚÙÚ*DE±ZÝM šÈõUé èååDZ¶œ8Ü(Ö›:{ûº;ÛÛ[LUÇ~ãàoxá᛿vÍÕW_õÙ}Øf}zì@êŒk|°J>Ë Ùåv;]V аfi ­QuZ#Ü•gFòxÞí¢ñ‚eh´åYÈS6«àõr€,ÊM¦ü2C1’WpyÐÒIäq.ÈÊÞhÔ£…}*ÏAÍ(©^M’ ñEÙ£©¢ì¢,‡Ca4¤Rdø<£>MRƒAÀ(•Åî*‚– ÁÉr²7ƒº6xr²¬zd¨< -CqõÄÕn2 •† z(ÔS66Ad¬#B踦óÍÉþ®®ÔLލP í8*«ª¶ä/!Õ› T¬k0µ´áF|‹Ñp¼ìÐþ×^~ù¥çüÙ?tS¾? ªÜFì@ê}ããß~ ²uÈ2Ôß7èÀ’Ïb¶Ù1.»Õ޳>¬âàµÞ…”$ÌYPW!—OUYj>¸? ) ÿŠTÞns¡9"j´nÞëQE€žÿJd †‘}¡”tÐãðxå³¢GR>Y}á€WV<´Ê…QÆãÓ4¹„žêG 1T8 £‘¨³^ (KZ( ð(ãQ· ™dRžŒWESC·›ršM"žkDb¢©µ­¥¡Î€ê±UPÊÕ\P<'}Ä+À°µ&¿¥4Q®ë3×››Ñ±¥ :©æFCeÙ‘ƒ¯í~î™'½ë{Wž Ûß;úàâ–‡^kï³Ù‡úÌ–¡!+ÃC7å¤Îí@xм€}¾Ú3ð!ʼn2ùdE•¡‹B€å칉uYmŽwºh·Ý2dwq¼(*~?À g€ øè×oßWÝÒÛo± ô ÙRÐ?ÑPÉQn‡‹“Pòwäy¸V]èÏ\8YU¯À±4|„y‰X‹ ÜÄ£`:z¹Áõ-²”Ó…ð<2wCëDt#•îTv7Ý ðCaU Tt‚š+wЂ¨ð˜±Içwzïð¼(Ca¹ŠcXIbáIQðÆŠ"‹‡2SXK«±qP¯ïBÙgD…ü¦æ&HWõ5¤Ì#Qd:Q¥/Åÿ¤*õýCRñUVÈ.U}KÇÀm¨¯0=UÙ¡}{_|ê¾»oûöõŸùç¨?ÔñmĤþZ|ìºoÞõDukï Åb3Ú }²SŒ¤°ŽhAËÝåp³Ð—@Š`ѳC Ôt?a d º-v\dH1zâ\Ð_1Ä0Ña1» .»ÃM¾4èPjGq Š…\# Çдp%Xó©P1hxVP½ÐJyxNöª<®ì3ŠW`1qñ˜ÉXNÂûat“BwN𗽫­¡Ë7£ÉX¯o뢹!Ñ• ‰Š ¢y‰³¾­ÙD¥>˜¨Ú2%7–£ùnyUM½‘ 7šÛð{eîl5õÕû^yî©~þ½ÿ¸þ 4ˆÿ»cRD|üšïüèáWšºlö¡¡A§Ëန$C¯Ââ° ^úYÊn£l€È|j+¨©@ÐáÒ…»ÁC0ajCwDV@K¸?+J'I·(— ]ª˜ñœÈa"ı²sQªr“€Ëö tQ"®„(™°ž£]nYð”‹S0K±n·¤Šˆ(†à)pTŠ -µqƘÂÖÊåøb¡‰¡l6ŠÖÅÏlNFA[(Ê%+.jßþì½{Uåº6zípö^Å^QTD±€JQTª E@¤÷^!=3³÷Þ{cÌ1{M@Ýû|ßùÎu~Øyî癫l·+.Û"™ï^BI›qϧ¼w!´Ž—+ Pr+¬:Yø®ƒXûnGÅN°Æë€"ËU,¥b> ûý,yw{`xäÂâÁŽw7GïºÜÇî‚&¯àÍrŽ¡UÜïšw(F,\R¹O„¨†1¿uvtttäÚ¡Ý[6<æÌK9Hé—p†úó‡Õë6î9rõ®#V”UUA`|£IU¥…ºCÏ®Š’Ó]¢ÞÀeo·óý·í&Õšœö;¨@Noá-P•i`Í€ë+j»Z0ŸmTq+\oõæÛ´}TónX ÐPVitªôøÓÜÔPÊUì [µÎü¼¶$àÕU©P OjRë*U<ÔFE¦z§*J¥ÛÅQ±ÃÝŠ[¥ÚœïиFp*É¥L"â£>Íëa3 /ÛIpð†ër–Ã{náÛ\'[7 ⬠›³ÿ¹ ls2¥Xü¹CHý¼ó§7Þݺsÿ…ÛSºHºP’ËjQbD­R£ÁˆÀÒ»Õj-<° ‚óˆF$è|ÁŠ­ó ^çeD³³òB«&ÓC_ë.Õ M;ø˜6ð Â÷KŽ^ÿá·ó=šžèó[n¯Ã_e¾¯ÊÜ„zu•ð‡+Î…¬×N·V˜¨JÉeî/±¦¯—eä3ÊŠ¬¨ÍZ)ŸM§¢‘HÔï‚}¬ÏëæaÐ@±¡„–icÇ;m‚*áiR…tmÁ\aÁîöCA/6Â!Æ”ße™~põ܉ãGìÚ°ö™ÇÊ^âGÏRsK8CHýýyvõ¦Ïö"‘-`3Á5ç (¤¯ñïpþ AÉçõ HüÁßi¸}åø×‡íÛýÙºW—¢†ú9ç/oÚvèØÙ —'欞T®$Ñ€‚A¤¬´;õ ¦ÕÀ¦ €À˜4Kõ¿{Ô[˜o4z]i- ÚÝN·E£MsáQ·Y©uT¦v„e¥Œù©^ïóþ®åBÞ/Ö¨(5*Ф`I×n@\_CT}Hj6¦²Z§oJ­¨ôaÅR!W(ò¥\VjÕ2a‰ð”Íd2éTŠ~L|»Å`0Û\˜TÀæú=.¶‘µs Ç}Á€ÇÉÞ̧bmn³Y!‹ÒbBYo6Ûno‰†¡ ›¾HN¯ßçÔŸ9°}Ûöí[7½ÿòãâw¾”3€ŽîGÎÐmö¿ŸßÞ±ïøÙk7ïLët^æg–SµBà¨ÐüÔj¨jµÝìàM¬ðú­öwæ-´yÙÝD-e<'w¨DÍþB§YQÙÕ ¶¦ª@zÏ·YMÁ¾À|Õm×è7ʵF Š¢ŒEc·U-A‚Åx :’N³lƒí„¡\6—Íæ ’B«–‹…\¾#8¥Rñx< {6£Aoà}w8 ^6ä;)×Rh i”²±¿Œ/AŒµÂ¤EŠn,——JT4R~`Ôc³:=û܉/6oÚ¼ùƒw×,“]Ÿ8Hýœ°Bê¯ÎŸ_ܸãÈñó×&fff þp®ˆ\¥Ž»Û&áæ<î˜jÈ’Bð3O(é.|÷í£ùv·ÍnúÏXN]­wça=‹­×n3¢Úì¶ê,X¬•ËÍ~·!—¨=«aõAˆRhÐjõz5•ÞK uzJ±¤V»=xpª’Öö†*‚*ª"I¥|¾P(ärùŒÚ•l:Îe2¹|.e+ÇkX¸F…S©X¼#ßuá¶4 ìÊå¢ÖÐÉD”'ƒ lv³aŽ=e!‹·Ø¨FÑäDEŠ L8óì¬ÑlÒ~µuÍêW_}ñ™Çž0ñ7g©Ù%œ!¤þê<ñÒ[;ž<}éÖ4=>¦`4‡¼x¹LSµY£Y¨,¶×åÅB£EX1©ÿðû‡ýþ<˜|½o¿í·©|@EߢºU¯`oNŸµð¨ß§…Å Ò=Ú\•šuµÒ}8ß– EâË*¦©^¯^–QÊU¥NN.7›Ôâzä*U =5rje™ •#HQÊ—°•Ȧ“ÉL2ÍÆ£¡ Ïc³À=‚TPj×ñÕ(Ÿ}Ï]n‚×pÏiÚâxš¡,_m4Mv@ŠÏup³Sƒ“HØõy<.óÜÄä¬núÁ½›^~ö©ÇË÷r g©ò<ñö¦]g¯Ü¸~{tffÆèLgKåz™¼p“¯BÝW­Öê.<êêÔÇušõnÿáw4Lu‘yÓéÎ?ú–º<È9:`Q4k4µ[õ²Òêýç÷ôQlP JÁæIýÞ£ï:e…&«œkk¢ÂµQ‚T¥Œ’U©TäRQª×©•ðÝ(á‚¡ÔðAÕŠ,Ë’,å ¥\&•ΊÅB6“JÄbÑ_Ë­Ám’“Í*1IÆÇ‰ð„Y»ÄÝi7óžÏ!r@Ú…µ„Áh±9ŸcvvΈ‚‹l˜m™Yl6ÎMŒÞ½{÷ÎÕsG7­]N ßâ@jf g©ÁybÕ¦‡®Ý¹72:©›1{JRYmP£¥¨ Êòl³Û©Ö:=jòªô«5zõj{þÛᅢdç^ož ýÔ¤÷±ªÒèþ?ÿïÿÝëR¥j¨˜ƒØ4³Þìõ>ê·Õ2•5P À@¨N³Æ\ÐjT#¹1D¹*dT U€©V„@‚Õ© S™t:›§n/•LÄ£@k0˜ëjçPÊUew`9êds¹)\:1±Ïš9[ÉŠ`x3–~œ&0Ç,Y¿XM‚¿Ûi5ë¦&îݽyãêåSGö¼»ê÷þgü5ÎRÿÜyõíNÞŸÖéu:{@¥AنƗ«5E¢–«Õ¨ÔÚÝùoTjÔšùùz­3ÿèd³T°šMYÛõFï!‡ß´«•z i­j¥Ùÿ?ÿßÿîöÍ·)µ‚®±^£×ï!w¾N(‚N°¡ÊÍZMªCjl%êíjj± )p4ãMy£&KT¤ Ùª²”¡^B‰JÑ•A…Šâ *  Bˆ±òö1»>X‰S¸—‚åeÏæÄ> ×N6;õŠ R¿k4h^Í`N¸áh”¯¢‚·Ã¨»?rûæÕKgOÜýÉkËæz÷¯ÏRÓK8CH‰ó‡7Þß¶çØÙ«c“hnŒz£?Qi*È QªŠK%zx%ªõz³ÕÔ¯U Ëí6 Ø›w}ÊUžjüZç©ÅkµZÕj«]ïjRÿáBþ{MP±i°ƒ^‡c=:0ž™¶Ýé¶ÚLUêw*hGjí}e¥H³”"Ë„±2'úVÊ p$K¸vB@Tʦ©t††¨d,é3èíl¢œ~š|°áóúö ²„¾Ïa3KŽâ ¬`˜ãG£¸Þ5™5;p’Äþ܉z4‚¾/ð9¬S£×¯^>öøÑ}»6½ÿæ¿÷?ä¯ršZÂBŠÏS«7o?tôüÕ[Ó³s¸Ò´D32X ¥’¤Ö±fkTëÔìÕY¹Ûé·«50ÃÛ ÞAáÑùö»6Ô½½‡ÿù_ Ý&tÔøuéC©Zµº"·Ýîÿg· ~zI}Bb,&TVšÏðáŠú^­Ý¢Z…@Dè®Ð/ÛÀ$ª@4 …b>"•JÆbqìȱ7𸙵áá  ²å%ú?oŽ-N6…7ÓŒ“ ©Û Gƒ> püšÃΛ F”Eƒ³‘lV#gZ›Í¼~7‰À(Èýœ“ ‡ý,iŽºuéèWûv|úÑúuk_}á1J6ü)g©É%œ!¤è<ýúçûN¿vóþÄ4OT¤üé4ö}%jªJùb§ÝDB€B¹ vC Þ&AªÍz—ÊU§ßª·ç.,|û°ÃYþÃù•³V§·0ß&(Õj Z`ìÎUÈ-úývðR¹UÅ5W»É²a•ÊU#1ñ΢Ù(K²Š{,Ø6z]¬Í%™JT¾ Ö•\&E"ñD4äõx çú„½9AÀO C—æëðò]¸ò‰CÅȬå°AÓagî7|Œ-2£¼A!('ˆ2g5æf'G/ŸÞ·kÛÆõkßXýÊs˳íBê'ž?=»vÃÖ¯Ž]¼z{dŠæ(Æ‹3\%¥Z‘‹ù²ªÖZ-ø4×èynT`…RÇ5n»Ùê°æÂÿù_ÿ5ßkµê­~ÿ!Õ¦îüü£^£Ö|¯Z¡ ·0ß@q«ÔºªF@X{þÑ|¦¯ô5£ÂKt^ÂÎHUTfXÐç¢fQÉ¢)ŠêT­Lý(ÍV4FQÅŽ/‘H¤¢ÑhK ÈœØÂÒãÃ!F–|6vÞ™ÏÉJ&M@%\Å í€a,}ä"¤ÌÂP ¬to[ &4¨Ù-sSîܾ~éë/7½ÿÖªž|â˳éÃBê'^ßøùßœ¾vsäÁìœÁ„Xt£Õ-ÉEY%HªhÒà¼Ü­×`%‹|Þzûá|·ÝlSiª·¾ûßß}Ï’ô©yš…¨ÿë Í£á åGíõ ì l¡E¬×»Ý¥Þ{øíBož ØDn6XL5Vc0¤°­@ÖÓÐÙ˜¢R!Ð*J¥Ú쵨!-ÊÔüaŠ*ä‹r1™ˆ¢¾ÏÄØvÇ¢¡ ®{ݹ¢‚ÃGí¤8 sÑŸõ‹!E€4j}Ÿ6E1=‰E#a´–TðÌÆ™ñ‘+—ΞػíÝ5¯<ýçßûŸñW=HM,á¬tH=½jÃÖƒGO^¾9ú`bŽø:Notb™¬$WÀW n‹FyÕf ¥ÓN§C袩ÛiŠàÙÒ_h×=êµÙo¬Ñîtz` 5jjÞ.h[Ýv ÌÚ^“`Ò] Qª×§Ñ«Q«‚ö3$ Tp ?®Î·S|\D•$êiº‚üª®” EI.f3¹|6ͦ Páp$ ZÈ0’€$€Á{!±lPóŽ‚P”4‡ *i!À…ŒŒbÙÇ{uˆÁH”ƵX<ñ{Y_=zp×çÞ~á©?þÞÿŒ¿ò@j| g…Cê?V¿ýéžãgÎß™˜œž™G`fVor‡â©¬¬`×F½—¢*¥ 5_ •¸ ¡à@™Þh·©àÌ÷áÔêÍw*µ>M Ü/ÕaòHÁé…°÷p¡ Å<˜èl¥ E·_¯R÷÷Ý|ƒ¾,‰TçÐð5A†­²2\«É <*b‚« 8ÕRùb)ŸÙ<ÕD<ŽÆ"Hß°Ûì.·ÇO¥ÉëKÜ@AåâýOM뢳C3kö̼D‡(ÞðH@ Ç–`ˆàÄŠú=6ãäøÈ ûwn\ÿúKËPCHý„ó‡ÞÛ´÷𹋗ïŒNM˜ætÓô“Áì&Ry‚”‚]µ\R¹Þ©•%*!PÑ"Ÿ· .-ÈMab |¥Ö§Í?ÍFµµðý|;wŠzR‹¨"àÕ¹ Îâ⠒ňåµJ³Û£N¯VoÒ¸…k'ŸèC{-D¨U*‘¥B d$•ÉæR!—ÎæX½‘¤Çœžõ0ueÔ’yœÌ”ð‡"0<" ½ØûaŸ.Æ&›X‡³Ñà"väh…÷¹IHx±æ.vq)ì† MÔ]¤|ËÜè½—NíÜüæ«O-7Bßœ¤Æ–pV2¤þý©µîÚwòÂ[·LLMOOÏ΢Hé ÖD:ÉS¢‡[Uå"hâUê[ ]ž@MRAB•êÁ`¬Õ:–qmP#jôµþ÷ßu[(kT£ý×B§YçØìj•ÀÓ®ÑÛ*á­a0òIU¡j—Ä( IDAT¯5;í:nu«5Ä(6uµ,+eôªB“SI’ ‰¯²©D2™Äån"KgQš×»·Y†ìÉ ºEˆ¥gÁó•®…¡š„0–0Ðühe< ^£Ì,Vì ÑœáX,€¿˜Çn™ypõâɯ¿\¿ú÷þ7ümÎRK<Ï¿úág¾>õÎÝ‘qjû@µ3TorГš/HPJÑs®Ê² «"à ÔoìšØÀAÉÛÙ~¯Q-—ë0Àˆù×7: ¾…Õ acòu)šÀºØA ~ž£H pÍFƒ7îE­áð=/ÊTY.ä àóa°Êƒ~”J&Ó¹ C*‰Y*ôÃL‚¥„hûp¯¸Yï`ƒï~y–¤ È6^-¸×…›˜I ì†dµ°W3Kæù2* xØAI?{ÿæÙ“‡ö~þÆ3¿÷¿áosz°„³b!õïϬz˾#g/ݹ76> ¥c98=]V:“«Hrµ\*•kf¯_SÑÊÕF³V.ÓÃ_ï!F”š?Ø\ÂÆm0©Ñ@UVqÕkÀ>´õ6<ûø¼J³?ßm±!xçPvÔº]\ý©«DÅPm‚‡Ÿ*CÈQ¯—ŵnE•KÙl– fžEhxóÙt&›Ž‡BÔ÷á¢ê%à!Q>öäóx|>LQn„¬ÁâÜå››ÙGÂ*Š”·O&”)ˆâ|GtÈ{±ìC¸¼ß絃@a1Ü»~âÈ—»·¬_³Yç?t†ZÊyâ¥5ï>~öÚíã“SS3³"#ÈìÁL¶X¥çX.¥r·µðš±2•‹j·Û úBõ¨Óकz06b5r ©Á$¶Ûo ^´ÑèÍ·Úmú¹¢”ëÍÎ<5€U(3hÜ‚=D¹/Ì6ë+0 cßf¾ì-KXW« ÀU’°ÏÏd²%™ÞÃUS.Ð8•Lá:*ŽDU‘ u™Çç£ ŠßßSÙ]~ŸÈ1´j‹ü`Ó œ[`ÝÂmŸ¶fÇ¢Ýí€òy\ð(Lº[îùl˺מý½ÿ«3€ÔèΊ…Ôók><|úæÝqŒP:=çcb"·9ÌFO$›/Ê©R0¥ªïÚh÷”þw ]ª)à µå2L[}ø7S%"(TÊœŠQEàu¿Ž©7¸)¼‡þƒÒ¿…‡ !¤Ê>.Õ*œ’Zu¶a¡Oè,Ì7ë˜)Uä|.—Ï—À1¬–q UÈç軩@µJ*fÒé“Îà3`[‰­Û¥…Ú0AÖƒÉJäÂpÏç¶pÑè\ƒ”Q( Ì:BCÈë \NñÁ/‡bÃòϤ×ét÷ÎÞúá«–ÿ¢op†ZÊyå½ÏO_Âô¢aÊÈ× &S0H• àyKRYm ñzY_èÁΟ&žV¯aÄÖv«Ñšï58Dž±·_‚¦¨~—=α¯V8+±Ñì÷I®P­Që훹‡l²J·ÑiC/•©§C *–êjñÛÙ<ȳèÿr4}‚& û< ²ÂÛŸÕï š³Ö–( ®Lßµkq¡|û„õƒYŒOz¸ôi¿ÁÂ)ÁükHÁÒÏ0;9>vûÊáÝÞzny_îþí@êþΊ„ÔÓ«Ö­ÿìÀ™‘ÑñIløX÷–Ú,É<=ÕÅl*]UªJ¥Þª¶º-(oëm( û=./­Î< H|ëT¡nŽÐ1ßít ‰o¢#¤©Mß+Ôû‰Õ_¥Z¦éŒ S«×®)Ô"1§ŽvŒYY.!Ã>ŸÍR*7°Ž²™L¾¤(ùt"Aè±se}4;…#‚Ðê£zô£T¹y”â+^6ë&çèìôyNA»õº-T¢ܽráôëß|v•¨ÿk©xþüæúOw…˜ÕG}óY©×Û¡8±œà¡f~Y ˆ(¡€BžSob:û8;Mú‚Httv‡E7=vÿú¥_øøý—WÈ¢opº·„³!õç—>ülÿ¡Ó×Fg¦ SÓ3³ì¥5G£OçVw¾®H¥|&QÀ‘@É«‰L'p´*•n·ƒÄ¦¬Å€½Eí°V4Ë—n—cÜŠM•¢tçÑÙa+&¼ÒáæÕ/©°¼e‰Ú<šœŠ:4FÉê³ét®ÔnÒñx*‚QK(Ž€pä£QlÍRÀ–|.–FqÆ¡à‹X]ÄpÇ!ʈ{(†L%, y€B·7„ÄÜ»y£a1Î>¹~ùä7ûwºö¥ßùð·?H,á¬8HýáÙ·>Øsøü•‘±éé©I¥`ü£7› ³b!³Ã'«piÍçŠÕZ­RŸ‡£^¹ÖœïpvHaC‡8ŽN¼ô*F\ ³ l£ÑëƒW¥v«µÑ w¼"-€a%Ô¢ãåˆs¼¡à¼ú2h\8½»E¯¿wëâÙ¯îÚöÑ;¯þ®ÿ|¿ÏBêGÎÓ¯¬ÝôÙ¡WoNL¢¦…OÔœ`³1SÛ¤|±¤Èy¹V%Hõ»ÍšT,sn5dêív‡ï–Ð赜~³ÊGUdJQ“7?uF…/}ÛRXÁHæ^£E}MNu”*ÈìÌR­×4U¤$™·’RÆU€Š£DU }_±M&É¢”І±:§Ç> }­‡ó«R~L˜€ÖV&ÄR÷Æ»=è4„Š~&,aÓ§y^òÛf›C|• C*Ní¥Ïc3ÍLŽÜ¼rêØþ/>Û²nõ²4—øg)œ…ÓÊs›};»xmdt|‚»>½DS¡2˜0¾3Ç“ÊR…(U*ÂΟ*H¯¼€ŽN BÚ¨Ó¡†d48²ÔUŒEõ6ÔOˆsk¶X _¬ù¸Ol·jUv²À†½Û€<£$Sík”Y¢Qf7‰’Âü'jKEš¨°ñc¼Œ:•%ÀÒ±h4‰¾Šš³x,,,ùܯ81ýÈÅáPšj—ïŸLV—…ª“Ñb1IFÜÃéÙK–¥†¨RTéð¥©Æ“‰¨×iš{p÷ÊùS‡ömÿtÃÛÏ­Fß?HÝ]ÂYYzêõ­»œ8wóÎèØQX t4¬"{Ölñ¥©–Õä õ:0§†¬‚Ä P&@¦h¿‡Áj¡´]µÒéÏ?œïÁd¯Z“©cŠ&ý^ÊÃ>Œfå}^ï»G½Z¹TàTªZ2Ú;ht%¬ÏËORIB÷‡›)쥵~4ª³ñh2ŸJĨ8ùXODB¬Æääœ"Œ³œ"»Ú¢ÙAf¢*ä¢>nŽ e¤x#ƒœ¾ì….ÊÉ5Ц´0Ê Öi3ÌÞ¿}þÔ7û¾øtóº×–—‹ìRÏRÿãyó£/¿t㕨éY›hYàXçm°ãU‹ôÄË(U«P)ÁX¹ ç=ª\ît›ð«µúTuš¨Yí~oþ(±Tv$–½¦À² Á Åz§æü|+õÁþÌøÊ\ƒ‹(úC Iy\ˆyEAZC©K¥JXÓ‰ Õ¨p8àƒCeæ-Üùùe‰†ip²;…”‹s;R×ÌV8MP½2ætH 0 $ÑrÊ K!ª§* r­³™çtSw®ûjïç[?|ï•×øÛ3€Ô%œ©'7|vèØé«w&˜‚4Övü2mÔô öp‚J†L3È`§BSCÌ'ˆæð‚À†¢V©µº´!ÔPuê¾N«»€k¦Õ™¸³b‚R™"Hë ðØiÁžE‘r¹"• ˆ²° PÜCåK¨Y43I`KäÀãËa”Ï&y¼;ŸŽ'cTA°mF*„C>£¼ÔíùÂá úRvÍè«s†^@t:m†Â ‰I˜‰AkHîtB¡„‡éåÜÌÄØØƒû×/Ú³}ËÆ÷Þza¹šKüƒ3€Ôí%œ•©—Öæ4ˆ',Jj­V‘!+„ø:@N(b/‘I›J¥ åH¥‘p,'èÁNÎ\$‚Ó >žÏ…ø]&"TˆµGVc! ²¦§EßKÑ:xóá€G¨êºû·®œ?þܱ¯>ݸ~Ý[«W€Øð‡ÏRÿÃyçó“çoÜšÒiAs:݈ )›;‰§å\&›ƒ[ ,ªj¹Û*TvZ©´º]8H ¼<ôƒP¹#—½—!Ä6C­Ô;˜SȦ!SÁªÚsË%‘UàT5IÊÔú•@*,äòsr±…ƒl*O$“‰D" £‰x[nûÂÁ/ÎჄVÍ †+5~¶E’ž]Sòš yÇF ‹bÕ¼ Ò‘lèçXy@êîµóÇ¿ùúðÞÖ½ùÚ«/¬ÄeŸ¤n-á¬Hýùµ/OݺsïÁäì,aj†¾õ=ßÉà¢/ÖV‹Ó&R¹\¡X‘%øVšNÔpähTaØÇ7²èôºÌÏ«ô{íZ­Ù༎&§!–«­v·ßãhÄfƒš¿Z§…”¹Ê‚^ØÄÀÛ´uðÈ—G…\:“°@|ªL6ŸN„ì݅9zì!ü±XÐÏÁ›K89ˆƒpáD‹ †” íYY¨ÁÖ&q7¥m$øC]nn‰ùŠ‹¹p#3Í^?w|ÿŸn~gÍóO/g¤x†úÁ³ú£WïߟÒé 6ÄrbÎ`ÔîdŒf¼TÛ¬fWêAšfIÁ-‘pci²ªr1Ÿ/”k&Á  … ZkÏ#Š­VëÃŒ?µZ=)•†°na¾ÛÑO%$¶UªNrµW‰šT,Q£ÈÄuø\‚ªÁ3Ö|éTVÂe” „AK*d’Ø¿¨°áƒ„²@4âg<1¤@#raIá-³E$ƒ C1óboÇû dr™Ügà1 º]-Àf …ähy0,ôS—NÙ³}ãû«_X‘«ó¿œ!¤~àüá…_\º=6661M¢"¥7˜Œz#+îè@sÇÖ&žp2Aö™¢KPÞÖpYTkÖkR>›+ÀSâÐ'EVê…^K-ך=aÐ ë¤j‰£ è3êíùï>ün¡Ûª¨¶éªVœÔVW¤Ú|§Î‚¾”K¥³húÐûeÓ9ìëe„Fѯ© ³)¾Ù²­˜y^Ž-^ Tn¾ˆr{@uE¹*D»--×(ø±´ƒ—|Æ¿@ÊîÐî¢Pý"e3=zæë;¶¾¿ö¹•¹:ÿË@êæÎ Ôn;vþöÈÄbÇf©ïÃ[/„±dÜîôz¨+ &ÒYzŠ‹¥J¥$•e*%¥l^jPë‡LB¹\­‚ÃZRjª$×:ý~WPÕËàªw»¸Þë;¡«×ý.djáPмA㧪ՇßÕ9‡£Üh ‰ ,YlÌAì“W•:¾|IEo¾KÑÌ …iŒBo†å @'åBTfœ»=n–DoûrnôF«Í.¬Ã<."xÅÉ2y)§ ¤X,‰˜‚ßC84NŽÝ¿wíÜþ]ŸSzþwøû×:HÝXÂYúç>Úqðµ‘ûS³œ¦:Õ!/ûô:^ö-6‡ÓïµYláDŠ:04ø”ëÍš”ËIÕf·‰¥ƒ›zÆårF-¬*:0\}O…PŠúAˆ$Ä@•aNVo,ô›@¬#$Y©ÖqÑ…®=|HØB¼!8°5ÏP­*U+4tS©t¾¨sùl6—M…€T,›†Q æ%¯¢Ž€_$Fñå®Ì‚sn±b@r˜øŠs£`æqÙyA:ew¹9êÚ‹²D2A/&ù\&ð¸¬&ÝÈ­«Ôõmߺéݵϯô5„Ôߟ§_\·ñÀñ‹÷ƦfØhN‡e^©!’2˜1®óèA#šÊ¦rEܽ*r¥‰´Â²‡¤Sô*Õ&Aª(ʧ Ò KvøµÐ eöl‘%jïà^PìÅ¢`W^ª¶ZM\øV`UF˜¤¯ ¹!è|9ê6éE^¹ vl"‘Ì©^ʹd ‹BU©X0‹…‚,0t{q;E-›ßc·9ÑôÁ‰:@FÙ8-T1”‚CºÛÅ _j[Ýþ ßÁž´ÁH,I'“+²!ŸÃ23~÷ÌÑ/w²qÝ›¯½°œ’áÿÙ3€Ôõ%œå©§ßzÿÓ/N\¸169«ç™\Ú5/’¡è0Ûí1¤ÃEÜÏæ2™ú‰d4ÄC”׉P½|n›ÍéñjbWYû±XLsºjr-ø~ËÁÜ$#ÿ}ݾ€ßÉ99áx9Ét6ð8Íúw®~³ÿÓMëÖ¼ü³+|1!ÎR}Þþøà×§/Þ¾÷`jF/,µ¨H͉›N*RVêÑ%aƒnuxBé’R£†èõjµC½‚áw„ôO÷Ál‰Š²87Q#UµÝEðaµÑívqùËVa%YE¤xF„ ¨XFwÉ`­7šôn΃—¾‘âÛ©µ{ñh<Í¡ð~l'ÂZ¸}p•e¿"ÈבDè'$áŽ×놋¥Ëå6,P9égg@ ¶;ÚP3›,Œ/· £Û¿}QËi1˜ùòÙã{·½³zoÍÿî um g¹CêÙ-{O»rëÁøÄô¬ÞÀ×P³ )¬Î Uìale{-zȼьTé¨r6WDd¼Zë´`ôZÁÕR¥Â¦—] 8 35„ê+­yš™Ê•n¿W¡ž±ÑîôšµªX‘SØlT+„™‚\¡Ò„ÂFŸCÝáGVy»A,—e„c'Ã3iÂÊ×Qœƒã$HR¨R§K“…éI³ÕÁúyÎÄaH†ëµš 3Sc£·®ž9~xç'kžû-ÿþµÏRW—p–7¤V­ýàÀÉk7ïÁ—{s/ù[szÐ%˜¨mV@n§;œÌ*µR>“-ÕÊôô·Ú êýšN=21;1q¶Qït°Ìlô»­öB»Ñ]X_úD¥˜/Á¬Qot@TUÐÍ;R‘Cã+TìH ¥ZÅ*+5OpÊÂÞH,ÝùÈËB6§+¯Ýažž¿w÷Æ•3'îÝùÑ;+–*ñg©ÅóÌ;??zîæÝãBÈÁ 2Ìé5:nV Z!‘³ä´»Ã‰”,c¡zQª³x½Ñ쵫åJYE®'tRUµÞèõkTJµn»Õû®×_@Ü””—Ë¥50¨v2D»æBG–+M1µ \¡ËP—9ÇxÊທ”ÊÀ)•ˆÂ~<•¡J…Û(œPÐïõ…¨fyÙ ²C6¤p3‡®D}Ù6H¢G„YÁZö.Ú?X:û8ÛMy|nÓÜăû·n\:÷Í¡ÝÛ>~çµßì_é18CHiçÙ×6oÛ{úÒ{‹æ—zÓ¢Ùøþ«+TÆñÃg©+K8ËRO¾øî¦½‡Ž_¹5:Ίxá¯``A “Åa· @¡ rÓ2iˆä!OJÊõ*˜v’Bh×±U@ˆ»T…·s»ÅäW+úVž+¹õ“\ÌC³¡"²¦†˜Bª5Uq Š–L•°@VÆ×@ÍÁŽ9—O§s ù%ãÔô%’©$»¶„ ˆA¬ë`Ò¸Ÿó¬E&‡C3àcç#è E¼^ÁÅûhèp “ ØUPwJ­^75q䯕 '¿Ù¿ë£wW¿¸Ò,þÁB ç«Þܼýðñ37îR×7%‡ðh¦y‚¹¢ ØEÄ&è=)‹ÙKf2ùbQ*ås™¬¬ÖÕbüÕr¹ÜB¼RG\†Ë|— ç°HZèT[½*– ™ 6vàÄÖëÍf…Œê=¥F"U%ì ±„_L¡È~çªD³T6ŸÇÕT>“¦¹*¸L¤AÞéùøWÌ}(0Þ@À „±€×Î’d›]cš³EŸÐ Åq†èûN QÁ€[³I?;>:r÷öÍKgO>°}Ë›«žîúþö uy g¹BjÕ›}²ÿè…+×ï ¯'Ø´Øî\ô\Î%¢-<6K(Ï$€ryªMµf…ùàXvcËP­Â!K9¹ruw¾n×eµYWe…EØ ¢J‚Þ„^þUb™JŸÂkBBTµLˆÊSe´ŠÔöeò¥(I¸"(e2É; …Bœ ˜vüêb¿ ˜‰9š¹éÃw¶ÍÚœ}út¼¡àºfФð§Õ07;~ÿÚ¥sçΞ>r`ϧ[Ö­^)Ù?á ui g™Bê©u~¶óëÓ×ïÜ›˜ùc&ñâm±Ú­V—ÇÁr<æ·¹q7ëc«5MÐC^Ìç³Ù‚¢@%ÃÓE‘KLj€0£Ì q¥Ñb»æF¯ƒ©¤TUô‡0–š ð‰¤òÖ˜9AÈÕ—¹å:>R_îÌÔûä™!;ŠaƒžNÄñx2ŽGÐñ…Rbf9Õÿœ(«N§K{e HYYCiÙ6,ÙÕsó‡·)ðC¨Çeñ/¨M¼ïÝôäýÛÏ?vôðží[7¼³j¸éûïg©?¼¼nÛî‡Ï^ŸÕ‹€îƒ`ŽçÌævY¹ZY9홞P7=hn«-O¡šÀ±¨¤âŽóRµ†ìQ¬äj¥\ë5Ë\Î*PµF»Vf0È•~§Q«´zÝ&ÒÕ1&!î·T.œŠ2¶å2û]2E–-Å ŒÏ$ÁXMgKE$°”¢ñd®—¡Ë-w0ÀæÊ6^ú{|>¨…{¬®-T˜³ªÙáìz‹píÊD¯n¯PÂú+y8ÔÚ ã£÷n\9qdÏ®Ï>~wͪ§†|¾:H]\ÂY–zv͇_ì?òÍ¥[Óz¶jÁ¥7±øq6‡ô ïñ¹ì¬yðCn‹=KS'F¢ª&Š vÕõz%hqiDjÔÔÆ|§Je©óVE­µ*°Q(7!·Ýëw«J>/17‚zAš­9—Nçù²X–02åØV‚þÆ6Þï%.Óð¼ô"ñd”žz±9ÇåtyÃAεa¶ž‹^\¸xâ¢dfý;²»*Û^Š­â}Pm„Äø`‰X=f݃‘;W/=ðùÇÞyù™! ~ø !õúÛ¾>qþÒíûÓ삤Ÿžšš1˜yX׳w ¤¬·×ïuÂa·û’>«ÍCÅB)8ɪ’ËɸÛ/¼†þN)æ¥F“°„7–6`.V«(ˆ¡RʵN‡ú@h<ªr.WR@yU‰ùEp_¦Æö€S±/Á\¬$~M¦_™L!ŸäÜ5?É£Èà›×>±‹à4C0dC!‡¿›Ø…YDD OfÎ8Dš\áö‰Å¦ÓíF©t*A¥× ½T«g&îܸræøÞmï½¹¢¢8~âYñúÃÛ[vŸ¾xóöý±ia013=95­^Å|!eu€‚ˆR6X ¹ƒv“Ë‹§àú%Õ7¾ UªªTê/´UU)I5X¸ÀÇ\ó&² R*\ŠZ¯·šµj½ÝT¥\–ºÆb9oXgs™L¾\«cNƒÿ$Wç(³™,îwÓÔ ¦S™L,ìgoK¯?Èæ”‘ × 3f7ï# Ú…,Tò>Á7×f'Í™Füȹs(Ë6á:ÆkM$`¡™NÄB~'•,ê×MÜ¿~ùܱÃÛ·¬yy¸åûŸÏR8~ä,S·Ù?>¿á³ý—oÝ¿?6>5HÍÍ Jñ'Kx V‡Çm·9± ×nåõŸÃi6y±dšÆ"Uü¼Y IDATØá>©DY­©%i¡ßB>5›²À: ¤YH.c¼êSTøQT«éʹl¹¢ÒèUUË a”r…2ÄöÈ (qúZ!—§1*Îdr¨aù\23!ÖωQa:„g Æ%Üÿ=„$;_LC¦ÁÑ6æÅ…ÄÀ¤EsåÆAåä›aªlñdFµ~ë?ãÜÔø=l&îÝòþKOþÊÿ*õ@êüβƒÔ¿?»vý΃'ï>˜ 39=;ÇDY(ãKfæ:…ÐZzõöø½.NUÂÚhöè‘+²™4,)a[T¥)Iª— ¥F½^AªTàyí”,WªÈ @(dº²¤"íÝàB·JŸÐ5`AFs™ZEÿ§Èà_ºD¾Kg ÀŠJU& ƒm½<„—^ ‡.%V‚6åbw>^ôq>µ»kÉÕq 5'8ŒæÉÒßÏͱˆ¾`d$èw9ÌÆÙéɱû·o\<óÕží›?xýÅ_õßä±?+RÏ®þpëW'.ÜŸ¤3ÅI7„*víe‚·_N7<„,„,Î's€bÊJeiìɦ˜Æ+(*f¢šœËS£§ò’ö²ˆþ”JRþ²ð!c¢žTRë"A´ÖnVUíËJÀŸ%ê %\m© Ã–Ü?ó*Rô0…›^áØ‚5ýH0…MRN0%vÇbt.ó- O Æ”æI¨.5lr.dQv„íŠìQ,;h$³[MzÔÝÛW/?²ã“Ö­Ya l?ù un g¹Aê©·?ÜsøÒ»°<Ÿž‡œêpÙq7…IÊ-ŒeùNÊéôx½«Éæ ÆÓôÀç©KQ¡Êd¥”+ªU9›-Ò›YêÕŠÈ¢Fº» f:µzUø)¬X¤Ž¯`ð’T¸…åŠ%xÆ¥R&S(–1~•òÙ¼ç|¡TTD‡‚†”ÍdRÉD$@g ÓD%'¯{ÑåÈ!.¥˜4Oÿ¹Ø{Æ,œdÙŠÏ,á5+13%˜–îpú4SføÐ:ì ÓÎLܺvéÂñÃÛ?^ûê‹^îþƒ³’!õÌê>;|ŠÕ"ç†m[ “Õ Éf Dã¾ÓBÈÖwý©h9|ÁD&[$0d±òƆ[U•¨`•¤"*W )`DTqí‹hê:Ø)…Z¾&_ÓÔÁa6 >{žÚ»b&“§ÏjÔ+EîJ\›0R¡ÁDM̤QñH$ÊW»„)âN&g‚¾;Í£Å.HIR¼°â¯dã+*³i‘8kÑ*ÇKØŸ?ú¬`âÏLO<¸uõÒ™“_íÙôîKO7çÿð uv gYAê©Ul=xìò­ƒYt@‚Фõ@ì¸*Ø&(a'fºm»'N‚¾šÏ‹T˜"=øù’0ù®°TŸP„ÔZ³Ón€[›kõ+ ;ÇJeØÐÊð3/–hcE!Õ"‡)°¸¿O-"Þ¦ÀaQùU¦ TI„„¢ãƒ‘$…¡€F|”lN—Fˆµ ©¤àÌ3M–?ÀÊ׺ …ˆ¼#¼ÏyÔ²sÊ.¿hìƉ䟩÷o_?êØWû>ßôÚÐýh)g©3K8Ë R|ã½Ï÷œ¼pû¾Þlá 2ñïÀðêÍÚ(Û„»Ü~ŸX¡‰ N›Åå FRÌÏÉ )˜‹åòE\S)¸A¢sX©XR9•£LM]¾Þƒ5’:Êí^§!añ —«`K2 _œfXFð€¤V+ì0(”°T2™Îµ%ÝcŽä»ßÃs¬ÿA’eHiêc‡‹û4$+×%ý.£Lšï‘Ù!BDEn5ßD쮃ºÛÙ™™©‰{w®^<~äà;6¾»Rs~âY¡úã‹omûòØ™#SÓz£‘cÒ¢8àOp°yq^J ·ÂœO};Õ‡p6—ÉÀ<™J Í@²B )A‰¡ Ok êÁÅ\تRäe8"¡JR¹Úí7ªô…",0q…—O%Ó™B­†²ÒhªR6“Ë¥Ùª%“L&ãÑ€?KÄÀ–||…=$xFƒÑjw‰à5;·zV!ƒç@x‹¿8mWäƒ Ó'‹SK…wºrèuƒ ½Êèf'ÆÇîß½vñØ¡Ÿn^ÿÎ+C-üÒÎ …Ôóo~´ÿè¹ËwÌèôð\@R¼Q!¬¿YÖ@/ÛÂw•÷gÌËfpWʦ39©ž¥b® 4’Ú`E¼ˆ¢.@ø!)jY.תåb!—É!eMÁÝo» ‹ˆŠÊæË²„ÐdºP¯ÁË¥\­IÅt*›IÆ¡€OÐÿ¢!Ÿû=‘Ý;A*ìu¡wcÀXìn¼@Ú†Å.º:)­0ôZ5Ư„­(€Rm<.(«|vªPÓSîݽuýÜÉ»7oxçõWž^ï.í uz gÙ@êoløìèé+7GÇ57;£›ã;(PÜÀµÂˆŸ6´Lb'-š#Îô†ÂÁV}ù†* •W2Uªr­0¬*XëKH£ #,RÿF+«HÃFò| œ Vc°¤R.“L¤2Åj¥€þO‘óYªZbvŠFcñx$èõA_Åå.t¶þ`4æ°4;ï,6·E‰:>äW›mÚOp%˜)1§¦ŒL qºDâþfAìáÝ. eœ¤u÷æµ g¿ùjû'ï¾¹úÙaÓ·Ô³"!õÊ[ŸìúêÜåÛ÷Æ' LÔõÍMzÝœÁÙ8ï¿Ä ¼/ÿ4pð@Âá.`*à G±tšJÊ|]aëW*+2MR‡Ö”$ ‘î•ð†Ž~{ª/œf‘ @°‚º9HBTM^†æ19_9Qi(¡Â ,»æÇÅÑÕàM ˆ‡˜Ãa3 ¹;×("^Xb½ÂV-š†Ù,¬Eþš 0·G˜µB€mØv×mž½{ûæõs'ŽìÙùñGo¿ñü°Bý„3€Ô©%œe©'ßþpço.]y0953CC¸Î ˜lúøæÆ±Ø3!dËi'8Ýp^ Îï …Ã± RÛÁÍb‹€Í9¬•égBÌ…ˆ±)JLé“!£‚b—Û<¹Òª¤àrDóéK)޹A»:_.›¢¨ñ‹… ¢,!o#/‡®˜5K……‘x¡æ€£¥0^6‹ŒËRBt¨)yÍ4|˜ÍÈ HÄÃ(éú‰k—/œ;z`÷–×­yé¹áÝîO9H\ÂYZõö§»ŽœºxëîØäôÌÌ ýGõÉÄ/Þ&«qâ{QŠ#—Ëf—‹†)—f˜hšñ • ¼K»¡(—àQ£Š i<¼Íi‚Ñl×¾HñÅ–ÛµR·‡1G}b‰ÉæYlΓI¬÷R©T<ŠC8?`ºyðœÀ»#ÌuèNÑØY8ŠÓ׬ËgZ”À bWáÁÁfý^8E2©bA/âygï^:´ï[?|ûùa¿÷“ÏʃԓïlÜ}àÔÅ#÷ǧfuœÈ†-ßRx0ùbT€Ë†4&¼˜»m¼Bóº95:M¦’™<5s*6|G›Ïáˆ^®Öë€Ì1Ñå)ˆ—BJ€¤À$]DY×A7¢:”¢b”ÌJ5µ(z@N@8h‚!EF4 7 Ÿf«ùS²ç‘ Ü#\›9˜éaYÜŸøÿ‚£Xïá¦ã…–ıØ ŠR¿ °>äqšôS㣗Žíølë–÷Þ|yH•øég©K8ËR¯¾¿Ûó;÷ÆÆ§¦õð,žžû/æ"Aõê ÙÄ"’5é©Ã´A3»Ï+öòøÁûŽE#Ø,/ÎOEjö²šW¹„P)¸¯È,–W¡ñKr¹QQÊ„· ®¡rpaIÁ‹%-×*2®{K%Á2 ^G$°þK§âŸG8ññ4çå¼(Ђ¢Ñ_Jp"!åÑ…,}gj݆lœ¦…ƒrAsÀ$©ØQ\·y¨´ÌÍŽ\>r÷Ço­Y½j(2ü§ÎŠƒÔ;øúÜå;÷FÇ'¦f lÎβf<€,·3©‡³,@—œD¯Å‘nD܃áp<Íd ‹×O¥ÛÀbχm…Ñ{I’$ «T®ãºŠ¦,*Ue*PÔãñúoœ2©L‘#×諨B¥â`…©vÄ“ÉtÜÏ®–tœ¸c{KlìÑ1á9]v¶0‡…‡Æ>³ÐâJ–G³ ) ÓÌ‚^:j”`ó…ýP×Û­Ýøè­+'ŽìÛü*8þ¹³Â õ‡UŸî;wåÎȃ±qˆ9 ŽBßgÄ7ƒ–Ä+Ho !Ñ+¿ÃaŸË÷Ö@ȵ,!+ŠDb)¢Øy©ÔYjÿ2¹\A’q¯$«æ(oRÒÄ‚w~07¹ïéd nµE¬ÌS„°4 O ˜G PFC!Â1.É`fŽõ9ü\ì\äkЄ’ÃÆB»U,ÌQ“˜j¥5~|ßFUWÜ]¡¼±X€ïÚ¬¦¹Éñ‘›Î9°mËúUCk¾þ u| çñ‡Ôókw¾róÞèØøøääìœA?3=5‹Úd†™‰~N(‡om·»=|½cwžãô½nzQ§*“~&h2›Ë”$漂‘Ϥو¥”ËSõªÖkå"¯‘‡Xu9|—ÓÔ)ƒi@ Éï±DbÞl!ðô¾I„™FGFÉÍkèøÏ,ˆÂõÿ6X|ì~ɹî6r¢4HAO#¢Þ¨%W³™‡åó-ÞO#¸‘ÙMºÉ»·.Ÿ?vh÷¶ßy}¸”øg©cK8=¤ž~}ý—ÇoÜ}@5jrRg0P¥4UžãõzáÇ`¡¹ÅëßaL„#€&*ª‚KXqQJ¤3¾ƒÂ*¼PȦR¹\If:,¨FªÌÖF¸xªVˆ ³TŠ0uåe‰ªª¡'šÃ»ÒÐé¨L–À»¡/„©¥?èw‹å…3#€æ z¿æÞB%ÊÙ¹VÑÿ™5HYÅ}”aQ¼a‡à×+\ÑÝ|»ëå—Ëf™›½záÄÑ}»·n\;ôcþYg%AêOϼ½qç…¨Q“3Tžt³IM¸:!–2š„²ÆÅá/iç+ ߢ§¸ÛCý_ó¥ R9©”I%sEµ.’ñ¶Ð ‚!q²І*…«)Y–2i(6$©Æ •J„þ`"G_:•Du àŠA²‹šr4ž\¢„+3dï6Ïwnž°ð–“yGfv˜ÐøôâMAµ€ÿáÑ1?:Ê Ÿó<8Þ0sïÖ•oîø|óGëÖ<3¼×ýYg©o–p~Rÿ¶xþe!õ§g^ycÓŽ¯iŒ¢®ojfvzâÝ9AE…‚3®1tpp¨›%xå·yý¡ë¨än)!)#†…]©H*È•j1¤ ß9K ·µ|, Î,fóÙ|žÆ+„‚Z§q(ÏK¥t"M$¢(T õÁæ+ðñüDÅÒÎwÌ(Hn¯XôAZèÖ¤ð@¿Ý".Ô„1³-VVb OñqШÁD¨ …‰qvìú¥3ûwnÙ¸þÝ×_Fþ¼óKAjñËüÒˆúÅ õÄÚ÷?Ùþõ™ë“Ó“ã“H¶ÆªàÜòÁz›˜ójÂ&²¡íØq ÛáDfg4FhÊ$éÁ%²p›•Ër1%RùRYE¿ÇÂAšœrÜî1Ïü¾Š RVÈÝ©kLÄBTÃq¼ z,„H…sXÔ(„P‚xåH¢™.VFv¶7·s–¡>çšÓåßpޏó3Ò_ ^/áŽ3LÓ¡ÏçsZ ³#W}µgó†·Þ\ýò“먟yX8º„óó+t†¿Ô_ô…õ›w<õÎÄäÄÄOs³3œ&0§Ùoé…¡ ˜Ì:‡á„½PœÌ•uWçu{¸å#ð¢‘ÞÈ©•òÉ8 ^Êw°ýr Ø„%›ÉËed(ˆ‡Ê!+ót*•ˆÃ‘%KŠA*…‹Íi‘(\.ÝN'Ooh>y{†/ inç‚{ˆ5:Ê—Íld‹\Û³ÌiŽbåcÆ]€ÓÁ_Í þ:¶"Ñ0b=«ajìúù¯ö|þþ[¯½òüБùgŸ•©g×lÝ}ì<[!MNë„2 Ïœ[$£–TÁܰÏí.zDÙ‡‹wk4Fù‘D"ì‡e,Jã=ÿ„¨4Õ&¤¦¥bš¹œT­WKùt2+É9˜îå@™|U I"xåKù,ÍSÙ²6ÒéXÌq8[Æãñ(Ë Lßó£Iã€( Á‹Ÿ!‰tùü^ªMœY-rmS.—u)=ß,²‘P£B`ˆ¡0Hß5²qú xí&£~üÞ«gíúdÃê—†ŽÌ¿Ä€áë%œ„˜_c}ñ ý=_z{Çþ3WF'¦‘u3ÇÂxìöÌì×Lc‡E#ö9ÙéØÌŠ#‘VK£G€^ÌýÂOÔO£O$[cz0£lðKçx­‡y®¨TÕÁ,+IYb¨t*Ѽ¥P墺…ßÉ$9 ‹°Ul„ýÇ£a7pÆ| št® e®›×lyæòzÅ” ¢]H ¡w:Ìl>cÑ ¥ç6VøKXEJöP$*lÎÉdÜc™»uíâùã‡?ÿh݋ýÄ/rhXusdb>}s¿NM„°Õg·ˆV·q< ñ±u3äñ|'ŽG‚¨ !B@Vä‰T2“KÄ@ÏË2{­ä 1T¾¢)•¨%ÔRu©7,P!“J9®[bˆ}9ú=q å;ˆåÌà øYàm €ÆÏÎÂt'tûÄÓ¤ç¸Ù—Ù*$Q|£kE†^/L‚¡dâÍ„H‰B¤ŠHÝeˆÃƒ–é;×/øæðW_l{Íp-ñ Ž,áü-dþíßþj¿ÊŽýù[>ùÊ–'/ŽŒNÍ"?iN Š9;ð7áM™0½s€+K/÷6VÊb÷gw{ƒìÙï „B~¶P±«ÏÃÅR.§×{êøø®6c¤,îj ]¬Í`Mõ š³|޲`ÌÂ:–º?jø8±ZÄØàÏ¡‚èópÂ6rçépÂ~`=XíBybwú|¸Ýe·#‘ %ÂLFÔ`Á¦2²/dðP†ø±x,æÇô赋§¿Ú÷Å®O7½ùòpŠú…ÎÏ€Ô;ÿ²zeݦǮޛœC~Ò öBÒAÒk0kŽ‘L}ÃÎ\bÝnØ ÙØbÜj@`“n’B¡@ˆ•H–rT’"<7Éb êå°Ä…!a ©5XòaH`1O5 x¢ÏIÆC¬#¤‡\Ë.DE „p¹Ëîæ~¬Dð¾0ñYÍ8¶F Aˆ‹]-^׌߂÷óªÄ_Ë)d†z% JÆ}hVý½[W.;´çãÖ¿·võS¿ÄÿŸ‡g‡ÃK8?Ž™_ç"øø;>ýöÆíßœ½y—Ùt³ÓÓRbç§Ç£ÉŒSŽe³  ØòpRÛqy}nYlèÈð4úXN Ó±D²H5)ÆO(8ÌM§âq4€ùB1›¬r%PŽé}ØÒd•fYGŠ]ͽ^vfñ²• ñ9]ô§R„.¸Šáz9pƒqŽqÉ*dù›s8¬fÍœ?«VÖ"ö†gAA’=6@‘ âÁ£¿záôñ};·¾÷ö›o¼<´jùå·–pOH=óêGÛöŸ¹tçþ”Îj6©Y†Ê•NÏ/ö˜›D&´" ‡ÕŠ{Tî²@QuÑ;è‚ÈYòùAG•Jä3hü¨LO¡ L'“Ùçä3ùb}_*Í®´Üè1= Cìúœ÷Άf¡1„8 Þfllîò…½Ž€”‰ËyLbëK‡F:²Ú5§ ÖðZx+È-_ çP^±Â>àuLÞ9{âоÏ6¾ÿú«/¿ôôP·ûË_R¿[égÿ Ÿ\ûÁž#§oÜ›™ãP%ùhxB•"pé­ìÄoAÿg1±a³×ã†Í<×ÓCH²¹øa …·=TºòD¶ª [°RÝã±dÉÔï¥S…R!W’²ÉMKÉ|–~—A¡0r `Ì¡nmît£J¹}(NNl¸\Á‘‰³«AÜuˆò‰Â#,,ð:@÷sz£ f}b°!‰yU~8WàÀ4ž“>jnâòé»6¾¿ú¥gŸøóp/ñ‹že©'_Ú°õЩK#£cã3s ñ1ëð# ¥Ócs.z<Øü… èL÷q±u=í»7È#O$àó°{$AŠú¼lCÍóÅ‘î‰x Ê÷T&—I&óltž†Õr<™M“ñh„¾n¹Ù‚“—_®`ˆ{¼Ÿ`RŸËíß /üÐö ¢[ŸÛ¤„W®‘~a2 -/œ%ØÔÉŠB¶„Ç Tšu3ã÷nž<²cËÚÕÏ<1¬O¿ôâ«%œÇ6ûì;¿8xöúý™é‰IÝœf Éb"#’žç F#Êæ‚agÙÚpÓI¼Ï` "<Øî Øsc" Gƒh2gÓ$PC+˜"¥`–ϱÂ=™äütt@ܬ¤bQ¸ ™“&Õ€Lº^ëØî1 [>6Æß•"àÆ³±¹‘½—ùRZÔ$0«`GÃ~~Ì<·A¯H_Ñã¡ÑhÀcÖÏLMM<¸~ñÔ±#»?}ûÕáÍî¯q–9¤žyý“GŽ_¾363bŸæ) ‚ xÕ›ÌT@çsA2a¦ç–ž_núФðôcóà÷B‘` –‡c)b\…ÒB’›JgrÙàÃÆét" ­"H#õÖ/æÈÒ1?Gngº»ƒ×r^ÖƒèÀ~|¢Ë£²…V¾5‡`'±¡˜Ñ„¿Hà05Ow†”¦Ý1ÝTaƒaT$âsê§ÇFFîÜ !êÀÞO>ÆÁÿ:g©ƒK8¤Ö}rääÕ›#£ã““SÓ`Éê4ËUP`Ýg±ºü ž\¡¨CÅð€dÊw|ßê…]rs^LWÌnP¡Š#u:šâxÂ,¯ ÂÌ#RYär†™Å9aˆø@_=n,n\/Yvm×çt¸|0ùw9ío‹¦æf-ÒÞJÍoô,|ÅÂèdÐè &a›aGF/^"I˜,a%á¶MÝ»vúä7GöîÚºyÃk/ü2Ððüý@êÀÎc©?~°óÔÅ;÷Œ³c´Q†g®o f+M1x€©PÙi–BUàVÜ ¹yMÓØAÈ”fßd6’$˜DbØH %79..oSxÌ#ÂpPJ'!vq%ÄåŽ×ï1&¬ õ•/lY2âv ïM?<:8ϓà )6kҪŒ÷Nføœ³9¿L°­'ŒrùN‹ EßG<›GB·×봌ݺp䫽»·n~ï­×ž2Î¥³¬!õ§—¶¸|{FÈ ggg´˜CÁ?‡™±n޵y6«FÞ1boasz^—ðlöÀq i¼?„7±õ‰Öãóñ-C. ž\T'´W±x2ôÙ/Ê5Â΋­ðùTà˜ë–ÐîòbýáÑ"Yûä¹kVn.–'VëÀ*Œ«LùlV£J“…  ¿Ÿëõ…¨9-ä£~´óºÉëg¿ÞñÉúu¯ cJø2ˆ'–™Ü¸Fµ»|¸x…:¦*ÈÔAè ü~&ÇAgáöë zÞ 'Òq΋ŽÅ#ÀRÃÔÂA½4Yìar9#Xï.rJ‚ÜÇ&—,²»ÝR ¡Ôµ‚yÄ®–QM™ìaçÜ ‰A1‰ÉË£ËRÏ4qöòýɨwgu°ÁÔæ)ý¢ïª$t!4‚)æKP¥ð¨³ASë…¬!\ùúÙNl%®±{‘`0 …³4<ÅÃ~t\`3ò04yðkͺSX€''~úø*.-..R”Øœp‘eÒ¡Æ—&‹Se-vtŠ“€áÝ,ÚTaúÂÆp4Ä=€ÏçvŒß¾zþÌÉGlÛüî³Ãžï×>Hí[Âyœ õkÖïè÷`èa67 EeÌ/ìù™êC?ý°Œ¢4†¹XòäæPA0 Ãt#‚œÓŽzBµ—^±ªµ]9ÏRXè HinG¨Wv[ü– ×ÏhüP¦Œ­ås²Ï¢æƒ‘D<‚E¢Ãf˜¹qþ䡃öïÞþáºWÉggx~ð õåÎc©'×lûòÔÅë#£S„"%Üæ´ eZ$Q@¸K³’•¯L­[Œ‰r‚°CöåB© @mDEFL?€—¶¯ J…bŽÅ nÇÆSÕ tếä%¹×Oå#`c@‚š>¶^ Å)QlfÄiHàX4·ý¤v IDAT“ßâí® N<|ÙxQÁÌ$'³,¸ ¢HùC‰DÔfÐÍŒ\9wxïö¬ÿ­7žö|¿ÁY®zé½½G.^¿3>Å‹sŒõ4P£$B¤Œƒ×~»]Üõ <°µ¤[ëÐø)›mœ'Ðì…ØõŸÐ a_‹ow æ…8}$/Û¡tzƒô€ƒÁæ€TÈÏ}Ÿƒ……<¬agîr;mâûƒƒãLÑŒ5HYðNM©ÔYѫڬÜBÕËú Ï_ åõE"AãÌèÈõ˧¾Ù³mË;k_[ýâÐBö79Hí]ÂyŒ µfó‘Ó7GÌŠ^ƒ;`AÆEjüŒüM$±a—ràqw1A›MbF莵}ºÐ¦@åo0 ½Áh: 1¤œ¶l~jôæáÝoÞøá»k_ê·<ËRO¿ýÁ΃¯"åw¼ìÕgÔb,Œð56iÖvZ†ý¼5a· ƒs&\ý™/Nc.¤øv ž~XXxÁKuï©ø·ÅöÎ úœ"‰7Ç.$Íל0䉨SìXéñ8¬&#—!¦¾RT;ÍœWmØÈ²ë¥XòñfRÈ£™L<„ÞÏ‹/BB/#Ó÷oœÿâ“õï½óÖê—þüK?4Ãócg9BêÉÕ›>ÿêøµÛㄨéY\IÑë¿É$ܸ f;ž;H¦š?Êb4 ÀâÖY8ùÎûnÎÉõhë@§º{áD!iœ4%aÉç÷²}€wð * ßÇYŠL7w 0;x”²£Hâ½v ³¡x÷(Véh ™£äkªEÊ9vvq[LÕ4Édb )ŸÃªŸ›žœpÿêÙ¯?Ùðæ¯¾üÔpŠúmÏR_,á<zfÍGûŽ^º1:>ZŸˆå ¼ Ú@#/üØ•‹ë/ D5qºÏN0pÿƒ4&ìÝux¹¤pÉá„[­`††Š{¯x¼.¨Ñ"~x¿_h L‡…ÂïòxØÓÎf±V•#ËÀØÜ*Ÿn±mÅfÝ…~1- ~Žæ³³¥è»rè¦Æn߸ré̉/·}´ú…'‡púíÏR»—pH½ôÎ'_Ÿ½uo|I¼),š‘Èfb³1M`¤¢Z! Ŧͼ'p.ê))ˆ:b§Z…Ÿ[`{Xîáj]!\sà#áÀªNp#xñ‡u¡‡SÑøë"¤Þl±:Ù¬Ï Nn¤„¯‘Á´ÈŒE—ŒYXೕ“£0jþNw0ôaÌCls“£×.>qhßÇëß|vØñýgBjÍÆ/®ÝŸœœâ,mßgÔ¤¯x EFŒEôxá7Æ ^Æq3È^DV‚ˆÐ«3‚76‡O¯O˜¯ˆì^þ‡×ëb„C,7ð~‚’/vó×àMù¢²ÝäàÆÒ†øªŽvF‘¦ÇËq=dü³³ÓÓÓðžá*#'_3áÜéŽ&¢È‘ƒ‰’´4™Y§Çîž?±o÷Ç®Y5L‰ú}ÎR8»~äü*I7¿¤þüö–/iŒšššžÕâ9+ÍÓ¨]õ­b5!–i +¼ná?fafªÍ­Qf½lÁaS´{„ Éîüï 0í-î»m—íõœ¬±ºN#“]lFÌl] « fôñÄ'0Å5 ñ"%Ì8²/ÚujƸ®H"‚<› ÈB¤ªJÍãøÈÍÓ_ïú 7QÃõûœ¤~ NX=znõÆíoÜDzOcÉr¥Ž'è÷¸ °„‹?p“Ø6\DÚx_-dœè°»…~Ýéºv‡ˆÆÅ²)¯|mkµ:1Gh·k‚‹ÝæöûíÂym&—)XšÙQÚ&ªùšÛ-ZßGßÈ‚Ÿc=ŠÁ¸¨@Ñ 1y×gwð<†µ¼ÃjÔë&ÆFïß½}å™C{·¬íå'†Ãßé µs ç1€Ô¿¿ñÞç_½>21ÅÂ|Héyu¦¶á6‹QXŸ.ÌZôÒÖVV±ùshË 3*0%An ®’ R?/;•Û8ƒWpPY9yïöø<6«Ëëe×ZöÝ´ /sfq´r!Ðæ"8 Ha{¡Ùó ¯ ¦ý …‡Cß0¤ …GùtÚMú™É±»·®_½táô‰£_îØðÖ C_‰ßí µc ç_RϯÝþå‰ó×LLNMOsX<{Ê’ŒÂ=Rí¹…f)“¨Jp›!¶E=’FZ¥É‰ÝĹçsi»÷bð ÈêÔqqv†Õæâ\—NÄ¢Ïçó‡#AÃmQ¦Û"Qš´zÈFg6ô™ô†/èubÊÃÏár :ˆ}dØ–X±:DeÂ>Ò®SØÌºé±ÑÛ×/Ÿ9õÍ‘ý_îÞ¹}ó0þw=Ë Ro|tðØ•[÷'§&S3sp>Ÿå) Rˆb23blÜgYï{-ö¸Qb¹„W0Óµ [¶Y¦BÄJ RXYðÆœ„¼5÷‡Ã/ûæ H1±Ð*6œ€º#ü–¹Õóú=í;øÿÛ;¯ª®,¯ü˜¤"8¢¢¨ €¨ **8€("(¢L2 2>xóÞ<¿Ç¨&UÕkõ?ÚwûÜ›Twu|éÖäû·ª Áq%|9çìýíoGq7d·„á–ÝK±D„vb'Q9Œ"ÓӺז&G‡úz»Þ¹ÕÚ|í¢,„ÿKÙ_’:Xß>8¾´æ±åö¦ޤÈ;Ç[6#TtcIÅPœˆrè$ÞVö#Űr/&jë’¤È÷—âÏ –œ™$#77£bxhQóŠVô<åæÝiQŽ`1ùÆG¹<­ަÒ4ÜA9œaü¢ƒ Ãa•‘È0Cœ³]T‘÷»]« ï†_ô>¼çÖµÆKu5'äÒ÷—âHên”º¤ŽÔÜ}:µà ø=8¥|´žžRp¢cæÈPÓ|j„WÕȋίšw˜P@‘/Cªvžeèp ©§L ¥w¬J£ F<ƒÛÿªuóÖÏ$R/q$¹Žì"DÅra¯˜8ÀÌ0uBäû£"¤iª01Ý«l$ZLj`˜Í<¬|ô#èY\X\œÒÑZùBÍ©ã?IUâ¯f_Iêt}×ÀìÚ9JRn ƒ¤8õÎ.é±U¾¸#8£,ð:wg v`ã[Òõq! ¦åšN¯'jÿ¦9>ë¤ú)Öaß uAR8•ð»;/¸ÿÂøŽH\õa*Bù|ü–‚Ól§I*¿º𬾛}÷n|¨³¥á|õ©J1•ޤîA‰Kêdž;tíC©6ÞX߸½‰UÌUíLç>j(l›8tÁýœJ¤S¸t‘¤è¦G;’1X\ã\r)\ý*¤SpÂQ›BvX\5Žê"夸hÐjŠã5³°(WF43B?ü‰y+ØŠš4Ôx•@Píºò‚C»È§¢h9¾òÕÕŠ4‘à1A|í¢6Aí Q°\åËd©£e—íâì0°[gUùa굆$˰ʯ c'€J= !„óñìì@Mó4EÌiÈc >UÃúÚÒÔØë¾':ïÜn¹~õÂYTi±_$õñ³7̸¶m¢…Œ¶·œñó)Dë±Bö!*…Tø1»b9º<ƒ…jo/j IªÑ.q¼Ã  ¸aywnL) –jf]9aq¦Ñ“I ²ï¸H,ÊN© Š9ÇAG=¨tŽRiQ“ yaôÂèh–fß¼|ÞÕy«õÚÕËΰËÑԭ"(aIUT]¼Û3:ë±$ÅW*ëË]cEuëöµ_úü%N—(µPà÷.yʼ—Ï u½ÜdâXŠNŠ8O:Á h†‰{>¤ø¬‡ Û>Ø0B@éÈ—áÝ” °£—ó£ã|‰¤<ó,G¨ 4¡¾t$ôÌŒöõëgQ©b°ïÑ/A\lL•ñm©±Îºš4V• :µ”Ȩº—J©·+‰­„¹lÌôzÖ]++««Ë“¯ܾR{öTåaqò•&Ž¤ÚŠ d%õÓ©¶½c3.M8­ö8ªUð9ck]„/`ºTƒ}Qæàë"| Ö)E–Ÿ}Sƒ‰æu9&“ÒP;´Ž¦Lac³¥°¤t*ÁåxëWµBëÙÆ(®{ð SÈp6[a©.m|Ç /<ˆTó§c+FËLsyÚR ¤KK²‘D*ŒÝïç¦'ߎ¼~r¿éb¥´uK˜ý!©:{_Í,ZŠr»=~úšÅ ;í MÔéâªÇæ-8¨ šèµ’ Â(kÓ¤½„ù\‚:¹±$'¥98‚—èb =Mf6·whKǧ‡YRpÆ’gì±*—jçSª"¿š )ž€ä¡cƒf3´¹VTQM"çM§ÑwufrôÍÐàËg·.ž)—ŠD ãHªµJURå—Û^ŒN/¯‘µÏí¦Ç×üÈ3qf7Ø“ŠúY#ÜôEõ‚;¹ITx6Ýî8©$ÿdÑÔ©¢uY2XÀž„b"½Êèþˆr‡‰ðXƒFË©á™Gºƒ.Uà„† K®ÕÇÓ¹Ý?îPäQ†$E«X¢•Õvv´ß¬¯9,O¨’Æ‘TK”¨¤mºûfrne‡:(þÇ€ª¢£dR†]0x¹”æOXЭÇÙÉBÎsT<ÚŽ¹]61_Hë©…`å” Y]Ê(KDðÝ´°ÊÐÔY¨v"íþ0 #¼'ŽwìªkñTnãçO–¤Èz”¢®¯õ“5ßüä˾÷n·Ü¸z匬­.qöƒ¤ÊÏÜ_&#)á à€ rz­}dëæmÊ*kÚS¶nEa…Qvƒ…o ~E’)žÇ5'R‰ÏQ5ùD~s’v€`HØù 9CLÇŸðj¸T:CãפÃûÛ(¨öãÏŸ>ÐVyJh1Ñ«v¯Œ¿êîhº\{úäayD•<ûARGj:žÍ,ºhä’ò9æ˜ÎNq±®jaïa*}ŠDÕÒö¸Ý£¥ÚBT<ÜŠ++/U#IÑã(ª¶}²¿*â–pTÍÁ³¤lïÙd† îyÑ8Ý£lWŠS™ƒÂÃ,I}úû/òi˜ÙMÍã^w¯/½zÞÑváÌ ©JìI5A‰JêLcÏËy—‡†9¬«Ÿ‡Vr‹×¶PÐYÁW/»Èë9é)Á9$Lƒïvu‚kyÖç8rÏ&¶8àž6ÃN‚QÄ^F2x:×MN#; ë#òˆr›QØ Â{ž¶ÒïìlåSéÜÇ_~ÞŠš¨ ®-ÍNON¼}ý¢«£ñ¼Èi°$Us£wha C¼tJa·KJçô>:*`þVIÈþÚ§R6K'R”20á4§U£|.…ãîs78j›÷ $öK ðˆžVüìŠB¬ae•0ùT¤‚½Îs˜!Á6HŠ ±p¬'7·w¶wvw·òÉdfçÃvÎx=Ùɇêí¾ÓrþØWÿR¾ ޤnAiJêÇË7û‡×,=áâGŠÂ¾ë ïh£øs{zËšHRè×’¤2)úк„¡ ãõÃ〠jìr)ªFx£™äekdíÃ25¬,ˆ© Írÿé\áãû¦rç†9ÿ‚ªõ´¶Ô-…U¤·w->|ØÌZ'e¾‰ùÝ«+KsÓ¯_<ë}ÒÓÕÑ~íòQ™ÞØ+8’"®ÿ%›6[QÕÖ5>³¼æöúµ€Çú6HA­^d‰“NçPWLOèš®L²Q>Wðd‰ÚsQjÉ€e)„Ýg΃¥5”†/™90=Ò¹¿Å—?ÛÍG¥ÞjQëªG‚½dMÞ[ìα¦üîÇO?îîdˆÅ4ü‹ï¦&Æ^>»w«ùFSÕڳ²ÃpáHê÷ääȪ%u¢¦ãùì¢kÝíÓ¬ç<Õût‚ýÔò øƒÙLn éüµÈ¯ßªî­u$…A(ëÂ]úŠÃ|Q› yc&{ŽBöT#ê±(ÿ¦­›ü¨âe ´I¶#lêMe $©;›éÕLÂA÷ÌÛá׃O¶6]ª;W]u¬âOøB¾ޤ®A JêÀ‘K7z‡—\n·' [O먲¾¨Mƒ.~ìSÕ8S6à]ˆNU96¡óêÎÆþ@ÎMJ$ *„Ó6wj/éh"!vo©.‰µÄ„0ý]^8eéæGS[ê Ȩ¶Tç)HBmÒÞÚÙÙÜÈeb!ÚÒ¨¹æŸ÷t=¸Ý\wöØ!1Jì5öº¤~:Ñxóùè’uH‘ÉOa˜–LÝ:žt­Þ öµéš-)µKSïJR–LL3q‰‡sËz;EÕ¬ý„XÈDÑrŒ ¸ˆ]æ8˜àvâ!ex‚þBIŠÖšBRØaÏFó‹Š6ÒolÐú° x§ù±§Ýwn]«¯>!b{=.©ïoë_Y÷ ¬9@ ­ó‚†åÜé¥È1:htŽH2ØD£ï1Žóвi–ç<(ˆŽµ8Â’ì’ÕÙD?9rtgÄ(#ý:PQˆsaxPÑ`¯„®G±fuösPfgTa“v’àŽÅRìXX·þ‹àZ^|7Ù÷èVKÃåºêS2½±q$ÕT¥'©O\hôz‚b‘ÛåhŒ‚rБè¢k,©¦§4MM¨›ÎµOåêé|Ó#ë:Lá˜&hóKŠ,¸ä¡GŒ½4!l‡¢ôLüZ!dƦâѰ¡õ ‹%°ŠR8ëk·¹-©B!›¶df]* ¿Çµ2?;5üòþí¦úš³UÇ$5vOâHêj”ž¤ÊÏ6=찥¢U'|lû†‹žo:%Ô Žƒ0UTrŒLèÍ,bS."3¤òhÃj¿;LDH§À¸T˜ED«@#ñ8bú¨ú`†X¡¦²Æšllõãí:ˆ’@®¹uïËçéÛB:T4¿wåýÛ‘ÁgÚ/UŸ<ô“<¢ö({\R‡/´ö½šœ÷ñÉ%eGƒ®~Á }ÛÃ!}™œð…qÞ¨*œ›öŽ\6×r!Ü  å’%ÈOÁâÃÆ_œ]Ȉ1t5;b«’¢˜Be˜Å­0žÊoÐÉ´¡Ž§LÖú6—Œ<ÖKpmu~z¨¿§ë~Ûµš3G¥Æ·wq$ÕX¥'©ãõwGæ–ÑÕµt¤³¤T/M!¼i¸í YÑ—»jÀ†ÜlÚ÷4ÃÎ{ù­¤¸Ï¤s6l,¦öBE0Š¥‚ä„å¢ë&dªnrw*¬ŒPðW¤r;»»Û4b¸QȧSiZE5Ý®¥¥¥…ùÉ‘gÝwoµÖ×J ÄžfKªº¥{|ÖåÕ «Ù‚¸¥ÑÿÕáDV LâMòJ<(¿éÎÚ^ü­Æ¹.±ûi#NJÉÂ0ìù\'§EçK%úMpçêJLh*|ŒðS“VÓ'7vùûÏ6 [Û[›ù,r6MÍ㚟ìí¾ÙTsFÖîuI5AéIêüÍ'Óï×½šA5>¯êÿ r±.!û&‡ª-)ÓvÞAoš][ç*8WÇãHþBb&Õ$ð–²·$†ù~grкaKJ³D¯Îr¥jµŠCØË‘Êf2[þñ_>Zo(ªLdST ú<+ Ã/úŸ?}Üq»¾æÈAyBíuö¸¤.Þé›[q{É¡€0/–”Á–>\àèä09˜’‡–H!vTà•¤©¡_ϸÄq õƒ¤$b»mHYÎ1‘4ìš g]Ø×Hl/ˆg²ØöaÝù²ù|ns÷ïÿüûÇ\Áî󬯮./Nôt¶Þ¸våÒ¹*1›ïIÕAéIêÒ¾yKRØ Ú£èt:…t˜bbäJ X2Cƒµ¸ðáñdò늶õò,¦‰Äi}5VðRÿÕ41~eFhÄÉ=Â3‰^Saväbµ¡³ü'^ëEF¾€}ua~fzòíøë÷[Où“þe ޤ®AÉIêÇ«÷ž/¸Ü°Ÿ£\niÉ€É4¸QÅév¤?¾öQT©D!UÍ òq2:P¼_”·S49fMöé…1“QrâÄ0>5úÕxßšÚsÍSôIHŠ,G$¶YÈç6¶6Sͳ¶ô~zrldxh°·ëzíßþ¤ןÂÞ–Tyó£A˜Ð”; 7’ôù†©‚’Ñt5¹'E}_Ø*ØPZÛ=DGS˜MK”P† C$ÒòpˆW>El{õ‘ ØùEâ ³—3°š[w½\nkk“Ö¬mlílofS`ò­¼›y;:Øÿ¤ûá½[ 52·±Ïp$u¹JNR-ÝC‹«no€ƒ\5´§¼4ß¡ëAlé… ’ ¢ÎIiô† –ˆÉST:‡%5ÞtHj ÀËáaT 1U[W¥[`è#ÆÍ´N'ÛØÞ*,I )ë¸JFÍp,j)j|äÕËÞî{·Û®^>%MÝý†#©KEPr’:ÜÖófÑei])²šC7ôô{<>É븜ù0BO ã* ‘û5Êu@žŽWÏ ¬×åM¹¯E´%Î;N^"Eš—ˆ¡D"®{æßÍ ¿xÒÞÖT_])Eó}Ž#© EPz’ºÐ>°H­^:Œ¨ÈÑxuJဠ:ÜJZâ±xñE!¬ÇåºuûÛȯò!I°+ÇP»  ®khX²CóÀ‰T&K©Îq™ÊÒœI*©vÊ'’q#èñ›!ÓzDM<ï¾ÛT_[]!®£ýΗÔñÆ®…uz%‘eÂ:^‚ªœGŠ “Ë0Ä;Ü‘‚„nSk¨éÓ êÿêºý`RJ£T)ð³Ç°Lîå&RÙÝ[¹t&G¡,[›…4oIŒðÒø€wuqvfþýüÄèËþîΦº3G¤õ-àHª¶JOR‡.u¼w#^n;Ð1׋T(¬±=ÑaTȃ{Ü´³(4 qo ¨õ„’ D¢aÞÿ¤¦ÙE²D2ÿôóNñF…ü¦õrJqˆº©ÓÎëZž›~ófh ïñÛMU‡¥À÷màHŠø]9•dÚìÁº»ïÖyý-%¬Ó%@=Xd¡[Ÿ †B–¤t†à8*¯Hùˆ>d>Ûš²G§Ô@cHÍäêœ!fþâŒJ&Ó…O?or…­ííÂæÖf>‰&õ˜=îµ÷3ãÃÏw=ìì¸Õ\wZ ß Ž¤öæ)õ}mû´+øëæºî|qÝAÇDSH-yÂõMW1åx0©'—õC©ö «ó̤±û€fçš³¿‡Ö} =Éomò…ÍÝÝÍÂæf!·®|šÏ³²ø~ayéýøÐ“‡mMÎ>yâPßޤjŠ ô$Uv¶mÊåx&‚8\¨ÿjɃ)cùìõ4öœ<—À­Ìë¥mÙôÃñ#Õ ùj™Žêcí(lØ1J ëE1|…ÍíüÆF> ŸkùÝôäôÜÜÌ›íWjŽ‹œ¾5I/‚”Ôßê†—ÙÆT…ÊãænP GéX"ŠW\H&§‘¤¬Kö{¨ñvu³CïŠsÌ!,'À®KPððe(à’ …\:•É$£ jæíËçÏž¿|ú¨µ±J&¡¾=öº¤ÊN<Ÿ jìC¢Ë™ÁÝ^ü4®¼ƒ`D ¢Î#òô]AœµôÜR^=CæbéËçq“¤È¾g¨w©&hKŠ+ê!=¨æ§¸‰e×-T¹é-1K?YZë†åØét&c‰*•ÎYo§\&M³º™¸õz\sSï_¿êï½Ûr±¶¦¶®î¹Ӈ$Žï[Ä‘ÔÙ"(II•]™÷‘ÝY>e‚dóS6$Záaèd¼®•åÅÅ÷óýî]½XuâèÑcÇŽ–ËèÆ7Ï~TÙ÷óÑd2¥ðŸR¤¨]ÕYŽ\²¼†¸…í6±˜³M€ŒF 2’ãÂ÷á?þóðFX/© ÍB%Ñp3¿winb|ttäÍÐËþ‹Õ¢$ÁÆ‘Ôé"(UI•Ý~¥ÅSqŒ"åˆ÷N+IÙ>AHvÅ%…«<¨€—AÛ)“Ûþ域¬ó)Geò ,~GõÀÚÊòʪ˵º4ñ¦¿¯¿¿ÿÙÓ®û­WÏÈóIø ޤªŠ d%UV;¼ª'29륃,Îk†ÉÄkÉŽB ñîCì `V0‘Íhz×}æ-ñd }˜ÎШ{ž*æ¦ævÍϼ·ìº×Úzëvû­¶Æ‹•¿î¿ a¯±O$õÃñÕh:Ÿµ®gtÃÎÁ8†tÃQ„G¨xNÿO$x× M´§ ”g”Íæøå”Ëfr›[[ù J{I æsé8$f'ß ¾|ñìñíæÆ†Æ¦¦¦†ÚÓråþGR§Š t%UVÕÚçÒ‘¢Çu.O§i'•ï( Bʼn‘ŽRÖ=ŽšIYñdÙÊ´ À­§l~{g»E°C^7p¦…4ÏÚ»ñ×OÞm¿ÕÜTwþdåñã••råþûERjÚ'WBÔžEž¹õA&KÙ*c¶îxIš乌l>—åp0Hª@; UÓ)OW¿œõ‰|:B4Åúº×O^ Ë:£†ú;o55Ô_¬­ª<øÃß‹ABøŸìI••U´÷ι43A‘*1ä~á”Í$,%%sÙ¥V¦³››y4li±M‚DFo§B6C?>Cªd<•É$¢šoeia~öíØððЫ‘‰©É±Þû·/U9Tþ“\ö„ÿGR'‹ ¤%UVwóÕäÊz(a‹4‰Å…l‚Î&¶=¤2¹­­B­&äƒYWAKAÖwZg’ŽRIîoi™‰ñÑW/ž=í~Ô;0øòùƒ»7êOJæ²ðI(‚Ò–TEÍýgcSëFŠ$•"e6¶w6óû]3ÙüÖV>—£•O™­_ q_<ǬS+b~·k¢,gÆG‡z{:ïÞlkï|xÿš*9Ÿ„ϱ$UVväìÛO߸üZ‹n"±ÌæÖf."ÕÐ.Õô6¨¨—áĽh8¤ñô.5±‚ºæY›šy3ØßÓõèQç½;mÍõÏU“Õèèßäé$#©Ê"(uI••UÕÞèž~¿¼ê#cy(j=™e“©la‹Òÿ©õDË­ã´v×4œ÷ð{Ö×Ö×fÇG‡_¿ìÖuÿv[[kók WjªO?tPÆs…"Ùg’*+û©òê­CãSKìø½n·Çë7#Ù­O70Õ‹„(L£ì‰Õ¥…Å…÷óóó3“c£#¯_õ÷=yÜÙÞÚpñìTdNV©IBáàHêxìI•ýpöò=ýƒ3 K+kkk.—kmmݯ§ò»;Yz>шgݵæv¯­,Y½ÉIòë ½xþüyß³žîλÍOŸ8\qð`yEEEù2ÿ$üI+‚=!©²²ƒ•o¶?zòbèÍØøÄÔܼu -¬úƒ~Ÿ{}ݽ¶ø~aaþÝôÛññ±‘7/úw=ê¼{³õZcÃÕë--ׯÖ;* \áÿŽ#)âwåT’i³ÿž'ÏÕ7ݼÛÕÓÛ?0øz|rjrbêÝÒÒìôÌÜû…÷ÓS33S£/úž÷uu¶µÜ¸zåÂùS••'ÏÔÔž¯>Vþ¥ÿ ßޤöÑ)ET¯®¹ÒØÔÜróöýGwwu÷twtôô ¼|ñbðÍ›ÁçOîÜlkk½qéœ f_GRG‹`IÊÕ‘“§ÏÖÖ]©¿ÖÜÚÚÖÒ|½©áêíŽv?íèíê¸ÞpùR]É…/Ìþ•”uÿûñàÑÊÓÕçkj/Ô]¨9SuÚºÞhnnïìî¾ßÞRw®êä11C_GRGŠ`IÊæÀ÷ßsÕîÀOå‡V×64^ª©’„ðUp$u¸ö¨¤þT>qDz·Â×á”” |MI*‘” |‘” |QDR‚ðEq$UQ")AøŽ¤Ê‹@$%ŸC$%_GR‹@$%ŸC$%_GR?HJ>‡HJ¾(ޤþV")Aø")Aø¢8’ú±DR‚ð9¾˜¤¾ûîë¤SüÕÿ€áá(â‡"ø]Iýæ[‘”ðíâ(âû"I ÂçI ÂåËIê;û‘”ð-ã(â@ü®`¾Rvæ_ýHþÿ"âßJé»WÏûî»ß~þk]üaoò]QüÎÏÿoáÿ…HJ¾(")Aø²È[J¾,Õ¶AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA„ÿÿ¥â5õ8 É+IEND®B`‚danieljprice-splash-4d1f09c/docs/figs/xsec2D.eps000077500000000000000000000365131477365367100216260ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: xsec2D.eps %%Creator: fig2dev Version 3.2 Patchlevel 1 %%CreationDate: Wed Aug 18 16:28:09 2004 %%For: dprice@cass77 (Daniel Price) %%Orientation: Portrait %%BoundingBox: 0 0 349 331 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /MyAppDict 100 dict dup begin def /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save 2.0 362.0 translate 1 -1 scale .9 .9 scale % to make patterns same scale as in xfig % This junk string is used by the show operators /PATsstr 1 string def /PATawidthshow { % cx cy cchar rx ry string % Loop over each character in the string { % cx cy cchar rx ry char % Show the character dup % cx cy cchar rx ry char char PATsstr dup 0 4 -1 roll put % cx cy cchar rx ry char (char) false charpath % cx cy cchar rx ry char /clip load PATdraw % Move past the character (charpath modified the % current point) currentpoint % cx cy cchar rx ry char x y newpath moveto % cx cy cchar rx ry char % Reposition by cx,cy if the character in the string is cchar 3 index eq { % cx cy cchar rx ry 4 index 4 index rmoveto } if % Reposition all characters by rx ry 2 copy rmoveto % cx cy cchar rx ry } forall pop pop pop pop pop % - currentpoint newpath moveto } bind def /PATcg { 7 dict dup begin /lw currentlinewidth def /lc currentlinecap def /lj currentlinejoin def /ml currentmiterlimit def /ds [ currentdash ] def /cc [ currentrgbcolor ] def /cm matrix currentmatrix def end } bind def % PATdraw - calculates the boundaries of the object and % fills it with the current pattern /PATdraw { % proc save exch PATpcalc % proc nw nh px py 5 -1 roll exec % nw nh px py newpath PATfill % - restore } bind def % PATfill - performs the tiling for the shape /PATfill { % nw nh px py PATfill - PATDict /CurrentPattern get dup begin setfont % Set the coordinate system to Pattern Space PatternGState PATsg % Set the color for uncolored pattezns PaintType 2 eq { PATDict /PColor get PATsc } if % Create the string for showing 3 index string % nw nh px py str % Loop for each of the pattern sources 0 1 Multi 1 sub { % nw nh px py str source % Move to the starting location 3 index 3 index % nw nh px py str source px py moveto % nw nh px py str source % For multiple sources, set the appropriate color Multi 1 ne { dup PC exch get PATsc } if % Set the appropriate string for the source 0 1 7 index 1 sub { 2 index exch 2 index put } for pop % Loop over the number of vertical cells 3 index % nw nh px py str nh { % nw nh px py str currentpoint % nw nh px py str cx cy 2 index show % nw nh px py str cx cy YStep add moveto % nw nh px py str } repeat % nw nh px py str } for 5 { pop } repeat end } bind def % PATkshow - kshow with the current pattezn /PATkshow { % proc string exch bind % string proc 1 index 0 get % string proc char % Loop over all but the last character in the string 0 1 4 index length 2 sub { % string proc char idx % Find the n+1th character in the string 3 index exch 1 add get % string proe char char+1 exch 2 copy % strinq proc char+1 char char+1 char % Now show the nth character PATsstr dup 0 4 -1 roll put % string proc chr+1 chr chr+1 (chr) false charpath % string proc char+1 char char+1 /clip load PATdraw % Move past the character (charpath modified the current point) currentpoint newpath moveto % Execute the user proc (should consume char and char+1) mark 3 1 roll % string proc char+1 mark char char+1 4 index exec % string proc char+1 mark... cleartomark % string proc char+1 } for % Now display the last character PATsstr dup 0 4 -1 roll put % string proc (char+1) false charpath % string proc /clip load PATdraw neewath pop pop % - } bind def % PATmp - the makepattern equivalent /PATmp { % patdict patmtx PATmp patinstance exch dup length 7 add % We will add 6 new entries plus 1 FID dict copy % Create a new dictionary begin % Matrix to install when painting the pattern TilingType PATtcalc /PatternGState PATcg def PatternGState /cm 3 -1 roll put % Check for multi pattern sources (Level 1 fast color patterns) currentdict /Multi known not { /Multi 1 def } if % Font dictionary definitions /FontType 3 def % Create a dummy encoding vector /Encoding 256 array def 3 string 0 1 255 { Encoding exch dup 3 index cvs cvn put } for pop /FontMatrix matrix def /FontBBox BBox def /BuildChar { mark 3 1 roll % mark dict char exch begin Multi 1 ne {PaintData exch get}{pop} ifelse % mark [paintdata] PaintType 2 eq Multi 1 ne or { XStep 0 FontBBox aload pop setcachedevice } { XStep 0 setcharwidth } ifelse currentdict % mark [paintdata] dict /PaintProc load % mark [paintdata] dict paintproc end gsave false PATredef exec true PATredef grestore cleartomark % - } bind def currentdict end % newdict /foo exch % /foo newlict definefont % newfont } bind def % PATpcalc - calculates the starting point and width/height % of the tile fill for the shape /PATpcalc { % - PATpcalc nw nh px py PATDict /CurrentPattern get begin gsave % Set up the coordinate system to Pattern Space % and lock down pattern PatternGState /cm get setmatrix BBox aload pop pop pop translate % Determine the bounding box of the shape pathbbox % llx lly urx ury grestore % Determine (nw, nh) the # of cells to paint width and height PatHeight div ceiling % llx lly urx qh 4 1 roll % qh llx lly urx PatWidth div ceiling % qh llx lly qw 4 1 roll % qw qh llx lly PatHeight div floor % qw qh llx ph 4 1 roll % ph qw qh llx PatWidth div floor % ph qw qh pw 4 1 roll % pw ph qw qh 2 index sub cvi abs % pw ph qs qh-ph exch 3 index sub cvi abs exch % pw ph nw=qw-pw nh=qh-ph % Determine the starting point of the pattern fill %(px, py) 4 2 roll % nw nh pw ph PatHeight mul % nw nh pw py exch % nw nh py pw PatWidth mul exch % nw nh px py end } bind def % Save the original routines so that we can use them later on /oldfill /fill load def /oldeofill /eofill load def /oldstroke /stroke load def /oldshow /show load def /oldashow /ashow load def /oldwidthshow /widthshow load def /oldawidthshow /awidthshow load def /oldkshow /kshow load def % These defs are necessary so that subsequent procs don't bind in % the originals /fill { oldfill } bind def /eofill { oldeofill } bind def /stroke { oldstroke } bind def /show { oldshow } bind def /ashow { oldashow } bind def /widthshow { oldwidthshow } bind def /awidthshow { oldawidthshow } bind def /kshow { oldkshow } bind def /PATredef { MyAppDict begin { /fill { /clip load PATdraw newpath } bind def /eofill { /eoclip load PATdraw newpath } bind def /stroke { PATstroke } bind def /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def /ashow { 0 0 null 6 3 roll PATawidthshow } bind def /widthshow { 0 0 3 -1 roll PATawidthshow } bind def /awidthshow { PATawidthshow } bind def /kshow { PATkshow } bind def } { /fill { oldfill } bind def /eofill { oldeofill } bind def /stroke { oldstroke } bind def /show { oldshow } bind def /ashow { oldashow } bind def /widthshow { oldwidthshow } bind def /awidthshow { oldawidthshow } bind def /kshow { oldkshow } bind def } ifelse end } bind def false PATredef % Conditionally define setcmykcolor if not available /setcmykcolor where { pop } { /setcmykcolor { 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor - pop } bind def } ifelse /PATsc { % colorarray aload length % c1 ... cn length dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor } ifelse } ifelse } bind def /PATsg { % dict begin lw setlinewidth lc setlinecap lj setlinejoin ml setmiterlimit ds aload pop setdash cc aload pop setrgbcolor cm setmatrix end } bind def /PATDict 3 dict def /PATsp { true PATredef PATDict begin /CurrentPattern exch def % If it's an uncolored pattern, save the color CurrentPattern /PaintType get 2 eq { /PColor exch def } if /CColor [ currentrgbcolor ] def end } bind def % PATstroke - stroke with the current pattern /PATstroke { countdictstack save mark { currentpoint strokepath moveto PATpcalc % proc nw nh px py clip newpath PATfill } stopped { (*** PATstroke Warning: Path is too complex, stroking with gray) = cleartomark restore countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse gsave 0.5 setgray oldstroke grestore } { pop restore pop } ifelse newpath } bind def /PATtcalc { % modmtx tilingtype PATtcalc tilematrix % Note: tiling types 2 and 3 are not supported gsave exch concat % tilingtype matrix currentmatrix exch % cmtx tilingtype % Tiling type 1 and 3: constant spacing 2 ne { % Distort the pattern so that it occupies % an integral number of device pixels dup 4 get exch dup 5 get exch % tx ty cmtx XStep 0 dtransform round exch round exch % tx ty cmtx dx.x dx.y XStep div exch XStep div exch % tx ty cmtx a b 0 YStep dtransform round exch round exch % tx ty cmtx a b dy.x dy.y YStep div exch YStep div exch % tx ty cmtx a b c d 7 -3 roll astore % { a b c d tx ty } } if grestore } bind def /PATusp { false PATredef PATDict begin CColor PATsc end } bind def % vertical lines 11 dict begin /PaintType 1 def /PatternType 1 def /TilingType 1 def /BBox [0 0 1 1] def /XStep 1 def /YStep 1 def /PatWidth 1 def /PatHeight 1 def /Multi 2 def /PaintData [ { clippath } bind { 8 16 true [ 8 0 0 -16 0 16 ] {<11111111111111111111111111111111>} imagemask } bind ] def /PaintProc { pop exec fill } def currentdict end /P10 exch def 1.1111 1.1111 scale %restore scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 7030 m -1000 -1000 l 6783 -1000 l 6783 7030 l cp clip 0.06000 0.06000 sc 7.500 slw % Ellipse n 2175 1575 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3750 3075 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4800 1575 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4800 4950 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1950 2775 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3472 1822 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 5625 3525 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 600 2325 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3300 675 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 878 772 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4972 2603 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4725 3600 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 5700 675 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3075 5550 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 2925 3900 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 450 5175 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1200 3675 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3750 4425 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1950 2775 1969 1969 0 360 DrawEllipse gs col0 s gr % Polyline n 1950 2775 m 750 1200 l cp gs col0 s gr % Polyline n 4527 543 m 1002 6018 l gs col7 0.00 shd ef gr gs col0 s gr % Polyline 60.000 slw n 1830 4744 m 3705 1819 l cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def 15.00 15.00 sc P10 [8 0 0 -16 122.00 121.27] PATmp PATsp ef gr PATusp gs col0 s gr % Polyline 7.500 slw n 1950 2775 m 1800 4800 l cp gs col0 s gr % Polyline n 1950 2775 m 3675 1875 l cp gs col0 s gr % Polyline n 1950 2775 m 3450 2175 l cp gs col0 s gr % Polyline n 1950 2775 m 2025 4425 l cp gs col0 s gr % Polyline n 1950 2775 m 2250 4125 l cp gs col0 s gr % Polyline n 1950 2775 m 3300 2475 l cp gs col0 s gr % Polyline n 1950 2775 m 3150 2775 l cp gs col0 s gr % Polyline n 1950 2775 m 2400 3750 l cp gs col0 s gr % Polyline n 1950 2775 m 2925 3075 l cp gs col0 s gr % Polyline n 1950 2775 m 2550 3525 l cp gs col0 s gr % Polyline n 1950 2775 m 2775 3375 l cp gs col0 s gr /Times-Roman ff 300.00 scf sf 1725 5100 m gs 1 -1 sc (\(x1,y1\)) col0 sh gr /Times-Roman ff 300.00 scf sf 1425 1950 m gs 1 -1 sc (2h) col0 sh gr /Times-Italic ff 300.00 scf sf 1725 2025 m gs 1 -1 sc (i) col0 sh gr /Times-Roman ff 300.00 scf sf 3825 1875 m gs 1 -1 sc (\(x2,y2\)) col0 sh gr /Times-Italic ff 300.00 scf sf 1725 2925 m gs 1 -1 sc (i) col0 sh gr $F2psEnd rs end danieljprice-splash-4d1f09c/docs/figs/xsec2D.fig000077500000000000000000000051421477365367100215760ustar00rootroot00000000000000#FIG 3.2 Landscape Center Inches Letter 100.00 Single -2 1200 2 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 2175 1575 75 75 2175 1575 2175 1650 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3750 3075 75 75 3750 3075 3750 3150 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4800 1575 75 75 4800 1575 4800 1650 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4800 4950 75 75 4800 4950 4800 5025 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 1950 2775 75 75 1950 2775 1950 2850 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3472 1822 75 75 3472 1822 3472 1897 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 5625 3525 75 75 5625 3525 5625 3600 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 600 2325 75 75 600 2325 600 2400 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3300 675 75 75 3300 675 3300 750 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 878 772 75 75 878 772 878 847 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4972 2603 75 75 4972 2603 4972 2678 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4725 3600 75 75 4725 3600 4725 3675 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 5700 675 75 75 5700 675 5700 750 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3075 5550 75 75 3075 5550 3075 5625 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 2925 3900 75 75 2925 3900 2925 3975 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 450 5175 75 75 450 5175 450 5250 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 1200 3675 75 75 1200 3675 1200 3750 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3750 4425 75 75 3750 4425 3750 4500 1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 1950 2775 1969 1969 1950 2775 3225 4275 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 750 1200 1950 2775 2 1 0 1 0 7 100 0 0 0.000 0 0 -1 0 0 2 4527 543 1002 6018 2 3 0 5 0 7 100 0 50 0.000 0 0 -1 0 0 3 1830 4744 3705 1819 1830 4744 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 1800 4800 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 3675 1875 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 3450 2175 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 2025 4425 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 2250 4125 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 3300 2475 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 3150 2775 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 2400 3750 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 2925 3075 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 2550 3525 1950 2775 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 2775 3375 1950 2775 4 0 0 100 0 0 20 0.0000 4 270 885 1725 5100 (x1,y1)\001 4 0 0 100 0 0 20 0.0000 4 210 300 1425 1950 2h\001 4 0 0 100 0 1 20 0.0000 4 210 90 1725 2025 i\001 4 0 0 100 0 0 20 0.0000 4 270 885 3825 1875 (x2,y2)\001 4 0 0 100 0 1 20 0.0000 4 210 90 1725 2925 i\001 danieljprice-splash-4d1f09c/docs/figs/xsec3D.eps000077500000000000000000000114141477365367100216200ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: xsec3D.eps %%Creator: fig2dev Version 3.2 Patchlevel 1 %%CreationDate: Wed Aug 18 16:30:42 2004 %%For: dprice@cass77 (Daniel Price) %%Orientation: Portrait %%BoundingBox: 0 0 349 303 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save 2.0 338.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 6633 m -1000 -1000 l 6783 -1000 l 6783 6633 l cp clip 0.06000 0.06000 sc 7.500 slw % Ellipse n 2175 1575 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3750 3075 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4800 1575 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4800 4950 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1950 2775 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3472 1822 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 5625 3525 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 600 2325 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3300 675 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 878 772 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4972 2603 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4725 3600 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 5700 675 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3075 5550 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 2925 3900 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 450 5175 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1200 3675 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3750 4425 75 75 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1950 2775 1969 1969 0 360 DrawEllipse gs col0 s gr % Polyline n 1950 2775 m 750 1200 l cp gs col0 s gr /Times-Roman ff 300.00 scf sf 1425 1950 m gs 1 -1 sc (2h) col0 sh gr /Times-Italic ff 300.00 scf sf 1725 2025 m gs 1 -1 sc (i) col0 sh gr /Times-Italic ff 300.00 scf sf 1725 2925 m gs 1 -1 sc (i) col0 sh gr $F2psEnd rs danieljprice-splash-4d1f09c/docs/figs/xsec3D.fig000077500000000000000000000031261477365367100215770ustar00rootroot00000000000000#FIG 3.2 Landscape Center Inches Letter 100.00 Single -2 1200 2 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 2175 1575 75 75 2175 1575 2175 1650 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3750 3075 75 75 3750 3075 3750 3150 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4800 1575 75 75 4800 1575 4800 1650 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4800 4950 75 75 4800 4950 4800 5025 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 1950 2775 75 75 1950 2775 1950 2850 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3472 1822 75 75 3472 1822 3472 1897 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 5625 3525 75 75 5625 3525 5625 3600 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 600 2325 75 75 600 2325 600 2400 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3300 675 75 75 3300 675 3300 750 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 878 772 75 75 878 772 878 847 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4972 2603 75 75 4972 2603 4972 2678 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4725 3600 75 75 4725 3600 4725 3675 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 5700 675 75 75 5700 675 5700 750 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3075 5550 75 75 3075 5550 3075 5625 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 2925 3900 75 75 2925 3900 2925 3975 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 450 5175 75 75 450 5175 450 5250 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 1200 3675 75 75 1200 3675 1200 3750 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3750 4425 75 75 3750 4425 3750 4500 1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 1950 2775 1969 1969 1950 2775 3225 4275 2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 1950 2775 750 1200 1950 2775 4 0 0 100 0 0 20 0.0000 4 210 300 1425 1950 2h\001 4 0 0 100 0 1 20 0.0000 4 210 90 1725 2025 i\001 4 0 0 100 0 1 20 0.0000 4 210 90 1725 2925 i\001 danieljprice-splash-4d1f09c/docs/geometry.rst000066400000000000000000000160611477365367100214130ustar00rootroot00000000000000.. _sec:coordtransforms: Coordinate transforms ===================== Particle positions and vectors defined on the particles can be plotted in non-cartesian coordinate systems. The coordinate system can be set via the :ref:`sec:menu-o`, via the ``change coordinate system`` option. The actual coordinate transformations are defined in a standalone Fortran module called ``geometry.f90`` and the precise details can be determined by looking in this file. For reference, however the transformations are given below. Cylindrical Polar Coordinates ------------------------------ For cylindrical coordinates the transformations are: .. math:: \begin{array}{lclp{1cm}lcl} R & = & \sqrt{x^2 + y^2} & & x & = & R\cos\phi \\ \phi & = & \tan^{-1}{(y/x)} &; & y & = & R\sin\phi \\ z & = & z & & z & = & z\\ \end{array} where vectors transform according to: .. math:: \begin{array}{lclp{1cm}lcl} v_R & = & v_x \frac{x}{R} + v_y \frac{y}{R} & & v_x & = & v_R \cos\phi - v_\phi \sin\phi \\ v_\phi & = & v_x \left(\frac{-y}{R}\right) + v_y \left(\frac{x}{R}\right) &; &v_y & = & v_R \sin\phi + v_\phi \cos\phi \\ v_z & = & v_z & & v_z & = & v_z. \\ \end{array} In the case where these vectors are velocities, the :math:`v_{\phi}` component corresponds to :math:`v_{\phi} = r\dot{\phi}`. At the origin we assume :math:`\phi = 0`, implying :math:`\cos\phi = 1` and therefore :math:`\frac{x}{R} = 1` and :math:`\frac{y}{R} = 0`. This ensures the transformations are reversible everywhere. Spherical Polar Coordinates ---------------------------- For spherical coordinates the transformations are: .. math:: \begin{array}{lclp{1cm}lcl} r & = & \sqrt{x^2 + y^2 + z^{2}} & & x & = & r\cos\phi\sin\theta\\ \phi & = & \tan^{-1}{(y/x)} &; & y & = & r\sin\phi\sin\theta \\ \theta & = & \cos^{-1}(z/r) & & z & = & r\cos\theta \\ \end{array} where vectors transform according to: .. math:: \begin{array}{lclp{1cm}lcl} v_r & = & v_x \frac{x}{r} + v_y \frac{y}{r} + v_{z}\frac{z}{r} & & v_x & = & v_r \cos\phi\sin\theta- v_\phi \sin\phi + v_\theta \cos\phi\cos\theta \\ v_\phi & = & v_x \left(\frac{-y}{\sqrt{x^2 + y^{2}}}\right) + v_y \left(\frac{x}{\sqrt{x^2 + y^{2}}}\right) &; &v_y & = & v_r \sin\phi\sin\theta + v_\phi \cos\phi + v_{\theta} \sin\phi\cos\theta \\ v_\theta & = & v_{x}\frac{xz}{r \sqrt{x^{2} + y^{2}}} + v_{y}\frac{yz}{r \sqrt{x^{2} + y^{2}}} - v_{z}\frac{(x^{2} + y^{2})}{r\sqrt{x^{2} + y^{2}}} & & v_z & = & v_r \cos\theta - v_\theta \sin\theta. \\ \end{array} In the case where these vectors are velocities, the components :math:`v_{\phi}` and :math:`v_{\theta}` correspond to :math:`v_{\phi} = r\sin{\theta}\dot{\phi}` and :math:`v_{\theta} = r\dot{\theta}` respectively. Toroidal Coordinates --------------------- Toroidal coordinates represent a local frame of reference inside a torus. The coordinate transformations are given by .. math:: \begin{array}{lclp{1cm}lcl} r & = & \sqrt{[(x^2 + y^2)^{1/2} - R]^{2} + z^{2}} & & x & = & (r\cos\theta + R) \cos\phi \\ \theta & = & \tan^{-1} \left[\frac{z}{(\sqrt{x^{2} + y^{2}} - R)}\right] &; & y & = & (r\cos\theta + R)\sin\phi \\ \phi & = & \tan^{-1}(y/x) & & z & = & r\sin\theta \\ \end{array} where :math:`R` is the radius of the torus. The use of the inverse tangent in :math:`\theta` instead of :math:`\theta = \sin^{-1}(z/r)` is necessary to get the quadrant correct (via the ``atan2`` function). Vectors transform according to: .. math:: \begin{array}{lclp{2cm}lcl} v_r & = & v_x \frac{x(r_{cyl} - R)}{r r_{cyl}} + v_y \frac{y(r_{cyl} - R)}{r r_{cyl}} + v_{z} \frac{z}{r} & & v_x & = & v_r \cos\theta\cos\phi- v_\theta \sin\theta\cos\phi - v_\phi\sin\phi \\ v_\theta & = & v_x \frac{-zx}{r r_{cyl}} + v_y\frac{-zy}{r r_{cyl}} + v_{z}\frac{(r_{cyl} - R)}{r} &; &v_y & = & v_r \cos\theta\sin\phi - v_\theta \sin\theta\sin\phi + v_\phi\cos\phi \\ v_\phi & = & v_{x} \left(\frac{-y}{r_{cyl}}\right) + v_{y} \left(\frac{x}{r_{cyl}}\right) & & v_z & = & v_{r}\sin\theta + v_{\theta} \cos\theta \\ \end{array} where we have defined, for convenience, .. math:: r_{\rm cyl} = \sqrt{x^{2} + y^{2}} = r\cos\theta + R. \nonumber and the velocities :math:`v_\theta` and :math:`v_\phi` correspond to :math:`r \dot{\theta}` and :math:`r_{\rm cyl} \dot{\phi}`, respectively. The torus radius :math:`R` is a parameter in the ``geometry`` module and is set to :math:`1` by default. Flared Cylindrical Polar Coordinates ------------------------------------- For flared cylindrical coordinates the transformations are: .. math:: \begin{array}{lclp{1cm}lcl} R & = & \sqrt{x^2 + y^2} & & x & = & R\cos\phi \\ \phi & = & \tan^{-1}{(y/x)} &; & y & = & R\sin\phi \\ z' & = & z \left(R_{\rm ref}/{R}\right)^\beta & & z & = & z' (R/R_{\rm ref})^\beta \\ \end{array} where :math:`R_{\rm ref}` is the reference radius and :math:`\beta` is the flaring index, both parameters that can be set by the user. Vectors transform according to: .. math:: \begin{array}{lclp{1cm}lcl} v_R & = & v_x \frac{x}{R} + v_y \frac{y}{R} & & v_x & = & v_R \cos\phi - v_\phi \sin\phi \\ v_\phi & = & v_x \left(\frac{-y}{R}\right) + v_y \left(\frac{x}{R}\right) &; &v_y & = & v_R \sin\phi + v_\phi \cos\phi \\ v_{z'} & = & -\beta \frac{xz}{R^2} \left(\frac{R_{\rm ref}}{R}\right)^\beta v_x -\beta \frac{yz}{R^2} \left(\frac{R_{\rm ref}}{R}\right)^\beta v_y + \left(\frac{R_{\rm ref}}{R}\right)^\beta v_z & & v_z & = & \beta \frac{z'}{R} \left(\frac{R}{R_{\rm ref}}\right)^\beta v_R + \left(\frac{R}{R_{\rm ref}}\right)^\beta v_{z'}. \\ \end{array} In the case where these vectors are velocities, the :math:`v_{\phi}` component corresponds to :math:`v_{\phi} = r\dot{\phi}`. Logarithmic Flared Cylindrical Polar Coordinates ------------------------------------------------- For logarithmic flared cylindrical coordinates the transformations are: .. math:: \begin{array}{lclp{1cm}lcl} d & = & \log_{10} ( \sqrt{x^2 + y^2} ) & & x & = & R\cos\phi \\ \phi & = & \tan^{-1}{(y/x)} &; & y & = & R\sin\phi \\ z' & = & z \left(R_{\rm ref}/{R}\right)^\beta & & z & = & z' (R/R_{\rm ref})^\beta \\ \end{array} where :math:`R_{\rm ref}` is the reference radius and :math:`\beta` is the flaring index, both parameters that can be set by the user. Vectors transform according to: .. math:: \begin{array}{lclp{1cm}lcl} v_d & = & v_x \frac{x}{R}f^{-1} + v_y \frac{y}{R}f^{-1} & & v_x & = & f v_d \cos\phi - v_\phi \sin\phi \\ v_\phi & = & v_x \left(\frac{-y}{R}\right) + v_y \left(\frac{x}{R}\right) &; &v_y & = & f v_d \sin\phi + v_\phi \cos\phi \\ v_{z'} & = & -\beta \frac{xz}{R^2} \left(\frac{R_{\rm ref}}{R}\right)^\beta v_x -\beta \frac{yz}{R^2} \left(\frac{R_{\rm ref}}{R}\right)^\beta v_y + \left(\frac{R_{\rm ref}}{R}\right)^\beta v_z & & v_z & = & \beta \frac{z'}{R} \left(\frac{R}{R_{\rm ref}}\right)^\beta f v_d + \left(\frac{R}{R_{\rm ref}}\right)^\beta v_{z'}. \\ \end{array} where :math:`R \equiv 10^d` and correspondingly :math:`d = \log_{10} R` and :math:`f \equiv R \ln (10)`. danieljprice-splash-4d1f09c/docs/getting-started.rst000066400000000000000000001401651477365367100226700ustar00rootroot00000000000000 Getting started =============== .. _install: Installing from your package manager ------------------------------------- Pre-packaged builds of splash exist for most operating systems. Stable version ~~~~~~~~~~~~~~ Mac OS via homebrew (recommended):: brew tap danieljprice/all brew install splash You will also need to install `Xquartz `_ so that the X-windows server launches automatically. Mac OS via Macports:: sudo port install splash Linux or Windows Linux Subsystem (Ubuntu):: sudo apt-get install splash Development version ~~~~~~~~~~~~~~~~~~~ SPLASH and giza (the plotting backend) both have public repositories, so you can check out the latest and greatest code at any time. Both the splash and giza repositories are generally stable, so it is usually safe to get the very latest version. Just use: Mac OS via homebrew:: brew tap danieljprice/all brew install --HEAD splash or compile from source following the instructions below. Compiling from source --------------------- Basic instructions ~~~~~~~~~~~~~~~~~~ If you have admin (super user) permissions Ubuntu/Windows Subsystem for Linux:: sudo apt-get install libcairo2-dev git clone https://github.com/danieljprice/giza.git; cd giza; ./configure; make; sudo make install; cd .. git clone https://github.com/danieljprice/splash.git cd splash; make SYSTEM=gfortran; sudo make install Mac:: git clone https://github.com/danieljprice/giza.git; cd giza; ./configure; make; sudo make install; cd .. git clone https://github.com/danieljprice/splash.git cd splash; make SYSTEM=gfortran; sudo make install .. _installhome: Installing in your home space ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you do not have admin permissions. That is, to install in your home space:: git clone https://github.com/danieljprice/splash.git cd splash; git clone https://github.com/danieljprice/giza.git make SYSTEM=gfortran withgiza .. important:: If you have installed splash in your home space, you will need to set the following environment variables for everything to work. Put the following commands in your ~/.bashrc file or equivalent, so they are set every time you log in:: export SPLASH_DIR=$HOME/splash export PATH=$PATH:$SPLASH_DIR/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SPLASH_DIR/giza/lib Advanced installation guide --------------------------- The basic steps for installation are as follows: #. make sure you have a recent Fortran compiler (such as gfortran) #. make sure you have cairo on your system #. compile splash and giza Fortran compilers ~~~~~~~~~~~~~~~~~~~ Numerous Fortran 90/95/2003 compilers exist. The most widely available are: - gfortran, the free Gnu Fortran Compiler http://gcc.gnu.org/wiki/GFortran - ifort, one of the most widely available commercial compilers (and is very good) with (limited) free licence for Linux. http://software.intel.com/en-us/articles/intel-compilers/ Both of these successfully compile splash and the giza library. Cairo graphics library ~~~~~~~~~~~~~~~~~~~~~~~ Cairo is a low-level system library used in many applications. Thus it is highly likely that you already have a copy on your system and already in your library path. Look for the header file cairo.h, e.g. using:: locate cairo.h or have a look in the usual places (e.g. /usr/include/cairo, /usr/X11/include). If not, you can usually use your inbuilt package manager to install cairo as follows: Debian/Ubuntu: sudo apt-get install libcairo2-dev Fedora/Red Hat/CentOS: sudo yum install cairo-devel OpenSUSE: zypper install cairo-devel MacPorts: sudo port install cairo Alternatively, use the script provided in the root-level splash directory:: ./install-cairo.sh which downloads and installs both pixman and cairo into the giza/ subdirectory. Unlike the methods above, this does not require any admin/superuser permissions. Compiling and linking with giza ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can either install giza with your package manager, or in a subdirectory of splash. To install in a splash subdirectory, use:: cd splash git clone http://github.com/danieljprice/giza make withgiza of splash. With giza installed via your package manager (or previously compiled as below), use:: cd splash make GIZA_DIR=/usr/local where ``GIZA_DIR`` points to the directory where giza was installed. To install giza in a splash subdirectory, use:: cd splash git clone http://github.com/danieljprice/giza make withgiza A successful ``make`` will produce a binary called ``splash`` Reading your data ----------------- The most important part is getting splash to read \*your\* data format. If you are using a publicly available code, it is reasonably likely that I have already written a read data subroutine which will read your dumps. If not it is best to look at some of the other examples and change the necessary parts to suit your data files. Note that reading directly from unformatted data files is \*much\* faster than reading from formatted (ascii) output. A standard ``make`` will create a binary which supports the file formats listed in :ref:`tab:defaultreads`, plus a bunch of others (type ``splash --formats`` to see what formats your build supports). All data formats are supported in the splash binary by default unless there are external library dependencies (e.g. ``HDF5``) . The format of the file can in many cases be successfully guessed from the file extension or header, so you can simply type:: splash disc_00000 Otherwise you can specify the data type you are reading using the ``-f`` or ``--format`` flag. For example, the following will read a phantom dumpfile:: splash --format phantom disc_00000 For backwards compatibility with previous version of ``splash``, one can add aliases into their `.bashrc`, or equivalent:: alias asplash='splash ' # Alias for ascii splash alias ssplash='splash -f phantom ' alias gsplash='splash -f gadget ' alias tsplash='splash -f tipsy ' If splash is compiled with ``HDF5=yes``, the formats listed in :ref:`tab:hdf5reads` will also be available in the ``splash`` binary. Other supported formats are listed in :ref:`tab:otherreads`, but these require additional libraries. .. table:: Binaries and data reads compiled by default :name: tab:defaultreads +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash`` command | Format Read | ``read_data`` File | Comments | +==============================+============================+===============================+===================================================================================================================================================================================================================================================+ | ``splash -ascii `` | ascii, csv | ``read_data_ascii.f90`` | Generic data read for n-column ascii formats. Automatically determines number of columns and skips header lines. Can recognise SPH particle data based on the column labels. Use ``splash -e`` to plot non-SPH data (e.g. energy vs time files) | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -dragon `` | dragon | ``read_data_dragon`` | See environment variable options. | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -gadget `` | gadget, gadget-2, gadget-3 | ``read_data_gadget.f90`` | Handles both default and block-labelled formats (see environment variable options). | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -ndspmhd `` | ndspmhd | ``read_data_ndspmhd.f90`` | Format for the ndspmhd SPH/SPMHD code (publicly available from my website). | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -phantom `` | sphNG, Phantom | ``read_data_sphNG.f90`` | sphNG is Matthew Bate’s SPH code. Option ``-sphng`` also works. | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -magma `` | magma | ``read_data_srosph.f90`` | Stephan Rosswog’s code | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -seren `` | seren | ``read_data_seren.f90`` | The SEREN SPH code (Hubber, McLeod et al.) | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -gasoline `` | gasoline, tipsy | ``read_data_tipsy.f90`` | Reads both binary and ascii TIPSY files (determined automatically). Option ``-tipsy`` also works. | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -vine `` | vine | ``read_data_fine.f90`` | See environment variable options. | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |``splash -starsmasher ``| StarSmasher | ``read_data_starsmasher.f90`` | The `StarSmasher `_ code (Gaburov et al. 2018) | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash file.vtk`` | vtk legacy binary | ``read_data_vtk.f90`` | VTK legacy binary format, e.g. from Shamrock code | +------------------------------+----------------------------+-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Below is a list of the supported data formats that require ``HDF5``. .. table:: Supported HDF5 data formats :name: tab:hdf5reads +--------------------------------+------------------------+-------------------------------+-----------------------------------------------------------------------------------------+ | ``splash`` Command | Read Format | ``read_data`` File | Comments | +================================+========================+===============================+=========================================================================================+ | ``splash -gadget_hdf5 `` | gadget HDF5 Files. | ``read_data_gadget_hdf5.f90`` | Reads HDF5 format from the gadget code (automatically recognised) | +--------------------------------+------------------------+-------------------------------+-----------------------------------------------------------------------------------------+ | ``splash -amuse `` | AMUSE HDF5 | ``read_data_amuse_hdf5.f90`` | Reads HDF5 format from the AMUSE framework. | +--------------------------------+------------------------+-------------------------------+-----------------------------------------------------------------------------------------+ | ``splash -cactus_hdf5 `` | Cactus HDF5 | ``read_data_cactus_hdf5.f90`` | | +--------------------------------+------------------------+-------------------------------+-----------------------------------------------------------------------------------------+ | ``splash -flash_hdf5 `` | FLASH tracer particles | ``read_dataflash_hdf5.f90`` | Reads tracer particle output from the FLASH code. The option ``-flash`` will also work. | +--------------------------------+------------------------+-------------------------------+-----------------------------------------------------------------------------------------+ | ``splash -falcon_hdf5 `` | falcON | ``read_data_falcON_hdf5.f90`` | Walter Dehnen’s SPH code format. The option ``-falcon`` will also work. | +--------------------------------+------------------------+-------------------------------+-----------------------------------------------------------------------------------------+ If the ``HDF5`` read files end with ``.h5``, the suffix ``_hdf5`` from the ``splash`` command can be removed. For example:: splash -gadget dump_000.h5 will recognise that the file ``dump_000.h5`` is in the ``HDF5`` format, and will automatically select the correct ``read_data`` routine. Below is a list of other formats supported, but have additional library requirements. .. table:: Other supported file formats that require external libraries :name: tab:otherreads +---------------------------+--------------+--------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash`` Command | Read Format | ``read_data`` File | Comments | +===========================+==============+==========================+============================================================================================================================================================================+ | ``splash -pbob `` | PBOB Files | ``read_data_pbob.f90`` | Requires the PBOB Library. Compile ``splash`` with ``PBOB_DIR=/path/to/pbob/``. | +---------------------------+--------------+--------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash -h5part `` | H5Part Files | ``read_data_h5part.f90`` | Requires the H5Part and HDF5 libraries. Compile ``splash`` with ``H5PART_DIR=/path/to/h5part/``. | +---------------------------+--------------+--------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``splash file.fits`` | FITS files | ``read_data_fits.f90`` | Requires FITS libraries. Try to compile ``splash`` with ``FITS=yes``. If this does not work, point to the location of your fits libraries with ``FITS_DIR=/path/to/fits``. | +---------------------------+--------------+--------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Further details on writing your own subroutine are given in appendix :ref:`sec:writeyourown`. The \*easiest\* way is to i) email me a sample data file and ii) the subroutine you used to write it, and I will happily create a data read for your file format. .. _sec:commandline: Command line options -------------------- Typing ``splash --help`` gives a complete and up-to-date list of options. Currently these are: :: Command line options: -f format : input file format to be read (default is ascii, --formats for full list) -p fileprefix : change prefix to ALL settings files read/written by splash -e, -ev : use default options best suited for line plotting (.ev files) -360 : set default options suited to 360 video -b, --buffer : buffer all data files into memory -o pixformat : dump pixel map in specified format (use just -o for list of formats) Command line plotting mode: -x column : x axis -y column : y axis -r[ender] column : column to render (will use 1 and 2 as x,y if -x,-y not specified) -vec[tor] column : vector quantity to plot with arrows -c[ontour] column : contoured quantity -multi : multiplot -dev device : specify plotting device on command line (e.g. -dev /xw) --movie : shortcut for -dev /mp4 to make a movie from plot sequence --xsec=1.0 : specify location of cross section slice --kappa=1.0 : specify opacity, and turn on opacity rendering --anglex=30 : rotate around x axis (similarly --angley, --anglez) --code : enforce code units (also --codeunits) --sink=1 : centre on sink particle number 1 --origin=666 : set coordinate system origin to particle number 666 --origin=maxdens : set coordinate system origin to particle at maximum density --track=666 : track particle number 666 --track=maxdens : track particle at maximum density --exact=file1,f2 : read and plot exact solution from ascii files file1 and f2 --sort : sort filenames for comparison (e.g. snap_000 snap1_000 snap2_000) Example data formats (type --formats for full list): -ascii,-csv : ascii text/csv format (default) -phantom -sphng : Phantom and sphNG codes (auto) -vtk : vtk legacy binary format (auto) -ndspmhd : ndspmhd code (auto) -gandalf,-seren : Gandalf/Seren code -gadget -gadget_hdf5 : Gadget code (auto) -falcon -falcon_hdf5 : FalcON code -flash -flash_hdf5 : FLASH code -cactus -cactus_hdf5 : Cactus code -amuse -amuse_hdf5 : AMUSE Framework -fits : FITS format (auto) HDF5 files will be automatically recognised if they end with .h5, however you must specify a supported data format. add a suffix "_hdf5" to above format if your data files do not end with .h5. convert mode ("splash to X dumpfiles"): splash to ascii : convert SPH data to ascii file dumpfile.ascii to binary : convert SPH data to simple unformatted binary dumpfile.binary write(1) time,npart,ncolumns do i=1,npart write(1) dat(1:ncolumns),itype enddo to phantom : convert SPH data to binary dump file for PHANTOM to gadget : convert SPH data to default GADGET snapshot file format Grid conversion mode ("splash to X dumpfiles"): splash to grid : interpolate basic SPH data (density, plus velocity if present in data) to 2D or 3D grid, write grid data to file (using default output=ascii) to gridascii : as above, grid data written in ascii format to gridbinary : as above, grid data in simple unformatted binary format: write(unit) nx,ny,nz,ncolumns,time [ 4 bytes each ] write(unit) (((rho(i,j,k),i=1,nx),j=1,ny),k=1,nz) [ 4 bytes each ] write(unit) (((vx(i,j,k), i=1,nx),j=1,ny),k=1,nz) [ 4 bytes each ] write(unit) (((vy(i,j,k), i=1,nx),j=1,ny),k=1,nz) [ 4 bytes each ] write(unit) (((...(i,j,k),i=1,nx),j=1,ny),k=1,nz) [ 4 bytes each ] allto grid : as above, interpolating *all* columns to the grid (and output file) allto gridascii : as above, with ascii output allto gridbinary : as above, with binary output Analysis mode ("splash calc X dumpfiles") on a sequence of dump files: splash calc energies : calculate KE,PE,total energy vs time output to file called 'energy.out' calc massaboverho : mass above a series of density thresholds vs time output to file called 'massaboverho.out' calc max : maximum of each column vs. time output to file called 'maxvals.out' calc min : minimum of each column vs. time output to file called 'minvals.out' calc diff : (max - min) of each column vs. time output to file called 'diffvals.out' calc amp : 0.5*(max - min) of each column vs. time output to file called 'ampvals.out' calc delta : 0.5*(max - min)/mean of each column vs. time output to file called 'deltavals.out' calc mean : mean of each column vs. time output to file called 'meanvals.out' calc rms : (mass weighted) root mean square of each column vs. time output to file called 'rmsvals.out' calc tracks : track particle data vs time for selected particles, --track=1,2,3 output to tracks-1.out,tracks-2.out,tracks-3.out the above options all produce a small ascii file with one row per input file. the following option produces a file equivalent in size to one input file (in ascii format): calc timeaverage : time average of *all* entries for every particle output to file called 'time_average.out' calc ratio : ratio of *all* entries in each file compared to first output to file called 'ratio.out' calc plus : add two snapshots together output to file called 'plus.out' Command-line options can be entered in any order on the command line (even after the dump file names). For more information on the convert utility (``splash to ascii``) see :ref:`sec:convert`. For details of the ``-o ppm`` or ``-o ascii`` option see :ref:`sec:writepixmap`. For details of the ``-ev`` option, see :ref:`sec:evsplash`. Options affecting all data reads ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Command line flags (or environment variables) that affect all data reads are: +----------------------+-----------------------+-------------------------------------------------+ | ---defaults | SPLASH_DEFAULTS | gives name of system-wide ``splash.defaults`` | | | | file (and splash.limits etc.) that will be | | | | used if there is none in the current dir. e.g. | | | | ``--defaults=$HOME/splash.defaults`` | +----------------------+-----------------------+-------------------------------------------------+ | ---kernel='quintic' | SPLASH_KERNEL | changes the smoothing kernel used in the | | | | interpolations (e.g. ``cubic`` or ``quintic``). | | | | Can also be changed in the :ref:`sec:menu-r`. | +----------------------+-----------------------+-------------------------------------------------+ | ---debug | SPLASH_DEBUG | if set to ``yes`` or ``true``, turns on verbose | | | | debugging output. Useful to trace code crashes | | | | (but of course, this never happens…). | +----------------------+-----------------------+-------------------------------------------------+ | ---sink=1 | SPLASH_CENTRE_ON_SINK | if set to a number n, centres coordinates and | | | | velocities on the nth sink/star particle (e.g. | | | | ``export SPLASH_CENTRE_ON_SINK=2``) | +----------------------+-----------------------+-------------------------------------------------+ | ---corotate | SPLASH_COROTATE | plot in corotating frame based on locations of | | | | 2 sink particles (e.g. ``--corotate=1,3``) | +----------------------+-----------------------+-------------------------------------------------+ | ---origin=666 | SPLASH_ORIGIN | recentre the coordinate origin and velocities | | | | to the selected particle (e.g. particle 666) | +----------------------+-----------------------+-------------------------------------------------+ | ---origin=maxdens | SPLASH_ORIGIN | reset origin to particle at maximum density | +----------------------+-----------------------+-------------------------------------------------+ | --dontcentrevel='y' | SPLASH_DONTCENTREVEL | used along with SPLASH_CENTRE_ON_SINK or | | | | SPLASH_ORIGIN. If true, then the velocities | | | | will not be made relative to the sink or | | | | particle. | +----------------------+-----------------------+-------------------------------------------------+ | ---track=4789 | SPLASH_TRACK | set limits of all quantities relative to those | | | | of the selected particle (e.g. particle 4789) | +----------------------+-----------------------+-------------------------------------------------+ | ---track=maxdens | SPLASH_TRACK | track the particle at maximum density | +----------------------+-----------------------+-------------------------------------------------+ | ---vzero=1.0,1.0,1.0 | SPLASH_VZERO | subtract reference velocity from all particles | | | | (velocity should be specified in code units) | +----------------------+-----------------------+-------------------------------------------------+ | ---exact=file1,file2 | | plot exact solution from files file1 and file2 | +----------------------+-----------------------+-------------------------------------------------+ | ---beam=2.0 | SPLASH_BEAM | if given a value :math:`>`\ 0 enforces a minimum| | | | smoothing length, specified in code units, | | | | all the particles. Useful to “dumb-down†the | | | | resolution of SPH simulations to match | | | | observational resolution. If this variable is | | | | set the “accelerated rendering" option in the | | | | :ref:`sec:menu-r` is also turned on, otherwise | | | | slow rendering can result. | +----------------------+-----------------------+-------------------------------------------------+ | ---xmin=0.1 | SPLASH_MARGIN_XMIN | can be used to manually adjust the left page | | ---xmax=0.1 | SPLASH_MARGIN_XMAX | page margin (set to fraction of viewport, | | ---ymin=0.1 | SPLASH_MARGIN_YMIN | negative values are allowed). | | ---ymax=0.1 | SPLASH_MARGIN_YMAX | | +----------------------+-----------------------+-------------------------------------------------+ .. _sec:splash: Ascii data read ~~~~~~~~~~~~~~~~ For several data reads there are command-line flags which can be set at runtime which are specific to the data read. For the ascii data read (``splash -f ascii``) these are: +-------------------------------------+-----------------------------------+ | ``--ncolumns=10`` | if given a value :math:`>`\ 0 | | | sets the number of columns to be | | | read from ascii data (overrides | | | the automatic number of columns | | | determination). | +-------------------------------------+-----------------------------------+ | ``--nheaderlines=3`` | if given a value :math:`>=`\ 0 | | | sets the number of header lines | | | to skip (overrides the automatic | | | determination). | +-------------------------------------+-----------------------------------+ | ``--columnsfile=/home/me/mylabels`` | can be used to provide the | | | location of (path to) the default | | | ``columns`` file containing the | | | labels for ascii data. Overridden | | | by the presence of a local | | | ``columns`` file. | +-------------------------------------+-----------------------------------+ | ``--time=3.0`` | if given a nonzero value sets the | | | time to use in the legend (fixed | | | for all files) | +-------------------------------------+-----------------------------------+ | ``--gamma=1.667`` | if given a nonzero value sets | | | gamma to use in exact solution | | | calculations (fixed for all | | | files) | +-------------------------------------+-----------------------------------+ | ``--timeheader=1`` | sets the integer line number | | | where the time appears in the | | | header | +-------------------------------------+-----------------------------------+ | ``--gammaheader=3`` | sets the integer line number | | | where gamma appears in the header | +-------------------------------------+-----------------------------------+ The above options can be set as environment variables by prefixing them with ASPLASH, e.g.:: export ASPLASH_NCOLUMNS=10 splash datafile.txt .. _sec:splash -gadget: GADGET data read ~~~~~~~~~~~~~~~~~ For the GADGET read (``splash -f gadget`` or just ``splash``) the options are: +-----------------------------------+-----------------------------------+ | ``--format=2`` | if set = 2, force read of block | | | labelled GADGET format instead of | | | the default (non block labelled) | | | format. | +-----------------------------------+-----------------------------------+ | ``--usez`` | if ``yes`` or ``true`` uses the | | | redshift in the legend instead of | | | code time. | +-----------------------------------+-----------------------------------+ | ``--hsoft=500.`` | if given a value :math:`>` 0.0 | | | will assign a smoothing length to | | | dark matter particles for which | | | rendered plots of column density | | | can then be made. | +-----------------------------------+-----------------------------------+ | ``--extracols`` | if set to a comma separated list | | | of column labels, will attempt to | | | read additional columns | | | containing gas particle | | | properties beyond the end of the | | | file (not applicable if | | | --format=2). | +-----------------------------------+-----------------------------------+ | ``--starpartcols`` | if set to a comma separated list | | | of column labels, will attempt to | | | read additional columns | | | containing star particle | | | properties beyond the end of the | | | file (and after any extra gas | | | particle columns) (not applicable | | | if GSPLASH_FORMAT=2). | +-----------------------------------+-----------------------------------+ | ``--checkids`` | if set to ``yes`` or ``true``, | | | reads and checks particle IDs, | | | excluding particles with negative | | | IDs as accreted (gives them a | | | negative smoothing length which | | | means they are ignored in | | | renderings). | +-----------------------------------+-----------------------------------+ | ``--hcolumn`` | if set to a positive integer, | | | specifies the location of the | | | smoothing length in the columns, | | | overriding any default settings. | +-----------------------------------+-----------------------------------+ | ``--ignore-iflagcool`` | if set,does | | | not assume that extra columns are | | | present even if the cooling flag | | | is set in the header. | +-----------------------------------+-----------------------------------+ For backwards compatibility, the above options can also be set as environment variables by prefixing them with GSPLASH, e.g.:: export GSPLASH_FORMAT=2 splash -gadget snap_00010 which is equivalent to:: splash -f gadget --format=2 snap_00010 For the GADGET read gsplash will also look for, and read if present, files called ``snapshot_xxx.hsml`` and/or ``snapshot_xxx.dens`` (where ``snapshot_xxx`` is the name of the corresponding GADGET dump file) which contain smoothing lengths and/or a density estimate for dark matter particles (these should just be one-column ascii files). VINE data read ~~~~~~~~~~~~~~~ For the VINE read (``splash -vine``) the options are: +-----------------------------------+-----------------------------------+ | ``--hfac`` | if ``yes`` or ``true`` multiplies | | | smoothing length read from the | | | dump file by a factor of 2.8 (for | | | use with older VINE dumps where | | | the smoothing length is defined | | | as in a Plummer kernel rather | | | than as the usual SPH smoothing | | | length). | +-----------------------------------+-----------------------------------+ | ``--mhd`` | if set, reads VINE | | | dumps containing MHD arrays | | | (or set VINE_MHD=yes) | +-----------------------------------+-----------------------------------+ Phantom/sphNG data read ~~~~~~~~~~~~~~~~~~~~~~~~ For the sphNG and PHANTOM read (``splash -phantom``) the options are: +-------------------+-------------------------------------------------------+ | ``--cm`` | resets the positions such that the centre of | | | mass is exactly at the origin. | +-------------------+-------------------------------------------------------+ | ``--dense`` | resets the positions such that the centre of | | | mass of the densest clump is exactly at the origin. | +-------------------+-------------------------------------------------------+ | ``--omega=3.142`` | if non-zero, subtracts solid body rotation with omega | | | as specified to give velocities in co-rotating frame | +-------------------+-------------------------------------------------------+ | ``--omegat=3.142``| same as --omega but applies to velocities also | +-------------------+-------------------------------------------------------+ | ``--timeunit=hrs``| sets default time units, either ’s’, ’min’, ’hrs’, | | | ’days’, ’yr’ or ’tfreefall’ (used verbatim in legend) | +-------------------+-------------------------------------------------------+ dragon data read ~~~~~~~~~~~~~~~~~ For the dragon read (``splash -dragon``) the options are: +-----------------------------------+-----------------------------------+ | ``--extracols`` | specifies number of extra columns | | | present in the file which are | | | dumped after the itype array | +-----------------------------------+-----------------------------------+ Stephan Rosswog data read ~~~~~~~~~~~~~~~~~~~~~~~~~~ For the srosph read (``splash``) the options are: +-----------------------------------+-----------------------------------+ | ``--format=MHD`` | can be ``MHD`` or ``HYDRO`` which | | | read the appropriate data format | | | from either the MHD or | | | hydrodynamic codes | +-----------------------------------+-----------------------------------+ | ``--com`` | if set resets the | | | positions such that the centre of | | | mass is exactly at the origin. | +-----------------------------------+-----------------------------------+ | ``--corotating`` | velocities are transformed to | | | corotating frame | +-----------------------------------+-----------------------------------+ | ``--hfact=1.2`` | can be changed to give correct | | | parameter in | | | :math:`h=h_{fact}(m/\rho)^{1/3}` | | | used to set the particle masses | | | when rendering minidumps (i.e., | | | when the mass is not dumped). | | | Default is RSPLASH_HFACT=1.5 | +-----------------------------------+-----------------------------------+ ndspmhd data read ~~~~~~~~~~~~~~~~~~ For the ndspmhd read (``splash -ndspmhd``) the options are: +-----------------------------------+-----------------------------------+ | ``--barycentric`` | plots barycentric quantities for | | | one-fluid dust instead of | | | creating fake second set of | | | particles | +-----------------------------------+-----------------------------------+ H5Part data read ~~~~~~~~~~~~~~~~~ For the H5PART read (``splash -f h5part``) the options are: +-----------------------------------+------------------------------------+ | ``--ndim=3`` | number of spatial dimensions | | | :math:`d` (overrides value | | | inferred from data) | +-----------------------------------+------------------------------------+ | ``--hfac=1.2`` | factor to use to compute h from | | | :math:`h = h_{fac} *(m/\rho)^{1/d}`| | | if h not present in data | +-----------------------------------+------------------------------------+ | ``--hsml=3.0`` | value for global smoothing length | | | h (if h not present in data) | +-----------------------------------+------------------------------------+ | ``--typeid=MatID`` | name of the dataset containing | | | the particle type identification | | | (default is “MatIDâ€) | +-----------------------------------+------------------------------------+ .. _sec:envvariables: Environment variables --------------------- Several runtime options for splash can be set using environment variables. These are variables set from your unix shell. In the bash shell, environment variables are set from the command line using :: export VAR='blah' or by putting this command in your ``.bash_profile``/``.bashrc``. In csh, the equivalent is :: setenv VAR 'blah' or by putting the above in your ``.cshrc`` file. Changing the font ~~~~~~~~~~~~~~~~~~ Several environment variables affect the backend plotting library. Probably the most useful is the ability to change font: :: export GIZA_FONT='Helvetica' where the name is a reasonable guess as to the font you want to use (the default is ``Times``). In particular, if you are having trouble displaying unicode characters such as greek letters, you can just change the font until you find one that works. Endian changing ~~~~~~~~~~~~~~~~ On some compilers, the endian-ness (byte order) when reading unformatted binary data files can be changed at runtime. This is useful for looking at files on different systems to the one on which they were created (e.g. x86 machines create little-endian files by default, whereas IBM/powerpc machines create big-endian). Environment variables for changing the endian-ness of the data read for some common compilers are given below: +-------------+----------------------------+----------------+-------------------+----------+ | Compiler | Environment variable | Big endian | Little endian | Other | +=============+============================+================+===================+==========+ | gfortran | ``GFORTRAN_CONVERT_UNIT`` | ``big_endian`` | ``little_endian`` | ``swap`` | +-------------+----------------------------+----------------+-------------------+----------+ | ifort | ``F_UFMTENDIAN`` | ``big`` | ``little`` | | +-------------+----------------------------+----------------+-------------------+----------+ For compilers without this feature, almost all can change the endian-ness at compile time, and the appropriate flags for doing so can be set using :: export ENDIAN='BIG' or LITTLE before *compiling* splash (this adds the appropriate compile-time flags for the compiler selected using the SYSTEM environment variable in the splash Makefile). danieljprice-splash-4d1f09c/docs/index.rst000066400000000000000000000012021477365367100206560ustar00rootroot00000000000000.. splash documentation ================================================================== Visualisation of smoothed particle hydrodynamics data using splash ================================================================== .. figure:: figs/hyperbolic.pdf :alt: splash: it splashes :width: 100.0% .. toctree:: :maxdepth: 3 :caption: Userguide intro getting-started basic settings advanced other lightcurve faq contribs refs links .. toctree:: :maxdepth: 2 :caption: Appendices source geometry exact readdata Contents ================== * :ref:`genindex` * :ref:`search` danieljprice-splash-4d1f09c/docs/intro.rst000066400000000000000000000125101477365367100207060ustar00rootroot00000000000000 Introduction ============ While many wonderful commercial software packages exist for visualising scientific data (such as the widely used Interactive Data Language), I found they were cumbersome for particle-based data. Much of what I wanted to do was specific to SPH, like interpolating to an array of pixels using the kernel. While generic routines exist for such tasks, I could not explain how they worked, and they were slow. Also, while interactive gizmos are handy, it was more difficult to perform the same tasks non-interactively, as required for the production of animations. The major work in the visualisation of SPH data is not the image production itself but the manipulation of data prior to plotting. Much of this manipulation makes sense within an SPH framework. splash is designed for this specific task - to use SPH tools to analyse SPH data. Publishable images and animations can be obtained efficiently from the raw data with a minimum amount of user effort. The development of powerful visualisation tools has enabled me to pick up on effects present in my simulation results that I would not otherwise have noticed — the difference between a raw particle plot and a rendered image can be substantial. A key goal of splash is to eliminate the use of crap-looking particle plots as a means of representing SPH data. What it does ------------ splash is a utility for visualisation of output from (astrophysical) simulations using the Smoothed Particle Hydrodynamics (SPH) method in one, two and three dimensions. It is written in modern Fortran and utilises `giza `_, a custom-build backend graphics library to do the actual plotting. The following features are included: - :ref:`sec:renderplot` of particle data to an array of pixels using the SPH kernel - :ref:`sec:xsec` slices through 2D and 3D data (as both particle plots and rendered images). - Fast projections through 3D data (i.e., column density plots, or integration of other quantities along the line of sight) - :ref:`Surface renderings ` of 3D data. - :ref:`sec:vectorplots` of the velocity (and other vector quantities), including vector plots in a :ref:`sec:xsec` slice in 3D. - Rotation and :ref:`animation sequence ` generation for 3D data. - :ref:`Automatic stepping through timesteps `, making :ref:`animations ` simple to produce. - :ref:`sec:interactive` for detailed examination of timestep data (e.g. zooming, rotating, stepping forwards/backwards, log axes, adapting limits). - :ref:`sec:remote` via simple X-Windows forwarding - :ref:`Multiple plots on page `, including option to automatically tile plots if :math:`y-` and :math:`x-` limits are the same. - Plot limits can be fixed, adaptive or :ref:`particle tracking `. - :ref:`sec:exact` for common SPH test problems (e.g. shock tubes, sedov blast wave). - :ref:`Calculation of quantities not dumped ` (e.g. pressure, entropy) - :ref:`sec:convert` - :ref:`sec:converttogrid` - :ref:`sec:geom`, for both coordinates and vector components - :ref:`Rescaling of data into physical units `. - Straightforward production of both :ref:`bitmap ` (png) and :ref:`vector ` (eps, pdf) images which can then be :ref:`converted into animations ` or :ref:`inserted into LaTeX documents `. Examples of plots produced with splash can be found in the `gallery `_ or by looking at `papers with figures produced using splash `_. What it doesn’t do ------------------ splash is geared towards gas dynamics simulations with SPH and has basically grown out of my visualisation needs. Thus it is not particularly useful for things like water and solids in SPH. An SPH visualisation tool geared towards the non-gaseous side of things you may want to have a look at is `pv-meshless `_, by John Biddiscombe. splash also doesn’t make coffee. splash, the paper ------------------ The algorithms implemented in splash are not described here, but instead described in a paper [Price07]_, available from: http://www.publish.csiro.au/?paper=AS07022 This paper should be cited if you use splash for scientific purposes, and please do so as it is my only form of thanks. Version History --------------- .. include:: version_history.rst License ------- splash - a visualisation tool for SPH data ©2004-2023 Daniel Price and contributors. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. danieljprice-splash-4d1f09c/docs/lightcurve.rst000077500000000000000000000124321477365367100217350ustar00rootroot00000000000000 Lightcurve calculations ======================= Since version 3.1.0, splash has implemented a **very simplistic and experimental** command line feature to get a quick and rough idea of lightcurves, assuming blackbody radiation from each particles at their respective temperature. .. _sec:lcrunhow: How to run the code ------------------- The basic syntax is :: splash calc lightcurve dump_00000 dump_00001 dump_????? --kappa --temperature This command reads some of the settings stored in the splash.defaults, splash.limits & splash.units files. Therefore, before running ``splash calc lightcurve``, it is necessary to first run splash with the binary files to set and save the following settings: 1. set the default limit of x, y, z (in the (l)imits submenu l2) to determine the pixel grid size (see below); 2. set the unit of length and mass to cgs units (in the (d)ata submenu d2), as the lightcurve calculation code assumes cgs units by default. 3. save the settings (enter s for the (s)ave option in the main menu) After setting and saving the settings, you can now exit splash and run the above commandline, with the optional ``--kappa`` and ``--temperature`` flag to ask splash to compute opacity and temperature respectively (more on that later). By default, this calculates the lightcurve seen by an observer at +z direction infinitely away from the source. The viewing direction can be rotated by using the ``--anglex, --angley, --anglez`` :ref:`sec:commandline`. .. _sec:lcworkhow: How the code works ------------------- (As implemented in source file ``interpolate3D_opacity.f90``.) Splash first divides the image into a two dimensional grid of 'pixels' (by default 1024x1024 pixels), and then do ray-tracing with one ray per pixel. Each SPH particles are assumed to produce a blackbody spectrum across frequencies. The contributions from each particles are counted forwardly by default (i.e., from the furthest particles to the observer to the closest ones), using the radiative transfer equation: .. math:: I_{\nu, i+1} = I_{\nu, i} e^{- \tau_i} + S_{\nu, i} ( 1 - e^{-\tau_i} ) where the source function of the i-th particle :math:`S_{\nu, i}` is assumed to be blackbody, :math:`I_{\nu, i}` is the specific intensity at just before the i-th particle, :math:`\tau_i` is the optical depth of the i-th particle, calculated using kernel interpolation with .. math:: \tau_i = \int \kappa \rho dz = \sum_j \kappa_j m_j w_{\mathrm{col}, ij} / h_j^2 where the :math:`w_{\mathrm{col}, ij}` is the dimensionless column kernel. The spectra were then summed across the frequencies and pixels to produce the bolometric luminosity, listed in [02 Luminosity] in the outputted .out file. When ``--temperature`` flag is used, Temperature :math:`T` is computed from density :math:`\rho` and the specific internal energy :math:`u`, assuming :math:`u` is comprised of gas and radiation pressure only, with them in local thermodynamic equilibrium. When ``--kappa`` flag is used, splash calculate the kappa with the *get_opacity()* function in the *lightcurve_utils.f90* source file. By default (i.e. without modifying the source code), it only considers Thompson electron scattering as the *only* source for opacity, and it assumes that the gas is made of *hydrogen only*. The latter assumption is needed for using a simplified version of Saha equation to determine free electron number density. There are many commented code describing the opacity contribution from Kramer's law, negative hydrogen, molecules, and absorption; However, these contents are commented and not in effect. Opacity can also be fixed by using ``--kappa=$VALUE`` (``$VALUE`` being a float point number in cm^2/g); Alternatively, you can neglect the --kappa option, in which case kappa is fixed at default value 0.35 cm2/g. .. _sec:lcoutput: Output file explanations ------------------------ Outputs are written to the file ``lightcurve.out`` by default. Note that there are some more information printed on screen as well. Splash roughly estimates if the photosphere in the dump has enough resolution. This information is printed on screen. **Beware**\: when this printed surface depth is much less than the smoothing length, it means that there might not be enough resolution at the photosphere to determine its light-related properties, which means that the luminosity outputted could be rubbish. 1. ``lum`` (``[02 Luminosity]``) is the actual bolometric luminosity of the star, as summed from the pixels; 2. ``Tc`` (``[07 T_c]``) is the color temperature, calculated from fitting the blackbody peak (from the star's spectrum from the pixels); 3. ``lum_bb`` (``[05 L_{bol}]``) is *not* the bolometric luminosity of the star, but rather the bolometric luminosity of a blackbody with :math:`T=T_c`, scaled such that its blackbody spectrum peak matches the actual spectrum calculated from the dump file; 4. ``r_bb`` (``[06 R_{bb}]``) is the effective photospheric radius in cm implied by the fitted blackbody spectrum; 5. ``area`` (printed on screen, not in the .out file) is the 2D area of optically thick pixels in which :math:`tau>1`. 6. ``temp`` (``[04 T_{eff}]``) is the effective temperature determined from lum & area. 7. ``rphoto`` (``[03 R_{eff}]``) is the effective photospheric radius determined by lum & temp. danieljprice-splash-4d1f09c/docs/links.rst000066400000000000000000000003731477365367100206770ustar00rootroot00000000000000Links ===== - Project homepage: http://users.monash.edu.au/~dprice/splash - Code repository: https://github.com/danieljprice/splash - Documentation: https://splash-viz.readthedocs.io - Code paper: https://adsabs.harvard.edu/abs/2007PASA...24..159P danieljprice-splash-4d1f09c/docs/other.rst000066400000000000000000000440511477365367100207010ustar00rootroot00000000000000 Other useful functionality ========================== .. _sec:convert: Conversion of binary data files to ascii ----------------------------------------- splash has a command line feature which can be used to convert binary SPH dump files into ascii format. The syntax is :: splash to ascii dump001 dump002 dump??? which will convert all of the dump files listed on the command line into ascii format (called ``dump001.ascii``, ``dump002.ascii`` etc.), with columns as would be listed in the main menu if you opened the dump file in splash . Note that the output *includes* calculated extra quantities such as the radius if these have been turned on [in the d) menu] and the settings saved to the ``splash.defaults`` file. Similarly the data will be output in physical units if a ``splash.units`` file is present. For other command line options, see :ref:`sec:commandline`. Conversion of binary data files to csv ----------------------------------------- To export data in csv format, just use: :: splash to csv dump001 dump002 dump??? which will convert all of the files listed on the command line into csv format (called ``dump001.csv``, ``dump002.csv`` etc.), with columns as would be listed in the main menu if you opened the dump file in splash. See also :ref:`sec:commandline`. .. _sec:converttogrid: Interpolation of SPH data to 2D and 3D grids --------------------------------------------- splash has a command line feature which can be used to read binary SPH dump files and output 3D gridded data in a variety of formats. The syntax is :: splash to grid dump001 dump002 dump??? which will interpolate the density, velocity (if present) and magnetic field (if present) onto a 3D grid and output the results to files (the default output format is ascii, with one file for each quantity interpolated). Other data columns in the SPH file can be interpolated using the “allto†option, which interpolates *all* of the columns to the grid: :: splash allto grid dump001 dump002 dump??? The grid interpolation uses the :math:`x`, :math:`y`, and :math:`z` limits — as saved to the ``splash.limits`` file — for the box, and the grid size is given by the “set number of pixels†option in the r)ender menu — as saved to the ``splash.defaults`` file. Automatic pixel determination also works (if npixels = 0) but there is a sensible upper limit placed on the grid size determined in this manner to avoid ridiculous memory/disk usage. Options can be set to change various aspects of the grid interpolation behaviour. For example you to use periodic boundary conditions use:: splash to grid dump001 --periodic or alternatively you can set this as an environment variable:: export SPLASH_TO_GRID_PERIODIC=yes splash to grid dump001 To change the number of pixels, you can use:: splash to grid dump001 --periodic --npix=100,100,000 and to interpolate only columns 4 and 5 you can use:: splash to grid dump001 --periodic --npix=100,100,000 --grid=4,5 For all possible output formats, use ``splash --help`` or see the full list of command line options in :ref:`sec:commandline`. Reading 3D cubes or grids generated by splash to grid into Python ------------------------------------------------------------------ ascii format ~~~~~~~~~~~~~ The default output of splash to grid is a simple ascii file per quantity. The header of this file explains the format:: # SPLASH: A visualisation tool for SPH data (c)2004-2023 Daniel Price and contributors # snap_012_density_grid.dat produced using "splash to grid" on file snap_012 # # time: # 4.7619100E-02 # # xmin,xmax,ymin,ymax,zmin,zmax: # -5.000000E+02 5.0000000E+02 -5.0000000E+02 5.0000000E+02 -5.0000000E+02 5.0000000E+02 # # file contains: # density interpolated to 3D cartesian x,y,z grid # # written in the form: # do k=1,nz # do j=1,ny # write(*,*) (dat(i,j,k),i=1,nx) # enddo # enddo # # grid dimensions: # nx ny nz 512 512 512 2.435691E-08 2.478849E-08 2.522732E-08 2.567299E-08 2.612505E-08 2.658309E-08 2.704713E-08 2.75 To read this file into Python you can use np.loadtxt with a reshape command:: import numpy as np arraytmp = np.loadtxt('snap_012_density_grid.dat',skiprows=22) array = arraytmp.reshape((512,512,512)) binary format ~~~~~~~~~~~~~ Reading and writing pure text files can be slow. For this reason splash provides a variety of binary output formats for gridded data:: Grid conversion mode ("splash to X dumpfiles"): splash to grid : interpolate basic SPH data (density, plus velocity if present in data) to 2D or 3D grid, write grid data to file (using default output=ascii) to gridascii : as above, grid data written in ascii format to gridascii2 : grid data written in ascii format, all in one file to gridbinary : as above, grid data in simple unformatted binary format: write(unit) nx,ny,nz,ncolumns,time,xmin,xmax,ymin,ymax,zmin,zmax [ 4x4,7x8 bytes ] write(unit) (((rho(i,j,k),i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ] write(unit) (((vx(i,j,k), i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ] write(unit) (((vy(i,j,k), i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ] write(unit) (((...(i,j,k),i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ] to gridstream : grid data in byte-stream binary format (e.g. for python): nx,ny,nz,ncolumns,time,xmin,xmax,ymin,ymax,zmin,zmax,rho [ 4,4,4,4,8*7,8*nx*ny*nz ] For reading in python the most useful is the "gridstream" format:: splash to gridstream snap_012 --npix=512,512,512 which produces a file called:: ----> WRITING TO snap_012.gridstream on unit 89 (unformatted binary stream) we can then read this file into Python as follows:: import numpy as np with open("snap_012.gridstream", "rb") as file: nx, ny, nz, ncolumns = np.fromfile(file, dtype=np.int32, count=4) time, xmin, xmax, ymin, ymax, zmin, zmax = np.fromfile(file, dtype=np.float64, count=7) rho = np.fromfile(file, dtype=np.float64, count=nx * ny * nz) rho_array = rho.reshape((nx, ny, nz)) .. _sec:splashcalc: Using splash to calculate global quantities as a function of time. ------------------------------------------------------------------ splash has a command line feature that can be used to calculate global quantities on the particles as a function of time, for example kinetic, thermal, magnetic and total energy, total linear and angular momentum. An example to calculate the energies in a sequence of dump files is: :: splash calc energies dump001 dump002 dump??? Other options are given by typing ’splash calc’, which currently has the following options: :: splash calc energies : calculate KE,PE,total energy vs time output to file called 'energy.out' calc massaboverho : mass above a series of density thresholds vs time output to file called 'massaboverho.out' calc extinction : column density to all sink particles vs time output to file called 'extinction.out' calc max : maximum of each column vs. time output to file called 'maxvals.out' calc min : minimum of each column vs. time output to file called 'minvals.out' calc diff : (max - min) of each column vs. time output to file called 'diffvals.out' calc amp : 0.5*(max - min) of each column vs. time output to file called 'ampvals.out' calc delta : 0.5*(max - min)/mean of each column vs. time output to file called 'deltavals.out' calc mean : mean of each column vs. time output to file called 'meanvals.out' calc rms : (mass weighted) root mean square of each column vs. time output to file called 'rmsvals.out' calc tracks : track particle data vs time for selected particles, --track=1,2,3 output to tracks-1.out,tracks-2.out,tracks-3.out calc timeaverage : time average of *all* entries for every particle output to file called 'time_average.out' calc ratio : ratio of *all* entries in each file compared to first output to file called 'ratio.out' For the ``energies`` and ``massaboverho`` options to be successful, splash must be aware of the locations of the corresponding columns in the data (i.e., by the column identification given in the set_labels routine corresponding to the data read). For the ``massaboverho`` option an input file is required specifying the density thresholds (a default version is written if the appropriate file is not already present). Using splash to calculate line-of-sight extinction to sink particles ------------------------------------------------------------------ For observations one is often interested in how much obscuring material is present in front of stars in a model. In splash stars are usually represented as sink particles, so there is a simple command line function to compute the column density of material between the observer and each "star". To compute this, use:: splash calc extinction dump_0* which will produce something like:: -----> CALCULATING EXTINCTION, TIME= 8.80E+02 yrs FILE # 20 projecting from particles to points... Sigma to sink 1 = 1.63E-07 [g/cm^2] Sigma to sink 2 = 1.19E-03 [g/cm^2] Sigma to sink 3 = 2.18E-06 [g/cm^2] and write the results to a file called "extinction.out". Note that the observer is by default in the +z direction, but can be changed by setting the viewing angles on the command line or in the splash.defaults file:: splash calc extinction dump_0* --anglex=30. --angley=60. --anglez=120. Similarly physical unit scaling will be applied based on what is saved in the splash.defaults and splash.units files. For example, to compute everything in code units you can just use the --code flag:: splash calc extinction dump_0* --code Using splash to time average a series of files ---------------------------------------------- The ``splash calc timeaverage`` command line option (see :ref:`sec:splashcalc`) can be used to produce a time average of a series of files from any splash-readable format. This computes the time-average of every individual entry in the file as represented in splash as a table of rows (or ‘particles’) and columns (or ‘quantities defined on particles’). The output is an ascii file with the same rows and columns, averaged over all the snapshots on the command line. The number of columns is doubled in the output, giving the standard deviation for each quantity in the corresponding column (e.g., the standard deviation for column 1 is output in column :math:`N + 1`). Examples of how this could be use might be to produce the time-averaged power spectrum from a series of ascii files containing power spectra for individual output times, or the time averaged probability density function (PDF) from PDFs produced by splash (see :ref:`sec:pdfs:`). The resulting ascii file, called ``time_average.out`` can be plotted using the ascii splash binary (asplash). For other command line options, see :ref:`sec:commandline`. .. _sec:batchmode: Reading/processing data into images without having to answer prompts -------------------------------------------------------------------- Previously, the only way to run splash non-interactively was to write a small shell script which runs splash and answers the prompts appropriately. For example: :: #!/usr/bin/tcsh cd plot splash myrun* << ENDINPUT 2 1 8 0 /png q ENDINPUT which would plot the data in columns 2 and 1 and render the data in column 8 with output to file ``mypostscript.ps``. However, in more recent versions splash can be invoked with plot options on the command line. Thus to achieve the same as in the example given above we would simply use :: splash myrun* -x 1 -y 2 -render 8 -dev /png or simply :: splash myrun* -r 8 -dev /png which will assume sensible default values (2 and 1 respectively) for the y and x axes. Similarly a vector plot can be specified with ``-vec`` and a contour plot with ``-cont``. The full list of command-line flags is given in :ref:`sec:commandline`. If plotting options have been only partially specified on the command line, no prompts will appear for the remaining options and default values will be assumed for the remaining options. For example, the default device will be /xw giving an interactive plot. .. _sec:pdfs: Computing volume-weighted probability density functions from SPH data using SPLASH ----------------------------------------------------------------------------------- The best way to compute a volume-weighted probability density function on SPH particles is to interpolate the density field to a grid and compute the histogram of the number of grid cells containing a given value of the desired quantity. The grid2pdf utility included with splash can be used to compute the density PDF from gridded data output by the ``splash to grid`` utility (see :ref:`sec:converttogrid`). To use this feature, you will need to output grids in "binary" format, e.g:: splash to gridbinary turb_00020 or if you want to skip the velocity interpolation (assuming density in column 6):: splash to gridbinary turb_00020 --grid=6 this produces a file called turb_00020.grid, then follow this with:: cd $SPLASH_DIR; make grid2pdf cd - $SPLASH_DIR/splash/bin/grid2pdf turb_00020.grid which produces:: turb_00020.grid_pdf_ln_density.dat this is just a two-column ascii file, so you can then plot this with your favourite plotting tool, e.g.:: splash -ev turb_00020.grid_pdf_ln_density.dat Using special characters in the plot labels ------------------------------------------- Several of the examples shown in this manual use special characters (such as the :math:`\int` character) in the plot labels. In giza these can be specified using TeX-like escape sequences, or with the escape sequences used in pgplot. For example to plot the greek letter :math:`\rho` we would use :: label = 'this would print the greek letter \rho' or, in pgplot-style: :: label = 'this would print the greek letter \gr' where ``\gr`` is the pgplot escape sequence for :math:`\rho`. In giza , which uses real fonts rather than the bitmapped characters used in pgplot, special characters are implemented with unicode characters. Thus, you need to select a font that has the appropriate characters included. The font can be changed using the ``GIZA_FONT`` environment variable. For other characters the procedure is similar. For example for the integral .. math:: \int v_x \mathrm{dx} we would use the TeX-like expression :: label = '\int v_x dx' or equivalently, in pgplot-style :: label = '\(2268) v\d x \u dx' where ``\(2268)`` is the pgplot escape sequence for the integral sign. The ``\d`` indicates that what follows should be printed as subscript and ``\u`` correspondingly indicates a return to normal script (or from normal script to superscript). All of the escape sequences for special characters are listed in the appendix to the pgplot user guide. WARNING: Note that the use of escape characters can be compiler dependent and may not therefore work on all compilers (for example the intel compiler needs the -nbs flag). .. _sec:writepixmap: Outputting the raw pixel map to a file -------------------------------------- The actual pixel map rendered to the graphics device (i.e., when a quantity is rendered to pixels, not for particle plots) can be output directly to a file, or series of files by using the ``-o`` command line option when you invoke splash. This is useful if you need to compare the image to the output from another code (e.g. using a different visualisation tool) or if you wish to have a “raw†rendering, that is without annotation on the plots. Invoking splash with ``-o`` lists the currently implemented formats:: possible formats for -o option: -o ppm : dump pixel map to portable pixel map file -o pfm : dump pixel map to portable float map file -o ascii : dump pixel map to ascii file For example, to output the pixel map in ascii format, use:: splash discG_00300 -o ascii -r 6 -dev /png giving:: > writing pixel map to file discG_00300_columndensitygcm2_proj.pix ...OK This produces a file as follows:: $ more discG_00300_columndensitygcm2_proj.pix # discG_00300_columndensitygcm2_proj.pix created by SPLASH # Contains 2D pixel array 512 x 512 written as # do j=1,512 # write(*,*) dat(1:512,j) # enddo # column density [g/cm^2]: min = 9.697428E-12 max = 7.487661E+03 # x axis: min = -4.000000E+03 max = 4.000000E+03 # y axis: min = -4.000000E+03 max = 4.000000E+03 # 512 512 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+0 ... The number of pixels in the image can be controlled using the 'set number of pixels' option in the :ref:`sec:menu-r` (making sure you save the settings to the splash.defaults file using the :ref:`sec:menu-s`). .. _sec:readpixmap: Reading raw pixel maps from splash into Python ---------------------------------------------- See above for how to output the raw pixel map to a file. The resulting .pix file can be read into Python using the command:: array = np.loadtxt('discG_00300_columndensitygcm2_proj.pix',skiprows=9) print (array.shape) plt.imshow(img) A slightly more advanced script that also reads the x and y limits from the .pix file is provided in `splash/scripts/plot_pix.py `_:: python plot_pix.py discG_00300_columndensitygcm2_proj.pix For other command line options, see :ref:`sec:commandline`. danieljprice-splash-4d1f09c/docs/readdata.rst000066400000000000000000000064401477365367100213250ustar00rootroot00000000000000 .. _sec:writeyourown: Data reads and command line options ===================================== Requesting a customised data reader ------------------------------------ The ``splash`` binary will read many formats. The default format is ascii or csv any ascii or csv data file where columns correspond to different quantities and rows correspond to each particle (actually I use splash to plot graphs for nearly all data in this form, whether SPH or not) -- it will also sensibly skip header lines which do not have the same number of columns. However, it is ultimately desirable to use SPLASH to directly visualise the (binary) output of your code. If your format is not amongst those distributed:: splash -f then BEFORE you start writing your own routine, please consider whether or not a routine to read your format would be of more general use (e.g. to other users of your code). If so, PLEASE email me to request a new read_data routine for your format, by sending an email attaching: a) an example dump and b) the source code from the routine which wrote the dump file. Then I can write a read for your format that can be added to the SPLASH repository and distributed in all future versions. Whilst I aim never to change the interface to the read_data routines, it is not impossible that some changes may occur somewhere down the line (or enhanced functionality -- for example the more advanced data reads are able to read only the required columns for a given plot from the file, rather than the whole file). It doesn’t matter if your code only has one user, we are still happy to do this as it makes splash more widely useable and saves trouble later. Writing your own data read --------------------------- If you *really* want to hack one yourself it is best to look at some of the other examples and change the necessary parts to suit your data files. Note that reading directly from unformatted data files is *much* faster than reading from formatted (ascii) data. If you do end up writing your own, again, please email me the end result so I can add it to the officially supported data reads. This also makes it much easier for you to upgrade to newer versions as you do not require a locally customised version. The second best way is to attempt to modify one of the existing data reads. Even then, there are some things to note: Most important is that, for the rendering routines to work, the density, particle masses and smoothing lengths for *all* of the (gas) particles *must* be read in from the data file and their locations in the main data array labelled using the integer parameters ``irho``, ``ipmass`` and ``ih``. Labelling of the location of other particle quantities (e.g. ``iutherm`` for the thermal energy) is used in order to plot the exact solutions on the appropriate graphs and also for calculating additional quantities (e.g. calculation of the pressure uses ``iutherm`` and ``irho``). The positions of vector components in the data columns are indicated by setting the variable ``iamvec`` of that column equal to the first component of the vector of which this component is a part. So if column 4 is a vector quantity (say :math:`{\bf v}` in 3D), then ``iamvec(4) = 4``, ``iamvec(5) = 4`` and ``iamvec(6) = 4``. Similarly the string ``labelvec`` should be set, i.e., ``labelvec = 'v'`` for these columns. danieljprice-splash-4d1f09c/docs/refs.rst000066400000000000000000000023761477365367100205230ustar00rootroot00000000000000 References =========== .. [DW94] `Dai & Woodward (1994), J. Comp. Phys. 111, 354 `_ .. [MP04] `Monaghan & Price (2004), MNRAS 350, 1449 `_ .. [Price07] `Price (2007), PASA 24, 159 `_ .. [Price12] `Price (2012), J. Comp. Phys. 231, 759 `_ .. [Price18] `Price et al. (2018), PASA 35, e031 `_ .. [PB07] `Price & Bate (2007), MNRAS 377, 77 `_ .. [PM04] `Price & Monaghan (2004), MNRAS 348, 123 `_ .. [PM07] `Price & Monaghan (2007), MNRAS 374, 1347 `_ .. [RP07] `Rosswog & Price (2007), MNRAS 379, 915 `_ .. [RJ95] `Ryu & Jones (1995), ApJ 442, 228 `_ .. [Toro92] `Toro (1992), Phil. Trans. Phys. Sci. Eng. 338, 43 `_ danieljprice-splash-4d1f09c/docs/requirements.txt000066400000000000000000000000221477365367100223000ustar00rootroot00000000000000sphinx-rtd-theme danieljprice-splash-4d1f09c/docs/settings.rst000066400000000000000000002445021477365367100214230ustar00rootroot00000000000000.. _sec:settings: Changing plot settings ====================== .. _sec:menu: Menus ----- The plot settings may be changed in a series of submenus: .. image:: figs/menu.png :width: 50.0% Options can be saved using the (s)ave option from the menu: .. image:: figs/menu.png :width: 50.0% .. _sec:menu-s: (s)aving your settings ---------------------- .. image:: figs/menu-s.png :width: 50.0% - Pressing ``s`` saves current options to ``splash.defaults``. - Delete ``splash.defaults`` to revert all settings - Pressing ``S`` saves both ``splash.defaults`` and ``splash.limits`` (and any other files). - Typing ``sa`` or ``Sa`` gives a “save-as†option, changing the prefix of saved files - read defaults files saved with a different prefix using the ``-p`` option Example: :: Please enter your selection now (y axis or option):SA enter prefix for filenames: (default="blah"): default options saved to file blah.defaults saving plot limits to file blah.limits saving units to blah.units Read this back using: :: splash -p blah Files saved by splash can also be edited manually. For example, ``splash.limits`` is a simple two-column ascii file containing minimum and maximum plot limits for each column. To reset the plot limits simply delete the ``splash.limits`` file. .. _sec:multiplot: set (m)ultiplot --------------- .. image:: figs/menu-m.png :width: 50.0% .. _sec:multiplotsetup: Plotting more than one column from the same file on the same page (multiplot) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Press ’m’ (:ref:`sec:multiplot`) from the main menu to set up a multiplot. Once you have gone through the options to set up a multiplot, to actually plot what you have set simply type the number of the column corresponding to “multiplot†at the :math:`y-`\ axis prompt. .. important:: A “multiplot†- multiple columns plotted from the same file - is different to plotting “multiple plots per page†- divide the plotting page up into panels. The number of panels across and down on a page can be changed (see :ref:`sec:nacrossndown`) irrespective of whether or not you are also plotting multiple columns from the same file. Plotting each particle type in a different panel (multiplot) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To make a plot using different particle types in each panel (e.g. gas density in one panel, dust or dark matter density in another), use ’m’ :ref:`sec:multiplot` from the main menu. If multiple types are present in the data read, the option appears to specify the particular types you want to use for each plot. For example, after pressing ‘m’ at the main menu we eventually arrive at the question: :: use all active particle types? (default=yes): n Answering ``no`` brings up a possible list of types: :: 1: use gas particles 2: use ghost particles 3: use sink particles 4: use star particles 5: use unknown/dead particles Enter type or list of types to use ([1:5], default=1): 1,3 Thus entering e.g. ``1,3`` specifies that only gas and sink particles should be used for this plot. .. important:: This is more specific than simply turning particle types on and off for *all* plots, which can be achieved via the ``turn on/off particles by type`` option in the :ref:`sec:menu-o` (see :ref:`sec:plotparticlesbytype`). .. _sec:menu-d: (d)ata options -------------- .. image:: figs/menu-d.png :width: 50.0% The following can all be achieved from the d)ata options menu: Re-reading the initial data / changing the dump file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Just exit splash and restart with the new dump file name on the command line (remember to save by pressing ’S’ from the main menu before exiting to save both the current settings and the plot limits – then you can continue plotting with the current settings using a new dump file). If you have placed more than one file on the command line, then pressing space in :ref:`sec:interactive` will read (and plot) the next file (press ’h’ in :ref:`sec:interactive` for a full list of commands - you can move forwards and backwards using arbitrary jumps). For non-interactive devices or where :ref:`sec:interactive` is turned off dump files are cycled through automatically, plotting the same plot for each file/timestep. .. _sec:subsetofsteps: Using only a subset of data files / plotting every :math:`n-`\ th dump file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To plot a subset of the data files in \*any\* order, see :ref:`sec:selectedstepsonly`. Of course, another way to achieve the same thing is to explicitly order the files on the command line. A method I often use is to write all filenames to a file, e.g. :: > ls DUMP* > splash.filenames then edit the file to list only the files I want to use, then invoke splash with no files on the command line: :: > splash which will use the list of files specified in the ``splash.filenames`` file. .. _sec:buffering: Plotting more than one file without re-reading the data from disk ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For small data sets (or a small number of dump files) it is often useful to read all of the data into memory so that you can move rapidly forwards and backwards between dumps (e.g. in :ref:`sec:interactive`, or where both dumps are plotted on the same page) without unnecessary re-reading of data from disk. This is achieved with the command line flag:: splash --buffer file_0* (provided you have the memory of course!!). Non-buffered data means that only one file at a time is read. .. _sec:calc: Calculating additional quantities not dumped ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Turn ``calculate extra quantities`` on in the :ref:`sec:menu-d`. New columns of data can be created as completely arbitrary functions of the data read from the SPH particles. Option ``d1`` in the data menu leads, for a typical data read, to a prompt similar to the following: :: Specify a function to calculate from the data Valid variables are the column labels, 't', 'gamma', 'x0', 'y0' and 'z0' (origin setting) Spaces, escape sequences (\d) and units labels are removed from variable names Note that previously calculated quantities can be used in subsequent calculations Examples based on current data: r = sqrt((x-x0)**2 + (y-y0)**2 + (z-z0)**2) pressure = (gamma-1)*density*u |v| = sqrt(vx**2 + vy**2 + vz**2) Enter function string to calculate (blank for none) (default=""): Thus, one can for example calculate the pressure from the density and thermal energy according by copying the second example given. .. hint:: Function calculation is completely general and can use any of the columns read from the file, the time for each step (‘``t``’), the adiabatic index :math:`\gamma` (‘``gamma``’) and the current origin setting (``x0``, ``y0`` and ``z0``). Previously calculated quantities can also be used - e.g. in the above example we could further compute, say, an entropy variable using ``s=pressure/density^gamma`` after the pressure has been specified. The resultant quantities appear in the main splash menu as standard columns just as if they had been read from the original data file. The origin for the calculation of radius can be changed via the ``rotation on/off/settings`` option in the :ref:`sec:menu-x`. If particle tracking limits are set (see :ref:`sec:track`) the radius is calculated relative to the particle being tracked. If you simply want to multiply a column by a fixed number (e.g. say you have sound speed squared and you want to plot temperature) - this can also be achieved by defining a unit for the column (i.e., a factor by which to multiply the column by) – see :ref:`sec:physicalunits` for details. The corresponding label can be changed by creating a ``splash.columns`` file (or for the ascii read just a file called ‘columns’) containing labels which are used to override the default ones from the data read (one per line) – see :ref:`sec:columnsfile` for more details. See also :ref:`sec:geom` for how to transform vectors (and positions) into different coordinate systems. .. _sec:physicalunits: Plotting data in physical units ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Data can be plotted in physical units by turning on the ``use physical units`` option in the :ref:`sec:menu-d`. The settings for transforming the data into physical units may be changed via the ``change physical unit settings`` option in the :ref:`sec:menu-d`. (see :ref:`sec:changingunits`) For some data reads (phantom, sphNG, magma) the scalings required to transform the data into physical units are read from the dump file. These are used as the default values but are overridden as soon as changes are made by the user (that is, by the presence of a ‘splash.units’ file) (see :ref:`sec:changingunits`). .. important:: Physical units are now ON by default in v3.x of SPLASH if they are set by the data read. You can use this option to revert to code units Rescaling data columns ~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:physicalunits`. .. _sec:columnsfile: Changing the default column labels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The labelling of columns is usually automatic in the data format read (for ascii files labels will be read from the file header). Aside from changing the labels in the ``read_data`` file specific to the format you are reading, it is also possible to override the labelling of columns at runtime by creating a file called ``splash.columns`` (or with a different prefix if the ``-p`` command line option is used), with one label per line corresponding to each column read from the dump file, e.g. :: column 1 column 2 column 3 my quantity another quantity .. warning:: Labels in the ``splash.columns`` file *will not* override the labels of coordinate axes or labels for vector quantities (as these require the ability to be changed by plotting in different coordinate systems – see :ref:`sec:geom`). Plotting column density in g/cm\ :math:`^{2}` without having x,y,z in cm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:changingunits`. In addition to units for each column (and a unit for time – see :ref:`sec:timeunits`) a unit can be set for the length scale added in 3D column integrated plots. The prompt for this appears after the units of either :math:`x`, :math:`y`, :math:`z` or :math:`h` has been changed via the ``change physical unit settings`` option in the :ref:`sec:menu-d`. The length unit for integration is saved in the first row of the splash.units file, after the units for time. See :ref:`sec:setprojlabel` for details on changing the default labelling scheme for 3D column integrated (projection) plots. .. _sec:changingunits: Changing physical unit settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The settings for transforming the data into physical units may be changed via the ``change physical unit settings`` option in the :ref:`sec:menu-d`. To apply the physical units to the data select the ``use physical units`` option in the :ref:`sec:menu-d`. The transformation used is :math:`new= old*units` where ``old`` is the data as read from the dump file and ``new`` is the value actually plotted. The data menu option also prompts for a units label which is appended to the usual label. Brackets and spaces should be explicitly included in the label as required. Once units have been changed, the user is prompted to save the unit settings to a file called ``splash.units``. Another way of changing units is simply to edit this file yourself in any text editor (the format is fairly self-explanatory). To revert to the default unit settings simply delete this file. To revert to code units turn ``use physical units`` off in the :ref:`sec:menu-d`. .. hint:: A further example of where this option can be useful is where the :math:`y-`\ axis looks crowded because the numeric axis labels read something like :math:`1\times 10^{-4}`. The units option can be used to rescale the data so that the numeric label reads :math:`1` (by setting :math:`units=10^{4}`) whilst the label string is amended to read :math:`y [\times 10^{-4}]` by setting the units label to :math:`[ \times 10^{-4}]`. Changing the axis label to something like :math:`x` :math:`[ \times 10^{4} ]` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:changingunits`. .. _sec:timeunits: Changing the time units ~~~~~~~~~~~~~~~~~~~~~~~~ Units for the time used in the legend can be changed using the ``change physical unit settings`` in the :ref:`sec:menu-d`. Changing the units of column zero corresponds to the time (appears as the first row in the ‘splash.units’ file). .. _sec:menu-i: (i)nteractive mode ------------------ .. image:: figs/menu-i.png :width: 50.0% The menu option i) turns on/off :ref:`sec:interactive`. With this option turned on (the default) and an appropriate device selected (i.e., the X-window, not /png or /ps), after each plot the program waits for specific commands from the user. With the cursor positioned anywhere in the plot window (but not outside it!), many different commands can be invoked. Some functions you may find useful are: Move through timesteps by pressing ``space`` (``b`` to go back); zoom/select particles by selecting an area with the mouse; rotate the particles by using the :math:`<`, :math:`>`,[, ] and :math:`\backslash`, / keys; log the axes by holding the cursor over the appropriate axis and pressing the ``l`` key. Press ``q`` in the plot window to quit :ref:`sec:interactive`. A full list of these commands is obtained by holding the cursor in the plot window and pressing the ‘h’ key (h for help). .. hint:: Changes made in :ref:`sec:interactive` will only be saved by pressing the ‘s’ (for save) key. Otherwise pressing ``space`` (to advance to the next timestep) erases the changes made during :ref:`sec:interactive`. A more limited :ref:`sec:interactive` applies when there is more than one plot per page. Many more commands could be added to the :ref:`sec:interactive`, limited only by your imagination. Please send me your suggestions! Adapting the plot limits ~~~~~~~~~~~~~~~~~~~~~~~~~ Press ``a`` in :ref:`sec:interactive` to adapt the plot limits to the current minimum and maximum of the quantity being plotted. With the mouse over the colour bar, this applies to the colour bar limits. Also works even when the page is subdivided into panels. To adapt the size of the arrows on :ref:`sec:vectorplots`, press ``w``. To use “adaptive plot limits†(where the limits change at every timestep), see :ref:`sec:adapt`. Making the axes logarithmic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Press ``l`` in :ref:`sec:interactive` with the mouse over either the x or y axis or the colour bar to use a logarithmic axis. Pressing ``l`` again changes back to linear axes. To use logarithmic labels as well as logarithmic axes, see :ref:`sec:loglabels`. Cycling through data columns interactively ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use ``f`` in :ref:`sec:interactive` on :ref:`sec:renderplot` to interactively ‘flip’ forwards to the next quantity in the data columns (e.g. thermal energy instead of density). Use ’F’ to flip backwards. .. _sec:colourparts: Colouring a subset of the particles and retaining this colour through other timesteps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: figs/colourparts.pdf :alt: coloured particles :name: fig:colourparts :width: 80.0% Example of particles coloured interactively using the mouse (left) and selection using a parameter range (right), which is the same as the plot on the left but showing only particles in a particular density range (after an intermediate plot of density vs x on which I selected a subset of particles and hit ``p``) In :ref:`sec:interactive`, select a subset of the particles using the mouse (that is left click and resize the box until it contains the region you require), then press either 1-9 to colour the selected particles with colours corresponding to plotting library colour indices 1-9, press ``p`` to plot only those particles selected (hiding all other particles), or ``h`` to hide the selected particles. An example is shown in the left panel of :numref:`fig:colourparts`. Particles retain these colours between timesteps and even between plots. This feature can therefore be used to find particles within a certain parameter range (e.g. by plotting density with x, selecting/colouring particles in a given density range, then plotting x vs y in which the particles will appear as previously selected/coloured). An example of this feature is shown in the right panel of :numref:`fig:colourparts` where I have plotted an intermediate plot of density vs x on which I selected a subset of particles and hit ``p`` (to plot only that subset), then re-plotted x vs y with the new particle selections. To “un-hide†or “de-colour†particles, simply select the entire plotting area and press ``1`` to restore all particles to the foreground colour index. Particles hidden in this manner are also no longer used in the rendering calculation. Thus it is possible to render using only a subset of the particles (e.g. using only half of a box, or only high density particles). An example is shown in :numref:`fig:rendersubset`. To colour the particles according to the value of a particular quantity, see :ref:`sec:colournotrender`. .. important:: Selection in this way is based on the particle *identity*, meaning that the parameter range itself is not preserved for subsequent timesteps, but rather the subset of particles selected from the initial timestep. This can be useful for working out which particles formed a particular object in a simulation by selecting only particles in that object at the end time, and moving backwards through timesteps retaining that selection. Working out which particles formed a particular object in a simulation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This can be achieved by selecting and colouring particles at a particular timestep and plotting the same selection at an earlier time. See :ref:`sec:colourparts` for details. Plotting only a subset of the particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To turn plotting of certain particle *types* on and off, see :ref:`sec:plotparticlesbytype`. To select a subset of the particles based on restrictions of a particular parameter or by spatial region see :ref:`sec:colourparts`. .. _sec:rendersubset: Rendering using only a subset of the particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Particles can be selected and ‘hidden’ interactively (see :ref:`sec:colourparts`) – for :ref:`sec:renderplot` ‘hidden’ particles are also not used in the interpolation calculation from the particles to the pixel array. An example is shown in :numref:`fig:rendersubset`, where I have taken one of the rendered examples in :ref:`sec:basic`, selected half of the domain with the mouse and pressed ’p’ to plot only the selected particles. The result is the plot shown. .. figure:: figs/rendersubset.pdf :alt: rendering with subset of particles :name: fig:rendersubset :width: 50.0% Example of :ref:`sec:renderplot` using only a subset of the particles. Here I have selected only particles on the right hand side of the plot using the mouse and hit ’p’ to plot only those particles. .. important:: Selection of data subsets is by default based on *particle identity* – the same particles will be used for the plot in subsequent dumps, allowing one to easily track the Lagrangian evolution of a patch of gas. See :ref:`sec:rangerestrict` to select by fixed parameter ranges (e.g. to only show particles in fixed density range). .. hint:: A range restriction can be set in :ref:`sec:interactive` by selecting the restricted box using the mouse and pressing ``x``, ``y`` or ``r`` to restrict the particles used to the x, y (or r for both x and y) range of the selected box respectively. Pressing ``S`` at the main menu will save such range restrictions to the ``splash.limits`` file. Tracking a set of particles through multiple timesteps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:rendersubset`. .. _sec:obliquexsec: Taking an oblique cross section interactively ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is possible to take an oblique :ref:`sec:xsec` through 3D data using a combination of rotation and :ref:`sec:xsec` slice plotting. To set the position interactively, press ``x`` in :ref:`sec:interactive` to draw the position of the :ref:`sec:xsec` line (e.g. on an x-y plot this then produces a z-x plot with the appropriate amount of rotation to give the cross section slice in the position selected). .. hint:: Interactively selecting a :ref:`sec:xsec` will work even if the current plot is a 3D column integrated projection. In this case the setting ``projection or cross section`` changes to ``cross section`` in order to plot the slice. .. _sec:menu-p: (p)age options -------------- .. image:: figs/menu-p.png :width: 50.0% Options related to the page setup are changed in the p)age submenu. .. _sec:nstepsontopofeachother: Overlaying timesteps/multiple dump files on top of each other ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is possible to over-plot data from one file on top of data from another using the ``plot n steps on top of each other`` option from the :ref:`sec:menu-p`. Setting :math:`n` to a number greater than one means that the page is not changed until :math:`n` steps have been plotted. Following the prompts, it is possible to change the colour of all particles between steps and the graph markers used and plot an associated legend (see below). .. hint:: This option can also be used in combination with a multiplot (see :ref:`sec:multiplot`) – for example plotting the density vs x and pressure vs x in separate panels, then with :math:`n > 1` all timesteps will be plotted in *each* panel. When more than one timestep is plotted per page with different markers/colours, an additional legend can be plotted (turn this on in the :ref:`sec:menu-g`, or when prompted while setting the ``plot n steps on top of each other`` option). The text for this legend is just the filename by default, if one timestep per file, or just something dull like ’step 1’, if more than one timestep per file. .. hint:: To change the legend text, create a file called ``splash.legend`` in the working directory, with one label per line. The position of the legend can be changed either manually via the ``legend and title options`` in the :ref:`sec:menu-p`, or by positioning the mouse in :ref:`sec:interactive` and pressing ``G`` (similar keys apply for moving plot titles and the legend for :ref:`sec:vectorplots` – press ``h`` in :ref:`sec:interactive` for a full list). Plotting results from multiple files in the same panel ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:nstepsontopofeachother`. Plotting more than one dump file on the same page ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is slightly different to “plotting more than one dump file on the same panel†.. _sec:axessettings: Changing axes settings ~~~~~~~~~~~~~~~~~~~~~~~ Axes settings can be changed in the :ref:`sec:menu-p`, by choosing ``axes options``. The options are as follows: :: -4 : draw box and major tick marks only; -3 : draw box and tick marks (major and minor) only; -2 : draw no box, axes or labels; -1 : draw box only; 0 : draw box and label it with coordinates; 1 : same as AXIS=0, but also draw the coordinate axes (X=0, Y=0); 2 : same as AXIS=1, but also draw grid lines at major increments of the coordinates; 3 : draw box, ticks and numbers but no axes labels; 4 : same as AXIS=0, but with a second y-axis scaled and labelled differently 10 : draw box and label X-axis logarithmically; 20 : draw box and label Y-axis logarithmically; 30 : draw box and label both axes logarithmically. Turning axes off ~~~~~~~~~~~~~~~~~ Plot axes can be turned off by choosing ``axes options`` in the :ref:`sec:menu-p` or by deleting them using the backspace key in :ref:`sec:interactive`. See :ref:`sec:axessettings` for more details. Turning axes labels off ~~~~~~~~~~~~~~~~~~~~~~~~ Axes labels and numbering can be turned off via the ``axes options`` option in the :ref:`sec:menu-p` or by deleting them using the backspace key in :ref:`sec:interactive`. See :ref:`sec:axessettings` for more details. .. _sec:loglabels: Using logarithmic axes labels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Logarithmic axes (that is where the quantity plotted is logged) can be set via the ``apply log or inverse transformations`` option in the :ref:`sec:menu-l` or simply by pressing ``l`` with the cursor over the desired axis (or the colour bar) in :ref:`sec:interactive`. By default the axes labels reads :math:`log(x)` and the number next to the axis is :math:`-4` when :math:`x` is 10\ :math:`^{-4}`. Logarithmic axes labels (i.e., where the label reads :math:`x` and the number next to the axis is :math:`10^{-4}` with a logarithmic scale) can be specified by choosing the ``axes options`` option in the :ref:`sec:menu-p` and setting the axes option to 10, 20 or 30 as necessary (see :ref:`sec:axessettings` for more details). Plotting a second, rescaled y-axis on the right hand side of a plot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A second y axis can be added by selecting the axis=4 option in the ``axes option`` in the :ref:`sec:menu-p` (see :ref:`sec:axessettings`). This will prompt for the scaling and alternative label: :: enter axis option ([-4:30], default=0): 4 enter scale factor for alternative y axis ([0.000:], default=1.000): 10.0 enter label for alternative y axis (default=""): y [other units] .. _sec:papersize: Changing the size of the plotting surface ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The physical size of the viewing surface used for plotting can be changed via the ``change paper size`` option in the :ref:`sec:menu-p`. This affects the size of the X-window (if plotted to the screen) and the size of .png or images generated (if plotted to these devices). Several preset options are provided or the paper size in x and y can be explicitly specified in inches or pixels. .. _sec:nacrossndown: Dividing the plotting page into panels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The plotting page can be divided into panels using the ``subdivide page into panels`` option in the :ref:`sec:menu-p`. For multiple plots per page (i.e., nacross :math:`\times` ndown :math:`> 1`) a more limited :ref:`sec:interactive` applies (basically because the data used for the plots is no longer stored in memory if there is more than one plot on the same page meaning that functionality such as selecting particles must be turned off). .. _sec:tiling: Tiling plots with the same :math:`x-` and :math:`y-` axes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Plots with the same :math:`x-` and :math:`y-` axes are tiled if the tiling option from the :ref:`sec:menu-p`. Tiling means that only one axis is shown where multiple plots share the same x or y axis and that the plots are placed as close to each other as possible. For :ref:`sec:renderplot` a shared colour bar is plotted which spans the full length of the page. .. _sec:squarexy: Using non-proportional scales for spatial dimensions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ By default if the x and y axes are both spatial coordinates, the axes are scaled proportionately. This can be changed via the ``spatial dimensions have same scale`` option in :ref:`sec:menu-p`. Using non-square axes on coordinate plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:squarexy`. Changing the character height for axes, labels and legends ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The character height used for axes, labels and legends can be changed via the :ref:`sec:menu-p`. The character height is relative to the paper size where 1.0 = 1/40th of the page height. The page height can be changed in :ref:`sec:papersize`. Using a thicker line width on plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The line width used for axes and text can be changed via the :ref:`sec:menu-p`. .. _sec:pagecolours: Changing the foreground and background colours ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The background and foreground colour of a plot can be changed via the ``set foreground/background colours`` option in the :ref:`sec:menu-p`. Note that the background colour setting has no effect on postscript devices (see :ref:`sec:postscript` for more details). Plotting axes, legends and titles in white even when the labels are plotted in black ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ By default, axes, legends and titles are plotted in the foreground colour (e.g. black). However if the plot itself is also largely black (e.g. :ref:`sec:renderplot` when lots of particles are plotted) it can be useful to overplot those parts of the axes and labelling which lie on top of the plotting surface in the background colour (e.g. white). A prompt for this is given when setting the ``set foreground/background colours`` option in the :ref:`sec:menu-p`. The prompt appears as follows: :: ---------------- page setup options ------------------- ... 9) set foreground/background colours enter option ([0:8], default=0):9 Enter background colour (by name, e.g. "black") (default=""):white Enter foreground colour (by name, e.g. "white") (default=""):black Overlaid (that is, drawn inside the plot borders) axis ticks, legend text and titles are by default plotted in the foreground colour [i.e., black]. Do you want to plot these in background colour [i.e., white] instead ? (default=no):y In the above I have selected a background colour of white, a foreground colour of black. Answering yes to the last question means that those parts of the axes which lie on top of the viewing surface (and any labels) will be plotted in white (the background colour) instead of the foreground colour (black). .. _sec:menu-g: le(g)end and title options -------------------------- .. image:: figs/menu-g.png :width: 50.0% .. _sec:title: Adding titles to plots / repositioning titles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Plots may be titled individually by creating a file called ``splash.titles`` in the current directory, with the title on each line corresponding to the position of the plot on the page. Thus the title is the same between timesteps unless the steps are plotted together on the same physical page. Leave blank lines for plots without titles. For example, creating a file called ``splash.titles`` in the current directory, containing the text: :: plot one plot two plot three and positioning the title using the default options, will produce a plot with one of these titles on each panel. .. _sec:legendoff: Turning off/moving the time legend ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The position of the time legend can be set interactively by positioning the mouse in the plot window and pressing ’G’. To set the position non-interactively and/or change additional settings such as the justification, use the ``time legend on/off/settings`` option in the :ref:`sec:menu-g`. .. _sec:timelegendtext: Changing the text in the time legend ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The text which appears the time legend (by default this is ``t=``) can be changed via the ``time legend on/off/settings`` option in the :ref:`sec:menu-g`. To rescale the *value* of the time displayed in the time legend (default value is as read from the dump file), see :ref:`sec:timeunits`. Making the legend read 'z=' instead of 't=' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:timelegendtext`. An option to change the legend text is provided in the ``time legend on/off/settings`` option in :ref:`sec:menu-g`. The numeric value of the time legend is as read into the ``time`` array in the read_data routine. This value can be rescaled by setting a unit for time (see :ref:`sec:timeunits`). Plotting the time legend on the first row/column of panels / nth panel only ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to plot the time legend on the first row or column of panels or on a single panel only appears in the :ref:`sec:menu-g`. Plotting a length scale on coordinate plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to plot a length scale (i.e., ``|---|`` with a label below it indicating the length) on coordinate plots (i.e., plots where both :math:`x-` and :math:`y-`\ axes refer to particle coordinates) is provided in the :ref:`sec:menu-g`. Annotating a plot with squares, rectangles, arrows, circles and text ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use the ``annotate plot`` option in :ref:`sec:menu-g` to annotate plots with a range of geometric objects (squares, rectangles, arrows, circles and text) with full control over attributes such as line width, line style, colour, angle and fill style. Text annotation can also be added/deleted in :ref:`sec:interactive` using ``ctrl-t`` (to add) and the backspace key (to delete). Text can also be added to plots by adding titles (:ref:`sec:title`) which can be different in different panels. Text labels added using shape annotation differ from titles by the fact that they must appear the same in each panel and are positioned according to the world co-ordinates of the plot (rather than relative to the viewport). Shape text can also be displayed at arbitrary angles. An option to plot length scales (``|---|``) on coordinate plots is implemented separately via the ``plot scale on coordinate plots`` option in :ref:`sec:menu-g`. Adding your name to a plot/movie ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Arbitrary text annotation can be added/removed in :ref:`sec:interactive` using ``ctrl-t`` (to add) and the backspace key (to delete) or via the ``annotate plot`` option in the :ref:`sec:menu-g`. .. _sec:menu-o: particle plot (o)ptions ----------------------- .. image:: figs/menu-o.png :width: 50.0% The following are tasks which can be achieved via options in the :ref:`sec:menu-o`. .. _sec:plotparticlesbytype: Plotting non-gas particles (e.g. ghosts, boundary, sink particles) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Particles of different types can be turned on or off (i.e., plotted or not) using the ``turn on/off particles by type`` option in :ref:`sec:menu-o`. This option also prompts to allow particles of non-SPH types to be plotted on top of :ref:`sec:renderplot` (useful for sink or star particles - this option does not apply to SPH particle types). Turning SPH particle types on or off also determines whether or not they will be used in the rendering calculation (i.e., the interpolation to pixels). This particularly applies to ghost particles, where ghost particles will only be used in the rendering if they are turned on via this menu option. (The fact that particles of a given type are SPH particles or not is specified by the ``UseTypeInRendering`` flags in the set_labels part of the read_data file). Plotting non-gas particles on top of rendered plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to plot non-SPH particles on top of :ref:`sec:renderplot` (e.g. sink particles) can be set when turning particle types on/off via the ``turn on/off particles by type`` option in :ref:`sec:menu-o` (see :ref:`sec:plotparticlesbytype`). Using ghost particles in the rendering ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:plotparticlesbytype`. Turn off plotting of gas particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Particles can be turned on or off by type via the ``turn on/off particles by type`` option in :ref:`sec:menu-o`. See :ref:`sec:plotparticlesbytype`. .. _sec:darkmatter: Plotting dark matter particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To plot dark matter particles (e.g. for the gadget read) the particle type corresponding to dark matter particles must be turned on via the ``turn on/off particles by type`` option in :ref:`sec:menu-o`. Turning this option on means that dark matter particles will appear on particle plots. To make :ref:`sec:renderplot` of dark matter (e.g. showing column density), it is necessary to define smoothing lengths and a fake “density†for the dark matter particles. If your data read already supplies individual smoothing lengths for dark matter particles, the only thing to do is define a fake density field with a constant value (e.g. :math:`\rho = 1` for all dark matter particles). The actual density value does not matter, so long as it is non-zero, as the rendering for density does not use it unless the ``normalise interpolations`` option in the :ref:`sec:menu-r` is set (which it is not by default). This is because SPLASH constructs the weight: .. math:: w_{part} = \frac{m_{part}}{\rho_{part} h_{part}^{\nu}}, (see `Price 2007 `_) and then interpolates for any quantity A using .. math:: A_{pixels} = \sum_{part} w_{part} A_{part} W_{kernel}, so if :math:`A = \rho` then the actual rho value cancels. For the GADGET data read you can define the smoothing length for dark matter particles by setting the environment variable GSPLASH_DARKMATTER_HSOFT (see :ref:`sec:gsplash` for details), which also triggers the creation of a fake density column as required. With this variable set dark matter particles are treated identically to SPH particles and can be rendered as usual (although the only meaningful quantity to render is the density). A much better way is to define smoothing lengths individually for dark matter particles, for example based on a local number density estimate from the relation .. math:: h \propto n^{-1/3}, \hspace{0.5cm} \textrm{where} \hspace{0.5cm} n_{i} = \sum_{j} W_{ij}. Actually, none of this should be necessary, as the gravity for dark matter should be softened with smoothing lengths defined like this in the first place. The historical practice of fixed softening lengths has arisen only because of confusion about what softening really means (and worries about energy conservation with adaptive softening lengths). What you are trying to do is solve Poisson’s equation for the dark matter density field, defined with a kernel density estimate and using fixed softening lengths is not a way to get a good density... but don’t get me started, read [PM07]_ instead. .. danger:: For simulations using both SPH and dark matter particles, dark matter particles will contribute (incorrectly) to the SPH rendering when the environment variable is set and the plotting of dark matter particles is turned on. Thus to plot just gas column density in this case, dark matter particles must be turned off [via the :ref:`sec:menu-o`], and similarly to plot just dark matter density if both SPH and dark matter particles are present, SPH particles must be turned off. Plotting a column density plot of dark matter/N-body particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:darkmatter`. .. _sec:plotsinks: Plotting sink particles ~~~~~~~~~~~~~~~~~~~~~~~~ Sink particles will be plotted on particle plots once turned on via the ``turn on/off particles by type`` option in :ref:`sec:menu-o`. Setting this option also gives a prompt for whether or not to plot sink particles on top of :ref:`sec:renderplot` (to which the answer should be yes). See :ref:`sec:plotparticlesbytype` for more details. To plot sink particles as a circle scaled to the sink radius, select the appropriate marker type (32-35) in the ``change graph markers for each type`` option in :ref:`sec:menu-o`. This allows plotting of particles of a given type with circles, filled or open, proportional to their smoothing lengths. Thus, the smoothing length for sink particles needs to be set to their accretion radius (or at least proportional to it). .. hint:: A good option for sink particles is to print “outlined†filled circles (marker 34) — these show up on both black or white backgrounds. Plotting sink particles with size proportional to the sink radius ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:plotsinks`. Plotting a point mass particle with physical size ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:plotsinks`. Changing graph markers for each particle type ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The graph markers used to plot each particle type can be changed via the ``change graph markers for each type`` option in the :ref:`sec:menu-o`. The full list of available markers is given in the documentation for giza (also similar to the markers used in pgplot). SPLASH also allows the particles to be marked by a circle proportional to the smoothing length for that particle, implemented as marker types 32-35 under the ``change graph markers for each type`` option in the :ref:`sec:menu-o`. .. _sec:partcolours: Plotting each particle type in a different colour ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Each particle type can be plotted in a different colour via the ``set colour for each particle type`` option in the :ref:`sec:menu-o`. Changing the order in which different particle types are plotted ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The order in which particle types are plotted can be changed via the ``change plotting order of types`` option in :ref:`sec:menu-o`. For example, it is possible to make dark matter particles be plotted on top of gas particles rather than the default which is vice-versa. This is only implemented for particle types which are stored contiguously (one after the other) in the data read, rather than mixed in with each other. .. _sec:lines: Plotting using lines instead of dots (e.g. for energy vs time plots) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to plot a line joining all of the points on a plot can be set via the ``plot line joining particles`` option in :ref:`sec:menu-o`. When set, this option plots a line connecting the (gas only) particles in the order that they appear in the data array. Useful mainly in one dimension or when plotting ascii data, although can give an indication of the relative closeness of the particles in memory and in physical space in higher dimensions. The line colours and styles can be changed. To plot the line only with no particles, turn off gas particles using the ``turn on/off particles by type option`` from :ref:`sec:menu-o`. Plotting multiple lines with different colours/line styles and a legend ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When multiple timesteps are plotted on the same physical page, the line style can be changed instead of the colour (this occurs when the change colour option is chosen for multiple steps per page – see the ``change plots per page`` option in the :ref:`sec:menu-p`. Joining the dots ~~~~~~~~~~~~~~~~~ See :ref:`sec:lines`. .. _sec:smoothingcircle: Plotting the size of the smoothing circle around selected particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On coordinate plots this option plots a circle of radius :math:`2h` around selected particles. This is primarily useful in debugging neighbour finding routines. Where only one of the axes is a coordinate this function plots an error bar of length :math:`2h` in either direction is plotted in the direction of the coordinate axis. See also :ref:`sec:findingaparticle` for more details. .. _sec:findingaparticle: Locating a particular particle in the data set ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The best way to locate a particular particle in the data set is to use the ``plot smoothing circles`` option in :ref:`sec:menu-o`, e.g: :: Please enter your selection now (y axis or option):o5 ------------- particle plot options ------------------- Note that circles of interaction can also be set interactively Enter number of circles to draw ([0:100], default=0):1 Enter particle number to plot circle around ([1:959], default=1): 868 then upon plotting a coordinate plot (e.g. x vs y), particle 868 will be plotted with a circle of size :math:`2h` which makes it easy to distinguish from the other particles. See also :ref:`sec:smoothingcircle`. .. _sec:geom: Plotting in different coordinate systems (e.g. cylindrical coordinates) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The coordinates of position and of all vector components can be transformed into non-cartesian coordinate systems using the ``change coordinate system`` option in :ref:`sec:menu-o`. For example, a dump file with columns as follows: :: ------------------------------------------------------- 1) x 6) log density 2) y 7) v\dx 3) z 8) v\dy 4) particle mass 9) v\dz 5) h ------------------------------------------------------- 10) multiplot [ 4 ] m) set multiplot ------------------------------------------------------- Please enter your selection now (y axis or option): choosing :ref:`sec:menu-o`, option 7) and choosing cylindrical coordinates then produces; :: You may choose from a delectable sample of plots ------------------------------------------------------- 1) r 6) log density 2) phi 7) v\dr 3) z 8) v\dphi 4) particle mass 9) v\dz 5) h ------------------------------------------------------- ... transforming both coordinates and vectors into the chosen coordinate system. .. hint:: :ref:`sec:renderplot` are also possible in coordinate systems other than those native to the file. .. hint:: For 3D SPH simulations, extra columns will appear in the menu in cylindrical or spherical coordinates allowing plots of azimuthally-averaged surface density and Toomre Q parameter. For more details see :ref:`sec:surfdens`. Details of the coordinate transformations are given in :ref:`sec:coordtransforms`. If you have a coordinate system you would like implemented, please email me the details! Plotting vector components in different coordinate systems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:geom`. Plotting orbital velocities ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:geom`. Plotting against azimuthal angle/cylindrical radius/etc ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:geom`. .. _sec:exactsolns: Plotting the exact solution to common test problems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Turn on `plot exact solution` in :ref:`sec:menu-o` The following exact solutions are provided - Any arbitrary function y = f(x,t) (can be plotted on any or all of the plots). The functions to be plotted can also be specified by creating a ``splash.func`` file with one function per line. - Hydrodynamic shock tubes (Riemann problem) – a full solution is provided for all types of waves propagating in either direction. - Spherically-symmetric 3D sedov blast wave problem. - Polytropes (with arbitrary :math:`\gamma`) - One and two dimensional toy stars. This is a particularly simple test problem for SPH codes described in [MP04]_. - Linear wave. This simply plots a sine wave of a specified amplitude, period and wavelength on the plot specified. - MHD shock tubes (tabulated). These are tabulated solutions for 7 specific MHD shock tube problems. - h vs :math:`\rho`. This is the exact solution relating smoothing length and density in the form :math:`h \propto (m/\rho)^{1/\nu}` where :math:`\nu` is the number of spatial dimensions. - radial density profiles. For various models commonly used in :math:`N-`\ body simulations. - Exact solution from a file. This option reads in an exact solution from the filename input by the user, assuming the file contains two columns containing the :math:`x-` and :math:`y-` coordinates of an exact solution to be plotted as a line on the plot specified. Details of the calculation of the exact solutions are given in :ref:`sec:exact`. An example plot using the Sedov blast wave exact solution is shown in :numref:`fig:sedov`. .. figure:: figs/sedov_example.png :alt: sedov exact solution :name: fig:sedov :width: 50.0% Example of a plot utilising the Sedov blast wave exact solution. Taken from [RP07]_. Plotting an exact solution from a file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:exactsolns`. One of the options for exact solution plotting is to read the exact solution from either one or a sequence of ascii files, such that the results are plotted alongside the particle data. The filename(s) can be specified by the user and will be saved to the ‘splash.defaults’ file so that the solution(s) will be read and plotted on subsequent invocations of splash . Changing the exact solution line style & colour ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The line style and colour of the exact solution line can be changed via the ``exact solution plot options`` option in :ref:`sec:menu-o`. This option can also be used to turn on/off calculation of various error norms together with an inset plot of the residual error on the particles. See :ref:`sec:exact` for details of the error norms calculated. Setting the number of points used in an exact solution calculation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The number of points used in an exact solution calculation can be changed via the ``exact solution plot options`` option in :ref:`sec:menu-o`. Plotting an inset plot of residual errors from an exact solution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An inset plot of residual errors between the plotted points and an exact solution calculation can be turned on via the ``exact solution plot options`` option in :ref:`sec:menu-o`. .. _sec:menu-l: (l)imits menu ------------- .. image:: figs/menu-l.png :width: 50.0% .. _sec:adapt: Using plot limits which adapt automatically for each new plot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adaptive plot limits can be set using option 1 of the :ref:`sec:menu-l`. Different settings can be applied to coordinate axes and non-coordinate axes. Changing plot limits interactively and pressing ``s`` in :ref:`sec:interactive` will change this option back to using fixed limits. Using adaptive plot limits for the colour bar but not for the coordinates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adaptive plot limits can be set individually for coordinate axes and non-coordinate axes (e.g. the colour bar) via the ``use adaptive/fixed limits`` option in the :ref:`sec:menu-l`. See :ref:`sec:adapt`. Setting plot limits manually ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Plot limits can be set manually using option 2) of the :ref:`sec:menu-l` (or simply ``l2`` from the main menu). Alternatively you can edit the ``splash.limits`` file created by :ref:`sec:menu-s` prior to invoking splash (this file simply contains the minimum and maximum limits for each column on consecutive lines). .. _sec:track: Making plot limits relative to a particular particle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Particle tracking limits (i.e., where a chosen particle is always at the centre of the plot and limits are set relative to that position) can be set via the ``make xy limits relative to particle`` option in the :ref:`sec:menu-l`. Alternatively particle tracking limits can be set interactively by pressing ``t`` in :ref:`sec:interactive` with the cursor over the particle you wish to track. .. warning:: This option only works if particle identities are preserved between timesteps in the data files .. important:: With particle tracking limits set, the radius calculated via the ``calculate extra quantities`` option in the :ref:`sec:menu-d` is calculated relative to the tracked particle. Centreing on a sink particle can also be achieved using the SPLASH_CENTRE_ON_SINK environment variable (see :ref:`sec:envvariables`). Plotting in a comoving reference frame ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A co-moving reference frame can be set using the ``make xy limits relative to particle`` option in the :ref:`sec:menu-l`. Coordinate limits are then centred on the selected particle for all timesteps, with offsets as input by the user. This effectively gives the ‘Lagrangian’ perspective. See :ref:`sec:track` for more details. Centreing on a sink particle can also be achieved using the SPLASH_CENTRE_ON_SINK environment variable. Setting the origin to correspond to a particular particle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:track`. Tracking a particle ~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:track`. .. _sec:tracksink: Setting the origin to the position of the :math:`n`\ th sink particle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This can be achieved using the ``make xy limits relative to particle`` option in the :ref:`sec:menu-l`. For example, to track the first sink particle we would proceed as follows: :: Please enter your selection now (y axis or option):l3 ------------------ limits options --------------------- To track particle 4923, enter 4923 To track the 43rd particle of type 3, enter 3:43 Enter particle to track: (default="0"): 3:1 where 3:1 indicates the first particle of type 3. The origin is set to the position of this particle and limits are relative to its position. See :ref:`sec:track` for more details. Plotting radial plots around sink particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ First, set the origin to the location of the sink, as described above. Then simply change to spherical coordinates using the ``change coordinate systems`` option in :ref:`sec:menu-o`. Alternatively, compute the radius using the ``calculate extra quantities`` option in the :ref:`sec:menu-d`. Automatically adapting plot limits to match aspect ratio of output device ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to automatically adjust the plot limits to match the aspect ratio of the output device is given in the :ref:`sec:menu-l`, and is also prompted for whenever the paper size is changed (via the ``change paper size`` option in the :ref:`sec:menu-p`, see :ref:`sec:papersize`). Plotting with log axes. ~~~~~~~~~~~~~~~~~~~~~~~~ Log axes can be set either interactively (by pressing ``l`` with the cursor over the desired axis) or manually via the ``apply log or inverse transformations to columns`` option in the :ref:`sec:menu-l`. To use logarithmic axes labels as well, see :ref:`sec:loglabels`. Plotting the square root, inverse or square of a quantity ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Columns can be logged, inverted, sqrt-ed, squared or any combination of the above via the ``apply log or inverse transformations to columns`` option in the :ref:`sec:menu-l`. If you have any additional transformations you would find useful please let me know, as it is straightforward to add more. .. _sec:resetlimits: Resetting limits for all columns ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Limits for all columns can be reset to their minimum and maximum values from the current dump file via the ``reset limits for all columns`` option in the :ref:`sec:menu-l`. See :ref:`sec:interactive` for details of resetting plot limits for a particular plot interactively. Restoring all plot limits to their minimum and maximum values in the current dump file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:resetlimits`. .. _sec:rangerestrict: Using a subset of data restricted by parameter range ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use only a subset of the particles in both particle plots and :ref:`sec:renderplot`, according to restrictions on any or all of the data columns (for example, using only particles with :math:`\rho > 10`, in the 3D box :math:`x,y,z \in [-0.1, 0.1]`). Whilst this has always been possible by selecting, colouring and/or hiding particles in :ref:`sec:interactive` (see :ref:`sec:rendersubset`), the difference here is that the selection is based, for each timestep, strictly on the parameter range, rather than being a selection based on particle identity. This means that the parameter range is also saved to the ``splash.limits`` (i.e., by :ref:`sec:menu-s`) and is shown when splash launches via lines such as: :: >> current range restrictions set: ( 1.693E-01 < x < 1.820E-01 ) ( 2.205E-01 < y < 2.265E-01 ) ( 7.580E-06 < density < 2.989E-05 ) >> only particles within this range will be plotted and/or used in interpolation routines or more usually: :: >> no current parameter range restrictions set Parameter range restrictions can be set either manually via the :ref:`sec:menu-l` (option 7) or interactively by selecting a region in the plot and pressing ‘x’, ‘y’ or ‘r’ to restrict using the :math:`x`, :math:`y` or both :math:`x` and :math:`y` limits of the selected area respectively (pressing ‘R’ instead removes all currently set restrictions). Another way of setting manual range restrictions is simply to edit the ``splash.limits`` file directly (this simply contains the min and max limits for each column, followed optionally by a third and fourth column specifying, respectively, the min and max of the range restriction). Plotting only particles with :math:`\rho > 10`, :math:`u > 20` and :math:`-0.25 < x < 0.25` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Plotting a subset of the particles restricted by a parameter can be achieved by setting a parameter range restriction (which does not change between timesteps – see :ref:`sec:rangerestrict`), or alternatively by an interactive selection based on particle identity (see :ref:`sec:rendersubset`). .. _sec:menu-r: (r)endering options ------------------- .. image:: figs/menu-r.png :width: 50.0% Changing the number of pixels in a rendered image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The number of pixels in a rendered image can be set manually using the :ref:`sec:menu-r`, option 1 (or simply type ``r1`` from the main menu). The number set is the number of pixels along the :math:`x-`\ axis. The number of pixels along the :math:`y-`\ axis is determined by the aspect ratio of the plot. The number of pixels used in an image is, by default, automatically determined by the actual number of pixels available on the graphics device, which depends in turn on the size of the page (the page size can be set manually in the :ref:`sec:menu-p` – see :ref:`sec:papersize`). For vector (non-pixel) devices such as postscript, svg or pdf, the number of pixels is set to :math:`1024/\textrm{n}`, where n is the number of panels across the page. Changing the colour scheme ~~~~~~~~~~~~~~~~~~~~~~~~~~~ The colour scheme used for :ref:`sec:renderplot` can be changed either by pressing ``m`` or ``M`` in :ref:`sec:interactive` to cycle through the available schemes or manually by using the ``change colour scheme`` option in the :ref:`sec:menu-r`. A demonstration of all the colour schemes can be also be invoked from this menu option. Setting the colour scheme to zero plots only the contours of the rendered quantity (assuming that plot contours is set to true). The colour schemes available are shown in :numref:`fig:colourschemes`. .. figure:: figs/colourschemes.pdf :alt: splash colour schemes :name: fig:colourschemes splash colour schemes User contributed colour schemes are eagerly invited (just send me either: a table of r,g,b colour indices [if you know them] or just an image of a colour bar you wish to reproduce and I will add it). Plotting contours as well as the rendered image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Contours of either the rendered pixel array or of another (separate) quantity can be plotted on top of :ref:`sec:renderplot` by setting the ``plot contours`` option from the :ref:`sec:menu-r`. With this option set, an extra prompt will appear after the render prompt asking the user for a quantity to be contoured. The contoured quantity can also be set via the command line options (:ref:`sec:commandline`). If the rendered and contoured quantities are the same, further prompts appear which enable the limits for the contour plot to be set separately to the render plot. These limits are also saved separately in the ``splash.limits`` file when written. .. hint:: To plot contours *instead* of the rendered image, use the ``change colour scheme`` option from the :ref:`sec:menu-r` and choose colour scheme 0 (contours only). Plotting contours instead of a rendered image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To plot contours instead of the rendered image, use the ``change colour scheme`` option from the :ref:`sec:menu-r` and choose colour scheme 0 (contours only). Changing the number of contour levels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The number of contour levels used whenever contours are drawn can be set via the ``change number of contours`` option in the :ref:`sec:menu-r`. The contour levels can also be manually specified (see :ref:`sec:contoursmanual`). .. _sec:contoursmanual: Setting the contour levels manually ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As of v1.15.0, contour levels can be set manually by creating a file called ``splash.contours`` in the current directory (or ``prefix.contours`` if the ``splash -p prefix`` is specified on the command line). This file should contain one contour level per line, optionally with a label for each contour, e.g. :: 1.e-2 level 1 1.e-1 level 2 0.1 my really great contour 1.0 hi mum Adding numeric labels to contours ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to write numeric labels on contours appears as part of the ``change number of contours`` option in the :ref:`sec:menu-r`. Adding arbitrary contour labels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Contours can also be labelled manually by creating a ``splash.contours`` file. See :ref:`sec:contoursmanual`. Turning the colour bar off/ moving the colour bar label ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The colour bar can be turned on or off and the style chosen (e.g. horizontal vs vertical) and for the vertical bar, the label moved closer to the bar itself, via the ``colour bar options`` option in the :ref:`sec:menu-r`. To change the text in the colour bar label, see :ref:`sec:setprojlabel`. .. _sec:colourbarstyle: Changing the style of the colour bar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The colour bar style (i.e., vertical vs. horizontal, plot-hugging vs. non plot-hugging, one-sided vs. two-sided, floating vs. fixed) can be changed via the ``colour bar options`` option in the :ref:`sec:menu-r`. If you want a different style implemented, email me! Using a horizontal colour bar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to use a horizontal colour bar instead of the default vertical arrangement is given in the ``colour bar options`` option in the :ref:`sec:menu-r`. Using ‘plot-hugging’ colour bars ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:colourbarstyle`. Using floating/inset colour bars ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:colourbarstyle`. Plotting ticks on only one side of the colour bar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:colourbarstyle`. Changing the text in the colour bar label ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:setprojlabel`. .. _sec:colournotrender: Using coloured particles instead of rendering to pixels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As a simpler alternative to interpolating to a pixel array, particles can simply be coloured according to the value of a particular quantity by setting the ``use particle colours not pixels`` option in the :ref:`sec:menu-r`. With this option set, :ref:`sec:renderplot` are simply plotted by colouring the particles according to the rendered field. This is somewhat cruder but can be a good indication of where individual particles might be affecting results. .. danger:: Any colouring of the particles set in :ref:`sec:interactive` will be overwritten by use of this option. Using normalised interpolations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A normalised interpolation to pixels can be used by setting the ``normalise interpolations`` option from the :ref:`sec:menu-r`. In general this leads to smoother rendering but also means that edges and surfaces appear more prominently (and a bit strange). The rule-of-thumb I suggest is to use this option when there are no free surfaces in the simulation. .. warning:: Normalising a 3D column density rendering means plotting the quantity :math:`\int \rho {\rm d}z / \int {\rm d}z`, which is a bit meaningless. More useful is to turn on :ref:`sec:densityweighted`, which gives a mass-weighted line of sight average. For example, plotting temperature, this would give :math:`\int \rho T {\rm d}z / \int \rho {\rm d}z` which is more meaningful. Speeding up the rendering on 3D column integrated plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Interpolation on 3D column integrated plots can be made faster by setting the ``use accelerated rendering`` option in the :ref:`sec:menu-r`. The reason this is an option is that it makes a small approximation by assuming that each particle lies exactly in the centre of a pixel. In general this works very well but is not set by default because it can produce funny looking results when the particles are aligned on a regular grid (e.g. as is often the case in initial conditions). Typical speed-ups range from :math:`\times 2` up to :math:`\times 4`, so it is highly recommended for interactive work. .. _sec:densityweighted: Density weighted interpolation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Density weighted interpolation (where a quantity is plotted times :math:`\rho`) can be turned on in the :ref:`sec:menu-r`. Selecting and rendering only a subset of the particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An example of how to render using only a selected subset of the particles was given in :ref:`sec:rendersubset`. .. _sec:setprojlabel: Changing the label used for 3D projection plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The labelling scheme used to determine the colour bar label can be changed via the ``customize label on projection plots`` option in the :ref:`sec:menu-r`. Information specific to the quantity being rendered can be incorporated via format codes as follows: :: Example format strings: \(2268) %l d%z %uz : this is the default format "\int rho [g/cm^3] dz [cm]" column %l : would print "column density" for density surface %l : would print "surface density" %l integrated through %z : would print "density integrated through z" Format codes: %l : label for rendered quantity %z : label for 'z' %uz : units label for z (only if physical units applied) Changing “column density†to “surface density†on 3D plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:setprojlabel`. Changing the interpolation kernel ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The kernel used for the interpolations is by default the M\ :math:`_{4}` cubic B-spline, which has been standard in SPH calculations since the mid-1980’s. Other kernels can be selected via the ``change kernel`` option in the :ref:`sec:menu-r`. The kernel can also be changed by setting the ``SPLASH_KERNEL`` environment variable to either the kernel name as listed in the :ref:`sec:menu-r`, or something sensible resembling it. At present only a few kernels are implemented, with ``cubic`` , ``quartic`` and ``quintic`` referring to the M\ :math:`_{4}`, M\ :math:`_{5}` and M\ :math:`_{6}` B-splines with support of 2h and 3h, respectively. See [Price12]_ for more details. .. _sec:menu-v: (v)ector plot options --------------------- .. image:: figs/menu-v.png :width: 50.0% Changing the number of arrows on vector plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`sec:vecpix`. .. _sec:vecpix: Changing the number of pixels in vector plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The number of pixels used on :ref:`sec:vectorplots` can be changed via the ``change number of pixels`` option in the :ref:`sec:menu-v`. This controls the number and average size of the arrows which appear (i.e., one arrow is plotted at the centre of each pixel). Changing the size of arrows on vector plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The size of the arrows on :ref:`sec:vectorplots` is proportional to the magnitude of the vector quantity at that pixel, where the maximum size is set from the maximum plot limit for the x, y and z components of the vector quantity being plotted such that the longest arrow fills one pixel. These limits can be changed manually via the :ref:`sec:menu-l` options. Where these limits are nowhere near the actual values of the vector field, arrows can appear either very big (just a line across the screen) or extremely small (appearing as just dots). Pressing ``w`` in :ref:`sec:interactive` automatically adjusts the arrows to sensible proportions (this is the equivalent of pressing ``a`` for non-vector quantities). Alternatively pressing ``v`` (to decrease) or ``V`` (to increase) can be used to adjust the arrow lengths (the change can be multiplied by 10 or more by first pressing ``z`` one or more times before pressing ``v`` or ``V``). Plotting vector arrows in white instead of black or vice-versa ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Vector arrows are by default plotted using the current foreground colour index (i.e., as used for plotting the axes). To plot in the background colour index instead set the ``use background colour for arrows`` option in the :ref:`sec:menu-v`. Turning off the legend for vector plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The legend which appears on :ref:`sec:vectorplots` can be turned on or off via the ``vector plot legend settings`` option in the :ref:`sec:menu-v`. Moving the vector plot legend ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The position of the :ref:`sec:vectorplots` legend can be set either interactively by positioning the mouse and pressing ``H`` or manually via the ``vector plot legend settings`` option in the :ref:`sec:menu-v`. Plotting stream/fieldlines instead of arrows ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To plot :ref:`sec:vectorplots` that use stream/fieldlines instead of arrows, set the ``plot stream/field lines instead of arrows`` option in the :ref:`sec:menu-v`. This option performs a simple integration of the interpolated vector field to get the stream function, the contours of which are then plotted .. hint:: The number of contours can be changed via the ``change number of contours`` option in the :ref:`sec:menu-r`. It is generally advantageous to use a larger number of pixels for the vector interpolation (See :ref:`sec:vecpix`) to get smooth contours. At present this option works quite well for smooth vector fields but can perform poorly for vector fields with strong gradients. Turning arrow heads off for vector plots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :ref:`sec:vectorplots` can be plotted using arrows without heads using the ``turn arrow heads on/off`` option in the :ref:`sec:menu-v`. Hiding vector arrows where there are no SPH particles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On :ref:`sec:renderplot` often arrows can appear where there are apparently no SPH particles because the interpolation is performed to all pixels within :math:`2h` of an SPH particle. Such arrows in regions of few or no particles can be hidden using the ``hide arrows where there are no particles`` option in the :ref:`sec:menu-v`. A threshold number of particles for each pixel can be specified, below which no arrow will be plotted on that pixel. Plotting a vector plot in a cross section slice ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :ref:`sec:vectorplots` are either in a :ref:`sec:xsec` or are column integrated projections depending on the setting of the ``switch between cross section/projection`` option in the :ref:`sec:menu-x`. Setting this to cross section and plotting :ref:`sec:vectorplots` produces a vector plot in a cross section slice. Making all arrow the same length (i.e., showing direction only, not magnitude) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An option to plot all vector arrows of the same length (instead of the default option where the length of the arrow is proportional to the vector magnitude) can be set from the :ref:`sec:menu-v`. .. _sec:menu-x: (x) cross section/3D plotting options ------------------------------------- .. image:: figs/menu-x.png :width: 50.0% Plotting a cross section slice through 3D data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When plotting :ref:`sec:renderplot` of 3D data, the default option is to plot a column-integrated plot. To change this to a :ref:`sec:xsec`, use option 1) in the :ref:`sec:menu-x` (``switch between cross section/projection``). See :ref:`sec:basic` for examples of how this works. An oblique :ref:`sec:xsec` can be set interactively using the ``x`` key, see :ref:`sec:obliquexsec` which works by setting a combination of rotation and a :ref:`sec:xsec` position. Plotting a cross section line through 2D data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In 2D, setting the ``switch between cross section/projection`` option in the :ref:`sec:menu-x` to :ref:`sec:xsec` means that :ref:`sec:renderplot` are in fact a 1D :ref:`sec:xsec` (i.e., a line) through 2D data. The position of the line is completely arbitrary (i.e., can be set for oblique cross sections as well as straight lines) and is set interactively after the usual :math:`y-` and :math:`x-` axis prompts. Rotating the particles ~~~~~~~~~~~~~~~~~~~~~~~ An angle of rotation about may be set each axis may be set in the :ref:`sec:menu-x` using the ``rotation on/off/settings`` option or interactively (press ``h`` in :ref:`sec:interactive` to see the exact keystrokes). The position of the origin about which particles are rotated can be set from the ``rotation on/off/settings`` option in the :ref:`sec:menu-x`. Rotated axes or boxes can be plotted using the ``set axes for rotated/3D plots`` option in the same menu. Rotations are performed in the order :math:`z-y-x`. This means that the :math:`y-` rotation angle is an angle about the *new* :math:`y-`\ axis, defined by the :math:`z` rotation and similarly for the :math:`x-` rotation. If you think about it long enough, it makes sense. If in doubt, do it interactively and set the angles in the order :math:`z-y-x`. Setting the origin about which particles are rotated ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The origin about which particles are rotated and relative to which the radius is calculated when the ``calculate extra quantities`` option is set in the :ref:`sec:menu-d` can be changed via the ``rotation on/off/settings`` option in the :ref:`sec:menu-x`. .. _sec:3Dperspective: Adding 3D perspective ~~~~~~~~~~~~~~~~~~~~~~ 3D perspective can be turned on via the ``3D perspective on/off`` option in the :ref:`sec:menu-x`. Prompts for setting the perspective position then appear after the usual prompts for y and x axes, :ref:`sec:renderplot` and :ref:`sec:vectorplots`, i.e., something like the following: :: Please enter your selection now (y axis or option):2 (x axis) (default=1): (render) (0=none) ([0:20], default=0): (vector plot) (0=none, 7=B, 10=v, 17=J) ([0:17], default=0): enter z coordinate of observer (default=1.800): enter distance between observer and projection screen ([0.000:], default=0.1800): Graphics device/type (? to see list, default /xwin): 3D perspective is defined by two parameters: a distance to the observer :math:`zobs` and a distance between the observer and a screen placed in front of the observer, :math:`dscreen`. The transformation from usual :math:`x` and :math:`y` to screen :math:`x'` and :math:`y'` is then given by .. math:: \begin{aligned} x' & = & x*dscreen/(zobs-z), \nonumber \\ y' & = & y*dscreen/(zobs-z).\end{aligned} This means that objects at the screen distance will have unit magnification, objects closer than the screen will appear larger (points diverge) and objects further away will appear smaller (points converge). The situation could be beautifully illustrated if I could be bothered drawing a figure. I have found reasonable results with something like a :math:`1/10` reduction at the typical distance of the object (i.e., observer is placed at a distance of :math:`10\times` object size with distance to screen of :math:`1\times` object size). splash sets this as default using the z plot limit as the ‘object size’. .. hint:: The position of the 3D observer in :math:`z` can also be changed in :ref:`sec:interactive` using ``u`` or ``U`` (to move ’up’) and ``d`` or ``D`` (to move ``down``). .. _sec:surface: Using 3D surface rendering ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3D surface rendering (turned on using the ``3D surface rendering on/off`` option in the :ref:`sec:menu-x`) performs a ray-trace through the particle data, thus visualising the "last scattering surface". When set, the user is prompted for an "optical depth" before plotting which determines the position of the surface. Only applies to 3D data. When set with cross-section (instead of projection), particles at or below the z value of the slice are used. For examples of the 3D surface rendering in splash , have a look at my movies of neutron star mergers: http://users.monash.edu.au/~dprice/research/nsmag. Plotting 3D box / 3D axes ~~~~~~~~~~~~~~~~~~~~~~~~~~ Rotated axes or boxes can be plotted using the ``set axes for rotated/3D plots`` option in the :ref:`sec:menu-x`. .. _sec:animseq: Setting up animation sequences ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Animation sequences can be set via the ``set animation sequence`` option in the :ref:`sec:menu-x`. At present the possible sequences that can be added are: :: 1 : steady zoom on x and y axes 2 : steady rotation 3 : steady change of limits (e.g. for colour bar) 4 : steady movement of 3D observer 5 : sequence of cross section slices through a 3D box 6 : steady change of opacity for 3D surface plots Up to one sequence of each type can be added (i.e., up to 6 in total) with different start and end points (specified in terms of dump file number), with the additional possibility of inserting extra frames between dump files (e.g. to plot a sequence of frames consisting of a changing view of the same dump file). Animation sequences can also be set using ``e`` in :ref:`sec:interactive`. To set a sequence interactively first adjust the plot settings to correspond to the start of the sequence (pressing ``s`` to save if this is done in :ref:`sec:interactive`). Then in :ref:`sec:interactive` move to the dump file you want to be the end-point and also adjust the plot settings to correspond to the end-point of your desired sequence (i.e., adjust the colour bar limits and/or adjust the rotation angle and/or the x/y limits and/or the 3D observer position and/or the opacity). Then, rather than pressing ``s`` (which would make these become the default plot settings) press ``e`` instead, saving these settings as the end-point of the desired animation sequence. This can be done multiple times to set multiple sequences. Animation sequences set up in this manner are saved to a file called ``splash.anim`` either when prompted (if setting sequences non-interactively) or by pressing ’S’ from the main menu which then saves both the ``splash.limits`` and ``splash.anim`` files in addition to the usual ``splash.defaults`` file. **Note:** Animation sequences act on a ‘per page’ basis rather than simply ‘per frame’. This means that you can produce a multi-panelled movie (e.g.) showing the evolution of different runs side by side, with the same animation sequence applied to each. Plotting a sequence of frames rotating a data set through 360 degrees ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This can be achieved by setting an animation sequence with a steady change of rotation angle. See :ref:`sec:animseq`. Plotting a ‘fly-around’ of 3D data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This can be achieved by setting an animation sequence with a steady change of rotation angle. See :ref:`sec:animseq`. Plotting a flythru of 3D data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A sequence of :ref:`sec:xsec` slices progressively deeper into a 3D box or alternatively a steady movement of the 3D observer (on projection plots) can be plotted by setting up an animation sequence. See :ref:`sec:animseq`. Adding a steady zoom sequence to a movie ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A steady change of :math:`x-` and :math:`y-` limits can be added by setting up an animation sequence. See :ref:`sec:animseq`. Adding a steady change of colour bar limits ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A steady change of limits on the colour bar over one or more dump files for a movie can be implemented by setting up an animation sequence. See :ref:`sec:animseq` for details. .. _sec:move3Dobserver: Adding steady movement of the 3D observer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The position of the 3D observer can be steadily changed over several dump files (or several frames produced of the same dump file) by setting up an animation sequence. See :ref:`sec:animseq` for details. Miscellaneous other useful things --------------------------------- .. _sec:menu-h: My attempt at in-built help ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. image:: figs/menu-h.png :width: 50.0% The :ref:`sec:menu-h` does nothing particularly useful apart from tell you about menu shortcuts (see :ref:`sec:menushortcuts`). It seemed like a good idea at the time… .. _sec:menushortcuts: Keyboard shortcuts to menu options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. image:: figs/menu-x1.png :width: 50.0% Menu options which normally require two keystrokes (e.g. x menu, option 1) can be shortcut to by simply typing the letter and number together at the main menu prompt (so e.g. ``x1`` for x menu, option 1, ``r2`` for render menu, option 2, etc.). Exiting splash ~~~~~~~~~~~~~~~~ .. image:: figs/menu-q.png :width: 50.0% (q)uit, unsurprisingly, quits. Typing a number greater than the number of data columns also exits the program (e.g. I often simply type 99 to exit). danieljprice-splash-4d1f09c/docs/source.rst000066400000000000000000000234771477365367100210710ustar00rootroot00000000000000 Source code overview ==================== Here is a brief and outdated description of various files making up the code: +-----------------------------------+-----------------------------------+ | Filename | Description | +===================================+===================================+ | | | +-----------------------------------+-----------------------------------+ | allocate.f90 | allocates memory for main arrays | +-----------------------------------+-----------------------------------+ | calc_quantities.f90 | calculates additional quantities | | | from particle data | +-----------------------------------+-----------------------------------+ | colours.f90 | colour schemes for rendering | +-----------------------------------+-----------------------------------+ | colourparts.f90 | colours particles | +-----------------------------------+-----------------------------------+ | defaults.f90 | writes/reads default options | | | to/from file | +-----------------------------------+-----------------------------------+ | exact.f90 | module handling exact solution | | | settings | +-----------------------------------+-----------------------------------+ | exact_densityprofiles.f90 | various :math:`N-`\ body density | | | profiles | +-----------------------------------+-----------------------------------+ | exact_fromfile.f90 | reads an exact solution tabulated | | | in a file | +-----------------------------------+-----------------------------------+ | exact_mhdshock.f90 | some tabulated solutions for mhd | | | shocks | +-----------------------------------+-----------------------------------+ | exact_polytrope.f90 | exact solution for a polytrope | +-----------------------------------+-----------------------------------+ | exact_rhoh.f90 | exact relation between density | | | and smoothing length | +-----------------------------------+-----------------------------------+ | exact_sedov.f90 | exact solution for sedov blast | | | wave | +-----------------------------------+-----------------------------------+ | exact_shock.f90 | exact solution for hydrodynamic | | | shocks | +-----------------------------------+-----------------------------------+ | exact_wave.f90 | exact solution for a propagating | | | sine wave | +-----------------------------------+-----------------------------------+ | exact_toystar.f90 | exact solution for the toy star | | | problem | +-----------------------------------+-----------------------------------+ | exact_toystar2D.f90 | exact solution for the 2D toy | | | star problem | +-----------------------------------+-----------------------------------+ | get_data.f90 | wrapper for main data read | +-----------------------------------+-----------------------------------+ | geometry.f90 | module handling different | | | coordinate systems | +-----------------------------------+-----------------------------------+ | globaldata.f90 | various modules containing | | | "global" variables | +-----------------------------------+-----------------------------------+ | interactive.f90 | drives interactive mode | +-----------------------------------+-----------------------------------+ | interpolate1D.f90 | interpolation of 1D SPH data to | | | grid using kernel | +-----------------------------------+-----------------------------------+ | interpolate2D.f90 | interpolation of 2D SPH data to | | | grid | +-----------------------------------+-----------------------------------+ | interpolate3D_xsec.f90 | 3D cross section interpolations | +-----------------------------------+-----------------------------------+ | interpolate3D_projection.f90 | 3D interpolation integrated | | | through domain | +-----------------------------------+-----------------------------------+ | legends.f90 | plots (time) legend on plot | +-----------------------------------+-----------------------------------+ | limits.f90 | sets initial plot limits and | | | writes to/reads from limits file | +-----------------------------------+-----------------------------------+ | menu.f90 | main menu | +-----------------------------------+-----------------------------------+ | options_data.f90 | sets options relating to current | | | data | +-----------------------------------+-----------------------------------+ | options_limits.f90 | sets options relating to plot | | | limits | +-----------------------------------+-----------------------------------+ | options_page.f90 | sets options relating to page | | | setup | +-----------------------------------+-----------------------------------+ | options_particleplots.f90 | sets options relating to particle | | | plots | +-----------------------------------+-----------------------------------+ | options_powerspec.f90 | sets options for power spectrum | | | plotting | +-----------------------------------+-----------------------------------+ | options_render.f90 | sets options for render plots | +-----------------------------------+-----------------------------------+ | options_vector.f90 | sets options for vector plots | +-----------------------------------+-----------------------------------+ | options_xsecrotate.f90 | sets options for cross sections | | | and rotation | +-----------------------------------+-----------------------------------+ | particleplot.f90 | subroutines for particle plotting | +-----------------------------------+-----------------------------------+ | plotstep.f90 | main “backbone†of the code which | | | drives plotting of a single | | | timestep | +-----------------------------------+-----------------------------------+ | read_data_dansph.f90 | reads data from my format of data | | | files | +-----------------------------------+-----------------------------------+ | read_data_mbate.f90 | reads data from Matthew Bate’s | | | format of data files | +-----------------------------------+-----------------------------------+ | read_data_xxx.f90 | reads data from … | +-----------------------------------+-----------------------------------+ | render.f90 | takes array of pixels and plots | | | render map/contours etc | +-----------------------------------+-----------------------------------+ | rotate.f90 | subroutines controlling rotation | | | of particles | +-----------------------------------+-----------------------------------+ | setpage.f90 | sets up the PGPLOT page (replaces | | | call to PGENV/PGLAB) | +-----------------------------------+-----------------------------------+ | splash.f90 | main program, handles startup/ | | | command line reading | +-----------------------------------+-----------------------------------+ | timestepping.f90 | controls stepping through | | | timesteps | +-----------------------------------+-----------------------------------+ | titles.f90 | reads a list of titles to be used | | | to label each timestep | +-----------------------------------+-----------------------------------+ | transform.f90 | applies various transformations | | | to data (log10, 1/x, etc) | +-----------------------------------+-----------------------------------+ danieljprice-splash-4d1f09c/docs/version_history.rst000066400000000000000000000636761477365367100230440ustar00rootroot00000000000000 **3.11.1: (06/12/24)** - bug fix with type recognition in sphNG data read, better wrong endian error message (thanks to Matthew Bate) - recognise sphNG format correctly even if the dump is big endian - use kappa in opacity rendering if present in the dump file (thanks to Mike Lau) **3.11.0: (25/11/24)** - opacity rendering done in parallel - compute bad pixel fraction in splash calc lightcurve - option to write fits cube in splash calc lightcurve (thanks to Fitz Hu) - --kappatot option computes opacities using formula from Matsumoto & Metzger (2022) - read grad(E) as a vector in phantom snapshots (thanks to Mike Lau) - add SYSTEM=ifx for new intel compiler (thanks to Lionel Siess) - splash calc tdiffuse option for photon diffusion time along each axis - improved label recognition and read all header quantities in GIZMO HDF5 data read - plot cross-sections by default if plotting fits data cube - bug fix reading phantom snapshots with APR - better docs on making movies (thanks to Alison Young) - bug fix in vtk data read - bug fix in follow-the-label column recognition in non-cartesian coordinates (thanks to Lionel Siess) **3.10.3: (04/03/24)** - bug fix reading type information from phantom dumps introduced in 3.10.2 **3.10.2: (01/03/24)** - reads phantom dumps with adaptive particle refinement - improved splash to phantom conversion - better documentation of splash calc lightcurve (thanks to Chunliang Mu) - saving dust density limits now applies to all dust species **3.10.1: (4/12/23)** - bug fix with accreted particles appearing in smoothed particle plots - automated Trad/Tgas in extra quantities from phantom dumps with radiation **3.10.0: (30/11/23)** - --sort flag to sort filenames for comparison plots - --movie flag to automatically make movie from sequence of files - giza backend now supports direct output of mp4 movies **3.9.0: (06/11/23)** - follow-the-label column choice, where if a label is selected for plotting from the first file, it will automagically shift to find the matching label in subsequent files, even if the column containing the quantity has changed - implemented vtk reader capable of reading snapshots from Shamrock code - apply transparency to smoothed particle plot only if adaptive smoothing used - plot colour bar by default when particle colouring by quantity is used - can read velocity array from fits header for position-position-velocity cubes - bug fix with first page being white with smoothed particle plots on black background - bug fix finding .comp file if underscore in the directory name **3.8.5: (23/10/23)** - implemented smoothed particle plots with multiple steps per page - allow for .cols and .comp file in current directory even if the filepath is not the current dir - sphmoments utility added - added routine to extract velocity dimension from fits files - bug fix with repeated string replacements giving endless backslashes in labels - bug fix reading long filenames in denoise **3.8.4: (18/08/23)** - various bugs fixed in GADGET data reader - auto-recognise GADGET block format - improved conservation checks in splash to grid (thanks to Avi Chen) - better handling of AREPO data - bug fix with timestep not advancing - no longer ask about particle types in multiplot if only one type present **3.8.3: (05/07/23)** - flip option (f/F in interactive mode) now persists across timesteps and works in snapshots other than the first - bugs fixed in Tipsy data read (thanks to Alex Pettitt) - auto-recognition of Tipsy binary formats implemented - show units labels in calculated quantities list **3.8.2: (12/05/23)** - phantom data read looks for .comp file containing additional composition data - also looks for .cols file containing any extra columns with one row per particle - recognise opacity if extra quantity called "kappa" calculated **3.8.1: (01/05/23)** - seg faults in auto-magic exact solution mapping fixed - longer line limit in determining number of columns in ascii/exact solution files - automatically handle log in exact solution labels (e.g. logR, logT) **3.8.0: (26/04/23)** - plots multiple renderings with transparent background if more than one timestep per page selected - auto-magically map exact solution columns onto splash columns - added --exact=file1,file2 to switch on plotting of exact solution from file(s) - added --track=maxdens and --origin=maxdens to track/recentre on maximum density - pressing backspace over legends deletes them - use density weighted and normalised rendering by default in projection plots of vector fields **3.7.2: (21/02/23)** - bug fix recognising labels like v_{phi} on command line, can now use -r vphi **3.7.1: (09/02/23)** - libexact build failure fixed **3.7.0: (09/02/23)** - splash calc extinction computes column density to all sink particles in the simulation - bug fix with rendering vector components (e.g. vr) in non-cartesian coordinate systems - bug fix with both quantities appearing in black and white when double rendering **3.6.0: (31/10/22)** - skip particles with zero weight in interpolation, large speedup in some cases (thanks to T. Bending) - splash calc plus and splash calc minus for adding/subtracting snapshots - added --origin=6245 flag to centre the origin on particle 6245 - added --hdu=1 flag to read from a particular hdu in a fits file - use wcs coordinates / arcseconds for fits images if present in header - option --dense to reset to densest clump in phantom/sphNG data read (thanks to J. Wurster) **3.5.1: (20/06/22)** - bug fix with autolog limits - build failures in libexact and libread fixed and now tested - recognise labels on command line e.g. -r density - limits option for centred cube (thanks to J. Wurster) **3.5.0: (17/06/22)** - bug fix with blank lines in splash.titles - bug fix with large line lengths in csv files - allow blank labels in csv headers - bug fix with display of column labels from ascii/csv files - log colour bar by default when using -r flag if more than 3 orders of magnitude range **3.4.0: (24/03/22)** - density weighted interpolation now applied automatically to projection plots of quantities that are not densities - added flags --codeunits or --code to enforce code units from command line - successfully parse csv files where some of the fields are character strings **3.3.5: (01/03/22)** - bug fix with disappearing sinks in phantom MPI dumps **3.3.4: (21/01/22)** - improved visual appearance of normalised renderings with free boundaries - automatically read planet-wake parameters from phantom file headers - added --wake=1,3 flag to plot wake from sink particle 3 around star 1 - bug fix with disappearing sinks in phantom MPI dumps - fixed seg fault in fits reader **3.3.3: (19/11/21)** - "splash to csv" exports to comma separated variable (.csv) format - automatically apply -ev flag for filenames ending in .ev, .mdot or .out - improved label recognition from ascii file headers - additional divergent colour schemes (thanks to Sahl Rowther) - deal with merged sink particles from phantom (thanks to James Wurster) - bug fix with units resetting to 1 - skip blank and comment lines in splash.filenames **3.3.2: (20/07/21)** - bug fix with -dev flag - silenced unnecessary dust warnings in sphNG read - change-of-limits animation sequence works for vector plots - automatic recognition of ndspmhd format **3.3.1: (19/07/21)** - f/F in interactive mode flips y axis on 2D plots to next column - gradual transparency in double rendering rather than sharp cutoff - removed S from main menu as now redundant - allow longer paths with -dev flag - added --xmin,--xmax,--ymin,--ymax flags for manual margin adjustment - bug fix with relativistic corrections in splash calc lightcurve **3.3.0: (20/05/21)** - bug fix with surface density plot with physical units on - splash calc lightcurve computes spectra from local blackbody emission if T and kappa given - lightcurve now performs frequency-dependent ray tracing - added "--anglex","--angley","--anglez" flags - can add labelled arrows by typing ^ in interactive mode, also delete/edit - capital M, 0 or ncols+1 from main menu gives multiplot - added -multi flag for multiplot from command line **3.2.1: (26/04/21)** - added --xsec=1.0 and --kappa=1.0 flags to specify cross section position and opacity, respectively - specifying --xsec automatically switches from projection to cross section - specifying --kappa turns on opacity rendering - bug fix in splash calc tracks - can use --track=1,2,3 to specify list of particles **3.2.0: (20/04/21)** - disable ALL prompts if any command line flags set - all environment variables can now be given as command line flags using lower case string after last underscore e.g. SPLASH_CENTRE_ON_SINK=1 becomes --sink=1 on command line - useful options include --corotate, --sink=1, --debug and more - splash to grid recognises flags including --periodic, --npix=100,100,100 and --convert=1,4 - added -gandalf and -f gandalf as shortcut for seren data read - assume default xw device and disable device prompt if any command line flags set - s/S options now do the same thing **3.1.1: (31/03/21)** - automatically plot y vs x given a two-column data file - planet wake coordinate system added - bug fix with SPLASH_COROTATE - bug fix reading phantom dumps when number of particles of each type does not match itype array - bug fixes in grid2pdf **3.1.0: (16/02/21)** - splash calc lightcurve implemented - sink particles ON by default - changing units rescales plot limits correctly - further improvements to ray tracing / opacity rendering with physical opacity - can change units temporarily without writing .units file - auto-select closest velocity and mass unit and better default time unit in phantom/sphNG read - error message if Inf or NaN read from .units file - bug fix with units prompt - floating colour bars are white not black - automatically write copyright in Hollywood mode - auto-render fits files - read softening length from phantom sinks if accretion radius is zero **3.0.2: (20/01/21)** - opacity rendering uses physical value of kappa, can also use opacity defined on particles - can track multiple particles with 'splash calc tracks' by specifying ids in splash.tracks file - support for SWIFT code in gadget_hdf5 - auto-recognise format for .csv files - improved starsmasher data read - improved physical unit selection - exact solution lines can be plotted in background colour - bug fix for dead particles in phantom dumps - seg fault in fits reader fixed - seg fault in gadget data read fixed - bug fix in x-menu options **3.0.0: (26/08/20)** - Unified splash binary with -f flag to specify format - automated format recognition for phantom, gadget (and hdf5 variants) and fits - cleaner d) menu - splash is compiled in double precision by default - rotation settings used in splash to grid to rotate particles - bug fix in mbatesph data read - pysplash utility for reading SPH data formats into python - libsplash.so, libexact.so and libread.so libraries **2.10.1: (24/06/20)** - exact solution can appear in legend - can also plot under data - fits reader and denoise utility can read/write spectral cubes - text shapes can print header variables using %(var) - can shift cross section by precise amounts in interactive mode using number followed by u/d - fits reader includes header quantities - reduced verbosity for non-interactive plots - use of fake dust particles is now via menu option, not environment variable - max particle types = 24 - userguide in readthedocs format - bug fix with save limits with particle tracking - support for .pfm pixelmap format as output - physical units are ON by default - prompts only for particle types present in data **2.10.0: (14/02/20)** - much improved splash to grid - bug fixes with pixel number and roundoff error - use Petkova (2018) method for sub-pixel rendering to 3D grid and 3D projections - added bytestream output formats for splash to grid and splash to ascii - can press number and -/+ to zoom out/in by that factor in interactive mode - use SPLASH_COROTATE=1,3 to corotate with arbitrary pair of sink particles - SPLASH_COROTATE also gives velocity field in corotating frame - splash to ascii can write particular columns by setting SPLASH_CONVERT=1,4 - plasma beta correct in both code and physical units - working fits reader and splash-denoise utility **2.9.1: (08/11/19)** - cleaner menu options for units and calculated quantities - surface rendering allowed with 3D perspective turned off - automatic labelling of grain sizes in density and column density plots - adaptive limits on log colour bars show 3 dex range by default - auto-adjust limits to device aspect ratio works with multiple panels - bug fixes with r-z rendering - Toomre Q prompts for mass **2.9.0: (05/04/19)** - general header quantities are read and available in function parser - more robust label detection and parsing during ascii data read - splash to grid works in non-cartesian geometries - added flared and log-flared coordinate systems - Doppler shift colour bar - can customise line style and colour when plotting multiple exact solutions - seg faults fixed - better plot tiling decisions - disappearing arrows bug fix - Rafikov disc- planet exact solution added - atan2 implemented in function parser - various multigrain phantom read fixes (incl. seg faults) - exact rendering implemented in 2D - libsplash implemented for use as Python splash backend **2.8.0: (06/04/18)** - 360/4pi video mode added - automatically read labels from ascii file headers - nearest sensible unit (e.g. au or pc) used by default - cactus hdf5 data read - kernel-smoothed particle plots of arbitrary quantities - Viridis, Ocean and Inferno colour schemes - can customise line colours - Bondi flow exact solution - option for ticks but no labels - correct units in surface density plots - colour bar on top or left - support for multi-grain dust in Phantom - bug fix with NaNs in ascii files **2.7.0: (03/05/17)** - Hollywood mode added (ctrl-m in interactive mode) - better handling of dust/gas phantom data - added rotated cartesian geometry - rendering implemented in r-phi coordinates - added Fortran 2008 intrinsics to function parser - better rectangle plotting - better falcON data read - Ogilvie-Lubow exact solution for planet-disc interaction - tipsy read now works when splash compiled in double precision - splash to gridascii2 implemented - bugs with r-phi rendering fixed **2.6.0: (22/10/15)** - SILO, falcON and .pbob data reads implemented - bug fixes in gadget-hdf5 reader - can recognise particle types in ascii read - more robust sphNG read - dust fraction recognised in phantom data read - Toomre Q works in physical units - bug fix with disappearing units labels - bug fix in shock tube exact solution - added splash calc delta - splash to ascii keeps precision - better power spectra **2.5.1: (29/01/15)** - error bar style options - support for 5K displays - can plot vectors and render with colours if h not read - range restrictions apply during splash to grid - improved line-style legend - now up to 6 line styles - fixes to amuse-hdf5 read - phantom read handles star/dm particles - various bugs fixed **2.5.0: (22/08/14)** - instant multiplots by giving multiple columns as y axis - ability to plot multiple exact solution files on same plot - compiles in parallel by default - support for tagged sphNG/Phantom format - AMUSE hdf5 format reader added - various bug fixes **2.4.1: (01/04/14)** - Roche-lobe plotting vastly improved - newunit= issue fixed - bug fix with reading sink velocities from Phantom - other minor bug fixes. **2.4.0: (21/02/14)** - time formatting in legend can include general functions like %(t + 1000) - option to include sinks in opacity rendering - supports one-fluid dust visualisation - C-shock exact solution - better polytrope solution **2.3.1: (11/11/13)** - SPLASH_COROTATE option to plot in frame corotating with sinks - bug fixes with handling of dead/accreted/boundary particles in sphNG/phantom - various other bugs fixed. **2.3.0: (09/08/13)** - can customise time formatting in legend - improvements to legends - less verboseness - splash can read and plot pixel maps produced with -o ascii - 3D vector field plotting improved - bug fix with gfortran 4.8 **2.2.2: (10/05/13)** - particle tracking by type implemented - can interpolate specific columns in splash to grid - SPLASH_CENTRE_ON_SINK option generic to all data reads - Aly Reheam format added - option for 2nd y axis on plots - bug fix with X11 linking on Ubuntu - can read gadget ICs files **2.2.1: (21/02/13)** - minor bug with axes plotting fixed - Wendland kernels added - bugs with exact solution plotting fixed - bug fix with tracking of dark matter particles **2.2.0: (16/11/12)** - option to use different kernels for interpolation - floating/inset colour bars added - splash to gadget conversion implemented - splash to grid works in 2D - improved interfaces to shapes and animation sequences - automatically turns on dark matter particle plotting if no gas - interactive mode help displayed automatically **2.1.1: (31/08/12)** - irregular/circular particle selection using shift-left/middle click - improved h5part and GADGET HDF5 data reads - splash can be compiled in double precision - bug fixes with calculated quantities + change of coordinate systems - improved vector plot legend - option for box+numbers but no labels added **2.1.0: (16/05/12)** - 3D vector field visualisation added - GADGET HDF5 read implemented - page sizes can be specified in pixels - limits can auto-adapt to device aspect ratio - more general exact solution from file option - tiling works with one colour bar per row - splash calc handles different particle types **2.0.0: (29/08/11)** - new giza backend - antialiased lines - real fonts - pdf, eps and svg drivers - fewer build dependencies (only cairo, X11) - support for semi-transparent text - Double rendering (with transparent background) implemented. **1.15.0: (29/08/11)** - Multiplot with different particle types implemented - calculated quantities list is now pre-filled automatically - preliminary support for r-phi and r-z rendering - outlined solid markers implemented - better handling of multiple types - manual contour levels can be specified in splash.contours - parallel splash to grid - better support for non-square pixels - clipping of numbers at edge of viewport fixed **1.14.1: (17/03/11)** - SEREN data read added - dragon read updated - build follows Gnu conventions on DEST and DESTDIR (needed for macports build) - can have up to 12 particle types - exact solutions re-ordered - dusty wave exact solution added **1.14.0: (06/12/10)** - Can flip between rendered quantities in interactive mode using 'f/F' - SPLASH_DEFAULTS variable can be set for system-wide defaults - can plot arbitrary functions of x,t as exact solution - asplash better handles blank lines in header and can specify time, gamma location with env. variables - added data read for the H5PART format - GADGET read across multiple files implemented - VINE read works with particle injection - error bars can be plotted for both x and y axis simultaneously - default rotation angles are set if 3D perspective turned on - new directory layout and more helpful error messages during build - PGPLOT linking is easier to get right. **1.13.1: (26/02/10)** - bugs with new calc_quantities module fixed - generic library interface implemented so backend can be changed easily - bug fix with auto pixel selection - simpler foreground/background colour setting - added subgrid interpolation warning **1.13.0: (25/02/10)** - function parser incorporated - calculated quantities can now be specified at runtime, arbitrary function plotting implemented as an exact solution - command-line SPH->grid conversion ("splash to grid") implemented - ctrl-t in interactive mode adds arbitrary text box - better line style/colour changing - bug fix with tiling and y-axis labels - various other bug fixes. **1.12.2: (15/07/09)** - Variable marker sizes added, can plot particles as circles with size proportional to h - dark matter rendering with block-labelled GADGET format fixed - VINE read handles star particles - TIPSY read with ifort10.0.0 works - snsph read added - splash to phantom added - does not override labels for coords, vectors by default - bug fixes with contouring options - stability bug fixes with older compilers - more robust memory handling - bug fix with automatic pixel selection causing seg fault. **1.12.1: (20/04/09)** - Can edit/delete text shapes interactively, also the colour bar label - can customise the label on projection plots - contour levels better defined - SPLASH_HMIN_CODEUNITS added - option for numeric labelling of contours - contour limits can be set separately to render limits for same quantity - minor bug fixes. **1.12.0: (22/12/08)** - Command-line plotting implemented - ln transform added - bug fixes in GADGET read - Backspace over annotation (legends,titles,axes,colour bar) in interactive mode removes it - "splash calc" command line utility calculates time sequences of global quantities from a sequence of dump files - bug fix causing seg fault. **1.11.1: (13/10/08)** - automatic number of pixels and exact pixel boundaries implemented - mass does not have to be read from dump file - frame changes are per-page not per-dump file for animation sequences - lower stacksize footprint - bug fix with circles of interaction - bug fixes with block-labelled GADGET read - Steve Foulkes data read added. **1.11.0: (15/08/08)** - ability to use subset of particles in restricted parameter range(s) - probability density function plot option - plot-hugging colour bars added - ability to annotate plot with a range of shapes - v,V,w and H implemented in interactive mode for >1 panel - various bug fixes (including one with vphi). **1.10.2: (08/05/08)** - disc surface density / toomre q parameter plotting added - flash colour schemes added - splash to binary convert option - can change order in which particle types are plotted - splash.columns file overrides column label settings - vanaverbeke format read - various bug fixes. **1.10.1: (11/03/08)** - "splash to" command line option converts binary dumps to ascii format - vector plots + rotation now implemented - block labelled GADGET format read - ring-spreading exact solution added. **1.10.0: (28/11/07)** - horizontal colour bars implemented - -p, -o command line options - can have mixed types in data reads - TIPSY and DRAGON data reads - density weighted rendering - normalisation applies to column density plots - improved particle tracking - save as option - various bug fixes **1.9.2: (12/09/07)** - improvements to ascii read including asplash -e option - smarter foreground/background colour changing for titles - min=max problem fixed (caught by splash not pgplot) - fixed vector arrow length option - other minor changes and bug fixes **1.9.1: (11/07/07)** - environment variables + improvements to gadget data read - better prompting - 3 new colour schemes - improved legend/title options - other minor changes **1.9.0: (21/05/07)** - animation sequences implemented - origin settings now affect radius calculation and are relative to tracked particle - automatic line width choice for postscript devices - w key adapts vector arrows - vastly improved userguide **1.8.1: (28/03/07)** - option to hide vector arrows where there are no particles added - smoother 3D plotting at low pixel numbers - smoother vector plots - bug fixes with a) - issues with round-off error with z integration of vectors fixed. **1.8.0: (14/03/07)** - hidden particles not used in rendering - units for z integration added - a) & g) implemented in interactive mode for multiple-plots-per-page - improved cross section using x in interactive mode **1.7.2: (19/02/07)** - Menu shortcuts implemented - bug fix/ more sensible transformation of angular vector components in different co-ordinate systems - improvements to interactive zoom and origin recentreing - improved colour-by-type option - restrictions on page size removed - minor bug fixes **1.7.1: (04/01/07)** - command line options for defaults and limits files added - minor bug fixes **1.7.0: (13/12/06)** - renamed SPLASH instead of SUPERSPHPLOT - much faster data read for gadget and sphNG reads (only required columns read) - physical units can be saved to file - new menu formats - various other bug fixes **1.6.2: (24/10/06)** - fast particle plotting and streamline plotting implemented - more bug fixes with interactive mode on multiplots - various other bug fixes **1.6.1: (24/8/06)** - bug fixes to 1.6.0, further improvements to interactive mode on multiplots **1.6.0: (10/8/06)** - Interactive mode on multiple plots per page - highly optimised interpolation + parallel version - new Makefile - various bug fixes **1.5.4: (06/7/06)** - Handles multiple SPH/non-SPH particle types - axes redrawn after rendering - minor bug fixes **1.5.3: (27/6/06)** - minor bug fixes/improvements to multiple plots per page - colour bar labelling tiled plots - legend - Accelerated rendering option for projections. **1.5.2: (11/5/06)** - "S)" option for saving limits and defaults - MUCH faster interactive replotting (no unnecessary re-rendering) - a few other minor things **1.5.1: (26/4/06)** - docs updated for v1.5, other minor changes **1.5.0: (17/3/06)** - 3D perspective added - 3D opacity rendering - improved rotation, colour schemes - adjustable vector arrows (+legend) - improved timestepping behaviour - speed enhancements - physical unit rescaling **1.0.5: (28/9/05)** - error calculation for exact solutions - legend for plot markers - exact_densityprofiles added - more colour schemes - unit rescaling improved - other minor changes + bug fixes **1.0.4: (17/8/05)** - better colour schemes - interactive colour scheme changing - various minor changes and bug fixes **1.0.3: (5/7/05)** - rescale data option - better page setup - improved zooming - interactive particle tracking - various minor changes and bug fixes **1.0.2 :** - much improved ascii data read - better line plotting - zoom on powerspectrum plots + various bug fixes **1.0.1 :** - bug fixes relating to colour bars on multiplots **1.0.0 :** - first official release - version given to many people at IPAM meeting and put on web danieljprice-splash-4d1f09c/install-cairo.sh000077500000000000000000000014401477365367100211710ustar00rootroot00000000000000#!/bin/bash # # Script for splash 2.x that retrieves and installs # both cairo and pixman # # (these are the only dependencies for the giza backend, # are often already present as system libraries but # may need to be installed by the user if not) # # An alternative is to use your inbuilt package manager to install cairo # e.g. # Debian/Ubuntu: # sudo apt-get install libcairo2-dev # Fedora/Red Hat/CentOS: # sudo yum install cairo-devel # OpenSUSE: # zypper install cairo-devel # MacPorts: # sudo port install cairo # installprefix=$PWD/giza; ./install-pkg.sh "http://cairographics.org/releases/pixman-0.40.0.tar.gz" $installprefix ./install-pkg.sh "http://cairographics.org/releases/cairo-1.16.0.tar.xz" $installprefix echo "type \"make\" to compile SPLASH"; echo; danieljprice-splash-4d1f09c/install-cfitsio.sh000077500000000000000000000004131477365367100215330ustar00rootroot00000000000000#!/bin/bash # # Script for splash 2.x that retrieves and installs # cfitsio # # An alternative is to use your inbuilt package manager # installprefix=$PWD/giza; ./install-pkg.sh "https://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/cfitsio-3.47.tar.gz" $installprefix danieljprice-splash-4d1f09c/install-pkg.sh000077500000000000000000000110171477365367100206560ustar00rootroot00000000000000#!/bin/bash # # A basic script to retrieve and install packages to a local directory # (e.g. in a users home space) # # We assume packages can be compiled in the "standard" way using # "configure" and "make" # # A better alternative is to use your inbuilt package manager to install things # e.g. # Debian/Ubuntu: # sudo apt-get install package_name # Fedora/Red Hat/CentOS: # sudo yum install package_name # OpenSUSE: # zypper install package_name # MacPorts: # sudo port install package_name # Homebrew: # brew install package_name # # Written by Daniel Price, April 2020 # Contact: daniel.price@monash.edu # xzdist=xz-5.2.1.tar.gz; xzurl="http://tukaani.org/xz/"; if [ $# -le 1 ]; then echo "Usage: $0 http://blah.org/release/blah.tar.gz install_dir"; exit 1; fi disturl=$1; installprefix=$2; distfile=$(basename $disturl); pkg_name=$(basename $distfile .tar.gz) pkg_name=$(basename $pkg_name .tar.xz) extension=${distfile/$pkg_name/} pkg_dir=${distfile/$extension/}; # #--Check that the install dir is present. # This is not strictly necessary, but it means we install cairo and # pixman to the same location as the giza libraries and linking of # giza with cairo will work automatically. # check_install_dir_exists() { if [ ! -d $installprefix ]; then echo; echo " ERROR: installation directory $installprefix does not exist " echo; return 1; fi } # #--if not already downloaded, retrieve the tarball using wget # download_dist_file() { if [ ! -f $distfile ]; then echo "$distfile not downloaded"; if !(type -p wget); then echo "ERROR: $0 requires the \"wget\" command, which is not present on"; echo "your system. Instead, you will need to download the following file by hand:"; echo echo "$disturl"; echo; echo "To proceed, download this files, place them in the current directory and try again" return 1; else wget $disturl; fi fi if [ ! -f $distfile ]; then echo; echo "ERROR: $distfile download failed. Please try again"; echo; return 1; else echo "$distfile found in current dir"; return 0; fi } # #--unpack the distribution file with tar or unxz, depending on compression # unpack_dist_file() { echo ":: unpacking $distfile to $installprefix"; if [ $extension==".tar.xz" ]; then tar -Jxf $distfile; else tar xfz $distfile; fi if [ ! -d $pkg_dir ]; then echo; echo "ERROR: failed to unpack (no directory $pkg_dir)"; echo; return 1; if [ $extension==".tar.xz" ]; then # #--install xzutils if tar -Jxf fails... # echo "Attempting to download xzutils in order to unpack cairo..." wget $xzurl/$xzdist; tar xfz $xzdist; xzdir=${xzdist/.tar.gz/}; cd $xzdir; xzinstalldir=/tmp/xz-tmp/; ./configure --prefix=$xzinstalldir; make || ( echo; echo "ERROR during xzutils build"; echo; return $? ); make install || ( echo; echo "ERROR installing xzutils into $xzinstalldir"; echo; return $? ); cd ..; # #--now unpack using xz utils # ${xzinstalldir}/bin/unxz $distfile; tar xf ${distfile/.xz/}; if [ ! -d $pkg_dir ]; then echo; echo "ERROR: failed to unpack even with xz downloaded (no directory $pkg_dir)"; echo; return 1; fi fi fi } # #--install the package to the local file system # install_package() { echo ":: installing $pkg_name" cd $pkg_dir; ./configure --prefix=$installprefix > /dev/null || ( echo; echo "ERROR during config"; echo; return $? ); make > /dev/null || ( echo; echo "ERROR during build"; echo; return $? ); make install > /dev/null || ( echo; echo "ERROR installing into $installdir"; echo; return $? ); cd ..; } check_and_finish() { echo ":: $pkg_name installation successful"; echo; echo "type \"make\" to compile your main program"; echo; echo "You should also add the following line to your .bashrc or equivalent:"; echo; if [[ `uname` =~ Darwin ]]; then echo "export DYLD_LIBRARY_PATH=\$DYLD_LIBRARY_PATH:$installprefix/lib"; else echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$installprefix/lib"; fi echo; } check_install_dir_exists; err=$?; if [ $err -gt 0 ]; then exit $err; fi download_dist_file; err=$?; if [ $err -gt 0 ]; then exit $err; fi unpack_dist_file; err=$?; if [ $err -gt 0 ]; then exit $err; fi install_package; err=$?; if [ $err -gt 0 ]; then exit $err; fi check_and_finish; err=$?; if [ $err -gt 0 ]; then exit $err; fi danieljprice-splash-4d1f09c/scripts/000077500000000000000000000000001477365367100175615ustar00rootroot00000000000000danieljprice-splash-4d1f09c/scripts/cpfiles.sh000077500000000000000000000016621477365367100215520ustar00rootroot00000000000000#!/bin/bash # # short script to copy all splash # files to a new prefix # # ie. splash.defaults, splash.limits, splash.units etc. # become new.defaults, new.limits, new.units # # SPLASH can be invoked to use the new settings files # using the -p command line option # if [ $# -lt 1 ] || [ $# -gt 2 ]; then echo 'SPLASH files copy utility -- ' echo 'copies splash.defaults, splash.limits etc. ' echo ' to new.defaults, new.limits etc. (use with splash -p new)' echo echo "Usage $0 newprefix [oldprefix]"; echo echo '(default old prefix is "splash")'; exit; else new=$1; if [ $# -eq 2 ]; then old=$2; else old='splash'; fi for ext in defaults limits units titles anim legend columns filenames func spirals; do if [ -e $old.$ext ]; then cp $old.$ext $new.$ext; echo "$old.$ext -> $new.$ext"; else echo "$old.$ext does not exist"; fi done fi danieljprice-splash-4d1f09c/scripts/get_release_notes.pl000077500000000000000000000032261477365367100236130ustar00rootroot00000000000000#!/usr/bin/perl # # @(#) Perl script to extract release notes from src/splash.f90 # my $start = 0; my $out = ""; my $do_all = 0; my $file='src/splash.f90'; # default filename if no arguments given # handle command line arguments if ($#ARGV==0) { # can give ./get_release_notes all [with default file name] # or ./get_release_notes src/splash.f90 [to specify file name] if ( @ARGV[0] =~ m/all/ ) { $do_all = 1; } else { $file = @ARGV[0]; }; } elsif ($#ARGV==1) { # or ./get_release_notes src/splash.f90 all [to specify file name AND all option] $file = @ARGV[0]; if ( @ARGV[1] =~ m/all/ ) { $do_all = 1; }; } elsif ($#ARGV > 1) { die "Usage: $0 src/file.f90 [all] \n"; } my @eqns = []; open(FILE,$file); while () { my $line = $_; if ( m/(\d+\.\d+\.\d+\s*:\s*\(\d+\/\d+\/\d+\))\s+(.*)$/ or m/(\d+\.\d+\.\d+\s*:)\s+$/) { my $version=$1; $version =~ s/\s+:\s+/: /g; if ($start == 1) { # print release notes as bullet points foreach (split /\;/, $out) { print "-$_\n"; } if ($do_all==1) { $out = ""; print "\n**$version**\n\n"; } else { close(FILE); exit() }; } else { if ($do_all==1) { print "\n**$version**\n\n"; } $start = 1; $out = ""; } } elsif ($start == 1) { # last entry, close on matching ---- line if (m/----/) { foreach (split /\;/, $out) { print "-$_\n"; } close(FILE); exit() } $line =~ m/\!\s+(.*)$/; # match '! some text' and get rid of ! and spaces $out = "${out} $1"; # append } } danieljprice-splash-4d1f09c/scripts/getav.pl000077500000000000000000000015001477365367100212230ustar00rootroot00000000000000#!/usr/bin/perl # adds up the L2 errors from supersphplot output; calculates average use strict; use warnings; use List::Util qw(sum); my $file = ' '; my $avg = 0; if ($#ARGV < 0) { print "script which parses supersphplot output for L2 errors \n"; print "and calculates the average. Written by D. Price. \n\n"; die "Usage: $0 filename(s) \n"; } foreach $file (@ARGV) { open my $fh, '<', $file or die "Can't open $file: $!"; my @errors; while ( <$fh> ) { if ( my ($error) = m/L2 error\s+=\s+(\S*)\s+/ ) { #print "error = $error \n"; push @errors, $error; } } my $nerrors = scalar(@errors); if ($nerrors > 0) { $avg = sum(@errors) / $nerrors; } else { $avg = 0; } print "$file: Average of $nerrors errors: $avg\n"; } #print "$_\n" for @errors; danieljprice-splash-4d1f09c/scripts/movie.sh000077500000000000000000000011441477365367100212370ustar00rootroot00000000000000#!/bin/bash # # script to make an mpeg4 movie from png files # by default, takes splash_*.png as inputs and movie.mp4 as output # requires ffmpeg utility # # DJP, Feb 2014. edited by KAH, Aug 2017. # DP, Apr 2020: Added -pix_fmt yu420p and use default video codec # opts='-r 10 -vb 50M -bt 100M -pix_fmt yuv420p -vf setpts=4.*PTS' if [ $# -le 0 ]; then ffmpeg -i splash_%04d.png $opts movie.mp4 fi if [ $# -eq 1 ]; then ffmpeg -i $1_%04d.png $opts movie.mp4 fi if [ $# -eq 2 ]; then ffmpeg -i $1_%04d.png $opts $2.mp4 fi if [ $# -ge 3 ]; then echo "usage: $0 infile_prefix outfile_prefix" exit fi danieljprice-splash-4d1f09c/scripts/plot_pix.py000066400000000000000000000027101477365367100217710ustar00rootroot00000000000000#!/usr/bin/env python # # Script to plot the contents of a .pix file output # with splash -o ascii # import numpy as np import matplotlib.pyplot as plt import sys import re def read_header( file ): """ read the x, y and v plot limits from the .pix header lines """ pat = re.compile(r'.*min\s*=\s+(\S+)\s+max\s*=\s+(\S+)') fh = open(file, 'r') count = 0 got = 0 xmin = np.full((3),0.) xmax = np.full((3),1.) while (count < 10): count += 1 # Get next line from file line = fh.readline() # if line is empty # end of file is reached if not line: break # otherwise match lines like "min = 0.000 max = 1.000" if (pat.match(line)): [m] = pat.findall(line) xmin[got] = m[0] xmax[got] = m[1] got += 1 return xmin[2],xmax[2],xmin[1],xmax[1],xmin[0],xmax[0] def read_pix( file ): """ read the floating point pixel values """ array = np.loadtxt(file) return array def plot_pix( file ): """ plot the pixel map with appropriate limits """ xmin,xmax,ymin,ymax,vmin,vmax = read_header(file) img = read_pix(file) print(file,img.shape) plt.imshow(img,cmap='RdBu',origin='lower',vmin=vmin,vmax=vmax,extent=[xmin,xmax,ymin,ymax]) plt.show() if (len(sys.argv) > 1): for file in sys.argv[1:]: plot_pix( file ) else: print('Usage:',strsys.argv[0],'file.pix') sys.exit(2) danieljprice-splash-4d1f09c/scripts/splash_exact.py000066400000000000000000000507311477365367100226170ustar00rootroot00000000000000import os.path from pathlib import Path from ctypes import * #### Add to your script # # import sys # sys.path.append('/path/to/splash/scripts') (directory, which contains this script) # import splash_exact # import numpy # #### After those lines, all splash exact solutions are available for use # # x = numpy.linspace(-0.25, 0.25, num=1000) # x, y, ierr = splash_exact.shock(x) # if (ierr != 0): # plt.plot(x,y) # plt.show() # #### def prerun(): libexactpath = Path(__file__).parent.parent.joinpath('build/libexact.so') if (not libexactpath.exists()): print("Could not find `libexact.so") print("Please compile with `make libexact` first.") exit(1) else: lib = cdll.LoadLibrary(str(libexactpath)) lib.check_argcv_f() return lib def checkfmt(str): return str.lower().replace(' ', '_').replace('-', '_').replace('/', '_') def shock( x, plot = 'density', time = 0.1, gamma = 5./3., xshock = 0., rho_L = 1., rho_R = 0.125, p_L = 1., p_R = 0.1, v_L = 0, v_R = 0., rdust_to_gas = 0.): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'pressure'): iplot = 2 elif (pin == 'velocity'): iplot = 3 elif (pin == 'uthermal'): iplot = 4 elif (pin == 'deltav'): iplot = 5 elif (pin == 'dustfrac'): iplot = 6 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || pressure || velocity || uthermal || deltav || dustfrac") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.shock( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(xshock)), byref(c_float(rho_L)), byref(c_float(rho_R)), byref(c_float(p_L)), byref(c_float(p_R)), byref(c_float(v_L)), byref(c_float(v_R)), byref(c_float(rdust_to_gas)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:], c_y[:], ierr def shock_sr( x, plot = 'density', time = 0.1, gamma = 5./3., rho_L = 1., rho_R = 0.125, p_L = 1.0, p_R = 0.1, v_L = 0., v_R = 0.): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'pressure'): iplot = 2 elif (pin == 'velocity'): iplot = 3 elif (pin == 'uthermal'): iplot = 4 elif (pin == 'density*'): iplot = 5 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || pressure || velocity || uthermal || density*") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.shock_sr_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(rho_L)), byref(c_float(rho_R)), byref(c_float(p_L)), byref(c_float(p_R)), byref(c_float(v_L)), byref(c_float(v_R)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def sedov( r, plot = 'density', time = 0.1, gamma = 5./3., rhozero = 1., energy = 1., rmax = 1.): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'pressure'): iplot = 2 elif (pin == 'uthermal'): iplot = 3 elif (pin == 'kinetic_energy'): iplot = 4 elif (pin == 'velocity'): iplot = 5 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || pressure || uthermal || kinetic_energy || velocity ") exit(1) exactdll = prerun() ierr = 0 c_r = (c_float*len(r))() c_y = (c_float*len(r))() c_r[:] = r[:] exactdll.sedov_( byref(c_int(iplot)), byref(c_int(len(r))), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(rhozero)), byref(c_float(energy)), byref(c_float(rmax)), byref(c_r), byref(c_y), byref(c_int(ierr)) ) return c_r[:],c_y[:],ierr def polytrope( r, gamma = 5./3., polyk = 1., totmass = 1.): exactdll = prerun() ierr = 0 c_r = (c_float*len(r))() c_y = (c_float*len(r))() c_r[:] = r[:] npartout = len(r) nout = c_int(0) exactdll.polytrope_( byref(c_int(len(r))), byref(c_float(gamma)), byref(c_float(polyk)), byref(c_float(totmass)), byref(c_r), byref(c_y), byref(c_nout), byref(c_int(ierr)) ) return c_r[:nout.value],c_y[:nout.value],ierr def toystar1D( x, plot = 'density', time = 1., gamma = 5./3., H0 = 1., A0 = 1., C0 = 1., sigma = 0., norder = -1): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'pressure'): iplot = 2 elif (pin == 'uthermal'): iplot = 3 elif (pin == 'velocity_x'): iplot = 4 elif (pin == 'mag_field_y'): iplot = 5 elif (pin == 'ac_plane'): iplot = 7 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || pressure || uthermal || velocity_x || mag_field_y || ac_plane ") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.toystar1d_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(H0)), byref(c_float(A0)), byref(c_float(C0)), byref(c_float(sigma)), byref(c_int(norder)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def toystar2D( x, plot = 'density', time = 1., gamma = 5./3., polyk = 1., totmass = 1., A0 = 1., H0 = 1., C0 = 1., jorder = -1, morder = 0, V11 = 0, V22 = 0, V12 = 0, V21 = 0): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'pressure'): iplot = 2 elif (pin == 'uthermal'): iplot = 3 elif (pin == 'velocity_x'): iplot = 4 elif (pin == 'velocity_y'): iplot = 5 elif (pin == 'x_vs_y'): iplot = 0 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || pressure || uthermal || velocity_x || velocity_y || x_vs_y ") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.toystar2d_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(polyk)), byref(c_float(totmass)), byref(c_float(A0)), byref(c_float(H0)), byref(c_float(C0)), byref(c_int(jorder)), byref(c_int(morder)), byref(c_float(V11)), byref(c_float(V22)), byref(c_float(V12)), byref(c_float(V21)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def gresho( x, plot = 'velocity_phi'): pin = checkfmt(plot) if (pin == 'velocity_phi'): iplot = 1 elif (pin == 'pressure'): iplot = 2 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = velocity_phi || pressure ") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.gresho_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def mhdshock( x, plot = 'density', solution = '7 jump', time = 0.2, gamma = 5./3., xmin = -1, xmax = 1, xshock = 0): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'pressure'): iplot = 2 elif (pin == 'velocity_x'): iplot = 3 elif (pin == 'velocity_y'): iplot = 4 elif (pin == 'velocity_z'): iplot = 5 elif (pin == 'mag_field_y'): iplot = 6 elif (pin == 'mag_field_z'): iplot = 7 elif (pin == 'uthermal'): iplot = 8 elif (pin == 'Bxzero'): iplot = 9 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || pressure || velocity_x || velocity_y || velocity_z || mag_field_y || mag_field_z || uthermal || Bxzero ") exit(1) ishk = 0 pin = checkfmt(solution) if (pin == 'brio_wu'): ishk = 1 elif (pin == 'fast_slow'): ishk = 2 elif (pin == '7_jump'): ishk = 3 elif (pin == 'isothermal'): ishk = 4 elif (pin == 'rarefaction'): ishk = 5 elif (pin == 'mach_25'): ishk = 6 elif (pin == 'toth'): ishk = 7 else: print("Splash Exact: Unrecognised solution type.") print("Splash Exact: solution = Brio/Wu || fast/slow || 7_jump || isothermal || rarefaction || Mach_25 || Toth ") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] c_nout = c_int(0) exactdll.mhdshock_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_int(ishk)), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(xmin)), byref(c_float(xmax)), byref(c_float(xshock)), byref(c_x), byref(c_y), byref(c_nout), byref(c_int(ierr)) ) return c_x[:c_nout.value],c_y[:c_nout.value],ierr def rhoh( x, plot = 'density', ndim = 3, hfact = 1.2, pmassval = 1.0): pin = checkfmt(plot) if (pin == 'h'): iplot = 1 elif (pin == 'density'): iplot = 2 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = h || density ") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.rhoh_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_int(ndim)), byref(c_float(hfact)), byref(c_float(pmassval)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def densityprofiles( x, plot = 'density', profile = 'Plummer', Msphere = [1.0,0.0], rsoft = [1.0,0.1]): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'potential'): iplot = 2 elif (pin == 'force'): iplot = 3 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || potential || force ") exit(1) pin = checkfmt(profile) if (pin == 'plummer'): iprofile = 1 elif (pin == 'hernquist'): iprofile = 2 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: profile = Plummer || Hernquist ") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.densityprofiles_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_int(iprofile)), byref(c_float(Msphere[0])), byref(c_float(Msphere[1])), byref(c_float(rsoft[0])), byref(c_float(rsoft[1])), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def torus( x, plot = 'density', torus = 'default', Mstar = 1.0, Rtorus = 1.0, polyk = 0.0764, distortion = 1.1, gamma = 5./3.): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'pressure'): iplot = 2 elif (pin == 'uthermal'): iplot = 3 elif (pin == 'Btheta'): iplot = 4 elif (pin == 'Jphi_current'): iplot = 5 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density || pressure || uthermal || Btheta || Jphi_current") exit(1) itorus = 0 pin = checkfmt(torus) if (pin == 'default'): itorus = 1 elif (pin == 'tokamak'): itorus = 2 else: print("Splash Exact: Unrecognised torus type.") print("Splash Exact: torus = Default || Tokamak ") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.torus_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_int(itorus)), byref(c_float(Mstar)), byref(c_float(Rtorus)), byref(c_float(polyk)), byref(c_float(distortion)), byref(c_float(gamma)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def ringspread( x, plot = 'density', time = 1.0, Mdisk = 1.0, Rdisk = 1.0, viscnu = 1.e-3): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 else: print("Splash Exact: Unrecognised plot type.") print("Splash Exact: plot = density") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.ringspread_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(Mdisk)), byref(c_float(Rdisk)), byref(c_float(viscnu)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def dustywave( x, plot = 'gas_density', time = 1.0, ampl = 1.0, cs = 1.0, Kdrag = 1.0, lambdacoef = 1.0, x0 = 1.0, rhog0 = 1.0, rhod0 = 1.0): pin = checkfmt(plot) if (pin == 'gas_velocity'): iplot = 1 elif (pin == 'dust_velocity'): iplot = 2 elif (pin == 'gas_density'): iplot = 3 elif (pin == 'dust_density'): iplot = 4 else: print("Splash Exact: Unrecognised plot type `" + plot + "`") print("Splash Exact: plot = gas_velocity || dust_velocity || gas_density || dust_density") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.dustywave_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(ampl)), byref(c_float(cs)), byref(c_float(Kdrag)), byref(c_float(lambdacoef)), byref(c_float(x0)), byref(c_float(rhog0)), byref(c_float(rhod0)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def rochelobe( x, primatypos = [0.,0.], secondarypos = [1.,0.], primarymass = 1., secondarymass = 1.): exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.rochelobe_( byref(c_int(len(x))), byref(c_float(primatypos[0])), byref(c_float(primatypos[1])), byref(c_float(secondarypos[0])), byref(c_float(secondarypos[0])), byref(c_float(primarymass)), byref(c_float(secondarymass)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def cshock( x, plot='density', time=0.2, gamma=5./3., machs = 50., macha = 5., xmin=-0.25, xmax= 0.25,): pin = checkfmt(plot) if (pin == 'density'): iplot = 1 elif (pin == 'mag_field_y'): iplot = 2 elif (pin == 'velocity_x'): iplot = 3 elif (pin == 'velocity_y'): iplot = 4 elif (pin == 'mag_field_x'): iplot = 5 else: print("Splash Exact: Unrecognised plot type `" + plot + "`") print("Splash Exact: plot = density || mag_field_x || mag_field_y || velocity_x || velocity_y") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.cshock_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(machs)), byref(c_float(macha)), byref(c_float(xmin)), byref(c_float(xmax)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def check_spiral_params(i1,i2,j1,j2,nparams,nsolutions): if (i1 > i2): print("Splash Exact: Wrong Spiral Params. i1 > i2. Should define blocks [i1,i2,j1,j2,val].") exit(1) if (j1 > j2): print("Splash Exact: Wrong Spiral Params. j1 > j2. Should define blocks [i1,i2,j1,j2,val].") exit(1) if (i2 >= nparams): print("Splash Exact: Wrong Spiral Params. i1 > "+str(nparams)+". Should define blocks [i1,i2,j1,j2,val].") exit(1) if (j2 >= nsolutions): print("Splash Exact: Wrong Spiral Params. i1 > "+str(nsolutions)+". Should define blocks [i1,i2,j1,j2,val].") exit(1) def planetdisc( x, plot='phi/r plane', spiral='Ogilvie/Rafikov', time=0.2, HonR = 0.05, rplanet = 1., q_index = 0.25, narms = 1, spiral_params=[[1,1,0,6,360]]): # same as filling block i1 to i2, j1 to j2 with x # spiral_params = 0. # spiral_params(2,:) = 360. pin = checkfmt(plot) if (pin == 'phi_r_plane'): iplot = 1 elif (pin == 'x_y_plane'): iplot = 2 else: print("Splash Exact: Unrecognised plot type `" + plot + "`") print("Splash Exact: plot = phi-r plane || x-y plane") exit(1) ispiral = 0 pin = checkfmt(spiral) if (pin == 'ogilvie_rafikov'): ispiral = 1 elif (pin == 'spiral_arm_fitting'): ispiral = 2 else: print("Splash Exact: Unrecognised plot type `" + plot + "`") print("Splash Exact: plot = Ogilvie/Rafikov || spiral_arm_fitting") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] nparams = 7 nsolutions = 10 c_params = (c_float*nparams*nsolutions)() for e in spiral_params: i1 = e[0] i2 = e[1] j1 = e[2] j2 = e[3] val = e[4] check_spiral_params(i1,i2,j1,j2,nparams,nsolutions) for i in range(i1,i2+1): for j in range(j1,j2+1): c_params[i][j] = val exactdll.planetdisc_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_int(ispiral)), byref(c_float(time)), byref(c_float(HonR)), byref(c_float(rplanet)), byref(c_float(q_index)), byref(c_int(narms)), byref(c_params), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr def bondi( x, plot = 'density', time = 10, gamma = 5./3., const1 = 8., const2 = 1., Mstar = 1, relativistic = True, geodesic_flow = False, is_wind = True): pin = checkfmt(plot) if (pin == 'velocity_x'): iplot = 1 elif (pin == 'uthermal'): iplot = 2 elif (pin == 'density'): iplot = 2 else: print("Splash Exact: Unrecognised plot type `" + plot + "`") print("Splash Exact: plot = velocity_x || uthermal || density") exit(1) exactdll = prerun() ierr = 0 c_x = (c_float*len(x))() c_y = (c_float*len(x))() c_x[:] = x[:] exactdll.bondi_( byref(c_int(iplot)), byref(c_int(len(x))), byref(c_float(time)), byref(c_float(gamma)), byref(c_float(const1)), byref(c_float(const2)), byref(c_float(Mstar)), byref(c_bool(relativistic)), byref(c_bool(geodesic_flow)), byref(c_bool(is_wind)), byref(c_x), byref(c_y), byref(c_int(ierr)) ) return c_x[:],c_y[:],ierr danieljprice-splash-4d1f09c/scripts/splash_parallel.pl000077500000000000000000000170721477365367100232760ustar00rootroot00000000000000#!/usr/bin/perl # # farms out jobs to a list of machines, finding available CPU # use strict; use warnings; use IO::Handle; #--------------------------------------------------------- # check args #--------------------------------------------------------- if ($#ARGV < 1 ) { die "Usage: $0 nfilesperplot file1 [file2 file3 ... filen] \n also with a file called input \n"; } #--------------------------------------------------------- # set farming method options are ssh, xgrid #--------------------------------------------------------- #my $farmusing='ssh'; my $farmusing='none'; #my $farmusing='xgrid'; my $delay=3; #--------------------------------------------------------- # set name and location of the supersphplot executable #--------------------------------------------------------- my $home=`cd; pwd -P`; chomp ($home); my $exe="$home/splash/bin/ssplash -readpix chf"; my $pwd = `pwd`; chomp($pwd); #--------------------------------------------------------- # set other default options #--------------------------------------------------------- my $inputfile='input'; my $pgplotfile='pgplot'; my $pgplotdev='none'; # doesn't matter my $pgplotdir= $ENV{'PGPLOT_DIR'}; # get this from the environment my $ldpath= $ENV{'LD_LIBRARY_PATH'}; # get this from the environment my $run; #--------------------------------------------------------- # get filenames and nfilesperplot from command line #--------------------------------------------------------- my ($nfilesperplot,@files) = @ARGV; #--------------------------------------------------------- # work out how many files should be sent as command line arguments to each run #--------------------------------------------------------- if ($nfilesperplot < 1) { die "error: nfilesperplot must be > 0\n" }; my $nfiles=$#files + 1; my $nruns=$nfiles/$nfilesperplot; print "nfiles = $nfiles; nruns = $nruns\n"; #--------------------------------------------------------- # get generic input from input file #--------------------------------------------------------- my @inputs = `cat $inputfile` or die "error: input file does not exist\n"; #open my $fh,'<',$inputfile or die "error: input file does not exist\n"; my $line; my $nline = 0; my $devline = 0; foreach $line (@inputs) { if ( $line =~ m|(/.+)\s| ) { $pgplotdev = $1; $devline = $nline; } $nline = $nline + 1; } #close $fh; #--------------------------------------------------------- # work out what device we are writing to and therefore # what the filenames should be #--------------------------------------------------------- print "PGPLOT device = $pgplotdev $inputs[$devline]\n"; if ( $pgplotdev eq '/xw' or $pgplotdev eq '/aqt' ) { die "must choose a non-interactive PGPLOT device\n"; } #--------------------------------------------------------- # work out the filename extension from the device name #--------------------------------------------------------- my ($ext) = $pgplotdev =~ m|/(.+)|; #print "extension = $ext \n"; #--------------------------------------------------------- # farm out the jobs #--------------------------------------------------------- my $filestart = 0; my $fileend = $filestart + $nfilesperplot; my $n = 0; my $tempdir = 'temp'; system "mkdir $tempdir" || die("error creating temporary directory $tempdir"); for ($run=1;$run<=$nruns;$run++) { my @inputstemp = @inputs; my $num = sprintf("%04d",$run); my $pgplotfile = "pgplot_$num.$ext"; #my $pgplotfile = "pgplot.$ext\_$run"; $inputstemp[$devline] = "$pgplotfile$pgplotdev\n"; print "------------ run $run : $pgplotfile ------------\n"; my @argsn=@files[$filestart..$fileend-1]; #---write the input file open(INPUTF,"> $tempdir/input$run") || die("can't write temporary files"); foreach $line (@inputstemp) { chomp($line); print INPUTF "$line \n"; } close(INPUTF); #---write the executable script--- my $outfile = "$tempdir/run$run.output"; open(RUNSCR,"> $tempdir/run$run.csh") || die("can't write run script"); print RUNSCR "#!/bin/tcsh \n"; print RUNSCR "setenv PGPLOT_DIR $pgplotdir \n"; # print RUNSCR "source $home/.cshrc \n"; # print RUNSCR "setenv LD_LIBRARY_PATH $ldpath \n"; print RUNSCR "setenv F_UFMTENDIAN 'big;little:168' \n"; print RUNSCR "setenv PGPLOT_FONT $home/pgplot/grfont.dat_big \n"; print RUNSCR "cd $pwd \n"; print RUNSCR "$exe @argsn < $tempdir/input$run >& $outfile \n"; close(RUNSCR); system "chmod a+x ./$tempdir/run$run.csh"; if ( -e "$outfile" ) { system "rm $outfile" }; my $commandline = "./$tempdir/run$run.csh"; if ( -s $pgplotfile ) { print "skipping $pgplotfile which already exists \n"; } else { if ($farmusing eq 'ssh') { farmjob_ssh( $commandline, $n ); sleep $delay; } elsif ($farmusing eq 'xgrid') { farmjob_xgrid( $commandline ); } elsif ($farmusing eq 'none') { print "no job farmed: using farming method \'none\' \n"; } else { die "unknown farming method \n"; } } #--------------------------------- $filestart = $fileend; $fileend = $filestart + $nfilesperplot; } exit; #--------------------------------------------------------- # subroutine to farm job via Apple's Xgrid #--------------------------------------------------------- sub farmjob_xgrid { my $commandline=shift; my $xgridauth = "-hostname cytosine.ex.ac.uk -auth Kerberos -gid 2"; my $jobid = `xgrid $xgridauth -job submit $commandline` || die "xgrid not found \n"; ($jobid) = $jobid =~ m/jobIdentifier\s+=\s+(\d+);/; # \s matches spaces (+ = at least one) \d decimals print "farmed via xgrid: job id = $jobid \n"; system "echo echo deleting... >> cleanxgrid; echo xgrid $xgridauth -job delete -id $jobid >> cleanxgrid"; system "echo echo getting results... >> getresultsxgrid; echo xgrid $xgridauth -job results -id $jobid >> getresultsxgrid"; sleep 1; # avoid multiple rapid-fire requests to xgrid server } #--------------------------------------------------------- # subroutine to farm jobs via simple ssh commands # to a list of machines #--------------------------------------------------------- sub farmjob_ssh { my ($commandline,$n)=@_; my (@machines) = `cat machinelist` or die "ERROR: for ssh version must list machines in file machinelist \n"; my $nmachines = $#machines; if ( $nmachines < 1 ) { die "ERROR: no machines specified in file machinelist \n"; } my $pwd = `pwd`; chomp($pwd); my $njobsrun = 0; my $loadavmax = 0.5; my $bs = '\\'; # loop through all available machines looking for spare CPU while ($njobsrun < 1) { #--set which machine to try if ($n > $nmachines) { print "waiting for machines to become free \n"; sleep 30; $n = 0; }; my $machine = $machines[$n]; chomp($machine); my $loadav = 0.0; print "trying $machine: "; #--get load average for this machine using uptime command if ($loadavmax > 0.0) { my $uptime=`ssh $machine uptime`; ($loadav) = $uptime =~ m/load ave.+:\s(\d+\.\d+)./; print " load average last 1 minute = $loadav "; } #--set job running if not busy if ( $loadav < $loadavmax ) { print " ...OK \n"; $njobsrun = $njobsrun + 1; # run the job print "running $commandline on machine $machine at nice +19\n"; system "ssh -f $machine 'cd $pwd; nice +19 $commandline < /dev/null >& /dev/null &'"; } else { print " ...too busy \n"; } $n = $n + 1; } $_[1] = $n; } danieljprice-splash-4d1f09c/scripts/update_release_notes_in_docs.sh000077500000000000000000000001211477365367100260020ustar00rootroot00000000000000#!/bin/bash cd ..; ./scripts/get_release_notes.pl all > docs/version_history.rst danieljprice-splash-4d1f09c/src/000077500000000000000000000000001477365367100166615ustar00rootroot00000000000000danieljprice-splash-4d1f09c/src/H5Part/000077500000000000000000000000001477365367100177645ustar00rootroot00000000000000danieljprice-splash-4d1f09c/src/H5Part/COPYING000066400000000000000000000073431477365367100210260ustar00rootroot00000000000000*** Copyright Notice *** H5Part Copyright (c) 2006-2009, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Dept. of Energy) and the Paul Scherrer Institut (Switzerland). All rights reserved. If you have questions about your rights to use or distribute this software, please contact Berkeley Lab's Technology Transfer Department at TTD@lbl.gov referring to "H5Part (LBNL Ref CR-2255)" NOTICE. This software was developed under partial funding from the U.S. Department of Energy. As such, the U.S. Government has been granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, worldwide license in the Software to reproduce, prepare derivative works, and perform publicly and display publicly. Beginning five (5) years after the date permission to assert copyright is obtained from the U.S. Department of Energy, and subject to any subsequent five (5) year renewals, the U.S. Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, worldwide license in the Software to reproduce, prepare derivative works, distribute copies to the public, perform publicly and display publicly, and to permit others to do so. *** License agreement *** H5Part Copyright (c) 2006-2009, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Dept. of Energy) and the Paul Scherrer Institut (Switzerland). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, U.S. Dept. of Energy, Paul Scherrer Institut (Switzerland) nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the features, functionality or performance of the source code ("Enhancements") to anyone; however, if you choose to make your Enhancements available either publicly, or directly to Lawrence Berkeley National Laboratory, without imposing a separate written license agreement for such Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free perpetual license to install, use, modify, prepare derivative works, incorporate into other computer software, distribute, and sublicense such enhancements or derivative works thereof, in binary and source code form. danieljprice-splash-4d1f09c/src/H5Part/H5Part.F90000066400000000000000000000637171477365367100213650ustar00rootroot00000000000000!------------------------------------------------------------- ! ! Fortran 90 interface to H5Part, using ! the Fortran 2003 C interoperability module (iso_c_binding) ! ! Written by Daniel Price 08/04/10 ! daniel.price@sci.monash.edu.au ! ! We first specify the interfaces to the C interface routines ! used to handle the H5partfile container object. However, all ! string conversion is done in the Fortran, not in the C. ! !------------------------------------------------------------- module h5part use, intrinsic :: iso_c_binding, only:c_char,c_int,c_int64_t,c_double,c_float implicit none integer(kind=c_int64_t), parameter, public :: H5PART_INT64 = 1 integer(kind=c_int64_t), parameter, public :: H5PART_INT32 = 2 integer(kind=c_int64_t), parameter, public :: H5PART_FLOAT64 = 3 integer(kind=c_int64_t), parameter, public :: H5PART_FLOAT32 = 4 integer(kind=c_int64_t), parameter, public :: H5PART_CHAR = 5 integer(kind=c_int64_t), parameter, public :: H5PART_STRING = 6 character(len=7), dimension(6), parameter, public :: & h5part_type = (/'INT64 ',& 'INT32 ',& 'FLOAT64',& 'FLOAT32',& 'CHAR ',& 'STRING '/) ! ! interfaces provided by this module ! public :: h5pt_openr,h5pt_openw,h5pt_opena,h5pt_close public :: h5pt_openr_align,h5pt_openw_align,h5pt_opena_align #ifdef PARALLEL_IO public :: h5pt_openr_par,h5pt_openw_par,h5pt_opena_par public :: h5pt_openr_par_align,h5pt_openw_par_align,h5pt_opena_par_align #endif public :: h5pt_setnpoints,h5pt_setnpoints_strided public :: h5pt_getnpoints public :: h5pt_setstep,h5pt_getnsteps,h5pt_getndatasets public :: h5pt_getdatasetname,h5pt_getdatasetinfo public :: h5pt_setview,h5pt_setview_indices public :: h5pt_getview public :: h5pt_resetview,h5pt_hasview public :: h5pt_set_verbosity_level public :: h5pt_writedata public :: h5pt_readdata ! ! the type-specific routines are also public ! (could make these private to allow only ! the generic interface to be used) ! public :: h5pt_writedata_r8,h5pt_writedata_r4, & h5pt_writedata_i8,h5pt_writedata_i4 public :: h5pt_readdata_r8,h5pt_readdata_r4, & h5pt_readdata_i8,h5pt_readdata_i4 private ! ! generic interface for writing data of any type ! interface h5pt_writedata module procedure h5pt_writedata_i4,h5pt_writedata_i8, & h5pt_writedata_r4,h5pt_writedata_r8 end interface h5pt_writedata ! ! generic interface for reading data of any type ! interface h5pt_readdata module procedure h5pt_readdata_i4,h5pt_readdata_i8, & h5pt_readdata_r4,h5pt_readdata_r8 end interface h5pt_readdata !--------------------------- ! ! interfaces to c routines ! !--------------------------- interface ! ! Opening and closing files ! integer(kind=c_int64_t) function h5ptc_openr( filename ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for reading end function integer(kind=c_int64_t) function h5ptc_openw ( filename ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for writing end function integer(kind=c_int64_t) function h5ptc_opena ( filename ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for appending end function integer(kind=c_int64_t) function h5ptc_openr_align ( filename, align ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for reading integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes end function integer(kind=c_int64_t) function h5ptc_openw_align ( filename, align ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for writing integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes end function integer(kind=c_int64_t) function h5ptc_opena_align ( filename, align ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for appending integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes end function integer(kind=c_int64_t) function h5pt_close ( filehandle ) bind(C,name="h5ptc_close") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function #ifdef PARALLEL_IO ! ! Opening files (parallel I/O) ! integer(kind=c_int64_t) function h5ptc_openr_par ( filename, mpi_communicator ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for reading integer, intent(in) :: mpi_communicator !< the MPI communicator used by the program end function integer(kind=c_int64_t) function h5ptc_openw_par ( filename, mpi_communicator ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for writing integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program end function integer(kind=c_int64_t) function h5ptc_opena_par ( filename, mpi_communicator ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for appending integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program end function integer(kind=c_int64_t) function h5ptc_openr_par_align ( filename, mpi_communicator, align ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for reading integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes end function integer(kind=c_int64_t) function h5ptc_openw_par_align ( filename, mpi_communicator, align, flags ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for writing integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes character(kind=c_char), dimension(1), intent(in) :: flags !< additional flags end function integer(kind=c_int64_t) function h5ptc_opena_par_align ( filename, mpi_communicator, align, flags ) bind(C) import character(kind=c_char), dimension(1), intent(in) :: filename !< the filename to open for appending integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes character(kind=c_char), dimension(1), intent(in) :: flags !< additional flags end function #endif ! ! Setting up the data model ! (where no strings are passed these are just interfaces to the c routines that convert the filehandle) ! integer(kind=c_int64_t) function h5pt_setnpoints ( filehandle, npoints ) bind(C,name="h5ptc_setnpoints") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: npoints !< the number of particles on *this* processor end function integer(kind=c_int64_t) function h5pt_setnpoints_strided ( filehandle, npoints, stride ) & bind(C,name="h5ptc_setnpoints_strided") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: npoints !< the number of particles on *this* processor integer(kind=c_int64_t), intent(in) :: stride !< the stride value (e.g. the number of fields in the particle data array) end function integer(kind=c_int64_t) function h5pt_setstep (filehandle,step) bind(C,name="h5ptc_setstep") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: step !< a timestep value >= 1 end function integer(kind=c_int64_t) function h5pt_getnsteps (filehandle) bind(C,name="h5ptc_getnsteps") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function integer(kind=c_int64_t) function h5pt_getndatasets (filehandle) bind(C,name="h5ptc_getndatasets") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function integer(kind=c_int64_t) function h5pt_getnpoints (filehandle) bind(C,name="h5ptc_getnpoints") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function integer(kind=c_int64_t) function h5ptc_getdatasetname (filehandle,index,name,l_name) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: index !< index of dataset to query (starting from 0) character(kind=c_char), dimension(1), intent(out) :: name !< buffer to read the dataset name into integer(kind=c_int64_t), intent(in) :: l_name !< size of name end function integer(kind=c_int64_t) function h5ptc_getdatasetinfo (filehandle,index,name,data_type,nelem,l_name) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: index !< index of dataset to query (starting from 0) character(kind=c_char), dimension(1), intent(out) :: name !< buffer to read the dataset name into integer(kind=c_int64_t), intent(out) :: data_type !< type of data in dataset integer(kind=c_int64_t), intent(out) :: nelem !< number of elements integer(kind=c_int64_t), intent(in) :: l_name !< size of name end function ! ! Setting and getting views ! (as no strings are passed these are just interfaces to the c routines that convert the filehandle) ! integer(kind=c_int64_t) function h5pt_setview (filehandle,start,end) bind(C,name="h5ptc_setview") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: start !< offset of the first particle in the view integer(kind=c_int64_t), intent(in) :: end !< offset of the last particle in the view (inclusive) end function integer(kind=c_int64_t) function h5pt_setview_indices (filehandle,indices,nelem) bind(C,name="h5ptc_setview_indices") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: indices(*) !< list of indicies to select in this view integer(kind=c_int64_t), intent(in) :: nelem !< number of particles in the list end function integer(kind=c_int64_t) function h5pt_resetview (filehandle) bind(C,name="h5ptc_resetview") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function integer(kind=c_int64_t) function h5pt_hasview (filehandle) bind(C,name="h5ptc_hasview") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function integer(kind=c_int64_t) function h5pt_getview (filehandle,start,end) bind(C,name="h5ptc_getview") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(out) :: start !< buffer to store the offset of the first particle in the view integer(kind=c_int64_t), intent(out) :: end !< buffer to store the offset of the last particle in the view (inclusive) end function ! ! Reading and writing datasets ! integer(kind=c_int64_t) function h5ptc_writedata_r8 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset real(kind=c_double), intent(in) :: data(*) !< the array of float64 data to write end function integer(kind=c_int64_t) function h5ptc_readdata_r8 (filehandle,name,data) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset real(kind=c_double), intent(out) :: data(*) !< array to read float64 data into end function integer(kind=c_int64_t) function h5ptc_writedata_r4 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset real(kind=c_float), intent(in) :: data(*) !< the array of float32 data to write end function integer(kind=c_int64_t) function h5ptc_readdata_r4 (filehandle,name,data) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset real(kind=c_float), intent(out) :: data(*) !< array to read float32 data into end function integer(kind=c_int64_t) function h5ptc_writedata_i8 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset integer(kind=c_int64_t), intent(in) :: data(*) !< the array of int64 data to write end function integer(kind=c_int64_t) function h5ptc_readdata_i8 (filehandle,name,data) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset integer(kind=c_int64_t), intent(out) :: data(*) !< array to read int64 data into end function integer(kind=c_int64_t) function h5ptc_writedata_i4 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset integer(kind=c_int), intent(in) :: data(*) !< the array of int32 data to write end function integer(kind=c_int64_t) function h5ptc_readdata_i4 (filehandle,name,data) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the dataset integer(kind=c_int), intent(out) :: data(*) !< array to read int32 data into end function ! ! routines where no conversion of anything is needed: i.e. just call H5Part C routines directly ! integer(kind=c_int64_t) function h5pt_set_verbosity_level ( level ) bind(C,name="H5PartSetVerbosityLevel") import integer(kind=c_int64_t), intent(in) :: level !< the level from 0 (no output) to 5 (most detailed) end function end interface contains !--------------------------------------------------------------------------- ! ! wrappers for functions with string arguments: ! converts strings into C strings ! !--------------------------------------------------------------------------- integer(kind=c_int64_t) function h5pt_openr( filename ) implicit none character(len=*), intent(in) :: filename !< the filename to open for reading h5pt_openr = h5ptc_openr( cstring(filename) ) end function integer(kind=c_int64_t) function h5pt_openw ( filename ) implicit none character(len=*), intent(in) :: filename !< the filename to open for writing h5pt_openw = h5ptc_openw ( cstring(filename) ) end function integer(kind=c_int64_t) function h5pt_opena ( filename ) implicit none character(len=*), intent(in) :: filename !< the filename to open for appending h5pt_opena = h5ptc_opena ( cstring(filename) ) end function integer(kind=c_int64_t) function h5pt_openr_align ( filename, align ) implicit none character(len=*), intent(in) :: filename !< the filename to open for reading integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes h5pt_openr_align = h5ptc_openr_align ( cstring(filename), align ) end function integer(kind=c_int64_t) function h5pt_openw_align ( filename, align ) implicit none character(len=*), intent(in) :: filename !< the filename to open for writing integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes h5pt_openw_align = h5ptc_openw_align ( cstring(filename), align ) end function integer(kind=c_int64_t) function h5pt_opena_align ( filename, align ) implicit none character(len=*), intent(in) :: filename !< the filename to open for appending integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes h5pt_opena_align = h5ptc_opena_align ( cstring(filename), align ) end function #ifdef PARALLEL_IO ! ! opening files (parallel I/O) ! integer(kind=c_int64_t) function h5pt_openr_par ( filename, mpi_communicator ) implicit none character(len=*), intent(in) :: filename !< the filename to open for reading integer, intent(in) :: mpi_communicator !< the MPI communicator used by the program h5pt_openr_par = h5ptc_openr_par ( cstring(filename), mpi_communicator ) end function integer(kind=c_int64_t) function h5pt_openw_par ( filename, mpi_communicator ) implicit none character(len=*), intent(in) :: filename !< the filename to open for writing integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program h5pt_openw_par = h5ptc_openw_par ( cstring(filename), mpi_communicator ) end function integer(kind=c_int64_t) function h5pt_opena_par ( filename, mpi_communicator ) implicit none character(len=*), intent(in) :: filename !< the filename to open for appending integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program h5pt_opena_par = h5ptc_opena_par ( cstring(filename), mpi_communicator ) end function integer(kind=c_int64_t) function h5pt_openr_par_align ( filename, mpi_communicator, align ) implicit none character(len=*), intent(in) :: filename !< the filename to open for reading integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes h5pt_openr_par_align = h5ptc_openr_par_align ( cstring(filename), mpi_communicator, align ) end function integer(kind=c_int64_t) function h5pt_openw_par_align ( filename, mpi_communicator, align, flags ) implicit none character(len=*), intent(in) :: filename !< the filename to open for writing integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes character(len=*), intent(in) :: flags !< additional flags h5pt_openw_par_align = h5ptc_openw_par_align ( cstring(filename), mpi_communicator, align, cstring(flags) ) end function integer(kind=c_int64_t) function h5pt_opena_par_align ( filename, mpi_communicator, align, flags ) implicit none character(len=*), intent(in) :: filename !< the filename to open for appending integer, intent(in) :: mpi_communicator !< the MPI_Communicator used by the program integer(kind=c_int64_t), intent(in) :: align !< alignment value in bytes character(len=*), intent(in) :: flags !< additional flags h5pt_opena_par_align = h5ptc_opena_par_align ( cstring(filename), mpi_communicator, align, cstring(flags) ) end function #endif ! ! Setting up the data model ! integer(kind=c_int64_t) function h5pt_getdatasetname (filehandle,index,name) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: index !< index of dataset to query (starting from 0) character(len=*), intent(out) :: name !< buffer to read the dataset name into integer(kind=c_int64_t) :: l_name l_name = len(name) h5pt_getdatasetname = h5ptc_getdatasetname(filehandle,index,name,l_name) name = fstring(name) end function h5pt_getdatasetname integer(kind=c_int64_t) function h5pt_getdatasetinfo(filehandle,idx,name,data_type,nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: idx !< index of dataset to query (starting from 0) character(len=*), intent(out) :: name !< buffer to read the dataset name into integer(kind=c_int64_t), intent(out) :: data_type !< type of data in dataset integer(kind=c_int64_t), intent(out) :: nelem !< number of elements integer(kind=c_int64_t) :: l_name l_name = len(name) h5pt_getdatasetinfo = h5ptc_getdatasetinfo(filehandle,idx,name,data_type,nelem,l_name) name = fstring(name) end function h5pt_getdatasetinfo ! ! Reading and writing datasets ! integer(kind=c_int64_t) function h5pt_writedata_r8 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset real(kind=c_double), intent(in) :: data(*) !< the array of float64 data to write h5pt_writedata_r8 = h5ptc_writedata_r8 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_readdata_r8 ( filehandle, name, data) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset real(kind=c_double), intent(out) :: data(*) !< array to read float64 data into h5pt_readdata_r8 = h5ptc_readdata_r8 ( filehandle, cstring(name), data) end function integer(kind=c_int64_t) function h5pt_writedata_r4 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset real(kind=c_float), intent(in) :: data(*) !< the array of float32 data to write h5pt_writedata_r4 = h5ptc_writedata_r4 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_readdata_r4 ( filehandle, name, data) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset real(kind=c_float), intent(out) :: data(*) !< array to read float32 data into h5pt_readdata_r4 = h5ptc_readdata_r4 ( filehandle, cstring(name), data) end function integer(kind=c_int64_t) function h5pt_writedata_i8 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset integer(kind=c_int64_t), intent(in) :: data(*) !< the array of int64 data to write h5pt_writedata_i8 = h5ptc_writedata_i8 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_readdata_i8 ( filehandle, name, data) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset integer(kind=c_int64_t), intent(out) :: data(*) !< array to read int64 data into h5pt_readdata_i8 = h5ptc_readdata_i8 ( filehandle, cstring(name), data) end function integer(kind=c_int64_t) function h5pt_writedata_i4 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset integer(kind=c_int), intent(in) :: data(*) !< the array of int32 data to write h5pt_writedata_i4 = h5ptc_writedata_i4 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_readdata_i4 (filehandle,name,data) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the dataset integer(kind=c_int), intent(out) :: data(*) !< array to read int32 data into h5pt_readdata_i4 = h5ptc_readdata_i4 ( filehandle, cstring(name), data) end function !--------------------------------------------------------------------------- ! ! function to safely convert a string to c format (ie. with a terminating ! ascii null character) ! !--------------------------------------------------------------------------- function cstring(string) implicit none character(len=*), intent(in) :: string character(len=len(string)+1) :: cstring cstring = trim(string)//char(0) end function cstring !--------------------------------------------------------------------------- ! ! function to safely convert a string from c format (ie. with a terminating ! ascii null character) back to a normal Fortran string ! !--------------------------------------------------------------------------- function fstring(string) implicit none character(len=*), intent(in) :: string !< the name of the dataset character(len=len(string)) :: fstring integer :: idx idx = index(string,char(0)) if (idx.gt.1) then fstring = string(1:idx-1) else fstring = '' endif end function fstring end module h5part danieljprice-splash-4d1f09c/src/H5Part/H5PartAttrib.f90000066400000000000000000000641141477365367100225630ustar00rootroot00000000000000!------------------------------------------------------------- ! ! Fortran 90 interface to H5Part, using ! the Fortran 2003 C interoperability module (iso_c_binding) ! ! Written by Daniel Price 08/04/10 ! daniel.price@sci.monash.edu.au ! ! We first specify the interfaces to the C interface routines ! used to handle the H5partfile container object. However, all ! string conversion is done in the Fortran, not in the C. ! ! This module contains the attributes interface ! !------------------------------------------------------------- module h5partattrib use, intrinsic :: iso_c_binding, only:c_char,c_int,c_int64_t,c_double,c_float implicit none ! ! interfaces provided by this module ! public :: h5pt_getnfileattribs,h5pt_getfileattribinfo public :: h5pt_getnstepattribs,h5pt_getstepattribinfo public :: h5pt_writefileattrib,h5pt_readfileattrib public :: h5pt_writestepattrib,h5pt_readstepattrib ! ! the type-specific routines are also public ! (could make these private to allow only ! the generic interface to be used) ! public :: h5pt_writefileattrib_i4,h5pt_writefileattrib_i8, & h5pt_writefileattrib_r4,h5pt_writefileattrib_r8, & h5pt_writefileattrib_string public :: h5pt_readfileattrib_i4,h5pt_readfileattrib_i8, & h5pt_readfileattrib_r4,h5pt_readfileattrib_r8, & h5pt_readfileattrib_string public :: h5pt_writestepattrib_i4,h5pt_writestepattrib_i8, & h5pt_writestepattrib_r4,h5pt_writestepattrib_r8, & h5pt_writestepattrib_string public :: h5pt_readstepattrib_i4,h5pt_readstepattrib_i8, & h5pt_readstepattrib_r4,h5pt_readstepattrib_r8, & h5pt_readstepattrib_string private ! ! generic interface for writing file attributes of any type ! interface h5pt_writefileattrib module procedure h5pt_writefileattrib_i4,h5pt_writefileattrib_i8, & h5pt_writefileattrib_r4,h5pt_writefileattrib_r8, & h5pt_writefileattrib_string end interface h5pt_writefileattrib ! ! generic interface for reading file attributes of any type ! interface h5pt_readfileattrib module procedure h5pt_readfileattrib_i4,h5pt_readfileattrib_i8, & h5pt_readfileattrib_r4,h5pt_readfileattrib_r8, & h5pt_readfileattrib_string end interface h5pt_readfileattrib ! ! generic interface for writing step attributes of any type ! interface h5pt_writestepattrib module procedure h5pt_writestepattrib_i4,h5pt_writestepattrib_i8, & h5pt_writestepattrib_r4,h5pt_writestepattrib_r8, & h5pt_writestepattrib_string end interface h5pt_writestepattrib ! ! generic interface for reading step attributes of any type ! interface h5pt_readstepattrib module procedure h5pt_readstepattrib_i4,h5pt_readstepattrib_i8, & h5pt_readstepattrib_r4,h5pt_readstepattrib_r8, & h5pt_readstepattrib_string end interface h5pt_readstepattrib !--------------------------- ! ! interfaces to c routines ! !--------------------------- interface ! ! file attributes: interfaces to c routines ! integer(kind=c_int64_t) function h5pt_getnfileattribs (filehandle) bind(C,name="h5ptc_getnfileattribs") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function integer(kind=c_int64_t) function h5ptc_getfileattribinfo (filehandle,idx,name,nelem,l_name) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: idx !< index of the attribute to query (starting from 0) character(kind=c_char), dimension(1), intent(out) :: name !< buffer to read the attribute name into integer(kind=c_int64_t), intent(out) :: nelem !< number of elements in the attribute's array integer(kind=c_int64_t), intent(in) :: l_name !< size of name end function integer(kind=c_int64_t) function h5ptc_writefileattrib_r8 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readfileattrib_r8 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(out) :: data(*) !< buffer to read value into end function integer(kind=c_int64_t) function h5ptc_writefileattrib_r4 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readfileattrib_r4 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(out) :: data(*) !< buffer to read value into end function integer(kind=c_int64_t) function h5ptc_writefileattrib_i8 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readfileattrib_i8 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(out) :: data(*) !< buffer to read value into end function integer(kind=c_int64_t) function h5ptc_writefileattrib_i4 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readfileattrib_i4 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(out) :: data(*) !< buffer to read value into end function integer(kind=c_int64_t) function h5ptc_writefileattrib_string (filehandle,name,value) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute character(kind=c_char), dimension(1), intent(in) :: value !< the string value to store end function integer(kind=c_int64_t) function h5ptc_readfileattrib_string (filehandle,name,value) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute character(kind=c_char), dimension(1), intent(out) :: value !< buffer to read the string value into end function ! ! step attributes: interfaces to c routines ! integer(kind=c_int64_t) function h5pt_getnstepattribs (filehandle) bind(C,name="h5ptc_getnstepattribs") import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open end function integer(kind=c_int64_t) function h5ptc_getstepattribinfo (filehandle,idx,name,nelem,l_name) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: idx !< index of the attribute to query (starting from 0) character(kind=c_char), dimension(1), intent(out) :: name !< buffer to read the attribute name into integer(kind=c_int64_t), intent(out) :: nelem !< number of elements in the attribute's array integer(kind=c_int64_t), intent(in) :: l_name !< number of elements in the attribute's array end function integer(kind=c_int64_t) function h5ptc_writestepattrib_r8 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readstepattrib_r8 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(out) :: data(*) !< buffer to read value into end function integer(kind=c_int64_t) function h5ptc_writestepattrib_r4 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readstepattrib_r4 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(out) :: data(*) !< buffer to read value into end function integer(kind=c_int64_t) function h5ptc_writestepattrib_i8 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readstepattrib_i8 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(out) :: data(*) !< buffer to read value into end function integer(kind=c_int64_t) function h5ptc_writestepattrib_i4 ( filehandle, name, data, nelem) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array end function integer(kind=c_int64_t) function h5ptc_readstepattrib_i4 ( filehandle, name, data ) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(out) :: data(*) !< buffer to read value into end function ! ! read/write string ! integer(kind=c_int64_t) function h5ptc_writestepattrib_string (filehandle,name,value) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute character(kind=c_char), dimension(1), intent(in) :: value !< the string value to store end function integer(kind=c_int64_t) function h5ptc_readstepattrib_string (filehandle,name,value) bind(C) import integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(kind=c_char), dimension(1), intent(in) :: name !< the name of the attribute character(kind=c_char), dimension(1), intent(out) :: value !< buffer to read the string value into end function end interface contains !--------------------------------------------------------------------------- ! ! wrappers for functions with string arguments: ! converts strings into C strings ! !--------------------------------------------------------------------------- ! ! file attributes ! integer(kind=c_int64_t) function h5pt_getfileattribinfo (filehandle,idx,name,nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: idx !< index of the attribute to query (starting from 0) character(len=*), intent(out) :: name !< buffer to read the attribute name into integer(kind=c_int64_t), intent(out) :: nelem !< number of elements in the attribute's array integer(kind=c_int64_t) :: l_name !< size of name l_name = len(name) h5pt_getfileattribinfo = h5ptc_getfileattribinfo (filehandle,idx,name,nelem,l_name) name = fstring(name) end function integer(kind=c_int64_t) function h5pt_writefileattrib_r8 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writefileattrib_r8 = h5ptc_writefileattrib_r8 ( filehandle, cstring(name), data, nelem) end function h5pt_writefileattrib_r8 integer(kind=c_int64_t) function h5pt_readfileattrib_r8 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(out) :: data(*) !< buffer to read value into h5pt_readfileattrib_r8 = h5ptc_readfileattrib_r8 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_writefileattrib_r4 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writefileattrib_r4 = h5ptc_writefileattrib_r4( filehandle, cstring(name), data, nelem) end function integer(kind=c_int64_t) function h5pt_readfileattrib_r4 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(out) :: data(*) !< buffer to read value into h5pt_readfileattrib_r4 = h5ptc_readfileattrib_r4( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_writefileattrib_i8 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writefileattrib_i8 = h5ptc_writefileattrib_i8( filehandle, cstring(name), data, nelem) end function integer(kind=c_int64_t) function h5pt_readfileattrib_i8 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(out) :: data(*) !< buffer to read value into h5pt_readfileattrib_i8 = h5ptc_readfileattrib_i8( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_writefileattrib_i4 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writefileattrib_i4 = h5ptc_writefileattrib_i4( filehandle, cstring(name), data, nelem) end function integer(kind=c_int64_t) function h5pt_readfileattrib_i4 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(out) :: data(*) !< buffer to read value into h5pt_readfileattrib_i4 = h5ptc_readfileattrib_i4 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_writefileattrib_string ( filehandle, name, value) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the attribute character(len=*), intent(in) :: value !< the string value to store h5pt_writefileattrib_string = h5ptc_writefileattrib_string ( filehandle, cstring(name), cstring(value)) end function integer(kind=c_int64_t) function h5pt_readfileattrib_string ( filehandle, name, value) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the attribute character(len=*), intent(out) :: value !< buffer to read the string value into h5pt_readfileattrib_string = h5ptc_readfileattrib_string ( filehandle, cstring(name), value) value = fstring(value) end function ! ! step attributes: ! integer(kind=c_int64_t) function h5pt_getstepattribinfo (filehandle,idx,name,nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open integer(kind=c_int64_t), intent(in) :: idx !< index of the attribute to query (starting from 0) character(len=*), intent(out) :: name !< buffer to read the attribute name into integer(kind=c_int64_t), intent(out) :: nelem !< number of elements in the attribute's array integer(kind=c_int64_t) :: l_name !< number of elements in the attribute's array l_name = len(name) h5pt_getstepattribinfo = h5ptc_getstepattribinfo (filehandle,idx,name,nelem,l_name) name = fstring(name) end function integer(kind=c_int64_t) function h5pt_writestepattrib_r8 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writestepattrib_r8 = h5ptc_writestepattrib_r8 ( filehandle, cstring(name), data, nelem) end function integer(kind=c_int64_t) function h5pt_readstepattrib_r8 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_double), intent(out) :: data(*) !< buffer to read value into h5pt_readstepattrib_r8 = h5ptc_readstepattrib_r8 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_writestepattrib_r4 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writestepattrib_r4 = h5ptc_writestepattrib_r4 ( filehandle, cstring(name), data, nelem) end function integer(kind=c_int64_t) function h5pt_readstepattrib_r4 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute real(kind=c_float), intent(out) :: data(*) !< buffer to read value into h5pt_readstepattrib_r4 = h5ptc_readstepattrib_r4 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_writestepattrib_i8 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writestepattrib_i8 = h5ptc_writestepattrib_i8 ( filehandle, cstring(name), data, nelem) end function integer(kind=c_int64_t) function h5pt_readstepattrib_i8 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int64_t), intent(out) :: data(*) !< buffer to read value into h5pt_readstepattrib_i8 = h5ptc_readstepattrib_i8 ( filehandle, cstring(name), data ) end function integer(kind=c_int64_t) function h5pt_writestepattrib_i4 ( filehandle, name, data, nelem) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(in) :: data(*) !< the array of data to write into the attribute integer(kind=c_int64_t), intent(in) :: nelem !< the number of elements in the array h5pt_writestepattrib_i4 = h5ptc_writestepattrib_i4 ( filehandle, cstring(name), data, nelem) end function integer(kind=c_int64_t) function h5pt_readstepattrib_i4 ( filehandle, name, data ) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned at file open character(len=*), intent(in) :: name !< the name of the attribute integer(kind=c_int), intent(out) :: data(*) !< buffer to read value into h5pt_readstepattrib_i4 = h5ptc_readstepattrib_i4 ( filehandle, cstring(name), data ) end function ! ! read/write string ! integer(kind=c_int64_t) function h5pt_writestepattrib_string ( filehandle, name, value) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the attribute character(len=*), intent(in) :: value !< the string value to store h5pt_writestepattrib_string = h5ptc_writestepattrib_string ( filehandle, cstring(name), cstring(value)) end function integer(kind=c_int64_t) function h5pt_readstepattrib_string ( filehandle, name, value) implicit none integer(kind=c_int64_t), intent(in) :: filehandle !< the handle returned during file open character(len=*), intent(in) :: name !< the name of the attribute character(len=*), intent(out) :: value !< buffer to read the string value into h5pt_readstepattrib_string = h5ptc_readstepattrib_string ( filehandle, cstring(name), value) value = fstring(value) end function !--------------------------------------------------------------------------- ! ! function to safely convert a string to c format (ie. with a terminating ! ascii null character) ! !--------------------------------------------------------------------------- function cstring(string) implicit none character(len=*), intent(in) :: string character(len=len(string)+1) :: cstring cstring = trim(string)//char(0) end function cstring !--------------------------------------------------------------------------- ! ! function to safely convert a string from c format (ie. with a terminating ! ascii null character) back to a normal Fortran string ! !--------------------------------------------------------------------------- function fstring(string) implicit none character(len=*), intent(in) :: string !< the name of the dataset character(len=len(string)) :: fstring integer :: idx idx = index(string,char(0)) if (idx.gt.1) then fstring = string(1:idx-1) else fstring = '' endif end function fstring end module h5partattrib danieljprice-splash-4d1f09c/src/H5Part/H5PartAttribF.c000066400000000000000000000161221477365367100225110ustar00rootroot00000000000000/* * This is my modified H5PartAttribF.c for use in SPLASH * Main changes are that the strings are now passed * directly from Fortran, already with the null character appended * * Modified from the original H5Part Fortran interface * by Daniel Price 08/04/10 */ #include "H5Part.h" h5part_int64_t h5ptc_writefileattrib_r8 ( h5part_int64_t *f, const char *name, const h5part_float64_t *data, const h5part_float64_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteFileAttrib ( filehandle, name, H5PART_FLOAT64, data, *nelem); return herr; } h5part_int64_t h5ptc_readfileattrib_r8 ( h5part_int64_t *f, const char *name, const h5part_float64_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadFileAttrib ( filehandle, name, (void*)data); return herr; } h5part_int64_t h5ptc_writefileattrib_r4 ( h5part_int64_t *f, const char *name, const h5part_float32_t *data, const h5part_float32_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteFileAttrib ( filehandle, name, H5PART_FLOAT32, data, *nelem); return herr; } h5part_int64_t h5ptc_readfileattrib_r4 ( h5part_int64_t *f, const char *name, const h5part_float32_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadFileAttrib ( filehandle, name, (void*)data); return herr; } h5part_int64_t h5ptc_writefileattrib_i8 ( h5part_int64_t *f, const char *name, const h5part_int64_t *data, const h5part_int64_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteFileAttrib ( filehandle, name, H5PART_INT64, data, *nelem); return herr; } h5part_int64_t h5ptc_readfileattrib_i8 ( h5part_int64_t *f, const char *name, const h5part_int64_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadFileAttrib ( filehandle, name, (void*)data); return herr; } h5part_int64_t h5ptc_writefileattrib_i4 ( h5part_int64_t *f, const char *name, const h5part_int32_t *data, const h5part_int32_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteFileAttrib ( filehandle, name, H5PART_INT32, data, *nelem); return herr; } h5part_int64_t h5ptc_readfileattrib_i4 ( h5part_int64_t *f, const char *name, const h5part_int32_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadFileAttrib ( filehandle, name, (void*)data); return herr; } h5part_int64_t h5ptc_writestepattrib_r8 ( h5part_int64_t *f, const char *name, const h5part_float64_t *data, const h5part_float64_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteStepAttrib ( filehandle, name, H5PART_FLOAT64, data, *nelem); return herr; } h5part_int64_t h5ptc_readstepattrib_r8 ( h5part_int64_t *f, const char *name, const h5part_float64_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadStepAttrib ( filehandle, name, (void*)data); return herr; } h5part_int64_t h5ptc_writestepattrib_r4 ( h5part_int64_t *f, const char *name, const h5part_float32_t *data, const h5part_float32_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteStepAttrib ( filehandle, name, H5PART_FLOAT32, data, *nelem); return herr; } h5part_int64_t h5ptc_readstepattrib_r4 ( h5part_int64_t *f, const char *name, const h5part_float32_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadStepAttrib ( filehandle, name, (void*)data); return herr; } h5part_int64_t h5ptc_writestepattrib_i8 ( h5part_int64_t *f, const char *name, const h5part_int64_t *data, const h5part_int64_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteStepAttrib ( filehandle, name, H5PART_INT64, data, *nelem); return herr; } h5part_int64_t h5ptc_readstepattrib_i8 ( h5part_int64_t *f, const char *name, const h5part_int64_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadStepAttrib ( filehandle, name, (void*)data); return herr; } h5part_int64_t h5ptc_writestepattrib_i4 ( h5part_int64_t *f, const char *name, const h5part_int32_t *data, const h5part_int32_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteStepAttrib ( filehandle, name, H5PART_INT32, data, *nelem); return herr; } h5part_int64_t h5ptc_readstepattrib_i4 ( h5part_int64_t *f, const char *name, const h5part_int32_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadStepAttrib ( filehandle, name, (void*)data); return herr; } /*=================== Attributes ================*/ h5part_int64_t h5ptc_writefileattrib_string ( const h5part_int64_t *f, const char *attrib_name, const char *attrib_value ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteFileAttribString ( filehandle, attrib_name, attrib_value ); return herr; } h5part_int64_t h5ptc_writestepattrib_string ( const h5part_int64_t *f, const char *attrib_name, const char *attrib_value ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteStepAttribString ( filehandle, attrib_name, attrib_value ); return herr; } /* Reading attributes ************************* */ h5part_int64_t h5ptc_getnstepattribs ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartGetNumStepAttribs ( filehandle ); } h5part_int64_t h5ptc_getnfileattribs ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartGetNumFileAttribs ( filehandle ); } h5part_int64_t h5ptc_getstepattribinfo ( const h5part_int64_t *f, const h5part_int64_t *idx, char *name, h5part_int64_t *nelem, const h5part_int64_t *l_name ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t type; h5part_int64_t herr = H5PartGetStepAttribInfo ( filehandle, *idx, name, *l_name, &type, nelem); return herr; } h5part_int64_t h5ptc_getfileattribinfo ( const h5part_int64_t *f, const h5part_int64_t *idx, char *name, h5part_int64_t *nelem, const h5part_int64_t *l_name ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t type; h5part_int64_t herr = H5PartGetFileAttribInfo ( filehandle, *idx, name, *l_name, &type, nelem); return herr; } h5part_int64_t h5ptc_readstepattrib_string ( const h5part_int64_t *f, const char *attrib_name, char *attrib_value ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadStepAttrib ( filehandle, attrib_name, attrib_value ); return herr; } h5part_int64_t h5ptc_readfileattrib_string ( const h5part_int64_t *f, const char *attrib_name, char *attrib_value ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadFileAttrib ( filehandle, attrib_name, attrib_value ); return herr; } danieljprice-splash-4d1f09c/src/H5Part/H5PartF.c000066400000000000000000000234101477365367100213410ustar00rootroot00000000000000/* * This is my modified H5PartF.c for use in SPLASH * Main changes are that the strings are now passed * directly from Fortran, already with the null character appended * * Modified from the original H5Part Fortran interface * by Daniel Price 08/04/10 */ #include "H5Part.h" #include char _H5Part_flagsfor2c ( char * flags ) { char fbits = 0x00; flags = strtok ( flags, "," ); while ( flags != NULL ) { if ( strcmp ( flags, "vfd_mpiposix" ) == 0 ) fbits |= H5PART_VFD_MPIPOSIX; else if ( strcmp ( flags, "fs_lustre" ) == 0 ) fbits |= H5PART_FS_LUSTRE; flags = strtok ( NULL, "," ); } return fbits; } /* open/close interface */ h5part_int64_t h5ptc_openr ( const char *file_name ) { H5PartFile* f = H5PartOpenFile ( file_name, H5PART_READ ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_openw ( const char *file_name ) { H5PartFile* f = H5PartOpenFile ( file_name, H5PART_WRITE ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_opena ( const char *file_name ) { H5PartFile* f = H5PartOpenFile ( file_name, H5PART_APPEND ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_openr_align ( const char *file_name, const h5part_int64_t *align ) { H5PartFile* f = H5PartOpenFileAlign ( file_name, H5PART_READ, *align ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_openw_align ( const char *file_name, const h5part_int64_t *align ) { H5PartFile* f = H5PartOpenFileAlign ( file_name, H5PART_WRITE, *align ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_opena_align ( const char *file_name, const h5part_int64_t *align ) { H5PartFile* f = H5PartOpenFileAlign ( file_name, H5PART_APPEND, *align ); return (h5part_int64_t)(size_t)f; } #ifdef PARALLEL_IO h5part_int64_t h5ptc_openr_par ( const char *file_name, MPI_Fint *fcomm ) { MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); H5PartFile* f = H5PartOpenFileParallel ( file_name, H5PART_READ, ccomm ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_openw_par ( const char *file_name, MPI_Fint *fcomm ) { MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); H5PartFile* f = H5PartOpenFileParallel ( file_name, H5PART_WRITE, ccomm ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_opena_par ( const char *file_name, MPI_Fint *fcomm ) { MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); H5PartFile* f = H5PartOpenFileParallel ( file_name, H5PART_APPEND, ccomm ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_openr_par_align ( const char *file_name, MPI_Fint *fcomm, const h5part_int64_t *align ) { MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); H5PartFile* f = H5PartOpenFileParallelAlign ( file_name, H5PART_READ, ccomm, *align ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_openw_par_align ( const char *file_name, MPI_Fint *fcomm, const h5part_int64_t *align, const char *flags ) { MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); char fbits = H5PART_WRITE | _H5Part_flagsfor2c ( flags ); H5PartFile* f = H5PartOpenFileParallelAlign ( file_name, fbits, ccomm, *align ); return (h5part_int64_t)(size_t)f; } h5part_int64_t h5ptc_opena_par_align ( const char *file_name, MPI_Fint *fcomm, const h5part_int64_t *align, const char *flags ) { MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); char fbits = H5PART_APPEND | _H5Part_flagsfor2c ( flags ); H5PartFile* f = H5PartOpenFileParallelAlign ( file_name, fbits, ccomm, *align ); return (h5part_int64_t)(size_t)f; } #endif h5part_int64_t h5ptc_close ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartCloseFile ( filehandle ); } /*==============Writing and Setting Dataset info========*/ h5part_int64_t h5ptc_readstep ( const h5part_int64_t *f, const h5part_int64_t *step, h5part_float64_t *x, h5part_float64_t *y, h5part_float64_t *z, h5part_float64_t *px, h5part_float64_t *py, h5part_float64_t *pz, h5part_int64_t *id ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartReadParticleStep ( filehandle,(*step)-1,x,y,z,px,py,pz,id); } h5part_int64_t h5ptc_setnpoints ( const h5part_int64_t *f, h5part_int64_t *np ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartSetNumParticles ( filehandle, *np ); } h5part_int64_t h5ptc_setnpoints_strided ( const h5part_int64_t *f, h5part_int64_t *np, h5part_int64_t *stride ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartSetNumParticlesStrided ( filehandle, *np, *stride ); } h5part_int64_t h5ptc_setstep ( const h5part_int64_t *f, h5part_int64_t *step ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartSetStep ( filehandle, (*step)-1 ); } h5part_int64_t h5ptc_writedata_r8 ( const h5part_int64_t *f, const char *name, const h5part_float64_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteDataFloat64 ( filehandle, name, data ); return herr; } h5part_int64_t h5ptc_writedata_r4 ( const h5part_int64_t *f, const char *name, const h5part_float32_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteDataFloat32 ( filehandle, name, data ); return herr; } h5part_int64_t h5ptc_writedata_i8 ( const h5part_int64_t *f, const char *name, const h5part_int64_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteDataInt64 ( filehandle, name, data ); return herr; } h5part_int64_t h5ptc_writedata_i4 ( const h5part_int64_t *f, const char *name, const h5part_int32_t *data ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartWriteDataInt32 ( filehandle, name, data ); return herr; } /*==============Reading Data Characteristics============*/ h5part_int64_t h5ptc_getnsteps ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartGetNumSteps ( filehandle ); } h5part_int64_t h5ptc_getndatasets ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartGetNumDatasets ( filehandle ); } h5part_int64_t h5ptc_getnpoints ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartGetNumParticles ( filehandle ); } h5part_int64_t h5ptc_getdatasetname ( const h5part_int64_t *f, const h5part_int64_t *index, char *name, const int l_name ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartGetDatasetName ( filehandle, *index, name, l_name ); return herr; } h5part_int64_t h5ptc_getdatasetinfo ( const h5part_int64_t *f, const h5part_int64_t *index, char *name, h5part_int64_t *type, h5part_int64_t *nelem, const h5part_int64_t *l_name ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t type_tmp; h5part_int64_t herr = H5PartGetDatasetInfo ( filehandle, *index, name, *l_name, &type_tmp, nelem ); if (type_tmp == H5PART_INT64) { *type = 1; } else if (type_tmp == H5PART_INT32) { *type = 2; } else if (type_tmp == H5PART_FLOAT64) { *type = 3; } else if (type_tmp == H5PART_FLOAT32) { *type = 4; } else if (type_tmp == H5PART_CHAR) { *type = 5; } else if (type_tmp == H5PART_STRING) { *type = 6; } else { *type = 0; } return herr; } /*=============Setting and getting views================*/ h5part_int64_t h5ptc_setview ( const h5part_int64_t *f, const h5part_int64_t *start, const h5part_int64_t *end ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartSetView ( filehandle, *start, *end ); } h5part_int64_t h5ptc_setview_indices ( const h5part_int64_t *f, const h5part_int64_t *indices, const h5part_int64_t *nelem ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartSetViewIndices ( filehandle, indices, *nelem ); } h5part_int64_t h5ptc_resetview ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartResetView ( filehandle ); } h5part_int64_t h5ptc_hasview ( const h5part_int64_t *f ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartHasView ( filehandle ); } h5part_int64_t h5ptc_getview ( const h5part_int64_t *f, h5part_int64_t *start, h5part_int64_t *end ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; return H5PartGetView ( filehandle, start, end); } /*==================Reading data ============*/ h5part_int64_t h5ptc_readdata_r8 ( const h5part_int64_t *f, const char *name, h5part_float64_t *array ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadDataFloat64 ( filehandle, name, array ); return herr; } h5part_int64_t h5ptc_readdata_r4 ( const h5part_int64_t *f, const char *name, h5part_float32_t *array ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadDataFloat32 ( filehandle, name, array ); return herr; } h5part_int64_t h5ptc_readdata_i8 ( const h5part_int64_t *f, const char *name, h5part_int64_t *array ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadDataInt64 ( filehandle, name, array ); return herr; } h5part_int64_t h5ptc_readdata_i4 ( const h5part_int64_t *f, const char *name, h5part_int32_t *array ) { H5PartFile *filehandle = (H5PartFile*)(size_t)*f; h5part_int64_t herr = H5PartReadDataInt32 ( filehandle, name, array ); return herr; } /* h5part_int64_t h5ptc_set_verbosity_level ( const h5part_int64_t *level ) { return H5PartSetVerbosityLevel ( *level ); } */ danieljprice-splash-4d1f09c/src/H5Part/README000066400000000000000000000031641477365367100206500ustar00rootroot00000000000000Website: http://vis.lbl.gov/Research/AcceleratorSAPP/ Particle based simulations of accelerator beam-lines, especially in six dimensional phase space, generate vast amounts of data. Even though a subset of statistical information regarding phase space or analysis needs to be preserved, reading and writing such enormous restart files on massively parallel supercomputing systems remains challenging. H5Part is a very simple data storage schema and provides an API that simplifies the reading/writing of the data to the HDF5 file format. An important foundation for a stable visualization and data analysis environment is a stable and portable file storage format and its associated APIs. The presence of a "common file storage format," including associated APIs, will help foster a fundamental level of interoperability across the project's software infrastructure. It will also help ensure that key data analysis capabilities are present during the earliest phases of the software development effort. H5Part is built on top of the HDF5 (Hierarchical Data Format). HDF5 offers a self-describing machine-independent binary file format that supports scalable parallel I/O performance for MPI codes on a variety of supercomputing systems, and works equally well on laptop computers. The API is available for C, C++, and Fortran codes. The H5Part file format and APIs enable disparate research groups with different simulation implementations to transparently share datasets and data analysis tools. For instance, the common file format will enable groups that depend on completely different simulation implementations to share data analysis tools. danieljprice-splash-4d1f09c/src/adjust_data.f90000066400000000000000000000504241477365367100214710ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2022 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module adjustdata implicit none contains !---------------------------------------------------- ! ! specify data dependencies for adjust data ! procedures to ensure required quantities ! are read from the data file ! !---------------------------------------------------- subroutine get_adjust_data_dependencies(required) use labels, only:idustfrac,irho,ivx,ideltav use settings_data, only:ndimV,UseFakeDustParticles logical, intent(inout) :: required(0:) integer :: i ! if making fake dust particles, read epsilon and deltav if (idustfrac > 0 .and. irho > 0 .and. UseFakeDustParticles) then if (required(irho)) required(idustfrac) = .true. if (ideltav > 0) then do i=ivx,ivx+ndimV-1 if (required(i)) required(ideltav+i-ivx) = .true. enddo if (any(required(ivx:ivx+ndimV-1))) required(idustfrac) = .true. endif endif end subroutine get_adjust_data_dependencies !---------------------------------------------------- ! ! amend data after the data read based on ! various environment variable settings ! ! must be called AFTER the data has been read ! but BEFORE rescaling to physical units is applied ! !---------------------------------------------------- subroutine adjust_data_codeunits use system_utils, only:renvironment,envlist,ienvironment,lenvironment,ienvlist,& ienvstring,get_environment_or_flag,get_command_flag use labels, only:ih,ix,ivx,get_sink_type,ipmass,idustfrac,irho,labeltype,label use settings_data, only:ncolumns,ndimV,ndim,ntypes,iverbose,UseFakeDustParticles,& UseFastRender,icoords,track_string use particle_data, only:dat,npartoftype,iamtype use filenames, only:ifileopen,nstepsinfile use geometry, only:labelcoord use part_utils, only:locate_first_two_of_type,locate_nth_particle_of_type,& locate_particle_from_string,get_binary,got_particles_of_type real :: hmin,dphi,domega,period real, dimension(3) :: x0,v0 integer :: i,j,ierr,isink,isinkpos,itype,nlist,nerr integer :: ntot,isink1,isink2,isinklist(2),iorigin logical :: centreonsink,dontCentreVelocity,got_sinks,no_dust_particles character(len=20), dimension(3) :: list character(len=30) :: string ! !--environment variable setting to enforce a minimum h ! if (ih > 0 .and. ih <= ncolumns) then hmin = max(renvironment('SPLASH_HMIN_CODEUNITS',errval=-1.),& ! for backwards compatibility renvironment('SPLASH_BEAM',errval=-1.)) if (hmin > 0.) then if (.not.allocated(dat)) then print*,' INTERNAL ERROR: dat not allocated in adjust_data_codeunits' return endif print "(/,a,es10.3)",' >> SETTING MINIMUM H TO ',hmin where (dat(:,ih,:) < hmin .and. dat(:,ih,:) > 0.) dat(:,ih,:) = hmin end where print "(a)",' >> Switching accelerated rendering ON' UseFastRender = .true. endif endif if (ndim > 0) then ! !--environment variable to corotate with first two sink particles ! can be SPLASH_COROTATE=true (just picks first two sinks) ! or SPLASH_COROTATE=1,3 ! isinklist = ienvlist('SPLASH_COROTATE',2) got_sinks = all(isinklist > 0) if (lenvironment('SPLASH_COROTATE') .or. got_sinks) then itype = get_sink_type(ntypes) if (itype > 0) then if (all(npartoftype(itype,:) < 2)) then print "(a)",' ERROR: --corotate set but less than 2 sink particles' else if (iverbose >= 1) print* if (got_sinks) then print "(a,i3,a,i3,a)",' :: COROTATING FRAME WITH SINKS ',isinklist(1),& ', ',isinklist(2),' from --corotate flag' else print "(a)",' :: COROTATING FRAME WITH FIRST 2 SINKS from --corotate flag' endif do j=1,nstepsinfile(ifileopen) if (got_sinks) then call locate_nth_particle_of_type(isinklist(1),isink1,itype,iamtype(:,j),npartoftype(:,j),ntot) call locate_nth_particle_of_type(isinklist(2),isink2,itype,iamtype(:,j),npartoftype(:,j),ntot) else ! find first two sink particles in the data call locate_first_two_of_type(isink1,isink2,itype,iamtype(:,j),npartoftype(:,j),ntot) endif ! get properties of the binary call get_binary(isink1,isink2,dat(:,:,j),x0,v0,dphi,domega,ndim,ndimV,ncolumns,ix,ivx,ipmass,iverbose,ierr) ! rotate all the particles into this frame if (ierr==0) call rotate_particles(dat(:,:,j),ntot,dphi,domega,x0(1:ndim),ndim,ndimV,v0) enddo endif else print "(a,/,a)",' ERROR: --corotate set but could not determine type ', & ' corresponding to sink particles' endif endif ! !--environment variable setting to centre plots on a selected sink particle ! !--can specify either just "true" for sink #1, or specify a number for a particular sink centreonsink = lenvironment('SPLASH_CENTRE_ON_SINK') .or. lenvironment('SPLASH_CENTER_ON_SINK') isink = max(ienvironment('SPLASH_CENTRE_ON_SINK'),ienvironment('SPLASH_CENTER_ON_SINK')) dontCentreVelocity = lenvironment('SPLASH_DONTCENTREVEL') .or. lenvironment('SPLASH_DONTCENTERVEL') if (isink > 0 .or. centreonsink .and. all(ix(1:ndim) > 0)) then if (isink==0) isink = 1 itype = get_sink_type(ntypes) if (itype > 0) then if (all(npartoftype(itype,:) < isink)) then print "(a,i10,a)",' ERROR: --sink = ',isink,' but not enough sink particles' else if (iverbose >= 1) print* if (isink < 10) then print "(a,i1,a)",' :: CENTREING ON SINK ',isink,' from --sink flag' else print "(a,i3,a)",' :: CENTREING ON SINK ',isink,' from --sink flag' endif if (dontCentreVelocity) print "(a)",' :: NOT CENTREING VELOCITY' do j=1,nstepsinfile(ifileopen) call locate_nth_particle_of_type(isink,isinkpos,itype,iamtype(:,j),npartoftype(:,j),ntot) call centre_on_particle(isinkpos,dat(:,:,j),ntot,ndim,ndimV,ncolumns,dontCentreVelocity,iverbose,label='sink') enddo endif else print "(a,/,a)",' ERROR: --sink set but could not determine type ', & ' corresponding to sink particles' endif endif ! !--center on a particular particle ! call get_environment_or_flag('SPLASH_ORIGIN',string) iorigin = ienvstring(string) ! first try to read the string as an integer if (iorigin > 0 .or. (len_trim(string) > 0) .and. all(ix(1:ndim) > 0) .and. ndim > 0) then if (track_string(1:1) /= '0' .and. len_trim(track_string) > 0) then print "(/,a,/)",' ERROR: cannot use --track and --origin at the same time, disabling particle tracking' track_string = '0' endif if (centreonsink) then print "(/,a,/)",' ERROR: cannot use --sink and --origin at the same time' else do j=1,nstepsinfile(ifileopen) ! !--handle strings like --origin=maxdens to locate the particle for the origin ! ntot = sum(npartoftype(:,j)) if (len_trim(string) > 0 .and. iorigin==0) then iorigin = locate_particle_from_string(string,ntot,dat(:,:,j),irho) if (iorigin <= 0) exit ! quit loop over steps endif if (j==1 .or. ienvstring(string) == 0) then print "(a,i0,a)",' :: CENTREING ON PARTICLE ',iorigin,' from --origin='//trim(string)//' flag' if (dontCentreVelocity) print "(a)",' :: NOT CENTREING VELOCITY' endif ! !--now centre on the chosen particle ! call centre_on_particle(iorigin,dat(:,:,j),ntot,ndim,ndimV,ncolumns,dontCentreVelocity,iverbose,label='') enddo endif endif ! !--environment variable setting to subtract a mean velocity ! if (ivx > 0 .and. ivx+ndimV-1 <= ncolumns) then call envlist('SPLASH_VZERO',nlist,list) nerr = 0 if (nlist > 0 .and. nlist < ndimV) then print "(/,2(a,i1))",' >> ERROR in --vzero setting: number of components = ',nlist,', needs to be ',ndimV nerr = 1 elseif (nlist > 0) then if (nlist > ndimV) print "(a,i1,a,i1)",' >> WARNING! --vzero setting has ',nlist, & ' components: using only first ',ndimV nerr = 0 do i=1,ndimV read(list(i),*,iostat=ierr) v0(i) if (ierr /= 0) then print "(a)",' >> ERROR reading v'//trim(labelcoord(i,icoords))//& ' component from --vzero setting' nerr = ierr endif enddo if (nerr==0) then print "(a)",' >> SUBTRACTING MEAN VELOCITY (from --vzero setting):' if (.not.allocated(dat) .or. size(dat(1,:,1)) < ivx+ndimV-1) then print*,' INTERNAL ERROR: dat not allocated in adjust_data_codeunits' return endif do i=1,ndimV print "(4x,a,es10.3)",trim(label(ivx+i-1))//' = '//trim(label(ivx+i-1))//' - ',v0(i) dat(:,ivx+i-1,:) = dat(:,ivx+i-1,:) - v0(i) enddo endif endif if (nerr /= 0) then print "(4x,a)",'WARNING: --vzero setting ignored' endif endif endif ! !--fake a set of dust particles from the one-fluid dust formulation ! no_dust_particles = .not.got_particles_of_type('dust',labeltype,npartoftype) if (idustfrac > 0 .and. irho > 0 .and. no_dust_particles) then if (UseFakeDustParticles) then call fake_twofluids(1,nstepsinfile(ifileopen),ndim,ndimV,dat,npartoftype,iamtype) elseif (iverbose >= 1) then print "(a)",' One fluid dust: set option in d) menu to make fake dust particles' endif endif ! !--phase fold column 1 with a given period ! period = renvironment('SPLASH_PHASEFOLD') if (period > 0.) then print "(a,es10.3)",' PHASE FOLDING column 1 with period of ',period dat(:,1,1) = dat(:,1,1) - period*int(dat(:,1,1)/period) endif end subroutine adjust_data_codeunits !----------------------------------------------------------------- ! routine to rotate particles with a given cylindrical angle dphi !----------------------------------------------------------------- pure subroutine rotate_particles(dat,np,dphi,domega,x0,ndim,ndimV,v0) use labels, only:ix,ivx integer, intent(in) :: np,ndim,ndimV real, intent(in) :: dphi,domega real, dimension(:,:), intent(inout) :: dat real, dimension(ndim), intent(in) :: x0 real, dimension(ndimV), intent(in) :: v0 real, dimension(ndim) :: xi real, dimension(ndimV) :: vi real :: r,phi,xnew,ynew,cosp,sinp,vr,vphi integer :: i !--rotate positions do i=1,np xi = dat(i,ix(1:ndim)) - x0(1:ndim) r = sqrt(xi(1)**2 + xi(2)**2) phi = atan2(xi(2),xi(1)) phi = phi + dphi cosp = cos(phi) sinp = sin(phi) xnew = r*cosp ynew = r*sinp dat(i,ix(1)) = xnew dat(i,ix(2)) = ynew !--rotate velocities, if present if (ivx > 0) then vi = dat(i,ivx:ivx+ndimV-1) - v0 vr = vi(1)*xi(1)/r + vi(2)*xi(2)/r vphi = (vi(1)*(-xi(2)/r) + vi(2)*xi(1)/r) !- r*domega dat(i,ivx) = vr*cosp - vphi*sinp dat(i,ivx+1) = vr*sinp + vphi*cosp endif enddo end subroutine rotate_particles !------------------------------------------------------ ! routine to centre particle positions and velocities ! on a particle location !------------------------------------------------------ subroutine centre_on_particle(ipart,dat,np,ndim,ndimV,ncol,dontCentreVelocity,iverbose,label) use labels, only:ix,ivx integer, intent(in) :: ipart,np,ndim,ndimV,ncol,iverbose logical, intent(in) :: dontCentreVelocity real, dimension(:,:), intent(inout) :: dat real, dimension(ndim) :: x0 real, dimension(ndimV) :: v0 character(len=*), intent(in) :: label !--sanity check inputs if (ipart <= 0) then print "(a)",' ERROR: could not locate '//trim(label)//' particle in dat array' return endif if (ipart > np .or. ipart > size(dat(:,1))) then print "(/,a,/)",' ERROR: '//trim(label)//' particle number exceeds number of particles' return ! skip if iorigin > npart endif !--make positions relative to chosen particle x0(1:ndim) = dat(ipart,ix(1:ndim)) if (iverbose >= 1) print "(a,3(1x,es10.3))",' :: '//trim(label)//' position =',x0(1:ndim) !--make velocities relative to origin particle if ((ivx > 0 .and. ivx+ndimV-1 <= ncol) .and. (.not. dontCentreVelocity)) then v0(1:ndimV) = dat(ipart,ivx:ivx+ndimV-1) if (iverbose >= 1) print "(a,3(1x,es10.3))",' :: '//trim(label)//' velocity =',v0(1:ndimV) else v0 = 0. endif call shift_particles(dat(:,:),np,ndim,ndimV,ncol,x0,v0) end subroutine centre_on_particle !------------------------------------------------------ ! routine to shift particle positions and velocities ! to new location !------------------------------------------------------ pure subroutine shift_particles(dat,np,ndim,ndimV,ncol,x0,v0) integer, intent(in) :: np,ndim,ndimV,ncol real, dimension(:,:), intent(inout) :: dat real, dimension(ndim), intent(in) :: x0 real, dimension(ndimV), intent(in) :: v0 call shift_positions(dat,np,ndim,x0) call shift_velocities(dat,np,ndimV,ncol,v0) end subroutine shift_particles !------------------------------------------------------ ! routine to shift particle positions to new location !------------------------------------------------------ pure subroutine shift_positions(dat,np,ndim,x0) use labels, only:ix integer, intent(in) :: np,ndim real, dimension(:,:), intent(inout) :: dat real, dimension(ndim), intent(in) :: x0 integer :: icol !--shift positions do icol=1,ndim dat(1:np,ix(icol)) = dat(1:np,ix(icol)) - x0(icol) enddo end subroutine shift_positions !------------------------------------------------------ ! routine to shift particle velocities by constant !------------------------------------------------------ pure subroutine shift_velocities(dat,np,ndimV,ncol,v0) use labels, only:ivx integer, intent(in) :: np,ndimV,ncol real, dimension(:,:), intent(inout) :: dat real, dimension(ndimV), intent(in) :: v0 integer :: icol !--make velocities relative to sink particle if (ivx > 0 .and. ivx+ndimV-1 <= ncol) then do icol=1,ndimV dat(1:np,ivx+icol-1) = dat(1:np,ivx+icol-1) - v0(icol) enddo endif end subroutine shift_velocities !------------------------------------------------------ ! ! routine to fake a set of dust particles from ! the one fluid dust method ! !------------------------------------------------------ subroutine fake_twofluids(istart,iend,ndim,ndimV,dat,npartoftype,iamtype) use params, only:int1 use labels, only:idustfrac,irho,ix,ih,ipmass,ivx,ideltav use mem_allocation, only:alloc use particle_data, only:maxpart,maxstep,maxcol use settings_data, only:iverbose,ndusttypes,idustfrac_plot,ideltav_plot integer, intent(in) :: istart,iend,ndim,ndimV real, dimension(:,:,:), intent(inout), allocatable :: dat integer, dimension(:,:), intent(inout), allocatable :: npartoftype integer(int1), dimension(:,:), intent(inout), allocatable :: iamtype integer :: ndust,jdust,ntoti,i,j integer :: idustfrac_temp,ideltav_temp real :: rhodust,rhogas,rhotot,dustfraci,gasfraci,pmassgas,pmassdust,pmassj real, dimension(ndimV) :: veli,vgas,vdust,deltav logical :: use_vels if (idustfrac > 0 .and. irho > 0) then ! !--determine which dust fraction is being used to create the fake dust particles ! !if (iverbose >= 0) print*,' got dustfrac in column ',idustfrac if (ndusttypes>1) then if (idustfrac_plot == 0 ) then idustfrac_temp = idustfrac idustfrac_plot = idustfrac_plot ideltav_temp = ideltav ideltav_plot = ideltav else idustfrac_temp = idustfrac_plot ideltav_temp = ideltav_plot endif else idustfrac_temp = idustfrac ideltav_temp = ideltav endif ! !--create explicit dust phase from gas and one-fluid dust properties ! do i=istart,iend ntoti = sum(npartoftype(:,i)) if (.not.allocated(dat) .or. (ntoti + npartoftype(1,i)) > maxpart) then call alloc(ntoti + npartoftype(1,i),maxstep,maxcol,mixedtypes=.true.) endif if (npartoftype(2,i) > 0) cycle ndust = 0 !--zero the properties of newly created dust particles dat(ntoti+1:ntoti+npartoftype(1,i),:,i) = 0. if (idustfrac_temp > size(dat(1,:,1)) .or. idustfrac_temp <= 0) then print*,' ERROR: idustfrac out of range: cannot create fake dust particles' return endif use_vels = (ideltav_temp > 0 .and. ivx > 0 .and. ndimV > 0) do j=1,ntoti if (iamtype(j,i)==1) then ndust = ndust + 1 ! one dust particle for every gas particle rhotot = dat(j,irho,i) dustfraci = dat(j,idustfrac_temp,i) gasfraci = 1. - dustfraci rhogas = rhotot*gasfraci rhodust = rhotot*dustfraci !--replace global properties with gas-only stuff dat(j,irho,i) = rhogas dat(j,idustfrac,i) = 0. ! dust fraction = 0 on gas particles !--copy x, smoothing length onto dust particle jdust = ntoti + ndust !--fill in dust properties if (ndim > 0) dat(jdust,ix(1:ndim),i) = dat(j,ix(1:ndim),i) if (ih > 0) dat(jdust,ih,i) = dat(j,ih,i) if (irho > 0) dat(jdust,irho,i) = rhodust dat(jdust,idustfrac,i) = 1. ! dust fraction = 1 on dust particles iamtype(ntoti + ndust,i) = 2 !--particle masses if (ipmass > 0) then pmassj = dat(j,ipmass,i) pmassgas = pmassj*gasfraci pmassdust = pmassj*dustfraci dat(j,ipmass,i) = pmassgas dat(jdust,ipmass,i) = pmassdust endif !--velocities if (use_vels) then veli(:) = dat(j,ivx:ivx+ndimV-1,i) deltav(:) = dat(j,ideltav_temp:ideltav_temp+ndimV-1,i) vgas(:) = veli(:) - (1. - gasfraci)*deltav(:) vdust(:) = veli(:) + gasfraci*deltav(:) dat(j,ivx:ivx+ndimV-1,i) = vgas(:) dat(jdust,ivx:ivx+ndimV-1,i) = vdust(:) if (ideltav /= 0) then !--set deltav to zero on gas and dust particles dat(j,ideltav_temp:ideltav_temp+ndimV-1,i) = deltav(:) dat(jdust,ideltav:ideltav+ndimV-1,i) = deltav(:) endif !if (abs(deltav(1)) > 0.3) print*,' particle ',j,'->',jdust,' vg = ',vgas(:),' vd = ',vdust(:),' v = ',veli,deltav endif endif enddo if (iverbose >= 1) then print "(a,i8,a)",' Creating ',ndust,' fake dust particles' if (.not.use_vels .and. ivx > 0) print "(a)",' WARNING: deltav not found in one fluid dust data: cannot get vels' endif npartoftype(2,i) = npartoftype(2,i) + ndust enddo else print "(a)",' ERROR: could not locate dust-to-gas ratio and/or density' endif end subroutine fake_twofluids end module adjustdata danieljprice-splash-4d1f09c/src/allocate.f90000066400000000000000000000226621477365367100207750ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module mem_allocation implicit none contains !---------------------------------------------------------------------------- ! ! memory allocation/reallocation for main data arrays ! ! the global parameters maxpart, maxstep and maxcol are set to ! the dimensions allocated ! !---------------------------------------------------------------------------- subroutine alloc(npartin,nstep,ncolumnsin,mixedtypes) use particle_data integer, intent(in) :: npartin,nstep,ncolumnsin logical, intent(in), optional :: mixedtypes integer :: maxpartold,maxstepold,maxcolold integer :: ierr,ncolumns logical :: reallocate,reallocate_part,reallocate_step,reallocate_itype integer, dimension(:), allocatable :: icolourmetemp integer(kind=int1), dimension(:,:), allocatable :: iamtypetemp integer, dimension(:,:), allocatable :: npartoftypetemp real, dimension(:,:), allocatable :: masstypetemp real, dimension(:), allocatable :: timetemp, gammatemp real, dimension(:,:,:), allocatable :: dattemp real, dimension(:,:), allocatable :: headervalstemp ! !--check for errors in input ! if (npartin <= 0) then print*,'allocate: error in input, npartin = ',npartin return endif if (nstep <= 0) then print*,'allocate: error in input, nstep = ',nstep return endif if (ncolumnsin < 0) then print*,'allocate: error in input, ncolumns = ',ncolumnsin return elseif (ncolumnsin==0) then print*,'WARNING: allocate: ncolumns = 0 in input' endif !--do nothing if array sizes are the same if (npartin==maxpart .and. ncolumnsin==maxcol .and. nstep==maxstep) then return endif ! !--save array sizes ! if (npartin < maxpart) print "(a)",' WARNING: # particles < previous in allocate' if (nstep < maxstep) print "(a)",' WARNING: # steps < previous in allocate' !--at the moment ncolumns cannot be decreased (due to calc_quantities) if (ncolumnsin < maxcol) then ncolumns = maxcol !!print "(a)",' WARNING: # columns < previous in allocate' else ncolumns = ncolumnsin endif maxpartold = min(maxpart,npartin) maxstepold = min(maxstep,nstep) maxcolold = min(maxcol,ncolumns) reallocate = .false. reallocate_part = .false. reallocate_step = .false. reallocate_itype = .false. ! !--if re-allocating, copy arrays to temporary versions ! ierr = 0 if (allocated(dat)) then reallocate = .true. if (maxpart /= npartin) reallocate_part = .true. if (maxstep /= nstep) reallocate_step = .true. if (npartin > 1000000) print 10,'> reallocating memory:',npartin,nstep,ncolumns 10 format (a,' parts = ',i10,' steps = ',i6,' cols = ',i4) allocate(dattemp(maxpartold,maxcolold,maxstepold), stat=ierr) if (ierr /= 0) stop 'error allocating memory (dattemp)' if (reallocate_part) then allocate(icolourmetemp(maxpartold),stat=ierr) if (ierr /= 0) stop 'error allocating memory (icolourmetemp)' icolourmetemp(1:maxpartold) = icolourme(1:maxpartold) deallocate(icolourme) endif dattemp = dat deallocate(dat) if (allocated(iamtype)) then ! should always be true !--if iamtype has meaningful contents and reallocation is necessary reallocate_itype = (reallocate_part .or. reallocate_step) .and. (size(iamtype(:,1))==maxpartold) if (reallocate_itype) then allocate(iamtypetemp(maxpartold,maxstepold), stat=ierr) if (ierr /= 0) stop 'error allocating memory (iamtypetemp)' iamtypetemp(1:maxpartold,1:maxstepold) = iamtype(1:maxpartold,1:maxstepold) deallocate(iamtype) elseif (present(mixedtypes)) then !--if iamtype has size 1 or 0 but should be allocated here, ! deallocate so we can give it correct size if (mixedtypes .and. size(iamtype(:,1)) < maxpart) deallocate(iamtype) endif endif if (reallocate_step) then allocate(npartoftypetemp(maxparttypes,maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory (npartoftypetemp)' npartoftypetemp = npartoftype deallocate(npartoftype) allocate(masstypetemp(maxparttypes,maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory (npartoftypetemp)' masstypetemp = masstype deallocate(masstype) allocate(timetemp(maxstep),gammatemp(maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory (timetemp,gammatemp)' timetemp = time gammatemp = gamma deallocate(time,gamma) allocate(headervalstemp(maxhdr,maxstep)) if (ierr /= 0) stop 'error allocating memory (hdrvalstemp)' headervalstemp = headervals deallocate(headervals) endif else if (npartin > 1000000) print 10,'> allocating memory:',npartin,nstep,ncolumns maxpart = npartin maxstep = nstep maxcol = ncolumns endif maxpart = npartin maxstep = nstep maxcol = ncolumns ! !--main data array ! allocate(dat(maxpart,maxcol,maxstep), stat=ierr) if (ierr /= 0) then print*,' parts = ',maxpart,' columns = ',maxcol,' steps = ',maxstep stop 'error allocating memory for dat array' endif if (reallocate) then dat(1:maxpartold,1:maxcolold,1:maxstepold) = dattemp(1:maxpartold,1:maxcolold,1:maxstepold) deallocate(dattemp) else dat = 0. endif ! !--type array if necessary ! if (present(mixedtypes)) then if (mixedtypes .and. .not.allocated(iamtype)) then allocate(iamtype(maxpart,maxstep), stat=ierr) if (ierr /= 0) stop 'error allocating memory for type array' iamtype = 1 !--copy contents if reallocating if (reallocate_itype) then iamtype(1:maxpartold,1:maxstepold) = iamtypetemp(1:maxpartold,1:maxstepold) deallocate(iamtypetemp) endif elseif (.not.mixedtypes) then !--if called with mixedtypes explictly false, deallocate itype array if (allocated(iamtype)) deallocate(iamtype) endif elseif (reallocate_itype) then !--if called without mixedtypes, preserve contents of itype array allocate(iamtype(maxpart,maxstep), stat=ierr) if (ierr /= 0) stop 'error allocating memory for type array' iamtype = 1 iamtype(1:maxpartold,1:maxstepold) = iamtypetemp(1:maxpartold,1:maxstepold) deallocate(iamtypetemp) endif !--make sure iamtype is always allocated for safety, just with size=1 if not used if (.not.allocated(iamtype)) then allocate(iamtype(1,maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory for type array (1)' endif ! !--particle arrays ! if (.not.allocated(icolourme) .or. reallocate_part) then allocate(icolourme(maxpart),stat=ierr) if (ierr /= 0) stop 'error allocating memory for icolourme array' icolourme = 1 if (reallocate_part) then icolourme(1:maxpartold) = icolourmetemp(1:maxpartold) deallocate(icolourmetemp) endif endif ! !--other arrays ! if (.not.allocated(npartoftype)) then allocate(npartoftype(maxparttypes,maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory for header arrays' allocate(masstype(maxparttypes,maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory for header arrays' allocate(time(maxstep),gamma(maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory for header arrays' allocate(headervals(maxhdr,maxstep),stat=ierr) if (ierr /= 0) stop 'error allocating memory for header arrays' npartoftype = 0 masstype = 0. time = time_not_read_val ! initialise like this so we know if has not been read gamma = 0. headervals = 0. if (reallocate_step) then npartoftype(:,1:maxstepold) = npartoftypetemp(:,1:maxstepold) masstype(:,1:maxstepold) = masstypetemp(:,1:maxstepold) time(1:maxstepold) = timetemp(1:maxstepold) gamma(1:maxstepold) = gammatemp(1:maxstepold) headervals(:,1:maxstepold) = headervalstemp(:,1:maxstepold) deallocate(npartoftypetemp,masstypetemp) deallocate(timetemp,gammatemp) deallocate(headervalstemp) endif endif return end subroutine alloc !----------------------------------------- ! ! deallocation of remaining memory ! (for tidiness - not strictly necessary) ! !----------------------------------------- subroutine deallocate_all use particle_data, only:dat,icolourme,iamtype,npartoftype,masstype,& time,gamma,headervals if (allocated(dat)) deallocate(dat) if (allocated(icolourme)) deallocate(icolourme) if (allocated(iamtype)) deallocate(iamtype) if (allocated(npartoftype)) deallocate(npartoftype) if (allocated(masstype)) deallocate(masstype) if (allocated(time)) deallocate(time) if (allocated(gamma)) deallocate(gamma) if (allocated(headervals)) deallocate(headervals) return end subroutine deallocate_all end module mem_allocation danieljprice-splash-4d1f09c/src/analysis.f90000066400000000000000000001402421477365367100210270ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2015 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------- ! module implementing the ability to use SPLASH to produce ! evolution files from a sequence of SPH dump files ! (ie. in order to produce plots of certain quantities vs time) ! Command is "splash calc X" where X is analysis type. !------------------------------------------------------------------- module analysis implicit none public :: isanalysis,open_analysis,close_analysis,write_analysis private integer, private, parameter :: iunit = 89 integer, private, parameter :: maxlevels = 20 integer, private, parameter :: maxtrack = 32 ! ! default settings for the density thresholds for massaboverho output ! integer, private :: nlevels,nfilesread,nfileout real, dimension(maxlevels), private :: rholevels character(len=64), private :: fileout(maxtrack) real, dimension(:,:), allocatable :: datmean,datvar integer, private :: itracks(maxtrack) ! ! definitions needed for tdiffuse output ! integer, parameter :: ndirs = 6 character(len=2) :: dir_label(ndirs) = (/'-x','+x','-y','+y','-z','+z'/) ! angles required for direction: -x +x -y +y -z +z real, parameter :: anglex_vals(ndirs) = (/0., 0., -90., 90., 180., 0./) real, parameter :: angley_vals(ndirs) = (/-90., 90., 0., 0., 0., 0./) real, parameter :: anglez_vals(ndirs) = (/0., 0., 0., 0., 0., 0./) contains !----------------------------------------------------------------- ! utility to check if the choice of analysis type is valid ! and if not, to print the available options !----------------------------------------------------------------- logical function isanalysis(string,noprint) character(len=*), intent(in) :: string logical, intent(in), optional :: noprint logical :: doprint,verbose isanalysis = .false. verbose = .true. select case(trim(string)) case('energies','energy') isanalysis = .true. case('massaboverho') isanalysis = .true. case('max','maxvals') isanalysis = .true. case('min','minvals') isanalysis = .true. case('diff','diffvals') isanalysis = .true. case('delta','deltavals') isanalysis = .true. case('amp','ampvals') isanalysis = .true. case('mean','meanvals') isanalysis = .true. case('rms','rmsvals') isanalysis = .true. case('vrms','vrmsvals','vwrms','rmsvw') isanalysis = .true. case('rhovar','rhomach') isanalysis = .true. case('kh') isanalysis = .true. case('timeaverage','timeav') isanalysis = .true. case('ratio','minus','plus') isanalysis = .true. case('tracks','track') isanalysis = .true. case('lightcurve') isanalysis = .true. case('extinction') isanalysis = .true. case('tdiffuse') isanalysis = .true. case('none') verbose = .false. end select if (present(noprint)) then doprint = .not.noprint else doprint = .true. endif if (.not.isanalysis .and. doprint .and. verbose) then print "(a)",' Analysis mode ("splash calc X dumpfiles") on a sequence of dump files: ' print "(a)",' splash calc energies : calculate KE,PE,total energy vs time' print "(a)",' output to file called ''energy.out''' print "(a)",' calc massaboverho : mass above a series of density thresholds vs time' print "(a)",' output to file called ''massaboverho.out''' print "(a)",' calc extinction : column density to all sink particles vs time' print "(a)",' output to file called ''extinction.out''' ! print "(a)",' calc rhomach : density variance and RMS velocity dispersion vs. time' ! print "(a)",' output to file called ''rhomach.out''' print "(a)",' calc max : maximum of each column vs. time' print "(a)",' output to file called ''maxvals.out''' print "(a)",' calc min : minimum of each column vs. time' print "(a)",' output to file called ''minvals.out''' print "(a)",' calc diff : (max - min) of each column vs. time' print "(a)",' output to file called ''diffvals.out''' print "(a)",' calc amp : 0.5*(max - min) of each column vs. time' print "(a)",' output to file called ''ampvals.out''' print "(a)",' calc delta : 0.5*(max - min)/mean of each column vs. time' print "(a)",' output to file called ''deltavals.out''' print "(a)",' calc mean : mean of each column vs. time' print "(a)",' output to file called ''meanvals.out''' print "(a)",' calc rms : (mass weighted) root mean square of each column vs. time' print "(a)",' output to file called ''rmsvals.out''' print "(a)",' calc tracks : track particle data vs time for selected particles,' print "(a)",' --track=1,2,3 output to tracks-1.out,tracks-2.out,tracks-3.out' ! print "(a)",' calc vrms : volume weighted root mean square of each column vs. time' ! print "(a)",' output to file called ''rmsvals-vw.out''' print "(/,a)",' the above options all produce a small ascii file with one row per input file.' print "(a)",' the following option produces a file equivalent in size to one input file (in ascii format):' print "(/,a)",' calc timeaverage : time average of *all* entries for every particle' print "(a)",' output to file called ''time_average.out''' print "(/,a)",' calc ratio : ratio of *all* entries in each file compared to first' print "(a)",' output to file called ''ratio.out''' print "(/,a)",' calc plus : add two snapshots together' print "(a)",' output to file called ''plus.out''' elseif (.not.isanalysis .and. doprint) then print "(a)",'Analysis mode:' print "(a)",' splash calc : type "splash calc" for details' endif return end function isanalysis !---------------------------------------------------------------- ! open output file/ initialise quantities needed for analysis ! over all dump files !---------------------------------------------------------------- subroutine open_analysis(analysistype,required,ncolumns,ndim,ndimV,nsinks) use labels, only:ix,ivx,ih,iBfirst,iutherm,irho,ipmass,itemp,ikappa,label,& lenunitslabel,unitslabel,labelzintegration,get_unitlabel_coldens use asciiutils, only:read_asciifile,basename,integer_to_string use filenames, only:rootname,nfiles,tagline,fileprefix,ifileopen use params, only:maxplot use system_utils, only:ienvlist use settings_data, only:iRescale integer, intent(in) :: ncolumns,ndim,ndimV,nsinks character(len=*), intent(in) :: analysistype logical, dimension(0:ncolumns), intent(out) :: required character(len=maxplot*18) :: headerline ! len=maxplot x 18 characters character(len=64) :: levelsfile character(len=maxplot*12) :: fmtstring character(len=lenunitslabel) :: labelt,labelc logical :: iexist,standardheader integer :: ierr,i,lunit ! !--the 'required' array is used by the data reads (where implemented) ! to determine whether or not we actually need to read a given column ! from the file -- if not it can be skipped, leading to a faster ! data read. Here we want to specify which columns are required ! for the analysis in question. ! print "(/,5('-'),a,/)",'> CALCULATING '//trim(analysistype)//' vs time for all dump files' required(:)=.false. headerline = ' ' standardheader = .false. nfileout = 1 labelt = '' if (iRescale) then labelt = unitslabel(0) endif select case(trim(analysistype)) case('energy','energies') ! !--for energies need to read particle mass, velocity, utherm and if present, ! magnetic field and density. The obvious limitation here is that we ! cannot calculate the potential energy unless it is dumped and labelled ! (which is not currently implemented). ! required(ivx:ivx+ndimV-1) = .true. required(iBfirst:iBfirst+ndimV-1) = .true. required(iutherm) = .true. required(ipmass) = .true. if (iBfirst > 0) required(irho) = .true. required(ix(1:ndim)) = .true. ! !--set filename and header line ! fileout(1) = 'energy.out' write(headerline,"('#',8(1x,'[',i2.2,1x,a11,']',2x))") & 1,'time',2,'ekin',3,'etherm',4,'emag',5,'epot',6,'etot',7,'totmom',8,'totang' case('massaboverho') ! !--only need to read mass and density from dump files ! required(ipmass) = .true. required(irho) = .true. ! !--need a user-configurable way of setting the density thresholds: ! implemented by setting them in a file which is read here ! (a new one is created if it doesn't exist) ! levelsfile = 'massaboverho.levels' inquire(file=levelsfile,exist=iexist) if (iexist) then call read_asciifile(trim(levelsfile),nlevels,rholevels) print "(a)",' read '//trim(levelsfile)//':' do i=1,nlevels print "(a,i2,a,es9.2)",' level ',i,': rho > ',rholevels(i) enddo print* else print "(a)",' SPLASH ANALYSIS: levels file '//trim(levelsfile)//' not found' print "(a)",' creating one with default levels for mass > rho' print "(a)",' edit this file to set the density levels' open(unit=iunit+1,file=levelsfile,status='new',form='formatted',iostat=ierr) if (ierr /= 0) then stop 'ERROR creating levels file' else nlevels = 10 rholevels(1:nlevels) = (/1e-20,1e-19,1e-18,1e-17,1e-16, & 1e-15,1e-14,1e-13,1e-12,1e-11/) write(iunit+1,*) rholevels(1:nlevels) close(iunit+1) endif stop endif ! !--set filename and header line ! fileout(1) = 'massaboverho.out' write(headerline,"('#',1x,'[',i2.2,1x,a12,']',1x,20('[',i2.2,1x,a4,es8.1,a1,']',1x))") & 1,'time',(i+1,'M(r>',rholevels(i),')',i=1,nlevels) case('max','maxvals') ! !--read all columns from dump file ! required(:) = .true. ! !--set filename and header line ! fileout(1) = 'maxvals.out' standardheader = .true. case('min','minvals') required(:) = .true. fileout(1) = 'minvals.out' standardheader = .true. case('diff','diffvals') required(:) = .true. fileout(1) = 'diffvals.out' standardheader = .true. case('amp','ampvals') required(:) = .true. fileout(1) = 'ampvals.out' standardheader = .true. case('delta','deltavals','deltas') required(:) = .true. fileout(1) = 'deltavals.out' standardheader = .true. case('mean','meanvals') required(:) = .true. fileout(1) = 'meanvals.out' standardheader = .true. case('rms','rmsvals') required(:) = .true. fileout(1) = 'rmsvals.out' standardheader = .true. case('vrms','vrmsvals','vwrms','rmsvw') required(:) = .true. fileout(1) = 'rmsvals-vw.out' standardheader = .true. case('rhovar','rhomach') ! !--read density, velocity info ! required(ipmass) = .true. required(irho) = .true. required(ivx:ivx+ndimV-1) = .true. ! !--set filename and header line ! fileout(1) = 'rhomach.out' write(fmtstring,"('(''#'',1x,',i3,'(''['',i2.2,1x,a12,'']'',2x))')",iostat=ierr) 17 write(headerline,fmtstring) 1,'time',2,'rhomean(vw)',3,'rhomean(mw)',4,'varrho(vw)',5,'varrho(mw)',& 6,'stddevrho(vw)',7,'stddevrho(mw)',8,'rms v (vw)',9,'rms v (mw)',10,'b (vw)',11,'b (mw)',& 12,'s mean(vw)',13,'s mean(mw)',14,'s var(vw)',15,'s var(mw)',16,'s stddev(vw)',17,'s stddev(mw)' case('kh') ! !--read all columns from dump file ! required(irho) = .true. required(ivx:ivx+ndimV-1) = .true. ! !--set filename and header line ! fileout(1) = 'kh.out' standardheader = .true. write(fmtstring,"('(''#'',1x,',i3,'(''['',i2.2,1x,a12,'']'',2x))')",iostat=ierr) 2 write(headerline,fmtstring) 1,'time',2,'max(ekiny)' case('timeaverage','timeav') ! !--read all columns from dump file ! required(:) = .true. ! !--set filename and header line ! fileout(1) = 'time_average.out' if (ncolumns > 0) then write(fmtstring,"('(''#'',1x,',i3,'(''['',i2.2,1x,a12,'']''))')",iostat=ierr) 2*ncolumns write(headerline,fmtstring,iostat=ierr) (i,label(i)(1:12),i=1,ncolumns),& (ncolumns+i,'err'//label(i)(1:9),i=1,ncolumns) endif case('ratio','minus','add') ! !--read all columns from dump file ! required(:) = .true. ! !--set filename and header line ! fileout(1) = trim(analysistype)//'.out' if (ncolumns > 0 .and. ncolumns /= maxplot) then write(fmtstring,"('(''#'',1x,',i3,'(''['',i2.2,1x,a12,'']''))')",iostat=ierr) 2*ncolumns write(headerline,fmtstring,iostat=ierr) (i,label(i)(1:12),i=1,ncolumns),& (ncolumns+i,'err'//label(i)(1:9),i=1,ncolumns) endif case('tracks','track') ! !--read all of dump file ! required(:) = .true. ! !--set filename and header line ! fileout(1) = 'tracks.out' ! in case ntracks = 0 ! !--look for a file "splash.tracks" for particle ids to track ! call read_asciifile(trim(fileprefix)//'.tracks',nfileout,itracks,ierr) if (ierr /= 0) then ! !--otherwise use --tracks=1,2,3 ! itracks = ienvlist('SPLASH_TRACK',size(itracks)) nfileout = count(itracks > 0) endif if (nfileout > 0) then print "(a,i0,a)",' TRACKING ',nfileout,' PARTICLES' else print "(a)",' Use --track=1,2,3 or splash.tracks file to specify particle IDs to track' endif do i=1,nfileout write(fileout(i),"(a,i0,a)") 'tracks-',itracks(i),'.out' enddo nfileout = 1 standardheader = .true. case('lightcurve') ! !--for lightcurve need to h, mass and utherm ! required(ix(1:ndim)) = .true. required(ih) = .true. required(iutherm) = .true. required(ipmass) = .true. required(itemp) = .true. required(ikappa) = .true. ! !--set filename and header line ! if (nfiles==1) then fileout = 'lightcurve_'//trim(basename(rootname(ifileopen)))//'.out' else fileout = 'lightcurve.out' endif write(headerline,"('#',8(1x,'[',i2.2,1x,a11,']',2x))") & 1,'time'//trim(labelt),2,'Luminosity',3,'R_{eff}',4,'T_{eff}',& 5,'L_{bol}',6,'R_{bb}',7,'T_c',8,'bad pix %' case('extinction') ! !--for extinction of stars need h, mass and density ! required(ix(1:ndim)) = .true. required(ih) = .true. required(ipmass) = .true. required(irho) = .true. ! !--set filename and header line ! if (nfiles==1) then fileout = 'extinction_'//trim(basename(rootname(ifileopen)))//'.out' else fileout = 'extinction.out' endif labelc = get_unitlabel_coldens(iRescale,labelzintegration,unitslabel(irho)) write(fmtstring,"('(''#'',1x,',i3,'(''['',i2.2,1x,a15,'']'',2x))')",iostat=ierr) nsinks+1 write(headerline,fmtstring) & 1,'time'//trim(labelt),(i+1,'sink'//trim(adjustl(integer_to_string(i)))//trim(labelc),i=1,nsinks) case('tdiffuse') ! !--similar to extinction, but could be any column ! !required(ix(1:ndim)) = .true. !required(ih) = .true. !required(ipmass) = .true. !required(irho) = .true. required(:) = .true. ! !--set filename and header line ! if (nfiles==1) then fileout = 'tdiffuse_'//trim(basename(rootname(ifileopen)))//'.out' else fileout = 'tdiffuse.out' endif write(fmtstring,"('(''#'',1x,',i3,'(''['',i2.2,1x,a15,'']'',2x))')",iostat=ierr) ndirs+1 write(headerline,fmtstring) & 1,'time'//trim(labelt),(i+1,dir_label(i),i=1,ndirs) end select if (standardheader) then ! !--standard header is time in column 1, with an entry for each column following ! (this is to avoid repeated code above) ! write(fmtstring,"('(''#'',1x,',i3,'(''['',i2.2,1x,a12,'']'',2x))')",iostat=ierr) ncolumns+1 write(headerline,fmtstring) 1,'time'//trim(labelt),(i+1,label(i)(1:12),i=1,ncolumns) endif ! !--do not replace the file if it already exists ! do i=1,nfileout inquire(file=trim(fileout(i)),exist=iexist) if (iexist) then print "(2(a,/))",' ERROR: analysis file '//trim(fileout(i))//' already exists', & ' delete, move or rename this file and try again' stop endif ! !--open the file for output ! lunit = iunit+i-1 if (nfileout > 1) then open(unit=lunit,file=trim(fileout(i)),status='replace',form='formatted',iostat=ierr) else open(unit=lunit,file=trim(fileout(i)),status='new',form='formatted',iostat=ierr) endif if (ierr /= 0) then print "(a)",' ERROR opening file '//trim(fileout(i))//' for output' stop endif print "(a)",' WRITING '//trim(analysistype)//' vs time to file '//trim(fileout(i)) ! !--write header if the headerline is set ! (no header is written if headerline is blank) ! if (len_trim(headerline) > 0) then write(lunit,"(a)") '# '//trim(tagline) write(lunit,"(a)") '# '//trim(fileout(i))//' produced using "splash calc '//trim(analysistype)// & '" on dump files '//trim(rootname(1))//'->'//trim(rootname(nfiles)) write(lunit,"(a)") '# use splash -ev '//trim(fileout(i))//' to plot the contents of this file ' write(lunit,"(a)") '#' write(lunit,"(a)") trim(headerline) endif enddo !if (nfileout == 0) then !print "(a)",' ERROR: no output from analysis, missing options?' !stop !endif nfilesread = 0 end subroutine open_analysis !---------------------------------------------------------------- ! this is the routine which actually calculates the quantities ! required from each dump file and spits out a line to the ! analysis file. Called once for each dump file. !---------------------------------------------------------------- subroutine write_analysis(time,dat,ntot,ntypes,npartoftype,massoftype,& iamtype,ncolumns,ndim,ndimV,analysistype) use labels, only:ix,ivx,iBfirst,iutherm,irho,ipmass,labeltype,label,get_sink_type,& lenunitslabel,get_unitlabel_coldens,unitslabel,labelzintegration use params, only:int1,doub_prec,maxplot use asciiutils, only:ucase,basename use system_utils, only:renvironment,ienvironment use settings_part, only:iplotpartoftype use particle_data, only:time_was_read use part_utils, only:get_positions_of_type use settings_data, only:xorigin,icoords,icoordsnew,track_string,iRescale use geomutils, only:change_coords use part_utils, only:get_tracked_particle use lightcurve, only:get_lightcurve use extinction, only:get_extinction,get_extinction_los use filenames, only:rootname,ifileopen use vectorutils, only:cross_product3D integer, intent(in) :: ntot,ntypes,ncolumns,ndim,ndimV integer, intent(in), dimension(:) :: npartoftype real, intent(in), dimension(:) :: massoftype integer(kind=int1), intent(in), dimension(:) :: iamtype real, intent(in) :: time real, intent(in), dimension(:,:) :: dat character(len=*), intent(in) :: analysistype real(kind=doub_prec), dimension(maxlevels) :: massaboverho integer :: itype,i,j,ierr,ntot1,ncol1,nused,itrack,ifile,npts,isinktype,icol real(kind=doub_prec) :: ekin,emag,etherm,epot,etot,totmom,pmassi,totang real(kind=doub_prec) :: totvol,voli,rhoi,rmsvmw,v2i real(kind=doub_prec) :: rhomeanmw,rhomeanvw,rhovarmw,rhovarvw,bval,bvalmw real(kind=doub_prec) :: smeanmw,smeanvw,svarmw,svarvw,si,ekiny,ekinymax real(kind=doub_prec) :: lmin(maxplot),lmax(maxplot),lmean(maxplot),rmsvali real(kind=doub_prec), dimension(3) :: xmom,angmom,angmomi,ri,vi real :: delta,dn,valmin,valmax,valmean,timei real :: lum,rphoto,tphoto,l_bb,r_bb,t_bb,badfrac character(len=20) :: fmtstring logical :: change_coordsys real :: x0(3),v0(3) real, allocatable :: xpts(:),ypts(:),zpts(:) character(len=lenunitslabel) :: labelt,labelc ! ! array with one value for each column ! real(kind=doub_prec) :: coltemp(maxplot), vals(maxplot), rmsval(maxplot) real :: coltemps(maxplot) labelt = '' labelc = '' if (iRescale) labelt = unitslabel(0) nfilesread = nfilesread + 1 if (time_was_read(time)) then timei = time print "(/,5('-'),a,', TIME=',es9.2,a,' FILE #',i5,/)",& '> CALCULATING '//trim(ucase(analysistype)),time,trim(labelt),nfilesread else timei = 0. print "(/,5('-'),a,', FILE #',i5,' (TIME NOT READ)'/)",& '> CALCULATING '//trim(ucase(analysistype)),nfilesread endif change_coordsys = (icoordsnew /= icoords .and. ndim > 0 .and. all(ix(1:ndim) > 0)) x0 = xorigin(:) ! note that it is not currently possible to do splash to ascii v0 = 0. ! with coords set relative to a tracked particle, so just use xorigin ! instead, one can use the --origin flag to make positions and velocities relative to a particle if (itracks(1) > 0) then itrack = itracks(1) ! override particle id saved to splash.defaults file if --tracks specified else itrack = get_tracked_particle(track_string,npartoftype,iamtype,dat,irho) endif if (itrack==0) itrack = 1 select case(trim(analysistype)) case('energy','energies') ekin = 0. emag = 0. epot = 0. etherm = 0. etot = 0. xmom = 0. angmom = 0. nused = 0 do i=1,ntot itype = igettype(i) if (iplotpartoftype(itype)) then pmassi = particlemass(i,itype) !--kinetic energy if (ivx > 0 .and. ivx+ndimV-1 <= ncolumns) then vi(:) = 0. vi(1:ndimV) = dat(i,ivx:ivx+ndimV-1) ekin = ekin + pmassi*dot_product(vi,vi) !--linear momentum xmom = xmom + pmassi*vi !--angular momentum if (ndim >= 1 .and. all(ix(1:ndim) > 0)) then ri(:) = 0. ri(1:ndim) = dat(i,ix(1):ix(ndim)) call cross_product3D(ri,vi,angmomi) angmom(:) = angmom(:) + pmassi*angmomi(:) endif endif !--thermal energy if (iutherm > 0 .and. iutherm <= ncolumns) then etherm = etherm + pmassi*dat(i,iutherm) endif !--magnetic energy if (iBfirst > 0 .and. iBfirst+ndimV-1 <= ncolumns) then emag = emag + pmassi*dot_product(dat(i,iBfirst:iBfirst+ndimV-1),& dat(i,iBfirst:iBfirst+ndimV-1))/dat(i,irho) endif nused = nused + 1 endif enddo ekin = 0.5*ekin emag = 0.5*emag etot = ekin + etherm + epot + emag totmom = sqrt(dot_product(xmom(1:ndimV),xmom(1:ndimV))) totang = sqrt(dot_product(angmom,angmom)) print "(7(/,1x,a6,' = ',es9.2))",'etot',etot,'ekin',ekin,'etherm',etherm,'epot',epot,'emag',emag,'totmom',totmom,'totang',totang ! !--write line to output file ! write(iunit,"(64(es18.10,1x))") timei,ekin,etherm,emag,epot,etot,totmom,totang if (nused /= ntot) print*,'energies calculated using ',nused,' of ',ntot,' particles' case('massaboverho') massaboverho(:) = 0. if (irho > 0 .and. irho <= ncolumns) then ! !--warn if particle masses not found ! if (ipmass <= 0 .or. ipmass > ncolumns .and. all(massoftype < tiny(massoftype))) then print "(a)",' WARNING in massaboverho analysis!'// & ' masses not read or are zero from dump file' endif ! !--calculate mass above each density threshold ! do i=1,ntot itype = igettype(i) pmassi = particlemass(i,itype) if (itype==1) then ! !--gas particles contribute if they are above rho ! where(dat(i,irho) >= rholevels(1:nlevels)) massaboverho(1:nlevels) = massaboverho(1:nlevels) + pmassi end where elseif (labeltype(itype)=='sink') then ! !--sink particles always contribute (ie. they are assumed to ! be above every density threshold) ! massaboverho(1:nlevels) = massaboverho(1:nlevels) + pmassi endif enddo ! !--write output to screen/terminal ! do i=1,nlevels print "(1x,'M(rho > ',es9.2,') = ',es9.2)",rholevels(i),massaboverho(i) enddo ! !--write line to output file ! write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) nlevels+1 write(iunit,fmtstring) timei,massaboverho(1:nlevels) else print "(a)",' ERROR in massaboverho analysis!'// & ' either mass or density not found in dump file' return endif case('max','maxvals') ! !--calculate maximum for each column ! coltemp(:) = -huge(0.d0) !maxval(dat(1:ntot,i)) nused = 0 do j=1,ntot itype = igettype(j) if (iplotpartoftype(itype)) then vals(1:ncolumns) = real(dat(j,1:ncolumns),kind=doub_prec) if (change_coordsys) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) nused = nused + 1 do i=1,ncolumns coltemp(i) = max(coltemp(i),vals(i)) enddo endif enddo where (coltemp(:) < -0.5*huge(0.)) coltemp(:) = 0. ! !--write output to screen/terminal ! do i=1,ncolumns print "(1x,a20,'max = ',es18.10)",label(i),coltemp(i) enddo ! !--write line to output file ! write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) ncolumns+1 write(iunit,fmtstring) timei,coltemp(1:ncolumns) if (nused /= ntot) print*,'max calculated using ',nused,' of ',ntot,' particles' case('min','minvals') ! !--calculate minimum for each column ! coltemp(:) = huge(0.d0) !minval(dat(1:ntot,i)) nused = 0 do j=1,ntot itype = igettype(j) if (iplotpartoftype(itype)) then vals(1:ncolumns) = real(dat(j,1:ncolumns),kind=doub_prec) if (change_coordsys) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) nused = nused + 1 do i=1,ncolumns coltemp(i) = min(coltemp(i),vals(i)) enddo endif enddo ! !--write output to screen/terminal ! do i=1,ncolumns print "(1x,a20,'min = ',es18.10)",label(i),coltemp(i) enddo ! !--write line to output file ! write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) ncolumns+1 write(iunit,fmtstring) timei,coltemp(1:ncolumns) if (nused /= ntot) print*,'min calculated using ',nused,' of ',ntot,' particles' case('diff','diffvals','amp','ampvals','delta','deltavals','deltas','tracks') ! !--calculate difference between max and min for each column ! lmean(:) = 0. lmin(:) = huge(0.d0) lmax(:) = -huge(0.d0) write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) ncolumns+1 do ifile=1,nfileout if (nfileout > 1) itrack = itracks(ifile) nused = 0 coltemp = 0. do j=1,ntot itype = igettype(j) if (iplotpartoftype(itype) .or. j==itrack) then vals(1:ncolumns) = real(dat(j,1:ncolumns),kind=doub_prec) if (change_coordsys) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) nused = nused + 1 do i=1,ncolumns lmin(i) = min(lmin(i), vals(i)) lmax(i) = max(lmax(i), vals(i)) lmean(i) = lmean(i) + vals(i) enddo if (j==itrack) coltemp = vals endif enddo if (trim(analysistype)=='tracks' .or. trim(analysistype)=='track') then if (ifile==1) then do i=1,ncolumns print "(1x,' particle ',i8,': ',a20,' = ',es18.10)",itrack,label(i),coltemp(i) enddo endif ! !--write line to output file ! write(iunit+ifile-1,fmtstring) timei,coltemp(1:ncolumns) if (nfileout > 1) print "(1x,'>>> ',a,' <<<')",'written to '//trim(fileout(ifile)) endif enddo if (nused > 0) lmean(:) = lmean(:)/real(nused) select case(trim(analysistype)) case('amp','ampvals') do i=1,ncolumns coltemp(i) = 0.5*(lmax(i) - lmin(i)) print "(1x,a20,'0.5*(max - min) = ',es18.10)",label(i),coltemp(i) enddo case('delta','deltavals','deltas') do i=1,ncolumns valmean = real(lmean(i)) if (valmean > 0.) then coltemp(i) = 0.5*(lmax(i) - lmin(i))/valmean else coltemp(i) = 0.5*(lmax(i) - lmin(i)) endif print "(1x,a20,'0.5*(max - min)/mean = ',es18.10)",label(i),coltemp(i) enddo case('diff','diffvals') ! diff, diffvals do i=1,ncolumns coltemp(i) = lmax(i) - lmin(i) print "(1x,a20,'(max - min) = ',es18.10)",label(i),coltemp(i) enddo end select ! !--write line to output file ! if (trim(analysistype) /= 'tracks' .and. trim(analysistype) /= 'track') then write(iunit,fmtstring) timei,coltemp(1:ncolumns) endif if (nused /= ntot) then select case(trim(analysistype)) case('diff', 'diffvals') print*,'diff calculated using ',nused,' of ',ntot,' particles' case('amp','ampvals') print*,'amp calculated using ',nused,' of ',ntot,' particles' case('delta','deltavals','deltas') print*,'deltas calculated using ',nused,' of ',ntot,' particles' end select endif case('mean','meanvals') ! !--calculate mean for each column ! coltemp(:) = 0. nused = 0 do j=1,ntot itype = igettype(j) if (iplotpartoftype(itype)) then vals(1:ncolumns) = real(dat(j,1:ncolumns),kind=doub_prec) if (change_coordsys) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) nused = nused + 1 do i=1,ncolumns coltemp(i) = coltemp(i) + vals(i) enddo endif enddo if (nused > 0) then coltemp(:) = coltemp(:)/real(nused) else coltemp(:) = 0. endif ! !--write output to screen/terminal ! do i=1,ncolumns print "(1x,a20,'mean = ',es18.10)",label(i),coltemp(i) enddo ! !--write line to output file ! write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) ncolumns+1 write(iunit,fmtstring) timei,coltemp(1:ncolumns) if (nused /= ntot) print*,'mean calculated using ',nused,' of ',ntot,' particles' case('rms','rmsvals') ! !--calculate RMS for each column ! coltemp(:) = 0. nused = 0 do j=1,ntot itype = igettype(j) if (iplotpartoftype(itype)) then vals(1:ncolumns) = real(dat(j,1:ncolumns),kind=doub_prec) if (change_coordsys) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) nused = nused + 1 do i=1,ncolumns coltemp(i) = coltemp(i) + vals(i)**2 enddo endif enddo if (nused > 0) then coltemp(:) = sqrt(coltemp(:)/real(nused)) else coltemp(:) = 0. endif ! !--write output to screen/terminal ! do i=1,ncolumns print "(1x,a20,'rms (mass weighted) = ',es18.10)",label(i),coltemp(i) enddo ! !--write line to output file ! write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) ncolumns+1 write(iunit,fmtstring) timei,coltemp(1:ncolumns) if (nused /= ntot) print*,'rms calculated using ',nused,' of ',ntot,' particles' case('vrms','vrmsvals','vwrms','rmsvw') if (irho <= 0 .or. irho > ncolumns) then print "(a)",' ERROR in volume weighted rms calculation!'// & ' density not present / not labelled in dump file, skipping...' return endif ! !--warn if particle masses not found ! if (ipmass <= 0 .or. ipmass > ncolumns .and. all(massoftype < tiny(massoftype))) then print "(a)",' WARNING in volume weighted rms calculation!'// & ' masses not read or are zero from dump file' endif ! !--calculate volume-weighted RMS for each column ! rmsval(:) = 0. totvol = 0. do j=1,ntot itype = igettype(j) if (iplotpartoftype(itype)) then vals(1:ncolumns) = real(dat(j,1:ncolumns),kind=doub_prec) if (change_coordsys) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) pmassi = particlemass(j,itype) rhoi = dat(j,irho) if (rhoi > 0.) then voli = pmassi/rhoi else voli = 0. endif do i=1,ncolumns rmsval(i) = rmsval(i) + voli*vals(i)**2 enddo totvol = totvol + voli endif enddo coltemp(:) = real(sqrt(rmsval(:)/totvol)) print "(1x,a,es9.2)",'volume = ',totvol ! !--write output to screen/terminal ! do i=1,ncolumns print "(1x,a20,'rms (volume weighted) = ',es18.10)",label(i),coltemp(i) enddo ! !--write line to output file ! write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) ncolumns+1 write(iunit,fmtstring) timei,coltemp(1:ncolumns) case('rhovar','rhomach') if (irho <= 0 .or. irho > ncolumns) then print "(a)",' ERROR in density variance--rms velocity field calculation!'// & ' density not present / not labelled in dump file, skipping...' return endif ! !--warn if particle masses not found ! if (ipmass <= 0 .or. ipmass > ncolumns .and. all(massoftype < tiny(massoftype))) then print "(a)",' WARNING in volume weighted rms calculation!'// & ' masses not read or are zero from dump file' endif if (ivx <= 0 .or. ivx > ncolumns) then print "(a)",' WARNING in volume weighted rms calculation!'// & ' velocities not present / not labelled in dump file' endif ! !--calculate mean density and rms velocity values on first pass ! rmsvali = 0. rmsvmw = 0. rhomeanvw = 0. rhomeanmw = 0. totvol = 0. smeanvw = 0. smeanmw = 0. do i=1,ntot itype = igettype(i) pmassi = particlemass(i,itype) rhoi = dat(i,irho) if (rhoi > 0.) then voli = pmassi/rhoi else voli = 0. endif rhomeanmw = rhomeanmw + rhoi rhomeanvw = rhomeanvw + pmassi si = log(rhoi) smeanmw = smeanmw + si smeanvw = smeanvw + voli*si totvol = totvol + voli ! !--mean squared velocity ! if (ivx > 0 .and. ivx <= ncolumns) then v2i = dot_product(dat(i,ivx:ivx+ndimV-1),dat(i,ivx:ivx+ndimV-1)) rmsvali = rmsvali + voli*v2i rmsvmw = rmsvmw + v2i endif enddo ! !--use the computed volume for velocity, otherwise won't be normalised correctly ! rmsvali = sqrt(rmsvali/totvol) rmsvmw = sqrt(rmsvmw/dble(ntot)) ! !--option to override volume from sum with environment variable ! voli = renvironment('SPLASH_CALC_VOLUME',errval=-1.0) if (voli > 0.) then print "(1x,a,es9.2)",& 'volume from sum(m/rho) = ',totvol totvol = voli print "(1x,a,es9.2,/)",& '**overridden with SPLASH_CALC_VOLUME = ',totvol else print "(1x,a,es9.2,/,1x,a,/)",& 'volume from sum(m/rho) = ',totvol,& '(override this using SPLASH_CALC_VOLUME environment variable)' endif rhomeanmw = rhomeanmw/real(ntot) rhomeanvw = rhomeanvw/totvol smeanmw = smeanmw/real(ntot) smeanvw = smeanvw/totvol ! !--calculate variance on second pass ! rhovarvw = 0. rhovarmw = 0. svarvw = 0. svarmw = 0. totvol = 0. do i=1,ntot itype = igettype(i) pmassi = particlemass(i,itype) rhoi = dat(i,irho) if (rhoi > 0.) then voli = pmassi/rhoi si = log(rhoi) else voli = 0. si = 0. endif totvol = totvol + voli rhovarmw = rhovarmw + (rhoi - rhomeanmw)**2 rhovarvw = rhovarvw + voli*(rhoi - rhomeanvw)**2 svarmw = svarmw + (si - smeanmw)**2 svarvw = svarvw + voli*(si - smeanvw)**2 enddo rhovarmw = rhovarmw/real(ntot) rhovarvw = rhovarvw/totvol svarmw = svarmw/real(ntot) svarvw = svarvw/totvol ! !--write output to screen/terminal ! print "(1x,'mean density (vol. weighted) = ',es11.4,' +/- ',es11.4)",rhomeanvw,sqrt(rhovarvw) print "(1x,'mean density (mass weighted) = ',es11.4,' +/- ',es11.4)",rhomeanmw,sqrt(rhovarmw) print "(1x,'density variance (vol. weighted) = ',es11.4)",rhovarvw print "(1x,'density variance (mass weighted) = ',es11.4)",rhovarmw print "(1x,'mean ln density (vol. weighted) = ',es11.4,' +/- ',es11.4)",smeanvw,sqrt(svarvw) print "(1x,' -0.5*var(ln density) = ',es11.4)",-0.5*svarvw print "(1x,'mean ln density (mass weighted) = ',es11.4,' +/- ',es11.4)",smeanmw,sqrt(svarmw) print "(1x,'ln density variance (vol. weighted) = ',es11.4)",svarvw print "(1x,'ln density variance (mass weighted) = ',es11.4)",svarmw print "(1x,'rms velocity (vol. weighted) = ',es11.4)",rmsvali print "(1x,'rms velocity (mass weighted) = ',es11.4)",rmsvmw if (rmsvali > 0.) then bval = sqrt(svarvw)/rmsvali else bval = 0. endif if (rmsvmw > 0.) then bvalmw = sqrt(svarmw)/rmsvmw else bvalmw = 0. endif print "(1x,'sqrt(sigma^2/v^2)(vol. weighted) = ',f11.3)",bval print "(1x,'sqrt(sigma^2/v^2)(mass weighted) = ',f11.3)",bvalmw ! !--write line to output file ! write(fmtstring,"('(',i3,'(es18.10,1x))')",iostat=ierr) 17 write(iunit,fmtstring) timei,rhomeanvw,rhomeanmw,rhovarvw,rhovarmw,sqrt(rhovarvw),sqrt(rhovarmw),& rmsvali,rmsvmw,bval,bvalmw,smeanvw,smeanmw,svarvw,svarmw,sqrt(svarvw),sqrt(svarmw) case('kh') if (irho <= 0 .or. irho > ncolumns) then print "(a)",' ERROR in kh calculation!'// & ' density not present / not labelled in dump file, skipping...' return endif if (ivx <= 0 .or. ivx > ncolumns) then print "(a)",' WARNING in kh calculation!'// & ' velocities not present / not labelled in dump file' endif ! !--calculate volume-weighted RMS for each column ! ekinymax = 0. do i=1,ntot ekiny = 0.5*dat(i,irho)*dat(i,ivx+1)**2 ekinymax = max(ekiny,ekinymax) enddo print "(1x,a,es9.2)",'ekiny(max) = ',ekinymax write(iunit,"(2(es18.10,1x))") timei,ekinymax case('timeaverage','timeav') if (.not.allocated(datmean)) then allocate(datmean(ntot,ncolumns),stat=ierr) if (ierr /= 0) stop 'error allocating memory for mean sum in calc' datmean = 0. endif if (.not.allocated(datvar)) then allocate(datvar(ntot,ncolumns),stat=ierr) if (ierr /= 0) stop 'error allocating memory for variance sum in calc' datvar = 0. endif ntot1 = size(datmean(:,1)) if (ntot > ntot1) then print*,' WARNING: nrows = ',ntot,' > nrows from previous dumpfile =',ntot1 print*,' ignoring all rows/particles greater than ',ntot1 elseif (ntot < ntot1) then print*,' WARNING: nrows = ',ntot,' < nrows from previous dumpfile =',ntot1 print*,' assuming zeros for rows/particles greater than ',ntot endif ncol1 = size(datmean(1,:)) if (ncolumns > ncol1) then print*,' WARNING: ncolumns = ',ncolumns,' > ncolumns from previous dumpfile =',ncol1 print*,' ignoring all rows/particles greater than ',ncol1 elseif (ncolumns < ncol1) then print*,' WARNING: ncolumns = ',ntot,' < ncolumns from previous dumpfile =',ncol1 print*,' assuming zeros for columns greater than ',ncolumns endif ntot1 = min(ntot1,ntot) ncol1 = min(ncol1,ncolumns) dn = 1./real(nfilesread) ! !--compute the mean and variance using Knuth/Welford's compensated ! summation algorithm to minimise round-off error ! (see http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance) ! do j=1,ncol1 do i=1,ntot1 delta = dat(i,j) - datmean(i,j) datmean(i,j) = datmean(i,j) + delta*dn datvar(i,j) = datvar(i,j) + delta*(dat(i,j) - datmean(i,j)) enddo enddo return !sum1(:,:) = sum1(:,:) + dat(1:ntot1,1:ncol1) !sum2(:,:) = sum2(:,:) + dat(1:ntot1,1:ncol1)**2 case('ratio','minus','add') if (.not.allocated(datmean)) then allocate(datmean(size(dat(:,1)),size(dat(1,:))),stat=ierr) if (ierr /= 0) stop 'error allocating temporary memory in calc' datmean = 0. endif if (.not.allocated(datvar)) then allocate(datvar(size(dat(:,1)),size(dat(1,:))),stat=ierr) if (ierr /= 0) stop 'error allocating memory in calc' datvar = 0. endif ntot1 = size(datmean(:,1)) if (ntot > ntot1) then print*,' WARNING: nrows = ',ntot,' > nrows from previous dumpfile =',ntot1 print*,' ignoring all rows/particles greater than ',ntot1 elseif (ntot < ntot1) then print*,' WARNING: nrows = ',ntot,' < nrows from previous dumpfile =',ntot1 print*,' assuming zeros for rows/particles greater than ',ntot endif ncol1 = size(datmean(1,:)) if (size(dat(1,:)) > ncol1) then print*,' WARNING: ncolumns = ',ncolumns,' > ncolumns from previous dumpfile =',ncol1 print*,' ignoring all rows/particles greater than ',ncol1 elseif (ncolumns < ncol1) then print*,' WARNING: ncolumns = ',ntot,' < ncolumns from previous dumpfile =',ncol1 print*,' assuming zeros for columns greater than ',ncolumns endif ntot1 = min(ntot1,ntot) ncol1 = min(ncol1,size(dat(1,:))) if (ntot1 <= 0 .or. ncol1 <= 0) then print "(a,i2,a,i2,a)",' ERROR: nrows = ',ntot1,' ncolumns = ',ncol1,' aborting...' return endif if (nfilesread <= 1) then !--store first dump datmean(1:ntot1,1:ncol1) = dat(1:ntot1,1:ncol1) else select case(trim(analysistype)) case('add') datvar(1:ntot1,1:ncol1) = dat(1:ntot1,1:ncol1) + datmean(1:ntot1,1:ncol1) ! sum of current data and first step case('minus') datvar(1:ntot1,1:ncol1) = datmean(1:ntot1,1:ncol1) - dat(1:ntot1,1:ncol1) ! first step minus current data case default ! ratio where (abs(datmean(1:ntot1,1:ncol1)) > epsilon(0.)) datvar(1:ntot1,1:ncol1) = dat(1:ntot1,1:ncol1)/datmean(1:ntot1,1:ncol1) ! ratio of current data to first step elsewhere datvar(1:ntot1,1:ncol1) = dat(1:ntot1,1:ncol1)/(datmean(1:ntot1,1:ncol1) + epsilon(0.)) end where end select valmin = datvar(1,1) valmax = datvar(1,1) valmean = 0. do j=1,ncol1 do i=1,ntot1 valmin = min(datvar(i,j),valmin) valmax = max(datvar(i,j),valmin) valmean = valmean + datvar(i,j) enddo enddo valmean = valmean/real(ntot1*ncol1) print "(/,a,es10.3)",' max '//trim(analysistype)//' = ',valmax print "(a,es10.3)",' min '//trim(analysistype)//' = ',valmin print "(a,es10.3,/)",' mean '//trim(analysistype)//' = ',valmean print "(a)",'----> WRITING '//trim(analysistype)//'.out ...' if (allocated(datmean) .and. allocated(datvar)) then write(iunit,"('# ',i4,1x,i4)") ntot1,ncol1 write(fmtstring,"(a,i6,a)",iostat=ierr) '(',ncol1,'(es14.6,1x,))' do i=1,ntot1 write(iunit,fmtstring) datvar(i,:) enddo endif endif return case('lightcurve') call get_lightcurve(ncolumns,dat,npartoftype,massoftype,iamtype,ndim,ntypes,& lum,rphoto,tphoto,l_bb,r_bb,t_bb,badfrac,basename(rootname(ifileopen)),ierr) print "(4(/,1x,a20,' = ',es9.2))",'Luminosity',lum,'photospheric radius ',rphoto,'photospheric temperature',tphoto ! !--write line to output file ! if (ierr == 0) write(iunit,"(8(es18.10,1x))") timei,lum,rphoto,tphoto,l_bb,r_bb,t_bb,badfrac case('extinction') ! !--get list of sink particle positions ! isinktype = get_sink_type(ntypes) call get_positions_of_type(dat,npartoftype,iamtype,isinktype,ix,npts,xpts,ypts,zpts,ierr) if (ierr /= 0 .or. npts <= 0) then print*,' ERROR obtaining sink particle positions, aborting...' return endif call get_extinction(ncolumns,dat,npartoftype,massoftype,iamtype,ndim,ntypes,& npts,xpts,ypts,zpts,coltemps,irho) labelc = get_unitlabel_coldens(iRescale,labelzintegration,unitslabel(irho)) print "(100(/,1x,a20,i0,' = ',es9.2,a))",('Sigma to sink ',i,coltemps(i),trim(labelc),i=1,npts) ! !--write line to output file ! write(iunit,"(100(es18.10,5x))") timei,coltemps(1:npts) case('tdiffuse') icol = ienvironment('SPLASH_ANALYSIS_COL') if (icol <= 0 .or. icol > ncolumns) then icol = irho endif call get_extinction_los(ncolumns,dat,npartoftype,massoftype,iamtype,ndim,ntypes,& ndirs,anglex_vals,angley_vals,anglez_vals,coltemps,icol) labelc = get_unitlabel_coldens(iRescale,labelzintegration,unitslabel(icol)) print "(100(/,1x,a20,' = ',es12.4,a))",('Sigma in '//trim(dir_label(i)),coltemps(i),trim(labelc),i=1,ndirs) ! !--write line to output file ! write(iunit,"(100(es18.10,5x))") timei,coltemps(1:ndirs) case default print "(a)",' ERROR: unknown analysis type in write_analysis routine' return end select if (nfileout==1) print "(/,1x,'>>> ',a,' <<<')",'written to '//trim(fileout(1)) return contains ! !--small internal utility to work out the particle type ! (which depends whether or not mixed types are stored) ! integer function igettype(i) integer :: np integer, intent(in) :: i if (size(iamtype) > 1) then igettype = int(iamtype(i)) else np = 0 igettype = 0 do while (i > np .and. igettype <= ntypes) igettype = igettype + 1 np = np + npartoftype(igettype) enddo endif end function igettype ! !--small internal utility to get particle mass ! (depends on whether or not mass is stored for each particle ! or only for each type) ! real function particlemass(i,iparttype) integer, intent(in) :: i,iparttype if (ipmass > 0 .and. ipmass <= ncolumns) then particlemass = dat(i,ipmass) else particlemass = massoftype(iparttype) endif end function particlemass end subroutine write_analysis !--------------------- ! close output file !--------------------- subroutine close_analysis(analysistype) character(len=*), intent(in) :: analysistype integer :: i select case(trim(analysistype)) case('timeaverage','timeav') print "(a)",'----> WRITING time_average.out ...' if (allocated(datmean) .and. allocated(datvar) .and. nfilesread > 0) then !--get standard deviation from variance (also normalise with 1/n) datvar(:,:) = sqrt(datvar(:,:))/sqrt(real(nfilesread)) do i=1,size(datmean(:,1)) write(iunit,"(1x,99(es15.7,2x))") datmean(i,:),datvar(i,:) enddo endif end select if (allocated(datmean)) deallocate(datmean) if (allocated(datvar)) deallocate(datvar) do i=1,nfileout close(iunit+i-1) enddo return end subroutine close_analysis end module analysis danieljprice-splash-4d1f09c/src/asciiutils.f90000066400000000000000000001472521477365367100213650ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------------------------------------------- ! module containing various utility subroutines ! related to reading from ascii files and dealing with string variables ! ! written by Daniel Price, University of Exeter 2007 24th April '07 ! revised at Monash University, 2008 - ! daniel.price@monash.edu ! ! this is a standalone module with no dependencies !--------------------------------------------------------------------------- module asciiutils implicit none public :: read_asciifile,get_ncolumns,get_nrows,ncolumnsline,safename,basename,numfromfile public :: cstring,fstring,add_escape_chars public :: string_replace,string_delete,get_nheaderlines,string_sub public :: ucase,lcase,strip public :: get_line_containing public :: enumerate,isdigit,get_digits,integer_to_string,split public :: get_column_labels,read_column_labels public :: match_tag,match_taglist,append_number,make_tags_unique,get_value public :: match_column,match_tag_start,match_integer,match_lists public :: count_non_blank,find_repeated_tags,count_char public :: get_extensions,readline_csv,extension public :: sort_filenames_for_comparison public :: read_var_from_file integer, parameter :: max_line_length = 10000 ! for finding number of columns private !-------------------------------------------------- ! Generic interface to ascii file read for either ! character arrays (ie. each line is an element) ! or an array of real numbers !-------------------------------------------------- interface read_asciifile module procedure read_asciifile_char, read_asciifile_real,& read_asciifile_real_string, read_asciifile_realarr, & read_asciifile_int end interface read_asciifile interface string_delete module procedure string_delete1,string_delete_array end interface string_delete contains !--------------------------------------------------------------------------- ! Generic subroutine to read all lines of an ascii file ! returns array of character strings (one per line) ! up to a maximum corresponding to the size of the array !--------------------------------------------------------------------------- subroutine read_asciifile_char(filename,nlinesread,charline,ierror,skip) character(len=*), intent(in) :: filename integer, intent(out) :: nlinesread character(len=*), dimension(:), intent(out) :: charline integer, intent(out), optional :: ierror logical, intent(in), optional :: skip integer :: ierr,i,j,maxlines,iunit logical :: iexist,do_skip character(len=1) :: temp nlinesread = 0 if (present(ierror)) ierror = 0 !--if file does not exist, do nothing and return inquire(file=filename,exist=iexist) if (.not.iexist) then if (present(ierror)) ierror = -1 return endif open(newunit=iunit,file=filename,status='old',form='formatted',iostat=ierr) !--error opening file (but file does exist) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename) if (present(ierror)) ierror = ierr return endif ! read lines from file, skipping blank lines maxlines = size(charline) i = 0 j = 1 ierr = 0 do_skip = .false. if (present(skip)) do_skip = skip over_lines: do while(j <= maxlines .and. ierr == 0) i = i + 1 read(iunit,"(a)",iostat=ierr) charline(j) ! skip blank and comment lines if (ierr == 0) then if (do_skip) then temp = adjustl(charline(j)) if (len_trim(charline(j)) > 0 .and. temp(1:1) /= '#') j = j + 1 else j = j + 1 endif endif enddo over_lines nlinesread = j-1 ! emit warnings if errors or reached array limits if (nlinesread >= maxlines) then !--end of array limits ! check to see if there is anything more in the file. Report error if there is. read(iunit,"(a)",iostat=ierr) if (ierr==0) then print "(/,a,i6,/)",' WARNING: array limits reached reading '//trim(filename)//', max = ',maxlines endif nlinesread = min(maxlines,nlinesread-1) elseif (ierr > 0) then print "(a,i6)",' ERROR reading '//trim(filename)//' at line ',i if (present(ierror)) ierror = 1 endif close(unit=iunit) end subroutine read_asciifile_char !--------------------------------------------------------------------------- ! Generic subroutine to read all lines of an ascii file ! returns array of real numbers (either one per line or all on same line) ! up to a maximum corresponding to the size of the array !--------------------------------------------------------------------------- subroutine read_asciifile_real(filename,nlinesread,realarr,ierror) character(len=*), intent(in) :: filename integer, intent(out) :: nlinesread real, dimension(:), intent(out) :: realarr integer, intent(out), optional :: ierror integer, parameter :: iunit = 66 ! logical unit number for read operation integer :: ierr,i,maxlines logical :: iexist i = 0 nlinesread = 0 if (present(ierror)) ierror = 0 !--if file does not exist, do nothing and return inquire(file=filename,exist=iexist) if (.not.iexist) then if (present(ierror)) ierror = -1 return endif open(unit=iunit,file=filename,status='old',form='formatted',iostat=ierr) !--error opening file (but file does exist) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename) if (present(ierror)) then ierror = ierr endif return endif realarr(:) = -666. maxlines = size(realarr) read(iunit,*,err=66,end=99) (realarr(i),i=1,maxlines) !--end of array limits print "(a,i6)",' WARNING: array limits reached reading '//trim(filename)//', max = ',maxlines nlinesread = maxlines close(unit=iunit) return !--error encountered 66 continue print "(a,i6)",' ERROR reading '//trim(filename)//' at line ',i-1 if (present(ierror)) ierror = 1 do i=1,maxlines if (abs(realarr(i)+666.) > tiny(0.)) nlinesread = nlinesread + 1 enddo close(unit=iunit) return !--reached end of file (the expected behaviour) 99 continue do i=1,maxlines if (abs(realarr(i)+666.) > tiny(0.)) nlinesread = nlinesread + 1 enddo close(unit=iunit) return end subroutine read_asciifile_real !--------------------------------------------------------------------------- ! Generic subroutine to read all lines of an ascii file ! returns array of real numbers (either one per line or all on same line) ! up to a maximum corresponding to the size of the array !--------------------------------------------------------------------------- subroutine read_asciifile_int(filename,nlinesread,intarr,ierror) character(len=*), intent(in) :: filename integer, intent(out) :: nlinesread integer, dimension(:), intent(out) :: intarr integer, intent(out), optional :: ierror integer, parameter :: iunit = 66 ! logical unit number for read operation integer :: ierr,i,maxlines logical :: iexist i = 0 nlinesread = 0 if (present(ierror)) ierror = 0 !--if file does not exist, do nothing and return inquire(file=filename,exist=iexist) if (.not.iexist) then if (present(ierror)) ierror = -1 return endif open(unit=iunit,file=filename,status='old',form='formatted',iostat=ierr) !--error opening file (but file does exist) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename) if (present(ierror)) then ierror = ierr endif return endif intarr(:) = -666 maxlines = size(intarr) read(iunit,*,err=66,end=99) (intarr(i),i=1,maxlines) !--end of array limits print "(a,i6)",' WARNING: array limits reached reading '//trim(filename)//', max = ',maxlines nlinesread = maxlines close(unit=iunit) return !--error encountered 66 continue print "(a,i6)",' ERROR reading '//trim(filename)//' at line ',i-1 if (present(ierror)) ierror = 1 do i=1,maxlines if (abs(intarr(i)+666) > 0) nlinesread = nlinesread + 1 enddo close(unit=iunit) return !--reached end of file (the expected behaviour) 99 continue do i=1,maxlines if (abs(intarr(i)+666) > 0) nlinesread = nlinesread + 1 enddo close(unit=iunit) return end subroutine read_asciifile_int !--------------------------------------------------------------------------- ! Generic subroutine to read all lines of an ascii file ! returns 2D array of real numbers (i.e. tabulated data) !--------------------------------------------------------------------------- subroutine read_asciifile_realarr(filename,nlinesread,realarr,ierror) character(len=*), intent(in) :: filename integer, intent(out) :: nlinesread real, dimension(:,:), intent(out) :: realarr integer, intent(out), optional :: ierror integer, parameter :: iunit = 66 ! logical unit number for read operation integer :: ierr,i,ncols,ncolsfile,nheader logical :: iexist nlinesread = 0 if (present(ierror)) ierror = 0 !--if file does not exist, do nothing and return inquire(file=filename,exist=iexist) if (.not.iexist) then if (present(ierror)) ierror = -1 return endif open(unit=iunit,file=filename,status='old',form='formatted',iostat=ierr) !--error opening file (but file does exist) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename) if (present(ierror)) ierror = ierr return else ! get number of columns call get_ncolumns(iunit,ncolsfile,nheader) ! skip header lines do i=1,nheader read(iunit,*,iostat=ierr) enddo ! read 2D array from file ncols = min(ncolsfile,size(realarr(:,1))) nlinesread = 0 do while (ierr==0) nlinesread = nlinesread + 1 read(iunit,*,iostat=ierr) realarr(1:ncols,nlinesread) enddo nlinesread = max(nlinesread - 1,0) close(iunit) endif end subroutine read_asciifile_realarr !--------------------------------------------------------------------------- ! Generic subroutine to read all lines of an ascii file ! returns array of real numbers and corresponding string ! up to a maximum corresponding to the size of the array !--------------------------------------------------------------------------- subroutine read_asciifile_real_string(filename,nlinesread,realarr,charline,ierror) character(len=*), intent(in) :: filename integer, intent(out) :: nlinesread real, dimension(:), intent(out) :: realarr character(len=*), dimension(:), intent(out) :: charline integer, intent(out), optional :: ierror integer, parameter :: iunit = 66 ! logical unit number for read operation integer :: ierr,i,maxlines logical :: iexist nlinesread = 0 if (present(ierror)) ierror = 0 !--if file does not exist, do nothing and return inquire(file=filename,exist=iexist) if (.not.iexist) then if (present(ierror)) ierror = -1 return endif open(unit=iunit,file=filename,status='old',form='formatted',iostat=ierr) !--error opening file (but file does exist) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename) if (present(ierror)) then ierror = ierr endif return endif if (size(realarr) /= size(charline)) then print "(a)",' WARNING: array size mismatch in call to read_asciifile' endif realarr(:) = -666. maxlines = min(size(realarr),size(charline)) read(iunit,*,err=66,end=99) (realarr(i),charline(i),i=1,maxlines) !--end of array limits print "(a,i6)",' WARNING: array limits reached reading '//trim(filename)//', max = ',maxlines nlinesread = maxlines close(unit=iunit) return !--error encountered 66 continue print "(a,i6)",' ERROR reading '//trim(filename)//' at line ',i-1 if (present(ierror)) ierror = 1 do i=1,maxlines if (abs(realarr(i)+666.) > tiny(0.)) nlinesread = nlinesread + 1 enddo close(unit=iunit) return !--reached end of file (the expected behaviour) 99 continue do i=1,maxlines if (abs(realarr(i)+666.) > tiny(0.)) nlinesread = nlinesread + 1 enddo close(unit=iunit) return end subroutine read_asciifile_real_string !--------------------------------------------------------------------------- ! utility to work out number of columns of real numbers ! in an ascii file ! ! file must already be open and at the start ! slightly ad-hoc but its the best way I could think of! !--------------------------------------------------------------------------- subroutine get_ncolumns(lunit,ncolumns,nheaderlines,csv,maxheaderlines) integer, intent(in) :: lunit integer, intent(out) :: ncolumns,nheaderlines integer, intent(in), optional :: maxheaderlines logical, intent(in), optional :: csv integer :: ierr,ncolprev,ncolprev2,ncolsthisline,maxlines,ncolstot character(len=max_line_length) :: line logical :: nansinfile,infsinfile,is_csv if (present(maxheaderlines)) then maxlines = maxheaderlines else maxlines = 1000 endif nheaderlines = 0 line = ' ' ierr = 0 ncolumns = 0 ncolprev = -100 ncolprev2 = -200 ncolsthisline = 0 ncolstot = 0 nansinfile = .false. infsinfile = .false. is_csv = .false. if (present(csv)) is_csv = csv ! !--loop until we find two consecutive lines with the same number of columns (but non zero) ! if ncolumns==1 then we must find 3 consecutive lines ! do while ((len_trim(line)==0 .or. ncolsthisline /= ncolprev .or. ncolumns < 1 .or. & (ncolumns==1 .and. ncolsthisline /= ncolprev2)) & .and. ierr==0 .and. nheaderlines <= maxlines) ncolprev2 = ncolprev ncolprev = ncolumns read(lunit,"(a)",iostat=ierr) line if (index(line,'NaN') > 0) nansinfile = .true. if (index(line,'Inf') > 0) infsinfile = .true. if (len_trim(line)==0) then ncolsthisline = -1 else if (ierr==0) ncolsthisline = ncolumnsline(line,csv=is_csv,ntot=ncolstot) ncolumns = ncolsthisline endif nheaderlines = nheaderlines + 1 !print*,'DEBUG: header line ',nheaderlines,' ncols = ',ncolsthisline,'"'//trim(line)//'"' enddo !--subtract 2 from the header line count (the last two lines which were the same) nheaderlines = max(nheaderlines - 2,0) if (ncolumns==1) nheaderlines = max(nheaderlines - 1,0) if (is_csv) ncolumns = ncolstot if (ierr > 0 .or. ncolumns <= 0) then ncolumns = 0 elseif (ierr < 0) then !print*,ncolumns,ncolprev endif if (nansinfile) print "(a)",' INDIAN BREAD WARNING!! NaNs in file!!' if (infsinfile) print "(a)",' WARNING!! Infs in file!!' rewind(lunit) if (ncolumns==0) print "(a)",' ERROR: no columns of real numbers found' end subroutine get_ncolumns !--------------------------------------------------------------------------- ! utility to work out number of rows in file !--------------------------------------------------------------------------- subroutine get_nrows(lunit,nheaderlines,nlines) integer, intent(in) :: lunit,nheaderlines integer, intent(out) :: nlines integer :: ierr,i rewind(lunit) ierr = 0 do i=1,nheaderlines read(lunit,*,iostat=ierr) enddo nlines = 0 do while (ierr==0) read(lunit,*,iostat=ierr) if (ierr==0) nlines = nlines + 1 enddo end subroutine get_nrows !--------------------------------------------------------------------------- ! ! function returning the number of columns of real numbers from a given line ! !--------------------------------------------------------------------------- integer function ncolumnsline(line,csv,ntot) character(len=*), intent(in) :: line logical, intent(in), optional :: csv integer, intent(out), optional :: ntot real :: dummyreal(1000) integer :: ierr,i logical :: use_commas use_commas= .false. if (present(csv)) use_commas = csv if (use_commas) then if (present(ntot)) then ncolumnsline = ncolumnsline_csv(line,ntot) else ncolumnsline = ncolumnsline_csv(line) endif return endif dummyreal = -666666.0 ierr = 0 read(line,*,iostat=ierr) (dummyreal(i),i=1,size(dummyreal)) i = 1 ncolumnsline = 0 do while(abs(dummyreal(i)+666666.) > tiny(0.) .or. dummyreal(i) /= dummyreal(i)) ncolumnsline = ncolumnsline + 1 i = i + 1 if (i > size(dummyreal)) then print "(a)",'*** ERROR: too many columns in file' ncolumnsline = size(dummyreal) return endif enddo end function ncolumnsline !--------------------------------------------------------------------------- ! ! function returning the number of columns of real numbers from a given line ! !--------------------------------------------------------------------------- integer function ncolumnsline_csv(line,ntot) result(ncols) character(len=*), intent(in) :: line integer, parameter :: lenf = 15 character(len=lenf) :: fields(len(line)/lenf) integer, intent(out), optional :: ntot integer :: i,ierr,nfields real :: dum ! split line by commas call split(line,',',fields,nfields) ! report how many columns contain real numbers ! or blank (non-text) entries ncols = 0 do i=1,nfields if (len_trim(fields(i))==0) then ncols = ncols + 1 else dum = -666666. read(fields(i),*,iostat=ierr) dum if (ierr==0) then ncols = ncols + 1 endif endif enddo if (present(ntot)) ntot = nfields end function ncolumnsline_csv !--------------------------------------------------------------------------- ! ! read a line from a csv file and parse for real numbers ! !--------------------------------------------------------------------------- subroutine readline_csv(line,ncols,datcol) character(len=*), intent(in) :: line integer, intent(in) :: ncols real, intent(out) :: datcol(ncols) integer, parameter :: lenf = 15 character(len=lenf) :: fields(ncols) !logical, intent(in) :: mask(ncols) integer :: nfields,i,icol,ierr ! split line by commas call split(line,',',fields,nfields) ! read only columns that contain real numbers icol = 0 do i=1,min(nfields,ncols) icol = icol + 1 read(fields(i),*,iostat=ierr) datcol(icol) enddo end subroutine readline_csv !---------------------------------------------------------------------- ! ! Small utility to return the number of comment lines in an ascii ! file. These are lines that do not begin with a number. ! ! This is slightly different to what is done in the get_ncolumns ! routine, where header lines are any lines not having the same number ! of columns. Here we do not attempt to evaluate the number of data ! columns. ! ! File must be open and at the desired starting position !---------------------------------------------------------------------- integer function get_nheaderlines(lunit) result(nheaderlines) integer, intent(in) :: lunit real :: dum integer :: ierr dum = -666. nheaderlines = 0 ierr = -1 do while (abs(dum+666.) < tiny(0.) .or. ierr /= 0) nheaderlines = nheaderlines + 1 read(lunit,*,iostat=ierr) dum enddo nheaderlines = nheaderlines - 1 end function get_nheaderlines !--------------------------------------------------------------------------- ! ! function stripping '/', '\' and spaces out of filenames ! !--------------------------------------------------------------------------- function safename(string) character(len=*), intent(in) :: string character(len=len(string)) :: safename integer :: ipos safename = string !--remove forward slashes which can be mistaken for directories: replace with '_' call string_replace(safename,'/','_') call string_replace(safename,' ','_') !--delete brackets and operators of all kinds call string_delete(safename,'{') call string_delete(safename,'}') call string_delete(safename,'(') call string_delete(safename,')') call string_delete(safename,'[') call string_delete(safename,']') call string_delete(safename,'<') call string_delete(safename,'>') call string_delete(safename,'*') call string_delete(safename,'?') call string_delete(safename,'^') call string_delete(safename,'''') call string_delete(safename,'"') call string_delete(safename,'&') call string_delete(safename,'#') call string_delete(safename,'|') !--remove escape sequences: remove '\' and position following ipos = index(trim(safename),'\') do while (ipos /= 0) safename = safename(1:ipos-1)//safename(ipos+2:len_trim(safename)) ipos = index(trim(safename),'\') enddo end function safename !--------------------------------------------------------------------------- ! ! function to insert escape characters so filenames appear correctly in legend ! !--------------------------------------------------------------------------- function add_escape_chars(string) character(len=*), intent(in) :: string character(len=len(string)) :: add_escape_chars add_escape_chars = string call string_replace(add_escape_chars,'_','\_') call string_replace(add_escape_chars,'^','\^') end function add_escape_chars !--------------------------------------------------------------------------- ! ! function to strip spaces out of a string ! !--------------------------------------------------------------------------- function nospaces(string) character(len=*), intent(in) :: string character(len=len(string)) :: nospaces nospaces = string call string_delete(nospaces,' ') end function nospaces !--------------------------------------------------------------------------- ! ! function stripping the directory off a filename ! !--------------------------------------------------------------------------- function basename(string) character(len=*), intent(in) :: string character(len=len(string)) :: basename integer :: i,iposmax basename = string !--find the last forward slash iposmax = 0 i = len_trim(string) do while(i >= 2 .and. iposmax==0) i = i - 1 if (string(i:i)=='/') iposmax = i enddo basename = trim(string(iposmax+1:)) end function basename !--------------------------------------------------------------------------- ! ! function to get file extension ! !--------------------------------------------------------------------------- function extension(string) result(ext) character(len=*), intent(in) :: string character(len=len(string)) :: ext integer :: idot idot = index(string,'.',back=.true.) if (idot > 2 .and. idot+1 <= len(string)) then ext = string(idot:) else ext = '' endif end function extension !--------------------------------------------------------------------------- ! ! function to safely convert a string to c format (ie. with a terminating ! ascii null character) ! !--------------------------------------------------------------------------- function cstring(string) character(len=*), intent(in) :: string character(len=len(string)+1) :: cstring cstring = trim(string)//achar(0) end function cstring !--------------------------------------------------------------------------- ! ! function to safely convert a string from c format (ie. with a terminating ! ascii null character) back to a normal Fortran string ! !--------------------------------------------------------------------------- function fstring(array) use, intrinsic :: iso_c_binding, only:c_char character(kind=c_char), dimension(:), intent(in) :: array character(len=size(array)-1) :: fstring integer :: i fstring = '' do i=1,size(array) if (array(i)==achar(0)) exit fstring(i:i) = array(i) enddo end function fstring !--------------------------------------------------------------------------- ! ! subroutine to replace a matching section of a string with another ! string, possibly of differing length ! !--------------------------------------------------------------------------- subroutine string_replace(string,skey,sreplacewith) character(len=*), intent(inout) :: string character(len=*), intent(in) :: skey,sreplacewith character(len=len(string)) :: remstring integer :: ipos,imax,lensub,i,iposnext ipos = index(trim(string),skey) lensub = len(skey) imax = len(string) i = 0 do while (ipos > 0 .and. i <= imax) iposnext = ipos + len(sreplacewith) i = i + 1 ! only allow as many replacements as characters remstring = string(ipos+lensub:len_trim(string)) string = string(1:ipos-1)//sreplacewith//remstring ipos = index(trim(string(iposnext:)),skey) if (ipos > 0) ipos = ipos + iposnext !print*,ipos,' string = ',trim(string),'iposnext = ',trim(string(iposnext:)) enddo end subroutine string_replace !--------------------------------------------------------------------------- ! ! subroutine to replace a specified section of a string with a ! replacement string, possibly of differing length ! !--------------------------------------------------------------------------- subroutine string_sub(string,i1,i2,sreplacewith) character(len=*), intent(inout) :: string integer, intent(in) :: i1,i2 character(len=*), intent(in) :: sreplacewith character(len=len(string)) :: oldstring oldstring = string if (i2 < len_trim(string)) then string = oldstring(1:i1-1)//sreplacewith//oldstring(i2+1:len_trim(oldstring)) else string = oldstring(1:i1-1)//sreplacewith endif end subroutine string_sub !--------------------------------------------------------------------------- ! ! subroutine to delete all matching occurrences of key from string ! !--------------------------------------------------------------------------- pure subroutine string_delete1(string,skey) character(len=*), intent(inout) :: string character(len=*), intent(in) :: skey integer :: ipos,lensub ipos = index(string,skey) lensub = len(skey) do while(ipos > 0) string = string(1:ipos-1)//string(ipos+lensub:len_trim(string)) ipos = index(trim(string),skey) enddo end subroutine string_delete1 !--------------------------------------------------------------------------- ! ! alternate version of above for arrays of keys ! !--------------------------------------------------------------------------- pure subroutine string_delete_array(string,skeys) character(len=*), intent(inout) :: string character(len=*), intent(in) :: skeys(:) integer :: i do i=1,size(skeys) call string_delete(string,skeys(i)) enddo end subroutine string_delete_array !--------------------------------------------------------------------------- ! ! function version of string_delete ! !--------------------------------------------------------------------------- pure elemental function strip(string,skey) character(len=*), intent(in) :: string,skey character(len=len(string)) :: strip strip = string call string_delete(strip,skey) end function strip !--------------------------------------------------------------------------- ! ! Converts a string to upper case ! !--------------------------------------------------------------------------- pure elemental function ucase(string) character(len=*), intent(in) :: string character(len=len(string)) :: ucase integer :: is,ia integer, parameter :: aoffset = 32 ucase = string do is = 1, len(ucase) ia = iachar(ucase(is:is)) if (ia >= iachar('a').and.ia <= iachar('z')) & ucase(is:is) = achar(ia-aoffset) enddo end function ucase !--------------------------------------------------------------------------- ! ! Converts a string to lower case ! !--------------------------------------------------------------------------- pure elemental function lcase(string) character(len=*), intent(in) :: string character(len=len(string)) :: lcase integer :: is,ia integer, parameter :: aoffset = 32 lcase = string do is = 1, len(lcase) ia = iachar(lcase(is:is)) if (ia >= iachar('A').and.ia <= iachar('Z')) & lcase(is:is) = achar(ia+aoffset) enddo end function lcase !--------------------------------------------------------------------------- ! ! indicate if a character is a digit (number) or not ! !--------------------------------------------------------------------------- pure elemental logical function isdigit(string) character(len=1), intent(in) :: string integer :: ia isdigit = .false. ia = iachar(string) if (ia >= iachar('0').and.ia <= iachar('9')) isdigit = .true. end function isdigit !------------------------------------------------------------------------ ! get_digits: for an integer i returns number of digits it contains ! and a list of these *without* using write statements ! ! i : integer to split into digits ! nmax : dimensions of digits array ! digits(nmax) : array of digits ! ndigits : number of digits in i !------------------------------------------------------------------------ pure subroutine get_digits(i,digits,ndigits) integer, intent(in) :: i integer, intent(out) :: ndigits integer, intent(out), dimension(:) :: digits integer :: j,isubtract,idigit ndigits = 0 isubtract = 0 do j=size(digits),0,-1 if (i >= 10**j) then ndigits = ndigits + 1 idigit = (i - isubtract)/10**j digits(ndigits) = idigit isubtract = isubtract + digits(ndigits)*10**j endif enddo end subroutine get_digits !--------------------------------------------------------------------------- ! ! convert a string to an integer WITHOUT using write statement ! (so this can be used in a write or print statement) ! !--------------------------------------------------------------------------- pure elemental function integer_to_string(i) result(string) integer, intent(in) :: i character(len=12) :: string integer :: i0,ndigits,j integer :: idigit(12) string = '' i0 = iachar('0') call get_digits(i,idigit,ndigits) do j=2,ndigits string(j:j) = achar(i0+idigit(j)) enddo end function integer_to_string !--------------------------------------------------------------------------- ! ! search a file for the line containing a particular string ! !--------------------------------------------------------------------------- integer function get_line_containing(filename,string) character(len=*), intent(in) :: filename, string character(len=130) :: line integer :: i,ierr integer, parameter :: lu=95 get_line_containing = 0 open(unit=lu,file=filename,status='old',iostat=ierr) i = 0 do while(ierr==0) i = i + 1 read(lu,"(a)",iostat=ierr) line if (index(line,string) /= 0) get_line_containing = i enddo close(lu) end function get_line_containing !--------------------------------------------------------------------------- ! ! Convert an integer into the corresponding entry in a list of strings ! !--------------------------------------------------------------------------- function enumerate(i,stringarr,default) result(string) integer, intent(in) :: i character(len=*), intent(in), dimension(:) :: stringarr integer, intent(in), optional :: default character(len=len(stringarr)) :: string string = '' if (i >= 1 .and. i <= size(stringarr)) then string = trim(stringarr(i)) elseif (present(default)) then if (default >= 1 .and. i <= size(stringarr)) then string = trim(stringarr(default)) endif endif end function enumerate !--------------------------------------------------------------------------- ! ! Split a string into substrings based on a delimiter ! !--------------------------------------------------------------------------- pure subroutine split(string,delim,stringarr,nsplit) character(len=*), intent(in) :: string character(len=*), intent(in) :: delim character(len=*), intent(out), dimension(:), optional :: stringarr integer, intent(out) :: nsplit integer :: i,j,imax,iend,nmax i = 1 nsplit = 0 imax = len(string) nmax = imax if (present(stringarr)) nmax = size(stringarr) do while(nsplit < nmax .and. i <= imax) ! find next non-blank character if (string(i:i)==' ') then do while (string(i:i)==' ') i = i + 1 if (i > imax) exit enddo if (i > imax) exit endif ! look for next occurrence of delimiter j = index(string(i:),delim) - 1 ! if no delimiter found, use whole rest of string if (j < 0) j = imax ! set end of substring iend = min(i+j-1,imax) ! extract the substring nsplit = nsplit + 1 if (nsplit <= nmax .and. present(stringarr)) then stringarr(nsplit) = string(i:iend) endif i = iend + len(delim) + 1 enddo end subroutine split !--------------------------------------------------------------------------- ! ! extract a list of labels from the header line of a file ! !--------------------------------------------------------------------------- subroutine get_column_labels(line,nlabels,labels,method,ndesired,csv) character(len=*), intent(in) :: line integer, intent(out) :: nlabels character(len=*), dimension(:), intent(out) :: labels integer, intent(out), optional :: method integer, intent(in), optional :: ndesired logical, intent(in), optional :: csv integer :: i1,i2,i,nlabelstmp,nlabels_prev,istyle,ntarget character(len=1) :: leadingchar character(len=4), parameter :: spaces = ' ' logical :: is_csv nlabels = 0 i1 = 1 istyle = 0 ntarget = -1 is_csv = .false. if (present(csv)) is_csv = csv if (present(ndesired)) ntarget = ndesired ! ! strip leading comment character ('#') ! leadingchar = trim(adjustl(line)) if (leadingchar=='#') then i1 = index(line,'#') + 1 endif ! strip anything preceding an equals sign i1 = max(i1,index(line,'=')+1) i2 = i1 if (index(nospaces(line),'][') > 0 .and. .not.is_csv) then ! ! format style 1: # [ mylabel1 ] [ mylabel2 ] [ mylabel3 ] ! istyle = 1 i1 = max(index(line,'[')+1,i1) ! strip leading square bracket ! try with different number of spaces between brackets (if labels not found) over_spaces1: do i=4,0,-1 call split(line(i1:),']'//spaces(1:i)//'[',labels,nlabels) if (nlabels > 1) exit over_spaces1 enddo over_spaces1 elseif (index(line,',') > 1 .or. is_csv) then ! ! format style 2: mylabel1,mylabel2,mylabel3 ! istyle = 2 call split(line(i1:),',',labels,nlabelstmp) if (is_csv) then nlabels = nlabelstmp ! allow blank/arbitrary labels in csv format else nlabels = count_sensible_labels(nlabelstmp,labels) endif else ! ! format style 3: # mylabel1 mylabel2 mylabel3 ! istyle = 3 ! try splitting with 4, then 3, then 2 spaces until the number of labels decreases nlabels_prev = 0 over_spaces: do i=4,2,-1 call split(line(i1:),spaces(1:i),labels,nlabelstmp) ! quit if we already have the target number of labels if (nlabelstmp == ntarget) exit over_spaces ! if the number of labels is > 1 but has decreased, quit, unless nlabels ! still exceeds the number of labels we are hoping for (ntarget) if ((nlabelstmp < nlabels_prev .or. nlabelstmp >= max(nlabels_prev,2) & .and. i < 4 .and. .not. (ntarget > 0 .and. nlabelstmp > ntarget))) then ! take the answer with the previous number of spaces call split(line(i1:),spaces(1:i+1),labels,nlabelstmp) exit over_spaces endif nlabels_prev = nlabelstmp enddo over_spaces ! ! this style is dangerous, so perform sanity checks ! on the labels to ensure they are sensible ! nlabels = count_sensible_labels(nlabelstmp,labels) if (nlabels <= 1) then ! ! format style 4: x y z vx vy vz ! (this style is also dangerous) ! istyle = 4 call split(line(i1:),' ',labels,nlabelstmp) nlabels = count_sensible_labels(nlabelstmp,labels) endif endif if (present(method)) method = istyle ! ! clean up ! do i=1,nlabels ! delete brackets if (nlabels <= size(labels)) then call string_delete(labels(i),',') if (istyle==1 .or. istyle==2) then labels(i) = trim(adjustl(labels(i))) ! delete leading numbers i1 = 1 do while (isdigit(labels(i)(i1:i1))) labels(i)(i1:i1) = ' ' i1 = i1 + 1 enddo endif labels(i) = trim(adjustl(labels(i))) endif enddo ! delete loose trailing square bracket but only if not matching if (istyle==1) then if (index(labels(nlabels),']') > 0) then i1 = count_char(labels(nlabels),'[') ! number of open brackets i2 = count_char(labels(nlabels),']') ! number of closed brackets if (i2 > i1) then ! if brackets do not match ! find last trailing bracket i2 = index(labels(nlabels),']',back=.true.) ! delete it, but only if followed by spaces if (i2==len_trim(labels(nlabels))) then labels(nlabels) = labels(nlabels)(1:i2-1) endif endif endif endif end subroutine get_column_labels !--------------------------------------------------------------------------- ! ! interface to the above routine that also searches for the line ! containing the column labels in the list of header lines ! !--------------------------------------------------------------------------- subroutine read_column_labels(iunit,nheaderlines,ncols,nlabels,labels,csv,debug) integer, intent(in) :: iunit,nheaderlines,ncols integer, intent(out) :: nlabels character(len=*), dimension(:), intent(out) :: labels logical, intent(in), optional :: csv,debug character(len=len(labels(1))), dimension(size(labels)) :: tmplabel character(len=max_line_length) :: line logical :: is_csv,verbose,got_labels integer :: i,imethod,ierr,nwanted,nlabelstmp is_csv = .false. verbose = .false. if (present(csv)) is_csv = csv if (present(debug)) verbose = debug got_labels = .false. nlabels = 0 nwanted = min(ncols,size(labels)) ! can either retrieve all labels or completely fill the labels array labels = '' rewind(iunit) do i=1,nheaderlines read(iunit,"(a)",iostat=ierr) line !--try to match column labels from this header line, if not already matched (or dubious match) call get_column_labels(trim(line),nlabelstmp,tmplabel,method=imethod,ndesired=nwanted,csv=csv) !--if we get nlabels > ncolumns, use them, but keep trying for a better match if ((got_labels .and. nlabelstmp == nwanted) .or. & (.not.got_labels .and. nlabelstmp >= nwanted & ! only allow single-spaced labels if == ncols .and. (.not.(imethod>=4) .or. nlabelstmp==nwanted))) then labels(1:nwanted) = tmplabel(1:nwanted) got_labels = .true. nlabels = nlabelstmp endif if (verbose) print "(5(1x,a,i0),1x,a,l1)",'DEBUG: line ',i,'nlabels = ',nlabels,& 'want ',ncols,'method=',imethod,'len_trim(line)=',len_trim(line),'got_labels=',got_labels !,' LABELS= '//tmplabel(1:ncols) enddo end subroutine read_column_labels !--------------------------------------------------------------------------- ! ! count the number of sensible labels in a list of possible labels ! !--------------------------------------------------------------------------- integer function count_sensible_labels(n,labels) result(m) integer, intent(in) :: n character(len=*), dimension(n), intent(in) :: labels integer :: i m = 0 do i=1,n if (is_sensible_label(labels(i))) m = m + 1 enddo end function count_sensible_labels !--------------------------------------------------------------------------- ! ! determine if a particular string makes sense as a column label or not ! !--------------------------------------------------------------------------- logical function is_sensible_label(string) character(len=*), intent(in) :: string real :: dum integer :: ierr real, parameter :: dum_prev = -66666666. is_sensible_label = .true. ! should not start with a decimal point if (string(1:1)=='.') is_sensible_label = .false. ! should not contain equals sign !if (index(string,'=') > 0) is_sensible_label = .false. dum = dum_prev ! should not be able to read it as a real number read(string,*,iostat=ierr) dum if (ierr==0 .and. abs(dum-dum_prev) > tiny(dum)) is_sensible_label = .false. end function is_sensible_label !------------------------------------------ ! match tag against a list of tags ! returns index of matching tag in the list !------------------------------------------ integer function match_tag(tags,tag) character(len=*), intent(in) :: tags(:) character(len=*), intent(in) :: tag integer :: i match_tag = 0 ! default if not found do i=1,size(tags) if (trim(tags(i))==trim(adjustl(tag))) then match_tag = i exit ! only match first occurrence endif enddo end function match_tag !-------------------------------------------- ! as above but only match first N characters ! where N=5 by default !-------------------------------------------- integer function match_tag_start(tags,tag,n) character(len=*), intent(in) :: tags(:) character(len=*), intent(in) :: tag integer, intent(in), optional :: n integer :: i,ilen character(len=len(tag)) :: str1,str2 ilen = 5 if (present(n)) ilen = n match_tag_start = 0 ! default if not found do i=1,size(tags) str1 = tags(i)(1:ilen) str2 = tag(1:ilen) if (trim(lcase(str2))==trim(lcase(str1))) then match_tag_start = i exit ! only match first occurrence endif enddo end function match_tag_start !------------------------------------------ ! match tag against a list of tags ! or by giving the column number explicitly ! returns index of matching tag in the list !------------------------------------------ integer function match_column(tags,tag) character(len=*), intent(in) :: tags(:) character(len=*), intent(in) :: tag integer :: ierr ! try to match the string tag first match_column = match_tag(tags,tag) if (match_column == 0) then ! try to read it as an integer from the string read(tag,*,iostat=ierr) match_column endif end function match_column !---------------------------------------------- ! match tag against a list of tags ! and extract the value from an array of reals !---------------------------------------------- real function get_value(tag,tags,vals,default) character(len=*), intent(in) :: tag character(len=*), intent(in) :: tags(:) real, intent(in) :: vals(:) real, intent(in), optional :: default integer :: itag itag = match_tag(tags,tag) if (itag > 0 .and. itag <= size(vals)) then get_value = vals(itag) else if (present(default)) then get_value = default else get_value = 0. endif endif end function get_value !----------------------------------------------- ! match multiple tags against a list of strings ! e.g. find 'x','y','z' in list of labels !----------------------------------------------- subroutine match_taglist(taglist,tags,istartmatch,nmatch) character(len=*), intent(in) :: taglist(:) character(len=*), intent(in) :: tags(:) integer, intent(out) :: istartmatch,nmatch integer :: i,j istartmatch = 0 nmatch = 0 if (size(taglist) < 1) return do i=1,size(tags) if (nmatch <= 1 .and. trim(tags(i))==trim(taglist(1))) then nmatch = 1 istartmatch = i do j=2,min(size(taglist),size(tags)-i+1) if (trim(tags(i+j-1))==trim(taglist(j))) then nmatch = nmatch + 1 endif enddo endif enddo end subroutine match_taglist !------------------------------------------ ! find first integer that matches in a ! list of integers !------------------------------------------ integer function match_integer(ivals,i) integer, intent(in) :: ivals(:) integer, intent(in) :: i integer :: k match_integer = 0 do k=1,size(ivals) if (ivals(k)==i) then match_integer = k exit endif enddo end function match_integer !------------------------------------------ ! find labels that match between two lists ! (match == first N characters are the same) ! output is a list of indices of labels ! from list1 that match list2 !------------------------------------------ function match_lists(list1,list2) result(imap) character(len=*), intent(in) :: list1(:),list2(:) integer :: imap(size(list1)) integer :: j,icol do j=1,size(list1) icol = match_tag_start(list2,list1(j)) if (icol > 0) imap(j) = icol enddo end function match_lists !------------------------------ ! Append a number to a string ! e.g. string,2 -> string2 !------------------------------ subroutine append_number(string,j) character(len=*), intent(inout) :: string integer, intent(in) :: j character(len=12) :: strj write(strj,"(i12)") j string = trim(string)//trim(adjustl(strj)) end subroutine append_number !---------------------------------------------------------------------- ! Append numbers to otherwise identical tags to make them unique ! e.g. massoftype1, massoftype2, massoftype3, etc. !---------------------------------------------------------------------- subroutine make_tags_unique(ntags,tags) integer, intent(in) :: ntags character(len=*), dimension(ntags), intent(inout) :: tags character(len=len(tags)) :: tagprev integer :: i,j if (ntags < 1) return j = 0 tagprev = tags(1) do i=2,ntags if (tags(i)==tagprev) then j = j + 1 if (j==1) then call append_number(tags(i-1),j) j = j + 1 endif call append_number(tags(i),j) else tagprev = tags(i) j = 0 endif enddo end subroutine make_tags_unique !----------------------------------------------------------------- ! ! utility to count number of non-blank strings in a list ! !----------------------------------------------------------------- integer function count_non_blank(string) character(len=*), dimension(:), intent(in) :: string integer :: i count_non_blank = 0 do i=1,size(string) if (len_trim(string(i))<=0) exit count_non_blank = count_non_blank + 1 enddo end function count_non_blank !----------------------------------------------------------------- ! ! utility to count number of times a character appears in a string ! !----------------------------------------------------------------- integer function count_char(string,mychar) character(len=*), intent(in) :: string character(len=1), intent(in) :: mychar integer :: i count_char = 0 do i=1,len(string) if (string(i:i)==mychar) count_char = count_char + 1 enddo end function count_char !--------------------------------------------------------------------- ! utility to identify repeated tags in a list, written ! for use when labels were made by "make_tags_unique" ! ! IN: ! tag - string to match, e.g. "massoftype" ! ntags - length of array to search ! tags - sequence of character strings to search ! ! the routine then searches for consecutive entries matching ! the tag, e.g. massoftype1, massoftype2 etc and returns: ! ! OUT: ! istartlist - start of list (e.g. location of massoftype1) ! nlist - number of tags matching string (i.e. N in massoftypeN) !---------------------------------------------------------------------- subroutine find_repeated_tags(tag,ntags,tags,istartlist,nlist) character(len=*), intent(in) :: tag integer, intent(in) :: ntags character(len=*), intent(in) :: tags(ntags) integer, intent(out) :: istartlist,nlist integer :: i logical :: consecutive istartlist = 0 nlist = 0 consecutive = .false. do i=1,ntags if (trim(tag)==tags(i)(1:len_trim(tag))) then if (nlist==0) then istartlist = i consecutive = .true. endif if (consecutive) nlist = nlist + 1 else consecutive = .false. endif enddo end subroutine find_repeated_tags !------------------------------------------------------------ ! utility to return up to five file extensions !------------------------------------------------------------ subroutine get_extensions(string,extensions) character(len=*), intent(in) :: string character(len=12), dimension(5), intent(out) :: extensions(5) character(:), allocatable :: tmp_string integer :: ppos_new integer :: ppos_old integer :: i ppos_new = scan(trim(string),".", BACK= .true.) ppos_old = len(string) tmp_string = lcase(string) do i=1,5 if (ppos_new > 0) then extensions(i) = trim(tmp_string(ppos_new:ppos_old)) tmp_string=tmp_string(1:ppos_new-1) ppos_old=ppos_new-1 ppos_new=scan(trim(tmp_string),".",BACK=.true.) else extensions(i)="" endif enddo end subroutine get_extensions !--------------------------------------------------------------------------- !+ ! extract the start of the file extension, if the filename does not ! end with digits !+ !--------------------------------------------------------------------------- pure integer function get_idot(string) character(len=*), intent(in) :: string integer :: ilen ilen = len_trim(string) get_idot = 0 ! ! if file ends in at least two numbers then use the numbers at the end ! (two is to avoid problems with .hdf5 etc) ! if (ilen >= 2) then if (isdigit(string(ilen:ilen)) .and. isdigit(string(ilen-1:ilen-1))) then get_idot = ilen + 1 endif endif ! ! otherwise, look for numbers before the file extension (e.g. _0000.dat) ! if (get_idot==0) then get_idot = index(string,'.',back=.true.) if (get_idot==0) get_idot = len_trim(string) + 1 endif end function get_idot !---------------------------------------------------------------- !+ ! this function extracts the number at the end of the filename !+ !---------------------------------------------------------------- integer function numfromfile(filename) character(len=*), intent(in) :: filename character(len=len(filename)) :: string integer :: idot,istartnum,ilen,i,ierr ! !--extract current number from filename ! string = basename(filename) idot = get_idot(string) istartnum = 0 do i=idot-1,1,-1 if (istartnum==0) then if (.not.isdigit(string(i:i))) istartnum = i endif enddo if (istartnum /= 0) istartnum = istartnum + 1 ilen = idot - istartnum if (ilen > 0) then read(string(istartnum:istartnum+ilen-1),*,iostat=ierr) numfromfile if (ierr /= 0) then !print*,'internal error in numfromfilename' numfromfile = -1 endif else numfromfile = 0 endif end function numfromfile !------------------------------------------------------------ ! utility to reorder a list of files. We use an insertion ! sort algorithm which preserves relative order of filenames ! so a list of files like: ! ! disc_00000 disc_00001 disc_00002 disc1_00000 disc1_00002 ! ! will be reordered as: ! ! disc_00000 disc1_00000 disc_00001 disc1_00001 disc_00002 ! !------------------------------------------------------------ subroutine sort_filenames_for_comparison(nfiles,filenames) integer, intent(in) :: nfiles character(len=*), intent(inout) :: filenames(nfiles) character(len=100) :: key integer :: i,j,num do i = 2, nfiles key = filenames(i) num = numfromfile(key) j = i - 1 ! move elements of the filenames array with number ! greater than the key to one position ahead ! of their current position do while(j >= 1 .and. numfromfile(filenames(j)) > num) filenames(j+1) = filenames(j) j = j - 1 enddo filenames(j+1) = key enddo end subroutine sort_filenames_for_comparison !------------------------------------------------------------ ! utility to read a variable from an ascii file ! in the form: ! ! var = val ! comment ! ! val is returned as a string, if not found leaves the ! input value unmodified !------------------------------------------------------------ subroutine read_var_from_file(var,val,filename,ierr) character(len=*), intent(in) :: var character(len=*), intent(inout) :: val character(len=*), intent(in) :: filename integer, intent(out) :: ierr character(len=130) :: line integer :: j,lu,ieq,istart logical :: match open(newunit=lu,file=filename,status='old',iostat=ierr) match = .false. do while(ierr==0 .and. .not.match) read(lu,"(a)",iostat=ierr) line if (index(line,var) /= 0) then istart = index(line,var) ieq = index(line(istart:),'=') val = line(istart+ieq+1:) match = .true. endif enddo close(lu) if (match) then val = trim(adjustl(val)) ! now cull the variable at a space or comma do j=1,len_trim(val) if (any((/' ',',',';',':','=','!'/)==val(j:j))) then val = val(1:j) exit endif enddo !else !print*,trim(var)//' not found in '//trim(filename) endif end subroutine read_var_from_file end module asciiutils danieljprice-splash-4d1f09c/src/blackbody.f90000066400000000000000000000161501477365367100211360ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2021- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module blackbody use physcon, only:c,hplanck,kboltz,cm_to_nm use params, only:doub_prec implicit none contains !--------------------------------------------------------- ! Planck function ! INPUT: ! temp - temperature [K] ! nu - frequency [Hz] ! OUTPUT: ! B_nu - Planck function erg/s/cm^2/Hz/steradian !--------------------------------------------------------- real elemental function B_nu(temp,nu) real, intent(in) :: temp,nu real(doub_prec) :: hnu_on_kT,hnu3_on_c2 hnu_on_kT = hplanck*nu/(kboltz*temp) hnu3_on_c2 = hplanck*nu**3/c**2 if (hnu_on_kT < 300.) then B_nu = 2.*hnu3_on_c2/(exp(hnu_on_kT) - 1.d0) else B_nu = tiny(0.) endif end function B_nu !--------------------------------------------------------- ! Planck function derivative ! INPUT: ! temp - temperature [K] ! nu - frequency [Hz] ! OUTPUT: ! dB_nu/dT - Planck function derivative w.r.t. T !--------------------------------------------------------- real elemental function dBnu_dT(temp,nu) real, intent(in) :: temp,nu real(doub_prec) :: hnu_on_kT,hnu3_on_c2 real :: Bnu,expterm hnu_on_kT = hplanck*nu/(kboltz*temp) hnu3_on_c2 = hplanck*nu**3/c**2 Bnu = B_nu(temp,nu) if (hnu_on_kT < 300.) then expterm = exp(hnu_on_kT) dBnu_dT = Bnu*expterm/(expterm - 1.)*hnu_on_kT/temp else dBnu_dT = -tiny(0.) endif end function dBnu_dT !--------------------------------------------------------- ! Wien's displacement law, in frequency !--------------------------------------------------------- real function Wien_T_from_nu(nu) result(T) real, intent(in) :: nu T = nu/5.88e10 end function Wien_T_from_nu !--------------------------------------------------------- ! Wien's displacement law, frequency from temperature !--------------------------------------------------------- real function Wien_nu_from_T(T) result(nu) real, intent(in) :: T nu = 5.88e10*T end function Wien_nu_from_T !--------------------------------------------------------- ! Convert frequency in Hz to wavelength in nm !--------------------------------------------------------- real function nu_to_lam(nu) result(lam) real, intent(in) :: nu lam = (c/nu)*cm_to_nm end function nu_to_lam !--------------------------------------------------------- ! Convert frequency in Hz to wavelength in nm !--------------------------------------------------------- real function lam_to_nu(lam) result(nu) real, intent(in) :: lam nu = (c/lam)*cm_to_nm end function lam_to_nu !--------------------------------------------------------- ! colour temperature, from fitting peak of blackbody !--------------------------------------------------------- subroutine get_colour_temperature(spectrum,freq,Tc,freq_max,bb_scale) real, intent(in) :: spectrum(:),freq(:) real, intent(out) :: Tc,freq_max,bb_scale integer :: imax(1),j imax = maxloc(spectrum) j = imax(1) freq_max = freq(j) Tc = Wien_T_from_nu(freq_max) ! scaling factor by which to shift Blackbody ! in y direction to match the peak flux bb_scale = spectrum(j)/B_nu(Tc,freq_max) end subroutine get_colour_temperature !-------------------------------------------------------- !+ ! Fit blackbody to spectrum over a frequency range ! by least squares minimisation !+ !-------------------------------------------------------- subroutine bb_fit(spec,freq,fmin,fmax,T,bbscale,min,max) real, intent(in) :: fmin,fmax real, intent(in) :: freq(:),spec(:) real, intent(inout) :: T real, intent(out) :: bbscale real, intent(in), optional :: min,max real :: Tmax,Tmin,func integer :: its Tmin = 1e3 Tmax = 1e6 if (present(min)) Tmin = min if (present(max)) Tmax = max print*,'initial min/max = ',Tmin,Tmax,0.5*(Tmin + Tmax) ! rootfind, using bisection method its = 0 func = huge(func) do while(abs(func) > 1.e-20 .and. its < 100) T = 0.5*(Tmin + Tmax) func = dchisq_dT(spec,freq,fmin,fmax,T,bbscale) if (func > 0.) then Tmax = T else Tmin = T endif its = its + 1 !print*,its,func,'T = ',T,' min/max = ',Tmin,Tmax,bbscale enddo print*,its,func,'T = ',T,' min/max = ',Tmin,Tmax,bbscale end subroutine bb_fit !-------------------------------------------------------- !+ ! derivative of the chisquared error between the ! input data (spec) and the blackbody spectrum at T ! this is the function which we find the root of !+ !-------------------------------------------------------- real function dchisq_dT(spec,freq,fmin,fmax,T,bbscale) real, intent(in) :: fmin,fmax real, intent(in) :: freq(:),spec(:) real, intent(in) :: T real, intent(out) :: bbscale integer :: i,iloc(1) real :: err,Bnu ! fit bb_scale to match maximum value of the spectrum ! in the specified frequency range iloc = maxloc(spec,mask=(freq > fmin .and. freq < fmax)) i = max(iloc(1),1) !print*,'matching at temperature ',i,Wien_T_from_nu(freq(i)),' spec = ', & ! spec(i),' b_nu = ',B_nu(T,freq(i)),' scale=',bbscale bbscale = 1.e-5 if (B_nu(T,freq(i)) > epsilon(0.)) bbscale = spec(i)/B_nu(T,freq(i)) bbscale = max(bbscale,1e-5) dchisq_dT = 0. do i=1,size(freq) if (freq(i) > fmin .and. freq(i) < fmax) then Bnu = B_nu(T,freq(i)) err = spec(i)/bbscale - Bnu dchisq_dT = dchisq_dT - 2.*err/dBnu_dT(T,freq(i)) endif enddo end function dchisq_dT !-------------------------------------------------------- !+ ! Function to fill an array with equally log-spaced points !+ !-------------------------------------------------------- function logspace(n,xmin,xmax) result(x) integer, intent(in) :: n real, intent(in) :: xmin,xmax real, allocatable :: x(:) integer :: i real :: dx allocate(x(n)) dx = log10(xmax/xmin)/real(n-1) do i=1,n x(i) = log10(xmin) + (i-1)*dx enddo x = 10.**x end function logspace !-------------------------------------------------------- !+ ! Integrate function on evenly spaced logarithmic grid ! i.e. \int f(x) dx = \int x f(x) d(ln x) ! using trapezoidal rule !+ !-------------------------------------------------------- real function integrate_log(f,x,xmin,xmax) result(fint) real, intent(in) :: xmin,xmax real, intent(in) :: x(:),f(:) real :: dlogx integer :: n,i n = size(f) dlogx = log(xmax/xmin)/(n-1) fint = 0. do i=2,n if (x(i-1) > xmin .and. x(i) < xmax) then fint = fint + 0.5*(f(i)*x(i) + f(i-1)*x(i-1))*dlogx endif enddo end function integrate_log end module blackbody danieljprice-splash-4d1f09c/src/byteswap.f90000066400000000000000000000071761477365367100210520ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module byteswap implicit none integer, parameter :: little_endian_order8(8) = [8,7,6,5,4,3,2,1] integer, parameter :: little_endian_order4(4) = [4,3,2,1] public :: bs interface bs module procedure reverse_bytes_r4,reverse_bytes_r8,& reverse_bytes_int,reverse_bytes_int8 end interface bs private contains !-------------------------------------------------------- ! function to swap byte order (real 4) !-------------------------------------------------------- real(kind=4) elemental function reverse_bytes_r4(x) result(y) real(kind=4), intent(in) :: x character(len=1) :: src_arr(4), dst_arr(4) ! put whatever the variable was into an 8 x 1 character string src_arr = transfer(x,src_arr) ! swap the bytes around into the desired order dst_arr = src_arr(little_endian_order4) ! copy the 8 x 1 character string back to represent the original type y = transfer(dst_arr,y) end function reverse_bytes_r4 !-------------------------------------------------------- ! function to swap byte order (real 8) !-------------------------------------------------------- real(kind=8) elemental function reverse_bytes_r8(x) result(y) real(kind=8), intent(in) :: x character(len=1) :: src_arr(8), dst_arr(8) ! put whatever the variable was into an 8 x 1 character string src_arr = transfer(x,src_arr) ! swap the bytes around into the desired order dst_arr = src_arr(little_endian_order8) ! copy the 8 x 1 character string back to represent the original type y = transfer(dst_arr,y) end function reverse_bytes_r8 !-------------------------------------------------------- ! function to swap byte order (int 4) !-------------------------------------------------------- integer(kind=4) elemental function reverse_bytes_int(x) result(y) integer(kind=4), intent(in) :: x character(len=1) :: src_arr(4), dst_arr(4) ! put whatever the variable was into an 8 x 1 character string src_arr = transfer(x,src_arr) ! swap the bytes around into the desired order dst_arr = src_arr(little_endian_order4) ! copy the 8 x 1 character string back to represent the original type y = transfer(dst_arr,y) end function reverse_bytes_int !-------------------------------------------------------- ! function to swap byte order (int 4) !-------------------------------------------------------- integer(kind=8) elemental function reverse_bytes_int8(x) result(y) integer(kind=8), intent(in) :: x character(len=1) :: src_arr(8), dst_arr(8) ! put whatever the variable was into an 8 x 1 character string src_arr = transfer(x,src_arr) ! swap the bytes around into the desired order dst_arr = src_arr(little_endian_order8) ! copy the 8 x 1 character string back to represent the original type y = transfer(dst_arr,y) end function reverse_bytes_int8 end module byteswap danieljprice-splash-4d1f09c/src/calc_quantities.f90000066400000000000000000001207061477365367100223570ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2018 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! This module allows arbitrary functions to be computed from the ! particle data. Uses the fparser module to parse the functions. ! !----------------------------------------------------------------- module calcquantities use labels, only:lenlabel,lenunitslabel use params, only:maxplot,maxhdr implicit none public :: calc_quantities,setup_calculated_quantities public :: calc_quantities_use_x0,get_calc_data_dependencies public :: print_example_quantities integer, parameter, private :: maxcalc = 35 character(len=lenlabel), dimension(maxcalc) :: calcstring = ' ' character(len=lenlabel), dimension(maxcalc) :: calclabel = ' ' character(len=lenunitslabel), dimension(maxcalc) :: calcunitslabel = ' ' integer, parameter, private :: lenvars = 20 ! max length for any variable integer, parameter, private :: nextravars = 5 character(len=lenvars), dimension(nextravars), parameter, private :: & extravars=(/'t ','gamma','x0 ','y0 ','z0 '/) namelist /calcopts/ calcstring,calclabel,calcunitslabel public :: calcopts,calcstring,calclabel,calcunitslabel private contains !----------------------------------------------------------------- ! ! Allow the user to edit the list of function strings used ! to compute additional quantities from the particle data ! !----------------------------------------------------------------- subroutine setup_calculated_quantities(ncalc) use settings_data, only:ncolumns use prompting, only:prompt integer, intent(inout) :: ncalc integer :: ncalctot,istart,iend,ipick,ninactive, i logical :: done,first character(len=1) :: charp integer, dimension(maxcalc) :: incolumn ipick = ncolumns + 1 done = .false. first = .true. ! !--on the first call to setup, prefill the list of calculated ! quantities with ALL of the valid examples. ! if (ncalc==0) call print_example_quantities(.true.,ncalc) charp = 'a' calcmenu: do while (.not.done) call check_calculated_quantities(ncalc,ncalctot,incolumn,verbose=.true.) ninactive = ncalctot - ncalc iend = maxcalc if (ncalctot > 0 .or. .not.first) then charp='q' !'a' if (.not.first) charp = 'q' print* call prompt(' a)dd to, e)dit, c)lear current list, or q)uit/finish? ',& charp,list=(/'a','e','c','q','s','S','Q'/),noblank=.true.) select case(charp) case('a') istart = ncalctot iend = ncalctot+1 case('e') if (ninactive > 0 .and. ncalc > 0) then call prompt(' pick a function to edit ',ipick,-ninactive,-1,ncolumns+1,ncolumns+ncalc) elseif (ncalc > 0) then call prompt(' pick a function to edit ',ipick,ncolumns+1,ncolumns+ncalc) endif istart = 0 do i=1,ncalctot if (incolumn(i)==ipick) istart = i - 1 enddo iend = istart + 1 case('c') calcstring(:) = ' ' calclabel(:) = ' ' calcunitslabel(:) = ' ' first = .false. cycle calcmenu case('q','Q','s','S') done = .true. case default istart = 0 iend = maxcalc end select else istart = 0 iend = 1 endif if (.not.done) call add_calculated_quantities(istart,iend,ncalc,first,incolumn,verbose=.true.) first = .false. enddo calcmenu if (ncalc > 0) then if (ncalc < 10) then print "(a,i1,a)",' setup ',ncalc,' additional quantities' else print "(a,i2,a)",' setup ',ncalc,' additional quantities' endif endif end subroutine setup_calculated_quantities !----------------------------------------------------------------- ! ! utility (private) to add one or more calculated quantities ! to the current list and/or edit previous settings ! !----------------------------------------------------------------- subroutine add_calculated_quantities(istart,iend,ncalc,printhelp,incolumn,verbose) use prompting, only:prompt use fparser, only:checkf use settings_data, only:ncolumns,iRescale,required use labels, only:shortstring,headertags,count_non_blank integer, intent(in) :: istart,iend integer, intent(out) :: ncalc logical, intent(in) :: printhelp integer, dimension(maxcalc), intent(in) :: incolumn logical, intent(in) :: verbose integer :: i,j,ntries,ierr,iequal,nvars,nhdr logical :: iask character(len=120) :: string character(len=lenvars), dimension(maxplot+nextravars+maxhdr) :: vars i = istart + 1 ntries = 0 ncalc = istart if (i > maxcalc) then print "(/,a,i2,a)",' *** Error, maximum number of calculated quantities (',maxcalc,') reached, cannot add any more.' print "(a)", ' *** If you hit this limit, *please email me* so I can change the default limits!' print "(a)", ' *** (and then edit calc_quantities.f90, changing the parameter "maxcalc" to something higher...)' return endif if (printhelp) then print "(/,a)",' Special characters and spaces removed from labels.' print "(a)",' Previous quantities can be used in subsequent calculations.' print "(/,10(a))",' Valid variables: column labels',(', '''//trim(extravars(j))//'''',j=1,nextravars),& ' and header variables:' nhdr = count_non_blank(headertags) if (nhdr > 0) print "(43(2x,4(a32,1x),/))",headertags(1:nhdr) endif call print_example_quantities(verbose) overfuncs: do while(ntries < 3 .and. i <= iend .and. i <= maxcalc) if (len_trim(calcstring(i)) /= 0 .or. ncalc > istart) then if (incolumn(i) > 0) then write(*,"(a,i2,a)") '[Column ',incolumn(i),']' else write(*,"(a)") '[Currently inactive]' endif endif if (len_trim(calclabel(i)) > 0) then string = trim(calclabel(i))//' = '//trim(calcstring(i)) else string = trim(calcstring(i)) endif call prompt('Enter function string to calculate (blank for none) ',string) if (len_trim(string)==0) then ! !--if editing list and get blank string at prompt, ! remove the entry and shuffle the list appropriately ! do j=i,maxcalc-1 !print*,' shuffling ',j,' = '//trim(calcstring(j+1)) calcstring(j) = trim(calcstring(j+1)) if (j+1 < size(calclabel)) then calclabel(j) = calclabel(j+1) endif if (len_trim(calcstring(j))==0) then if (j==i) then exit overfuncs else cycle overfuncs endif endif enddo else ! !--set label from what lies to the left of the equal sign ! and the calcstring from what lies to the right ! (if no equals sign, then prompt later for the label) ! iequal = index(string,'=') call splitstring(string,calclabel(i),calcstring(i)) ! !--fill variable array with the list of valid variable ! names for this column ! call get_variables(ncolumns+i-1,nvars,vars) ! !--check for errors parsing function ! ierr = checkf(shortstring(calcstring(i)),vars(1:nvars)) if (ierr /= 0 ) then ntries = ntries + 1 print "(a,i1,a)",' error parsing function string: try again (',ntries,' of 3)' if (ntries==3) then iask = .false. call prompt(' Cannot parse function (after 3 attempts). Set as inactive function anyway?',iask) if (iask) then ierr = 0 else calcstring(i) = ' ' endif endif else write(*,"(a)",advance='no') 'Function parses OK: ' required(ncolumns+i) = .true. endif if (ierr==0) then ! !--prompt for label if not set ! if (iequal==0) then call prompt(' Enter label for this quantity ',calclabel(i),noblank=.true.) endif if (iRescale) then call prompt(' Enter units label for this quantity ',calcunitslabel(i)) endif !print "(a,a,i2,/)",'Setting '//trim(calclabel(i)), & ! ' = '//trim(calcstring(i))//' in column ',ncolumns+i ncalc = i i = i + 1 endif endif enddo overfuncs end subroutine add_calculated_quantities !--------------------------------------------------------------------- ! ! utility to split input string into label and function at the ! equals sign ! !--------------------------------------------------------------------- subroutine splitstring(string,calclabel,calcstring) character(len=*), intent(in) :: string character(len=*), intent(inout) :: calclabel character(len=*), intent(out) :: calcstring integer :: iequal iequal = index(string,'=') if (iequal /= 0) then calclabel = string(1:iequal-1) calcstring = string(iequal+1:len_trim(string)) else calcstring = trim(string) endif !--remove preceding spaces calcstring = trim(adjustl(calcstring)) end subroutine splitstring !--------------------------------------------------------------------- ! ! utility to give a nice list of examples to follow / cut and paste ! [ this basically replaces what was hardwired into the ! old calc_quantities routine ] ! !--------------------------------------------------------------------- subroutine print_example_quantities(verbose,ncalc) use labels, only:label,unitslabel,shortlabel,lenlabel,irho,iutherm,ipr,iBfirst,& ix,icv,idivB,ih,iradenergy,iamvec,labelvec,idustfrac,& ideltav,ivx,headertags use settings_data, only:ncolumns,ndim,icoordsnew,ndimV use geometry, only:labelcoord use asciiutils, only:append_number,find_repeated_tags use particle_data, only:headervals use filenames, only:ifileopen logical :: verbose integer, intent(inout), optional :: ncalc logical :: prefill character(len=lenlabel) :: string,ldfracsum integer :: i,j,ivecstart,ierr,ilen,idustfrac1,ndusttypes,nc logical :: gotpmag,gotpressure gotpmag = .false. gotpressure = .false. prefill = .false. if (present(ncalc)) then prefill = .true. nc = ncalc else nc = 0 endif if (verbose) then if (prefill) then print "(/,a)",' Prefilling list with useful quantities from current data...' else print "(/,a)",' e.g. ' endif endif !--radius string = ' ' if (ndim > 0 .and. icoordsnew==1 .and. ncolumns >= ndim) then write(string,"(a)") 'r = sqrt(('// & trim(shortlabel(label(ix(1)),unitslabel(ix(1))))//'-'//trim(labelcoord(1,1))//'0)**2' ilen = len_trim(string) if (ndim > 1) then write(string(ilen+1:),"(a,a,a)",iostat=ierr) & (' + ('//trim(shortlabel(label(ix(i)),unitslabel(ix(i))))// & '-'//trim(labelcoord(i,1))//'0)**2',i=2,ndim),')' else write(string(ilen+1:),"(a)") ')' endif call print_or_prefill(prefill,string,nc,ulab=unitslabel(ix(1))) elseif (ncolumns >= 2 .and. .not.prefill) then !--if ndim=0 give random example to give at least one print "(11x,a)",trim(shortlabel(label(1),unitslabel(1)))//'*'& //trim(shortlabel(label(2),unitslabel(2))) endif ! !--total dust fraction if multiple dust phases ! ldfracsum = ' ' if (idustfrac == 0) then ! find number of dust species from how many times the label "dustfrac" ! is repeated. For gas-only calculations, this will give ndusttypes=0 call find_repeated_tags('dustfrac',ncolumns,label,idustfrac1,ndusttypes) if (ndusttypes > 1) then string = 'dustfrac = '//trim(shortlabel(label(idustfrac1),unitslabel(idustfrac1))) do i=idustfrac1+1,idustfrac1+ndusttypes-1 string = trim(string)//'+'//(trim(shortlabel(label(i),unitslabel(i)))) enddo ldfracsum = 'dustfrac' call print_or_prefill(prefill,string,nc) endif elseif (idustfrac > 0) then ndusttypes = 1 ldfracsum = shortlabel(label(idustfrac),unitslabel(idustfrac)) endif !--pressure (requires total dust fraction) string = ' ' if (irho > 0 .and. iutherm > 0) then gotpressure = .true. if (len_trim(ldfracsum) > 0) then write(string,"(a)",iostat=ierr) & 'pressure = (gamma-1)*(1 - '//trim(ldfracsum)//')*' & //trim(shortlabel(label(irho),unitslabel(irho)))// & '*'//trim(shortlabel(label(iutherm),unitslabel(iutherm))) else write(string,"(a)",iostat=ierr) & 'pressure = (gamma-1)*'//trim(shortlabel(label(irho),unitslabel(irho)))// & '*'//trim(shortlabel(label(iutherm),unitslabel(iutherm))) endif if (index(unitslabel(irho),'g/cm^3') > 0 .and. & index(unitslabel(iutherm),'erg/g') > 0) then call print_or_prefill(prefill,string,nc,ulab=' [erg/cm^3]') else call print_or_prefill(prefill,string,nc) endif endif ! !--one-fluid dust stuff ! if (len_trim(ldfracsum) > 0 .and. irho > 0) then string = ' ' !--gas density write(string,"(a)",iostat=ierr) '\rho_{g} = ' & //trim(shortlabel(label(irho),unitslabel(irho))) & //'*(1 - '//trim(ldfracsum)//')' call print_or_prefill(prefill,string,nc,ulab=unitslabel(irho)) !--(total) dust density write(string,"(a)",iostat=ierr) '\rho_{d} = ' & //trim(shortlabel(label(irho),unitslabel(irho))) & //'*'//trim(ldfracsum) call print_or_prefill(prefill,string,nc,ulab=unitslabel(irho)) !--densities of each individual dust phase if (ndusttypes > 1) then do i = idustfrac1,idustfrac1+ndusttypes-1 string = '\rho_{d,' if (ifileopen > 0) call append_grain_size_label(string,i-idustfrac1+1,headertags,headervals(:,ifileopen),ierr) if (ierr /= 0) call append_number(string,i-idustfrac1+1) string = trim(string)//'} = ' & //trim(shortlabel(label(irho),unitslabel(irho)))//'*'//trim(label(i)) call print_or_prefill(prefill,string,nc,ulab=unitslabel(irho)) enddo endif !--dust-to-gas ratio write(string,"(a)",iostat=ierr) 'dust-to-gas ratio = ' & //trim(ldfracsum)//'/(1. - '//trim(ldfracsum)//')' call print_or_prefill(prefill,string,nc) if (ideltav > 0 .and. ivx > 0 .and. ndimV > 0) then if (ndusttypes==1) then !--gas velocities do i=1,ndimV write(string,"(a)",iostat=ierr) trim(labelvec(ivx))//'_{gas,'//trim(labelcoord(i,icoordsnew))//'} = ' & //trim(shortlabel(label(ivx + i-1),unitslabel(ivx + i-1))) & //' - '//trim(shortlabel(label(idustfrac),unitslabel(idustfrac))) & //'*'//trim(shortlabel(label(ideltav + i-1),unitslabel(ideltav + i-1))) call print_or_prefill(prefill,string,nc,ulab=unitslabel(ivx)) enddo !--dust velocities do i=1,ndimV write(string,"(a)",iostat=ierr) trim(labelvec(ivx))//'_{dust,'//trim(labelcoord(i,icoordsnew))//'} = ' & //trim(shortlabel(label(ivx + i-1),unitslabel(ivx + i-1))) & //' + (1 - '//trim(shortlabel(label(idustfrac),unitslabel(idustfrac))) & //')*'//trim(shortlabel(label(ideltav + i-1),unitslabel(ideltav + i-1))) call print_or_prefill(prefill,string,nc,ulab=unitslabel(ivx)) enddo else ! Still needs to be implemented... endif endif endif ! !--magnitudes of all vector quantities (only if cartesian coords are set) ! ivecstart = 0 if (icoordsnew==1 .and. ndim > 0 .and. ndimV > 0) then do i=1,ncolumns if (iamvec(i) > 0 .and. iamvec(i) <= ncolumns .and. iamvec(i) /= ivecstart) then ivecstart = iamvec(i) string = ' ' write(string,"(a)",iostat=ierr) '|'//trim(labelvec(ivecstart))//'| '// & '= sqrt('//trim(shortlabel(label(ivecstart),unitslabel(ivecstart)))//'**2' ilen = len_trim(string) if (ndimV > 1) then write(string(ilen+1:),"(a,a,a)",iostat=ierr) & (' + '//trim(shortlabel(label(j),unitslabel(j)))//'**2',& j=ivecstart+1,ivecstart+ndimV-1),')' else write(string(ilen+1:),"(a)",iostat=ierr) ')' endif call print_or_prefill(prefill,string,nc,ulab=unitslabel(ivecstart)) endif enddo endif !--magnetic pressure string = ' ' if (ndim > 0 .and. ndimV > 0 .and. iBfirst > 0 .and. icoordsnew==1) then gotpmag = .true. write(string,"(a)",iostat=ierr) & 'P_{mag} = ('//trim(shortlabel(label(iBfirst),unitslabel(iBfirst)))//'**2' ilen = len_trim(string) if (ndimV > 1) then write(string(ilen+1:),"(a,a,a)",iostat=ierr) & (' + '//trim(shortlabel(label(i),unitslabel(i))) & //'**2',i=iBfirst+1,iBfirst+ndimV-1),')/(2*mu)' else write(string(ilen+1:),"(a)",iostat=ierr) ')' endif call print_or_prefill(prefill,string,nc) endif !--h*div B / B if (ndim > 0 .and. ndimV > 0 .and. ih > 0 .and. iBfirst > 0 .and. & icoordsnew==1 .and. idivB > 0) then write(string,"(a)",iostat=ierr) & 'h|div B|/|B| = '//trim(shortlabel(label(ih),unitslabel(ih)))//'*abs(' & //trim(shortlabel(label(idivB),unitslabel(idivB)))//')/' & //'sqrt(('//trim(shortlabel(label(iBfirst),unitslabel(iBfirst)))//'^2' ilen = len_trim(string) if (ndimV > 1) then write(string(ilen+1:),"(a,a,a)",iostat=ierr) & (' + '//trim(shortlabel(label(i),unitslabel(i)))//'^2',i=iBfirst+1,iBfirst+ndimV-1),'))' else write(string(ilen+1:),"(a)",iostat=ierr) '))' endif call print_or_prefill(prefill,string,nc) endif !--Plasma beta if (ndim > 0 .and. ndimV > 0 .and. iBfirst > 0 .and. gotpmag .and. (gotpressure .or. ipr > 0)) then write(string,"(a)",iostat=ierr) 'plasma \beta = pressure/P_mag' call print_or_prefill(prefill,string,nc,& comment='[ assuming pressure and Pmag calculated ]') endif !--gas temperature if cv present if (ndim > 0 .and. iutherm > 0 .and. icv > 0) then string = ' ' write(string,"(a)",iostat=ierr) 'T_{gas} = '//trim(shortlabel(label(iutherm),unitslabel(iutherm)))//'/' & //trim(shortlabel(label(icv),unitslabel(icv))) call print_or_prefill(prefill,string,nc,ulab=' [K]') endif !--radiation temperature if (ndim > 0 .and. irho > 0 .and. iradenergy > 0) then string = ' ' write(string,"(a)",iostat=ierr) 'T_{rad} = ('//trim(shortlabel(label(irho),unitslabel(irho)))//'*' & //trim(shortlabel(label(iradenergy),unitslabel(iradenergy)))//'/7.5646e-15)**0.25' call print_or_prefill(prefill,string,nc,ulab=' [K]') endif if (present(ncalc)) ncalc = nc if (.not.prefill) print "(a)" end subroutine print_example_quantities !----------------------------------------------------------------- ! ! utility (private) to append enumerated grainsize as a label ! !----------------------------------------------------------------- subroutine append_grain_size_label(string,idust,tags,vals,ierr) use labels, only:get_label_grain_size,count_non_blank character(len=*), intent(inout) :: string integer, intent(in) :: idust character(len=*), intent(in) :: tags(:) real, intent(in) :: vals(:) integer, intent(out) :: ierr integer :: ntags,nd,i ntags = count_non_blank(tags) nd = 0 ierr = 1 do i=1,ntags if (index(tags(i),'grainsize') > 0) then nd = nd + 1 if (nd==idust) then ierr = 0 string = trim(string)//get_label_grain_size(vals(i)) endif endif enddo end subroutine append_grain_size_label !----------------------------------------------------------------- ! ! utility (private) to get mass of a particular grain species ! from the header tags ! !----------------------------------------------------------------- real function get_mass_of_species(string,idust,tags,vals,ierr) use labels, only:count_non_blank character(len=*), intent(inout) :: string integer, intent(in) :: idust character(len=*), intent(in) :: tags(:) real, intent(in) :: vals(:) integer, intent(out) :: ierr integer :: ntags,nd,i get_mass_of_species = 0. ntags = count_non_blank(tags) nd = 0 ierr = 1 do i=1,ntags if (index(tags(i),'mdust_in') > 0) then nd = nd + 1 if (nd==idust) then ierr = 0 get_mass_of_species = vals(i) endif endif enddo end function get_mass_of_species !----------------------------------------------------------------- ! ! utility (private) to either print the example quantity or ! add it to a prefilled list of calculated quantities ! !----------------------------------------------------------------- subroutine print_or_prefill(prefill,string,nc,comment,ulab) logical, intent(in) :: prefill character(len=*), intent(in) :: string integer, intent(inout) :: nc character(len=*), intent(in), optional :: comment,ulab logical :: already_used integer :: i if (prefill) then if (len_trim(string) > 0) then ! do not prefill blank strings nc = nc + 1 call splitstring(string,calclabel(nc),calcstring(nc)) if (present(ulab)) calcunitslabel(nc) = trim(ulab) endif else ! do not print strings already in the list already_used = .false. do i=1,size(calcstring) if (trim(calclabel(i))//' = '//trim(calcstring(i))==trim(string)) already_used = .true. enddo ! append comment if present if (present(comment)) then if (.not.already_used) print "(6x,a)",trim(string)//' [ '//trim(comment)//' ]' else if (.not.already_used) print "(6x,a)",trim(string) endif endif end subroutine print_or_prefill !----------------------------------------------------------------- ! ! utility (private) to print the current list of calculated ! quantities, checking that they parse correctly ! !----------------------------------------------------------------- subroutine check_calculated_quantities(ncalcok,ncalctot,incolumn,verbose) use settings_data, only:ncolumns,iRescale use fparser, only:checkf use labels, only:label,unitslabel,shortstring,irhodust_start,irhodust_end integer, intent(out) :: ncalcok,ncalctot integer, dimension(maxcalc), intent(out), optional :: incolumn logical, intent(in), optional :: verbose integer :: i,ierr,nvars,indexinactive character(len=lenvars), dimension(maxplot+nextravars+maxhdr) :: vars logical :: isverbose if (present(verbose)) then isverbose = verbose else isverbose = .true. endif ncalcok = 0 ncalctot = 0 indexinactive = 0 i = 1 if (present(incolumn)) incolumn(:) = 0 if (all(len_trim(calcstring(:))==0)) return if (isverbose) print "(/,a)", ' Current list of calculated quantities:' do while(i <= maxcalc .and. len_trim(calcstring(i)) /= 0) ! !--get the list of valid variable names for this column ! call get_variables(ncolumns+ncalcok,nvars,vars) ! !--check that the function parses ! ierr = checkf(shortstring(calcstring(i)),vars(1:nvars),Verbose=.false.) if (ierr==0) then ncalcok = ncalcok + 1 if (present(incolumn)) incolumn(i) = ncolumns + ncalcok ! !--set the label for the proposed column here ! so that subsequent calculations can use this variable ! (note that we don't need to set the units label here ! as this is done in the actual calc_quantities call) ! label(ncolumns+ncalcok) = trim(calclabel(i)) unitslabel(ncolumns+ncalcok) = trim(calcunitslabel(i)) if (iRescale) label(ncolumns+ncalcok) = trim(label(ncolumns+ncalcok))//trim(unitslabel(ncolumns+ncalcok)) if (isverbose) then if (iRescale) then print "(1x,i2,') ',a50,' [OK]',1x,a)",ncolumns+ncalcok,trim(calclabel(i))//' = '//calcstring(i),trim(calcunitslabel(i)) else print "(1x,i2,') ',a50,' [OK]')",ncolumns+ncalcok,trim(calclabel(i))//' = '//calcstring(i) endif endif ! !--recognise the dust density in the list of calculated quantities ! if (trim(calcstring(i))=='density*dustfrac1') irhodust_start = ncolumns+ncalcok if (calcstring(i)(1:16)=='density*dustfrac') irhodust_end = ncolumns+ncalcok ! overwrite until last density*dustfrac else indexinactive = indexinactive - 1 if (isverbose) then print "(i3,') ',a50,' [INACTIVE]')",indexinactive,trim(calclabel(i))//' = '//calcstring(i) endif if (present(incolumn)) incolumn(i) = indexinactive endif ncalctot = i i = i + 1 enddo if (ncalcok==0 .and. isverbose) print "(a)",' (none)' end subroutine check_calculated_quantities !----------------------------------------------------------------- ! ! utility (private) to check dependencies of calculated ! quantities, so that we only read what is necessary ! from the dump file ! !----------------------------------------------------------------- subroutine get_calc_data_dependencies(required) use params, only:maxplot use settings_data, only:debugmode use fparser, only:checkf use labels, only:label,shortlabel,shortstring logical, dimension(0:maxplot), intent(inout) :: required character(len=lenvars), dimension(maxplot+nextravars+maxhdr) :: vars integer, dimension(maxcalc) :: incolumn integer :: ncalcok,ncalctot,nvars,i,j call check_calculated_quantities(ncalcok,ncalctot,incolumn,verbose=.false.) do i=ncalctot,1,-1 ! go in REVERSE order to get recursive dependencies properly if (incolumn(i) > 0) then if (required(incolumn(i))) then if (debugmode) then print*,'DEBUG: computing dependencies for '//trim(label(incolumn(i)))//& ' = '//trim(shortstring(calcstring(i))) endif ! !--get the list of valid variable names for this column ! call get_variables(incolumn(i),nvars,vars) ! !--check if the string contains any preceding variables ! do j=1,incolumn(i)-1 ! !--this could be smarter here (at the moment we just check for ! matching substrings, but we should check for the use of the ! string as an actual variable -- this is mainly an issue for ! single letter variables like x,y,z etc) ! if (index(shortlabel(calcstring(i)),trim(vars(j))) /= 0) then if (debugmode) print*,'DEBUG: -> depends on '//trim(label(j)) required(j) = .true. endif enddo endif endif enddo end subroutine get_calc_data_dependencies !----------------------------------------------------------------- ! ! actually compute the extra quantities from the particle data ! !----------------------------------------------------------------- subroutine calc_quantities(ifromstep,itostep,dontcalculate) use labels, only:label,unitslabel,labelvec,iamvec,ix,ivx,irho,shortstring, & count_non_blank,headertags use particle_data, only:dat,npartoftype,gamma,time,headervals,maxpart,maxstep,maxcol,iamtype use settings_data, only:ncolumns,ncalc,iRescale,xorigin,debugmode,ndim,required,iverbose, & icoords,icoordsnew,ipartialread,track_string use mem_allocation, only:alloc use settings_units, only:units,units_calc use fparser, only:checkf,parsef,evalf,EvalerrMsg,EvalErrType,rn,initf,endf use params, only:maxplot use timing, only:wall_time,print_time use geomutils, only:change_coords use part_utils, only:get_tracked_particle integer, intent(in) :: ifromstep, itostep logical, intent(in), optional :: dontcalculate integer :: i,j,ncolsnew,ierr,icalc,ntoti,nvars,ncalctot,nused,itrackpart integer :: ndust,nhdr logical :: skip ! real, parameter :: mhonkb = 1.6733e-24/1.38e-16 ! real, parameter :: radconst = 7.5646e-15 ! real, parameter :: lightspeed = 3.e10 ! in cm/s (cgs) real(kind=rn), dimension(maxplot+nextravars+maxhdr) :: vals,unitvals character(len=lenvars), dimension(maxplot+nextravars+maxhdr) :: vars real, dimension(3) :: x0,v0 real :: t1,t2 ! !--allow dummy call to set labels without actually calculating stuff ! if (present(dontcalculate)) then skip = dontcalculate else skip = .false. endif ierr = 0 ncalc = 0 call check_calculated_quantities(ncalc,ncalctot,verbose=(.not.skip .and. iverbose > 0)) if (.not.skip .and. ncalc > 0) then nused = 0 if (.not.ipartialread) then ! !--need to be careful if data file has been read fully ! as in this case we also assume all calculated quantities ! have been done. So need to make sure that all quantities ! *are* actually calculated in this case. ! required(:) = .true. endif do i=1,ncalc if (required(ncolumns+i)) nused = nused + 1 enddo if (iverbose > 0) print "(2(a,i2),a,/)",' Calculating ',nused,' of ',ncalctot,' additional quantities...' endif ncolsnew = ncolumns + ncalc if (ncolsnew > maxcol) call alloc(maxpart,maxstep,ncolsnew) ! !--reset iamvec to zero for calculated columns ! iamvec(ncolumns+1:ncolsnew) = 0 labelvec(ncolumns+1:ncolsnew) = ' ' ! !--evaluate functions in turn ! if (.not.skip .and. ncalc > 0) then call initf(ncalc) ! !--compile each function into bytecode ! icalc = 1 do i=1,maxcalc if (icalc <= ncalc) then ! !--get the list of valid variable names for this column ! call get_variables(ncolumns+icalc-1,nvars,vars) ! !--now actually parse the function ! call parsef(icalc,shortstring(calcstring(i)),vars(1:nvars),err=ierr,Verbose=.false.) if (ierr==0) then icalc = icalc + 1 endif endif enddo ! !--evaluate functions from particle data ! call wall_time(t1) do i=ifromstep,itostep ntoti = SUM(npartoftype(:,i)) ndust = npartoftype(2,i) ! !--set origin position ! v0(:) = 0. itrackpart = get_tracked_particle(track_string,npartoftype(:,i),iamtype(:,i),dat(:,:,i),irho) if (itrackpart > 0 .and. itrackpart <= ntoti) then x0(:) = 0. if (ix(1) > 0 .and. ix(1) <= ncolumns) then x0(1) = dat(itrackpart,ix(1),i) else print*,'** internal error: tracking particle set but cannot locate x coordinate' endif if (ix(2) > 0 .and. ix(2) <= ncolumns) x0(2) = dat(itrackpart,ix(2),i) if (ix(3) > 0 .and. ix(3) <= ncolumns) x0(3) = dat(itrackpart,ix(3),i) if (i==ifromstep) then print "(a,i10)",' using position of tracked particle ',itrackpart print "(a,3(e11.3),/)",' (x0,y0,z0) = ',dat(itrackpart,ix(1:ndim),i) endif if (ivx > 0 .and. ivx+ndim-1 <= ncolumns) then v0(1:ndim) = dat(itrackpart,ivx:ivx+ndim-1,i) endif else x0(:) = xorigin(:) endif do icalc=1,ncalc if (required(ncolumns+icalc)) then if (debugmode) print*,'DEBUG: ',icalc,' calculating '//trim(label(ncolumns+icalc)) ! !--additional settings allowed in function evaluations ! i.e., time and gamma from dump file and current origin settings ! make sure the number here aligns with the "nextravars" setting ! vals(ncolumns+icalc) = time(i) vals(ncolumns+icalc+1) = gamma(i) vals(ncolumns+icalc+2) = x0(1) vals(ncolumns+icalc+3) = x0(2) vals(ncolumns+icalc+4) = x0(3) if (iRescale) then unitvals(ncolumns+icalc) = units(0) unitvals(ncolumns+icalc+1) = 1. unitvals(ncolumns+icalc+2) = units(ix(1)) unitvals(ncolumns+icalc+3) = units(ix(2)) unitvals(ncolumns+icalc+4) = units(ix(3)) endif nhdr = count_non_blank(headertags) do j=1,nhdr vals(ncolumns+icalc+4+j) = headervals(j,i) if (iRescale) unitvals(ncolumns+icalc+4+j) = 1. enddo if (icoordsnew /= icoords .and. ndim > 0 .and. all(ix(1:ndim) > 0)) then ! !--if alternative coordinate system is in use, then we need to apply ! the coordinate transformations to the data BEFORE using it ! to calculate additional quantities ! do j=1,ntoti vals(1:ncolumns+icalc-1) = dat(j,1:ncolumns+icalc-1,i) call change_coords(vals(1:ncolumns+icalc-1),ncolumns+icalc-1,& ndim,icoords,icoordsnew,x0(1:ndim),v0(1:ndim)) !--evaluate function with transformed values dat(j,ncolumns+icalc,i) = real(evalf(icalc,vals(1:ncolumns+icalc+nextravars+nhdr-1))) enddo ! evaluate units of the new function if (iRescale) then unitvals(1:ncolumns+icalc-1) = units(1:ncolumns+icalc-1) call change_coords(unitvals(1:ncolumns+icalc-1),ncolumns+icalc-1,& ndim,icoords,icoordsnew,x0(1:ndim),v0(1:ndim)) ! DP: see comment below units_calc(ncolumns+icalc) = units(ncolumns+icalc) !real(evalf(icalc,unitvals(1:ncolumns+icalc+nextravars+nhdr-1))) endif else !!$omp parallel do default(none) private(j,vals,icolumn) shared(dat,i,icalc,ncolumns) do j=1,ntoti vals(1:ncolumns+icalc-1) = dat(j,1:ncolumns+icalc-1,i) dat(j,ncolumns+icalc,i) = real(evalf(icalc,vals(1:ncolumns+icalc+nextravars+nhdr-1))) enddo if (iRescale) then unitvals(1:ncolumns+icalc-1) = units(1:ncolumns+icalc-1) ! ! DP: ideally we would fix the line below to compute the exact solution unit scaling directly ! for an arbitrary function string, but we have to take out the additions and ! subtractions, so would have to parse a reduced function, not the original function ! ! For now, this is done manually by recognising the dimensionality of certain computed quantities ! in identify_calculated_quantities ! units_calc(ncolumns+icalc) = units(ncolumns+icalc) !real(evalf(icalc,unitvals(1:ncolumns+icalc+nextravars+nhdr-1))) endif !!$omp end parallel do endif if (EvalErrType /= 0) then print "(a)",' ERRORS evaluating '//trim(calcstring(icalc))//': ' & //trim(EvalerrMsg()) endif ! !--identify calculated quantities based on the label ! if (i==ifromstep) then call identify_calculated_quantity(label(ncolumns+icalc),ncolumns,ncolumns+icalc) endif else if (debugmode) print*,'DEBUG: ',icalc,' skipping '//trim(label(ncolumns+icalc))//' (not required)' endif enddo enddo call endf call wall_time(t2) if (t2-t1 > 1.) call print_time(t2-t1) endif ! !--override units of calculated quantities if necessary ! if (iRescale .and. any(abs(units(ncolumns+1:ncolumns+ncalc)-1.0) > tiny(0.)) & .and. .not.skip) then !write(*,"(/a)") ' rescaling data...' do i=ncolumns+1,ncolumns+ncalc if (abs(units(i)-1.0) > tiny(0.) .and. abs(units(i)) > tiny(0.)) then dat(:,i,ifromstep:itostep) = dat(:,i,ifromstep:itostep)*units(i) endif if (index(label(i),trim(unitslabel(i)))==0) label(i) = trim(label(i))//trim(unitslabel(i)) enddo elseif (iRescale) then do i=ncolumns+1,ncolumns+ncalc if (index(label(i),trim(unitslabel(i)))==0) label(i) = trim(label(i))//trim(unitslabel(i)) if (debugmode) print*,'DEBUG: column ',i,trim(label(i)),' units_calc = ',units_calc(i) enddo endif return end subroutine calc_quantities !----------------------------------------------------------------- ! ! utility (private) to internally identify a calculated quantity ! so that the relevant exact solutions can be plotted for that ! quantity. This is mainly just the radius, but can include ! other things also. ! !----------------------------------------------------------------- subroutine identify_calculated_quantity(labelcol,ncolumns,icolumn) use asciiutils, only:lcase use labels, only:irad,ike,ipr,ikappa,itemp,label_synonym,ix,ivx use settings_data, only:debugmode,iRescale use settings_units,only:units_calc,units character(len=*), intent(in) :: labelcol integer, intent(in) :: ncolumns,icolumn ! !--identify quantities based on the label ! only do this if the location flags are not already set ! (e.g. in the data read) - but DO overwrite if they ! are calculated quantities as the locations can change ! select case(label_synonym(labelcol)) case('r','radius','rad') call assign_column(irad,icolumn,ncolumns,debugmode,'radius') if (iRescale .and. ix(1) > 0) units_calc(icolumn) = units(ix(1)) case('kinetic energy','ke','1/2 v^2','v^2/2') call assign_column(ike,icolumn,ncolumns,debugmode,'kinetic energy') if (iRescale .and. ivx > 0) units_calc(icolumn) = units(ivx)**2 case('pressure','pr','p') call assign_column(ipr,icolumn,ncolumns,debugmode,'pressure') case('kappa','opacity') call assign_column(ikappa,icolumn,ncolumns,debugmode,'opacity') case('temperature','temp') call assign_column(itemp,icolumn,ncolumns,debugmode,'temperature') end select end subroutine identify_calculated_quantity !----------------------------------------------------------------- ! ! helper routine for above ! !----------------------------------------------------------------- subroutine assign_column(i,icolumn,ncolumns,debugmode,string) integer, intent(inout) :: i integer, intent(in) :: icolumn,ncolumns logical, intent(in) :: debugmode character(len=*), intent(in) :: string if (i <= 0 .or. i > ncolumns) then i = icolumn if (debugmode) print "(1x,a,i2,a)",'identifying column ',icolumn,' as the '//trim(string) endif end subroutine assign_column !----------------------------------------------------------------- ! ! utility (private) to fill the array of variable names ! !----------------------------------------------------------------- subroutine get_variables(maxlabel,nvars,variables) use labels, only:label,shortlabel,unitslabel,headertags,count_non_blank integer, intent(in) :: maxlabel integer, intent(out) :: nvars character(len=*), dimension(:), intent(out) :: variables integer :: i,nheader ! !--can use column labels up to the previous quantity calculated ! variables(:) = ' ' nvars = maxlabel + nextravars do i=1,maxlabel variables(i) = trim(adjustl(shortlabel(label(i),unitslabel(i)))) enddo do i=1,nextravars variables(maxlabel+i) = trim(extravars(i)) enddo nheader = count_non_blank(headertags) nvars = nvars + nheader do i=1,nheader variables(maxlabel+nextravars+i) = trim(headertags(i)) enddo end subroutine get_variables !----------------------------------------------------------------- ! ! utility (public) to query whether or not the origin position ! is actually used in the currently set quantities ! !----------------------------------------------------------------- logical function calc_quantities_use_x0() integer :: i calc_quantities_use_x0 = .false. do i=1,maxcalc if (index(calcstring(i),trim(extravars(3))) > 0) calc_quantities_use_x0 = .true. if (index(calcstring(i),trim(extravars(4))) > 0) calc_quantities_use_x0 = .true. if (index(calcstring(i),trim(extravars(5))) > 0) calc_quantities_use_x0 = .true. enddo end function calc_quantities_use_x0 end module calcquantities danieljprice-splash-4d1f09c/src/colourbar.f90000066400000000000000000000540261477365367100212000ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------ ! Module containing routines related to plotting the colour bar ! in various styles !------------------------------------------------------------------------ module colourbar implicit none integer, parameter, public :: maxcolourbarstyles = 12 character(len=28), dimension(0:maxcolourbarstyles), parameter, public :: & labelcolourbarstyles = (/'no colour bar ', & 'vertical (right hand side) ', & 'horizontal (underneath plot)', & 'plot-hugging vertical ', & 'plot-hugging horizontal ', & 'one-sided vertical ', & 'one-sided horizontal ', & 'floating/inset vertical ', & 'floating/inset horizontal ', & 'vertical (left hand side) ', & 'horizontal (on top) ', & 'custom vertical ', & 'custom horizontal '/) integer, parameter, public :: maxfloatingstyles = 5 character(len=*), dimension(maxfloatingstyles), parameter, public :: & labelfloatingstyles = (/' 1) Top left ', & ' 2) Top right ', & ' 3) Bottom left ', & ' 4) Bottom right', & ' 5) Custom '/) ! !--these are settings that have default values but can ! be changed if required ! real, public :: ColourBarDisp = 5.0 real, public :: ColourBarWidth = 2. ! width in character heights logical, public :: iplotcolourbarlabel = .true. logical, public :: ilogcolourbaraxis = .false. public :: plotcolourbar,incolourbar,incolourbarlabel,barisvertical public :: get_colourbarmargins,isfloating,adjustcolourbar,iscustombar public :: set_floating_bar_style real, private, save :: xlabeloffsetsave = 0. real, parameter, private :: dispall = 0.25 real, public :: ColourBarPosx = 0.01 ! default x pos of short/fat bars real, public :: ColourBarPosy = 0.05 ! default y pos of short/fat bars real, public :: ColourBarLen = 0.25 ! default length of short/fat bars character(len=10), public :: ColourBarFmtStr = 'BCMSTV ' private contains !-------------------------------------------------------- ! this subroutine plots the colour bar in various styles !-------------------------------------------------------- subroutine plotcolourbar(istyle,icolours,datmin,datmax,label,log, & xlabeloffset,vptxminfull,vptxmaxfull,vptyminfull,vptymaxfull) use plotlib, only:plot_set_exactpixelboundaries,plotlib_is_pgplot use plotlib, only:plot_bbuf,plot_ebuf,plot_qwin,plot_qvp,plot_qcs,& plot_svp,plot_swin,plot_imag,plot_box,plot_annotate,plot_gray,& plotlib_extend_pad integer, intent(in) :: istyle,icolours real, intent(in) :: datmin,datmax,xlabeloffset character(len=*), intent(in) :: label logical, intent(in) :: log real, intent(in), optional :: vptxminfull,vptxmaxfull,vptyminfull,vptymaxfull integer, parameter :: maxpixwedg = 400 real, dimension(6), parameter :: trans = (/-0.5,1.0,0.0,-0.5,0.0,1.0/) real, dimension(1,maxpixwedg) :: sampley real, dimension(maxpixwedg,1) :: samplex character(len=1) :: logc integer :: i,npixwedg real :: disp,width,xch,ych,dx real :: xmin,xmax,ymin,ymax,vptxmin,vptxmax,vptymin,vptymax real :: vptxmini,vptxmaxi,vptymini,vptymaxi real :: vptxminp,vptxmaxp,vptyminp,vptymaxp real :: xmaxpix,xminpix,yminpix,ymaxpix ! !--return on style 0 ! if (istyle <= 0) return ! !--set colour bar displacement and width in character heights ! width = ColourBarWidth xlabeloffsetsave = xlabeloffset ! !--start buffering ! call plot_bbuf ! !--query and save current viewport, page and character height settings ! call plot_qwin(xmin,xmax,ymin,ymax) call plot_qvp(0,vptxmin,vptxmax,vptymin,vptymax) call plot_qcs(0,xch,ych) !--if colour bar stretches across multiple plots, ! override settings for vptymin and vptymax with input values if (present(vptxminfull) .and. present(vptxmaxfull) .and. & present(vptyminfull) .and. present(vptymaxfull)) then vptxmini = vptxminfull vptxmaxi = vptxmaxfull vptymini = vptyminfull vptymaxi = vptymaxfull else vptxmini = vptxmin vptxmaxi = vptxmax vptymini = vptymin vptymaxi = vptymax endif disp = dispall select case(istyle) !------------------------ ! horizontal colour bar !------------------------ case(2,4,6,8,10,12) if (istyle==4) disp = 0. ! plot-hugging ! !--set viewport for the wedge ! if (isfloating(istyle)) then vptxminp = vptxmini ! to vptxmaxp = vptxmaxi ! avoid vptyminp = vptymini ! compiler vptymaxp = vptymaxi ! warnings call barlimits(vptxmini,vptxmaxi,vptxminp,vptxmaxp,ColourBarPosx,ColourBarLen) call barlimits(vptymini,vptymaxi,vptyminp,vptymaxp,ColourBarPosy,ColourBarLen) vptymaxi = vptymini + width*ych elseif (istyle==10) then ! on top of plot vptymini = vptymaxi + (disp+0.1)*ych vptymaxi = vptymini + width*ych else vptymaxi = vptymini - (disp + xlabeloffset)*ych vptymini = vptymaxi - width*ych endif call plot_svp(vptxmini,vptxmaxi,vptymini,vptymaxi) call plot_set_exactpixelboundaries() !--check number of pixels in colour bar call plot_qvp(3,xminpix,xmaxpix,yminpix,ymaxpix) npixwedg = max(min(int(xmaxpix-xminpix),maxpixwedg),2) ! !--fill array with all values from datmin to datmax ! dx = (datmax-datmin)/real(npixwedg-1) do i=1,npixwedg samplex(i,:) = datmin + (i-1)*dx enddo ! !--draw colour bar, by cleverly setting window size ! call plot_swin(1.0,real(npixwedg),0.0,1.0) if (abs(icolours) > 0) then ! colour !--check if the colour bar will be more than 1024 pixels if ((xmaxpix-xminpix) <= 1024 .or. .not.plotlib_is_pgplot) then ! !--the standard way is to use the default line below ! if (icolours==1) then call plot_gray(samplex,npixwedg,1,1,npixwedg,1,1,datmin,datmax,trans,iextend=plotlib_extend_pad) else call plot_imag(samplex,npixwedg,1,1,npixwedg,1,1,datmin,datmax,trans,iextend=plotlib_extend_pad) endif else ! !--if > 1024 pixels, we instead use the following: ! this is a workaround for a PGPLOT bug with large colour bars ! (> 1024 device pixels long) - plot colour bar in two halves. ! this works up to 2048 pixels, really should divide by n. ! call plot_svp(vptxmini,vptxmaxi-0.5*(vptxmaxi-vptxmini),vptymini,vptymaxi) call plot_swin(1.0,real(npixwedg/2),0.0,1.0) call plot_set_exactpixelboundaries() call plot_imag(samplex,npixwedg,1,1,npixwedg/2,1,1,datmin,datmax,trans) call plot_svp(vptxmaxi-0.5*(vptxmaxi-vptxmini)-0.001,vptxmaxi,vptymini,vptymaxi) call plot_swin(real(npixwedg/2 + 1),real(npixwedg),0.0,1.0) call plot_set_exactpixelboundaries() call plot_imag(samplex,npixwedg,1,npixwedg/2+1,npixwedg,1,1,datmin,datmax,trans) call plot_svp(vptxmini,vptxmaxi,vptymini,vptymaxi) call plot_set_exactpixelboundaries() endif endif call plot_swin(datmin,datmax,0.0,1.0) ! !--draw labelled frame around the wedge ! if (istyle==12) then call plot_box(ColourBarFmtStr,0.0,0,'BC',0.0,0) elseif (istyle==10) then call plot_box('BCSMT',0.0,0,'BC',0.0,0) elseif (istyle==4 .or. istyle==6 .or. istyle==8) then call plot_box('BNST',0.0,0,'BC',0.0,0) if (istyle==6 .or. istyle==8) call plot_box('C',0.0,0,' ',0.0,0) else call plot_box('BCNST',0.0,0,'BC',0.0,0) endif ! !--write the units label: the position is relative to the bottom of ! the wedge because of the way we have defined the viewport. ! For the horizontal colour bar this never needs to change ! (0.25 space + 1 character height for numeric labels + 0.25 space ! + 1 character height for actual label = 2.5 character heights) ! if (len_trim(label) > 0 .and. iplotcolourbarlabel) then if (istyle==10) then call plot_annotate('T',2.5,0.5,0.5,trim(label)) else call plot_annotate('B',2.5,0.5,0.5,trim(label)) endif endif !------------------------------- ! vertical colour bar (default) !------------------------------- case default if (istyle==3) disp = 0. ! plot-hugging ! !--set viewport for the wedge ! if (isfloating(istyle)) then vptxminp = vptxmini ! to vptxmaxp = vptxmaxi ! avoid vptyminp = vptymini ! compiler vptymaxp = vptymaxi ! warnings call barlimits(vptxmini,vptxmaxi,vptxminp,vptxmaxp,ColourBarPosx,ColourBarLen) call barlimits(vptymini,vptymaxi,vptyminp,vptymaxp,ColourBarPosy,ColourBarLen) vptxmaxi = vptxmini + width*xch elseif (istyle==9) then vptxmaxi = vptxmini - disp*xch vptxmini = vptxmaxi - width*xch else vptxmini = vptxmaxi + disp*xch vptxmaxi = vptxmini + width*xch endif call plot_svp(vptxmini,vptxmaxi,vptymini,vptymaxi) call plot_set_exactpixelboundaries() !--check number of pixels in colour bar call plot_qvp(3,xminpix,xmaxpix,yminpix,ymaxpix) npixwedg = max(min(int(ymaxpix-yminpix),maxpixwedg),2) dx = (datmax-datmin)/real(npixwedg-1) do i=1,npixwedg sampley(:,i) = datmin + (i-1)*dx enddo ! !--use log ticks ! logc = '' if (ilogcolourbaraxis) logc = 'L' ! !--draw colour bar, by cleverly setting window size ! call plot_swin(0.0,1.0,0.0,real(npixwedg)) if (icolours==1) then ! greyscale call plot_gray(sampley,1,npixwedg,1,1,1,npixwedg,datmin,datmax,trans,iextend=plotlib_extend_pad) elseif (abs(icolours) > 0) then ! colour call plot_imag(sampley,1,npixwedg,1,1,1,npixwedg,datmin,datmax,trans,iextend=plotlib_extend_pad) endif call plot_swin(0.0,1.0,datmin,datmax) ! !--draw labelled frame around the wedge ! if (istyle==11) then call plot_box('BC',0.0,0,ColourBarFmtStr,0.0,0) elseif (istyle==9) then call plot_box('BC',0.0,0,'BCNSTV',0.0,0) elseif (istyle==3 .or. istyle==5 .or. istyle==7) then call plot_box('BC',0.0,0,'CMSTV',0.0,0) if (istyle==5 .or. istyle==7) call plot_box(' ',0.0,0,'B',0.0,0) else call plot_box('BC',0.0,0,'BCMSTV'//logc,0.0,0) endif ! !--write the units label: the position is relative to the edge of ! the wedge because of the way we have defined the viewport. ! For the vertical colour bar ColourBarDisp is a set by default to ! the maximum size for the numeric label (written horizontally) - ! this is about 4 character heights for something like "-5 x 10^10" ! We allow the user to adjust this parameter to bring the label ! closer where the numeric labels are smaller (e.g. "-5"). ! if (len_trim(label) > 0 .and. iplotcolourbarlabel) then if (istyle==9) then call plot_annotate('L',ColourBarDisp+0.75,1.0,1.0,trim(label)) else call plot_annotate('R',ColourBarDisp+0.75,1.0,1.0,trim(label)) endif endif end select ! !--reset window and viewport ! call plot_svp(vptxmin,vptxmax,vptymin,vptymax) call plot_swin(xmin,xmax,ymin,ymax) call plot_ebuf return end subroutine plotcolourbar !------------------------------------------------------- ! query function to see if colour bar is plotted ! vertically or horizontally for a given style !------------------------------------------------------- logical function barisvertical(istyle) integer, intent(in) :: istyle barisvertical = .true. if (istyle <= 0) return select case(istyle) case(2,4,6,8,10,12) barisvertical = .false. case default barisvertical = .true. end select end function barisvertical !------------------------------------------------------- ! query function to see if a given position on ! the plot should lie within the colour bar or not !------------------------------------------------------- logical function incolourbar(istyle,iunits,xpt,ypt,xmin,xmax,ymin,ymax) use plotlib, only:plot_qcs integer, intent(in) :: istyle,iunits real, intent(in) :: xpt,ypt,xmin,xmax,ymin,ymax real :: xminbar,xmaxbar,yminbar,ymaxbar,xch,ych,barwidth incolourbar = .false. if (istyle <= 0) return select case(istyle) case(8,12) call barlimits(xminbar,xmaxbar,xmin,xmax,ColourBarPosx,ColourBarLen) call barlimits(yminbar,ymaxbar,ymin,ymax,ColourBarPosy,ColourBarLen) call plot_qcs(iunits,xch,ych) ymaxbar = yminbar + 2.*ColourBarWidth*ych if (iplotcolourbarlabel) then yminbar = yminbar - 3.0*ych else yminbar = yminbar - 2.0*ych endif if ((xpt >= xminbar .and. xpt <= xmaxbar) .and. & (ypt >= yminbar .and. ypt <= ymaxbar)) then incolourbar = .true. endif case(7,11) call barlimits(xminbar,xmaxbar,xmin,xmax,ColourBarPosx,ColourBarLen) call barlimits(yminbar,ymaxbar,ymin,ymax,ColourBarPosy,ColourBarLen) call plot_qcs(iunits,xch,ych) if (iplotcolourbarlabel) then barwidth = (2.*ColourBarWidth+0.75 + max(ColourBarDisp+0.75,0.0))*xch else barwidth = (2.*ColourBarWidth+0.75 + 5.0)*xch endif xmaxbar = xminbar + barwidth if ((xpt >= xminbar .and. xpt <= xmaxbar) .and. & (ypt >= yminbar .and. ypt <= ymaxbar)) then incolourbar = .true. endif case(9) ! colour bar on left if (xpt < xmin) incolourbar = .true. case(10) ! colour bar on top if (ypt > ymax) incolourbar = .true. case(2,4,6) if (ypt < ymin) incolourbar = .true. case default if (xpt > xmax) incolourbar = .true. end select return end function incolourbar !------------------------------------------------------- ! query function to see if a given position on ! the plot should lie within the colour bar label or not !------------------------------------------------------- logical function incolourbarlabel(istyle,iunits,xpt,ypt,xmin,xmax,ymin,ymax) use plotlib, only:plot_qcs integer, intent(in) :: istyle,iunits real, intent(in) :: xpt,ypt,xmin,xmax,ymin,ymax real :: xch,ych,disp,xminbar,xmaxbar,yminbar,ymaxbar incolourbarlabel = .false. if (iplotcolourbarlabel) then call plot_qcs(iunits,xch,ych) disp = dispall if (istyle==3 .or. istyle==4) disp = 0. select case(istyle) case(8,12) call barlimits(xminbar,xmaxbar,xmin,xmax,ColourBarPosx,ColourBarLen) if (ypt < (ymin-(disp + xlabeloffsetsave + ColourBarWidth+2.0)*ych) .and. & ypt > (ymin-(disp + xlabeloffsetsave + ColourBarWidth+3.0)*ych) .and. & xpt > xminbar .and. xpt < xmaxbar) incolourbarlabel = .true. case(7,11) call barlimits(yminbar,ymaxbar,ymin,ymax,ColourBarPosy,ColourBarLen) if (xpt > (xmax+(disp + ColourBarWidth-0.25 + max(ColourBarDisp-0.25,0.0))*xch) .and. & xpt < (xmax+(disp + ColourBarWidth+0.75 + max(ColourBarDisp+0.75,0.0))*xch) .and. & ypt > yminbar .and. ypt < ymaxbar) incolourbarlabel = .true. case(2,4,6) if (ypt < (ymin-(disp + xlabeloffsetsave + ColourBarWidth+2.0)*ych) .and. & ypt > (ymin-(disp + xlabeloffsetsave + ColourBarWidth+3.0)*ych)) incolourbarlabel = .true. case(9) if (xpt < (xmin-(disp + ColourBarWidth-0.25 + max(ColourBarDisp-0.25,0.0))*xch) .and. & xpt > (xmin-(disp + ColourBarWidth+0.75 + max(ColourBarDisp+0.75,0.0))*xch)) incolourbarlabel = .true. case(10) if (ypt > (ymax+(disp + xlabeloffsetsave + ColourBarWidth+2.0)*ych) .and. & ypt < (ymax+(disp + xlabeloffsetsave + ColourBarWidth+3.0)*ych)) incolourbarlabel = .true. case default if (xpt > (xmax+(disp + ColourBarWidth-0.25 + max(ColourBarDisp-0.25,0.0))*xch) .and. & xpt < (xmax+(disp + ColourBarWidth+0.75 + max(ColourBarDisp+0.75,0.0))*xch)) incolourbarlabel = .true. end select endif return end function incolourbarlabel !------------------------------------------ ! utility function to avoid repeated code !------------------------------------------ subroutine barlimits(barmin,barmax,posmin,posmax,pos,barlen) real, intent(out) :: barmin,barmax real, intent(in) :: posmin,posmax,pos,barlen real :: dpos dpos = (posmax - posmin) ! in case posmin and barmin are same variable barmin = posmin + pos*dpos barmax = barmin + barlen*dpos end subroutine barlimits !------------------------------------------------------- ! query function to get margins which should ! be allowed on the page in order to later plot ! the colour bar !------------------------------------------------------- subroutine get_colourbarmargins(istyle,xminmargin,xmaxmargin,yminmargin,ymaxmargin,barwidth) use plotlib, only:plot_qcs,plot_qvp integer, intent(in) :: istyle real, intent(inout) :: xminmargin,xmaxmargin,yminmargin,ymaxmargin real, intent(out) :: barwidth real :: xch,ych,vptxmin,vptxmax,vptymin,vptymax barwidth = 0. if (istyle <= 0) return call plot_qcs(0,xch,ych) call plot_qvp(0,vptxmin,vptxmax,vptymin,vptymax) if (barisvertical(istyle)) then if (iplotcolourbarlabel) then barwidth = (ColourBarWidth+0.75 + max(ColourBarDisp+0.75,0.0))*xch else barwidth = (ColourBarWidth+0.75 + 5.0)*xch endif if (isfloating(istyle)) then barwidth = max((ColourBarPosx-1.) + barwidth,0.) endif if (istyle==9) then xminmargin = xminmargin + barwidth else xmaxmargin = xmaxmargin + barwidth endif else if (iplotcolourbarlabel) then barwidth = (ColourBarWidth+3.0)*ych ! ie. width + 2.5 + 0.5 margin else barwidth = (ColourBarWidth+2.0)*ych ! ie. width + 1.5 + 0.5 margin endif if (isfloating(istyle)) then barwidth = max(-(ColourBarPosy - (barwidth - ColourBarWidth*ych)),0.) endif if (istyle==10) then ymaxmargin = ymaxmargin + barwidth + 0.35*ych else yminmargin = yminmargin + barwidth endif endif return end subroutine get_colourbarmargins !------------------------------------------------------- ! query function for floating colour bar styles !------------------------------------------------------- logical function isfloating(istyle) integer, intent(in) :: istyle select case(istyle) case(7,8,11,12) isfloating = .true. case default isfloating = .false. end select end function isfloating !------------------------------------------------------- ! query function for custom colour bar styles !------------------------------------------------------- logical function iscustombar(istyle) integer, intent(in) :: istyle if (istyle==12 .or. istyle==11) then iscustombar = .true. else iscustombar = .false. endif end function iscustombar !--------------------------------------------------------------------- ! utility function used when interactively changing colour bar limits !--------------------------------------------------------------------- subroutine adjustcolourbar(istyle,xpt1,ypt1,xpt2,ypt2,& xmin,xmax,ymin,ymax,barmin,barmax) integer, intent(in) :: istyle real, intent(in) :: xpt1,ypt1,xpt2,ypt2,xmin,xmax,ymin,ymax real, intent(inout) :: barmin,barmax real :: dbar,xminbar,xmaxbar,yminbar,ymaxbar if (istyle==8 .or. istyle==12) then !--floating horizontal bar xminbar = xmin + ColourBarPosx*(xmax - xmin) xmaxbar = xminbar + ColourBarLen*(xmax - xmin) else xminbar = xmin xmaxbar = xmax endif if (istyle==7 .or. istyle==11) then !--floating vertical bar yminbar = ymin + ColourBarPosy*(ymax - ymin) ymaxbar = yminbar + ColourBarLen*(ymax - ymin) else yminbar = ymin ymaxbar = ymax endif if (barisvertical(istyle)) then if ((ymaxbar-yminbar) > 0.) then dbar = (barmax-barmin)/(ymaxbar-yminbar) else dbar = 0. endif barmax = barmin + (max(ypt1,ypt2)-yminbar)*dbar barmin = barmin + (min(ypt1,ypt2)-yminbar)*dbar else if ((xmaxbar-xminbar) > 0.) then dbar = (barmax-barmin)/(xmaxbar-xminbar) else dbar = 0. endif barmax = barmin + (max(xpt1,xpt2)-xminbar)*dbar barmin = barmin + (min(xpt1,xpt2)-xminbar)*dbar endif end subroutine adjustcolourbar subroutine set_floating_bar_style(iColourBarStyle,iColourBarPos) integer, intent(in) :: iColourBarStyle,iColourBarPos select case(iColourBarPos) case(1) if (barisvertical(iColourBarStyle)) then ColourBarPosx = 0.01 ColourBarPosy = 0.74 else ColourBarPosx = 0.01 ColourBarPosy = 0.95 endif case(2) if (barisvertical(iColourBarStyle)) then ColourBarPosx = 0.82 ! minus width in ch ColourBarPosy = 0.74 else ColourBarPosx = 0.73 ColourBarPosy = 0.95 endif case(3) if (barisvertical(iColourBarStyle)) then ColourBarPosx = 0.01 ColourBarPosy = 0.01 else ColourBarPosx = 0.015 ColourBarPosy = 0.075 endif case(4) if (barisvertical(iColourBarStyle)) then ColourBarPosx = 0.82 ! minus width in ch ColourBarPosy = 0.01 else ColourBarPosx = 0.73 ColourBarPosy = 0.075 endif end select end subroutine set_floating_bar_style end module colourbar danieljprice-splash-4d1f09c/src/colourparts.f90000066400000000000000000000031361477365367100215610ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- module colourparts implicit none contains subroutine colour_particles(dat,datmin,datmax,icolour,npart) use plotlib, only: plot_qcir integer, intent(in) :: npart real, dimension(npart), intent(in) :: dat real, intent(in) :: datmin, datmax integer, dimension(npart), intent(out) :: icolour integer :: i,icolourmin,icolourmax,icolourtemp real :: dx call plot_qcir(icolourmin,icolourmax) dx = (datmax - datmin)/real(icolourmax - icolourmin) do i=1,npart icolourtemp = int((dat(i) - datmin)/dx) + icolourmin if (icolourtemp > icolourmax) icolourtemp = icolourmax if (icolourtemp < icolourmin) icolourtemp = icolourmin icolour(i) = icolourtemp enddo return end subroutine colour_particles end module colourparts danieljprice-splash-4d1f09c/src/colours.f90000066400000000000000000000706321477365367100206770ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! This module contains subroutines and variables for setting the ! colour schemes for rendered plots ! module colours implicit none integer, parameter :: ncolourmax = 256 integer, parameter :: ncolourschemes = 42 character(len=17), dimension(ncolourschemes), parameter :: schemename = & (/'greyscale ', & 'red ', & 'Bate red-yellow ', & 'heat ', & 'rainbow ', & 'prism ', & 'red-blue-yellow ', & 'blue-yellow-red ', & 'purple-blue-green', & 'gamma ', & 'gamma- no black ', & 'grn-red-blue-wht ', & 'blk-blu-cyan-yell', & 'rainbow II ', & 'rainbow II (casa)', & 'haze ', & 'huesatval2 ', & 'blue-red ', & 'blue-grn-red-yell', & 'Bate BRY saoimage', & 'ice (blue-white) ', & 'fire ', & 'blue-red ', & 'menacing ', & 'rt ', & 'Smallwood ', & 'Dolag II ', & 'Dolag III ', & 'Alice WBYR ', & 'light blue ', & 'light green ', & 'light red ', & 'CMRmap ', & 'blue-black-red ', & 'inferno ', & 'viridis ', & 'ocean ', & 'casa blue ', & 'green-brown ', & 'Doppler shift ', & 'PuOr ', & 'PRGn '/) integer, parameter :: icustom = 100 ! number 100 is custom colour table ! !--rgb colours of the colour table are stored in the array below ! this is used for colour blending (opacity rendering) ! integer :: ifirstcolour, ncolours,ncoltable real, dimension(3,ncolourmax) :: rgbtable real, dimension(ncolourmax) :: ltable integer, private :: icolourscheme_prev = 0 contains ! ------------------------------------------------------------------------ ! defines colour schemes for rendering ! ** add your own here ** ! ------------------------------------------------------------------------ subroutine colour_set(icolourscheme) use plotlib, only:plot_qcol,plot_qcir,plot_scir,plot_ctab,plot_scr,plot_qcr use settings_data, only:debugmode integer, intent(in) :: icolourscheme integer :: i,icolmin,icolmax,ncolmax,nset,index real :: brightness,contrast real, dimension(64) :: lumarr,redarr,greenarr,bluearr ncolours = ncolourmax-1 nset = 0 ! !--set first colour index (warning: colours 1-16 have presets, so ! overwriting these means that line graphs that use colour will come ! out funny). Best to leave 0 and 1 alone as these are black and white. ! ifirstcolour = 2 ! !--inquire as to colour range available on current device ! adjust ncolours if necessary ! call plot_qcol(icolmin,icolmax) ! print*,' from device = ',icolmin,icolmax call plot_qcir(icolmin,icolmax) ! print*,' other = ',icolmin,icolmax if (ifirstcolour < icolmin) ifirstcolour = icolmin ncolmax = icolmax - ifirstcolour if (ncolours > ncolmax) then ncolours = ncolmax print*,'Warning: Device allows only ',ncolours+1,' colours' endif ! !--set this as the range of colour indices to use ! if (debugmode) print*,'DEBUG: querying colour index range' call plot_scir(ifirstcolour,ifirstcolour+ncolours) brightness = 0.5 contrast = 1.0 !--invert colour table for negative values if (icolourscheme < 0) contrast = -1.0 if (abs(icolourscheme) <= ncolourschemes) then select case(abs(icolourscheme)) case(1) !--greyscale nset = 2 lumarr(1:nset) = (/0.000,1.000/) redarr(1:nset) = (/0.000,1.000/) greenarr(1:nset)= (/0.000,1.000/) bluearr(1:nset) = (/0.000,1.000/) case(2) !--red temperature (IDL red-temperature) nset = 5 lumarr(1:nset) = (/0.000,0.475,0.694,0.745,1.000/) redarr(1:nset) = (/0.000,0.686,1.000,1.000,1.000/) greenarr(1:nset)= (/0.000,0.004,0.420,0.518,1.000/) bluearr(1:nset) = (/0.000,0.000,0.000,0.000,1.000/) case(3) !--Bate red-yellow-white nset = 4 lumarr(1:nset) = (/0.000,0.337,0.666,1.000/) redarr(1:nset) = (/0.000,1.000,1.000,1.000/) greenarr(1:nset)= (/0.000,0.000,1.000,1.000/) bluearr(1:nset) = (/0.000,0.000,0.000,1.000/) case(4) !--heat nset = 5 lumarr(1:nset) = (/0.,0.25,0.5,0.75,1.0/) redarr(1:nset) = (/0.0,0.0,0.0,1.0,1.0/) greenarr(1:nset)= (/0.0,1.0,1.0,1.0,0.0/) bluearr(1:nset) = (/1.0,1.0,0.0,0.0,0.0/) case(5) !--rainbow nset = 8 lumarr(1:nset) = (/0.0,0.125,0.225,0.25,0.425,0.625,0.8125,1.0/) redarr(1:nset) = (/0.0,0.341,0.100,0.00,0.000,0.000,1.0000,1.0/) greenarr(1:nset)= (/0.0,0.000,0.000,0.00,1.000,1.000,1.0000,0.0/) bluearr(1:nset) = (/0.0,0.569,1.000,1.00,1.000,0.000,0.0000,0.0/) case(6) !--prism (IDL prism) nset = 8 lumarr(1:nset) = (/0.000,0.251,0.263,0.494,0.502,0.749,0.753,1.000/) redarr(1:nset) = (/0.000,0.953,1.000,0.035,0.000,0.000,0.000,0.000/) greenarr(1:nset)= (/0.000,0.000,0.043,0.969,1.000,0.000,0.000,0.000/) bluearr(1:nset) = (/0.000,0.000,0.000,0.000,0.027,0.984,1.000,0.000/) case(7) !--red-blue-yellow (IDL 16: stern special) nset = 7 lumarr(1:nset) = (/0.000,0.055,0.247,0.251,0.502,0.737,1.000/) redarr(1:nset) = (/0.000,0.996,0.000,0.251,0.502,0.737,1.000/) greenarr(1:nset)= (/0.000,0.055,0.247,0.251,0.502,0.737,1.000/) bluearr(1:nset) = (/0.000,0.106,0.490,0.498,1.000,0.000,1.000/) case(8) !--blue-yellow-red (IDL 34: blue-red) nset = 10 lumarr(1:nset) = (/0.000,0.004,0.125,0.129,0.380,0.384,0.635,0.886,0.996,1.000/) redarr(1:nset) = (/0.000,0.000,0.000,0.000,0.000,0.000,1.000,1.000,0.514,0.514/) greenarr(1:nset)= (/0.000,0.000,0.000,0.000,1.000,1.000,1.000,0.000,0.000,0.000/) bluearr(1:nset) = (/0.514,0.514,1.000,1.000,1.000,1.000,0.000,0.000,0.000,0.000/) ! nset = 6 ! lumarr(1:nset) = (/0.0,0.2,0.4,0.6,0.8,1.0/) ! redarr(1:nset) = (/0.0,0.0,0.5,1.0,1.0,0.5/) ! bluearr(1:nset) = (/1.0,1.0,0.5,0.0,0.0,0.0/) ! greenarr(1:nset)= (/0.0,1.0,0.5,1.0,0.0,0.0/) case(9) !--purple-blue-green nset = 6 lumarr(1:nset) = (/0.0,0.1,0.2,0.5,0.8,1.0/) redarr(1:nset) = (/0.0,0.1,0.5,0.02,0.0,0.0/) bluearr(1:nset) = (/0.0,0.2,0.5,0.98,0.0,0.0/) greenarr(1:nset)= (/0.0,0.0,0.0,0.0,0.62,0.98/) case(10) !--gamma (IDL 6: stdgamma-ii) nset = 18 lumarr(1:nset) =(/0.,0.184,0.192,0.251,0.31,0.376,0.427,0.431,0.443,0.502,0.569,0.624,0.635,0.682,0.69,0.749,0.753,1./) redarr(1:nset) =(/0.,0.000,0.035,0.318,0.31,0.643,0.914,1.000,1.000,1.000,1.000,1.000,1.000,0.639,0.678,0.976,1.00,1./) greenarr(1:nset)=(/0.,0.000,0.000,0.000,0.00,0.000,0.000,0.000,0.000,0.318,0.639,0.639,0.639,0.639,0.639,1.000,1.00,1./) bluearr(1:nset) =(/0.,0.957,1.000,0.682,0.365,0.00,0.000,0.000,0.000,0.000,0.322,0.000,0.000,0.000,0.000,0.188,0.20,1./) case(11) !--gamma but without the fade to black nset = 18 lumarr(1:nset) =(/0.,0.184,0.192,0.251,0.31,0.376,0.427,0.431,0.443,0.502,0.569,0.624,0.635,0.682,0.69,0.749,0.753,1./) redarr(1:nset) =(/0.,0.000,0.035,0.318,0.31,0.643,0.914,1.000,1.000,1.000,1.000,1.000,1.000,0.639,0.678,0.976,1.00,1./) greenarr(1:nset)=(/0.,0.000,0.000,0.000,0.00,0.000,0.000,0.000,0.000,0.318,0.639,0.639,0.639,0.639,0.639,1.000,1.00,1./) bluearr(1:nset) =(/0.5,0.957,1.000,0.682,0.365,0.00,0.000,0.000,0.000,0.000,0.322,0.000,0.000,0.000,0.000,0.188,0.20,1./) case(12) !--IDL 3: grn-red-blu-wht nset = 13 lumarr(1:nset) = (/0.000,0.008,0.047,0.110,0.125,0.267,0.282,0.298,0.773,0.788,0.863,0.988,1.000/) redarr(1:nset) = (/0.000,0.000,0.000,0.000,0.094,0.941,0.988,0.988,0.643,0.639,0.580,0.988,1.000/) greenarr(1:nset)= (/0.000,0.282,0.424,0.988,0.941,0.094,0.000,0.000,0.000,0.000,0.000,0.988,1.000/) bluearr(1:nset) = (/0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.984,1.000,1.000,1.000,1.000/) case(13) !--black-blue-cyan-yellow nset = 4 lumarr(1:nset) = (/0.,0.333,0.666,1.0/) redarr(1:nset) = (/0.0,0.0,0.0,1.0/) greenarr(1:nset)= (/0.0,0.0,1.0,1.0/) bluearr(1:nset) = (/0.0,1.0,1.0,0.0/) case(14) !--rainbow II (as used in NS merger I) nset = 10 lumarr(1:nset) = (/0.000,0.153,0.157,0.310,0.314,0.467,0.471,0.624,0.627,1.000/) redarr(1:nset) = (/1.000,1.000,0.996,0.016,0.000,0.000,0.000,0.000,0.020,1.000/) greenarr(1:nset)= (/0.000,0.980,1.000,1.000,1.000,1.000,0.984,0.004,0.000,0.000/) bluearr(1:nset) = (/0.000,0.000,0.000,0.000,0.012,0.988,1.000,1.000,1.000,1.000/) case(15) ! rainbow scheme from CASA nset = 56 lumarr(1:nset) = (/0.000,0.008,0.016,0.035,0.051,0.062,0.070,0.082,0.094,0.105,& 0.113,0.137,0.152,0.160,0.172,0.184,0.191,0.203,0.215,0.227,& 0.234,0.258,0.277,0.285,0.309,0.328,0.336,0.406,0.430,0.457,& 0.480,0.520,0.570,0.602,0.609,0.621,0.629,0.637,0.648,0.656,& 0.668,0.680,0.754,0.762,0.770,0.777,0.793,0.801,0.812,0.820,& 0.844,0.852,0.867,0.875,0.941,1.000/) redarr(1:nset) = (/0.000,0.055,0.102,0.235,0.325,0.384,0.455,0.494,0.404,0.341,& 0.282,0.149,0.043,0.000,0.004,0.012,0.024,0.047,0.106,0.133,& 0.157,0.200,0.224,0.247,0.271,0.302,0.318,0.420,0.443,0.486,& 0.514,0.561,0.510,0.557,0.600,0.659,0.737,0.800,0.894,0.969,& 0.988,1.000,0.996,0.992,0.969,0.945,0.918,0.898,0.882,0.875,& 0.859,0.859,0.855,0.847,0.725,0.635/) greenarr(1:nset)= (/0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,& 0.000,0.000,0.000,0.000,0.016,0.039,0.078,0.125,0.184,0.231,& 0.275,0.353,0.400,0.435,0.478,0.533,0.565,0.745,0.788,0.863,& 0.910,0.992,0.875,0.804,0.776,0.776,0.812,0.839,0.886,0.925,& 0.961,1.000,0.988,0.969,0.886,0.788,0.659,0.549,0.455,0.349,& 0.180,0.114,0.031,0.000,0.000,0.000/) bluearr(1:nset) = (/0.000,0.208,0.239,0.333,0.404,0.451,0.502,0.545,0.620,0.667,& 0.722,0.843,0.922,0.961,0.925,0.875,0.816,0.769,0.702,0.655,& 0.616,0.529,0.467,0.435,0.388,0.337,0.310,0.188,0.188,0.204,& 0.216,0.235,0.208,0.184,0.180,0.184,0.188,0.196,0.208,0.216,& 0.227,0.235,0.231,0.227,0.208,0.184,0.153,0.129,0.106,0.067,& 0.016,0.004,0.000,0.000,0.000,0.000/) !--rainbow III ! nset = 13 ! lumarr(1:nset) = (/0.000,0.004,0.110,0.114,0.333,0.557,0.561,0.565,0.569,0.776,0.780,0.996,1.000/) ! redarr(1:nset) = (/0.486,0.486,0.012,0.000,0.000,0.004,0.020,0.051,0.055,0.992,1.000,1.000,1.000/) ! greenarr(1:nset)= (/0.000,0.000,0.000,0.008,0.996,1.000,1.000,1.000,1.000,1.000,0.988,0.020,0.020/) ! bluearr(1:nset) = (/1.000,1.000,1.000,1.000,1.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000/) case(16) !--haze (IDL 17: haze) ! nset = 11 ! lumarr(1:nset) = (/0.000,0.008,0.016,0.486,0.494,0.502,0.514,0.953,0.961,0.996,1.000/) ! redarr(1:nset) = (/0.655,1.000,0.976,0.047,0.031,0.016,0.027,0.898,0.914,0.984,0.984/) ! greenarr(1:nset)= (/0.439,0.835,0.824,0.161,0.149,0.137,0.122,0.706,0.718,0.765,0.765/) ! bluearr(1:nset) = (/1.000,0.996,0.980,0.510,0.502,0.494,0.482,0.043,0.035,0.000,0.000/) !--without the bottom colour nset = 11 lumarr(1:nset) = (/0.000,0.008,0.016,0.486,0.494,0.502,0.514,0.953,0.961,0.996,1.000/) redarr(1:nset) = (/1.000,1.000,0.976,0.047,0.031,0.016,0.027,0.898,0.914,0.984,0.984/) greenarr(1:nset)= (/0.835,0.835,0.824,0.161,0.149,0.137,0.122,0.706,0.718,0.765,0.765/) bluearr(1:nset) = (/1.000,0.996,0.980,0.510,0.502,0.494,0.482,0.043,0.035,0.000,0.000/) case(17) !--huesatval nset = 11 lumarr(1:nset) = (/0.000,0.506,0.514,0.675,0.682,0.843,0.851,0.961,0.969,0.996,1.000/) redarr(1:nset) = (/1.000,0.494,0.486,0.329,0.345,0.988,1.000,1.000,1.000,1.000,1.000/) greenarr(1:nset)= (/0.992,0.992,1.000,1.000,1.000,1.000,0.969,0.345,0.294,0.114,0.114/) bluearr(1:nset) = (/0.992,1.000,0.980,0.337,0.322,0.161,0.153,0.043,0.035,0.008,0.008/) case(18) !--blue-red2 (IDL 12: blue-red) nset = 10 lumarr(1:nset) = (/0.000,0.016,0.247,0.255,0.498,0.506,0.749,0.757,0.996,1.000/) redarr(1:nset) = (/0.000,0.000,0.000,0.000,0.000,0.016,1.000,1.000,1.000,1.000/) greenarr(1:nset)= (/0.000,0.016,1.000,0.984,0.000,0.000,0.000,0.000,0.000,0.000/) bluearr(1:nset) = (/0.000,0.016,1.000,1.000,1.000,1.000,1.000,0.984,0.000,0.000/) case(19) !--blue-green-red-yellow (IDL 5: blue-green-red-yellow) nset = 8 lumarr(1:nset) = (/0.000,0.125,0.188,0.314,0.439,0.502,0.565,1.000/) redarr(1:nset) = (/0.000,0.000,0.000,0.000,0.000,0.471,0.784,1.000/) greenarr(1:nset)= (/0.000,0.000,0.196,0.588,0.549,0.392,0.000,1.000/) bluearr(1:nset) = (/0.000,0.259,0.392,0.392,0.000,0.000,0.000,0.000/) case(20) !--Bate BRY saoimage nset = 5 lumarr(1:nset) = (/0.000,0.25,0.50,0.75,1.00/) redarr(1:nset) = (/0.000,0.00,1.00,1.00,1.00/) greenarr(1:nset)= (/0.000,0.00,0.00,1.00,1.00/) bluearr(1:nset) = (/0.000,1.00,0.00,0.00,1.00/) ! !--Bate BRY original ! nset = 5 ! lumarr(1:nset) = (/0.000,0.195,0.586,0.781,1.00/) ! redarr(1:nset) = (/0.000,0.000,1.000,1.000,1.00/) ! greenarr(1:nset)= (/0.000,0.000,0.000,1.000,1.00/) ! bluearr(1:nset) = (/0.000,1.000,0.000,0.000,1.00/) case(21) !--ice blue (IDL blue-white) nset = 5 lumarr(1:nset) = (/0.000,0.376,0.737,0.753,1.000/) redarr(1:nset) = (/0.000,0.000,0.000,0.000,1.000/) greenarr(1:nset)= (/0.000,0.000,0.580,0.604,1.000/) bluearr(1:nset) = (/0.000,0.510,1.000,1.000,1.000/) case(22) !--fire (from FLASH code) nset = 6 lumarr(1:nset) = (/0.000,0.016,0.078,0.643,0.800,1.000/) redarr(1:nset) = (/1.000,1.000,1.000,1.000,0.000,0.973/) greenarr(1:nset)= (/0.000,0.039,0.129,0.957,0.357,0.980/) bluearr(1:nset) = (/0.000,0.000,0.000,0.000,0.000,0.973/) case(23) !--blue-red (from FLASH code) nset = 7 lumarr(1:nset) = (/0.000,0.149,0.345,0.541,0.643,0.769,1.000/) redarr(1:nset) = (/0.000,0.000,0.157,0.792,0.894,0.988,0.996/) greenarr(1:nset)= (/0.063,0.271,0.584,0.800,0.427,0.220,0.004/) bluearr(1:nset) = (/0.173,0.722,0.153,0.153,0.082,0.165,0.000/) case(24) !--menacing (from FLASH code) nset = 22 lumarr(1:nset) = (/0.000,0.078,0.133,0.161,0.169,0.263,0.271,0.302, & 0.357,0.455,0.478,0.514,0.545,0.588,0.612,0.624, & 0.643,0.722,0.749,0.796,0.808,1.000/) redarr(1:nset) = (/0.388,1.000,0.757,0.953,0.949,0.859,0.906,1.000, & 1.000,0.196,0.098,0.004,0.000,0.000,0.000,0.000, & 0.000,0.051,0.278,0.561,0.612,0.988/) greenarr(1:nset)= (/0.000,0.000,0.118,0.318,0.306,0.749,0.792,1.000, & 1.000,0.490,0.420,0.220,0.125,0.906,0.718,0.569, & 0.000,0.000,0.004,0.008,0.000,0.973/) bluearr(1:nset) = (/0.000,0.000,0.024,0.051,0.059,0.173,0.157,0.000, & 0.000,0.086,0.063,0.004,0.000,0.941,0.827,0.725, & 0.322,0.302,0.518,0.635,0.600,0.988/) case(25) !--RT (from FLASH code) nset = 6 lumarr(1:nset) = (/0.000,0.455,0.580,0.765,0.773,1.000/) redarr(1:nset) = (/0.220,1.000,1.000,1.000,1.000,1.000/) greenarr(1:nset)= (/0.000,0.000,0.478,0.980,1.000,1.000/) bluearr(1:nset) = (/0.000,0.000,0.000,0.588,0.608,0.737/) case(26) nset = 10 lumarr(1:nset) = (/0.00,0.25,0.44,0.62,0.86,0.91,0.96,0.98,1.00,1.00/) redarr(1:nset) = (/1.00,0.90,0.82,0.73,0.44,0.33,0.24,0.16,0.09,0.00/) greenarr(1:nset)= (/1.00,0.90,0.71,0.46,0.27,0.21,0.15,0.11,0.06,0.00/) bluearr(1:nset) = (/1.00,0.68,0.57,0.46,0.27,0.21,0.15,0.11,0.06,0.00/) case(27) ! !--these are Klaus Dolag colour schemes nset = 3 !--red-greeny-blue lumarr(1:nset) = (/0.0,0.5,1.0/) redarr(1:nset) = (/1.0,0.66,0.0/) greenarr(1:nset) = (/0.0,0.66,0.0/) bluearr(1:nset) = (/0.0,0.66,1.0/) case(28) nset = 5 !--dolag other lumarr(1:nset) = (/0.0,0.33,0.5,0.66,1.0/) redarr(1:nset) = (/0.0,1.00,0.5,0.00,1.0/) greenarr(1:nset) = (/0.0,0.66,1.0,0.66,0.0/) bluearr(1:nset) = (/1.0,0.66,0.5,0.33,0.0/) case(29) !--Alice WBYR nset = 12 lumarr(1:nset) = (/0.0,0.002,0.00672,0.01344,0.40824,0.41496,0.42168,0.43176,0.80052,0.80724,0.84,1.0/) redarr(1:nset) = (/1.0,1.0,1.0,0.976,0.047,0.031,0.016,0.027,0.898,0.914,0.984,0.996/) greenarr(1:nset) = (/1.0,0.835,0.835,0.824,0.161,0.149,0.137,0.122,0.706,0.718,0.765,0.055/) bluearr(1:nset) = (/1.0,1.0,0.996,0.980,0.510,0.502,0.494,0.482,0.043,0.035,0.0,0.0/) case(30) nset = 6 !--light blue lumarr(1:nset) = (/0.0,0.125,0.25,0.5,0.75,1.0/) redarr(1:nset) = (/0.000,0.00,0.00,0.300,0.700,1.000/) greenarr(1:nset) = (/0.145,0.25,0.36,0.612,0.816,1.000/) bluearr(1:nset) = (/0.350,0.54,0.65,0.800,0.918,1.000/) case(31) nset = 6 !--light green lumarr(1:nset) = (/0.0,0.125,0.25,0.5,0.75,1.0/) redarr(1:nset) = (/0.00,0.0,0.075,0.37,0.73,1.000/) greenarr(1:nset) = (/0.20,0.353,0.471, 0.718,0.895,1.000/) bluearr(1:nset) = (/0.082,0.13,0.21, 0.384,0.700,1.000/) case(32) !--light red nset = 7 lumarr(1:nset) = (/0.00,0.13,0.25,0.4,0.50,0.75,1.00/) redarr(1:nset) = (/0.44,0.60,0.84,1.0,1.00,1.00,1.00/) greenarr(1:nset)= (/0.11,0.15,0.21,0.35,0.50,0.75,1.00/) bluearr(1:nset) = (/0.00,0.00,0.00,0.00,0.15,0.55,1.00/) case(33) nset = 9 !--from Carey Rappaport ! "A colormap for effective black and white rendering of color scale images" ! IEEE Antennas Propagat. Mag. vol. 44, no. 3, pp 94-96, Jun 2002. lumarr(1:nset) = (/0.0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1.0/) redarr(1:nset) = (/0.00,0.15,0.30,0.60,1.00,0.90,0.90,0.90,1.00/) greenarr(1:nset) = (/0.00,0.15,0.15,0.20,0.25,0.50,0.75,0.90,1.00/) bluearr(1:nset) = (/0.00,0.50,0.75,0.50,0.15,0.00,0.10,0.50,1.00/) case(34) !--heat but with black in the middle nset = 5 lumarr(1:nset) = (/0.,0.25,0.5,0.75,1.0/) redarr(1:nset) = (/0.0,0.0,0.0,1.0,0.95/) greenarr(1:nset)= (/0.0,1.0,0.0,1.0,0.0/) bluearr(1:nset) = (/0.95,1.0,0.0,0.0,0.0/) case(35) !--inferno nset = 32 lumarr(1:nset) = (/0.000000, & 0.032258,0.064516,0.096774,0.129032,0.161290,0.193548,0.225806,0.258065, & 0.290323,0.322581,0.354839,0.387097,0.419355,0.451613,0.483871,0.516129, & 0.548387,0.580645,0.612903,0.645161,0.677419,0.709677,0.741935,0.774194, & 0.806452,0.838710,0.870968,0.903226,0.935484,0.967742,1.000000/) redarr(1:nset) = (/0.001462, & 0.013995,0.042253,0.081962,0.135778,0.190367,0.244967,0.297178,0.354032, & 0.403894,0.453651,0.503493,0.559624,0.609330,0.658463,0.706500,0.758422, & 0.801871,0.841969,0.878001,0.912966,0.938675,0.959114,0.974176,0.984591, & 0.987926,0.985566,0.977497,0.962517,0.948683,0.951740,0.988362/) greenarr(1:nset) = (/0.000466, & 0.011225,0.028139,0.043328,0.046856,0.039309,0.037055,0.047470,0.066925, & 0.085580,0.103848,0.121575,0.141346,0.159474,0.178962,0.200728,0.229097, & 0.258674,0.292933,0.332060,0.381636,0.430091,0.482014,0.536780,0.601122, & 0.660250,0.720782,0.782258,0.851476,0.910473,0.960587,0.998364/) bluearr(1:nset) = (/0.013866, & 0.071862,0.141141,0.215289,0.299776,0.361447,0.400007,0.420491,0.430906, & 0.433179,0.430498,0.423356,0.410078,0.393589,0.372748,0.347777,0.315266, & 0.283099,0.248564,0.212268,0.169755,0.130438,0.089499,0.048392,0.023606, & 0.051750,0.112229,0.185923,0.285546,0.395289,0.524203,0.644924/) case(36) !--viridis nset = 32 lumarr(1:nset) = (/0.000000, & 0.032258,0.064516,0.096774,0.129032,0.161290,0.193548,0.225806,0.258065, & 0.290323,0.322581,0.354839,0.387097,0.419355,0.451613,0.483871,0.516129, & 0.548387,0.580645,0.612903,0.645161,0.677419,0.709677,0.741935,0.774194, & 0.806452,0.838710,0.870968,0.903226,0.935484,0.967742,1.000000/) redarr(1:nset) = (/0.267004, & 0.277018,0.282327,0.282884,0.278012,0.269308,0.257322,0.243113,0.225863, & 0.210503,0.195860,0.182256,0.168126,0.156270,0.144759,0.133743,0.123463, & 0.119423,0.124780,0.143303,0.180653,0.226397,0.281477,0.344074,0.421908, & 0.496615,0.575563,0.657642,0.751884,0.835270,0.916242,0.993248/) greenarr(1:nset) = (/0.004874, & 0.050344,0.094955,0.135920,0.180367,0.218818,0.256130,0.292092,0.330805, & 0.363727,0.395433,0.426184,0.459988,0.489624,0.519093,0.548535,0.581687, & 0.611141,0.640461,0.669459,0.701402,0.728888,0.755203,0.780029,0.805774, & 0.826376,0.844566,0.860219,0.874951,0.886029,0.896091,0.906157/) bluearr(1:nset) = (/0.329415, & 0.375715,0.417331,0.453427,0.486697,0.509577,0.526563,0.538516,0.547314, & 0.552206,0.555276,0.557120,0.558082,0.557936,0.556572,0.553541,0.547445, & 0.538982,0.527068,0.511215,0.488189,0.462789,0.432552,0.397381,0.351910, & 0.306377,0.256415,0.203082,0.143228,0.102646,0.100717,0.143936/) case(37) !--ocean (cut from pyplot colormap terrain from 0->0.25) nset = 32 lumarr(1:nset) = (/0.000000, & 0.032258,0.064516,0.096774,0.129032,0.161290,0.193548,0.225806,0.258065, & 0.290323,0.322581,0.354839,0.387097,0.419355,0.451613,0.483871,0.516129, & 0.548387,0.580645,0.612903,0.645161,0.677419,0.709677,0.741935,0.774194, & 0.806452,0.838710,0.870968,0.903226,0.935484,0.967742,1.000000/) redarr(1:nset) = (/0.2, & 0.18954248,0.17908497,0.16862745,0.15816993,0.14771242,0.1372549 ,0.12679739,0.11633987, & 0.10588235,0.09542484,0.08496732,0.0745098 ,0.06405229,0.05359477,0.04313725,0.02745098, & 0.01699346,0.00653595,0. ,0. ,0. ,0. ,0. ,0. , & 0. ,0. ,0. ,0. ,0. ,0. ,0.00392157/) greenarr(1:nset) = (/0.2, & 0.22091503,0.24183007,0.2627451 ,0.28366013,0.30457516,0.3254902 ,0.34640523,0.36732026, & 0.38823529,0.40915033,0.43006536,0.45098039,0.47189542,0.49281046,0.51372549,0.54509804, & 0.56601307,0.5869281 ,0.60588235,0.62156863,0.6372549 ,0.65294118,0.66862745,0.68431373, & 0.7 ,0.71568627,0.73137255,0.74705882,0.7627451 ,0.77843137,0.80078431 /) bluearr(1:nset) = (/0.6, & 0.62091503,0.64183007,0.6627451 ,0.68366013,0.70457516,0.7254902 ,0.74640523,0.76732026, & 0.78823529,0.80915033,0.83006536,0.85098039,0.87189542,0.89281046,0.91372549,0.94509804, & 0.96601307,0.9869281 ,0.98235294,0.93529412,0.88823529,0.84117647,0.79411765,0.74705882, & 0.7 ,0.65294118,0.60588235,0.55882353,0.51176471,0.46470588,0.40078431/) case(38) !--casa blue nset = 28 lumarr(1:nset) = (/0.000,0.012,0.020,0.047,0.055,0.082,0.098,0.109,0.152,0.168,& 0.180,0.223,0.273,0.305,0.375,0.395,0.402,0.426,0.496,0.504,& 0.574,0.598,0.605,0.676,0.781,0.848,0.992,1.000/) redarr(1:nset) = (/0.996,0.957,0.918,0.816,0.796,0.706,0.655,0.620,0.518,0.471,& 0.447,0.369,0.286,0.247,0.173,0.157,0.145,0.133,0.090,0.078,& 0.039,0.031,0.027,0.016,0.004,0.000,0.000,0.000/) greenarr(1:nset)= (/0.996,0.957,0.918,0.816,0.796,0.706,0.655,0.620,0.518,0.471,& 0.447,0.369,0.286,0.247,0.173,0.157,0.145,0.133,0.090,0.078,& 0.039,0.031,0.027,0.016,0.004,0.000,0.000,0.000/) bluearr(1:nset) = (/1.000,0.988,0.976,0.941,0.937,0.910,0.886,0.878,0.835,0.816,& 0.804,0.761,0.714,0.682,0.612,0.592,0.580,0.561,0.494,0.482,& 0.416,0.400,0.384,0.318,0.231,0.165,0.008,0.000/) case(39) !--green-grey-brown nset = 3 lumarr(1:nset) = (/0.0,0.5,1.0/) redarr(1:nset) = (/0.0,0.66,0.5/) greenarr(1:nset) = (/0.83,0.66,0.33/) bluearr(1:nset) = (/0.33,0.66,0.17/) case(40) !--Red-Blue nset = 11 lumarr(1:nset) = (/0.00,0.10,0.20,0.30,0.40,0.50,0.60,0.70,0.80,0.90,1.00/) redarr(1:nset) = (/0.40,0.69,0.84,0.95,0.99,0.97,0.82,0.58,0.27,0.14,0.02/) greenarr(1:nset)= (/0.00,0.09,0.38,0.63,0.86,0.96,0.90,0.77,0.58,0.41,0.20/) bluearr(1:nset) = (/0.12,0.16,0.30,0.49,0.78,0.96,0.94,0.87,0.77,0.68,0.39/) case(41) !--PuOr nset = 11 lumarr(1:nset) = (/0.00,0.10,0.20,0.30,0.40,0.50,0.60,0.70,0.80,0.90,1.00/) redarr(1:nset) = (/0.50,0.70,0.88,0.99,1.00,0.97,0.85,0.70,0.50,0.33,0.18/) greenarr(1:nset)= (/0.23,0.34,0.51,0.72,0.88,0.97,0.85,0.67,0.45,0.16,0.00/) bluearr(1:nset) = (/0.03,0.02,0.08,0.38,0.71,0.96,0.92,0.83,0.67,0.54,0.29/) case(42) !--PRGn nset = 11 lumarr(1:nset) = (/0.00,0.10,0.20,0.30,0.40,0.50,0.60,0.70,0.80,0.90,1.00/) redarr(1:nset) = (/0.25,0.46,0.60,0.76,0.91,0.97,0.85,0.65,0.35,0.11,0.00/) greenarr(1:nset)= (/0.00,0.16,0.44,0.64,0.83,0.97,0.94,0.86,0.68,0.47,0.27/) bluearr(1:nset) = (/0.29,0.51,0.67,0.81,0.91,0.97,0.83,0.63,0.38,0.22,0.11/) end select if (debugmode) print*,'DEBUG: setting colour table' call plot_ctab(lumarr(1:nset),redarr(1:nset),greenarr(1:nset),bluearr(1:nset), & nset,contrast,brightness) endif ! !--if icolourscheme = ncolourschemes+1 set the PGPLOT colour indices ! from the contents of the rgbtable array ! if (abs(icolourscheme)==icustom) then print "(1x,a)",'using colour scheme other' ! !--for giza we have to call set_ctab directly with all 256 colours ! do i=1,ncoltable ltable(i) = (i-1)/real(ncoltable-1) enddo nset = ncoltable call plot_ctab(ltable(1:nset),rgbtable(1,1:nset),rgbtable(2,1:nset),rgbtable(3,1:nset), & nset,contrast,brightness) ! for pgplot we set the colours in the colour table individually ncolours = ncoltable-1 call plot_scir(ifirstcolour,ifirstcolour+ncolours) do i=1,ncolours index = ifirstcolour + (i-1) call plot_scr(index,rgbtable(1,i),rgbtable(2,i),rgbtable(3,i)) enddo elseif (abs(icolourscheme) <= ncolourschemes) then ! !--also store the colour table as a list of r,g,b values ! if (debugmode) print*,'DEBUG: querying colour table' do i=1,ncolours+1 index = ifirstcolour + (i-1) call plot_qcr(index,rgbtable(1,i),rgbtable(2,i),rgbtable(3,i)) enddo if (icolourscheme /= icolourscheme_prev) then ! silent if not changed if (icolourscheme < 0) then print "(1x,a)",'using colour scheme inverse '//trim(schemename(abs(icolourscheme))) else print "(1x,a)",'using colour scheme '//trim(schemename(icolourscheme)) endif endif icolourscheme_prev = icolourscheme else print "(1x,a)",'warning: unknown colour scheme - uses default greyscale' endif if (debugmode) print*,'DEBUG: finished colour_set' end subroutine colour_set end module colours danieljprice-splash-4d1f09c/src/contours.f90000066400000000000000000000037731477365367100210670ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2011 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! ! This module contributed by Andrew McLeod !----------------------------------------------------------------- module contours_module implicit none integer, parameter, private :: maxcontours = 50 integer, parameter, public :: lencontourtitles = 60 real, dimension(maxcontours), public :: contours_list character(len=lencontourtitles), dimension(maxcontours), public :: contourtitles logical, public :: fixed_contours public :: read_contours private contains ! !--reads a list of contours (one per line), to be used on contour plots ! subroutine read_contours(ncontours,ierr) use asciiutils, only:read_asciifile use filenames, only:fileprefix integer, intent(out) :: ncontours, ierr character(len=50) :: contourfile logical :: iexist contourfile = trim(fileprefix)//'.contours' ncontours = 0 ierr = 0 inquire(file=contourfile,exist=iexist) if (iexist) then call read_asciifile(contourfile,ncontours,contours_list,contourtitles) else contours_list(:) = 0. contourtitles(:) = '' ierr = 1 endif if (ncontours > 0) then print "(1x,a)",'read contours and titles from file '//trim(contourfile) else ierr = -1 endif return end subroutine read_contours end module contours_module danieljprice-splash-4d1f09c/src/convert.f90000066400000000000000000000134111477365367100206610ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2022 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! interface routine to convert all of the dump files ! on the SPLASH command line to a specified output format ! ! (c) D. Price 22/01/08 !----------------------------------------------------------------- module convert implicit none contains subroutine convert_all(outformat,igotfilenames,useall) use particle_data, only:time,gamma,dat,npartoftype,masstype,iamtype use settings_data, only:ncolumns,ncalc,required,ntypes,ndim,ndimV,lowmemorymode,& buffer_steps_in_file,maxplot use filenames, only:rootname,nstepsinfile,nfiles,limitsfile use write_sphdata, only:write_sphdump use readwrite_griddata, only:isgridformat use analysis, only:isanalysis,open_analysis,write_analysis,close_analysis use convert_grid, only:convert_to_grid use getdata, only:get_data use asciiutils, only:ucase use limits, only:read_limits use system_utils, only:ienvlist use labels, only:get_sink_type character(len=*), intent(in) :: outformat logical, intent(inout) :: igotfilenames logical, intent(in) :: useall logical :: doanalysis,converttogrid integer :: ifile,idump,ntotal,ierr,iloc,isinktype,nsinks integer, dimension(maxplot) :: listofcolumns character(len=len(rootname)+4) :: filename character(len=10) :: string required = .true. ! read whole dump file by default doanalysis = isanalysis(outformat,noprint=.true.) converttogrid = isgridformat(outformat) lowmemorymode = .false. ! must not be true for first file listofcolumns = 0 if (.not.(doanalysis .or. converttogrid)) then ! !--for format conversion each dump file is independent ! print "(/,5('-'),a,/)",'> CONVERTING SNAPSHOTS TO '//trim(ucase(outformat))//' FORMAT ' listofcolumns = ienvlist('SPLASH_CONVERT',ncolumns) if (all(listofcolumns==0)) then print "(a,/)",' > to output select columns, --convert=1,4 (for columns 1 & 4)' else print "(a,32(1x,i2),/)",' > WRITING ONLY COLUMNS ',listofcolumns(1:count(listofcolumns > 0)) endif endif ! !--if nfiles = 0 (ie. no files read from command line), then call get_data here ! to also get nfiles correctly prior to the loop ! if (nfiles==0) then call get_data(1,igotfilenames) igotfilenames = .true. endif do ifile=1,nfiles !--read data from dump file + calculate extra columns if (ifile==1) then call get_data(ifile,igotfilenames,firsttime=.true.) ! ! read plot limits from file (overrides get_data limits settings) ! call read_limits(trim(limitsfile),ierr) ! !--for analysis we need to initialise the output file ! and close it at the end - do this here so we know ! the first filename and ndimV, labels etc. ! if (doanalysis) then nsinks = 0 if (nstepsinfile(ifile) > 0) then isinktype = get_sink_type(ntypes) if (isinktype > 0) nsinks = npartoftype(isinktype,1) endif call open_analysis(outformat,required,ncolumns+ncalc,ndim,ndimV,nsinks) endif else call get_data(ifile,.true.) endif !--dump each step in file to an output file do idump = 1,nstepsinfile(ifile) if (nstepsinfile(ifile) > 1 .and. .not.buffer_steps_in_file) then call get_data(ifile,igotfilenames,.false.,iposinfile=idump) iloc = 1 else iloc = idump endif if (nstepsinfile(ifile) > 1) then write(filename,"(a,'_',i5.5)") trim(rootname(ifile)),idump else filename = trim(rootname(ifile)) endif ntotal = sum(npartoftype(1:ntypes,iloc)) if (doanalysis) then call write_analysis(time(iloc),dat(1:ntotal,:,iloc),ntotal,ntypes, & npartoftype(1:ntypes,iloc),masstype(1:ntypes,iloc),iamtype(:,iloc), & ncolumns+ncalc,ndim,ndimV,outformat) elseif (converttogrid) then call convert_to_grid(time(iloc),dat(:,:,iloc),ntypes,& npartoftype(1:ntypes,iloc),masstype(1:ntypes,iloc),iamtype(:,iloc), & ncolumns+ncalc,filename,outformat,useall) else call write_sphdump(time(iloc),gamma(iloc),dat(1:ntotal,1:ncolumns+ncalc,iloc),ntotal,ntypes, & npartoftype(1:ntypes,iloc),masstype(1:ntypes,iloc),iamtype(:,iloc), & ncolumns+ncalc,filename,outformat,listofcolumns(1:ncolumns+ncalc)) endif enddo enddo !--for analysis we need to start and end differently if (doanalysis) then call close_analysis(outformat) write(string,"(i10)") nfiles print "(/,5('-'),a,i5,a,/)",'> FINISHED CALCULATING '//trim(ucase(outformat))//' (USED '//trim(adjustl(string))//' DUMP FILES)' else print "(/,5('-'),a,/)",'> FINISHED CONVERTING DUMP FILES ' endif return end subroutine convert_all end module convert danieljprice-splash-4d1f09c/src/convert_grid.f90000066400000000000000000001150041477365367100216670ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! Module containing routines for converting 3D SPH dump ! files to 3D gridded data. !----------------------------------------------------------------- module convert_grid use params, only:doub_prec implicit none private public :: convert_to_grid contains !----------------------------------------------------------------- ! interpolate 3D SPH data to grid and interface to grid ! data output routines !----------------------------------------------------------------- subroutine convert_to_grid(time,dat,ntypes,npartoftype,masstype,itype,ncolumns,filename,& outformat,interpolateall,icols,rhogrid,dat3D) use labels, only:label,labelvec,irho,ih,ipmass,ix,ivx,iBfirst,get_sink_type use limits, only:lim,get_particle_subset use settings_units, only:units,unit_interp use settings_data, only:ndim,ndimV,UseTypeInRenderings,iRescale,required,debugmode,icoordsnew,xorigin,iverbose use settings_part, only:iplotpartoftype use settings_render, only:npix,inormalise=>inormalise_interpolations,& idensityweightedinterpolation,exact_rendering use settings_xsecrot, only:anglex,angley,anglez use rotation, only:rotate3D use params, only:int1 use interpolation, only:set_interpolation_weights,get_n_interp use interpolations3D, only:interpolate3D,interpolate3D_vec use interpolations3Dgeom, only:interpolate3Dgeom,interpolate3Dgeom_vec use interpolations2D, only:interpolate2D,interpolate2D_vec use system_utils, only:renvironment,ienvlist use readwrite_griddata, only:open_gridfile_w,write_grid,write_gridlimits use particle_data, only:icolourme use params, only:int8 use geometry, only:coord_is_length,igeom_cartesian,labelcoord,labelcoordsys use asciiutils, only:strip use timing, only:wall_time,print_time use filenames, only:tagline integer, intent(in) :: ntypes,ncolumns integer, intent(in), dimension(:) :: npartoftype integer(kind=int1), intent(in), dimension(:) :: itype real, intent(in) :: time real, intent(inout), dimension(:,:) :: dat real, intent(in), dimension(:) :: masstype character(len=*), intent(in) :: filename,outformat logical, intent(in) :: interpolateall integer, intent(in), optional :: icols(:) real, intent(out), allocatable, optional :: rhogrid(:,:,:),dat3D(:,:,:) integer, parameter :: iunit = 89 integer :: ierr,i,k,ncolsgrid,ivec,nvec,iloc,j,nzero integer :: npixx,ninterp,isinktype character(len=40) :: fmtstring character(len=64) :: fmtstring1 real(doub_prec), dimension(:,:,:), allocatable :: datgrid,rhogrid_tmp real, dimension(:,:), allocatable :: datgrid2D real(doub_prec), dimension(:,:,:,:), allocatable :: datgridvec real, dimension(:,:,:), allocatable :: datgridvec2D real, dimension(:), allocatable :: weight,x,y,z logical, dimension(:), allocatable :: mask real, dimension(3) :: xmin,xmax real, dimension(3) :: partmin,partmax,partmean,part_integral real, dimension(3) :: datmin,datmax,datmean real(doub_prec) :: dtime real(doub_prec), dimension(3) :: xmind,xmaxd integer, dimension(3) :: npixels integer(kind=int8), dimension(3) :: npixels8 integer, dimension(12) :: icoltogrid integer :: ncolstogrid,igeom real :: hmin,pixwidth,pixwidthx(3),rhominset,rhomin real :: gridmin,gridmax,gridmean,grid_integral real :: mtot,mtotgrid,err,t2,t1,xi(3),ax,ay,az real, parameter :: pi=4.0*atan(1.0) logical :: lowmem,do_output logical, dimension(3) :: isperiodic character(len=len(labelcoord)), dimension(3) :: xlab character(len=120) :: origin dtime = real(time,kind=doub_prec) do_output = .not.(trim(filename)=='none' .or. trim(outformat)=='none') ! !--check for errors in input settings ! if (ndim < 2 .or. ndim > 3) then print "(/,a,i2,a,/)",' ERROR: SPH data has ',ndim,' spatial dimensions: cannot convert to 3D grid' return endif print "(/,'----->',1x,a,i1,a,/)",'CONVERTING SPH DATA -> ',ndim,'D GRID' xmin(1:ndim) = lim(ix(1:ndim),1) xmax(1:ndim) = lim(ix(1:ndim),2) xlab(:) = (/'x','y','z'/) igeom = max(icoordsnew,1) ! ensure it is not zero if (igeom /= igeom_cartesian) xlab = strip(labelcoord(:,igeom),'\') ! !--print limits information ! call write_gridlimits(ndim,xmin,xmax,label(ix(1:ndim))) ! !--get environment variable options ! if (present(icols)) then icoltogrid(:) = 0 icoltogrid(1:size(icols)) = icols(:) ncolstogrid = count(icols > 0) else call get_splash2grid_options(ndim,ncolstogrid,icoltogrid,isperiodic,xlab) endif ! !--check for errors ! ierr = 0 do i=1,ndim if ((xmax(i)-xmin(i)) < tiny(0.)) then print "(a)",' ERROR: min = max in '//trim(label(ix(i)))//& ' coordinate: cannot interpolate to zero-sized grid!' ierr = 1 endif enddo if (irho <= 0 .or. irho > ncolumns) then print "(a)",' ERROR: density not found in data read.' ierr = 2 endif if (ih <= 0 .or. ih > ncolumns) then print "(a)",' ERROR: smoothing length not found in data read.' ierr = 3 endif if (ipmass <= 0 .or. ipmass > ncolumns) then if (all(masstype(:) < tiny(0.))) then print "(a)",' ERROR: particle masses not read as column, and mass per type not set.' ierr = 4 endif endif if (ierr /= 0) then print "(a,i1,a)",' cannot perform SPH interpolation to ',ndim,'D grid, skipping file...' return endif ierr = 0 ! !--set number of particles to use in the interpolation routines ! and allocate memory for weights ! ninterp = get_n_interp(ntypes,npartoftype,UseTypeInRenderings,iplotpartoftype,size(itype),.false.) allocate(weight(ninterp),stat=ierr) allocate(x(ninterp),y(ninterp),z(ninterp),mask(ninterp),stat=ierr) if (ierr /= 0) then print*,' ERROR allocating memory for interpolation weights, aborting...' return endif ! !--set interpolation weights (w = m/(rho*h^ndim) ! isinktype = get_sink_type(ntypes) call set_interpolation_weights(weight,dat,itype,(iplotpartoftype .and. UseTypeInRenderings),& ninterp,npartoftype,masstype,ntypes,ncolumns,irho,ipmass,ih,ndim,iRescale,& idensityweightedinterpolation,inormalise,units,unit_interp,required,.false.,isinktype) ! !--set default mask and apply range restrictions to data ! icolourme(:) = 1 call get_particle_subset(icolourme,dat,ncolumns) mask = (icolourme > 0 .and. weight > 0.) ! !--work out how many pixels to use ! npixx = npix npixels = ienvlist('SPLASH_TO_GRID_NPIX',3) if (product(npixels) > 0) then print "(a,2(i5,','),i5)",' Using --npix=',npixels else if (npixx <= 0) then print "(/,a)",' WARNING: number of pixels = 0, using automatic pixel numbers' hmin = 0. call minmaxmean_part(dat(:,ih:ih),mask,ninterp,partmin,partmax,partmean,nonzero=.true.) hmin = partmin(1) if (hmin > 0. .and. igeom==igeom_cartesian) then print*,'based on the minimum smoothing length of hmin = ',hmin npixels8(1:ndim) = int((xmax(1:ndim) - xmin(1:ndim))/hmin,kind=int8) + 1 if (ndim==3) then print "(a,i6,2(' x',i6),a)",' requires ',npixels8(1:ndim),' pixels to capture the full resolution' if (product(npixels8(1:ndim)) > 512**3 .or. product(npixels8(1:ndim)) <= 0) then npixx = 512 print "(a,i4)",' but this is ridiculous, so instead we choose ',npixx else npixx = int(npixels8(1)) endif else print "(a,i6,1(' x',i6),a)",' requires ',npixels8(1:ndim),' pixels to capture the full resolution' if (product(npixels8(1:ndim)) > 1024**ndim .or. product(npixels8(1:ndim)) <= 0) then npixx = 1024 print "(a,i4)",' but this is very large, so instead we choose ',npixx else npixx = int(npixels8(1)) endif endif else npixx = 512 if (hmin <= 0.) then print "(a)",' ...but cannot get auto pixel number because hmin = 0' else print "(a)",' ...but cannot get auto pixel number because of non-cartesian geometry' endif print "(a)",' so instead we choose npixels = ',npixx endif endif print "(a,/)",' Set this manually using --npix=100,100,100' pixwidth = (xmax(1)-xmin(1))/npixx do i=1,ndim if (coord_is_length(i,igeom)) then npixels(i) = int((xmax(i)-xmin(i) - 0.5*pixwidth)/pixwidth) + 1 else npixels(i) = npixx endif enddo endif pixwidthx(:) = (xmax(:) - xmin(:))/npixels(:) ! !--work out how many columns will be written to file ! nvec = 0 if (ncolstogrid > 0) then ncolsgrid = ncolstogrid elseif (interpolateall) then ncolsgrid = 0 do i=1,ncolumns if (.not.any(ix(1:ndim)==i) .and. i /= ih .and. i /= ipmass) then ncolsgrid = ncolsgrid + 1 endif enddo else if (ndimV==ndim) then if (ivx > 0 .and. ivx+ndimV-1 <= ncolumns) nvec = nvec + 1 if (iBfirst > 0 .and. iBfirst+ndimV-1 <= ncolumns) nvec = nvec + 1 endif ncolsgrid = 1 + ndimV*nvec endif ! !--use low memory mode for large grids ! if (trim(outformat)=='gridascii2') then lowmem = .false. else lowmem = .true. endif if (lowmem .and. nvec > 0) & print "(a,/)",' [doing velocity field components separately (low memory mode)]' ! !--allocate memory for the grid ! if (allocated(datgrid)) deallocate(datgrid) if (allocated(datgrid2D)) deallocate(datgrid2D) if (ndim==3) then write(*,"(a,i5,2(' x',i5),a)",advance='no') ' >>> allocating memory for ',npixels(1:ndim),' grid ...' allocate(datgrid(npixels(1),npixels(2),npixels(3)),stat=ierr) elseif (ndim==2) then write(*,"(a,i5,1(' x',i5),a)",advance='no') ' >>> allocating memory for ',npixels(1:ndim),' grid ...' allocate(datgrid2D(npixels(1),npixels(2)),stat=ierr) endif if (ierr /= 0) then write(*,*) 'FAILED: NOT ENOUGH MEMORY' call deallocate_memory() return else write(*,*) 'OK' endif ! !--open grid file for output (also checks format is OK) ! if (do_output) then origin='"splash to '//trim(outformat)//'" on file '//trim(filename) xmind = xmin; xmaxd = xmax ! convert to double precision call open_gridfile_w(iunit,filename,outformat,ndim,ncolsgrid,npixels(1:ndim),& xmind(1:ndim),xmaxd(1:ndim),dtime,ierr) if (ierr /= 0) then print "(a)",' ERROR: could not open grid file for output, skipping...' call deallocate_memory() return endif endif fmtstring1 = "(12x,a20,1x,' min ',1x,' max ',1x,' mean ')" fmtstring = "(22x,a10,1x,3(es10.2,1x))" ! !--interpolate density to the 3D grid ! print "(/,a,i1,a)",' interpolating density to ',ndim,'D grid...' if (debugmode) print*,'DEBUG: density in column ',irho,' vals = ',dat(1:10,irho) call minmaxmean_part(dat(1:ninterp,irho:irho),mask,ninterp,partmin,partmax,partmean) print fmtstring1,trim(label(irho)) print fmtstring,' on parts:',partmin(1),partmax(1),partmean(1) if (ipmass > 0.) then mtot = sum(dat(1:ninterp,ipmass),mask=(icolourme(1:ninterp) > 0 .and. weight(1:ninterp) > 0.)) print "(9x,a23,1x,es10.4)",'total mass on parts:',mtot endif if (ndim==3) then call wall_time(t1) if (igeom /= igeom_cartesian) then call interpolate3Dgeom(igeom,dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,irho),icolourme,ninterp,& xmin,datgrid,npixels,pixwidthx,xorigin,inormalise,isperiodic) else x = dat(1:ninterp,ix(1)) y = dat(1:ninterp,ix(2)) z = dat(1:ninterp,ix(3)) if (abs(anglez)>0. .or. abs(angley)>0. .or. abs(anglex)>0.) then print*, 'Rotating particles around (z,y,x) by',anglez,angley,anglex print*, 'WARNING: This does not rotate vector components' ax = anglex*pi/180.0 ! convert degrees to radians to pass into rotate ay = angley*pi/180.0 az = anglez*pi/180.0 do i=1,ninterp xi = (/x(i),y(i),z(i)/) call rotate3D(xi,ax,ay,az,0.,0.) x(i) = xi(1) y(i) = xi(2) z(i) = xi(3) enddo endif mask = (mask .and. (x >= xmin(1) .and. x <= xmax(1)) .and. & (y >= xmin(2) .and. y <= xmax(2)) .and. & (z >= xmin(3) .and. z <= xmax(3))) if (ipmass > 0.) then mtot = sum(dat(1:ninterp,ipmass),mask=mask) print "(9x,a23,1x,es10.4,/)",'mass on parts in box:',mtot endif call interpolate3D(x,y,z,& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,irho),icolourme,ninterp,& xmin(1),xmin(2),xmin(3),datgrid,npixels(1),npixels(2),npixels(3),& pixwidthx(1),pixwidthx(2),pixwidthx(3),inormalise,& isperiodic(1),isperiodic(2),isperiodic(3)) mtotgrid = sum(datgrid)*product(pixwidthx) endif if (present(rhogrid)) rhogrid = datgrid rhogrid_tmp = datgrid call wall_time(t2) if (t2 - t1 > 1.) call print_time(t2-t1) ! !--set minimum density on the grid ! call minmaxmean_grid(datgrid,npixels,gridmin,gridmax,gridmean,nonzero=.true.) else call interpolate2D(dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,irho),icolourme,ninterp,& xmin(1),xmin(2),datgrid2D,npixels(1),npixels(2),& pixwidth,pixwidth,inormalise,exact_rendering,isperiodic(1),isperiodic(2),iverbose) ! !--set minimum density on the grid ! call minmaxmean_grid2D(datgrid2D,npixels,gridmin,gridmax,gridmean,nonzero=.true.) mtot = sum(datgrid2D)*pixwidth**2*npixels(1)*npixels(2) endif print fmtstring1,trim(label(irho)) print fmtstring,' on grid :',gridmin,gridmax,gridmean ! !--print error if mass is not conserved ! if (mtotgrid > 0.) then print "(9x,a23,1x,es10.4,/)",'total mass on grid:',mtotgrid err = 100.*(mtotgrid - mtot)/mtot if (abs(err) > 1) print "(/,a,1pg8.1,a,/)",' WARNING! MASS NOT CONSERVED BY ',err,& '% BY INTERPOLATION' endif rhomin = gridmin rhominset = renvironment('SPLASH_TO_GRID_RHOMIN',errval=-1.) print* if (rhominset >= 0.) then rhomin = rhominset print*,'enforcing minimum density on grid = ',rhomin print*,'(based on --rhomin setting)' elseif (rhomin > 0.) then print*,'enforcing minimum density on grid = ',rhomin print "(a)",' ** set --rhomin=minval to manually set this (e.g. to zero) **' endif if (rhomin > 0.) then nzero = 0 if (ndim==3) then !$omp parallel do private(k,j,i) reduction(+:nzero) schedule(static) do k=1,npixels(3) do j=1,npixels(2) do i=1,npixels(1) if (datgrid(i,j,k) <= tiny(datgrid)) then datgrid(i,j,k) = rhomin nzero = nzero + 1 endif enddo enddo enddo else !$omp parallel do private(j,i) reduction(+:nzero) schedule(static) do j=1,npixels(2) do i=1,npixels(1) if (datgrid2D(i,j) <= tiny(datgrid2D)) then datgrid2D(i,j) = rhomin nzero = nzero + 1 endif enddo enddo endif print "(a,i0,a)",' minimum density enforced on ',nzero,' grid cells' else print*,'minimum density NOT enforced' endif ! !--write density to grid data file ! print* if (ndim==3 .and. do_output) then if (lowmem .or. interpolateall .or. ncolstogrid > 0) then call write_grid(iunit,filename,outformat,ndim,1,npixels,trim(label(irho)),& labelcoordsys(igeom),xlab,dtime,pixwidthx,xmin,xmax,ierr,dat=datgrid,& tagline=tagline,origin=origin) endif elseif (do_output) then call write_grid(iunit,filename,outformat,ndim,1,npixels,trim(label(irho)),& labelcoordsys(igeom),xlab,dtime,pixwidthx,xmin,xmax,ierr,dat2D=datgrid2D,& tagline=tagline,origin=origin) endif ! !--use density weighted interpolation for remaining quantities ! idensityweightedinterpolation = .true. call set_interpolation_weights(weight,dat,itype,(iplotpartoftype .and. UseTypeInRenderings),& ninterp,npartoftype,masstype,ntypes,ncolumns,irho,ipmass,ih,ndim,iRescale,& idensityweightedinterpolation,inormalise,units,unit_interp,required,.false.,isinktype) ! !--interpolate remaining quantities to the 3D grid ! if (interpolateall .or. ncolstogrid > 0) then if (ncolstogrid > 0 .and. .not.present(icols)) then print "(/,a,i2,a)",' Interpolating ',ncolstogrid,' columns to grid from --grid setting:' print "(' got --grid=',10(i2,1x))",icoltogrid(1:ncolstogrid) endif do i=1,ncolumns if ((ncolstogrid > 0 .and. any(icoltogrid==i) .and. i /= irho) .or. & (interpolateall .and. & .not.any(ix(:)==i) .and. i /= ih .and. i /= ipmass .and. i /= irho)) then print "(/,a)",' interpolating '//trim(label(i)) print fmtstring1,trim(label(i)) call minmaxmean_part(dat(1:ninterp,i:i),mask,ninterp,partmin,partmax,partmean) print fmtstring,' on parts:',partmin(1),partmax(1),partmean(1) if (iszero(partmin,partmax,1)) then datgrid = 0. else if (ndim==3) then if (igeom /= igeom_cartesian) then call interpolate3Dgeom(igeom,dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,i),icolourme,ninterp,& xmin,datgrid,npixels,pixwidthx,xorigin,.true.,isperiodic) else call interpolate3D(x,y,z,& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,i),icolourme,ninterp,& xmin(1),xmin(2),xmin(3),datgrid,npixels(1),npixels(2),npixels(3),& pixwidthx(1),pixwidthx(2),pixwidthx(3),.true.,isperiodic(1),isperiodic(2),isperiodic(3)) endif if (present(dat3D)) dat3D = datgrid else call interpolate2D(dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,i),icolourme,ninterp,& xmin(1),xmin(2),datgrid2D,npixels(1),npixels(2),& pixwidth,pixwidth,.true.,exact_rendering,isperiodic(1),isperiodic(2),iverbose) endif endif ! !--write gridded data to file ! if (ndim==3) then call minmaxmean_grid(datgrid,npixels,gridmin,gridmax,gridmean,.false.) print fmtstring,' on grid :',gridmin,gridmax,gridmean if (do_output) call write_grid(iunit,filename,outformat,ndim,1,npixels,trim(label(i)),& labelcoordsys(igeom),xlab,dtime,pixwidthx,xmin,xmax,ierr,dat=datgrid) else call minmaxmean_grid2D(datgrid2D,npixels,gridmin,gridmax,gridmean,.false.) print fmtstring,' on grid :',gridmin,gridmax,gridmean if (do_output) call write_grid(iunit,filename,outformat,ndim,1,npixels,trim(label(i)),& labelcoordsys(igeom),xlab,dtime,pixwidthx,xmin,xmax,ierr,dat2D=datgrid2D) endif endif enddo else if (nvec > 0) then print "(/,a,i2,a)",' set --grid=',irho,' to interpolate density ONLY and skip remaining columns' print "(a,i2,a)", ' --grid=6,8,10 to select particular columns' if (.not.lowmem) then if (ndim==3) then write(*,"(/,a,i5,2(' x',i5),a)",advance='no') ' >>> allocating memory for ',npixels(1:ndim),' x 3 grid ...' allocate(datgridvec(3,npixels(1),npixels(2),npixels(3)),stat=ierr) else write(*,"(/,a,i5,1(' x',i5),a)",advance='no') ' >>> allocating memory for ',npixels(1:ndim),' x 3 grid ...' allocate(datgridvec2D(2,npixels(1),npixels(2)),stat=ierr) endif if (ierr /= 0) then write(*,*) 'FAILED: NOT ENOUGH MEMORY' return else write(*,*) 'OK' endif endif ! !--interpolate velocity field and magnetic fields and write to file ! over_vec: do ivec=1,nvec select case(ivec) case(1) iloc = ivx print "(a,i1,a)",' interpolating velocity field to ',ndim,'D grid...' case(2) iloc = iBfirst print "(a,i1,a)",' interpolating magnetic field to ',ndim,'D grid...' case default iloc = 0 exit over_vec end select if (iloc <= 0 .or. iloc >= ncolumns) cycle over_vec if (lowmem) then do i=iloc,iloc+ndimV-1 print "(/,a)",' interpolating '//trim(label(i)) print fmtstring1,trim(label(i)) if (ipmass > 0) then call minmaxmean_part(dat(1:ninterp,i:i),mask,ninterp,partmin,partmax,& partmean,mass=dat(1:ninterp,ipmass),part_integral=part_integral) print fmtstring,' on parts:',partmin(1),partmax(1),partmean(1) print "(9x,a23,1x,es10.2,/)",' sum(m*'//trim(label(i))//'):',part_integral(1) else call minmaxmean_part(dat(1:ninterp,i:i),mask,ninterp,partmin,partmax,partmean) print fmtstring,' on parts:',partmin(1),partmax(1),partmean(1) endif if (iszero(partmin,partmax,1)) then datgrid = 0. else if (ndim==3) then if (igeom /= igeom_cartesian) then call interpolate3Dgeom(igeom,dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,i),icolourme,ninterp,& xmin,datgrid,npixels,pixwidthx,xorigin,.true.,isperiodic) else call interpolate3D(x,y,z,& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,i),icolourme,ninterp,& xmin(1),xmin(2),xmin(3),datgrid,npixels(1),npixels(2),npixels(3),& pixwidthx(1),pixwidthx(2),pixwidthx(3),.true.,isperiodic(1),isperiodic(2),isperiodic(3)) endif else call interpolate2D(dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,i),icolourme,ninterp,& xmin(1),xmin(2),datgrid2D,npixels(1),npixels(2),& pixwidth,pixwidth,.true.,exact_rendering,isperiodic(1),isperiodic(2),iverbose) endif endif ! !--write gridded data to file ! if (ndim==3) then call minmaxmean_grid(datgrid,npixels,gridmin,gridmax,gridmean,.false.,& rho=rhogrid_tmp,grid_integral=grid_integral) print fmtstring,' on grid :',gridmin,gridmax,gridmean grid_integral = grid_integral*product(pixwidthx) print "(9x,a23,1x,es10.2,/)",' int(rho*'//trim(label(i))//')dV:',grid_integral call write_grid(iunit,filename,outformat,ndim,1,npixels,trim(label(i)),& labelcoordsys(igeom),xlab,dtime,pixwidthx,xmin,xmax,ierr,& dat=datgrid,tagline=tagline,origin=origin) else call minmaxmean_grid2D(datgrid2D,npixels,gridmin,gridmax,gridmean,.false.) print fmtstring,' on grid :',gridmin,gridmax,gridmean call write_grid(iunit,filename,outformat,ndim,1,npixels,trim(label(i)),& labelcoordsys(igeom),xlab,dtime,pixwidthx,xmin,xmax,ierr,& dat2D=datgrid2D,tagline=tagline,origin=origin) endif enddo else print fmtstring1,trim(labelvec(iloc)) call minmaxmean_part(dat(1:ninterp,iloc:iloc+ndimV-1),mask,ninterp,partmin,partmax,partmean) do i=1,ndimV print fmtstring,' on parts:',partmin(i),partmax(i),partmean(i) enddo if (iszero(partmin,partmax,ndimV)) then datgridvec = 0. else if (ndim==3) then if (igeom /= igeom_cartesian) then call interpolate3Dgeom_vec(igeom,dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,iloc:iloc+ndimV-1),icolourme,ninterp,& xmin,datgridvec,npixels,pixwidthx,xorigin,.true.,isperiodic) else call interpolate3D_vec(x,y,z,& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,iloc:iloc+ndimV-1),icolourme,ninterp,& xmin(1),xmin(2),xmin(3),datgridvec,npixels(1),npixels(2),npixels(3),& pixwidthx(1),pixwidthx(2),pixwidthx(3),.true.,isperiodic(1),isperiodic(2),isperiodic(3)) endif else call interpolate2D_vec(dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),& dat(1:ninterp,ih),weight(1:ninterp),dat(1:ninterp,iloc),dat(1:ninterp,iloc+1), & icolourme,ninterp,xmin(1),xmin(2),datgridvec2D(1,:,:),datgridvec2D(2,:,:), & npixels(1),npixels(2),pixwidth,pixwidth,.true.,exact_rendering,isperiodic(1),isperiodic(2)) endif endif if (ndim==3) then call minmaxmean_gridvec(datgridvec,npixels,ndimV,datmin,datmax,datmean) else call minmaxmean_gridvec2D(datgridvec2D,npixels,ndimV,datmin,datmax,datmean) endif do i=1,ndimV print fmtstring,' on grid :',datmin(i),datmax(i),datmean(i) enddo ! !--write result to grid file ! if (ndim==3 .and. do_output) then call write_grid(iunit,filename,outformat,ndim,ndimV,npixels,& label(irho),labelcoordsys(igeom),xlab,dtime,pixwidthx,xmin,xmax,ierr,& dat=datgrid,dat3D=datgridvec,label3D=label(iloc:iloc+ndimV),tagline=tagline,origin=origin) elseif (do_output) then do i=1,ndimV call write_grid(iunit,filename,outformat,ndim,ndimV,npixels,& label(iloc+i-1),labelcoordsys(igeom),xlab,dtime,pixwidthx,& xmin,xmax,ierr,dat2D=datgridvec2D(i,:,:),tagline=tagline,origin=origin) enddo endif endif print* enddo over_vec endif ! else ! print "(/,a)",' skipping remaining quantities (from SPLASH_TO_GRID_DENSITY_ONLY setting)' endif close(iunit) call deallocate_memory() return contains !------------------------------------------------------------ ! manual mop-up of allocatable memory !------------------------------------------------------------ subroutine deallocate_memory() if (allocated(datgrid)) deallocate(datgrid) if (allocated(datgrid2D)) deallocate(datgrid2D) if (allocated(datgridvec)) deallocate(datgridvec) if (allocated(datgridvec2D)) deallocate(datgridvec2D) if (allocated(weight)) deallocate(weight) if (allocated(x)) deallocate(x) if (allocated(y)) deallocate(y) if (allocated(z)) deallocate(z) end subroutine deallocate_memory end subroutine convert_to_grid !------------------------------------------------------------ ! get options for splash to grid from environment variables !------------------------------------------------------------ subroutine get_splash2grid_options(ndim,ncolstogrid,icoltogrid,isperiodic,xlab) use system_utils, only:lenvironment,renvironment,envlist,lenvstring,ienvstring use labels, only:irho integer, intent(in) :: ndim integer, intent(out) :: ncolstogrid,icoltogrid(:) logical, intent(out) :: isperiodic(3) character(len=1), intent(in) :: xlab(3) integer :: nstring,i,icol character(len=30), dimension(12) :: strings ! !--SPLASH_TO_GRID can be set to comma separated list of columns ! in order to select particular quantities for interpolation to grid ! ncolstogrid = 0 icoltogrid(:) = 0 call envlist('SPLASH_TO_GRID',nstring,strings) if (nstring > 0) then do i=1,nstring icol = ienvstring(strings(i)) if (ienvstring(strings(i)) > 0) then ncolstogrid = ncolstogrid + 1 icoltogrid(ncolstogrid) = icol endif enddo endif ! !--for backwards compatibility, support the SPLASH_TO_GRID_DENSITY_ONLY option ! but only if SPLASH_TO_GRID is not set ! if (ncolstogrid==0 .and. lenvironment('SPLASH_TO_GRID_DENSITY_ONLY')) then ncolstogrid = 1 icoltogrid(1) = irho endif ! !--whether or not to wrap particle contributions across boundaries ! isperiodic(:) = .false. call envlist('SPLASH_TO_GRID_PERIODIC',nstring,strings) if (nstring > ndim) then print "(a)",' ERROR in --periodic setting' nstring = ndim endif do i=1,nstring isperiodic(i) = lenvstring(strings(i)) enddo if (nstring==1) isperiodic(2:ndim) = isperiodic(1) if (all(isperiodic(1:ndim))) then print "(/,a)",' using PERIODIC boundaries (from --periodic setting)' elseif (isperiodic(1) .or. isperiodic(2) .or. isperiodic(3)) then print* do i=1,ndim if (isperiodic(i)) then print "(a)",' using PERIODIC boundaries in '//xlab(i)//' (from --periodic flag)' else print "(a)",' using NON-PERIODIC bounds in '//xlab(i)//' (from --periodic flag)' endif enddo else print "(/,a)",' using NON-PERIODIC boundaries: use --periodic=yes for periodic' if (ndim==3) then print "(a,/)",' or --periodic=yes,no,yes for mixed' else print "(a,/)",' or --periodic=yes,no for mixed' endif endif end subroutine !----------------------------------------------- ! calculate max and min and mean values on grid !----------------------------------------------- subroutine minmaxmean_grid(datgrid,npixels,gridmin,gridmax,gridmean,nonzero,rho,grid_integral) real(doub_prec), dimension(:,:,:), intent(in) :: datgrid integer, dimension(3), intent(in) :: npixels real, intent(out) :: gridmin,gridmax,gridmean logical, intent(in) :: nonzero real(doub_prec), dimension(:,:,:), intent(in), optional :: rho real, intent(out), optional :: grid_integral real :: dati,gridint integer :: i,j,k gridmax = -huge(gridmax) gridmin = huge(gridmin) gridmean = 0. gridint = 0. !$omp parallel do schedule(static) default(shared) & !$omp reduction(min:gridmin) & !$omp reduction(max:gridmax) reduction(+:gridmean,gridint) & !$omp private(k,j,i,dati) do k=1,npixels(3) do j=1,npixels(2) do i=1,npixels(1) dati = datgrid(i,j,k) gridmax = max(gridmax,dati) if (nonzero) then if (dati > tiny(0.)) gridmin = min(gridmin,dati) else gridmin = min(gridmin,dati) endif gridmean = gridmean + dati if (present(grid_integral) .and. present(rho)) then gridint = gridint + dati*rho(i,j,k) endif enddo enddo enddo if (gridmin >= huge(gridmin)) gridmin = 0. gridmean = gridmean/product(npixels(1:3)) if (present(grid_integral)) grid_integral = gridint end subroutine minmaxmean_grid !---------------------------------------------------- ! calculate max and min and mean values on grid (2D) !---------------------------------------------------- subroutine minmaxmean_grid2D(datgrid,npixels,gridmin,gridmax,gridmean,nonzero) real, dimension(:,:), intent(in) :: datgrid integer, dimension(2), intent(in) :: npixels real, intent(out) :: gridmin,gridmax,gridmean logical, intent(in) :: nonzero real :: dati integer :: i,j gridmax = -huge(gridmax) gridmin = huge(gridmin) gridmean = 0. !$omp parallel do schedule(static) & !$omp reduction(min:gridmin) & !$omp reduction(max:gridmax) reduction(+:gridmean) & !$omp private(j,i,dati) do j=1,npixels(2) do i=1,npixels(1) dati = datgrid(i,j) gridmax = max(gridmax,dati) if (nonzero) then if (dati > tiny(0.)) gridmin = min(gridmin,dati) else gridmin = min(gridmin,dati) endif gridmean = gridmean + dati enddo enddo if (gridmin >= huge(gridmin)) gridmin = 0. gridmean = gridmean/product(npixels(1:2)) end subroutine minmaxmean_grid2D !----------------------------------------------- ! calculate max and min and mean values on grid ! (for vector quantities) !----------------------------------------------- subroutine minmaxmean_gridvec(datgridvec,npixels,jlen,gridmin,gridmax,gridmean) real(doub_prec), dimension(:,:,:,:), intent(in) :: datgridvec integer, dimension(3), intent(in) :: npixels integer, intent(in) :: jlen real, dimension(jlen), intent(out) :: gridmin,gridmax,gridmean real :: dati integer :: ivec,i,j,k gridmax(:) = -huge(gridmax) gridmin(:) = huge(gridmin) gridmean(:) = 0. !$omp parallel do schedule(static) & !$omp reduction(min:gridmin) & !$omp reduction(max:gridmax) reduction(+:gridmean) & !$omp private(k,j,i,dati) do k=1,npixels(3) do j=1,npixels(2) do i=1,npixels(1) do ivec=1,jlen dati = datgridvec(ivec,i,j,k) gridmax(ivec) = max(gridmax(ivec),dati) gridmin(ivec) = min(gridmin(ivec),dati) gridmean(ivec) = gridmean(ivec) + dati enddo enddo enddo enddo !$omp end parallel do where (gridmin >= huge(gridmin)) gridmin = 0. gridmean(1:jlen) = gridmean(1:jlen)/real(product(npixels(1:3))) end subroutine minmaxmean_gridvec !----------------------------------------------- ! calculate max and min and mean values on grid ! (for vector quantities) !----------------------------------------------- subroutine minmaxmean_gridvec2D(datgridvec,npixels,jlen,gridmin,gridmax,gridmean) real, dimension(:,:,:), intent(in) :: datgridvec integer, dimension(2), intent(in) :: npixels integer, intent(in) :: jlen real, dimension(jlen), intent(out) :: gridmin,gridmax,gridmean real :: dati integer :: ivec,i,j gridmax(:) = -huge(gridmax) gridmin(:) = huge(gridmin) gridmean(:) = 0. !$omp parallel do schedule(static) & !$omp reduction(min:gridmin) & !$omp reduction(max:gridmax) reduction(+:gridmean) & !$omp private(j,i,dati) do j=1,npixels(2) do i=1,npixels(1) do ivec=1,jlen dati = datgridvec(ivec,i,j) gridmax(ivec) = max(gridmax(ivec),dati) gridmin(ivec) = min(gridmin(ivec),dati) gridmean(ivec) = gridmean(ivec) + dati enddo enddo enddo !$omp end parallel do gridmean(1:jlen) = gridmean(1:jlen)/real(product(npixels(1:2))) end subroutine minmaxmean_gridvec2D !---------------------------------------------------- ! calculate max and min and mean values on particles !---------------------------------------------------- subroutine minmaxmean_part(dat,mask,npart,partmin,partmax,partmean,nonzero,mass,part_integral) real, dimension(:,:), intent(in) :: dat logical, dimension(:), intent(in) :: mask integer, intent(in) :: npart real, dimension(3), intent(out) :: partmin,partmax,partmean logical, intent(in), optional :: nonzero real, dimension(:), intent(in), optional :: mass real, dimension(3), intent(out), optional :: part_integral real :: partval integer :: np,jlen,i,j logical :: usenonzero usenonzero = .false. if (present(nonzero)) usenonzero = nonzero partmax(:) = -huge(partmax) partmin(:) = huge(partmin) partmean(:) = 0. np = 0 jlen = min(size(dat(1,:)),3) if (present(part_integral)) part_integral(:) = 0. !--could do this in parallel but reduction on arrays ! does not seem to work in ifort !!$omp parallel do default(none) schedule(static) & !!$omp shared(dat,weight,jlen,npart,usenonzero) & !!$omp reduction(min:partmin) & !!$omp reduction(max:partmax) & !!$omp reduction(+:partmean,np) & !!$omp private(i,j,partval) do i=1,npart !--only count particles used in the rendering if (mask(i)) then np = np + 1 do j=1,jlen partval = dat(i,j) if (usenonzero) then if (partval > tiny(0.)) partmin(j) = min(partmin(j),partval) else partmin(j) = min(partmin(j),partval) endif partmax(j) = max(partmax(j),partval) partmean(j) = partmean(j) + partval if (present(mass) .and. present(part_integral)) then part_integral(j) = part_integral(j) + mass(i)*partval endif enddo endif enddo !!$omp end parallel do if (np > 0) then partmean(:) = partmean(:)/real(np) endif end subroutine minmaxmean_part !---------------------------------------------------- ! calculate max and min and mean values on particles !---------------------------------------------------- logical function iszero(partmin,partmax,ndim) real, dimension(:), intent(in) :: partmin,partmax integer, intent(in) :: ndim if (all(abs(partmin(1:ndim)) < tiny(0.)) .and. & all(abs(partmax(1:ndim)) < tiny(0.))) then iszero = .true. print "(a)",' min=max=0 on particles: skipping pointless interpolation and setting dat = 0.' else iszero = .false. endif end function iszero end module convert_grid danieljprice-splash-4d1f09c/src/cubicsolve.f90000066400000000000000000000161151477365367100213430ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2011 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- module cubic implicit none contains !------------------------------------------------------------- ! this subroutine finds the real solutions to ! a cubic equation of the form ! ! a*x^3 + b*x^2 + c*x + d ! ! formulae taken from: ! Woan, The Cambridge Handbook of Physics Formulas, 2000, p51 ! ! input : a,b,c,d : coefficients of cubic polynomial ! output : x(3) : array containing up to 3 real solutions ! => x(1:nreal) non-zero, rest set to zero ! nreal : number of real solutions ! ! Daniel Price, 22/2/07 ! dprice@astro.ex.ac.uk !------------------------------------------------------------- subroutine cubicsolve(a,b,c,d,x,nreal,check) real, intent(in) :: a,b,c,d real, intent(out), dimension(3) :: x integer, intent(out) :: nreal logical, intent(in), optional :: check real :: p,q,det,sqrtdet real :: a2,b2,u,v,y1,y2,y3,term,phi real, parameter :: eps = 1000.*epsilon(0.) real, parameter :: pi = 3.14159265358979323846 integer :: i x = 0. ! !--handle all trivial cases (quadratic, linear, all zero) ! if (abs(a) < eps) then det = c**2 - 4.*b*d if (det < 0.) then ! no solutions to quadratic nreal = 0 else if (abs(b) < eps) then !--no solutions if a = 0, b = 0, c = 0 if (abs(c) < eps) then nreal = 0 else !--solve linear equation if a = 0, b = 0 nreal = 1 x(1) = -d/c endif else !--solve quadratic for a = 0 nreal = 2 sqrtdet = sqrt(det) x(1) = 0.5*(-c + sqrtdet)/b x(2) = 0.5*(-c - sqrtdet)/b endif endif else ! !--cubic solution ! a2 = a**2 b2 = b**2 p = (c/a - b2/(3.*a2)) q = (2.*b**3/(27.*a2*a) - b*c/(3.*a2) + d/a) det = (p**3)/27. + 0.25*q**2 ! !--determine number of solutions ! if (det < 0.) then !--3 distinct real roots nreal = 3 term = sqrt(abs(p)/3.) phi = acos(-0.5*q*term**(-3)) !--these are the solutions to the reduced cubic ! y^3 + py + q = 0 y1 = 2.*term*cos(phi/3.) y2 = -2.*term*cos((phi + pi)/3.) y3 = -2.*term*cos((phi - pi)/3.) else !--1 real, 2 complex roots term = -0.5*q + sqrt(det) !--must take cube root of positive quantity, then give sign later ! (otherwise gives NaNs) u = (abs(term))**(1/3.)*SIGN(1.0,term) term = -0.5*q - sqrt(det) v = (abs(term))**(1/3.)*SIGN(1.0,term) nreal = 1 y1 = u + v !--if det=0, 3 real roots, but at least 2 equal, so max of 2 unique roots) if (abs(det) < tiny(det)) then nreal = 2 y2 = -(u + v)/2. endif y3 = 0. endif !--return solutions to original cubic, not reduced cubic term = b/(3.*a) if (nreal >= 1) x(1) = y1 - term if (nreal >= 2) x(2) = y2 - term if (nreal >= 3) x(3) = y3 - term endif if (present(check)) then if (check) then !--verify the cubic solution print*,'verifying: ',a,'x^3 + ',b,'x^2 + ',c,'x + ',d do i=1,nreal term = a*x(i)**3 + b*x(i)**2 + c*x(i) + d if (abs(term) < eps) then print*,'root ',i,':',x(i),'f=',term,': OK' else print*,'root ',i,':',x(i),'f=',term,': FAILED',eps endif enddo endif endif return end subroutine cubicsolve !------------------------------------------------------------- ! this subroutine returns both the real and complex ! solutions to a cubic equation of the form ! ! x^3 + b*x^2 + c*x + d ! ! input : b,c,d : coefficients of cubic polynomial ! output : x(3) : array of 3 COMPLEX solutions ! nreal : number of real solutions ! ! The form of the equation above means that we ! do not need to handle trivial cases (quadratic, etc.) ! and that there will always be 3 solutions. ! ! Daniel Price, daniel.price@monash.edu 21/01/2011 ! !------------------------------------------------------------- subroutine cubicsolve_complex(b,c,d,x,nreal,check) real, intent(in) :: b,c,d complex, intent(out), dimension(3) :: x integer, intent(out), optional :: nreal logical, intent(in), optional :: check double precision :: p,q,q2,xi double precision :: b2,term,termA,det,phi real :: termr,termi double precision :: fx,dfx real, parameter :: eps = 1000.*epsilon(0.) double precision, parameter :: pi = 3.14159265358979323846d0 integer :: i,j,nroots x = (0.,0.) ! !--preliminaries ! b2 = b*b p = (c - b2/3.) q = (2.*b2*b - 9.*b*c + 27.*d)/27. q2 = q*q det = (p*p*p)/27. + 0.25*q2 if (det < 0) then !--3 distinct real roots nroots = 3 term = sqrt(abs(p)/3.) phi = acos(-0.5*q*term**(-3)) !--these are the solutions to the reduced cubic ! y^3 + py + q = 0 x(1) = real(2.d0*term*cos(phi/3.d0)) x(2) = real(-2.d0*term*cos((phi + pi)/3.d0)) x(3) = real(-2.d0*term*cos((phi - pi)/3.d0)) else !--1 real, two complex nroots = 1 if (abs(det) < tiny(det)) nroots = 2 term = -0.5*q + sqrt(det) termA = (abs(term))**(1.d0/3.d0)*SIGN(1.0d0,term) x(1) = real(termA - p/(3.*termA)) termr = real(-0.5*termA + p/(6.*termA)) ! convert from double prec. termi = real(0.5*sqrt(3.d0)*(termA + p/(3.d0*termA))) x(2) = cmplx(termr,termi) x(3) = cmplx(termr,-termi) endif !--return solutions to original cubic, not reduced cubic x(:) = x(:) - b/3. !--if determinant is small, take a couple of Newton-Raphson iterations ! to beat down the error if (abs(det) < eps) then do i=1,nroots xi = dble(x(i)) do j=1,3 fx = xi*(xi*(xi + b) + c) + d dfx = xi*(3.d0*xi + 2.d0*b) + c if (abs(dfx) > 0.) xi = xi - fx/dfx enddo x(i) = real(xi) enddo endif if (present(nreal)) nreal = nroots !--the following lines can be used for debugging if (present(check)) then if (check) then !--verify the cubic solution print*,'verifying: x^3 + ',b,'x^2 + ',c,'x + ',d do i=1,3 term = real(x(i)**3 + b*x(i)**2 + c*x(i) + d) if (abs(term) < eps) then print*,'root ',i,':',x(i),'f=',term,': OK' else print*,'root ',i,':',x(i),'f=',term,': FAILED',eps endif enddo endif endif return end subroutine cubicsolve_complex end module cubic danieljprice-splash-4d1f09c/src/dataread_utils.f90000066400000000000000000000122131477365367100221650ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2015 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------- ! ! utility routines used during data read ! !----------------------------------------------------------- module dataread_utils use params, only:doub_prec,int1 implicit none public :: check_range,count_types integer, private :: iverbose_level = 1 ! can be changed private ! generic interface check_range interface check_range module procedure check_range_int, check_range_intarr,check_range_double end interface check_range contains !--------------------------------------------- ! set verboseness for remaining routines !--------------------------------------------- subroutine set_check_range_verboseness(ilevel) integer, intent(in) :: ilevel iverbose_level = ilevel end subroutine set_check_range_verboseness !----------------------------------------------- ! standardised print statement for range errors !----------------------------------------------- subroutine handle_range_error(tag,string,ierror) character(len=*), intent(in) :: tag,string integer, intent(inout) :: ierror if (iverbose_level > 0) then print "(1x,5a)",'ERROR: ',trim(tag),' value of ',trim(string),' out of range' endif ierror = ierror + 1 end subroutine handle_range_error !---------------------------------------------------- ! check that an integer is within a prescribed range !---------------------------------------------------- subroutine check_range_int(ivar,tag,min,max,err) integer, intent(in) :: ivar character(len=*), intent(in) :: tag integer, intent(in), optional :: min,max integer, intent(out), optional :: err integer :: ierror character(len=12) :: string write(string,"(i12)") ivar string = trim(adjustl(string)) ierror = 0 if (present(min)) then if (ivar < min) call handle_range_error(tag,string,ierror) endif if (present(max)) then if (ivar > max) call handle_range_error(tag,string,ierror) endif if (present(err)) then err = ierror endif end subroutine check_range_int !------------------------------------------------------------------------ ! check that all values of an integer array is within a prescribed range !------------------------------------------------------------------------ subroutine check_range_intarr(ivar,tag,min,max,err) integer, intent(in) :: ivar(:) character(len=*), intent(in) :: tag integer, intent(in), optional :: min,max integer, intent(out), optional :: err integer :: ierror,i character(len=12) :: string ierror = 0 do i=1,size(ivar) write(string,"(i12)") ivar(i) string = trim(adjustl(string)) if (present(min)) then if (ivar(i) < min) call handle_range_error(tag,string,ierror) endif if (present(max)) then if (ivar(i) > max) call handle_range_error(tag,string,ierror) endif enddo if (present(err)) then err = ierror endif end subroutine check_range_intarr !---------------------------------------------------- ! check that a real*8 is within a prescribed range !---------------------------------------------------- subroutine check_range_double(dvar,tag,min,max,err) real(doub_prec), intent(in) :: dvar character(len=*), intent(in) :: tag real(doub_prec), intent(in), optional :: min,max integer, intent(out), optional :: err integer :: ierror character(len=12) :: string write(string,"(1pg12.3)") dvar string = trim(adjustl(string)) ierror = 0 if (present(min)) then if (dvar < min) call handle_range_error(tag,string,ierror) endif if (present(max)) then if (dvar > max) call handle_range_error(tag,string,ierror) endif if (present(err)) then err = ierror endif end subroutine check_range_double !---------------------------------------------------- ! count particles of a given type !---------------------------------------------------- subroutine count_types(np,iamtype,noftype,nunknown) integer, intent(in) :: np integer(kind=int1), intent(in) :: iamtype(:) integer, intent(out) :: noftype(:),nunknown integer :: i,itype noftype(:) = 0 if (size(iamtype) >= np) then do i=1,np itype = iamtype(i) if (itype > 0 .and. itype <= size(noftype)) then noftype(itype) = noftype(itype) + 1 else nunknown = nunknown + 1 endif enddo endif end subroutine count_types end module dataread_utils danieljprice-splash-4d1f09c/src/defaults.f90000066400000000000000000000174751477365367100210260ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------- ! ! Module containing subroutines relating to ! setting/saving default options ! !------------------------------------------------- module defaults implicit none contains !! !! set initial default options !! these are used if no defaults file is found !! subroutine defaults_set(use_evdefaults) use exact, only:defaults_set_exact use multiplot use settings_limits, only:defaults_set_limits use options_data, only:defaults_set_data use settings_part, only:defaults_set_part,defaults_set_part_ev use settings_page, only:defaults_set_page,defaults_set_page_ev use settings_render, only:defaults_set_render use settings_vecplot, only:defaults_set_vecplot use settings_xsecrot, only:defaults_set_xsecrotate use settings_powerspec, only:defaults_set_powerspec use settings_units, only:defaults_set_units use titles, only:pagetitles,steplegend logical, intent(in) :: use_evdefaults integer :: i ! !--set defaults for submenu options ! call defaults_set_data call defaults_set_limits call defaults_set_page call defaults_set_part call defaults_set_render call defaults_set_xsecrotate call defaults_set_vecplot call defaults_set_exact call defaults_set_powerspec call defaults_set_units ! !--if using evsplash, override some default options ! if (use_evdefaults) then print "(a)",' ** ev mode: using default settings for .ev files **' call defaults_set_page_ev call defaults_set_part_ev endif itrans(:) = 0 ! !--multiplot ! nyplotmulti = 4 ! number of plots in multiplot multiploty(:) = 0 do i=1,4 multiploty(i) = 1+i ! first plot : y axis enddo multiplotx(:) = 1 ! first plot : x axis irendermulti(:) = 0 ! rendering ivecplotmulti(:) = 0 ! vector plot x_secmulti(:) = .false. ! take cross section? xsecposmulti(:) = 0.0 ! position of cross section icontourmulti(:) = 0 ! contour plot iplotpartoftypemulti(:,:) = .false. do i=1,size(iplotpartoftypemulti(:,1)) iplotpartoftypemulti(i,i) = .true. enddo iusealltypesmulti(:) = .true. ! !--titles ! pagetitles = ' ' steplegend = ' ' return end subroutine defaults_set ! ! set defaults for 360 video mode ! subroutine defaults_set_360() use settings_page, only:defaults_set_page_360 use settings_render, only:defaults_set_render_360 use settings_data, only:icoordsnew icoordsnew = 3 call defaults_set_render_360 call defaults_set_page_360() end subroutine defaults_set_360 ! ! writes default options to file (should match defaults_read) ! subroutine defaults_write(filename) use exact, only:exactopts,exactparams use filenames, only:rootname,nfiles use settings_data, only:dataopts use settings_part, only:plotopts use settings_page, only:pageopts use settings_render, only:renderopts use settings_vecplot, only:vectoropts use settings_xsecrot, only:xsecrotopts,animopts use settings_powerspec, only:powerspecopts use multiplot, only:multi use shapes, only:shapeopts use calcquantities, only:calcopts character(len=*), intent(in) :: filename integer :: i,ierr integer, parameter :: iunit = 1 open(unit=iunit,file=trim(adjustl(filename)),status='replace',form='formatted', & delim='apostrophe',iostat=ierr) ! without delim namelists may not be readable if (ierr /= 0) then print*,'ERROR: cannot write file '//trim(filename) close(unit=iunit) return endif write(iunit,NML=dataopts) write(iunit,NML=plotopts) write(iunit,NML=pageopts) write(iunit,NML=renderopts) write(iunit,NML=vectoropts) write(iunit,NML=xsecrotopts) write(iunit,NML=powerspecopts) write(iunit,NML=exactopts) write(iunit,NML=exactparams) write(iunit,NML=multi) write(iunit,NML=shapeopts) write(iunit,NML=calcopts) write(iunit,NML=animopts) do i=1,nfiles write(iunit,"(a)") trim(rootname(i)) enddo close(unit=iunit) print "(a)",'default options saved to file '//trim(filename) return end subroutine defaults_write !----------------------------------------------- ! reads default options from file ! uses namelist input to group the options ! these are specified in the modules !----------------------------------------------- subroutine defaults_read(filename) use filenames, only:rootname,maxfile use multiplot, only:multi use settings_data, only:dataopts,idustfrac_plot,idefaults_file_read use settings_part, only:plotopts use settings_page, only:pageopts use settings_render, only:renderopts use settings_vecplot, only:vectoropts use settings_xsecrot, only:xsecrotopts,animopts use settings_powerspec, only:powerspecopts use exact, only:exactopts,exactparams use shapes, only:shapeopts use calcquantities, only:calcopts character(len=*), intent(in) :: filename logical :: iexist integer :: ierr,i,nerr integer, parameter :: iunit = 1 nerr = 0 inquire (exist=iexist, file=filename) if (iexist) then open(unit=iunit,file=filename,status='old',form='formatted',delim='apostrophe',err=88) ierr = 0 read(iunit,NML=dataopts,iostat=ierr) idefaults_file_read = .true. if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=plotopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=pageopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=renderopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=vectoropts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=xsecrotopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=powerspecopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=exactopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=exactparams,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=multi,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=shapeopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=calcopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 ierr = 0 read(iunit,NML=animopts,iostat=ierr) if (ierr /= 0) nerr = nerr + 1 if (len_trim(rootname(1))==0) then do i=1,maxfile read(iunit,*,end=66,iostat=ierr) rootname(i) enddo endif 66 continue close(unit=iunit) if (nerr > 0) then print "(a)",' WARNING: '//trim(filename)//' incomplete (from old code version)' else print*,'read '//trim(filename) endif return else print*,trim(filename)//' not found: using default settings' return endif 88 continue print "(a)",' *** error opening defaults file '//trim(filename)//': using default settings' return end subroutine defaults_read end module defaults danieljprice-splash-4d1f09c/src/denoise.f90000066400000000000000000000252271477365367100206370ustar00rootroot00000000000000!--------------------------------------------------------------------------------- ! ! denoise - Command-line tool to remove shot noise from astronomical ! images and cubes using adaptive kernel smoothing ! ! Copyright (C) 2020-2023 Daniel Price ! daniel.price@monash.edu ! ! -------------------------------------------------------------------------- ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! ! ------------------------------------------------------------------------- ! Version history/ Changelog: ! 1.0.0 : (10/10/2023) ! now in mature usage; allow up to 1024 characters in file names ! ! 0.2.1 : (10/08/2021) ! updated splash ! ! 0.2.0 : (27/08/2020) ! bug fixes with homebrew install; ! bug fix with reading beam size for ALMA images/cubes; ! brew install uses denoise repo, not splash repo (requires fewer dependencies); ! automated update of homebrew package ! ! 0.1.0 : (20/08/2020) ! first working version of Denoise utility, as used in the Appendix to Ménard et al 2020; ! support for both single fits images and spectral cubes; ! can process either single channel or whole cube; ! reads the beam size from the fits header if available (e.g. in radio images); ! transfers header information between input and output fits files; ! option for 2D (channel-by-channel) or 3D denoising of spectral cubes; ! support for polarisation images (assumed if two fits files given as input), ! can either denoise each polarisation separately or denoise the polarised intensity image; ! standalone denoise GitHub repository ! ! ------------------------------------------------------------------------- ! ! Written by DJP, 2020-2023 ! !--------------------------------------------------------------------------------- program denoise use readwrite_fits, only:read_fits_cube,write_fits_cube,write_fits_image,get_from_header use imageutils, only:image_denoise,image_denoise3D,image_rotate use iso_fortran_env, only:stderr=>error_unit, stdout=>output_unit use system_utils, only:get_command_option,count_matching_args,get_command_flag implicit none character(len=1024) :: file1,file2,fileout,tagline,filek integer :: ierr,jext,nfiles,its,naxes(4),npixels,k,i,iarglist(3),kstart,kend,k1,k2 real, allocatable :: hh(:) real, allocatable :: image(:,:,:),image1(:,:,:),image2(:,:,:) real, allocatable :: image_old(:,:,:),image_residuals(:,:,:) real, allocatable :: snrmap(:,:) character(len=80), allocatable :: fitsheader(:) real :: beam,fluxold,fluxnew,imax,imagemax,image_max,use3D,bmaj,bmin,cdelt1,rotate real :: signal,noise logical :: iexist,use_3D,skip,get_residuals nfiles = count_matching_args('.fits',iarglist) tagline = 'denoise: a SPLASH imaging utility (c) 2020-2023 Daniel Price' if (nfiles < 1) then print "(a)",trim(tagline) print "(/,a)",'Usage: denoise [options] infile.fits [outfile.fits]' print "(/,a)",'Options: --beam=1.0 [beam size in pixels at max intensity]' print "(a)", ' --imax=3.4e-2 [intensity value above which no smoothing is applied]' print "(a)", ' --its=4 [maximum number of smoothing length iterations]' print "(a)", ' --use3D=1 [denoise in 3D for spectral cubes]' print "(a)", ' --start=1 [denoise from channel 1 onwards]' print "(a)", ' --end=10 [denoise only up to channel 10]' print "(a)", ' --nosubsample [do not subsample if beam size >> pixel scale]' print "(a)", ' --residuals [output residual image as residuals.fits]' print "(a)", ' --rotate=30 [rotate image by 30 degrees]' stop endif ! ! read filenames from the command line ! call get_command_argument(iarglist(1),file1) if (nfiles >= 3) then call get_command_argument(iarglist(2),file2) call get_command_argument(iarglist(3),fileout) elseif (nfiles >= 2) then call get_command_argument(iarglist(2),fileout) else fileout = 'denoise.fits' ! if no .fits extension found in original file jext = index(file1,'.fits') fileout = file1(1:jext-1)//'_denoise.fits' ! default if no output filename given endif ! ! get options from the command line ! imax = get_command_option('imax',default=0.) beam = get_command_option('beam',default=0.) use3D = get_command_option('use3D',default=0.) kstart = nint(get_command_option('start',default=0.)) kend = nint(get_command_option('end',default=0.)) its = nint(get_command_option('its',default=4.)) skip = .not.get_command_flag('nosubsample') rotate = get_command_option('rotate',default=0.) get_residuals = get_command_flag('residuals') !print*,' GOT imax=',imax,' fac = ',fac,trim(file1),trim(file2),trim(fileout) ! check output file does not already exist inquire(file=fileout,exist=iexist) if (iexist) then write(stderr,*) 'ERROR: '//trim(fileout)//' already exists: please move or rename and try again' stop endif ! read original file call read_fits_cube(file1,image1,naxes,ierr,hdr=fitsheader) if (ierr /= 0) stop 'error reading file' if (nfiles >= 3) then call read_fits_cube(file2,image2,naxes,ierr) if (ierr /= 0) stop 'error reading file' ! polarisation images write(stdout,"(a)") '>> Polarisation mode: sqrt(p**2 + q**2) using p='//trim(file1)//' q='//trim(file2) image = sqrt(image1**2 + image2**2) else image = image1 endif ! eliminate NaNs where (isnan(image)) image = 0. end where image_old = image use_3D = (naxes(3) > 1) .and. (use3D > 0.) if (use_3D) then npixels = naxes(1)*naxes(2)*naxes(3) else npixels = naxes(1)*naxes(2) endif allocate(hh(npixels)) !allocate(hh(naxes(1),naxes(2))) image_max = maxval(image) if (imax > 0.) then imagemax = imax else imagemax = image_max endif ! ! get beamsize from fits header, in units of pixels ! if (beam <= tiny(beam)) then bmaj = get_from_header('BMAJ',fitsheader,ierr) bmin = get_from_header('BMIN',fitsheader,ierr) cdelt1 = get_from_header('CDELT1',fitsheader,ierr) if (abs(cdelt1) > 0. .and. ierr == 0) then beam = bmaj/abs(cdelt1) !sqrt(bmin*bmaj)/abs(cdelt1) print*,' bmin = ',bmin/abs(cdelt1),' bmaj = ',bmaj/abs(cdelt1), ' mean = ',sqrt(bmin*bmaj)/abs(cdelt1) endif if (beam < 1. .or. beam > 20.) beam = 1. endif print "(3(a,1pg16.4))",'>> max intensity = ',imagemax,' of ',image_max,', min pix per beam = ',beam if (use_3D) then ! ! denoise all channels simultaneously in 3D ! call image_denoise3D(naxes,image,hh,iterations=its,imax=imagemax,beam=beam) else ! ! denoise channel by channel in 2D ! k1 = 1 k2 = naxes(3) if (kstart > 0) k1 = kstart if (kend > 0 .and. kend <= naxes(3)) k2 = kend do k=k1,k2 if (naxes(3) > 1) print "(a,i5,a,i5)",'>> channel ',k, ' of ',naxes(3) !print*,'min, max,mean h = ',minval(hh),maxval(hh),sum(hh)/real(npixels) ! for polarised images, denoise individual polarisations ! then stitch the denoised images back together if (nfiles >= 3) then write(stdout,'(/,a)') '>> de-noising p...' call image_denoise(naxes,image1,hh,iterations=its,imax=imagemax,beam=beam,skip=skip) write(stdout,'(/,a)') '>> de-noising q...' call image_denoise(naxes,image2,hh,iterations=its,imax=imagemax,beam=beam,skip=skip) write(stdout,'(/,a)') '>> recombining to get total intensity...' image = sqrt(image1**2 + image2**2) elseif (abs(rotate) > tiny(0.)) then write(stdout,'(/,a,es10.3,a)') 'rotating by ',rotate,' deg' call image_rotate(naxes(1:2),image(:,:,k),rotate,ierr) else call image_denoise(naxes(1:2),image(:,:,k),hh,iterations=its,imax=imagemax,beam=beam,skip=skip) endif fluxold = sum(image_old(:,:,k)) fluxnew = sum(image(:,:,k)) print "(a,g16.8,a,g16.8,a,1pg10.2,a)",'>> total intensity =',fluxnew,' was ',fluxold,& ' err=',100.*(fluxnew-fluxold)/abs(fluxold),' %' !signal = fluxold/(naxes(1)*naxes(2)) !noise = sqrt(sum((image_old(:,:,k)-signal)**2)/(naxes(1)*naxes(2))) !print*,' Orig SNR = ',signal/noise, ' signal = ',signal,' noise = ',noise !signal = fluxnew/(naxes(1)*naxes(2)) !noise = sqrt(sum((image(:,:,k)-signal)**2)/(naxes(1)*naxes(2))) !print*,' New SNR = ',signal/noise, ' signal = ',signal,' noise = ',noise !call write_fits_image('hh.fits',hh,naxes(1:2),ierr) ! if only one channel is selected, also print it out as a separate .fits file if (naxes(3) > 1 .and. k2==k1) then i = index(fileout,'.fits') write(filek,*) k filek = fileout(1:i-1)//'-c'//trim(adjustl(filek))//'.fits' call write_fits_image(filek,image(:,:,k),naxes(1:2),ierr,hdr=fitsheader) if (get_residuals) then image_residuals = image - image_old ! to allocate memory !image_residuals(:,:,k) = image(:,:,k) - image_old(:,:,k) write(filek,*) k filek = fileout(1:i-1)//'-c'//trim(adjustl(filek))//'_original.fits' call write_fits_image(filek,image_old(:,:,k),naxes(1:2),ierr,hdr=fitsheader) write(filek,*) k filek = fileout(1:i-1)//'-c'//trim(adjustl(filek))//'_residuals.fits' call write_fits_image(filek,image_residuals(:,:,k),naxes(1:2),ierr) endif endif enddo endif call write_fits_cube(fileout,image,naxes,ierr,hdr=fitsheader) if (get_residuals) then image_residuals = image - image_old jext = index(fileout,'.fits') fileout = fileout(1:jext-1)//'_residuals.fits' call write_fits_cube(fileout,image_residuals,naxes,ierr) endif if (ierr /= 0) write(stderr,*) 'error writing output file(s)' deallocate(image,hh) if (allocated(image_residuals)) deallocate(image_residuals) if (allocated(image1)) deallocate(image1) if (allocated(image2)) deallocate(image2) end program denoise danieljprice-splash-4d1f09c/src/discplot.f90000066400000000000000000000200351477365367100210220ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! module handling plotting of azimuthally-averaged quantities ! for disc simulations !----------------------------------------------------------------- module disc implicit none integer, parameter, private :: maxbins = 1001 integer, dimension(maxbins), private :: ninbin real, dimension(maxbins), private :: radius,sigma,spsound integer, private :: nbins public :: disccalc,discplot private contains subroutine disccalc(iplot,npart,rpart,npmass,pmass,unit_mass,unit_dens,unit_r,unit_dz,rminin,rmaxin,ymin,ymax,& itransx,itransy,icolourpart,iamtype,usetype,noftype,gamma,mstar,& unit_u,u,u_is_spsound) use transforms, only:transform_limits_inverse,transform_inverse,transform use params, only:int1,maxparttypes,doub_prec use physcon, only:pi use part_utils, only:igettype integer, intent(in) :: iplot,npart,npmass,itransx,itransy real, dimension(npart), intent(in) :: rpart real, dimension(npmass), intent(in) :: pmass real(doub_prec), intent(in) :: unit_mass,unit_dens,unit_r,unit_dz real, intent(in) :: rminin,rmaxin,gamma,mstar real, intent(out) :: ymin,ymax integer, dimension(npart), intent(in) :: icolourpart integer(kind=int1), dimension(:), intent(in) :: iamtype logical, dimension(maxparttypes), intent(in) :: usetype integer, dimension(maxparttypes), intent(in) :: noftype real(doub_prec), intent(in), optional :: unit_u real, dimension(npart), intent(in), optional :: u logical, intent(in), optional :: u_is_spsound integer :: i,ibin real :: pmassi,rbin,deltar,area,rmin,rmax real(doub_prec) :: sigmai,toomreq,epicyclic,Omegai,spsoundi,unit_cs2 real, dimension(1) :: rad logical :: mixedtypes,gotspsound integer :: itype,np ninbin(:) = 0 sigma(:) = 0. spsound(:) = 0. pmassi = 0 if (npmass <= 0) then print*,' INTERNAL ERROR in discplot: dimension of mass array <= 0' return endif gotspsound = .false. if (present(u_is_spsound)) gotspsound = u_is_spsound if (present(unit_u)) then unit_cs2 = unit_u else unit_cs2 = 1.d0 endif ! !--print info ! select case(iplot) case(1) print "(a)",' calculating disc surface density profile ' case(2) if (present(u)) then print "(a,es10.3,a)",' calculating Toomre Q parameter (assuming Mstar=',mstar,' and Keplerian rotation)' if (.not.gotspsound) then if (gamma < 1.00001) then print "(a)",' isothermal equation of state: using cs^2 = 2/3*utherm' else print "(a,f6.3,a,f6.3,a)",' ideal gas equation of state: using cs^2 = ',gamma*(gamma-1),'*u (gamma = ',gamma,')' endif endif else print "(a)",' ERROR: cannot calculate Toomre Q parameter: thermal energy/sound speed not present in dump file' return endif case default print "(a)",' ERROR: unknown plot in discplot. ' return end select ! !--if transformations (e.g. log) are applied to r, then limits ! will already be set in transformed space - need to obtain ! limits in non-transformed space. ! rmin = rminin rmax = rmaxin if (itransx > 0) call transform_limits_inverse(rmin,rmax,itransx) ! !--try to get appropriate value for nbins ! nbins = min(4*int(npart**(1./3.)) + 1,maxbins) ! !--set array of radius values for plotting ! deltar = (rmax - rmin)/(nbins - 1) do ibin=1,nbins radius(ibin) = rmin + (ibin-0.5)*deltar enddo mixedtypes = size(iamtype) >= npart ! !--calculate surface density in each radial bin ! np = 0 !$omp parallel do default(none) & !$omp shared(npart,rpart,sigma,npmass,pmass,itransx,icolourpart,rmin,deltar,nbins,mstar) & !$omp shared(ninbin,spsound,gamma,u,iamtype,mixedtypes,usetype,noftype,gotspsound,unit_cs2) & !$omp private(i,rad,pmassi,ibin,rbin,area,itype) & !$omp reduction(+:np) over_parts: do i=1,npart !--skip particles with itype < 0 if (icolourpart(i) < 0) cycle over_parts if (mixedtypes) then itype = int(iamtype(i)) else itype = igettype(i,noftype) endif if (.not.usetype(itype)) cycle over_parts np = np + 1 if (itransx==0) then rad(1) = rpart(i) else rad(1) = rpart(i) call transform_inverse(rad,itransx) endif if (npmass >= npart) then pmassi = pmass(i) else pmassi = pmass(1) endif ibin = int((rad(1) - rmin)/deltar) + 1 if (ibin > 0 .and. ibin <= nbins) then rbin = rmin + (ibin-0.5)*deltar area = pi*((rbin + 0.5*deltar)**2 - (rbin - 0.5*deltar)**2) !$omp atomic sigma(ibin) = sigma(ibin) + pmassi/area if (present(u)) then if (gotspsound) then !$omp atomic spsound(ibin) = spsound(ibin) + real((u(i))**2/unit_cs2) else if (gamma < 1.00001) then !$omp atomic spsound(ibin) = spsound(ibin) + real(2./3.*(u(i)/unit_cs2)) else !$omp atomic spsound(ibin) = spsound(ibin) + real(gamma*(gamma-1.)*(u(i)/unit_cs2)) endif endif !$omp atomic ninbin(ibin) = ninbin(ibin) + 1 endif endif enddo over_parts !$omp end parallel do print "(1x,a,i10,a,i10,a,i4,a)",'used ',np,' of ',npart,' particles in ',nbins,' bins' ! !--calculate Toomre Q parameter in each bin using surface density ! if (iplot==2) then epicyclic = 0. do ibin=1,nbins sigmai = sigma(ibin)*(unit_r**2/unit_mass) ! convert back to code units ! !--for Toomre Q need the epicyclic frequency ! in a Keplerian disc kappa = Omega ! Omegai = sqrt(mstar/(radius(ibin)/unit_r)**3) epicyclic = Omegai ! !--spsound is RMS sound speed for all particles in the annulus ! if (ninbin(ibin) > 0) then spsoundi = sqrt(spsound(ibin)/real(ninbin(ibin))) ! unit conversion already done else spsoundi = 0. endif ! !--now calculate Toomre Q ! if (sigmai > 0.) then toomreq = spsoundi*epicyclic/(pi*sigmai) else toomreq = 0. endif sigma(ibin) = real(toomreq,kind=kind(sigma)) enddo else ! !--return surface density in units of [g/cm^2], not [g/cm^3 au] or [Msun/au^2] ! sigma = sigma*(unit_r**2/unit_mass) ! convert back to code units sigma = sigma*unit_dens*unit_dz ! convert to units of unit_dens * unit_dz endif ! !--give very small number instead of zero to avoid problems on log plots ! where (sigma(1:nbins) < tiny(0.)) sigma(1:nbins) = minval(sigma,mask=sigma>0.) if (itransx > 0) call transform(radius,itransx) if (itransy > 0) call transform(sigma,itransy) ! !--return min and max of y axis so adaptive plot limits can be set ! ymin = minval(sigma(1:nbins),mask=(sigma(1:nbins) /= 0.)) ymax = maxval(sigma(1:nbins),mask=(sigma(1:nbins) /= 0.)) return end subroutine disccalc !--------------------------------------------------- ! ! subroutine to actually perform the disc plotting ! !--------------------------------------------------- subroutine discplot use plotlib, only:plot_line call plot_line(nbins,radius,sigma) end subroutine discplot end module disc danieljprice-splash-4d1f09c/src/exact.f90000066400000000000000000002262131477365367100203130ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2016 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! This module handles all of the settings relating to the exact solution ! plotting and calls the appropriate routines to change these settings and ! plot the actual solutions. ! ! The only thing to do with exact solutions that is not entirely handled ! by this module is the toy star AC plane solution (because ! it is called under different circumstances to the other solutions). ! module exact use params, only:maxplot implicit none ! !--maximum number of solutions in any one plot ! integer, parameter :: maxexact=32 integer, parameter :: maxlabels = maxplot character(len=30) :: exact_labels(maxlabels) ! !--options used to plot the exact solution line ! integer :: maxexactpts, iExactLineColour(maxexact), iExactLineStyle(maxexact),iPlotExactOnlyOnPanel integer :: iNormaliseErrors logical :: iApplyTransExactFile,iCalculateExactErrors,iPlotResiduals logical :: iApplyUnitsExactFile,iPlotExactUnder real :: fracinsetResiduals,residualmax,ExactAlpha character(len=60) :: ExactLegendText(maxexact) ! !--declare all of the parameters required for the various exact solutions ! !--toy star integer :: iACplane ! label position of toy star AC plane plot integer :: norder,morder ! for toy star real, public :: atstar,ctstar,sigma real :: htstar,alphatstar,betatstar,ctstar1,ctstar2 real :: sigma0,totmass !--sound wave integer :: iwaveploty,iwaveplotx ! linear wave real :: ampl,lambda,period,xzero !--sedov blast wave real :: rhosedov,esedov !--polytrope real :: polyk !--mhd shock solutions integer :: ishk real :: xshock !--density profiles integer :: iprofile,icolpoten,icolfgrav real, dimension(2) :: Msphere,rsoft !--from file integer :: iexactplotx(maxexact), iexactploty(maxexact) logical :: iauto_map_columns !--shock tube real :: rho_L, rho_R, pr_L, pr_R, v_L, v_R !--rho vs h real :: hfact !--read from file integer :: imapexact(maxlabels),nfiles character(len=120) :: filename_exact(maxexact) !--equilibrium torus real :: Mstar,Rtorus,distortion !--ring spreading real :: Mring,Rring,viscnu !--dusty waves real :: cs,Kdrag,rhozero,rdust_to_gas !--arbitrary function integer :: nfunc character(len=120), dimension(maxexact) :: funcstring !--Roche potential real :: mprim,msec real :: xprim(3),xsec(3) logical :: use_sink_data integer, parameter :: iexact_rochelobe = 15 !--C-shock real :: machs,macha !--planet-disc interaction real :: HonR,rplanet,q_index,phase real :: spiral_params(7,maxexact) integer :: ispiral,narms logical :: iread_wakeparams,iclockwise !--bondi flow logical :: relativistic, geodesic_flow,is_wind real :: const1,const2 !--gamma, for manual setting real :: gamma_exact,gamma2_exact logical :: use_gamma_exact,use_gamma2_exact ! !--sort these into a namelist for input/output ! namelist /exactopts/ iexactplotx,iexactploty,filename_exact,maxexactpts, & iExactLineColour,iExactLineStyle,iApplyTransExactFile,iCalculateExactErrors, & iPlotResiduals,fracinsetResiduals,residualmax,iPlotExactOnlyOnPanel,& iApplyUnitsExactFile,iNormaliseErrors,iPlotExactUnder,ExactAlpha namelist /exactparams/ ampl,lambda,period,iwaveploty,iwaveplotx,xzero, & htstar,atstar,ctstar,alphatstar,betatstar,ctstar1,ctstar2, & polyk,sigma0,norder,morder,rhosedov,esedov, & rho_L, rho_R, pr_L, pr_R, v_L, v_R,ishk,hfact, & iprofile,Msphere,rsoft,icolpoten,icolfgrav,Mstar,Rtorus,distortion, & Mring,Rring,viscnu,nfunc,funcstring,cs,Kdrag,rhozero,rdust_to_gas, & mprim,msec,imapexact,iauto_map_columns,xshock,totmass,machs,macha,& use_sink_data,xprim,xsec,nfiles,& gamma_exact,gamma2_exact,use_gamma_exact,use_gamma2_exact,& HonR,rplanet,q_index,relativistic,geodesic_flow,is_wind,& const1,const2,ispiral,narms,spiral_params,phase,iread_wakeparams,iclockwise public :: defaults_set_exact,submenu_exact,options_exact,read_exactparams public :: exact_solution,get_nexact public :: exactopts,exactparams public :: exact_set_rocheparam contains !---------------------------------------------------------------------- ! sets default values of the exact solution parameters !---------------------------------------------------------------------- subroutine defaults_set_exact use plotlib, only:plotlib_maxlinestyle integer :: i lambda = 1.0 ! sound wave exact solution : wavelength ampl = 0.005 ! sound wave exact solution : amplitude period = 1.0 iwaveploty = 7 iwaveplotx = 1 xzero = 0. htstar = 1. ! toy star crap atstar = 1. ctstar = 1. alphatstar = 0. betatstar = 0. ctstar1 = 0. ctstar2 = 0. totmass = 1. norder = -1 morder = 0 sigma0 = 0. rhosedov = 1.0 ! sedov blast wave esedov = 1.0 ! blast wave energy polyk = 1.0 ! polytropic k ! shock tube (default is sod problem) rho_L = 1.0 rho_R = 0.125 pr_L = 1.0 pr_R = 0.1 v_L = 0.0 v_R = 0.0 ishk = 1 xshock = 0. hfact = 1.2 ! read from file nfiles = 1 filename_exact = ' ' imapexact = 0 iauto_map_columns = .true. iexactplotx = 0 iexactploty = 0 ! density profile parameters iprofile = 1 rsoft(1) = 1.0 rsoft(2) = 0.1 Msphere(1) = 1.0 Msphere(2) = 0.0 icolpoten = 0 icolfgrav = 0 ! equilibrium torus Mstar = 1.0 Rtorus = 1.0 distortion = 1.1 ! ring spreading Mring = 1.0 Rring = 1.0 viscnu = 1.e-3 ! dusty waves Kdrag = 1.0 cs = 1.0 rhozero = 1.0 rdust_to_gas = 0.0 ! Roche lobes use_sink_data = .true. mprim = 1. msec = 1. xprim = 0. xsec = 0. xsec(1) = 1. ! C-shock machs = 50. ! sonic Mach number macha = 5. ! Alfvenic Mach number ! planet-disc interaction HonR = 0.05 rplanet = 1. q_index = 0.25 ispiral = 1 narms = 1 phase = 0. spiral_params = 0. spiral_params(2,:) = 360. iread_wakeparams = .true. iclockwise = .false. ! Bondi relativistic = .true. geodesic_flow = .false. is_wind = .true. const1 = 8. const2 = 1. ! gamma, if not read from file gamma_exact = 5./3. gamma2_exact = 1. use_gamma_exact = .false. use_gamma2_exact = .false. ! arbitrary function nfunc = 1 funcstring = ' ' maxexactpts = 1001 ! points in exact solution plot iExactLineColour = 1 ! foreground do i=1,size(iExactLineStyle) iExactLineStyle(i) = mod(i,plotlib_maxlinestyle) enddo iApplyTransExactFile = .true. ! false if exact from file is already logged iApplyUnitsExactFile = .false. iCalculateExactErrors = .true. iNormaliseErrors = 1 iPlotResiduals = .false. fracinsetResiduals = 0.15 residualmax = 0.0 iPlotExactOnlyOnPanel = 0 iPlotExactUnder = .false. ExactLegendText = '' ExactAlpha = 1.0 end subroutine defaults_set_exact !---------------------------------------------------------------------- ! sets which exact solution to calculate + parameters for this !---------------------------------------------------------------------- subroutine submenu_exact(iexact) use settings_data, only:ndim,ncolumns,ncalc use prompting, only:prompt,print_logical use filenames, only:rootname,ifileopen,fileprefix use exactfunction, only:check_function use mhdshock, only:nmhdshocksolns,mhdprob use planetdisc, only:maxspirals,labelspiral use asciiutils, only:get_ncolumns,get_nrows,string_replace,match_tag_start,& add_escape_chars,read_asciifile,read_column_labels use labels, only:label use map_columns, only:map_columns_in_file,map_columns_interactive,print_mapping integer, intent(inout) :: iexact integer :: ierr,itry,i,ncols,nadjust,nrows,nlab_exact integer, allocatable :: imapauto(:) logical :: ians,iexist,ltmp,prompt_for_gamma,apply_to_all character(len=len(filename_exact)) :: filename_tmp character(len=4) :: str character(len=len(funcstring)) :: func_prev print 10 10 format(' 0) none ',/, & ' 1) ANY function f(x,t)',/, & ' 2) read from file ',/, & ' 3) shock tube ',/, & ' 4) sedov blast wave ',/, & ' 5) polytrope ',/, & ' 6) toy star ',/, & ' 7) gresho vortex ',/, & ' 8) mhd shock tubes (tabulated) ',/, & ' 9) h vs rho ',/, & '10) Plummer/Hernquist spheres ',/, & '11) torus ',/, & '12) ring spreading ',/, & '13) special relativistic shock tube', /, & '14) dusty waves', /, & '15) Roche lobes/potential ',/, & '16) C-shock ',/, & '17) Spiral arms (planet-disc interaction)',/, & '18) Bondi flow') call prompt('enter exact solution to plot',iexact,0,18) print "(a,i2)",'plotting exact solution number ',iexact ! !--enter parameters for various exact solutions ! prompt_for_gamma = .false. apply_to_all = .true. select case(iexact) case(1) call prompt('enter number of functions to plot ',nfunc,1,maxexact) print "(/,a,6(/,11x,a))",' Examples: sin(2*pi*x - 0.1*t)','sqrt(0.5*x)','x^2', & 'exp(-2*x**2 + 0.1*t)','log10(x/2)','exp(y),y=sin(pi*x)','cos(z/y),z=acos(y),y=x^2' ierr = 0 overfunc: do i=1,nfunc ierr = 1 itry = 0 func_prev = funcstring(i) do while(ierr /= 0 .and. itry < 10) if (nfunc > 1) print "(/,a,i2,/,11('-'),/)",'Function ',i call prompt('enter function f(x,t) to plot ',funcstring(i),noblank=.true.) call check_function(funcstring(i),ierr) if (ierr /= 0 .and. len(funcstring(i))==len_trim(funcstring(i))) then print "(a,i3,a)",& ' (errors are probably because string is too long, max length = ',& len(funcstring(i)),')' endif itry = itry + 1 enddo if (itry >= 10) then print "(a)",' *** too many tries, aborting ***' ierr = i-1 exit overfunc endif print* call prompt('enter y axis of exact solution (0=all plots)',iexactploty(i),0) if (iexactploty(i) > 0) then call prompt('enter x axis of exact solution ',iexactplotx(i),1) endif if (len_trim(ExactLegendText(i))==0 .or. trim(funcstring(i)) /= trim(func_prev)) then ExactLegendText(i) = trim(funcstring(i)) endif call prompt('enter text to display in legend (blank=do not show)',ExactLegendText(i)) enddo overfunc if (ierr /= 0) nfunc = ierr case(2) ! ! try to read filenames from .exactfiles if it exists ! call read_exactparams(iexact,trim(rootname(1)),ierr) ! ! then prompt user ! call prompt('enter number of files to read per plot ',nfiles,1,maxexact) if (ierr /= 0 .and. nfiles > 1) then print "(2(/,a))",' Hint: create a file called '//trim(fileprefix)//'.exactfiles', & ' with one filename per line to automatically read the filenames' else print "(a,i2,a)",' got ',nfiles,' filenames from '//trim(fileprefix)//'.exactfiles' endif nadjust = -1 over_files: do i=1,nfiles iexist = .false. do while(.not.iexist) if (i==1) print "(/,a)",'Use %f to represent current dump file, e.g. %f.exact looks for dump_000.exact' write(str,"(i4)") i call prompt('enter filename #'//trim(adjustl(str)),filename_exact(i)) !--substitute %f for filename filename_tmp = filename_exact(i) call string_replace(filename_tmp,'%f',trim(rootname(ifileopen))) !--check the first file for errors inquire(file=filename_tmp,exist=iexist) if (iexist) then allocate(imapauto(size(imapexact))) imapauto = 0 call map_columns_in_file(filename_tmp,ncols,nrows,imapauto,& label(1:ncolumns+ncalc),exact_labels,nlab_exact,ierr) if (ierr==0) then ! if more than two columns mapped successfully, prompt to keep this automatic if (all(imapexact==0)) imapexact = imapauto ! manual assignment of column mappings call map_columns_interactive(imapexact,label(1:ncolumns+ncalc),& exact_labels,nlab_exact) ! disable automated mapping if edits were made if (any(imapexact(1:nlab_exact) /= imapauto(1:nlab_exact))) iauto_map_columns = .false. print "(a)",' automated mapping is '//print_logical(iauto_map_columns) if (nrows > maxexactpts) maxexactpts = nrows if (count(imapexact > 0) < 2) print "(/,a,/)",' WARNING: not enough columns mapped to plot anything' ! re-prompt if there are less than two useable columns in the file if (ncols < 2) then iexist = .false. call prompt('Error: file contains < 2 readable columns: try again?',ians) if (.not.ians) then nadjust = i-1 exit over_files endif endif else iexist = .false. call prompt('Error opening '//trim(filename_tmp)//': try again?',ians) if (.not.ians) then nadjust = i-1 exit over_files endif endif if (allocated(imapauto)) deallocate(imapauto) else ians = .true. call prompt('file does not exist: try again? ',ians) if (.not.ians) then nadjust = i-1 exit over_files endif endif enddo !if (i==1) then ! call prompt('Apply above settings to all files?',apply_to_all) ! if (apply_to_all) then ! iexactploty(:) = iexactploty(i) ! iexactplotx(:) = iexactplotx(i) ! endif !endif if (len_trim(ExactLegendText(i))==0) ExactLegendText(i) = add_escape_chars(filename_exact(i)) !call prompt('enter text to display in legend (blank=do not show)',ExactLegendText(i)) enddo over_files if (nadjust >= 0) then nfiles = nadjust if (nfiles == 1) then print "(/,a)",'Using 1 file only' elseif (nfiles > 0) then write(str,"(i4)") nfiles print "(/,a)",'Using '//trim(adjustl(str))//' files' endif endif if (nfiles > 0) then ! only ask if filename was read OK ltmp = .not.iApplyTransExactFile if (.not.any(exact_labels(:)(1:3) == 'log')) then call prompt(' are exact solutions already logged?',ltmp) endif iApplyTransExactFile = .not.ltmp ltmp = .not.iApplyUnitsExactFile call prompt(' are exact solutions in physical units?',ltmp) iApplyUnitsExactFile = .not.ltmp endif case(3,13) ! !--read shock parameters from the .shk file ! call read_exactparams(iexact,trim(rootname(1)),ierr) if (ierr /= 0) then call prompt('enter initial x position of shock',xshock) call prompt('enter density to left of shock ',rho_L,0.0) call prompt('enter density to right of shock ',rho_R,0.0) call prompt('enter pressure to left of shock ',pr_L,0.0) call prompt('enter pressure to right of shock ',pr_R,0.0) if (iexact==13) then call prompt('enter velocity to left of shock ',v_L,max=1.0) call prompt('enter velocity to right of shock ',v_R,max=1.0) else call prompt('enter velocity to left of shock ',v_L) call prompt('enter velocity to right of shock ',v_R) call prompt('enter dust-to-gas ratio ',rdust_to_gas,0.) endif endif prompt_for_gamma = .true. case(4) call prompt('enter density of ambient medium ',rhosedov,0.0) call prompt('enter blast wave energy E ',esedov,0.0) prompt_for_gamma = .true. case(5) call prompt('enter polytropic k ',polyk) call prompt('enter total mass ',totmass) prompt_for_gamma = .true. case(6) print "(a)",' toy star: ' call read_exactparams(iexact,trim(rootname(1)),ierr) call prompt('enter polytropic k ',polyk) call prompt('enter total mass ',totmass) call prompt('enter central density rho_0 (rho = rho_0 - cr^2)',htstar) call prompt('enter parameter c (rho = rho_0 - cr^2)',ctstar,0.0) sigma = 0. call prompt('enter parameter sigma (By = sigma*rho)',sigma0) sigma = sigma0 ians = .false. call prompt('linear oscillations?',ians) if (ians) then call prompt('enter order of radial mode',norder,0) if (ndim >= 2) call prompt('enter order of angular mode',morder,0) call prompt('enter velocity amplitude a (v = a*r) ',atstar) else print "(a)",'using exact non-linear solution:' ians = .true. if (norder < 0 .and. morder < 0) ians = .false. if (ndim >= 2) call prompt('axisymmetric?',ians) if (ians .or. ndim==1) then norder = -1 morder = 0 call prompt('enter v_r amplitude ',alphatstar) if (ndim >= 2) call prompt('enter v_phi amplitude ',betatstar) else norder = -1 morder = -1 call prompt('enter vxx amplitude ',alphatstar) call prompt('enter vyy amplitude ',betatstar) call prompt('enter vxy amplitude ',ctstar1) call prompt('enter vyx amplitude ',ctstar2) endif endif prompt_for_gamma = .true. !case(7) ! call prompt('enter y-plot to place sine wave on',iwaveploty,1) ! call prompt('enter x-plot to place sine wave on',iwaveplotx,1) ! call prompt('enter starting x position',xzero) ! call prompt('enter wavelength lambda ',lambda,0.0) ! call prompt('enter amplitude ',ampl,0.0) ! call prompt('enter period ',period) case(8) print "(a)",' MHD shock tube tables: ' if (ishk <= 0) ishk = 1 do i=1,nmhdshocksolns print "(i2,') ',a)",i,trim(mhdprob(i)) enddo call prompt('enter solution to plot ',ishk,1,7) call prompt('enter initial x position of shock ',xshock) case(9) call prompt('enter hfact [h = hfact*(m/rho)**1/ndim]',hfact,0.) case(10) print 20 20 format(' 1) Plummer sphere [ rho = 3M r_s**2 /(4 pi (r**2 + r_s**2)**5/2) ]',/, & ' 2) Hernquist model [ rho = M r_s /(2 pi r (r_s + r)**3 ]') call prompt('enter density profile to plot',iprofile,1,2) call prompt('enter total mass of sphere M',Msphere(1),0.) call prompt('enter scale length length r_s,',rsoft(1),0.) ians = .false. if (icolpoten > 0) ians = .true. call prompt('Are the gravitational potential and/or force dumped?',ians) if (ians) then call prompt('enter column containing grav. potential',icolpoten,0) call prompt('enter column containing grav. force',icolfgrav,0) endif call prompt('enter mass of 2nd component',Msphere(2),0.) call prompt('enter scale length r_s for 2nd component,',rsoft(2),0.) case(11) call prompt('enter mass of central object',Mstar,0.) call prompt('enter radius of torus centre',Rtorus,0.) call prompt('enter distortion parameter ',distortion,1.,2.) if (abs(polyk-1.0) < tiny(polyk)) polyk = 0.0764 call prompt('enter K in P= K*rho^gamma',polyk,0.) prompt_for_gamma = .true. case(12) call prompt('enter mass of ring',Mring,0.) call prompt('enter radius of ring centre R0',Rring,0.) call prompt('enter viscosity parameter nu',viscnu,0.) case(14) call prompt('enter starting x position',xzero) call prompt('enter wavelength lambda ',lambda,0.) call prompt('enter amplitude of perturbation',ampl,0.) call prompt('enter sound speed in gas ',cs,0.) call prompt('enter initial gas density ',rhozero,0.) call prompt('enter dust-to-gas ratio ',rdust_to_gas,0.) call prompt('enter drag coefficient K ',Kdrag,0.) case(15) call prompt('use data from sink particles?',use_sink_data) if (.not.use_sink_data) then call prompt('enter mass of primary star ',mprim,0.) call prompt('enter mass of secondary star ',msec,0.,mprim) call prompt('enter x position of primary',xprim(1)) call prompt('enter y position of primary',xprim(2)) call prompt('enter x position of secondary',xsec(1)) call prompt('enter y position of secondary',xsec(2)) endif case(16) call prompt('enter sonic Mach number',machs,0.) call prompt('enter Alfvenic Mach number ',macha,0.) case(17) do i=1,maxspirals print "(1x,i1,')',1x,a)",i,trim(labelspiral(i)) enddo call prompt('Which spiral arm solution to plot?',ispiral,0,maxspirals) select case(ispiral) case(2) call prompt('enter number of spiral arms to plot',narms,1,maxexact) print "(3(/,a),/)",' Spiral data can be read from '//trim(fileprefix)//'.spirals file', & ' with one line per arm and columns corresponding to:', & ' PAmin, PAmax, a0, a1, a2, a3, a4' do i=1,narms print "(a,i1,a)",' -- arm ',i,' --' call prompt('enter starting position angle (deg)',spiral_params(1,i)) call prompt('enter finishing position angle (deg)',spiral_params(2,i)) call prompt('enter a0 in r = \sum a_i phi^i',spiral_params(3,i)) call prompt('enter a1 in r = \sum a_i phi^i',spiral_params(4,i)) call prompt('enter a2 in r = \sum a_i phi^i',spiral_params(5,i)) call prompt('enter a3 in r = \sum a_i phi^i',spiral_params(6,i)) call prompt('enter a4 in r = \sum a_i phi^i',spiral_params(7,i)) enddo case default if (ifileopen > 0) call get_planetdisc_parameters_from_data(rplanet,HonR,q_index,phase,ierr) if (ierr == 0) call prompt(' use wake parameters above?',iread_wakeparams) if (ierr /= 0) iread_wakeparams = .false. if (.not.iread_wakeparams) then call prompt('enter disc aspect ratio at planet location (H/R)',HonR,0.,1.) call prompt('enter planet orbital radius ',rplanet,0.) call prompt('enter power-law index of sound speed cs ~ R^-q',q_index) call prompt('enter orbital phase in degrees ',phase) call prompt('clockwise rotation?',iclockwise) endif end select case(18) prompt_for_gamma = .true. call prompt('is it a wind (instead of accretion)?',is_wind) call prompt('enter mass of central object',Mstar,0.) call prompt('do you want a relativistic solution?',relativistic) if (.not.relativistic) then prompt_for_gamma = .false. call prompt('enter Parker/Bondi critical radius (rcrit)',const1) call prompt('enter density at critical radius (rhocrit)',const2) elseif (relativistic) then call prompt('is it the geodesic flow?',geodesic_flow) if (geodesic_flow) then const1 = 1. const2 = 1.e-9 call prompt('enter constant den0',const1,min=0.) call prompt('enter constant en0 ',const2,min=0.) else call prompt('enter the critical radius in units of the central mass M',const1,min=2.) const1 = const1*Mstar const2 = 1. call prompt('enter adiabat (entropy normalisation)',const2,min=0.) endif endif end select if (prompt_for_gamma) then call prompt('set adiabatic gamma manually? (no=read from dumps)',use_gamma_exact) if (use_gamma_exact) then call prompt('enter gamma',gamma_exact) endif endif call prompt('plot 2nd solution with different gamma?',use_gamma2_exact) if (use_gamma2_exact) then call prompt('enter gamma for the second solution',gamma2_exact) endif end subroutine submenu_exact !--------------------------------------------------- ! return number of exact solutions being plotted !--------------------------------------------------- integer function get_nexact(iexact) result(nexact) integer, intent(in) :: iexact select case(iexact) case(2) nexact = nfiles case(1) nexact = nfunc case default nexact = 1 end select end function get_nexact !--------------------------------------------------- ! sets options relating to exact solution plotting !--------------------------------------------------- subroutine options_exact(iexact) use prompting, only:prompt use plotlib, only:plotlib_maxlinestyle,plotlib_maxlinecolour integer, intent(in) :: iexact character(len=12) :: string integer :: nexact,i call prompt('enter number of exact solution points ',maxexactpts,10,1000000) nexact = get_nexact(iexact) string = '' do i=1,nexact if (nexact > 1) write(string,"(a,i2)") 'for line ',i call prompt('enter line colour '//trim(string),iExactLineColour(i),0,plotlib_maxlinecolour) enddo do i=1,nexact if (nexact > 1) write(string,"(a,i2)") 'for line ',i call prompt('enter line style '//trim(string),iExactLineStyle(i),1,plotlib_maxlinestyle) enddo call prompt('Plot exact solution under data (default is over)? ',iPlotExactUnder) call prompt('Enter opacity for exact solution lines',ExactAlpha,0.0,1.0) do i=1,nexact call prompt('enter text to display in legend (blank=do not show)',ExactLegendText(i)) enddo call prompt('calculate error norms?',iCalculateExactErrors) if (iCalculateExactErrors) then print "(/,' 0 : not normalised L1 = 1/N \sum |y - y_exact|',/,"// & "' 1 : normalised L1 = 1/N 1/max(y_exact) \sum |y - y_exact|')" call prompt('enter choice of error norm',iNormaliseErrors) endif if (iCalculateExactErrors) then call prompt('plot residuals (as inset in main plot)?',iPlotResiduals) if (iPlotResiduals) then call prompt('enter fraction of plot to use for inset', & fracinsetResiduals,0.1,0.9) call prompt('enter max residual (0 for adaptive)',residualmax,0.) endif endif print "(/,' 0 : plot exact solution (where available) on every panel ',/,"// & "' -1 : plot exact solution on first row only ',/,"// & "' -2 : plot exact solution on first column only ',/,"// & "' n : plot exact solution on nth panel only ')" call prompt('Enter selection ',iPlotExactOnlyOnPanel,-2) end subroutine options_exact !----------------------------------------------------------------------- ! read exact solution parameters from files ! (in ndspmhd these files are used in the input to the code) ! ! called after main data read and if exact solution chosen from menu !----------------------------------------------------------------------- subroutine read_exactparams(iexact,rootname,ierr) use settings_data, only:ndim,iverbose use prompting, only:prompt use exactfunction, only:check_function use filenames, only:fileprefix,ifileopen use asciiutils, only:read_asciifile,get_line_containing,read_var_from_file integer, intent(in) :: iexact character(len=*), intent(in) :: rootname integer, intent(out) :: ierr integer :: idash,nf,i,j,idrag,idum,linenum,k,ieq,ierrs(6),narmsread,nfiles_got character(len=len_trim(rootname)+8) :: filename character(len=120) :: line character(len=30) :: var logical :: iexist idash = index(rootname,'_',back=.true.) if (idash==0) idash = len_trim(rootname)+1 select case(iexact) case(1) ! !--read functions from file ! filename=trim(rootname)//'.func' call read_asciifile(trim(filename),nf,funcstring,ierr) if (ierr==-1) then if (iverbose > 0) write(*,"(a)",advance='no') ' no file '//trim(filename)//'; ' filename = trim(fileprefix)//'.func' call read_asciifile(trim(filename),nf,funcstring,ierr) if (ierr==-1) then if (iverbose > 0) print "(a)",' no file '//trim(filename) return endif endif if (nf > 0) then i = 0 do while(i < nf) i = i + 1 call check_function(funcstring(i),ierr,verbose=.false.) if (ierr /= 0) then print "(a)",' error parsing function '//trim(funcstring(i))//', skipping...' do j=i+1,nf funcstring(j-1) = funcstring(j) enddo funcstring(nf) = ' ' nf = nf - 1 i = i - 1 endif enddo nfunc = nf if (iverbose > 0) print "(a,i2,a)",' read ',nfunc,' functions from '//trim(filename) else print "(a)",' *** NO FUNCTIONS READ: none will be plotted ***' ierr = 2 endif case(2) filename = trim(fileprefix)//'.exactfiles' call read_asciifile(trim(filename),nfiles_got,filename_exact,ierr) if (ierr==-1 .and. nfiles_got <= 0 .and. len_trim(filename_exact(1))==0) then ! look in .setup file only if no filenames set if (iverbose > 1) print "(a)",' no file '//trim(filename) ! ! if no .exactfiles, see if the phantom .setup file exists ! and have a look for "outputfilename" ! filename = trim(rootname(1:idash-1))//'.setup' call read_var_from_file('outputfilename',filename_exact(1),filename,ierr) if (ierr == 0) then nfiles = 1 else ! ! failing this, have a look for a .profile file ! filename = trim(rootname(1:idash-1))//'.profile' inquire(file=filename,exist=iexist) if (iexist) then filename_exact(1) = filename nfiles = 1 ierr = 0 endif endif return elseif (nfiles_got > 0) then nfiles = nfiles_got endif case(3,13) ! !--shock tube parameters from .shk file ! filename = trim(rootname(1:idash-1))//'.shk' inquire(file=filename,exist=iexist) if (iexist) then open(unit=19,file=filename,status='old',iostat=ierr) if (ierr==0) then read(19,*,iostat=ierrs(1)) rho_L, rho_R read(19,*,iostat=ierrs(2)) pr_L, pr_R read(19,*,iostat=ierrs(3)) v_L, v_R if (any(ierrs(1:3)/=0)) then print*,'error reading ',filename ierr = 1 endif endif close(unit=19) else print*,'no file ',filename ! ! look for .setup file for Phantom ! filename= trim(rootname(1:idash-1))//'.setup' inquire(file=filename,exist=iexist) open(unit=19,file=filename,status='old',iostat=ierr) ierrs(:) = 0 do while(ierr==0) read(19,"(a)",iostat=ierr) line ieq = index(line,'=') if (ierr==0 .and. ieq > 1) then var = trim(adjustl(line(1:ieq-1))) select case(trim(var)) case('densleft') read(line(ieq+1:),*,iostat=ierrs(1)) rho_L case('densright') read(line(ieq+1:),*,iostat=ierrs(1)) rho_R case('prleft') read(line(ieq+1:),*,iostat=ierrs(1)) pr_L case('prright') read(line(ieq+1:),*,iostat=ierrs(1)) pr_R case('vxleft') read(line(ieq+1:),*,iostat=ierrs(1)) v_L case('vxright') read(line(ieq+1:),*,iostat=ierrs(1)) v_R case('dtg') read(line(ieq+1:),*,iostat=ierrs(1)) rdust_to_gas end select endif enddo ierr = 0 if (.not.iexist .or. any(ierrs(1:6)/=0)) ierr = 1 endif if (iexist) then print*,'>> read ',filename print*,' rhoL, rho_R = ',rho_L,rho_R print*,' pr_L, pr_R = ',pr_L, pr_R print*,' v_L, v_R = ',v_L, v_R endif case(6) ! !--read toy star file for toy star solution ! select case(ndim) case(1) filename = trim(rootname(1:idash-1))//'.tstar' open(unit=20,ERR=8801,FILE=filename,STATUS='old') read(20,*,ERR=8888) Htstar,Ctstar,Atstar read(20,*,ERR=8888) sigma0 read(20,*,ERR=8888) norder close(UNIT=20) print*,' >> read ',filename print*,' H,C,A,sigma,n = ',Htstar,Ctstar,Atstar,sigma0,norder return 8801 continue print*,'no file ',filename ierr = 1 return 8888 print*,'error reading ',filename close(UNIT=20) ierr = 2 return case(2) filename = trim(rootname(1:idash-1))//'.tstar2D' open(unit=20,ERR=9901,FILE=filename,STATUS='old') read(20,*,ERR=9902) Htstar,Ctstar,Atstar read(20,*,ERR=9902) alphatstar,betatstar,ctstar1,ctstar2 read(20,*,ERR=9902) norder,morder close(UNIT=20) print*,' >> read ',filename print*,' j,m = ',norder,morder print*,' rho_0 = ',Htstar,' - ',Ctstar,' r^2' if (norder >= 0 .and. morder >= 0) then print*,' v = ',Atstar,' r' else print*,' vx = ',alphatstar,'x +',ctstar1,'y' print*,' vy = ',ctstar2,'x +',betatstar,'y' endif return 9901 continue print*,'no file ',filename ierr = 1 return 9902 print*,'error reading ',filename close(UNIT=20) ierr = 2 return end select case(8) ! !--attempt to guess which MHD shock tube has been done from filename ! !read(rootname(5:5),*,iostat=ios) ishk !if (ios /= 0) ishk = 1 ! !--prompt for shock type if not set ! if (ishk <= 0) then ! prompt ishk = 1 call prompt('enter shock solution to plot',ishk,1,7) endif return case(14) ! !--dustywave parameters from ndspmhd or Phantom input file ! filename = trim(rootname(1:idash-1))//'.in' var = 'Kdrag' !ndspmhd linenum = get_line_containing(filename,trim(var)) if (linenum==0) then var = 'K_code' !phantom linenum = get_line_containing(filename,trim(var)) endif open(unit=19,file=filename,status='old',iostat=ierr) if (ierr==0) then do i=1,linenum-1 read(19,*,iostat=ierr) enddo read(19,"(a)",iostat=ierr) line if (ierr==0) then k = index(line,trim(var)) if (k > 0) read(line(k+len_trim(var)+2:),*,iostat=ierr) Kdrag if (ierr==0) then print*,'>> read '//trim(var)//' = ',Kdrag,' from '//trim(filename) else read(line,*,iostat=ierr) idrag, idum, idum, Kdrag if (ierr==0) then print*,'>> read '//trim(var)//' = ',Kdrag,' from old-style '//trim(filename) else print*,'>> error reading Kdrag from '//trim(filename) endif endif else print*,'>> error reading Kdrag from '//trim(filename) endif endif close(unit=19) return case(17) ! !--spiral arm parameters from .spirals file ! select case(ispiral) case(2) filename=trim(rootname)//'.spirals' narmsread = 0 call read_asciifile(trim(filename),narmsread,spiral_params,ierr) if (ierr==-1) then if (iverbose > 0) write(*,"(a)",advance='no') ' no file '//trim(filename)//'; ' filename = trim(fileprefix)//'.spirals' call read_asciifile(trim(filename),narmsread,spiral_params,ierr) if (ierr==-1) then if (iverbose > 0) print "(a)",' no file '//trim(filename) else if (iverbose > 0) print*,trim(filename)//' read ',narmsread,' arms, err = ',ierr if (narmsread >= 0) narms = narmsread endif else if (iverbose > 0) print*,trim(filename)//' read ',narmsread,' arms, err = ',ierr narms = max(narmsread,0) endif case default if (ifileopen > 0 .and. iread_wakeparams) call get_planetdisc_parameters_from_data(rplanet,HonR,q_index,phase,ierr) end select end select end subroutine read_exactparams !----------------------------------------------------------------------- ! subroutine to automatically extract parameters needed for ! planet wake exact solution from the data !----------------------------------------------------------------------- subroutine get_planetdisc_parameters_from_data(rp,HR,q,angle,ierr) use physcon, only:pi use filenames, only:ifileopen use settings_data, only:ntypes,ndim,ndimV,ncolumns use particle_data, only:headervals,dat,iamtype,npartoftype use part_utils, only:locate_nth_particle_of_type,get_binary use labels, only:get_sink_type,ix,ivx,ipmass,headertags use asciiutils, only:get_value use system_utils, only:ienvlist real, intent(inout) :: rp,HR,q,angle integer, intent(out) :: ierr integer :: isinklist(2),isink1,isink2,itype,j,ntot logical :: got_sinks real :: x0(3),v0(3),domega,omega,polyk,cs ! do nothing if there is no data j = 1 ! use first data in memory if (ifileopen <= 0) return if (size(npartoftype(1,:)) < j) return ! either use --wake to get which planet, or --corotate isinklist = ienvlist('SPLASH_WAKE',2) if (all(isinklist==0)) isinklist = ienvlist('SPLASH_COROTATE',2) if (all(isinklist==0)) isinklist = (/1,2/) itype = get_sink_type(ntypes) got_sinks = .false. if (itype > 0) got_sinks = all(isinklist > 0) .and. (npartoftype(itype,j) > 0) if (got_sinks .and. all(ix > 0)) then call locate_nth_particle_of_type(isinklist(1),isink1,itype,iamtype(:,j),npartoftype(:,j),ntot) call locate_nth_particle_of_type(isinklist(2),isink2,itype,iamtype(:,j),npartoftype(:,j),ntot) call get_binary(isink1,isink2,dat(:,:,j),x0,v0,angle,domega,ndim,ndimV,ncolumns,ix,ivx,ipmass,0,ierr) if (ierr /= 0) return ! phase angle for planet angle = -angle*180./pi ! convert to degrees ! radial location of planet rp = norm2(dat(isink2,ix(:),j) - x0) ! power law index of sound speed profile, if found in file header q = get_value('qfacdisc',headertags,headervals(:,j)) if (q <= 0.) q = q_index ! revert to previous value if not read ! disc scale height, convert to aspect ratio polyk = 2./3.*get_value('RK2',headertags,headervals(:,j)) ! polytropic K cs = sqrt(polyk*(rp**2)**(-q)) ! sound speed in code units omega = sqrt(dat(isink1,ipmass,j)/rp**3) ! Keplerian speed HR = (cs/omega)/rp ! pressure scale height if (HR < 0.001 .or. HR > 0.5) HR = HonR ! do not grab stupid numbers ! report results print "(4(a,g10.3))",' planet wake parameters: rp is ',rp,' phase is ',angle,' q is ',q,' HonR is ',HR endif end subroutine get_planetdisc_parameters_from_data !----------------------------------------------------------------------- ! subroutine to set parameters needed for Roche lobe plotting !----------------------------------------------------------------------- subroutine exact_set_rocheparam(m1,m2,x1,y1,x2,y2) real, intent(in) :: m1,m2,x1,y1,x2,y2 mprim = m1 msec = m2 xprim(1) = x1 xprim(2) = y1 xsec(1) = x2 xsec(2) = y2 end subroutine exact_set_rocheparam !----------------------------------------------------------------------- ! this subroutine drives the exact solution plotting using the ! parameters which have been set ! ! acts as an interface between the main plotting loop and the ! exact solution calculation subroutines ! ! The exact solution is returned from the calculation via the arrays ! xexact and yexact. This means that the appropriate transformations ! can be applied (e.g. if the graph is logarithmic) and also ensures ! that the line style and colour settings are applied properly. ! ! Note that we attempt to space the solution evenly in the transformed ! space (ie. in the current plot window), but this can be overwritten ! in the subroutines (for example if an uneven sampling is desired or ! the plotting is via some similarity variable as in the Sedov solution). ! In these cases the resulting arrays are then transformed, possibly leading ! to poor sampling in some regions (e.g. an evenly spaced array will become ! highly uneven in logarithmic space). ! ! Note that any subroutine could in principle do its own plotting, ! provided that it returns ierr > 0 which means that the generic line ! is not plotted. Obviously transformations could not be applied in ! this case. ! !----------------------------------------------------------------------- subroutine exact_solution(iexact,iplotx,iploty,itransx,itransy,igeom, & ndim,ndimV,time,xmin,xmax,gamma,xplot,yplot,& itag,iamtype,noftype,iplot_type, & pmassmin,pmassmax,npart,imarker,unitsx,unitsy,irescale,iaxisy) use params, only:int1,maxparttypes use settings_data, only:ncolumns,ncalc use labels, only:ix,irad,iBfirst,ivx,irho,ike,iutherm,ih,ipr,iJfirst,& irhorestframe,is_coord,ideltav,idustfrac,label use filenames, only:ifileopen,rootname use asciiutils, only:string_replace,match_integer use prompting, only:prompt use exactfromfile, only:exact_fromfile use mhdshock, only:exact_mhdshock use polytrope, only:exact_polytrope use rhoh, only:exact_rhoh use sedov, only:exact_sedov use shock, only:exact_shock use shock_sr, only:exact_shock_sr use torus, only:exact_torus use toystar1D, only:exact_toystar1D !, exact_toystar_ACplane use toystar2D, only:exact_toystar2D use wave, only:exact_wave use densityprofiles, only:exact_densityprofiles use exactfunction, only:exact_function use ringspread, only:exact_ringspread use dustywaves, only:exact_dustywave use rochelobe, only:exact_rochelobe use gresho, only:exact_gresho use Cshock, only:exact_Cshock use planetdisc, only:exact_planetdisc use bondi, only:exact_bondi use transforms, only:transform,transform_inverse use map_columns, only:map_columns_in_file use plotlib, only:plot_qci,plot_qls,plot_sci,plot_sls,plot_line,plotlib_maxlinestyle,plot_set_opacity integer, intent(in) :: iexact,iplotx,iploty,itransx,itransy,igeom integer, intent(in) :: ndim,ndimV,npart,imarker,iaxisy real, intent(in) :: time,xmin,xmax,gamma,unitsx,unitsy real, intent(in) :: pmassmin,pmassmax real, intent(in) :: xplot(npart),yplot(npart) integer, intent(in) :: itag(npart) integer(int1), intent(in) :: iamtype(:) integer, intent(in) :: noftype(maxparttypes) logical, intent(in) :: iplot_type(maxparttypes) logical, intent(in) :: irescale integer :: mytransx,mytransy,imapx,imapy real, parameter :: zero = 1.e-10 integer :: i,ierr,iexactpts,iCurrentColour,iCurrentLineStyle,LineStyle integer :: ncols,nrows,nlab_exact,nsh real, allocatable :: xexact(:),yexact(:),xtemp(:) real :: dx,timei,gammai character(len=len(filename_exact)) :: filename_tmp ! !--change line style and colour settings, but save old ones ! call plot_qci(iCurrentColour) call plot_qls(iCurrentLineStyle) call plot_sci(iExactLineColour(1)) call plot_sls(iExactLineStyle(1)) call plot_set_opacity(ExactAlpha) ! !--get exact solution parameters from code input files, if present ! if (ifileopen > 0) call read_exactparams(iexact,rootname(ifileopen),ierr) ! !--allocate memory ! allocate(xexact(maxexactpts),yexact(maxexactpts),xtemp(maxexactpts),stat=ierr) if (ierr /= 0) then print "(a)",'*** ERROR allocating memory for exact solution plotting, skipping ***' if (allocated(xexact)) deallocate(xexact) if (allocated(yexact)) deallocate(yexact) if (allocated(xtemp)) deallocate(xtemp) return endif ! !--set x axis (can be overwritten) ! Need to space x in transformed space (e.g. in log space) ! but send the values of x in *real* space to the calculation routines ! then need to plot x in transformed space ! ! Best solution is to set x grid initially, and inverse transform to get x values. ! These values can then be overwritten, if required in the exact subroutines ! We then re-transform the x array to plot it, which means that if spacing is ! overwritten the resulting array can still be transformed into log space ! but spacing will not be even ! !--note that xmin and xmax will already have been transformed prior to input ! as these were the limits used for plotting the particles ! dx = (xmax - xmin)/real(maxexactpts) do i=1,maxexactpts xexact(i) = xmin + (i-1)*dx enddo xtemp = xexact if (itransx > 0) call transform_inverse(xexact,itransx) iexactpts = maxexactpts ! !--exact solution plots must return a zero or negative value of ierr to be plotted ! (-ve ierr indicates a partial solution) ! ierr = 666 ! !--use time=0 if time has not been read from dump file (indicated by t < 0) ! if (time > 0) then timei = time else timei = 0. endif if (use_gamma_exact .and. gamma_exact >= 1.) then gammai = gamma_exact elseif (gamma >= 1.) then gammai = gamma else gammai = 5./3. endif select case(iexact) case(1) ! arbitrary function parsing do i=1,nfunc if ((iplotx==iexactplotx(i) .and. iploty==iexactploty(i)) .or. iexactploty(i)==0) then !--allow user-specified colours and line styles LineStyle = mod(iExactLineStyle(i),plotlib_maxlinestyle) call exact_function(funcstring(i),xexact,yexact,timei,ierr) !--plot each solution separately and calculate errors call plot_exact_solution(itransx,itransy,iexactpts,npart,xexact,yexact,xplot,yplot, & itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy,& ls=LineStyle,lc=iExactLineColour(i)) ierr = 1 ! indicate that we have already plotted the solution endif enddo case(2) ! exact solution read from file do i=1,nfiles !--substitute %f for filename filename_tmp = filename_exact(i) call string_replace(filename_tmp,'%f',trim(rootname(ifileopen))) !--auto-magically map columns onto splash columns (if not mapped manually) if (iauto_map_columns) then call map_columns_in_file(filename_tmp,ncols,nrows,imapexact,& label(1:ncolumns+ncalc),exact_labels,nlab_exact,ierr) endif ! see if there are columns in the exact file that match those of the current plot imapx = match_integer(imapexact,iplotx) imapy = match_integer(imapexact,iploty) ! if so, go ahead and read the data and plot the exact solution if (imapx > 0 .and. imapy > 0) then !--read exact solution from file print "(a)",'> reading '//trim(exact_labels(imapx))//' and '//trim(exact_labels(imapy))//' from '//trim(filename_tmp) call exact_fromfile(filename_tmp,xexact,yexact,imapx,imapy,iexactpts,ierr) ! if everything has been done automatically, try to guess whether ! the solution is in code units or physical units if (iRescale .and. iauto_map_columns) then iApplyUnitsExactFile = guess_whether_to_apply_units_to_exact(xplot,yplot,xexact,yexact,unitsx,unitsy) endif !--plot this untransformed (as may already be in log space) if (ierr <= 0) then if (iApplyTransExactFile) then !--change into physical units if appropriate if (iRescale .and. iApplyUnitsExactFile) then xexact(1:iexactpts) = xexact(1:iexactpts)*unitsx yexact(1:iexactpts) = yexact(1:iexactpts)*unitsy endif endif !--change line style between files LineStyle = mod(iExactLineStyle(i),plotlib_maxlinestyle) !--do not apply log or other transformations if option set for this ! or if the label starts with 'log'... mytransy = get_transform(itransy,iApplyTransExactFile,exact_labels(imapy)(1:3)) mytransx = get_transform(itransx,iApplyTransExactFile,exact_labels(imapx)(1:3)) !--plot each solution separately and calculate errors call plot_exact_solution(mytransx,mytransy,iexactpts,npart,xexact,yexact,xplot,yplot,& itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy,& ls=LineStyle,lc=iExactLineColour(i)) ierr = 1 ! indicate that we have already plotted the solution endif else ! if nothing matched, make sure we do not plot anything ierr = 2 endif enddo case(3)! shock tube if (iplotx==ix(1) .and. igeom <= 1) then nsh = 1 if (use_gamma2_exact) nsh = 2 do i=1,nsh ! make 2 to plot both adiabatic and isothermal solutions if (i==2) then call plot_sls(4) gammai = gamma2_exact endif if (iploty==irho) then call exact_shock(1,timei,gammai,xshock,rho_L,rho_R,pr_L,pr_R,v_L,v_R, & rdust_to_gas,xexact,yexact,ierr) elseif (iploty==ipr) then call exact_shock(2,timei,gammai,xshock,rho_L,rho_R,pr_L,pr_R,v_L,v_R, & rdust_to_gas,xexact,yexact,ierr) elseif (iploty==ivx) then call exact_shock(3,timei,gammai,xshock,rho_L,rho_R,pr_L,pr_R,v_L,v_R, & rdust_to_gas,xexact,yexact,ierr) elseif (iploty==iutherm) then call exact_shock(4,timei,gammai,xshock,rho_L,rho_R,pr_L,pr_R,v_L,v_R, & rdust_to_gas,xexact,yexact,ierr) elseif (iploty==ideltav) then call exact_shock(5,timei,gammai,xshock,rho_L,rho_R,pr_L,pr_R,v_L,v_R, & rdust_to_gas,xexact,yexact,ierr) elseif (iploty==idustfrac) then call exact_shock(6,timei,gammai,xshock,rho_L,rho_R,pr_L,pr_R,v_L,v_R, & rdust_to_gas,xexact,yexact,ierr) endif if (i==1 .and. ierr==0) call plot_line(iexactpts,xexact,yexact) enddo endif case(4)! sedov blast wave ! this subroutine does change xexact if (iplotx==irad .or. (igeom==3 .and. iplotx==ix(1))) then if (iploty==irho) then call exact_sedov(1,timei,gammai,rhosedov,esedov,xmax,xexact,yexact,ierr) elseif (iploty==ipr) then call exact_sedov(2,timei,gammai,rhosedov,esedov,xmax,xexact,yexact,ierr) elseif (iploty==iutherm) then call exact_sedov(3,timei,gammai,rhosedov,esedov,xmax,xexact,yexact,ierr) elseif (iploty==ike) then call exact_sedov(4,timei,gammai,rhosedov,esedov,xmax,xexact,yexact,ierr) elseif (iploty==ivx .and. igeom==3) then call exact_sedov(5,timei,gammai,rhosedov,esedov,xmax,xexact,yexact,ierr) endif elseif (igeom <= 1 .and. is_coord(iplotx,ndim) .and. is_coord(iploty,ndim)) then call exact_sedov(0,timei,gammai,rhosedov,esedov,xmax,xexact,yexact,ierr) endif case(5)! polytrope if (iploty==irho .and. (iplotx==irad .or.(igeom==3 .and. iplotx==ix(1)))) then call exact_polytrope(gammai,polyk,totmass,xexact,yexact,iexactpts,ierr) endif case(6)! toy star if (iBfirst /= 0) then sigma = sigma0 else sigma = 0. endif if (ndim==1) then ! !--1D toy star solutions ! if (iplotx==ix(1) .or. iplotx==irad) then! if x axis is x or r if (iploty==irho) then call exact_toystar1D(1,timei,gammai,htstar,atstar,ctstar,sigma,norder, & xexact,yexact,iexactpts,ierr) elseif (iploty==ipr) then call exact_toystar1D(2,timei,gammai,htstar,atstar,ctstar,sigma,norder, & xexact,yexact,iexactpts,ierr) elseif (iploty==iutherm) then call exact_toystar1D(3,timei,gammai,htstar,atstar,ctstar,sigma,norder, & xexact,yexact,iexactpts,ierr) elseif (iploty==ivx) then call exact_toystar1D(4,timei,gammai,htstar,atstar,ctstar,sigma,norder, & xexact,yexact,iexactpts,ierr) elseif (iploty==iBfirst+1) then call exact_toystar1D(5,timei,gammai,htstar,atstar,ctstar,sigma,norder, & xexact,yexact,iexactpts,ierr) endif elseif (iplotx==irho) then if (iploty==iBfirst+1) then call exact_toystar1D(6,timei,gammai,htstar,atstar,ctstar,sigma,norder, & xexact,yexact,iexactpts,ierr) endif endif if (iploty==iacplane) then! plot point on a-c plane call exact_toystar1D(7,timei,gammai,htstar,atstar,ctstar,sigma,norder, & xexact,yexact,iexactpts,ierr) endif else ! !--2D toy star solutions ! these routines change xexact ! if (igeom==1 .and.((iplotx==ix(1) .and. iploty==ivx) & .or. (iplotx==ix(2) .and. iploty==ivx+1))) then call exact_toystar2D(4,timei,gammai,polyk,totmass, & atstar,htstar,ctstar,norder,morder, & alphatstar,betatstar,ctstar1,ctstar2,xexact,yexact,ierr) endif if (iplotx==irad .or. (igeom==2 .and. iplotx==ix(1))) then if (iploty==irho) then call exact_toystar2D(1,timei,gammai,polyk,totmass, & atstar,htstar,ctstar,norder,morder, & alphatstar,betatstar,ctstar1,ctstar2,xexact,yexact,ierr) elseif (iploty==ipr) then call exact_toystar2D(2,timei,gammai,polyk,totmass, & atstar,htstar,ctstar,norder,morder, & alphatstar,betatstar,ctstar1,ctstar2,xexact,yexact,ierr) elseif (iploty==iutherm) then call exact_toystar2D(3,timei,gammai,polyk,totmass, & atstar,htstar,ctstar,norder,morder, & alphatstar,betatstar,ctstar1,ctstar2,xexact,yexact,ierr) elseif (igeom==2 .and. iploty==ivx) then call exact_toystar2D(4,timei,gammai,polyk,totmass, & atstar,htstar,ctstar,norder,morder, & alphatstar,betatstar,ctstar1,ctstar2,xexact,yexact,ierr) elseif (iploty==ike) then call exact_toystar2D(5,timei,gammai,polyk,totmass, & atstar,htstar,ctstar,norder,morder, & alphatstar,betatstar,ctstar1,ctstar2,xexact,yexact,ierr) endif elseif (is_coord(iplotx,ndim) .and. is_coord(iploty,ndim) .and. igeom==1) then call exact_toystar2D(0,timei,gammai,polyk,totmass, & atstar,htstar,ctstar,norder,morder, & alphatstar,betatstar,ctstar1,ctstar2,xexact,yexact,ierr) endif endif case(7)! Gresho vortex !if ((iploty==iwaveploty).and.(iplotx==iwaveplotx)) then ! ymean = SUM(yplot(1:npart))/REAL(npart) ! call exact_wave(timei,ampl,period,lambda,xzero,ymean,xexact,yexact,ierr) !endif if (igeom==2 .and. ndim >= 2) then if (iploty==ivx+1) then call exact_gresho(1,xexact,yexact,ierr) elseif (iploty==ipr) then call exact_gresho(2,xexact,yexact,ierr) endif endif case(8) ! mhd shock tubes ! this subroutine modifies xexact if (iplotx==ix(1) .and. igeom <= 1) then if (iploty==irho) then call exact_mhdshock(1,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==ipr) then call exact_mhdshock(2,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==ivx) then call exact_mhdshock(3,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==ivx+1 .and. ndimV > 1) then call exact_mhdshock(4,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==ivx+ndimV-1 .and. ndimV > 2) then call exact_mhdshock(5,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==iBfirst+1 .and. ndimV > 1) then call exact_mhdshock(6,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==iBfirst+ndimV-1 .and. ndimV > 2) then call exact_mhdshock(7,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==iutherm) then call exact_mhdshock(8,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) elseif (iploty==iBfirst) then call exact_mhdshock(9,ishk,timei,gammai,xmin,xmax,xshock, & xexact,yexact,iexactpts,ierr) endif endif case(9) !--h = (1/rho)^(1/ndim) if (((iploty==ih).and.(iplotx==irho)) .or. & ((iplotx==ih).and.(iploty==irho))) then if (iplotx==ih) then call exact_rhoh(2,ndim,hfact,pmassmin,xexact,yexact,ierr) else call exact_rhoh(1,ndim,hfact,pmassmin,xexact,yexact,ierr) endif !--if variable particle masses, plot one for each pmass value if (abs(pmassmin-pmassmax) > zero .and. pmassmin > zero) then !--plot first line if (ierr <= 0) then xtemp = xexact ! must not transform xexact as this is done again below if (itransx > 0) call transform(xtemp,itransx) if (itransy > 0) call transform(yexact,itransy) call plot_line(iexactpts,xtemp(1:iexactpts),yexact(1:iexactpts)) endif !--leave this one to be plotted below if (iplotx==ih) then call exact_rhoh(2,ndim,hfact,pmassmax,xexact,yexact,ierr) else call exact_rhoh(1,ndim,hfact,pmassmax,xexact,yexact,ierr) endif endif endif case(10) ! density profiles if (iplotx==irad .or.(igeom==3 .and. iplotx==ix(1))) then if (iploty==irho) then call exact_densityprofiles(1,iprofile,Msphere,rsoft,xexact,yexact,ierr) elseif (iploty==icolpoten) then call exact_densityprofiles(2,iprofile,Msphere,rsoft,xexact,yexact,ierr) elseif (iploty==icolfgrav) then call exact_densityprofiles(3,iprofile,Msphere,rsoft,xexact,yexact,ierr) endif endif case(11) ! torus if (iplotx==irad .or.(igeom==3 .and. iplotx==ix(1))) then if (iploty==irho) then call exact_torus(1,1,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) elseif (iploty==ipr) then call exact_torus(2,1,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) elseif (iploty==iutherm) then call exact_torus(3,1,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) endif !--pr vs z at r=Rtorus elseif (igeom==2 .and. iplotx==ix(3) .and.iploty==ipr) then call exact_torus(4,1,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) endif !--solutions for tokamak torus if (igeom==4 .and. iplotx==ix(1)) then if (iploty==irho) then call exact_torus(1,2,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) elseif (iploty==ipr) then call exact_torus(2,2,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) elseif (iploty==iutherm) then call exact_torus(3,2,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) elseif (iploty==iBfirst+1 .and. iBfirst > 0) then call exact_torus(4,2,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) elseif (iploty==iJfirst+2 .and. iJfirst > 0) then call exact_torus(5,2,Mstar,Rtorus,polyk,distortion,gammai,xexact,yexact,ierr) endif endif case(12) if (iplotx==irad .or.((igeom==3 .or. igeom==2) .and. iplotx==ix(1))) then if (iploty==irho) then call exact_ringspread(1,timei,Mring,Rring,viscnu,xexact,yexact,ierr) endif endif case(13) ! special relativistic shock tube if (iplotx==ix(1) .and. igeom <= 1) then if (iploty==irhorestframe) then call exact_shock_sr(1,timei,gammai,rho_L,rho_R,pr_L,pr_R,v_L,v_R,xexact,yexact,ierr) elseif (iploty==ipr) then call exact_shock_sr(2,timei,gammai,rho_L,rho_R,pr_L,pr_R,v_L,v_R,xexact,yexact,ierr) elseif (iploty==ivx) then call exact_shock_sr(3,timei,gammai,rho_L,rho_R,pr_L,pr_R,v_L,v_R,xexact,yexact,ierr) elseif (iploty==iutherm) then call exact_shock_sr(4,timei,gammai,rho_L,rho_R,pr_L,pr_R,v_L,v_R,xexact,yexact,ierr) elseif (iploty==irho) then call exact_shock_sr(5,timei,gammai,rho_L,rho_R,pr_L,pr_R,v_L,v_R,xexact,yexact,ierr) endif endif case(14) ! dusty wave exact solution if (iplotx==ix(1) .and. igeom <= 1) then if (iploty==ivx) then !--plot gas solution and calculate errors call exact_dustywave(1,timei,ampl,cs,Kdrag,lambda,xzero,rhozero,rhozero*rdust_to_gas,xexact,yexact,ierr) call plot_exact_solution(itransx,itransy,iexactpts,npart,xexact,yexact,xplot,yplot, & itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy,ls=1,matchtype=1) !--plot dust solution if (Kdrag > 0.) then call exact_dustywave(2,timei,ampl,cs,Kdrag,lambda,xzero,rhozero,rhozero*rdust_to_gas,xexact,yexact,ierr) call plot_exact_solution(itransx,itransy,iexactpts,npart,xexact,yexact,xplot,yplot, & itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy,ls=2,matchtype=2) endif ierr = 1 elseif (iploty==irho) then !--plot gas solution and calculate errors call exact_dustywave(3,timei,ampl,cs,Kdrag,lambda,xzero,rhozero,rhozero*rdust_to_gas,xexact,yexact,ierr) call plot_exact_solution(itransx,itransy,iexactpts,npart,xexact,yexact,xplot,yplot,& itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy,ls=1,matchtype=1) !--plot dust solution if (Kdrag > 0.) then call exact_dustywave(4,timei,ampl,cs,Kdrag,lambda,xzero,rhozero,rhozero*rdust_to_gas,xexact,yexact,ierr) call plot_exact_solution(itransx,itransy,iexactpts,npart,xexact,yexact,xplot,yplot,& itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy,ls=2,matchtype=2) endif ierr = 1 endif endif case(15) ! Roche potential if (igeom==1 .and. ndim >= 2 .and. iplotx==ix(1) .and. iploty==ix(2)) then call exact_rochelobe(xprim(1),xprim(2),xsec(1),xsec(2),mprim,msec,xexact,yexact,ierr) endif case(16) ! C-shock if (ndim >= 1 .and. iplotx==ix(1) .and. igeom <= 1) then if (iploty==irho) then call exact_Cshock(1,timei,gammai,machs,macha,xmin,xmax,xexact,yexact,ierr) elseif (iploty==iBfirst+1 .and. iBfirst > 0) then call exact_Cshock(2,timei,gammai,machs,macha,xmin,xmax,xexact,yexact,ierr) elseif (iploty==ivx) then call exact_Cshock(3,timei,gammai,machs,macha,xmin,xmax,xexact,yexact,ierr) elseif (iploty==ivx+1 .and. ndimV > 1) then call exact_Cshock(4,timei,gammai,machs,macha,xmin,xmax,xexact,yexact,ierr) elseif (iploty==iBfirst .and. iBfirst > 0) then call exact_Cshock(5,timei,gammai,machs,macha,xmin,xmax,xexact,yexact,ierr) endif endif case(17) ! planet-disc interaction if (ndim >= 2 .and. iplotx==ix(1) .and. iploty==ix(2)) then call exact_planetdisc(igeom,ispiral,iclockwise,timei,HonR,rplanet,q_index,phase,narms,& spiral_params,xexact,yexact,ierr) endif case(18) if (iplotx==irad .or. (igeom==3 .and. iplotx==ix(1))) then if (iploty==ivx .and. igeom==3) then call exact_bondi(1,timei,gammai,const1,const2,Mstar,relativistic,geodesic_flow,is_wind,xexact,yexact,ierr) elseif (iploty==iutherm .and. igeom==3) then call exact_bondi(2,timei,gammai,const1,const2,Mstar,relativistic,geodesic_flow,is_wind,xexact,yexact,ierr) elseif (iploty==irho .and. igeom==3) then call exact_bondi(3,timei,gammai,const1,const2,Mstar,relativistic,geodesic_flow,is_wind,xexact,yexact,ierr) endif endif end select !---------------------------------------------------------- ! plot this as a line on the current graph !---------------------------------------------------------- if (ierr <= 0) call plot_exact_solution(itransx,itransy,iexactpts,npart,xexact,yexact,xplot,yplot, & itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy) ! !--reset line and colour settings ! call plot_sci(iCurrentColour) call plot_sls(iCurrentLineStyle) call plot_set_opacity(1.0) ! !--deallocate memory ! if (allocated(xexact)) deallocate(xexact) if (allocated(yexact)) deallocate(yexact) if (allocated(xtemp)) deallocate(xtemp) end subroutine exact_solution !------------------------------------------------------------------ ! try to figure out how to correctly transform the exact solution !------------------------------------------------------------------ integer function get_transform(itrans,apply_trans,label_start) result(mytrans) use transforms, only:islogged use asciiutils, only:lcase integer, intent(in) :: itrans logical, intent(in) :: apply_trans character(len=3), intent(in) :: label_start ! by default, the data transformation is also applied to the exact solution mytrans = itrans ! disable this if the flag to switch it off is set if (.not.apply_trans) mytrans = 0 if (lcase(label_start)=='log') then if (islogged(itrans)) then ! disable exact solution transform if solution is already logged mytrans = 0 else ! if exact solution is logged but data isn't, apply inverse transform mytrans = -1 endif endif end function get_transform !------------------------------------------------------------------ ! try to figure out how to correctly transform the exact solution !------------------------------------------------------------------ logical function guess_whether_to_apply_units_to_exact(xplot,yplot,xexact,yexact,unitsx,unitsy) real, intent(in) :: xplot(:),yplot(:),xexact(:),yexact(:) real, intent(in) :: unitsx,unitsy real :: range_xplot, range_yplot real :: range_xexact_no_units, range_yexact_no_units real :: range_xexact_with_units, range_yexact_with_units ! Calculate ranges for xplot and yplot range_xplot = maxval(xplot) - minval(xplot) range_yplot = maxval(yplot) - minval(yplot) ! Calculate ranges for xexact and yexact without applying units range_xexact_no_units = maxval(xexact) - minval(xexact) range_yexact_no_units = maxval(yexact) - minval(yexact) ! Calculate ranges for xexact and yexact with applying units range_xexact_with_units = maxval(xexact * unitsx) - minval(xexact * unitsx) range_yexact_with_units = maxval(yexact * unitsy) - minval(yexact * unitsy) ! Determine if applying units results in a closer range to xplot and yplot ! that is at least an order of magnitude closer in one of the axes if (abs(range_xexact_with_units - range_xplot) < 10.*abs(range_xexact_no_units - range_xplot) .or. & abs(range_yexact_with_units - range_yplot) < 10.*abs(range_yexact_no_units - range_yplot)) then guess_whether_to_apply_units_to_exact = .true. else guess_whether_to_apply_units_to_exact = .false. endif end function guess_whether_to_apply_units_to_exact !------------------------------------------------------------------ ! Wrapper routine to plot the exact solution line on current graph ! and calculate errors with respect to the data !------------------------------------------------------------------ subroutine plot_exact_solution(itransx,itransy,iexactpts,np,xexact,yexact,xplot,yplot,& itag,iamtype,noftype,iplot_type,xmin,xmax,imarker,iaxisy,& ls,lc,matchtype,err) use transforms, only:transform,transform_inverse use plotlib, only:plot_line,plot_sls,plot_sci,plot_qci,plot_set_opacity use params, only:int1,maxparttypes integer, intent(in) :: itransx,itransy,iexactpts,np,imarker,iaxisy real, intent(inout) :: xexact(:),yexact(:) real, intent(in) :: xplot(:),yplot(:),xmin,xmax integer, intent(in) :: itag(:) integer(int1), intent(in) :: iamtype(:) integer, intent(in) :: noftype(maxparttypes) logical, intent(in) :: iplot_type(maxparttypes) integer, intent(in), optional :: ls, matchtype, lc logical, intent(in), optional :: err real :: residuals(np),ypart(np) real :: errL1,errL2,errLinf integer :: iused,ierr,iCurrentColour,imatchtype logical :: plot_err character(len=12) :: str1,str2 call plot_qci(iCurrentColour) if (present(lc)) call plot_sci(lc) call plot_set_opacity(ExactAlpha) if (itransx /= 0) call transform(xexact(1:iexactpts),itransx) if (itransy /= 0) call transform(yexact(1:iexactpts),itransy) if (present(ls)) call plot_sls(ls) call plot_line(iexactpts,xexact(1:iexactpts),yexact(1:iexactpts)) ! !--calculate errors ! if (present(err)) then plot_err = err else plot_err = .true. endif if (present(matchtype)) then imatchtype = matchtype else imatchtype = 0 endif if (iCalculateExactErrors .and. plot_err) then !--untransform y axis again for error calculation if (itransy /= 0) call transform_inverse(yexact(1:iexactpts),itransy) !--untransform particle y axis also ypart(1:np) = yplot(1:np) if (itransy /= 0) call transform_inverse(ypart(1:np),itransy) !--calculate errors call calculate_errors(xexact(1:iexactpts),yexact(1:iexactpts),xplot(1:np),ypart,& itag,iamtype,noftype,iplot_type,xmin,xmax,residuals, & errL1,errL2,errLinf,iused,imatchtype) if (iused /= np) then write(str1,"(i12)",iostat=ierr) iused write(str2,"(i12)",iostat=ierr) np print "(3(a,es12.5,1x),'(used ',a,'/',a,' parts)')",' L1 err = ',errL1,'L2 err = ',errL2, & 'L(inf) err = ',errLinf,trim(adjustl(str1)),trim(adjustl(str2)) else print "(3(a,es12.5,1x))",' L1 err = ',errL1,'L2 err = ',errL2, & 'L(inf) err = ',errLinf endif if (iPlotResiduals) then call plot_sci(1) call plot_residuals(xplot,residuals,imarker,iaxisy) endif endif call plot_sci(iCurrentColour) call plot_set_opacity(1.0) end subroutine plot_exact_solution !-------------------------------- ! Calculate various error norms !-------------------------------- subroutine calculate_errors(xexact,yexact,xpts,ypts,itag,iamtype,noftype,iplot_type,& xmin,xmax,residual,errL1,errL2,errLinf,iused,imatchtype) use part_utils, only:igettype use params, only:int1,maxparttypes real, intent(in) :: xexact(:),yexact(:),xpts(:),ypts(:),xmin,xmax integer, intent(in) :: itag(:) integer(int1), intent(in) :: iamtype(:) integer, intent(in) :: noftype(maxparttypes) logical, intent(in) :: iplot_type(maxparttypes) real, intent(out) :: residual(size(xpts)) real, intent(out) :: errL1,errL2,errLinf integer, intent(out) :: iused integer, intent(in) :: imatchtype integer :: i,j,npart,nerr,nused,itype real :: xi,dy,dx,yexacti,err1,ymax logical :: mixedtypes errL1 = 0. errL2 = 0. errLinf = 0. residual = 0. npart = size(xpts) iused = 0 ymax = 0. nerr = 0 nused = 0 mixedtypes = size(iamtype) > 1 do i=1,npart xi = xpts(i) yexacti = 0. if (xi >= xmin .and. xi <= xmax .and. itag(i) > 0) then if (mixedtypes) then itype = min(max(int(iamtype(i)),1),maxparttypes) else itype = igettype(i,noftype) endif if (iplot_type(itype) .and. ((imatchtype==0).or.(itype==imatchtype))) then ! !--find nearest point in exact solution table ! do j=1,size(xexact)-1 if ((xexact(j) <= xi .and. xexact(j+1) > xi) .or. & (xexact(j+1) <= xi .and. xexact(j) > xi)) then if (abs(residual(i)) > tiny(residual)) nerr = nerr + 1 !--linear interpolation from tabulated exact solution dy = yexact(j+1) - yexact(j) dx = xexact(j+1) - xexact(j) if (dx > 0.) then yexacti = yexact(j) + dy/dx*(xi - xexact(j)) residual(i) = ypts(i) - yexacti elseif (dy >= 0.) then yexacti = yexact(j) residual(i) = ypts(i) - yexacti else nerr = nerr + 1 residual(i) = 0. endif iused = iused + 1 ymax = max(ymax,abs(yexacti)) endif enddo err1 = abs(residual(i)) errL1 = errL1 + err1 errL2 = errL2 + err1**2 errLinf = max(errLinf,err1) if (yexacti > tiny(yexacti)) residual(i) = residual(i)/abs(yexacti) nused = nused + 1 endif endif enddo ! !--normalise errors (use maximum y value) ! if (nused > 0) then if (iNormaliseErrors==1 .and. ymax > tiny(ymax)) then errL1 = errL1/(nused*ymax) errL2 = sqrt(errL2/(nused*ymax**2)) errLinf = errLinf/ymax else errL1 = errL1/nused errL2 = sqrt(errL2/(nused)) endif else !print "(a)",' error normalising errors' errL1 = 0. errL2 = 0. errLinf = 0. endif if (nerr > 0) print*,'WARNING: ',nerr,' errors in residual calculation' end subroutine calculate_errors !------------------------------------ ! Plot residual errors as inset plot !------------------------------------ subroutine plot_residuals(xpts,residuals,imarker,iaxisy) use plotlib, only:plot_qvp,plot_qwin,plot_svp,plot_qci,plot_qfs, & plot_qcs,plot_sci,plot_sfs,plot_svp,plot_box, & plot_pt,plot_swin,plot_rect real, intent(in) :: xpts(:),residuals(:) integer, intent(in) :: imarker,iaxisy real :: vptxminold,vptxmaxold,vptyminold,vptymaxold real :: vptxmin,vptxmax,vptymin,vptymax real :: xminold,xmaxold,yminold,ymaxold,ymin,ymax real :: xch,ych integer :: ioldcolour,ioldfill !--query old viewport and window size call plot_qvp(0,vptxminold,vptxmaxold,vptyminold,vptymaxold) call plot_qwin(xminold,xmaxold,yminold,ymaxold) !--use specified bottom % of viewport vptxmin = vptxminold vptxmax = vptxmaxold vptymin = vptyminold vptymax = vptyminold + FracinsetResiduals*(vptymaxold - vptyminold) call plot_svp(vptxmin,vptxmax,vptymin,vptymax) !--set window if (residualmax < tiny(residualmax)) then ymax = maxval(abs(residuals)) print*,'max residual = ',ymax else ymax = residualmax endif ymin = -ymax !--erase space for residual plot call plot_qci(ioldcolour) call plot_qfs(ioldfill) call plot_qcs(0,xch,ych) call plot_sci(0) call plot_sfs(1) if (iaxisy < 0) then call plot_svp(vptxmin,vptxmax,vptymin,vptymax) else call plot_svp(vptxmin - 3.*xch,vptxmax,vptymin,vptymax) endif call plot_swin(xminold,xmaxold,ymin,ymax) call plot_rect(xminold,xmaxold,ymin,ymax) !--restore fill style call plot_sfs(ioldfill) call plot_sci(1) !--set window and draw axes call plot_svp(vptxmin,vptxmax,vptymin,vptymax) call plot_swin(xminold,xmaxold,ymin,ymax) if (iaxisy < 0) then call plot_box('ABCST',0.0,0,'BCST',0.0,0) else call plot_box('ABCST',0.0,0,'BVNCST',0.0,0) endif !--plot residuals call plot_sci(ioldcolour) call plot_pt(size(xpts),xpts,residuals,imarker) !--restore old viewport, window and colour index call plot_svp(vptxminold,vptxmaxold,vptyminold,vptymaxold) call plot_swin(xminold,xmaxold,yminold,ymaxold) end subroutine plot_residuals end module exact danieljprice-splash-4d1f09c/src/exact_Cshock.f90000066400000000000000000000132041477365367100215770ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! Plot exact solution for a magnetohydrodynamic oblique C-shock ! (ie. one dimensional MHD shock problem with ambipolar diffusion) ! ! Solution from Mac-Low, Norman, Konigl & Wardle (1995), ApJ 442, 726 ! http://adsabs.harvard.edu/abs/1995ApJ...442..726M ! ! ---------------------------------------------------------------------- module Cshock implicit none public :: exact_Cshock contains subroutine exact_Cshock(iplot,time,gamma,machs,macha,xmin,xmax,xpts,ypts,ierr) integer, intent(in) :: iplot integer, intent(out) :: ierr real, intent(in) :: time,gamma,machs,macha,xmin,xmax real, dimension(:), intent(inout) :: xpts real, dimension(size(xpts)), intent(out) :: ypts real, dimension(size(xpts)) :: D real, parameter :: pi = 3.1415926536 real :: theta,xshock,ambi_gamma,ambi_rhoi,vx0,vy0,Bx,By,rhon_pre real :: cs,rhon0,Bfield0,b0,shockl,vs,va,K1,K2,By_post,P_post,rhon_post,By0,Pr0 real :: sintheta,costheta,vx2,vx,vy,rhon,dvx,vxin integer :: npts,i logical printout printout = .false. npts = size(xpts) theta = pi/4. costheta = cos(theta) sintheta = sin(theta) D(npts) = 1. + 1.e-6 ! upstream cs = 0.1 rhon0 = 1. Bfield0 = 1. ! this gives Bx0 = By0 = 1/sqrt(2) as in Choi et al. (2009) ambi_gamma = 1. ambi_rhoi = 1.e-5 b0 = sintheta shockl = Bfield0/(ambi_gamma*ambi_rhoi*sqrt(rhon0)) va = Bfield0/sqrt(rhon0) xshock = 6./8.*va*time if ( printout ) open(unit = 625,file="Cshock_splash.dat") print "(4(a,g10.2))",& ' Plotting exact C-shock at t = ',time,' M = ',machs,' M_A = ',macha,' theta = ',theta print "(4(a,es10.3))",' shock length L = ',shockL,' shock is at x = ',xshock call integrate(xmin,xmax,xshock,xpts,macha,machs,theta,shockl,D,npts) ! ! compute velocity jump across shock: See Mac-Low et al. (1995). This is the difference ! in the velocity across the shock front since we assume that the ! post-shock gas is at rest ! ! !--post-shock, assume vx = 0 By_post = Bfield0*get_b(b0,macha,machs,D(1)) rhon_post = D(1)*rhon0 P_post = rhon_post*cs**2 ! K1 = P_post + 0.5*By_post*By_post ! print*,' K1 is ',K1 !--pre-shock vx0 = -5.0 vxin = -4.45 dvx = vxin-vx0 vy0 = 0. Bx = Bfield0*costheta By0 = Bfield0*get_b(b0,macha,machs,D(npts)) rhon_pre = D(npts)*rhon0 Pr0 = rhon_pre*cs**2 K1 = Pr0 + 0.5*By0*By0 + rhon_pre*vx0**2 K2 = rhon_pre*vx0*vy0 - Bx*By0 vx2 = (K1 - 0.5*By_post**2 - P_post)/rhon_post if (vx2 > 0.) then vx = -sqrt(vx2) print "(1x,a,g10.3)",'vx post-shock = ',vx else vx = 0. print*,'error, post-shock vx is imaginary' endif vs = vx0 - vx !print*,'vs = ',vs ! !--determine which parameter to plot ! do i=1,npts rhon = D(i)*rhon0 By = Bfield0*get_b(b0,macha,machs,D(i)) vx2 = (K1 - 0.5*By**2 - rhon*cs**2)/rhon if (vx2 > epsilon(vx2)) then vx = -sqrt(vx2) vy = (K2 + Bx*By)/(rhon*vx) else vx = 0. vy = 0. endif vx = vx + dvx select case(iplot) case(1) ypts(i) = rhon ! rho (neutrals) case(2) ypts(i) = By case(3) ! vx (neutrals) ypts(i) = vx case(4) ! vy (neutrals) ypts(i) = vy case(5) ! Bx ypts(i) = Bx case default ypts(i) = 0. end select if ( printout ) write(625,*) i,xpts(i),rhon,Bx,By,vx,vy enddo ierr = 0 if ( printout ) close(625) return end subroutine exact_Cshock real function rhs(D,macha,machs,theta,shockl) real, intent(in) :: D,macha,machs,theta,shockl real :: term,sintheta,costheta2,b0,b term = (1./D**2 - 1./machs**2)*shockl sintheta = sin(theta) costheta2 = cos(theta)**2 b0 = sintheta b = get_b(b0,macha,machs,D) rhs = b/macha*(b - D*((b - b0)/macha**2*costheta2 + sintheta))/(b**2 + costheta2)/term end function rhs real function get_b(b0,macha,machs,D) real, intent(in) :: b0,macha,machs,D get_b = sqrt(b0**2 + 2.*macha**2*(D-1.)*(1./D - 1./machs**2)) end function get_b subroutine integrate(xmin,xmax,xshock,xpts,macha,machs,theta,shockl,D,npts) integer, intent(in) :: npts real, intent(in) :: xmin,xmax,xshock,macha,machs,theta,shockl real, dimension(npts), intent(inout) :: xpts real, dimension(npts), intent(inout) :: D real :: Dhalf,dx,xminshock integer :: i ! ! set up grid to have good resolution around the shock ! and just two points extending to xmin and xmax ! xminshock = min(xshock - 100.*shockl,xmin) dx = (xshock - xminshock)/real(npts-1) xpts(npts) = xmax xpts(1) = xmin do i=2,npts-1 xpts(i) = xmin + (i-1)*dx enddo do i=npts-1,1,-1 if (xpts(i) > xshock) then D(i) = D(i+1) else !--mid-point rule Dhalf = D(i+1) - 0.5*dx*rhs(D(i+1),macha,machs,theta,-shockl) D(i) = D(i+1) - dx*rhs(Dhalf,macha,machs,theta,-shockl) endif enddo end subroutine integrate end module Cshock danieljprice-splash-4d1f09c/src/exact_bondi.f90000066400000000000000000000171021477365367100214610ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! Exact solution for Bondi flow ! ---------------------------------------------------------------------- module bondi implicit none public :: exact_bondi real, private, parameter :: pi = 4.*atan(1.) ! Constants from user input real, private :: rcrit, rhocrit ! for non-rel real, private :: den0, en0 ! for GR geodesic flow real, private :: adiabat ! for GR sonic-point flow (and rcrit as well) real, private :: C1,C2,Tc,n ! for GR sonic-point flow: intermediate constants not input by user real, private :: mass1 logical, private :: iswind private contains subroutine exact_bondi(iplot,time,gamma,const1,const2,m,relativistic,geodesic_flow,is_wind,xpts,ypts,ierr) integer, intent(in) :: iplot integer, intent(out) :: ierr real, intent(in) :: time,gamma,const1,const2,m logical, intent(in) :: relativistic, geodesic_flow,is_wind real, dimension(:), intent(in) :: xpts real, dimension(size(xpts)), intent(out) :: ypts integer :: i,npts real :: r,rhor,vr,ur npts = size(xpts) print "(a,es10.3)",' Plotting exact Bondi solution at t = ',time if (.not.relativistic) then rcrit = const1 rhocrit = const2 elseif (relativistic) then if (geodesic_flow) then den0 = const1 en0 = const2 elseif (.not.geodesic_flow) then rcrit = const1 adiabat = const2 iswind = is_wind endif endif ! !--determine which parameter to plot ! do i=1,npts r = xpts(i) vr = 0. ur = 0. rhor = 0. ! Note: Lambert functions solutions not great below 0.3 for some rcrit and rhocrit if (.not. relativistic .and. r>0.3) then call get_bondi_nonrel(rhor,vr,ur,r,m,gamma) elseif (relativistic .and. r>2.) then if (geodesic_flow) then call get_bondi_geodesic(rhor,vr,ur,r,m,gamma) elseif (.not. geodesic_flow) then call get_bondi_sonicpoint(rhor,vr,ur,r,m,gamma) endif endif select case(iplot) case(1) ypts(i) = vr if (.not.is_wind) ypts(i) = -vr case(2) ypts(i) = ur case(3) ypts(i) = rhor case default ypts(i) = 0. end select enddo ierr = 0 return end subroutine exact_bondi !------------------------------------------------------------------------ !--- Non-relativistic solution ------------------------------------------ !------------------------------------------------------------------------ subroutine get_bondi_nonrel(rho,v,u,r,mass,gamma) real, intent(out) :: rho,v,u real, intent(in) :: r,mass,gamma real :: cs2,vr,mdot cs2 = mass/(2.*rcrit) mdot = rhocrit*4.*pi*rcrit**2*sqrt(cs2) if (r>=rcrit) then vr = sqrt(-cs2*lambertw_0(-func(r,rcrit))) else vr = sqrt(-cs2*lambertw_neg1(-func(r,rcrit))) endif v = vr rho = mdot/(4.*pi*abs(v)*r**2) u = 0. end subroutine get_bondi_nonrel ! See Barry, Parlange & Li 2000, for the analytic approximations used for the Lambert W function. ! !--- Lambert W function for the principal branch (k=0) approaching from the negative real function lambertw_0(x) real, intent(in) :: x real, parameter :: exp1 = exp(1.) real :: eta, N1, N2 eta = 2. + 2.*exp1*x N2 = 6. + 3.*Sqrt(2.) - ((-5764. - 4108.*Sqrt(2.) + (2237. + 1457.*Sqrt(2.))*exp1)*eta)/& (-796. - 430.*Sqrt(2.) + (215. + 199.*Sqrt(2.))*exp1) N1 = (1. - 1./Sqrt(2.))*(Sqrt(2.) + N2) lambertw_0 = -1 + Sqrt(eta)/(1 + (Sqrt(eta)*N1)/(Sqrt(eta) + N2)) end function lambertw_0 !--- Lambert W function for the k=-1 branch real function lambertw_neg1(x) real, intent(in) :: x real, parameter :: M1 = 0.3361, M2 = -0.0042, M3 = -0.0201 real :: sigma sigma = -1. - Log(-x) lambertw_neg1 = -1. - sigma - (2.*(1. - 1./(1. + (M1*Sqrt(sigma)*(1. + exp(M3*Sqrt(sigma))*M2*sigma))/Sqrt(2.))))/M1 end function lambertw_neg1 !--- Function used in the non-rel solution of velocity [D(r)] (See: Cranmer 2004) real function func(r,rc) real, intent(in) :: r,rc func = (rc/r)**4 * exp(4.*(1.-rc/r) - 1.) end function func !------------------------------------------------------------------------ !--- GR geodesic flow solution ------------------------------------------ !------------------------------------------------------------------------ subroutine get_bondi_geodesic(rho,v,u,r,m,gamma) real, intent(out) :: rho,v,u real, intent(in) :: r,m,gamma real :: sqrtg,alpha,dfunc,efunc dfunc = den0/(r**2*sqrt(2.*m/r*(1.- 2.*m/r))) efunc = en0/((sqrt(2.*m/r)*r**2)**gamma * sqrt(1.- 2.*m/r)) sqrtg = 1. alpha = sqrt(1. - 2.*m/r) rho = sqrtg/alpha*dfunc v = sqrt(2.*m/r)*(1. - 2.*m/r) u = efunc/dfunc end subroutine get_bondi_geodesic !------------------------------------------------------------------------ !--- GR sonic point flow solution --------------------------------------- !------------------------------------------------------------------------ subroutine get_bondi_sonicpoint(rho,v,u,r,m,gamma) real, intent(out) :: rho,v,u real, intent(in) :: r,m,gamma real :: T,uvel,term,u0,dens,sqrtg real :: uc2,vc2 n = 1./(gamma-1.) mass1 = m uc2 = mass1/(2.*rcrit) vc2 = uc2/(1.-3.*uc2) Tc = vc2*n/(1.+n-vc2*n*(1.+n)) C1 = sqrt(uc2) * Tc**n * rcrit**2 C2 = (1. + (1.+n)*Tc)**2 * (1. - 2.*mass1/rcrit + C1**2/(rcrit**4*Tc**(2.*n))) ! Given an r, solve eq 76 for T numerically (Hawley, Smarr and Wilson 1976a) call Tsolve(T,r) uvel = C1/(r**2 * T**n) dens = adiabat*T**n u = T*n !get u0 at r term = 1./(1.-2.*mass1/r) u0 = sqrt(term*(1.+term*uvel**2)) v = uvel/u0 sqrtg = 1. rho = sqrtg*u0*dens end subroutine get_bondi_sonicpoint ! Newton Raphson subroutine Tsolve(T,r) real, intent(in) :: r real, intent(out) :: T real :: Tnew, diff logical :: converged integer :: its integer, parameter :: itsmax = 100 real, parameter :: tol = 1.e-5 ! These guess values may need to be adjusted for values of rcrit other than rcrit=8M if ((iswind .and. r>=rcrit) .or. (.not.iswind .and. r=rcrit)) then T = 100. endif converged = .false. its = 0 do while (.not.converged .and. its> gas/dust linear wave solution: ampl=',ampl,' Kdrag=',Kdrag,' cs=',cs endif ! ! check for errors ! ierr = 0 if (ampl < 0.) then print*,'error: amplitude < 0 on input' ierr = 1 return endif if (lambda <= 0.) then print*,'error: lambda <= 0 on input' ierr = 2 return endif if (cs <= 0) then print*,'error: sound speed <= 0 on input' ierr = 3 return endif if (rhog0 < 0) then print*,'error: gas density < 0 on input' ierr = 4 return endif if (rhod0 < 0) then print*,'error: dust density < 0 on input' ierr = 4 return endif if (Kdrag < 0) then print*,'error: drag coefficient < 0 on input' ierr = 5 return elseif (abs(Kdrag) < 1.e-8) then print*,' WARNING: Kdrag = 0 on input; using tiny to avoid divergence ' Kdrag = 0. endif rhodeq = rhod0 ! initial dust density rhogeq = rhog0 ! initial gas density !if (mod(iplot,2)==1) print*,' rho(dust),0 = ',rhod0,' rho(gas),0 = ',rhog0 !select case(iplot) !case(4) ! print*,'(dust density)' !case(3) ! print*,'(gas density)' !case(2) ! print*,'(dust velocity)' !case default ! print*,'(gas velocity)' !end select rhodsol = ampl*rhod0 ! amplitude of dust density perturbation rhogsol = ampl*rhog0 ! amplitude of gas density perturbation vdeq = 0. vgeq = 0. vgsol = ampl ! amplitude of gas velocity perturbation vdsol = ampl ! amplitude of dust velocity perturbation k = 2.*pi/lambda ! wavenumber vd1r = 0. vd1i = 0. vd2r = 0. vd2i = 0. vd3r = 0. vd3i = 0. rhod1r = 0. rhod1i = 0. rhod2r = 0. rhod2i = 0. rhod3r = 0. rhod3i = 0. ! !--solve cubic to get the 3 solutions for omega ! (these each have both real and imaginary components, ! labelled w1r, w1i etc.) ! tdust1 = Kdrag/rhodeq tgas1 = Kdrag/rhogeq aa = (tdust1 + tgas1) bb = k**2*cs**2 cc = bb*tdust1 call cubicsolve_complex(aa,bb,cc,xc) !--get solutions for (w = iy instead of y) xc = xc*cmplx(0.,1.) !print*,' roots are ',xc w1r = real(xc(1)) w2r = real(xc(2)) w3r = real(xc(3)) w1i = aimag(xc(1)) w2i = aimag(xc(2)) w3i = aimag(xc(3)) !------------------------------- ! G A S V E L O C I T I E S !------------------------------- vg3r =(k*Kdrag*vdsol*w3r**2*w2r + k*Kdrag*vdsol*w3r**2*w1r - k*Kdrag*vdsol*w3r*w2r*w1r - k*Kdrag*vdsol*w3r*w3i**2 +& k*Kdrag*vdsol*w2i*w1i*w3r - k*Kdrag*vdsol*w2r*w1i*w3i + k*Kdrag*vdsol*w2r*w3i**2 - k*Kdrag*vdsol*w2i*w3i*w1r +& k*Kdrag*vdsol*w3i**2*w1r - k*Kdrag*vgsol*w3r**2*w2r - k*Kdrag*vgsol*w3r**2*w1r + k*Kdrag*vgsol*w3r*w2r*w1r +& k*Kdrag*vgsol*w3r*w3i**2 - k*Kdrag*vgsol*w2i*w1i*w3r + k*Kdrag*vgsol*w2r*w1i*w3i - k*Kdrag*vgsol*w2r*w3i**2 +& k*Kdrag*vgsol*w2i*w3i*w1r - k*Kdrag*vgsol*w3i**2*w1r - rhogsol*w3r*w3i**2*w2r*w1i - rhogsol*w3r*w3i**2*w2i*w1r& + k*rhogeq*vgsol*w3r**3*w1i + k*rhogeq*vgsol*w3r**3*w2i - k*rhogeq*vgsol*w3r**2*w2r*w3i -& k*rhogeq*vgsol*w3r**2*w3i*w1r - k*rhogeq*vgsol*w3r*w2r**2*w1i - k*rhogeq*vgsol*w3r*w1i*w2i**2 +& k*rhogeq*vgsol*w3r*w3i**2*w2i - k*rhogeq*vgsol*w2r*w3i**3 - rhogsol*w3r**3*w1i*w2r - rhogsol*w3r**3*w2i*w1r +& rhogsol*w3r**2*w2r**2*w1i + rhogsol*w3r**2*w1i*w2i**2 + rhogsol*w3r**2*w2i*w1r**2 + rhogsol*w3r**2*w2i*w1i**2 -& rhogsol*w2r**2*w1i**2*w3i + rhogsol*w2r**2*w1i*w3i**2 - rhogsol*w3i*w1r**2*w2r**2 + rhogsol*w3i**3*w1r*w2r +& rhogsol*w3i**2*w2i*w1r**2 + rhogsol*w2i*w1i**2*w3i**2 - rhogsol*w1i**2*w2i**2*w3i - rhogsol*w2i**2*w1r**2*w3i +& rhogsol*w2i**2*w3i**2*w1i - rhogsol*w2i*w3i**3*w1i - rhogsol*k**2*cs**2*w3r**2*w2i -& rhogsol*k**2*cs**2*w3r**2*w1i + rhogsol*k**2*cs**2*w3r*w1i*w2r + rhogsol*k**2*cs**2*w3r*w2i*w1r -& rhogsol*k**2*cs**2*w3i*w2r*w1r + rhogsol*k**2*cs**2*w2i*w3i*w1i - rhogsol*k**2*cs**2*w3i**2*w1i -& rhogsol*k**2*cs**2*w3i**2*w2i + rhogsol*k**2*cs**2*w3r**2*w3i - k*rhogeq*vgsol*w3r*w2i*w1r**2 +& k*rhogeq*vgsol*w3r*w3i**2*w1i - k*rhogeq*vgsol*w3r*w2i*w1i**2 + k*rhogeq*vgsol*w3i*w1r*w2r**2 +& k*rhogeq*vgsol*w3i*w2r*w1r**2 + k*rhogeq*vgsol*w3i*w2r*w1i**2 + k*rhogeq*vgsol*w3i*w1r*w2i**2 -& k*rhogeq*vgsol*w3i**3*w1r - k*Kdrag*vdsol*w3r**3 + k*Kdrag*vgsol*w3r**3 + rhogsol*k**2*cs**2*w3i**3 +& rhogsol*w3r**2*w3i*w2r*w1r - rhogsol*w3r**2*w2i*w3i*w1i)/rhogeq/k/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 -& 2*w2i*w3i + w3r**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r) vg3i = - 1/rhogeq/k*( - w3r*w3i**2*cs**2*k**2*rhogsol - w3r**3*rhogsol*k**2*cs**2 + w3r**3*w2i*rhogsol*w1i +& w3r**2*w3i*w2i*rhogeq*k*vgsol - w3r**2*w2i*w3i*w1r*rhogsol - w2r*w3r**2*w3i*rhogsol*w1i -& w2r*w1i*w3i**3*rhogsol - w2r*w3r**3*w1r*rhogsol - w3r**2*w1i*k*Kdrag*vgsol + w3r**2*w2i*k*Kdrag*vdsol +& w3r*w3i**2*k*rhogeq*w1r*vgsol + w3r*w1i*w3i**2*rhogsol*w2i - w3r**2*w2i*k*Kdrag*vgsol +& w3r**2*w1i*k*Kdrag*vdsol - w3r**2*w1i**2*k*rhogeq*vgsol + w3r**3*k*rhogeq*w1r*vgsol +& w3r**2*w3i*w1i*rhogeq*k*vgsol - w3r**2*w1r**2*rhogeq*k*vgsol + w3r**2*w1r*cs**2*k**2*rhogsol +& w3r**2*w3i*k*Kdrag*vgsol - w3r**2*w3i*k*Kdrag*vdsol + w2r*w3r*rhogeq*k*vgsol*w3i**2 +& w2r*w3r**2*cs**2*k**2*rhogsol + w2r*w3r**3*vgsol*k*rhogeq + w2r*w3i**2*cs**2*k**2*rhogsol -& w3i**2*k*rhogeq*w1r**2*vgsol + w3i**2*cs**2*k**2*rhogsol*w1r - 2*w3r**2*k*w2i*rhogeq*w1i*vgsol -& w1i**2*rhogeq*k*vgsol*w3i**2 - 2*w3i**2*k*w2i*rhogeq*w1i*vgsol - w3r**2*w2i**2*rhogeq*k*vgsol +& w2i*w1i**2*w3i*rhogeq*k*vgsol - w2i*w3i*w1i*k*Kdrag*vdsol + w2i*w3i*w1i*k*Kdrag*vgsol -& w2i*w3i*w1r*cs**2*k**2*rhogsol + w2i*rhogeq*k*vgsol*w3i*w1r**2 + w2r*w3i*w1r*k*Kdrag*vdsol -& w2i*w3i**2*k*Kdrag*vgsol - w2r*w3i*w1r*k*Kdrag*vgsol + w2i*w3i**2*k*Kdrag*vdsol -& 2*w2r*w3i**2*k*rhogeq*w1r*vgsol + w2i*w3i**3*rhogeq*k*vgsol + w3r*w2i**2*w1r*rhogeq*k*vgsol +& w2r**2*w3i**2*w1r*rhogsol - w1i*w3i**2*k*Kdrag*vgsol + w1i*rhogeq*k*vgsol*w3i**3 + w1i*w3i**2*k*Kdrag*vdsol -& w2r*w3r*w3i**2*w1r*rhogsol - w3i**3*k*Kdrag*vdsol + w3i**3*k*Kdrag*vgsol - w2r*w1i*w3i*cs**2*k**2*rhogsol -& w1r*w2i*w3i**3*rhogsol + w3i*w2r**2*w1i*rhogeq*k*vgsol + w1i**2*w3i**2*w2r*rhogsol -& w3i**2*w2i**2*rhogeq*k*vgsol + w2i**2*w3i*w1i*rhogeq*k*vgsol + w3r*w2i*w1i*cs**2*k**2*rhogsol -& w3r*w1i**2*w2r**2*rhogsol - w3r*w2i**2*w1i**2*rhogsol + w3r**2*w1i**2*w2r*rhogsol + w3r**2*w2i**2*w1r*rhogsol -& w2r**2*w3i**2*k*rhogeq*vgsol + w3r**2*w2r*w1r**2*rhogsol - w3r**2*w2r**2*rhogeq*k*vgsol +& w3r**2*w2r**2*w1r*rhogsol - w3r*w1r**2*w2i**2*rhogsol - w3r*w2r**2*w1r**2*rhogsol - w3r*w2i*w1r*k*Kdrag*vdsol +& w3r*w2i*w1r*k*Kdrag*vgsol - w3r*w2r*w1r*cs**2*k**2*rhogsol - 2*w3r**2*w2r*k*rhogeq*w1r*vgsol +& w3r*w2r**2*k*rhogeq*w1r*vgsol + w3r*w2r*w1i*k*Kdrag*vgsol + w3r*w2r*w1i**2*k*rhogeq*vgsol -& w3r*w2r*w1i*k*Kdrag*vdsol + w3r*w2r*w1r**2*rhogeq*k*vgsol + w2i**2*w3i**2*w1r*rhogsol +& w2r*w3i**2*w1r**2*rhogsol)/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i + w3r**2)/(w1i**2 - 2*w3i*w1i +& w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r) vg2r = - (w2r**2*rhogsol*w2i*w3i*w1i + w2r**2*rhogsol*k**2*cs**2*w1i + k*Kdrag*vdsol*w3r*w2r*w1r +& k*Kdrag*vdsol*w2i*w1i*w3r - k*Kdrag*vdsol*w2r*w1i*w3i + k*Kdrag*vdsol*w2i*w3i*w1r - k*Kdrag*vgsol*w3r*w2r*w1r -& k*Kdrag*vgsol*w2i*w1i*w3r + k*Kdrag*vgsol*w2r*w1i*w3i - k*Kdrag*vgsol*w2i*w3i*w1r - rhogsol*w3r**2*w2r**2*w1i -& rhogsol*w3r**2*w1i*w2i**2 + rhogsol*w3r**2*w2i*w1r**2 + rhogsol*w3r**2*w2i*w1i**2 - rhogsol*w2r**2*w1i**2*w3i -& rhogsol*w2r**2*w1i*w3i**2 - rhogsol*w3i*w1r**2*w2r**2 + rhogsol*w3i**2*w2i*w1r**2 + rhogsol*w2i*w1i**2*w3i**2 -& rhogsol*w1i**2*w2i**2*w3i - rhogsol*w2i**2*w1r**2*w3i - rhogsol*w2i**2*w3i**2*w1i + w2r**3*rhogsol*w3i*w1r -& rhogsol*k**2*cs**2*w3r*w1i*w2r + rhogsol*k**2*cs**2*w3r*w2i*w1r - rhogsol*k**2*cs**2*w3i*w2r*w1r -& rhogsol*k**2*cs**2*w2i*w3i*w1i - k*rhogeq*vgsol*w3r*w2i*w1r**2 - k*rhogeq*vgsol*w3r*w2i*w1i**2 +& k*rhogeq*vgsol*w3i*w2r*w1r**2 + k*rhogeq*vgsol*w3i*w2r*w1i**2 + w2r**2*rhogsol*k**2*cs**2*w3i +& w2i**3*rhogsol*w3i*w1i - w2r**3*k*Kdrag*vgsol + w2r**3*k*Kdrag*vdsol - w2r**3*vgsol*k*rhogeq*w1i +& w2i*vgsol*k*rhogeq*w1r*w2r**2 + w2i**3*vgsol*k*rhogeq*w1r - w2i**2*w2r*vgsol*k*rhogeq*w1i -& w3r*w2i**3*rhogsol*w1r + w3r*w2r**3*rhogsol*w1i - w3r*w2r**2*rhogsol*w2i*w1r - w3r*w2i**2*k*Kdrag*vdsol +& w3r*w2i**2*rhogsol*w1i*w2r + w3r*w2i**2*k*Kdrag*vgsol - w3r**2*vgsol*k*rhogeq*w2i*w1r +& w3r**2*w2r*k*rhogeq*vgsol*w1i + w3r*w2r**2*k*Kdrag*vgsol - w3r*w2r**2*k*Kdrag*vdsol +& w3r*w2r**2*k*rhogeq*vgsol*w2i + w3r*w2i**3*k*rhogeq*vgsol - w2r**3*k*rhogeq*vgsol*w3i -& w2i**3*rhogsol*k**2*cs**2 - vgsol*k*rhogeq*w2i*w1r*w3i**2 + w2i**2*k*Kdrag*vgsol*w1r - w2i**2*k*Kdrag*vgsol*w2r& - w2i**2*k*Kdrag*vdsol*w1r + w2i**2*rhogsol*k**2*cs**2*w3i - w2i**2*k*rhogeq*vgsol*w2r*w3i +& w2i**2*rhogsol*k**2*cs**2*w1i + w2i**2*rhogsol*w3i*w2r*w1r - w2r**2*k*Kdrag*vdsol*w1r +& w2r**2*k*Kdrag*vgsol*w1r + w2r*vgsol*k*rhogeq*w1i*w3i**2 + w2i**2*k*Kdrag*vdsol*w2r -& w2r**2*rhogsol*k**2*cs**2*w2i)/rhogeq/k/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i + w3r**2)/(w2r**2 +& w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2) vg2i =(w1r**2*w2i**2*k*rhogeq*vgsol - w2r**2*w2i*k*Kdrag*vgsol + w2i**2*w1i**2*k*rhogeq*vgsol -& w1i*w2i**3*rhogeq*k*vgsol - w2i**3*w3i*rhogeq*k*vgsol - w3r**2*k*w2i*rhogeq*w1i*vgsol -& w3i**2*k*w2i*rhogeq*w1i*vgsol + w3r*w2i*w1i*w2r**2*rhogsol + w3r**2*w2i**2*rhogeq*k*vgsol -& w2i**2*w1r*cs**2*k**2*rhogsol - w2i*w1i**2*w3i*rhogeq*k*vgsol + w2i*w3i*w1i*k*Kdrag*vdsol -& w2i*w3i*w1i*k*Kdrag*vgsol - w2r**2*w3i*w2i*rhogeq*k*vgsol + w2i*w3i*w1r*cs**2*k**2*rhogsol -& w2i*rhogeq*k*vgsol*w3i*w1r**2 + w2r**3*cs**2*k**2*rhogsol - w2r**2*w1i*w2i*rhogeq*k*vgsol +& w2r**2*w2i*w3i*w1r*rhogsol + w2r*w3i*w1r*k*Kdrag*vdsol - w2i**2*w1i*k*Kdrag*vdsol - w2r*w3i*w1r*k*Kdrag*vgsol -& w2r*w3i**2*k*rhogeq*w1r*vgsol - w2r*w1r*w2i**2*rhogeq*k*vgsol + 2*w3r*w2i**2*w1r*rhogeq*k*vgsol +& w2r**2*w1i*k*Kdrag*vgsol - w2r**2*w3i**2*w1r*rhogsol + w3r*w2i**3*w1i*rhogsol + w2i**2*w1i*k*Kdrag*vgsol -& w2r*w1i*w3i*cs**2*k**2*rhogsol + 2*w3i*w2r**2*w1i*rhogeq*k*vgsol + w1i**2*w3i**2*w2r*rhogsol +& w3i**2*w2i**2*rhogeq*k*vgsol + 2*w2i**2*w3i*w1i*rhogeq*k*vgsol + w3r*w2i*w1i*cs**2*k**2*rhogsol -& w3r*w1i**2*w2r**2*rhogsol - w3r*w2i**2*w1i**2*rhogsol + w3r**2*w1i**2*w2r*rhogsol - w3r**2*w2i**2*w1r*rhogsol +& w2r**2*w2i*k*Kdrag*vdsol - w2r**3*k*rhogeq*w1r*vgsol + w2i**2*w3i*k*Kdrag*vgsol - w2i**2*w3i*k*Kdrag*vdsol +& w2r*w2i**2*cs**2*k**2*rhogsol - w2r*w2i**2*w3i*rhogsol*w1i + w2r**2*w3i**2*k*rhogeq*vgsol +& w2r**2*w1r**2*rhogeq*k*vgsol - w2r**2*w1r*cs**2*k**2*rhogsol + w3r**2*w2r*w1r**2*rhogsol +& w2r**2*w3i*k*Kdrag*vgsol - w2r**2*w3i*k*Kdrag*vdsol - w2r**2*w1i*k*Kdrag*vdsol + w2r**2*w1i**2*k*rhogeq*vgsol -& w3r*w2r**2*cs**2*k**2*rhogsol + w3r*w2r*w2i**2*w1r*rhogsol - w3r*w2i**2*cs**2*k**2*rhogsol -& w3r*w2r**3*rhogeq*k*vgsol + w3r**2*w2r**2*rhogeq*k*vgsol - w3r**2*w2r**2*w1r*rhogsol - w2r**3*w3i*rhogsol*w1i -& w3r*w1r**2*w2i**2*rhogsol - w3r*w2r**2*w1r**2*rhogsol - w3r*w2i*w1r*k*Kdrag*vdsol + w3r*w2i*w1r*k*Kdrag*vgsol +& w3r*w2r**3*w1r*rhogsol + w3r*w2r*w1r*cs**2*k**2*rhogsol - w3r**2*w2r*k*rhogeq*w1r*vgsol +& 2*w3r*w2r**2*k*rhogeq*w1r*vgsol - w3r*w2r*w2i**2*rhogeq*k*vgsol - w3r*w2r*w1i*k*Kdrag*vgsol -& w3r*w2r*w1i**2*k*rhogeq*vgsol + w3r*w2r*w1i*k*Kdrag*vdsol - w3r*w2r*w1r**2*rhogeq*k*vgsol +& w2i**3*w3i*w1r*rhogsol - w2i**3*k*Kdrag*vgsol - w2i**2*w3i**2*w1r*rhogsol + w2i**3*k*Kdrag*vdsol +& w2r*w3i**2*w1r**2*rhogsol)/rhogeq/k/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i + w3r**2)/(w2r**2 +& w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2) vg1r =( - rhogsol*w1i**3*w3i*w2i + rhogsol*k**2*cs**2*w1i**3 - rhogsol*w3i*w2r*w1r**3 - k*Kdrag*vgsol*w2r*w1r**2 +& k*Kdrag*vdsol*w2r*w1r**2 - k*Kdrag*vdsol*w1r*w1i**2 - k*Kdrag*vgsol*w2r*w1i**2 + k*Kdrag*vdsol*w2r*w1i**2 +& k*Kdrag*vgsol*w1r*w1i**2 - k*Kdrag*vdsol*w1r**3 + k*Kdrag*vgsol*w1r**3 - w3r*rhogsol*w2i*w1r**3 -& w3r*Kdrag*w1i**2*k*vgsol + w3r*k*Kdrag*vdsol*w1r**2 + w3r*k*Kdrag*vdsol*w1i**2 - w3r*Kdrag*w1r**2*k*vgsol -& k*Kdrag*vdsol*w3r*w2r*w1r - k*Kdrag*vdsol*w2i*w1i*w3r - k*Kdrag*vdsol*w2r*w1i*w3i + k*Kdrag*vdsol*w2i*w3i*w1r +& k*Kdrag*vgsol*w3r*w2r*w1r + k*Kdrag*vgsol*w2i*w1i*w3r + k*Kdrag*vgsol*w2r*w1i*w3i - k*Kdrag*vgsol*w2i*w3i*w1r +& k*rhogeq*vgsol*w3r*w2r**2*w1i + k*rhogeq*vgsol*w3r*w1i*w2i**2 - rhogsol*w3r**2*w2r**2*w1i -& rhogsol*w3r**2*w1i*w2i**2 + rhogsol*w3r**2*w2i*w1r**2 + rhogsol*w3r**2*w2i*w1i**2 + rhogsol*w2r**2*w1i**2*w3i -& rhogsol*w2r**2*w1i*w3i**2 + rhogsol*w3i*w1r**2*w2r**2 + rhogsol*w3i**2*w2i*w1r**2 + rhogsol*w2i*w1i**2*w3i**2 +& rhogsol*w1i**2*w2i**2*w3i + rhogsol*w2i**2*w1r**2*w3i - rhogsol*w2i**2*w3i**2*w1i -& rhogsol*k**2*cs**2*w3r*w1i*w2r + rhogsol*k**2*cs**2*w3r*w2i*w1r + rhogsol*k**2*cs**2*w3i*w2r*w1r +& rhogsol*k**2*cs**2*w2i*w3i*w1i - k*rhogeq*vgsol*w3i*w1r*w2r**2 - k*rhogeq*vgsol*w3i*w1r*w2i**2 -& w3r**2*vgsol*k*rhogeq*w2i*w1r + w3r**2*w2r*k*rhogeq*vgsol*w1i + w3r*rhogsol*w1i**3*w2r -& vgsol*k*rhogeq*w2i*w1r*w3i**2 - w3r*w1r**2*k*rhogeq*vgsol*w1i - w3r*w1i**3*k*rhogeq*vgsol -& w3r*w1r*rhogsol*w2i*w1i**2 + w3r*rhogsol*w1i*w2r*w1r**2 + w2r*vgsol*k*rhogeq*w1i*w3i**2 -& rhogsol*w3i*w2r*w1r*w1i**2 - rhogeq*w2r*w1i*k*vgsol*w1r**2 - rhogeq*w2r*w1i**3*k*vgsol +& k*rhogeq*vgsol*w2i*w1r**3 - rhogsol*k**2*cs**2*w2i*w1r**2 + k*rhogeq*vgsol*w3i*w1r*w1i**2 +& rhogsol*k**2*cs**2*w1i*w1r**2 - rhogsol*k**2*cs**2*w3i*w1i**2 + k*rhogeq*vgsol*w3i*w1r**3 -& rhogsol*k**2*cs**2*w1i**2*w2i - rhogsol*k**2*cs**2*w3i*w1r**2 - rhogsol*w3i*w1r**2*w2i*w1i +& w1r*k*rhogeq*vgsol*w2i*w1i**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r)/(w2r**2 + w1r**2 +& w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2)/rhogeq/k vg1i = - ( - w1r**2*w2i**2*k*rhogeq*vgsol - w2i**2*w1i**2*k*rhogeq*vgsol - w3r**2*w1i**2*k*rhogeq*vgsol -& w3r**2*w1r**2*rhogeq*k*vgsol - w3r*w2r*w1r**3*rhogsol - w3r*w1i**2*w2r*rhogsol*w1r -& w3i**2*k*rhogeq*w1r**2*vgsol + w3r**2*k*w2i*rhogeq*w1i*vgsol - w1i**2*rhogeq*k*vgsol*w3i**2 +& w3i**2*k*w2i*rhogeq*w1i*vgsol + w1i**3*k*rhogeq*vgsol*w3i - w3r*w2i*w1i*rhogsol*w1r**2 - w1i**3*k*Kdrag*vdsol -& 2*w2i*w1i**2*w3i*rhogeq*k*vgsol + w2i*w3i*w1r*rhogsol*w1i**2 - w1i**2*k*Kdrag*vgsol*w3i -& w1i*k*Kdrag*vdsol*w1r**2 + w1i**2*k*rhogeq*vgsol*w3r*w1r + w1i*k*Kdrag*vgsol*w1r**2 - w1r**3*cs**2*k**2*rhogsol& + cs**2*k**2*rhogsol*w3r*w1r**2 + w3i*k*Kdrag*vdsol*w1r**2 - w2i*w3i*w1i*k*Kdrag*vdsol +& w2i*w3i*w1i*k*Kdrag*vgsol + cs**2*k**2*rhogsol*w3r*w1i**2 + w3i*k*Kdrag*vdsol*w1i**2 +& w1i**3*w2i*rhogeq*k*vgsol + w2r*k*rhogeq*w1r*vgsol*w1i**2 - w2i*k*Kdrag*vgsol*w1i**2 + w2i*k*Kdrag*vdsol*w1i**2& + w1r**2*rhogeq*k*vgsol*w3i*w1i + w1r**3*rhogeq*k*vgsol*w3r + w2i*k*Kdrag*vdsol*w1r**2 +& w2i*w3i*w1r*cs**2*k**2*rhogsol - 2*w2i*rhogeq*k*vgsol*w3i*w1r**2 - w3i*k*Kdrag*vgsol*w1r**2 -& w2r*w3i*w1r*k*Kdrag*vdsol + w2r*w3i*w1r*k*Kdrag*vgsol + w2r*w3i**2*k*rhogeq*w1r*vgsol +& w3r*w2i**2*w1r*rhogeq*k*vgsol - w2r**2*w3i**2*w1r*rhogsol - w1i**3*w2r*rhogsol*w3i - w2r*w1r**2*rhogsol*w3i*w1i& - w2i*k*Kdrag*vgsol*w1r**2 - w2r*w1i*w3i*cs**2*k**2*rhogsol + w2i*w3i*w1r**3*rhogsol +& w3i*w2r**2*w1i*rhogeq*k*vgsol + w1i**2*w3i**2*w2r*rhogsol + w1i*w2i*rhogeq*k*vgsol*w1r**2 +& w2i**2*w3i*w1i*rhogeq*k*vgsol - w3r*w2i*w1i*cs**2*k**2*rhogsol + w3r*w1i**2*w2r**2*rhogsol +& w3r*w2i**2*w1i**2*rhogsol + w3r**2*w1i**2*w2r*rhogsol - w3r**2*w2i**2*w1r*rhogsol -& w2r**2*w1r**2*rhogeq*k*vgsol + w3r**2*w2r*w1r**2*rhogsol - w2r**2*w1i**2*k*rhogeq*vgsol -& w1r*cs**2*k**2*rhogsol*w1i**2 - w3r**2*w2r**2*w1r*rhogsol + w3r*w1r**2*w2i**2*rhogsol +& w3r*w2r**2*w1r**2*rhogsol - w3r*w2i*w1i**3*rhogsol + w1i**3*k*Kdrag*vgsol - w3r*w2i*w1r*k*Kdrag*vdsol +& w3r*w2i*w1r*k*Kdrag*vgsol - w3r*w2r*w1r*cs**2*k**2*rhogsol + w3r**2*w2r*k*rhogeq*w1r*vgsol +& w3r*w2r**2*k*rhogeq*w1r*vgsol - w3r*w2r*w1i*k*Kdrag*vgsol - 2*w3r*w2r*w1i**2*k*rhogeq*vgsol +& w3r*w2r*w1i*k*Kdrag*vdsol - 2*w3r*w2r*w1r**2*rhogeq*k*vgsol + w2r*k*rhogeq*w1r**3*vgsol +& w2r*w1r**2*cs**2*k**2*rhogsol - w2i**2*w3i**2*w1r*rhogsol + rhogsol*k**2*cs**2*w1i**2*w2r +& w2r*w3i**2*w1r**2*rhogsol)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r)/(w2r**2 + w1r**2 +& w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2)/rhogeq/k !------------------------------- ! D U S T V E L O C I T I E S !------------------------------- if (Kdrag > 0.) then vd3r = - (rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol + rhogeq**2*w3i**4*k*w1r*vgsol -& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r - w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r + w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r -& rhogeq**2*cs**2*k**3*w2i**2*w1r*vgsol + rhogeq*cs**4*k**4*w2r*w1r*rhogsol -& rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol - rhogeq*cs**2*k**3*w2r*w1i*Kdrag*vgsol -& rhogeq**2*cs**2*k**3*w2r*w1i**2*vgsol + rhogeq*cs**2*k**3*w2r*w1i*Kdrag*vdsol -& rhogeq**2*cs**2*k**3*w2r*w1r**2*vgsol - rhogeq*w3i**4*cs**2*k**2*rhogsol - rhogeq*cs**4*k**4*w2i*w1i*rhogsol +& rhogeq*cs**2*k**2*w1i**2*w2r**2*rhogsol + rhogeq**2*w3i**4*w2r*k*vgsol - rhogeq*w3i**3*k*Kdrag*vdsol*w1r +& 2*rhogeq*w3i**3*k*Kdrag*vgsol*w2r + rhogeq*w2i**2*w1i**2*cs**2*k**2*rhogsol +& rhogeq*w2i**2*w1r**2*cs**2*k**2*rhogsol - rhogeq*w3i**4*w2r*w1r*rhogsol + rhogeq*w3i**4*w1i*rhogsol*w2i +& w3i*cs**4*k**4*rhogeq*rhogsol*w2i + w3i*cs**4*k**4*rhogeq*rhogsol*w1i + w3i**2*Kdrag**2*k*vgsol*w1r -& w3i**3*Kdrag*rhogsol*k**2*cs**2 - w3i**3*Kdrag*rhogsol*w2r*w1r + w3i**3*Kdrag*rhogsol*w2i*w1i -& w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1i - w3i*cs**2*k**2*rhogeq*rhogsol*w1i*w2i**2 +& rhogeq*w3i**3*rhogsol*k**2*cs**2*w2i + rhogeq*w3i**3*rhogsol*k**2*cs**2*w1i - rhogeq*w3i**3*rhogsol*w2r**2*w1i& - rhogeq*w3i**3*rhogsol*w1i*w2i**2 - rhogeq*w3i**3*rhogsol*w2i*w1r**2 -& w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w1r**2 - w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w1i**2 -& rhogeq*w3i**3*rhogsol*w2i*w1i**2 - rhogeq*w3i**3*k*Kdrag*vdsol*w2r + 2*rhogeq*w3i**3*k*Kdrag*vgsol*w1r +& w3r*rhogeq**2*cs**2*k**3*w2i**2*vgsol + w3r*rhogeq*w2r*w3i**2*cs**2*k**2*rhogsol -& w3r*rhogeq**2*w3i**2*k*w1r**2*vgsol + w3r*rhogeq*w3i**2*cs**2*k**2*rhogsol*w1r +& 2*w3r*rhogeq*cs**2*k**3*w3i*Kdrag*vdsol - w3r*rhogeq*cs**4*k**4*w2r*rhogsol +& w3r*rhogeq**2*cs**2*k**3*w2r**2*vgsol + w3r**4*rhogeq**2*w2r*vgsol*k - w3r**4*rhogeq*w2r*w1r*rhogsol +& w3r**4*rhogeq**2*k*w1r*vgsol - w3r**4*rhogeq*rhogsol*k**2*cs**2 + w3r**4*rhogeq*w2i*rhogsol*w1i +& 2*w3r*rhogeq*w2i*w3i*w1i*k*Kdrag*vgsol + 2*w3r*rhogeq**2*w2i*k*vgsol*w3i*w1r**2 +& 2*w3r*rhogeq*w2r*w3i*w1r*k*Kdrag*vdsol - 2*w3r*rhogeq*w2i*w3i**2*k*Kdrag*vgsol - w3r*w3i**2*Kdrag**2*k*vgsol +& w3r*w3i**2*Kdrag**2*k*vdsol - w3r*rhogeq**2*w1i**2*k*vgsol*w3i**2 - 2*w3r*rhogeq**2*w3i**2*k*w2i*w1i*vgsol +& 2*w3r*rhogeq**2*w2i*w1i**2*w3i*k*vgsol + w3r*w3i**2*Kdrag*rhogsol*w1i*w2r + w3r*w3i**2*Kdrag*rhogsol*w2i*w1r -& w3r*Kdrag*rhogsol*k**2*cs**2*w1i*w2r - w3r*Kdrag*rhogsol*k**2*cs**2*w2i*w1r +& w3r*Kdrag*k*rhogeq*vgsol*w2i*w1r**2 + w3r*Kdrag*k*rhogeq*vgsol*w2i*w1i**2 + w3r*Kdrag**2*k*vdsol*w2r*w1r -& w3r*Kdrag**2*k*vdsol*w2i*w1i - w3r*Kdrag**2*k*vgsol*w2r*w1r + w3r*Kdrag**2*k*vgsol*w2i*w1i +& w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1i + w3r*Kdrag*k*rhogeq*vgsol*w1i*w2i**2 - w3r*rhogeq**2*w2r**2*w3i**2*k*vgsol& - 2*w3r*rhogeq*w2r*w3i*w1r*k*Kdrag*vgsol + w3r*rhogeq*w2i*w3i**2*k*Kdrag*vdsol -& 2*w3r*rhogeq**2*w2r*w3i**2*k*w1r*vgsol + w3r*rhogeq*w2r**2*w3i**2*w1r*rhogsol -& 2*w3r*rhogeq*w1i*w3i**2*k*Kdrag*vgsol + w3r*rhogeq*w1i*w3i**2*k*Kdrag*vdsol +& 2*w3r*rhogeq**2*w3i*w2r**2*w1i*k*vgsol + w3r*rhogeq*w1i**2*w3i**2*w2r*rhogsol -& w3r*rhogeq**2*w3i**2*w2i**2*k*vgsol - w3r*rhogeq*cs**2*k**2*w1i**2*w2r*rhogsol -& w3r*rhogeq*cs**2*k**2*w2r*w1r**2*rhogsol - w3r*rhogeq*cs**2*k**2*w2r**2*w1r*rhogsol +& w3r*rhogeq*w2i**2*w3i**2*w1r*rhogsol + w3r*rhogeq*w2r*w3i**2*w1r**2*rhogsol -& 2*w3r*rhogeq**2*cs**2*k**3*w3i*w2i*vgsol - w3r*rhogeq*w2i**2*w1r*cs**2*k**2*rhogsol +& 2*w3r*rhogeq**2*w2i**2*w3i*w1i*k*vgsol + w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol -& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol + w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol -& w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol + w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol -& 2*w3r*rhogeq**2*cs**2*k**3*w3i*w1i*vgsol + w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol -& w3r*rhogeq*cs**4*k**4*w1r*rhogsol - 2*w3r*rhogeq*cs**2*k**3*w3i*Kdrag*vgsol +& 2*w3r*rhogeq**2*cs**2*k**3*w2r*w1r*vgsol - 2*w3r*rhogeq*w2i*w3i*w1i*k*Kdrag*vdsol +& 2*w3r*rhogeq**2*cs**2*k**3*w2i*w1i*vgsol + w3r**2*w3i*rhogeq*rhogsol*k**2*cs**2*w1i -& w3r**2*w3i*rhogeq*rhogsol*w2r**2*w1i - w3r**2*w3i*rhogeq*rhogsol*w1i*w2i**2 -& w3r**2*w3i*rhogeq*rhogsol*w2i*w1r**2 - w3r**2*w3i*rhogeq*rhogsol*w2i*w1i**2 -& w3r**2*w3i*rhogeq*k*Kdrag*vdsol*w2r - w3r**2*Kdrag*rhogsol*w3i*w2r*w1r + w3r**2*Kdrag*rhogsol*w2i*w3i*w1i -& w3r**2*w3i*rhogeq*k*Kdrag*vdsol*w1r + w3r**2*w3i*rhogeq*rhogsol*k**2*cs**2*w2i -& w3r**2*Kdrag*rhogsol*k**2*cs**2*w3i + w3r**2*Kdrag*rhogsol*k**2*cs**2*w2i + w3r**2*Kdrag*rhogsol*k**2*cs**2*w1i& + 2*w3r**2*Kdrag*k*rhogeq*vgsol*w2r*w3i + 2*w3r**2*Kdrag*k*rhogeq*vgsol*w3i*w1r +& 2*w3r**2*rhogeq**2*w2r*k*vgsol*w3i**2 - w3r**2*rhogeq**2*cs**2*k**3*w2r*vgsol +& w3r**2*rhogeq*w2r*w1i*k*Kdrag*vgsol + w3r**2*rhogeq**2*w2r*w1i**2*k*vgsol - w3r**2*rhogeq*w2r*w1i*k*Kdrag*vdsol& + w3r**2*rhogeq**2*w2r*w1r**2*k*vgsol - w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol - w3r**2*Kdrag**2*k*vdsol*w2r -& w3r**2*rhogeq*w2i**2*w1i**2*rhogsol - w3r**2*rhogeq*w1r**2*w2i**2*rhogsol - w3r**2*rhogeq*w2r**2*w1r**2*rhogsol& + w3r**2*rhogeq*cs**4*k**4*rhogsol - w3r**2*rhogeq*w1i**2*w2r**2*rhogsol - w3r**2*Kdrag*rhogsol*w1i*w2i**2 -& w3r**2*Kdrag*rhogsol*w2i*w1r**2 - w3r**2*Kdrag*rhogsol*w2i*w1i**2 - w3r**2*Kdrag*rhogsol*w2r**2*w1i -& w3r**2*Kdrag**2*k*vdsol*w1r + w3r**2*Kdrag**2*k*vgsol*w2r + w3r**2*Kdrag**2*k*vgsol*w1r +& w3r**3*Kdrag*rhogsol*w2i*w1r + w3r**3*rhogeq*w2i*k*Kdrag*vdsol - w3r**3*rhogeq**2*w2i**2*k*vgsol +& w3r**2*rhogeq**2*w2i**2*w1r*k*vgsol - 2*w3r**2*rhogeq*w2r*w3i**2*w1r*rhogsol +& 2*w3r**2*rhogeq**2*w3i**2*k*w1r*vgsol + 2*w3r**2*rhogeq*w1i*w3i**2*rhogsol*w2i -& w3r**2*rhogeq*w2i*w1r*k*Kdrag*vdsol + w3r**2*rhogeq*w2i*w1r*k*Kdrag*vgsol - w3r**3*rhogeq**2*w1i**2*k*vgsol -& 2*w3r**3*rhogeq**2*w2r*k*w1r*vgsol + w3r**3*rhogeq*w2r**2*w1r*rhogsol + w3r**3*rhogeq*w2r*cs**2*k**2*rhogsol -& 2*w3r**3*rhogeq*w2i*k*Kdrag*vgsol - w3r**3*rhogeq**2*w1r**2*k*vgsol + w3r**3*rhogeq*w1r*cs**2*k**2*rhogsol -& w3r**3*rhogeq**2*w2r**2*k*vgsol + w3r**3*rhogeq*w1i*k*Kdrag*vdsol - 2*w3r**3*rhogeq**2*k*w2i*w1i*vgsol +& w3r**3*rhogeq*w2r*w1r**2*rhogsol + w3r**3*rhogeq*w1i**2*w2r*rhogsol + w3r**3*rhogeq*w2i**2*w1r*rhogsol -& 2*w3r**3*rhogeq*w1i*k*Kdrag*vgsol + w3r**3*Kdrag*rhogsol*w1i*w2r + w3r**2*rhogeq**2*w2r**2*k*w1r*vgsol -& 2*w3r**2*rhogeq*w3i**2*cs**2*k**2*rhogsol + w3r**3*Kdrag**2*k*vdsol + w3i**2*rhogeq**2*cs**2*k**3*w2r*vgsol -& w3r**3*Kdrag**2*k*vgsol + w3i**2*rhogeq*w2i*w1r*k*Kdrag*vdsol - w3i**2*Kdrag**2*k*vdsol*w2r +& w3i**2*Kdrag**2*k*vgsol*w2r - w3i**2*Kdrag*rhogsol*w2r**2*w1i - w3i**2*Kdrag*rhogsol*w1i*w2i**2 -& w3i**2*Kdrag*rhogsol*w2i*w1r**2 - w3i**2*Kdrag*rhogsol*w2i*w1i**2 + w3i**2*Kdrag*rhogsol*k**2*cs**2*w2i +& w3i**2*Kdrag*rhogsol*k**2*cs**2*w1i - Kdrag*k*rhogeq*vgsol*w3i*w1r*w2r**2 - Kdrag*k*rhogeq*vgsol*w3i*w2r*w1r**2& - Kdrag*k*rhogeq*vgsol*w3i*w2r*w1i**2 - Kdrag*k*rhogeq*vgsol*w3i*w1r*w2i**2 +& Kdrag*rhogsol*k**2*cs**2*w3i*w2r*w1r - Kdrag*rhogsol*k**2*cs**2*w2i*w3i*w1i + Kdrag*rhogsol*w2r**2*w1i**2*w3i +& Kdrag*rhogsol*w3i*w1r**2*w2r**2 + Kdrag*rhogsol*w1i**2*w2i**2*w3i + Kdrag*rhogsol*w2i**2*w1r**2*w3i +& Kdrag**2*k*vdsol*w2r*w1i*w3i + Kdrag**2*k*vdsol*w2i*w3i*w1r - Kdrag**2*k*vgsol*w2r*w1i*w3i -& Kdrag**2*k*vgsol*w2i*w3i*w1r - w3i**2*Kdrag**2*k*vdsol*w1r + rhogeq*cs**2*k**3*w2i*w1r*Kdrag*vdsol -& rhogeq*cs**2*k**3*w2i*w1r*Kdrag*vgsol - w3i**2*rhogeq**2*w2i**2*w1r*k*vgsol -& w3i**2*rhogeq**2*w2r**2*k*w1r*vgsol - w3i**2*rhogeq*w2i*w1r*k*Kdrag*vgsol - w3i**2*rhogeq*w2r*w1i*k*Kdrag*vgsol& - w3i**2*rhogeq**2*w2r*w1i**2*k*vgsol + w3i**2*rhogeq*w2r*w1i*k*Kdrag*vdsol -& w3i**2*rhogeq**2*w2r*w1r**2*k*vgsol + w3i**2*rhogeq**2*cs**2*k**3*w1r*vgsol +& w3i**2*rhogeq*w2i**2*w1i**2*rhogsol + w3i**2*rhogeq*w1r**2*w2i**2*rhogsol + w3i**2*rhogeq*w2r**2*w1r**2*rhogsol& - w3i**2*rhogeq*cs**4*k**4*rhogsol + w3i**2*rhogeq*w1i**2*w2r**2*rhogsol)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2& + w3i**2 - 2*w3r*w1r)/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i + w3r**2)/k/rhogeq/Kdrag vd3i = - (cs**2*k**3*rhogeq*w3i**2*Kdrag*vgsol - cs**2*k**3*rhogeq*w3i**2*Kdrag*vdsol -& 2*cs**4*k**4*rhogeq*w3r*w3i*rhogsol - 4*cs**2*k**2*rhogeq*w3r*w3i*w2r*w1r*rhogsol +& 4*cs**2*k**2*rhogeq*w3r*w3i*w2i*rhogsol*w1i - cs**2*k**3*rhogeq*w3r**2*Kdrag*vgsol +& cs**2*k**3*rhogeq*w3r**2*Kdrag*vdsol - 2*cs**2*k**3*rhogeq**2*w3i*w2r*w1r*vgsol +& 2*cs**2*k**3*rhogeq**2*w3r*w3i*w2r*vgsol + 2*cs**2*k**3*rhogeq**2*w3r*w3i*w1r*vgsol -& w3r**2*w1i*k*Kdrag**2*vgsol + w3r**2*w1i*k*Kdrag**2*vdsol + rhogeq*w3i*w3r**2*w1i*k*Kdrag*vdsol -& rhogeq**2*w3i*w3r**2*w1i**2*k*vgsol + 2*rhogeq**2*w3i**2*w3r**2*w1i*k*vgsol -& rhogeq**2*w3i*w3r**2*w1r**2*k*vgsol + rhogeq*w3i*w3r**2*w1r*cs**2*k**2*rhogsol +& 2*rhogeq*w3i**2*w3r**2*k*Kdrag*vgsol - 2*rhogeq*w3i**2*w3r**2*k*Kdrag*vdsol +& rhogeq*w3i*w2r*w3r**2*cs**2*k**2*rhogsol + rhogeq*w3i**3*w2r*cs**2*k**2*rhogsol -& rhogeq**2*w3i**3*k*w1r**2*vgsol + rhogeq*w3i**3*cs**2*k**2*rhogsol*w1r - 2*rhogeq**2*w3i*w3r**2*k*w2i*w1i*vgsol& - rhogeq**2*w3i**3*w1i**2*k*vgsol - 2*rhogeq**2*w3i**3*k*w2i*w1i*vgsol - rhogeq**2*w3i*w3r**2*w2i**2*k*vgsol +& rhogeq**2*w3i**2*w2i*w1i**2*k*vgsol - rhogeq*w3i**2*w2i*w1i*k*Kdrag*vdsol +& 2*rhogeq**2*w3i**2*w3r**2*w2i*k*vgsol - 2*rhogeq*w3i**2*w3r**2*w2i*w1r*rhogsol -& 2*rhogeq*w3i**2*w2r*w3r**2*rhogsol*w1i - rhogeq*w3i**4*w2r*w1i*rhogsol + rhogeq*w3i*w3r**2*w2i*k*Kdrag*vdsol +& w3r**2*w3i*k*Kdrag**2*vgsol - w3r**2*w3i*k*Kdrag**2*vdsol - w2i*w3i**2*k*Kdrag**2*vgsol +& w2i*w3i**2*k*Kdrag**2*vdsol - w1i*w3i**2*k*Kdrag**2*vgsol + w1i*w3i**2*k*Kdrag**2*vdsol +& rhogeq**2*w3i**2*w2i*k*vgsol*w1r**2 + rhogeq*w3i**2*w2r*w1r*k*Kdrag*vdsol + rhogeq*w3i**3*w2i*k*Kdrag*vdsol -& 2*rhogeq**2*w3i**3*w2r*k*w1r*vgsol + rhogeq**2*w3i**4*w2i*k*vgsol + 2*rhogeq**2*w3i*w3r*w2i**2*w1r*k*vgsol +& rhogeq*w3i**3*w1i**2*w2r*rhogsol - rhogeq**2*w3i**3*w2i**2*k*vgsol - 2*rhogeq*w3i*w3r*w1i**2*w2r**2*rhogsol -& 2*rhogeq*w3i*w3r*w2i**2*w1i**2*rhogsol + rhogeq*w3i*w3r**2*w1i**2*w2r*rhogsol +& rhogeq*w3i*w3r**2*w2i**2*w1r*rhogsol - rhogeq**2*w3i**3*w2r**2*k*vgsol + rhogeq*w3i*w3r**2*w2r*w1r**2*rhogsol -& 2*rhogeq**2*w3i*w3r**2*w2r*k*w1r*vgsol + rhogeq*w3i**3*w2r**2*w1r*rhogsol + rhogeq**2*w3i**4*w1i*k*vgsol +& rhogeq*w3i**3*w1i*k*Kdrag*vdsol - rhogeq*w3i**4*k*Kdrag*vdsol + rhogeq*w3i**4*k*Kdrag*vgsol -& rhogeq*w3i**4*w1r*w2i*rhogsol - Kdrag*w2r*w3r*w3i**2*w1r*rhogsol - Kdrag*w1r*w2i*w3i**3*rhogsol +& Kdrag*w2r*w3i**2*cs**2*k**2*rhogsol - Kdrag*w3i**2*k*rhogeq*w1r**2*vgsol + Kdrag*w3i**2*cs**2*k**2*rhogsol*w1r& - Kdrag*w1i**2*rhogeq*k*vgsol*w3i**2 + Kdrag*w3r*w1i*w3i**2*rhogsol*w2i - Kdrag*w3r**2*w1i**2*k*rhogeq*vgsol -& Kdrag*w3r**2*w1r**2*rhogeq*k*vgsol + Kdrag*w3r**2*w1r*cs**2*k**2*rhogsol + Kdrag*w2r*w3r**2*cs**2*k**2*rhogsol& - 2*rhogeq*w3i*w3r*w2r*w1i*k*Kdrag*vdsol + 2*rhogeq**2*w3i*w3r*w2r*w1r**2*k*vgsol +& rhogeq*w3i**3*w2i**2*w1r*rhogsol + rhogeq*w3i**3*w2r*w1r**2*rhogsol - Kdrag*w3r*w3i**2*cs**2*k**2*rhogsol -& Kdrag*w3r**3*rhogsol*k**2*cs**2 + Kdrag*w3r**3*w2i*rhogsol*w1i - Kdrag*w3r**2*w2i*w3i*w1r*rhogsol -& Kdrag*w2r*w3r**2*w3i*rhogsol*w1i - Kdrag*w2r*w1i*w3i**3*rhogsol + 2*rhogeq**2*w3i*w3r*w2r*w1i**2*k*vgsol -& Kdrag*w2r*w3r**3*w1r*rhogsol + rhogeq*w3r**3*k*Kdrag*vdsol*w2r - rhogeq**2*w3i*w3r**2*w2r**2*k*vgsol +& rhogeq*w3i*w3r**2*w2r**2*w1r*rhogsol - 2*rhogeq*w3i*w3r*w1r**2*w2i**2*rhogsol -& 2*rhogeq*w3i*w3r*w2r**2*w1r**2*rhogsol - 2*rhogeq*w3i*w3r*w2i*w1r*k*Kdrag*vdsol +& 2*rhogeq*w3i*w3r*w2i*w1r*k*Kdrag*vgsol + 2*rhogeq**2*w3i*w3r*w2r**2*k*w1r*vgsol +& 2*rhogeq*w3i*w3r*w2r*w1i*k*Kdrag*vgsol + rhogeq**2*w3r**4*k*vgsol*w2i - rhogeq*w3r**4*rhogsol*w1i*w2r -& rhogeq*w3r**4*rhogsol*w2i*w1r + rhogeq*w3r**3*rhogsol*w2r**2*w1i + rhogeq*w3r**3*rhogsol*w1i*w2i**2 +& rhogeq*w3r**3*rhogsol*w2i*w1r**2 + rhogeq*w3r**3*rhogsol*w2i*w1i**2 + rhogeq*w3r*rhogsol*w2r**2*w1i*w3i**2 -& rhogeq*w3r**4*k*Kdrag*vdsol - rhogeq*w3r**2*k*Kdrag*vdsol*w2r*w1r + rhogeq*w3r**2*k*Kdrag*vdsol*w2i*w1i +& rhogeq*w3r*k*Kdrag*vdsol*w2r*w3i**2 + rhogeq*w3r*k*Kdrag*vdsol*w3i**2*w1r -& rhogeq*w3r*rhogsol*k**2*cs**2*w3i**2*w1i - rhogeq*w3r*rhogsol*k**2*cs**2*w3i**2*w2i -& rhogeq**2*w3r**2*k*vgsol*w2i*w1r**2 - rhogeq**2*w3r**2*k*vgsol*w2i*w1i**2 + rhogeq**2*w3r**4*k*vgsol*w1i +& rhogeq*w3r**4*k*Kdrag*vgsol + rhogeq*w3r*rhogsol*w3i**2*w2i*w1r**2 + rhogeq*w3r*rhogsol*w2i*w1i**2*w3i**2 +& rhogeq*w3r*rhogsol*w2i**2*w3i**2*w1i - rhogeq*w3r**3*rhogsol*k**2*cs**2*w2i -& rhogeq*w3r**3*rhogsol*k**2*cs**2*w1i + rhogeq*w3r**3*k*Kdrag*vdsol*w1r + w3r**2*w2i*k*Kdrag**2*vdsol -& w3r**2*w2i*k*Kdrag**2*vgsol - w3i**3*k*Kdrag**2*vdsol + w3i**3*k*Kdrag**2*vgsol -& w3r*Kdrag*rhogsol*w2r**2*w1r**2 - w3r*Kdrag*rhogsol*w2r**2*w1i**2 + w3r*Kdrag*k*rhogeq*vgsol*w2r*w1i**2 +& w3r*Kdrag*k*rhogeq*vgsol*w2r*w1r**2 - w3r*rhogeq*cs**2*k**2*rhogsol*w2r**2*w1i +& w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r - w3r*Kdrag*cs**2*k**2*rhogsol*w2r*w1r -& w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r + w3r**2*Kdrag*rhogsol*w2r*w1r**2 +& 2*w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i - w3r**2*rhogeq**2*k*vgsol*w2r**2*w1i -& w3r**2*Kdrag*rhogeq*k*vgsol*w2r*w1r - w3r**2*Kdrag*rhogeq*k*vgsol*w2r**2 - w3r**2*Kdrag*rhogeq*k*vgsol*w2i**2 -& w3r**2*rhogeq**2*cs**2*k**3*vgsol*w1i + w3r*Kdrag**2*k*vgsol*w2r*w1i + w3i**2*rhogeq**2*k*vgsol*w2r**2*w1i +& rhogeq*cs**2*k**3*vdsol*Kdrag*w2r*w1r + w3i*Kdrag*k*rhogeq*vgsol*w2r**2*w1i +& w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1r + w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w1r**2 +& w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w1i**2 - 3*w3i**2*Kdrag*rhogeq*k*vgsol*w2r*w1r -& w3i**2*Kdrag*rhogeq*k*vgsol*w2i**2 - w3i*rhogeq**2*cs**2*k**3*vgsol*w2r**2 -& 2*w3i**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i - w3i**2*Kdrag*rhogeq*k*vgsol*w2r**2 -& rhogeq*cs**4*k**4*rhogsol*w2r*w1i + w3i*rhogeq*cs**4*k**4*rhogsol*w2r - w3i*Kdrag*cs**2*k**2*rhogsol*w2r*w1i -& cs**2*k**3*rhogeq*Kdrag*vgsol*w2r*w1r + w3i**2*cs**2*k**3*rhogeq**2*vgsol*w1i + w3i**2*Kdrag*rhogsol*w2r**2*w1r& + w3i*Kdrag**2*k*vdsol*w2r*w1r + w3i**2*Kdrag*rhogsol*w2r*w1r**2 + w3i**2*Kdrag*rhogsol*w2r*w1i**2 -& w3i*Kdrag**2*k*vgsol*w2r*w1r + w3r**2*Kdrag*rhogsol*w2r*w1i**2 + w3r**2*Kdrag*rhogsol*w2r**2*w1r +& rhogeq**2*cs**2*k**3*vgsol*w1i*w2r**2 + w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1r - w3r*Kdrag**2*k*vdsol*w2r*w1i -& w3r*rhogeq*cs**2*k**2*rhogsol*w2i*w1r**2 + w3r*cs**4*k**4*rhogeq*rhogsol*w1i +& w3r*Kdrag*cs**2*k**2*rhogsol*w1i*w2i - w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r - w3i*Kdrag**2*k*vdsol*w1i*w2i +& w3i*Kdrag**2*k*vgsol*w1i*w2i + w3r*Kdrag**2*k*vgsol*w2i*w1r - cs**2*k**3*rhogeq*Kdrag*vdsol*w1i*w2i -& w3i**2*Kdrag*rhogeq*k*vgsol*w1i*w2i + w3r*Kdrag*k*rhogeq*vgsol*w2i**2*w1r + w3i*rhogeq*k*Kdrag*vgsol*w2i**2*w1i& + w3i*rhogeq*k*Kdrag*vgsol*w2i*w1r**2 + w3i*rhogeq*k*Kdrag*vgsol*w1i**2*w2i -& w3i*rhogeq**2*cs**2*k**3*vgsol*w1r**2 - w3i*rhogeq**2*cs**2*k**3*vgsol*w1i**2 -& 3*w3r**2*Kdrag*k*rhogeq*vgsol*w1i*w2i + w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r -& w3i*Kdrag*cs**2*k**2*rhogsol*w2i*w1r - rhogeq*cs**4*k**4*rhogsol*w2i*w1r +& 2*w3r**2*rhogeq*cs**2*k**2*rhogsol*w2i*w1r - w3r**2*vgsol*rhogeq**2*k**3*cs**2*w2i +& w3i*rhogeq*cs**2*k**3*vdsol*Kdrag*w2i + w3i*rhogeq*cs**2*k**3*vdsol*Kdrag*w1i +& cs**2*k**3*rhogeq*Kdrag*vgsol*w1i*w2i - w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1i -& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i + w3i*rhogeq*cs**4*k**4*rhogsol*w1r +& w3i**2*vgsol*rhogeq**2*k**3*cs**2*w2i + w3i**2*vgsol*k*rhogeq**2*w2i**2*w1i -& 2*w3i**2*rhogeq*cs**2*k**2*rhogsol*w2i*w1r - w3r**2*vgsol*k*rhogeq**2*w2i**2*w1i -& w3i*rhogeq**2*cs**2*k**3*vgsol*w2i**2 - 2*w3i*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i -& w3r*Kdrag*rhogsol*w2i**2*w1r**2 + rhogeq**2*cs**2*k**3*vgsol*w1i**2*w2i + rhogeq**2*cs**2*k**3*vgsol*w2i*w1r**2& - w3r*Kdrag**2*k*vdsol*w2i*w1r + w3r*cs**4*k**4*rhogeq*rhogsol*w2i - w3r*rhogeq*cs**2*k**2*rhogsol*w1i**2*w2i -& w3r*rhogeq*cs**2*k**2*rhogsol*w2i**2*w1i - w3r*Kdrag*rhogsol*w2i**2*w1i**2 +& w3i*rhogeq*cs**2*k**2*rhogsol*w2i**2*w1r + w3i**2*Kdrag*rhogsol*w2i**2*w1r + w3r**2*Kdrag*rhogsol*w2i**2*w1r +& rhogeq**2*cs**2*k**3*vgsol*w1i*w2i**2)/Kdrag/rhogeq/k/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i +& w3r**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r) vd2r = - ( - rhogeq*w1i*rhogsol*k**2*cs**2*w3i**2*w2i + rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r**2 +& rhogeq*w1i**2*rhogsol*k**2*cs**2*w3i**2 - rhogeq*w1i*rhogsol*k**2*cs**2*w3r**2*w2i +& rhogeq**2*w1i**2*k*vgsol*w3r*w2r**2 - rhogeq**2*w1i**2*k*vgsol*w3r*w2i**2 - rhogeq**2*w2r**3*k*vgsol*w3i**2 +& rhogeq*w2r**3*w3i**2*w1r*rhogsol + 2*rhogeq**2*w1r*w2r**2*w2i**2*k*vgsol - rhogeq**2*w1r**2*w2r*k*vgsol*w2i**2& - 2*cs**2*k**3*rhogeq**2*w2r*vgsol*w2i*w1i + cs**2*k**2*rhogeq*w2r*w1r*rhogsol*w2i**2 +& cs**2*k**2*rhogeq*w2r**3*w1r*rhogsol - w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r +& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r + w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r -& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r + rhogeq**2*cs**2*k**3*w2i**2*w1r*vgsol -& rhogeq*cs**4*k**4*w2r*w1r*rhogsol - rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol +& rhogeq*cs**2*k**3*w2r*w1i*Kdrag*vgsol + rhogeq**2*cs**2*k**3*w2r*w1i**2*vgsol -& rhogeq*cs**2*k**3*w2r*w1i*Kdrag*vdsol + rhogeq**2*cs**2*k**3*w2r*w1r**2*vgsol +& rhogeq*cs**4*k**4*w2i*w1i*rhogsol + w3i*cs**4*k**4*rhogeq*rhogsol*w2i - w3i*cs**4*k**4*rhogeq*rhogsol*w1i -& w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w1r**2 - w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w1i**2 +& w3r*rhogeq**2*cs**2*k**3*w2i**2*vgsol - w3r*rhogeq*cs**4*k**4*w2r*rhogsol -& w3r*rhogeq**2*cs**2*k**3*w2r**2*vgsol - w3r*Kdrag*rhogsol*k**2*cs**2*w1i*w2r +& w3r*Kdrag*rhogsol*k**2*cs**2*w2i*w1r - w3r*Kdrag*k*rhogeq*vgsol*w2i*w1r**2 -& w3r*Kdrag*k*rhogeq*vgsol*w2i*w1i**2 + w3r*Kdrag**2*k*vdsol*w2r*w1r + w3r*Kdrag**2*k*vdsol*w2i*w1i -& w3r*Kdrag**2*k*vgsol*w2r*w1r - w3r*Kdrag**2*k*vgsol*w2i*w1i + w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1i -& w3r*Kdrag*k*rhogeq*vgsol*w1i*w2i**2 - w3r*rhogeq*cs**2*k**2*w1i**2*w2r*rhogsol -& w3r*rhogeq*cs**2*k**2*w2r*w1r**2*rhogsol - w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol -& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol + w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol +& w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol - w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol -& w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol + w3r*rhogeq*cs**4*k**4*w1r*rhogsol +& 2*w3r*rhogeq**2*cs**2*k**3*w2r*w1r*vgsol + w3r**2*rhogeq**2*cs**2*k**3*w2r*vgsol +& w3r**2*rhogeq*w2r*w1i*k*Kdrag*vgsol - w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol +& w3r**2*rhogeq*w2i**2*w1i**2*rhogsol + w3r**2*rhogeq*w1r**2*w2i**2*rhogsol - w3r**2*rhogeq*w2r**2*w1r**2*rhogsol& - w3r**2*rhogeq*w1i**2*w2r**2*rhogsol - w3r**2*Kdrag*rhogsol*w1i*w2i**2 + w3r**2*Kdrag*rhogsol*w2i*w1r**2 +& w3r**2*Kdrag*rhogsol*w2i*w1i**2 - w3r**2*Kdrag*rhogsol*w2r**2*w1i - w3r**2*rhogeq**2*w2i**2*w1r*k*vgsol -& w3r**2*rhogeq*w2i*w1r*k*Kdrag*vgsol + w3r**2*rhogeq**2*w2r**2*k*w1r*vgsol +& w3i**2*rhogeq**2*cs**2*k**3*w2r*vgsol - w3i**2*Kdrag*rhogsol*w2r**2*w1i - w3i**2*Kdrag*rhogsol*w1i*w2i**2 +& w3i**2*Kdrag*rhogsol*w2i*w1r**2 + w3i**2*Kdrag*rhogsol*w2i*w1i**2 + Kdrag*k*rhogeq*vgsol*w3i*w1r*w2r**2 +& Kdrag*k*rhogeq*vgsol*w3i*w2r*w1r**2 + Kdrag*k*rhogeq*vgsol*w3i*w2r*w1i**2 - Kdrag*k*rhogeq*vgsol*w3i*w1r*w2i**2& - Kdrag*rhogsol*k**2*cs**2*w3i*w2r*w1r - Kdrag*rhogsol*k**2*cs**2*w2i*w3i*w1i - Kdrag*rhogsol*w2r**2*w1i**2*w3i& - Kdrag*rhogsol*w3i*w1r**2*w2r**2 - Kdrag*rhogsol*w1i**2*w2i**2*w3i - Kdrag*rhogsol*w2i**2*w1r**2*w3i -& Kdrag**2*k*vdsol*w2r*w1i*w3i + Kdrag**2*k*vdsol*w2i*w3i*w1r + Kdrag**2*k*vgsol*w2r*w1i*w3i -& Kdrag**2*k*vgsol*w2i*w3i*w1r - rhogeq*cs**2*k**3*w2i*w1r*Kdrag*vdsol + rhogeq*cs**2*k**3*w2i*w1r*Kdrag*vgsol -& w3i**2*rhogeq**2*w2i**2*w1r*k*vgsol + w3i**2*rhogeq**2*w2r**2*k*w1r*vgsol - w3i**2*rhogeq*w2i*w1r*k*Kdrag*vgsol& + w3i**2*rhogeq*w2r*w1i*k*Kdrag*vgsol - w3i**2*rhogeq**2*cs**2*k**3*w1r*vgsol +& w3i**2*rhogeq*w2i**2*w1i**2*rhogsol + w3i**2*rhogeq*w1r**2*w2i**2*rhogsol - w3i**2*rhogeq*w2r**2*w1r**2*rhogsol& - w3i**2*rhogeq*w1i**2*w2r**2*rhogsol - 2*w3i*rhogeq*k*Kdrag*vdsol*w2r*w2i*w1i +& w3i*rhogeq*rhogsol*k**2*cs**2*w2i*w2r**2 + 2*rhogeq**2*w1i**2*k*vgsol*w2r*w3i*w2i -& rhogeq*w2i*w1r*k*Kdrag*vdsol*w2r**2 - 2*vgsol*Kdrag*rhogeq*k**3*cs**2*w2r*w2i -& 2*cs**2*k**2*rhogeq*rhogsol*w2i**2*w2r**2 + 2*vdsol*Kdrag*rhogeq*k**3*cs**2*w2r*w2i -& cs**2*k**2*rhogeq*rhogsol*w2r**4 - rhogeq**2*w2r*k*vgsol*w3i**2*w2i**2 - w3i*rhogeq*k*Kdrag*vdsol*w1r*w2r**2 +& w3i*rhogeq*k*Kdrag*vdsol*w2r*w2i**2 - w3i*rhogeq*rhogsol*w2i*w1r**2*w2r**2 +& 2*w3i*rhogeq*rhogsol*w2r**2*w1i*w2i**2 + rhogeq*cs**4*k**4*rhogsol*w2r**2 + w3i*rhogeq*k*Kdrag*vdsol*w2r**3 +& w3i*rhogeq*rhogsol*w2r**4*w1i - rhogeq*w1i*w3i**2*rhogsol*w2i*w2r**2 + rhogeq*w2r*w3i**2*w1r*rhogsol*w2i**2 +& 2*w3i*rhogeq**2*k*vgsol*w2i*w2r*w1r**2 - 2*w3i*cs**2*k**3*rhogeq**2*vgsol*w2r*w2i +& 2*w3i*cs**2*k**3*rhogeq**2*vgsol*w2r*w1i - rhogeq*w3i**2*cs**2*k**2*rhogsol*w2r*w1r +& 2*rhogeq**2*w2r*k*vgsol*w3i**2*w2i*w1i + 2*rhogeq*w2r*w1i*k*Kdrag*vgsol*w2i*w3i +& w3r*rhogeq*w2r**3*cs**2*k**2*rhogsol + w3r*rhogeq*w2r**3*w1r**2*rhogsol + w3r*rhogeq**2*w2r**4*k*vgsol +& w3r*rhogeq**2*k*vgsol*w2i**4 - w3r*vdsol*Kdrag*k*rhogeq*w2i**3 - w3i*rhogeq*rhogsol*w2i**3*w1r**2 +& w3i*rhogeq*rhogsol*w2i**4*w1i - w3r**2*rhogeq*rhogsol*w2i**3*w1i - w3i**2*rhogeq*rhogsol*w2i**3*w1i -& w3r*rhogeq**2*k*vgsol*w2i**2*w1r**2 + w3i*vdsol*Kdrag*k*rhogeq*w2i**2*w1r - rhogeq*rhogsol*k**2*cs**2*w2i**4 +& w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2 - rhogeq*k*Kdrag*vdsol*w2i**3*w1r +& w3i**2*cs**2*k**2*rhogeq*rhogsol*w1r**2 + w3i*cs**2*k**2*rhogeq*rhogsol*w2i**3 - w3r*rhogeq*rhogsol*w2i**4*w1r& - rhogeq**2*w1i**2*w2r**3*vgsol*k - rhogeq*w1i**2*w2i**3*rhogsol*w3i - cs**4*k**4*rhogeq*rhogsol*w2i**2 +& w2i**2*k*Kdrag**2*vdsol*w2r + w2r**2*k*Kdrag**2*vgsol*w1r - w2r**2*k*Kdrag**2*vdsol*w1r -& w2i**2*k*Kdrag**2*vgsol*w2r - w2i**2*k*Kdrag**2*vdsol*w1r + w2r**3*k*Kdrag**2*vdsol +& w3r*w2r**2*k*Kdrag**2*vgsol - w3r*w2r**2*k*Kdrag**2*vdsol + w2i**2*k*Kdrag**2*vgsol*w1r +& w3r*w2i**2*k*Kdrag**2*vgsol - w3r*w2i**2*k*Kdrag**2*vdsol - w2r**3*k*Kdrag**2*vgsol -& 2*Kdrag*w2r**3*k*rhogeq*vgsol*w3i + Kdrag*w2i**2*rhogsol*k**2*cs**2*w3i - 2*Kdrag*w2i**2*k*rhogeq*vgsol*w2r*w3i& - 2*Kdrag*w2r**3*vgsol*k*rhogeq*w1i + 2*Kdrag*w2i*vgsol*k*rhogeq*w1r*w2r**2 + 2*Kdrag*w2i**3*vgsol*k*rhogeq*w1r& - 2*Kdrag*w2i**2*w2r*vgsol*k*rhogeq*w1i + Kdrag*w2i**3*rhogsol*w3i*w1i - Kdrag*w3r*w2i**3*rhogsol*w1r +& Kdrag*w3r*w2r**3*rhogsol*w1i - Kdrag*w3r*w2r**2*rhogsol*w2i*w1r + Kdrag*w3r*w2i**2*rhogsol*w1i*w2r +& Kdrag*w2r**3*rhogsol*w3i*w1r + rhogeq*w1i*w2i**2*k*Kdrag*vdsol*w2r + rhogeq*w1i*w2r**2*rhogsol*k**2*cs**2*w2i +& Kdrag*w2r**2*rhogsol*w2i*w3i*w1i + Kdrag*w2r**2*rhogsol*k**2*cs**2*w1i + Kdrag*w2r**2*rhogsol*k**2*cs**2*w3i -& 2*rhogeq**2*w1i*w2i**2*k*vgsol*w2r*w3i - rhogeq*w1i*w3r*w2r**2*k*Kdrag*vdsol -& 2*rhogeq**2*w1i*w2r**3*k*vgsol*w3i + rhogeq*w1i*w2i**3*rhogsol*k**2*cs**2 + rhogeq*w1i*w3r*w2i**2*k*Kdrag*vdsol& + rhogeq*w1i**2*w3r*w2i**2*rhogsol*w2r + rhogeq*w1i*w2r**3*k*Kdrag*vdsol + rhogeq*w1i**2*w3r*w2r**3*rhogsol -& rhogeq*w1i**2*w2r**2*rhogsol*w2i*w3i - rhogeq**2*w1i**2*w2i**2*w2r*vgsol*k +& Kdrag*w2i**2*rhogsol*k**2*cs**2*w1i + Kdrag*w2i**2*rhogsol*w3i*w2r*w1r - Kdrag*w2r**2*rhogsol*k**2*cs**2*w2i -& Kdrag*w2i**3*rhogsol*k**2*cs**2 + 2*Kdrag*w3r*w2r**2*k*rhogeq*vgsol*w2i + 2*Kdrag*w3r*w2i**3*k*rhogeq*vgsol -& 2*w3r*w2r*Kdrag*k*rhogeq*vgsol*w2i*w1r + 2*w3r*rhogeq*w2i*k*Kdrag*vdsol*w2r*w1r -& 2*w3r*w2r*rhogeq**2*vgsol*k*w2i**2*w1r + w3r*rhogeq**2*w1r**2*k*vgsol*w2r**2 +& w3r*rhogeq*w2r*cs**2*k**2*rhogsol*w2i**2 - w3r*rhogeq*w2r**4*w1r*rhogsol + w3r*rhogeq*w2r*w1r**2*rhogsol*w2i**2& - 2*w3r*rhogeq**2*w2r**3*k*w1r*vgsol - 2*w3r*rhogeq*w2r**2*w1r*rhogsol*w2i**2 -& w3r*rhogeq*w2i*k*Kdrag*vdsol*w2r**2 + 2*w3r*rhogeq**2*w2i**2*k*vgsol*w2r**2 +& w3r**2*rhogeq*w2r*w1r*rhogsol*w2i**2 - w3r**2*rhogeq**2*w2r*vgsol*k*w2i**2 -& w3r**2*rhogeq*w2i*rhogsol*w1i*w2r**2 - w3r**2*rhogeq**2*w2r**3*vgsol*k + 2*w3r**2*rhogeq**2*w2r*vgsol*k*w2i*w1i& - w3r**2*rhogeq*rhogsol*k**2*cs**2*w2r*w1r + w3r**2*rhogeq*w2r**3*w1r*rhogsol + rhogeq**2*w1r*w2i**4*k*vgsol +& rhogeq**2*w1r*w2r**4*k*vgsol - rhogeq**2*w1r**2*w2r**3*k*vgsol)/k/rhogeq/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2& - 2*w2i*w3i + w3r**2)/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2)/Kdrag vd2i =1/k*(w3r*rhogeq*k*Kdrag*vdsol*w2r**2*w1r - w3r*rhogeq*k*Kdrag*vdsol*w2r*w2i**2 -& w3r*rhogeq*k*Kdrag*vdsol*w2r**3 - w3r*Kdrag*rhogsol*w2r**2*w1r**2 - w3r*Kdrag*rhogsol*w2r**2*w1i**2 +& w3r*rhogeq*rhogsol*w2r**4*w1i - w3r*Kdrag*k*rhogeq*vgsol*w2r*w1i**2 - w3r*Kdrag*k*rhogeq*vgsol*w2r*w1r**2 -& 2*w3r*rhogeq*cs**2*k**2*rhogsol*w2r**2*w1i - w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r -& 2*w3r*rhogeq**2*k*vgsol*w2r*w2i*w1i**2 - 2*w3r*rhogeq**2*k*vgsol*w2r*w2i*w1r**2 +& 2*w3r*rhogeq**2*k*vgsol*w2r**2*w2i*w1r - w3r*rhogeq*cs**2*k**2*rhogsol*w2i*w2r**2 +& w3r*Kdrag*cs**2*k**2*rhogsol*w2r*w1r - w3r*Kdrag*cs**2*k**2*rhogsol*w2r**2 + w3r*Kdrag*rhogsol*w2r**2*w1i*w2i -& 2*w3r*cs**2*k**3*rhogeq**2*vgsol*w2i*w2r + w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r +& 4*w3r*rhogeq*cs**2*k**2*rhogsol*w2r*w2i*w1r + w3r*Kdrag*rhogsol*w2r*w1r*w2i**2 +& 2*w3r*rhogeq*rhogsol*w2i**2*w2r**2*w1i + w3r**2*Kdrag*rhogsol*w2r*w1r**2 +& 2*w3r**2*rhogeq*rhogsol*w2r*w2i*w1i**2 - w3r*rhogeq*rhogsol*w1i**2*w2r**2*w2i -& w3r*rhogeq*rhogsol*w2i*w1r**2*w2r**2 - 2*w3r*w2r*Kdrag*rhogeq*k*vgsol*w2i*w1i +& w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i + w3r**2*rhogeq**2*k*vgsol*w2i*w2r**2 +& w3r**2*rhogeq**2*k*vgsol*w2r**2*w1i - w3r**2*Kdrag*rhogeq*k*vgsol*w2r*w1r + w3r**2*Kdrag*rhogeq*k*vgsol*w2r**2& - w3r**2*rhogeq*rhogsol*w2r*w2i**2*w1i - w3r**2*rhogeq*rhogsol*w2r**2*w2i*w1r +& w3r**2*Kdrag*rhogeq*k*vgsol*w2i**2 - w3r**2*rhogeq**2*cs**2*k**3*vgsol*w1i +& 2*w3r**2*rhogeq*rhogsol*w2r*w2i*w1r**2 - 2*w3r**2*rhogeq**2*k*vgsol*w2r*w2i*w1r - w3r*Kdrag**2*k*vgsol*w2r*w1i& + rhogeq*k*Kdrag*vdsol*w2r**4 - w3i*rhogeq*rhogsol*w2r**3*w1i**2 + Kdrag**2*k*vdsol*w2i*w2r**2 -& 2*vgsol*k*rhogeq**2*w2i**2*w2r**2*w1i + vgsol*k*rhogeq**2*w2i*w1r**2*w2r**2 -& 2*vgsol*rhogeq**2*k**3*cs**2*w2r*w2i*w1r - rhogeq*cs**2*k**2*rhogsol*w2r**2*w2i*w1r +& rhogeq*cs**2*k**2*rhogsol*w2r**3*w1i + rhogeq*cs**2*k**2*rhogsol*w2r*w2i**2*w1i +& w3i*rhogeq**2*k*vgsol*w2r**2*w1r**2 - w3i*rhogeq**2*k*vgsol*w2r**4 + w3i**2*rhogeq**2*k*vgsol*w2i*w2r**2 -& 2*w3i**2*rhogeq**2*k*vgsol*w2r*w2i*w1r + w3i**2*rhogeq**2*k*vgsol*w2r**2*w1i -& rhogeq*cs**2*k**3*vdsol*Kdrag*w2r**2 + rhogeq*cs**2*k**3*vdsol*Kdrag*w2r*w1r - Kdrag**2*k*vdsol*w2r**2*w1i +& 3*w3i*Kdrag*k*rhogeq*vgsol*w2r**2*w1i - 2*w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1r +& w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w2i**2 + w3i*cs**2*k**2*rhogeq*rhogsol*w2r**3 +& w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w1r**2 - 4*w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w2i*w1i +& w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w1i**2 + w3i*rhogeq**2*k*vgsol*w2r**2*w1i**2 -& 2*w3i*rhogeq**2*k*vgsol*w2i**2*w2r**2 - w3i**2*Kdrag*rhogeq*k*vgsol*w2r*w1r +& w3i**2*Kdrag*rhogeq*k*vgsol*w2i**2 + Kdrag**2*k*vgsol*w2r**2*w1i + w3i*rhogeq**2*cs**2*k**3*vgsol*w2r**2 +& Kdrag*k*rhogeq*vgsol*w2r**2*w1r**2 + Kdrag*k*rhogeq*vgsol*w2r**2*w1i**2 +& w3i**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i - Kdrag**2*k*vgsol*w2i*w2r**2 + 2*rhogeq*cs**4*k**4*rhogsol*w2i*w2r +& 2*w3i*rhogeq*rhogsol*w2i**2*w2r**2*w1r + w3i**2*Kdrag*rhogeq*k*vgsol*w2r**2 + w3i*rhogeq*rhogsol*w2r**4*w1r -& w3i*rhogeq*rhogsol*w2r**3*w1r**2 - rhogeq*cs**4*k**4*rhogsol*w2r*w1i - w3i*rhogeq*cs**4*k**4*rhogsol*w2r -& rhogeq*k*Kdrag*vdsol*w2r**2*w1i*w2i + Kdrag*cs**2*k**2*rhogsol*w2r**3 + 2*rhogeq*k*Kdrag*vdsol*w2i**2*w2r**2 -& rhogeq*k*Kdrag*vdsol*w2r**3*w1r + Kdrag*cs**2*k**2*rhogsol*w2r*w2i**2 - rhogeq*k*Kdrag*vdsol*w2r*w1r*w2i**2 -& Kdrag*cs**2*k**2*rhogsol*w2r**2*w1r + w3i*Kdrag*rhogsol*w2r**2*w2i*w1r - w3i*Kdrag*rhogsol*w2r*w2i**2*w1i -& w3i*Kdrag*rhogsol*w2r**3*w1i - w3i*Kdrag*cs**2*k**2*rhogsol*w2r*w1i - w3i**2*rhogeq*rhogsol*w2r**2*w2i*w1r -& w3i**2*rhogeq*rhogsol*w2r*w2i**2*w1i - w3i*rhogeq*rhogsol*w2r*w2i**2*w1r**2 +& 2*w3i**2*rhogeq*rhogsol*w2r*w2i*w1r**2 - w3i**2*rhogeq*rhogsol*w2r**3*w1i +& 2*w3i**2*rhogeq*rhogsol*w2r*w2i*w1i**2 - w3i*rhogeq*rhogsol*w2r*w2i**2*w1i**2 -& cs**2*k**3*rhogeq*Kdrag*vgsol*w2r*w1r + cs**2*k**3*rhogeq*Kdrag*vgsol*w2r**2 -& w3i**2*cs**2*k**3*rhogeq**2*vgsol*w1i - w3i**2*Kdrag*rhogsol*w2r**2*w1r + w3i*Kdrag**2*k*vdsol*w2r*w1r +& w3i**2*Kdrag*rhogsol*w2r*w1r**2 + w3i**2*Kdrag*rhogsol*w2r*w1i**2 - w3i*Kdrag**2*k*vdsol*w2r**2 +& w3i*Kdrag**2*k*vgsol*w2r**2 - w3i*Kdrag**2*k*vgsol*w2r*w1r + 2*w3i*rhogeq*k*Kdrag*vdsol*w2r*w2i*w1r -& w3i*rhogeq*k*Kdrag*vdsol*w2r**2*w1i - w3i*rhogeq*k*Kdrag*vdsol*w2i*w2r**2 + w3r**2*Kdrag*rhogsol*w2r*w1i**2 -& w3r**2*Kdrag*rhogsol*w2r**2*w1r + w3r*Kdrag*rhogsol*w2r**3*w1r - w3r**2*rhogeq*rhogsol*w2r**3*w1i +& Kdrag**2*k*vdsol*w2i**3 - Kdrag**2*k*vgsol*w2i**3 - Kdrag*rhogeq*k*vgsol*w2r**4 +& rhogeq**2*cs**2*k**3*vgsol*w1i*w2r**2 - 2*Kdrag*rhogeq*k*vgsol*w2i**2*w2r**2 -& 2*Kdrag*rhogeq*k*vgsol*w2r*w1r*w2i*w3i + 2*rhogeq**2*k*vgsol*w2r**2*w1i*w2i*w3i +& 2*w3r*rhogeq*k*Kdrag*vdsol*w2r*w2i*w1i + w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1r + w3r*Kdrag**2*k*vdsol*w2r*w1i -& rhogeq**2*k*vgsol*w2r**4*w1i - w3r*rhogeq*k*Kdrag*vdsol*w2i**2*w1r - w3r*rhogeq*cs**2*k**2*rhogsol*w2i*w1r**2 -& w3r*rhogeq*cs**2*k**2*rhogsol*w2i**3 + 2*w3r*vgsol*k**3*cs**2*rhogeq**2*w2i*w1r +& w3r*cs**4*k**4*rhogeq*rhogsol*w1i + w3r*Kdrag*cs**2*k**2*rhogsol*w1i*w2i -& w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r + w3i*Kdrag**2*k*vdsol*w1i*w2i - w3i*Kdrag**2*k*vdsol*w2i**2 +& rhogeq*k*Kdrag*vdsol*w2i**4 - w3i*Kdrag**2*k*vgsol*w1i*w2i + w3i*Kdrag**2*k*vgsol*w2i**2 +& w3r*Kdrag**2*k*vgsol*w2i*w1r + 2*w3r*rhogeq**2*k*vgsol*w2i**3*w1r - cs**2*k**3*rhogeq*Kdrag*vdsol*w1i*w2i -& w3i**2*Kdrag*rhogeq*k*vgsol*w1i*w2i - Kdrag*rhogeq*k*vgsol*w2i**4 + Kdrag*rhogeq*k*vgsol*w2i**2*w1r**2 +& Kdrag*rhogeq*k*vgsol*w2i**2*w1i**2 + 3*w3r*Kdrag*k*rhogeq*vgsol*w2i**2*w1r +& w3i*rhogeq*k*Kdrag*vgsol*w2i**2*w1i - w3i*rhogeq*k*Kdrag*vgsol*w2i*w1r**2 - w3i*rhogeq*k*Kdrag*vgsol*w1i**2*w2i& - w3i*rhogeq*k*Kdrag*vdsol*w2i**3 + w3i*rhogeq*k*Kdrag*vdsol*w2i**2*w1i - w3i*rhogeq**2*k*vgsol*w2i**2*w1i**2 +& 2*w3i*rhogeq**2*k*vgsol*w2i**3*w1i - w3i*rhogeq**2*k*vgsol*w2i**4 - w3i*rhogeq**2*cs**2*k**3*vgsol*w1r**2 -& w3i*rhogeq**2*cs**2*k**3*vgsol*w1i**2 - w3r**2*Kdrag*k*rhogeq*vgsol*w1i*w2i +& w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r - rhogeq*cs**2*k**2*rhogsol*w2i**3*w1r +& w3i*Kdrag*cs**2*k**2*rhogsol*w2i*w1r - rhogeq*cs**4*k**4*rhogsol*w2i*w1r -& w3r**2*rhogeq*cs**2*k**2*rhogsol*w2i*w1r + w3r**2*vgsol*rhogeq**2*k**3*cs**2*w2i -& w3i*rhogeq*cs**2*k**3*vdsol*Kdrag*w2i + w3i*rhogeq*cs**2*k**3*vdsol*Kdrag*w1i +& cs**2*k**3*rhogeq*Kdrag*vgsol*w1i*w2i - w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1i +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i + w3i*rhogeq*cs**4*k**4*rhogsol*w1r +& w3i**2*vgsol*rhogeq**2*k**3*cs**2*w2i - w3i**2*vgsol*k*rhogeq**2*w2i**2*w1i -& w3i**2*rhogeq*cs**2*k**2*rhogsol*w2i*w1r + w3i**2*vgsol*k*rhogeq**2*w2i**3 -& w3r**2*vgsol*k*rhogeq**2*w2i**2*w1i + w3r**2*vgsol*k*rhogeq**2*w2i**3 - w3i*rhogeq**2*cs**2*k**3*vgsol*w2i**2 +& 2*w3i*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i - cs**2*k**3*rhogeq*Kdrag*vgsol*w2i**2 +& cs**2*k**3*rhogeq*Kdrag*vdsol*w2i**2 - w3i*rhogeq**2*k*vgsol*w2i**2*w1r**2 - rhogeq*k*Kdrag*vdsol*w2i**3*w1i -& Kdrag*cs**2*k**2*rhogsol*w2i**2*w1r + w3r*Kdrag*rhogsol*w2i**3*w1i - w3r*Kdrag*rhogsol*w2i**2*w1r**2 +& w3i*Kdrag*rhogsol*w2i**3*w1r + rhogeq**2*cs**2*k**3*vgsol*w1i**2*w2i + rhogeq**2*cs**2*k**3*vgsol*w2i*w1r**2 -& w3r*Kdrag**2*k*vdsol*w2i*w1r + vgsol*k*rhogeq**2*w1i**2*w2r**2*w2i - w3r*cs**4*k**4*rhogeq*rhogsol*w2i -& w3r*rhogeq*cs**2*k**2*rhogsol*w1i**2*w2i + 2*w3r*rhogeq*cs**2*k**2*rhogsol*w2i**2*w1i -& w3r*Kdrag*rhogsol*w2i**2*w1i**2 + 2*w3i*rhogeq*cs**2*k**2*rhogsol*w2i**2*w1r - w3r**2*rhogeq*rhogsol*w2i**3*w1r& - w3i**2*rhogeq*rhogsol*w2i**3*w1r - w3i**2*Kdrag*rhogsol*w2i**2*w1r - w3r**2*Kdrag*rhogsol*w2i**2*w1r -& rhogeq**2*k*vgsol*w2i**4*w1i + rhogeq**2*k*vgsol*w2i**3*w1r**2 - w3r*rhogeq*rhogsol*w2i**3*w1i**2 +& w3r*rhogeq*rhogsol*w2i**4*w1i - w3r*rhogeq*rhogsol*w2i**3*w1r**2 + rhogeq**2*k*vgsol*w2i**3*w1i**2 -& Kdrag**2*k*vdsol*w2i**2*w1i + w3i*rhogeq*rhogsol*w2i**4*w1r + Kdrag**2*k*vgsol*w2i**2*w1i -& w3r*Kdrag*cs**2*k**2*rhogsol*w2i**2 - rhogeq**2*cs**2*k**3*vgsol*w1i*w2i**2)/(w2r**2 - 2*w3r*w2r + w2i**2 +& w3i**2 - 2*w2i*w3i + w3r**2)/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2)/rhogeq/Kdrag vd1r =(w3r*Kdrag*rhogsol*w1i**3*w2r - w3r*w1r**2*k*Kdrag**2*vgsol - w3r*w1r**3*rhogeq*rhogsol*w2i**2 -& w3r*rhogeq*w2r**2*w1r**3*rhogsol - w3r*w1i**2*k*Kdrag**2*vgsol + w3r*rhogeq*w1i**4*w2r*rhogsol +& w3r*Kdrag*rhogsol*w1i*w2r*w1r**2 - 2*w3r*rhogeq*w1i*k*Kdrag*vdsol*w2r*w1r +& 2*w3r*rhogeq*w2r*w1i*k*Kdrag*vgsol*w1r - w3r*rhogeq*w1i**2*w2r**2*rhogsol*w1r + w3r*w1i**2*k*Kdrag**2*vdsol +& w3r*rhogeq*w2i*w1r**2*k*Kdrag*vdsol + w3r*w1r**2*k*Kdrag**2*vdsol - w3r*Kdrag*rhogsol*w2i*w1r**3 +& w3r**2*w1i**2*rhogeq**2*k*w1r*vgsol + w3r**2*w1r**3*rhogeq**2*k*vgsol - 2*w3r**2*w2i*w1i*rhogeq**2*k*w1r*vgsol& - w3r**2*rhogeq*rhogsol*k**2*cs**2*w2r**2 - w3r**2*rhogeq*rhogsol*k**2*cs**2*w2i**2 -& w3r**2*rhogeq*w2r*w1r*rhogsol*w1i**2 + w3r**2*w2i*w1i*rhogeq*w1r**2*rhogsol +& 2*w3r*w2r*w1i**2*rhogeq**2*k*w1r*vgsol + 2*w3r*w2r*w1r**3*rhogeq**2*k*vgsol -& w3r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w1r - w3r*cs**2*k**2*rhogeq*rhogsol*w1r**3 -& 2*w3r*w1i**2*rhogeq**2*w1r**2*k*vgsol + w3r*w1i**3*rhogeq*k*Kdrag*vdsol - 2*w3r*w1i**3*Kdrag*k*rhogeq*vgsol -& w3r*w1i**2*rhogeq*w1r*rhogsol*w2i**2 + w3r*w1r**2*rhogeq*w1i*k*Kdrag*vdsol - w3r*w1r*Kdrag*rhogsol*w2i*w1i**2 -& w3r*w2i*w1i**2*rhogeq*k*Kdrag*vdsol - 2*w3r*w1r**2*Kdrag*k*rhogeq*vgsol*w1i +& 2*w3r*rhogeq*w1i**2*w2r*rhogsol*w1r**2 + rhogeq*w1i*rhogsol*k**2*cs**2*w3i**2*w2i +& rhogeq*w1i*rhogsol*k**2*cs**2*w3r**2*w2i + rhogeq**2*w1i**2*k*vgsol*w3r*w2r**2 +& rhogeq**2*w1i**2*k*vgsol*w3r*w2i**2 - w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r +& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r + w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r -& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r - rhogeq**2*cs**2*k**3*w2i**2*w1r*vgsol +& rhogeq*cs**4*k**4*w2r*w1r*rhogsol - rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol -& rhogeq*cs**2*k**3*w2r*w1i*Kdrag*vgsol - rhogeq**2*cs**2*k**3*w2r*w1i**2*vgsol +& rhogeq*cs**2*k**3*w2r*w1i*Kdrag*vdsol + rhogeq**2*cs**2*k**3*w2r*w1r**2*vgsol -& rhogeq*cs**4*k**4*w2i*w1i*rhogsol + w3i*cs**4*k**4*rhogeq*rhogsol*w2i - w3i*cs**4*k**4*rhogeq*rhogsol*w1i +& w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1i + w3i*cs**2*k**2*rhogeq*rhogsol*w1i*w2i**2 +& w3r*rhogeq**2*cs**2*k**3*w2i**2*vgsol - w3r*rhogeq*cs**4*k**4*w2r*rhogsol +& w3r*rhogeq**2*cs**2*k**3*w2r**2*vgsol - w3r*Kdrag*rhogsol*k**2*cs**2*w1i*w2r +& w3r*Kdrag*rhogsol*k**2*cs**2*w2i*w1r - w3r*Kdrag*k*rhogeq*vgsol*w2i*w1r**2 +& w3r*Kdrag*k*rhogeq*vgsol*w2i*w1i**2 - w3r*Kdrag**2*k*vdsol*w2r*w1r - w3r*Kdrag**2*k*vdsol*w2i*w1i +& w3r*Kdrag**2*k*vgsol*w2r*w1r + w3r*Kdrag**2*k*vgsol*w2i*w1i + w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1i +& w3r*Kdrag*k*rhogeq*vgsol*w1i*w2i**2 + w3r*rhogeq*cs**2*k**2*w2r**2*w1r*rhogsol +& w3r*rhogeq*w2i**2*w1r*cs**2*k**2*rhogsol - w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol -& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol + w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol +& w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol - w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol +& w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol + w3r*rhogeq*cs**4*k**4*w1r*rhogsol -& 2*w3r*rhogeq**2*cs**2*k**3*w2r*w1r*vgsol + w3r**2*rhogeq**2*cs**2*k**3*w2r*vgsol +& w3r**2*rhogeq*w2r*w1i*k*Kdrag*vgsol + w3r**2*rhogeq**2*w2r*w1i**2*k*vgsol - w3r**2*rhogeq**2*w2r*w1r**2*k*vgsol& - w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol - w3r**2*rhogeq*w2i**2*w1i**2*rhogsol +& w3r**2*rhogeq*w1r**2*w2i**2*rhogsol + w3r**2*rhogeq*w2r**2*w1r**2*rhogsol - w3r**2*rhogeq*w1i**2*w2r**2*rhogsol& - w3r**2*Kdrag*rhogsol*w1i*w2i**2 + w3r**2*Kdrag*rhogsol*w2i*w1r**2 + w3r**2*Kdrag*rhogsol*w2i*w1i**2 -& w3r**2*Kdrag*rhogsol*w2r**2*w1i - w3r**2*rhogeq*w2i*w1r*k*Kdrag*vgsol + w3i**2*rhogeq**2*cs**2*k**3*w2r*vgsol -& w3i**2*Kdrag*rhogsol*w2r**2*w1i - w3i**2*Kdrag*rhogsol*w1i*w2i**2 + w3i**2*Kdrag*rhogsol*w2i*w1r**2 +& w3i**2*Kdrag*rhogsol*w2i*w1i**2 - Kdrag*k*rhogeq*vgsol*w3i*w1r*w2r**2 - Kdrag*k*rhogeq*vgsol*w3i*w2r*w1r**2 +& Kdrag*k*rhogeq*vgsol*w3i*w2r*w1i**2 - Kdrag*k*rhogeq*vgsol*w3i*w1r*w2i**2 +& Kdrag*rhogsol*k**2*cs**2*w3i*w2r*w1r + Kdrag*rhogsol*k**2*cs**2*w2i*w3i*w1i + Kdrag*rhogsol*w2r**2*w1i**2*w3i +& Kdrag*rhogsol*w3i*w1r**2*w2r**2 + Kdrag*rhogsol*w1i**2*w2i**2*w3i + Kdrag*rhogsol*w2i**2*w1r**2*w3i -& Kdrag**2*k*vdsol*w2r*w1i*w3i + Kdrag**2*k*vdsol*w2i*w3i*w1r + Kdrag**2*k*vgsol*w2r*w1i*w3i -& Kdrag**2*k*vgsol*w2i*w3i*w1r + rhogeq*cs**2*k**3*w2i*w1r*Kdrag*vdsol - rhogeq*cs**2*k**3*w2i*w1r*Kdrag*vgsol -& w1r**3*vdsol*Kdrag*k*rhogeq*w2i - Kdrag*rhogsol*k**2*cs**2*w2i*w1r**2 + 2*Kdrag*k*rhogeq*vgsol*w2i*w1r**3 -& w3i**2*rhogeq*w2i*w1r*k*Kdrag*vgsol + w3i**2*rhogeq*w2r*w1i*k*Kdrag*vgsol + w3i**2*rhogeq**2*w2r*w1i**2*k*vgsol& - w3i**2*rhogeq**2*w2r*w1r**2*k*vgsol - w3i**2*rhogeq**2*cs**2*k**3*w1r*vgsol -& w3i**2*rhogeq*w2i**2*w1i**2*rhogsol + w3i**2*rhogeq*w1r**2*w2i**2*rhogsol + w3i**2*rhogeq*w2r**2*w1r**2*rhogsol& - w3i**2*rhogeq*w1i**2*w2r**2*rhogsol + rhogeq*w1i**3*w2r**2*rhogsol*w3i - 2*rhogeq*w2r*w1i**3*k*Kdrag*vgsol +& rhogeq*w2r**2*w1r**2*rhogsol*w3i*w1i + rhogeq**2*w2r**2*k*w1r*vgsol*w1i**2 + Kdrag**2*k*vdsol*w2r*w1r**2 -& Kdrag**2*k*vgsol*w2r*w1r**2 - rhogeq*cs**2*k**2*w2r*w1r**3*rhogsol + Kdrag**2*k*vgsol*w1r**3 -& Kdrag**2*k*vdsol*w1r**3 + rhogeq**2*w2r**2*k*w1r**3*vgsol - 2*rhogeq**2*w2r**2*k*w1r*vgsol*w3i*w1i +& rhogeq*w3i**2*cs**2*k**2*rhogsol*w2r*w1r - 2*rhogeq*w2r*w1i*k*Kdrag*vgsol*w1r**2 -& rhogeq*cs**2*k**2*w1i**2*w2r*rhogsol*w1r - w3r*rhogeq**2*k*vgsol*w2i**2*w1r**2 - rhogeq**2*w2r*w1r**4*k*vgsol -& rhogeq*w2r*w3i**2*w1r**3*rhogsol + w3i*rhogeq*k*Kdrag*vdsol*w2r*w1r**2 + rhogeq*w2r*w1i*k*Kdrag*vdsol*w1r**2 -& Kdrag*rhogsol*w3i*w2r*w1r**3 - 2*rhogeq**2*w2r*w1i**2*k*vgsol*w1r**2 - rhogeq*w3i**2*cs**2*k**2*rhogsol*w2r**2& - rhogeq*w3i**2*cs**2*k**2*rhogsol*w2i**2 - Kdrag*rhogsol*w3i*w2r*w1r*w1i**2 -& w3i*rhogeq*k*Kdrag*vdsol*w2r*w1i**2 + Kdrag**2*k*vdsol*w2r*w1i**2 - rhogeq*w2r*w3i**2*w1r*rhogsol*w1i**2 -& Kdrag**2*k*vgsol*w2r*w1i**2 + rhogeq*w2r*w1i**3*k*Kdrag*vdsol - rhogeq**2*w2r*w1i**4*k*vgsol +& cs**2*k**2*rhogeq*rhogsol*w1r**4 + w1r**2*w3i*rhogeq*rhogsol*w2i**2*w1i +& 2*rhogeq*w1i**2*rhogsol*k**2*cs**2*w1r**2 + rhogeq*w1i**4*rhogsol*k**2*cs**2 -& w2i*w1i**3*rhogeq*rhogsol*k**2*cs**2 - w1r**4*w3i*rhogeq*rhogsol*w2i - w1r**2*rhogeq*cs**4*k**4*rhogsol +& w2i*w1i**3*rhogeq*rhogsol*w3i**2 - w3i*cs**2*k**2*rhogeq*rhogsol*w1i*w1r**2 +& w2i*w1i*rhogeq*w1r**2*rhogsol*w3i**2 - w3i*cs**2*k**2*rhogeq*rhogsol*w1i**3 + w1i**3*w3i*rhogeq*rhogsol*w2i**2& - w2i*w1i*cs**2*k**2*rhogeq*rhogsol*w1r**2 + w1i**2*rhogeq**2*k*vgsol*w2i**2*w1r -& 2*w2i*w1i*rhogeq**2*k*w1r*vgsol*w3i**2 - 2*vgsol*k*rhogeq*Kdrag*w2i*w1r*w3i*w1i +& w1r**3*rhogeq**2*k*vgsol*w2i**2 - w1i**4*w3i*rhogeq*rhogsol*w2i + 2*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w1r +& rhogeq*cs**4*k**4*rhogsol*w1i**2 - 2*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w1r + Kdrag*rhogsol*k**2*cs**2*w1i**3 -& Kdrag**2*k*vdsol*w1r*w1i**2 + rhogeq**2*w3i**2*k*w1r**3*vgsol + Kdrag**2*k*vgsol*w1r*w1i**2 -& Kdrag*rhogsol*w1i**3*w3i*w2i + 2*w1r*Kdrag*k*rhogeq*vgsol*w2i*w1i**2 + 2*w2i*w1i*rhogeq**2*cs**2*k**3*w1r*vgsol& - Kdrag*rhogsol*w3i*w1r**2*w2i*w1i + rhogeq**2*w3i**2*k*w1r*vgsol*w1i**2 +& 2*w3i*rhogeq*k*Kdrag*vdsol*w1r*w2i*w1i - Kdrag*rhogsol*k**2*cs**2*w3i*w1r**2 - w3i*rhogeq*k*Kdrag*vdsol*w1r**3& + 2*rhogeq**2*cs**2*k**3*w1r*vgsol*w3i*w1i + 2*Kdrag*k*rhogeq*vgsol*w3i*w1r**3 -& Kdrag*rhogsol*k**2*cs**2*w1i**2*w2i - Kdrag*rhogsol*k**2*cs**2*w3i*w1i**2 + Kdrag*rhogsol*k**2*cs**2*w1i*w1r**2& - 2*rhogeq**2*k*vgsol*w2i**2*w1r*w3i*w1i - 2*w1r**2*w3i*rhogeq*rhogsol*w1i**2*w2i -& w1r*w1i**2*vdsol*Kdrag*k*rhogeq*w2i - 2*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i*w3i -& w3i*rhogeq*k*Kdrag*vdsol*w1r*w1i**2 + 2*Kdrag*k*rhogeq*vgsol*w3i*w1r*w1i**2 - w3r**2*rhogeq*w2r*w1r**3*rhogsol& - w3r*w1i**4*rhogeq**2*k*vgsol + w3r*rhogeq*w2r*w1r**4*rhogsol - w3r*rhogeq**2*w1r**4*k*vgsol +& 2*w1i**2*rhogeq**2*k*w1r*vgsol*w2i*w3i + w3r**2*w2i*w1i**3*rhogeq*rhogsol - w3r*rhogeq**2*w1r**2*k*vgsol*w2r**2& + 2*w1r**3*rhogeq**2*k*vgsol*w2i*w3i + w3r**2*rhogeq*rhogsol*k**2*cs**2*w2r*w1r)/(w1i**2 - 2*w3i*w1i + w3r**2 +& w1r**2 + w3i**2 - 2*w3r*w1r)/Kdrag/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2)/rhogeq/k vd1i = - (w3r**2*rhogeq*rhogsol*w1i**3*w2r + w3r*Kdrag*rhogsol*k**2*cs**2*w1i**2 +& w3r*rhogeq*rhogsol*k**2*cs**2*w1i**3 - 2*w3r*rhogeq*rhogsol*w2i*w1i**2*w1r**2 +& w3r*rhogeq*rhogsol*w1i*w2i**2*w1r**2 + w3r*rhogeq*rhogsol*w2r**2*w1i*w1r**2 -& 2*w3r*w2r*rhogeq**2*k*vgsol*w1i*w1r**2 - 2*w3r*w2r*rhogeq**2*cs**2*k**3*vgsol*w1i -& 2*w3r*w2r*rhogeq**2*k*vgsol*w1i**3 - w3r*Kdrag*rhogsol*w2r*w1i**2*w1r +& w3r*rhogeq*rhogsol*k**2*cs**2*w1i*w1r**2 + w3r*rhogeq*k*Kdrag*vdsol*w2r*w1i**2 +& w3r*Kdrag*rhogsol*k**2*cs**2*w1r**2 - w3r*Kdrag*w2i*rhogsol*w1i*w1r**2 - w3r*rhogeq*k*Kdrag*vdsol*w2r*w1r**2 +& w3r*rhogeq*k*Kdrag*vdsol*w1r**3 - 2*w3r*rhogeq*k*Kdrag*vdsol*w1r*w2i*w1i + w3r*rhogeq*k*Kdrag*vdsol*w1r*w1i**2& + 2*w3r*vgsol*k*rhogeq**2*w2i**2*w1i*w1r + 2*w3r*Kdrag*k*rhogeq*vgsol*w1i*w2i*w1r +& 2*w3r*rhogeq**2*cs**2*k**3*vgsol*w1i*w1r - 2*w3r**2*rhogeq*rhogsol*w1i*w2r**2*w1r -& w3r**2*rhogeq**2*k*vgsol*w1i*w1r**2 - 2*w3r**2*rhogeq*rhogsol*w2i**2*w1r*w1i +& 2*w3r**2*rhogeq**2*k*vgsol*w1i*w2r*w1r + w3r**2*rhogeq*rhogsol*w1i*w2r*w1r**2 +& rhogeq**2*w3i**2*w2i*w1i**2*k*vgsol - rhogeq**2*w3i**2*w2i*k*vgsol*w1r**2 - Kdrag*w3i**2*k*rhogeq*w1r**2*vgsol& - Kdrag*w1i**2*rhogeq*k*vgsol*w3i**2 - Kdrag*w3r**2*w1i**2*k*rhogeq*vgsol - Kdrag*w3r**2*w1r**2*rhogeq*k*vgsol& - rhogeq**2*w3r**2*k*vgsol*w2i*w1r**2 + rhogeq**2*w3r**2*k*vgsol*w2i*w1i**2 + w3r*Kdrag*rhogsol*w2r**2*w1r**2 +& w3r*Kdrag*rhogsol*w2r**2*w1i**2 - 3*w3r*Kdrag*k*rhogeq*vgsol*w2r*w1i**2 - w3r*Kdrag*k*rhogeq*vgsol*w2r*w1r**2 +& w3r*rhogeq*cs**2*k**2*rhogsol*w2r**2*w1i - w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r -& w3r*Kdrag*cs**2*k**2*rhogsol*w2r*w1r + w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r + w3r**2*Kdrag*rhogsol*w2r*w1r**2& + w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i + w3r**2*Kdrag*rhogeq*k*vgsol*w2r*w1r -& w3r**2*rhogeq**2*cs**2*k**3*vgsol*w1i - w3r*Kdrag**2*k*vgsol*w2r*w1i -& 4*w3r*cs**2*k**2*rhogeq*rhogsol*w2r*w1i*w1r + 2*w3r*rhogeq**2*k*vgsol*w2r**2*w1i*w1r -& Kdrag*rhogsol*w2r*w1i**3*w3i + cs**2*k**2*rhogeq*rhogsol*w2r*w1i**3 + 2*Kdrag*rhogeq*k*vgsol*w2r*w1r*w3i*w1i -& rhogeq**2*k*vgsol*w2r**2*w1i**3 - 2*rhogeq*k*Kdrag*vdsol*w1r**2*w1i**2 - rhogeq*k*Kdrag*vdsol*w1r**4 -& Kdrag*rhogsol*w2r*w1r**2*w3i*w1i + Kdrag*cs**2*k**2*rhogsol*w2r*w1r**2 +& cs**2*k**2*rhogeq*rhogsol*w2r*w1i*w1r**2 - rhogeq**2*k*vgsol*w2r**2*w1i*w1r**2 -& vgsol*k*rhogeq**2*w2i**2*w1i**3 - rhogeq*k*Kdrag*vdsol*w1i**4 - 2*rhogeq**2*k*vgsol*w1i**3*w2i*w3i -& cs**2*k**3*rhogeq*Kdrag*vgsol*w1r**2 + 4*rhogeq*cs**2*k**2*rhogsol*w2i*w1r*w3i*w1i -& rhogeq*cs**2*k**2*rhogsol*w2i*w1r*w1i**2 + w3r**2*rhogeq*rhogsol*w2i*w1r*w1i**2 -& rhogeq*cs**2*k**2*rhogsol*w2i*w1r**3 + cs**2*k**3*rhogeq*Kdrag*vdsol*w1r**2 -& 2*cs**4*k**4*rhogeq*rhogsol*w1i*w1r + w1i**3*k*Kdrag**2*vgsol - vgsol*k*rhogeq**2*w2i**2*w1i*w1r**2 -& Kdrag**2*k*vgsol*w2i*w1r**2 + rhogeq*k*Kdrag*vdsol*w2r*w1r**3 + rhogeq*k*Kdrag*vdsol*w2i*w1i*w1r**2 +& cs**2*k**3*rhogeq*Kdrag*vgsol*w1i**2 - cs**2*k**3*rhogeq*Kdrag*vdsol*w1i**2 + w1i*k*Kdrag**2*vgsol*w1r**2 +& rhogeq*w3i*w1i*k*Kdrag*vdsol*w1r**2 + 2*rhogeq**2*w3i*w1i**2*k*vgsol*w1r**2 -& rhogeq**2*w3i**2*w1i*k*vgsol*w1r**2 - rhogeq*w3i*w1r**3*cs**2*k**2*rhogsol +& rhogeq*w3i*w2i*k*Kdrag*vdsol*w1r**2 + rhogeq*w3i**2*w2r*rhogsol*w1i*w1r**2 + rhogeq*w3i**2*w2i*w1r**3*rhogsol +& rhogeq*k*Kdrag*vdsol*w2r*w1r*w1i**2 + rhogeq*w3i*w2i**2*w1r*rhogsol*w1i**2 -& Kdrag*w1r*cs**2*k**2*rhogsol*w1i**2 + Kdrag*w2i*w3i*w1r*rhogsol*w1i**2 + Kdrag*w2r*cs**2*k**2*rhogsol*w1i**2 +& rhogeq*w3i**2*w2i*w1r*rhogsol*w1i**2 + rhogeq*w3i*w1i**2*w2r**2*rhogsol*w1r +& 2*rhogeq**2*w3i**2*w1i*k*vgsol*w2r*w1r - 2*rhogeq*w3i*w1i*k*Kdrag*vdsol*w2r*w1r +& rhogeq*w3i*w1i**3*k*Kdrag*vdsol - rhogeq*w3i*w1i**2*k*Kdrag*vdsol*w2i -& rhogeq*w3i*w1r*cs**2*k**2*rhogsol*w1i**2 - 2*rhogeq*w3i**2*w2r**2*rhogsol*w1i*w1r +& rhogeq*w3i**2*w2r*rhogsol*w1i**3 - 2*rhogeq*w3i**2*w2i**2*w1r*rhogsol*w1i -& 2*rhogeq*w3i*w1i**2*w2r*rhogsol*w1r**2 + 2*Kdrag*w1i**2*k*rhogeq*vgsol*w1r**2 - w1i**3*k*Kdrag**2*vdsol +& Kdrag*w1r**4*rhogeq*k*vgsol + rhogeq*k*Kdrag*vdsol*w2i*w1i**3 + 2*rhogeq**2*k*vgsol*w2i*w1i**2*w1r**2 +& 2*rhogeq**2*cs**2*k**3*vgsol*w1i*w2r*w1r + Kdrag**2*k*vdsol*w2i*w1r**2 - 2*rhogeq**2*k*vgsol*w1i*w1r**2*w2i*w3i& + w3i*k*Kdrag**2*vdsol*w1r**2 + rhogeq*w3i*w2i**2*w1r**3*rhogsol - w3i*k*Kdrag**2*vgsol*w1r**2 +& rhogeq**2*w3i*w1r**4*k*vgsol - w1i*k*Kdrag**2*vdsol*w1r**2 - w3i*rhogeq**2*k*vgsol*w2r**2*w1r**2 -& rhogeq*cs**2*k**3*vdsol*Kdrag*w2r*w1r + w3i*Kdrag*k*rhogeq*vgsol*w2r**2*w1i -& w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1r + 2*w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w1r**2 -& 2*w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w1i**2 + w3i*rhogeq**2*k*vgsol*w2r**2*w1i**2 +& w3i**2*Kdrag*rhogeq*k*vgsol*w2r*w1r - w1i**2*k*Kdrag**2*vgsol*w2i + w3i*rhogeq**2*cs**2*k**3*vgsol*w2r**2 -& Kdrag*k*rhogeq*vgsol*w2r**2*w1r**2 - Kdrag*k*rhogeq*vgsol*w2r**2*w1i**2 +& w3i**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i + rhogeq*cs**4*k**4*rhogsol*w2r*w1i -& w3i*rhogeq*cs**4*k**4*rhogsol*w2r - w3i*Kdrag*cs**2*k**2*rhogsol*w2r*w1i + w1i**2*k*Kdrag**2*vdsol*w2i -& rhogeq**2*w3i**2*w1i**3*k*vgsol + rhogeq**2*w3i*w1i**4*k*vgsol - rhogeq*w3i*w2r*w1r**4*rhogsol -& Kdrag*w1r**3*cs**2*k**2*rhogsol + Kdrag*w2i*w3i*w1r**3*rhogsol + rhogeq*w3i*w2r**2*w1r**3*rhogsol -& w3i*k*Kdrag**2*vgsol*w1i**2 + w3i*k*Kdrag**2*vdsol*w1i**2 + rhogeq**2*k*vgsol*w2i*w1r**4 -& rhogeq*w3i*w1i**4*w2r*rhogsol + Kdrag*w1i**4*k*rhogeq*vgsol + cs**2*k**3*rhogeq*Kdrag*vgsol*w2r*w1r -& w3i**2*cs**2*k**3*rhogeq**2*vgsol*w1i - w3i**2*Kdrag*rhogsol*w2r**2*w1r - w3i*Kdrag**2*k*vdsol*w2r*w1r +& w3i**2*Kdrag*rhogsol*w2r*w1r**2 + w3i**2*Kdrag*rhogsol*w2r*w1i**2 + w3i*Kdrag**2*k*vgsol*w2r*w1r +& rhogeq**2*k*vgsol*w2i*w1i**4 - w3r*Kdrag*rhogsol*w2r*w1r**3 + w3r*rhogeq*rhogsol*w2r**2*w1i**3 -& w3r**2*rhogeq**2*k*vgsol*w1i**3 + w3r**2*rhogeq*rhogsol*w2i*w1r**3 + w3r**2*Kdrag*rhogsol*w2r*w1i**2 -& w3r**2*Kdrag*rhogsol*w2r**2*w1r - w3r*rhogeq*rhogsol*w2i*w1i**4 + w3r*rhogeq*rhogsol*w1i**3*w2i**2 -& w3r*Kdrag*w2i*rhogsol*w1i**3 - w3r*rhogeq*rhogsol*w2i*w1r**4 - rhogeq**2*cs**2*k**3*vgsol*w1i*w2r**2 +& w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1r + w3r*Kdrag**2*k*vdsol*w2r*w1i + 2*w3r*rhogeq*cs**2*k**2*rhogsol*w2i*w1r**2& + w3r*cs**4*k**4*rhogeq*rhogsol*w1i - w3r*Kdrag*cs**2*k**2*rhogsol*w1i*w2i -& w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r - w3i*Kdrag**2*k*vdsol*w1i*w2i + w3i*Kdrag**2*k*vgsol*w1i*w2i +& w3r*Kdrag**2*k*vgsol*w2i*w1r + cs**2*k**3*rhogeq*Kdrag*vdsol*w1i*w2i + w3i**2*Kdrag*rhogeq*k*vgsol*w1i*w2i -& Kdrag*rhogeq*k*vgsol*w2i**2*w1r**2 - Kdrag*rhogeq*k*vgsol*w2i**2*w1i**2 + w3r*Kdrag*k*rhogeq*vgsol*w2i**2*w1r +& w3i*rhogeq*k*Kdrag*vgsol*w2i**2*w1i - 3*w3i*rhogeq*k*Kdrag*vgsol*w2i*w1r**2 -& w3i*rhogeq*k*Kdrag*vgsol*w1i**2*w2i + w3i*rhogeq**2*k*vgsol*w2i**2*w1i**2 -& w3i*rhogeq**2*cs**2*k**3*vgsol*w1r**2 + w3i*rhogeq**2*cs**2*k**3*vgsol*w1i**2 +& w3r**2*Kdrag*k*rhogeq*vgsol*w1i*w2i + w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r +& w3i*Kdrag*cs**2*k**2*rhogsol*w2i*w1r + rhogeq*cs**4*k**4*rhogsol*w2i*w1r -& w3r**2*rhogeq*cs**2*k**2*rhogsol*w2i*w1r + w3r**2*vgsol*rhogeq**2*k**3*cs**2*w2i -& w3i*rhogeq*cs**2*k**3*vdsol*Kdrag*w2i + w3i*rhogeq*cs**2*k**3*vdsol*Kdrag*w1i -& cs**2*k**3*rhogeq*Kdrag*vgsol*w1i*w2i - w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1i +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i + w3i*rhogeq*cs**4*k**4*rhogsol*w1r +& w3i**2*vgsol*rhogeq**2*k**3*cs**2*w2i - w3i**2*rhogeq*cs**2*k**2*rhogsol*w2i*w1r +& w3i*rhogeq**2*cs**2*k**3*vgsol*w2i**2 - 2*w3i*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i -& w3i*rhogeq**2*k*vgsol*w2i**2*w1r**2 + w3r*Kdrag*rhogsol*w2i**2*w1r**2 + rhogeq**2*cs**2*k**3*vgsol*w1i**2*w2i -& rhogeq**2*cs**2*k**3*vgsol*w2i*w1r**2 - w3r*Kdrag**2*k*vdsol*w2i*w1r - w3r*cs**4*k**4*rhogeq*rhogsol*w2i -& 2*w3r*rhogeq*cs**2*k**2*rhogsol*w1i**2*w2i + w3r*rhogeq*cs**2*k**2*rhogsol*w2i**2*w1i +& w3r*Kdrag*rhogsol*w2i**2*w1i**2 - w3i*rhogeq*cs**2*k**2*rhogsol*w2i**2*w1r - w3i**2*Kdrag*rhogsol*w2i**2*w1r -& w3r**2*Kdrag*rhogsol*w2i**2*w1r - rhogeq**2*cs**2*k**3*vgsol*w1i*w2i**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2& + w3i**2 - 2*w3r*w1r)/Kdrag/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2)/rhogeq/k endif !------------------------------- ! G A S D E N S I T I E S !------------------------------- rhog3r =(w3r**2*k*rhogeq*vgsol*w1i + w3r**2*w2i*rhogeq*k*vgsol - w3r**2*w2r*w1i*rhogsol - w3i**2*w2i*rhogeq*k*vgsol +& w3i**2*w2r*w1i*rhogsol - w3i*w1i**2*w2r*rhogsol - w3i*w2i**2*w1r*rhogsol - w3i*w2r**2*w1r*rhogsol -& w3i*w2r*w1r**2*rhogsol + w3i**2*rhogsol*w2i*w1r - w3i*w1i*k*Kdrag*vdsol + k*Kdrag*vdsol*w2i*w1i -& k*Kdrag*vgsol*w2i*w1i + w3i*w1i**2*k*rhogeq*vgsol + w3i*w1r**2*rhogeq*k*vgsol - w3i*w1r*cs**2*k**2*rhogsol -& w3i*w2i*k*Kdrag*vdsol + w3i*w1i*k*Kdrag*vgsol + w3i*w2i*k*Kdrag*vgsol + w3i*w2r**2*rhogeq*k*vgsol -& w3i**2*k*Kdrag*vgsol - k*Kdrag*vdsol*w2r*w1r + w3i**2*k*Kdrag*vdsol - k*rhogeq*vgsol*w2r**2*w1i -& w3i*w2r*cs**2*k**2*rhogsol + w3i*w2i**2*rhogeq*k*vgsol + k*Kdrag*vgsol*w2r*w1r - k*rhogeq*vgsol*w2i*w1r**2 +& rhogsol*k**2*cs**2*w2i*w1r + rhogsol*k**2*cs**2*w1i*w2r - k*rhogeq*vgsol*w1i*w2i**2 - w3i**2*k*rhogeq*vgsol*w1i& - k*rhogeq*vgsol*w2i*w1i**2 + w3r*k*Kdrag*vdsol*w2r + 2*w3r*w3i*rhogsol*k**2*cs**2 - w3r*rhogsol*k**2*cs**2*w1i& + w3r*k*Kdrag*vdsol*w1r - w3r*rhogsol*k**2*cs**2*w2i + 2*w3r*w3i*w2r*w1r*rhogsol - 2*w3r*w3i*w2i*rhogsol*w1i -& w3r*k*Kdrag*vgsol*w2r - w3r*k*Kdrag*vgsol*w1r + w3r*rhogsol*w2i*w1i**2 + w3r*rhogsol*w2i*w1r**2 +& w3r*rhogsol*w2r**2*w1i + w3r*rhogsol*w1i*w2i**2 + w3r**2*k*Kdrag*vgsol - w3r**2*k*Kdrag*vdsol -& w3r**2*rhogsol*w2i*w1r + 2*w3i*w2r*k*rhogeq*w1r*vgsol + 2*w3i*k*w2i*rhogeq*w1i*vgsol -& 2*w3r*w3i*w2r*vgsol*k*rhogeq - 2*w3r*w3i*k*rhogeq*w1r*vgsol)/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i& + w3r**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r) rhog3i = - ( - rhogsol*w1i**2*w2r**2 - rhogsol*w1i**2*w2i**2 - rhogsol*w1r**2*w2r**2 - rhogsol*w1r**2*w2i**2 -& 2*w3r*rhogeq*k*vgsol*w2i*w1i + rhogsol*w2i**2*w3i*w1i + rhogsol*k**2*cs**2*w1r*w3r - rhogsol*k**2*cs**2*w3i*w1i& - vgsol*k*rhogeq*w3r*w2i**2 - vgsol*Kdrag*k*w3r*w1i - vgsol*Kdrag*k*w3r*w2i + 2*w3r*rhogeq*k*vgsol*w3i*w1i +& rhogsol*w1i**2*w2i*w3i + rhogsol*w1i*w2i*w3r**2 + rhogsol*w2i*w3i*w1r**2 - rhogsol*w1i*w2i*w3i**2 +& rhogsol*w2i**2*w3r*w1r - rhogsol*k**2*cs**2*w2i*w3i - vgsol*k*rhogeq*w3r*w1i**2 + w3r*rhogsol*k**2*cs**2*w2r -& 2*w3r*w2r*k*rhogeq*w1r*vgsol + w3r**2*w2r*vgsol*k*rhogeq - w3r*w2r**2*rhogeq*k*vgsol -& vgsol*k*rhogeq*w3r*w1r**2 + vgsol*k*rhogeq*w3r**2*w1r + vdsol*Kdrag*k*w3r*w1i - vdsol*Kdrag*k*w2i*w1r +& vdsol*Kdrag*k*w3r*w2i + vdsol*Kdrag*k*w3i*w1r + rhogsol*k**2*cs**2*w1i*w2i + vgsol*Kdrag*k*w2i*w1r -& vgsol*Kdrag*k*w3i*w1r - vgsol*k*rhogeq*w1r*w3i**2 + vgsol*k*rhogeq*w2i**2*w1r - rhogsol*k**2*cs**2*w2r*w1r -& w3r**2*w2r*w1r*rhogsol + w3r*w2r*rhogsol*w1i**2 + w3r*w2r*w1r**2*rhogsol + w3r*w2r**2*w1r*rhogsol -& 2*w3r*w1r*rhogsol*w2i*w3i + 2*vgsol*Kdrag*k*w3i*w3r - 2*vdsol*Kdrag*k*w3i*w3r - w3r**2*rhogsol*k**2*cs**2 +& 2*w3r*rhogeq*k*vgsol*w2i*w3i + rhogsol*k**2*cs**2*w3i**2 - 2*w2r*rhogsol*w3i*w1i*w3r +& vgsol*k*rhogeq*w2r*w1r**2 + vgsol*k*rhogeq*w1r*w2r**2 + vgsol*k*rhogeq*w2r*w1i**2 - vgsol*k*rhogeq*w2r*w3i**2 +& vgsol*Kdrag*k*w1i*w2r - vgsol*Kdrag*k*w2r*w3i + rhogsol*w2r**2*w3i*w1i + rhogsol*w2r*w1r*w3i**2 +& vdsol*Kdrag*k*w2r*w3i - vdsol*Kdrag*k*w1i*w2r)/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i +& w3r**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r) rhog2r =( - w3r**2*k*rhogeq*vgsol*w1i + w3r**2*w2i*rhogeq*k*vgsol + w3r**2*w2r*w1i*rhogsol +& w3i**2*w2i*rhogeq*k*vgsol + w3i**2*w2r*w1i*rhogsol + w3i*w1i**2*w2r*rhogsol + w3i*w2i**2*w1r*rhogsol -& w3i*w2r**2*w1r*rhogsol + w3i*w2r*w1r**2*rhogsol + 2*rhogsol*w3r*w2i*w1r*w2r + 2*cs**2*k**2*rhogsol*w2r*w2i -& k*Kdrag*vgsol*w2i**2 + k*Kdrag*vgsol*w2r**2 - 2*rhogsol*w2r*w2i*w3i*w1i + k*Kdrag*vdsol*w2i**2 -& k*Kdrag*vdsol*w2r**2 - 2*vgsol*rhogeq*k*w3r*w2r*w2i - 2*vgsol*rhogeq*k*w2i*w1r*w2r +& 2*vgsol*rhogeq*k*w3r*w2i*w1r - w3i**2*rhogsol*w2i*w1r + w3i*w1i*k*Kdrag*vdsol - k*Kdrag*vdsol*w2i*w1i +& k*Kdrag*vgsol*w2i*w1i - w3i*w1i**2*k*rhogeq*vgsol - w3i*w1r**2*rhogeq*k*vgsol + w3i*w1r*cs**2*k**2*rhogsol -& w3i*w2i*k*Kdrag*vdsol - w3i*w1i*k*Kdrag*vgsol + w3i*w2i*k*Kdrag*vgsol + w3i*w2r**2*rhogeq*k*vgsol +& k*Kdrag*vdsol*w2r*w1r + k*rhogeq*vgsol*w2r**2*w1i - w3i*w2r*cs**2*k**2*rhogsol - w3i*w2i**2*rhogeq*k*vgsol -& k*Kdrag*vgsol*w2r*w1r + k*rhogeq*vgsol*w2i*w1r**2 - rhogsol*k**2*cs**2*w2i*w1r - rhogsol*k**2*cs**2*w1i*w2r -& k*rhogeq*vgsol*w1i*w2i**2 - w3i**2*k*rhogeq*vgsol*w1i + k*rhogeq*vgsol*w2i*w1i**2 + w3r*k*Kdrag*vdsol*w2r +& w3r*rhogsol*k**2*cs**2*w1i - w3r*k*Kdrag*vdsol*w1r - w3r*rhogsol*k**2*cs**2*w2i - w3r*k*Kdrag*vgsol*w2r +& w3r*k*Kdrag*vgsol*w1r - w3r*rhogsol*w2i*w1i**2 - w3r*rhogsol*w2i*w1r**2 - w3r*rhogsol*w2r**2*w1i +& w3r*rhogsol*w1i*w2i**2 - w3r**2*rhogsol*w2i*w1r + 2*w3i*k*w2i*rhogeq*w1i*vgsol)/(w2r**2 - 2*w3r*w2r + w2i**2 +& w3i**2 - 2*w2i*w3i + w3r**2)/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2) rhog2i =( - 2*w2i*w2r*vgsol*k*rhogeq*w1i + 2*w3r*w2i*rhogsol*w1i*w2r - 2*w2i*k*rhogeq*vgsol*w2r*w3i +& rhogsol*w2i**2*w3i*w1i + rhogsol*k**2*cs**2*w1r*w3r - rhogsol*k**2*cs**2*w3i*w1i + vgsol*k*rhogeq*w3r*w2i**2 -& vgsol*Kdrag*k*w3r*w1i + vgsol*Kdrag*k*w3r*w2i - rhogsol*w1i**2*w2i*w3i - rhogsol*w1i*w2i*w3r**2 -& rhogsol*w2i*w3i*w1r**2 - rhogsol*w1i*w2i*w3i**2 - rhogsol*w2i**2*w3r*w1r + rhogsol*k**2*cs**2*w2i*w3i -& vgsol*k*rhogeq*w3r*w1i**2 - w3r*rhogsol*k**2*cs**2*w2r + 2*w3r*w2r*k*rhogeq*w1r*vgsol +& w3r**2*w2r*vgsol*k*rhogeq - w3r*w2r**2*rhogeq*k*vgsol - vgsol*k*rhogeq*w3r*w1r**2 - vgsol*k*rhogeq*w3r**2*w1r +& vdsol*Kdrag*k*w3r*w1i - vdsol*Kdrag*k*w2i*w1r - vdsol*Kdrag*k*w3r*w2i + vdsol*Kdrag*k*w3i*w1r +& rhogsol*k**2*cs**2*w1i*w2i + vgsol*Kdrag*k*w2i*w1r - vgsol*Kdrag*k*w3i*w1r - vgsol*k*rhogeq*w1r*w3i**2 +& vgsol*k*rhogeq*w2i**2*w1r - rhogsol*k**2*cs**2*w2r*w1r - w3r**2*w2r*w1r*rhogsol - w3r*w2r*rhogsol*w1i**2 -& w3r*w2r*w1r**2*rhogsol + w3r*w2r**2*w1r*rhogsol + rhogsol*w3r**2*w1i**2 + rhogsol*w3r**2*w1r**2 +& rhogsol*w1i**2*w3i**2 + vgsol*k*rhogeq*w2r*w1r**2 - vgsol*k*rhogeq*w1r*w2r**2 + vgsol*k*rhogeq*w2r*w1i**2 +& rhogsol*w3i**2*w1r**2 - w2i**2*rhogsol*k**2*cs**2 + vgsol*k*rhogeq*w2r*w3i**2 + vgsol*Kdrag*k*w1i*w2r +& vgsol*Kdrag*k*w2r*w3i + w2r**2*rhogsol*k**2*cs**2 + 2*w2i*k*Kdrag*vdsol*w2r + 2*w2i*rhogsol*w3i*w2r*w1r -& 2*w2i*k*Kdrag*vgsol*w2r + 2*w2r*w3i*k*rhogeq*w1i*vgsol - rhogsol*w2r**2*w3i*w1i - rhogsol*w2r*w1r*w3i**2 -& vdsol*Kdrag*k*w2r*w3i - vdsol*Kdrag*k*w1i*w2r)/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i +& w3r**2)/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2) rhog1r = - ( - w3r**2*k*rhogeq*vgsol*w1i - 2*rhogsol*k**2*cs**2*w1i*w1r + 2*k*rhogeq*vgsol*w1i*w2r*w1r +& 2*rhogsol*w2i*w1r*w3i*w1i + 2*w3r*k*rhogeq*vgsol*w1i*w1r - 2*w3r*w2r*k*rhogeq*vgsol*w1i -& 2*w3r*w2r*w1i*rhogsol*w1r + w3r**2*w2i*rhogeq*k*vgsol + w3r**2*w2r*w1i*rhogsol + w3i**2*w2i*rhogeq*k*vgsol +& w3i**2*w2r*w1i*rhogsol - w3i*w1i**2*w2r*rhogsol - w3i*w2i**2*w1r*rhogsol - w3i*w2r**2*w1r*rhogsol +& w3i*w2r*w1r**2*rhogsol - w3i**2*rhogsol*w2i*w1r + w3i*w1i*k*Kdrag*vdsol + k*Kdrag*vdsol*w2i*w1i -& k*Kdrag*vgsol*w2i*w1i + w3i*w1i**2*k*rhogeq*vgsol - w3i*w1r**2*rhogeq*k*vgsol + w3i*w1r*cs**2*k**2*rhogsol -& w3i*w2i*k*Kdrag*vdsol - w3i*w1i*k*Kdrag*vgsol + w3i*w2i*k*Kdrag*vgsol + w3i*w2r**2*rhogeq*k*vgsol -& k*Kdrag*vdsol*w2r*w1r - k*rhogeq*vgsol*w2r**2*w1i - w3i*w2r*cs**2*k**2*rhogsol + w3i*w2i**2*rhogeq*k*vgsol +& k*Kdrag*vgsol*w2r*w1r - k*rhogeq*vgsol*w2i*w1r**2 + rhogsol*k**2*cs**2*w2i*w1r + rhogsol*k**2*cs**2*w1i*w2r -& k*rhogeq*vgsol*w1i*w2i**2 - w3i**2*k*rhogeq*vgsol*w1i + k*rhogeq*vgsol*w2i*w1i**2 + w3r*k*Kdrag*vdsol*w2r +& w3r*rhogsol*k**2*cs**2*w1i - w3r*k*Kdrag*vdsol*w1r - w3r*rhogsol*k**2*cs**2*w2i - w3r*k*Kdrag*vgsol*w2r +& w3r*k*Kdrag*vgsol*w1r - Kdrag*w1r**2*k*vgsol - w3r*rhogsol*w2i*w1i**2 + w3r*rhogsol*w2i*w1r**2 +& Kdrag*w1i**2*k*vgsol + w3r*rhogsol*w2r**2*w1i + w3r*rhogsol*w1i*w2i**2 + k*Kdrag*vdsol*w1r**2 -& w3r**2*rhogsol*w2i*w1r - k*Kdrag*vdsol*w1i**2 - 2*w3i*k*w2i*rhogeq*w1i*vgsol)/(w1i**2 - 2*w3i*w1i + w3r**2 +& w1r**2 + w3i**2 - 2*w3r*w1r)/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2) rhog1i = - ( - 2*vdsol*Kdrag*k*w1i*w1r + rhogsol*w2i**2*w3i*w1i + rhogsol*k**2*cs**2*w1i**2 -& rhogsol*k**2*cs**2*w1r**2 + rhogsol*k**2*cs**2*w1r*w3r - rhogsol*k**2*cs**2*w3i*w1i + vgsol*k*rhogeq*w3r*w2i**2& + 2*vgsol*Kdrag*k*w1i*w1r - vgsol*Kdrag*k*w3r*w1i + vgsol*Kdrag*k*w3r*w2i - rhogsol*w1i**2*w2i*w3i +& rhogsol*w1i*w2i*w3r**2 - 2*rhogsol*w1i*w2i*w3r*w1r + rhogsol*w2i*w3i*w1r**2 + rhogsol*w1i*w2i*w3i**2 +& rhogsol*w2i**2*w3r*w1r + rhogsol*k**2*cs**2*w2i*w3i - vgsol*k*rhogeq*w3r*w1i**2 - w3r*rhogsol*k**2*cs**2*w2r -& 2*w3r*w2r*k*rhogeq*w1r*vgsol + w3r**2*w2r*vgsol*k*rhogeq + w3r*w2r**2*rhogeq*k*vgsol +& vgsol*k*rhogeq*w3r*w1r**2 + 2*vgsol*k*rhogeq*w1r*w2i*w1i - vgsol*k*rhogeq*w3r**2*w1r + vdsol*Kdrag*k*w3r*w1i +& vdsol*Kdrag*k*w2i*w1r - vdsol*Kdrag*k*w3r*w2i + vdsol*Kdrag*k*w3i*w1r - w3r**2*rhogsol*w2r**2 -& rhogsol*k**2*cs**2*w1i*w2i - vgsol*Kdrag*k*w2i*w1r - vgsol*Kdrag*k*w3i*w1r + 2*vgsol*k*rhogeq*w1i*w1r*w3i -& vgsol*k*rhogeq*w1r*w3i**2 - 2*vgsol*k*rhogeq*w2i*w1r*w3i - vgsol*k*rhogeq*w2i**2*w1r +& rhogsol*k**2*cs**2*w2r*w1r + w3r**2*w2r*w1r*rhogsol + w3r*w2r*rhogsol*w1i**2 - w3r*w2r*w1r**2*rhogsol +& w3r*w2r**2*w1r*rhogsol + vgsol*k*rhogeq*w2r*w1r**2 - vgsol*k*rhogeq*w1r*w2r**2 - vgsol*k*rhogeq*w2r*w1i**2 -& rhogsol*w2i**2*w3i**2 - rhogsol*w2i**2*w3r**2 + vgsol*k*rhogeq*w2r*w3i**2 - vgsol*Kdrag*k*w1i*w2r +& vgsol*Kdrag*k*w2r*w3i - 2*rhogsol*w2r*w1r*w3i*w1i + rhogsol*w2r**2*w3i*w1i + rhogsol*w2r*w1r*w3i**2 -& vdsol*Kdrag*k*w2r*w3i + vdsol*Kdrag*k*w1i*w2r - rhogsol*w2r**2*w3i**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 +& w3i**2 - 2*w3r*w1r)/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2) !------------------------------- ! D U S T D E N S I T I E S !------------------------------- if (Kdrag > 0.) then rhod3r = - rhodeq*( - w3r**3*rhogeq*w1i**2*w2r**2*rhogsol - w3r**2*Kdrag**2*k*vgsol*w2r*w1r +& w3r**2*Kdrag**2*k*vgsol*w2i*w1i - w3r**2*Kdrag**2*k*vdsol*w2i*w1i + w3r**2*Kdrag*k*rhogeq*vgsol*w2i*w1i**2 +& w3r**2*Kdrag**2*k*vdsol*w2r*w1r - w3r**2*Kdrag*rhogsol*k**2*cs**2*w2i*w1r +& w3r**2*Kdrag*k*rhogeq*vgsol*w2i*w1r**2 - w3r**2*Kdrag*rhogsol*k**2*cs**2*w1i*w2r +& w3r**2*rhogeq**2*w2i*w1i**2*w3i*k*vgsol - 4*w3r**2*rhogeq**2*w3i**2*k*w2i*w1i*vgsol -& 2*w3r**2*rhogeq*w2i*w3i**2*k*Kdrag*vgsol + w3r**2*rhogeq*w2r*w3i*w1r*k*Kdrag*vdsol -& 2*w3r**2*rhogeq**2*w1i**2*k*vgsol*w3i**2 - w3r**2*rhogeq*w2i*w3i*w1i*k*Kdrag*vgsol +& w3r**5*rhogeq*w2i*rhogsol*w1i + w3r**2*rhogeq**2*w2i*k*vgsol*w3i*w1r**2 - w3r**5*rhogeq*rhogsol*k**2*cs**2 -& w3r**5*rhogeq*w2r*w1r*rhogsol + w3r**5*rhogeq**2*k*w1r*vgsol + 3*w3r**2*rhogeq*cs**2*k**3*w3i*Kdrag*vdsol +& w3r**5*rhogeq**2*w2r*vgsol*k + 2*w3r**2*rhogeq*w3i**2*cs**2*k**2*rhogsol*w1r -& w3r**2*rhogeq*cs**4*k**4*w2r*rhogsol - 2*w3r**2*rhogeq**2*w3i**2*k*w1r**2*vgsol +& 2*w3r**2*rhogeq*w2r*w3i**2*cs**2*k**2*rhogsol - w3r*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i**2 -& w3r**3*Kdrag*rhogsol*w2i*w1i**2 - w3r**3*Kdrag*rhogsol*w2r**2*w1i - w3r**3*Kdrag*rhogsol*w1i*w2i**2 -& w3r**3*Kdrag*rhogsol*w2i*w1r**2 - w3r**3*rhogeq*w2r*w1i*k*Kdrag*vdsol + w3r**3*rhogeq**2*w2r*w1r**2*k*vgsol +& w3r**3*rhogeq**2*w2r*w1i**2*k*vgsol - w3r**3*rhogeq**2*cs**2*k**3*w1r*vgsol +& w3r**3*rhogeq*w2r*w1i*k*Kdrag*vgsol - w3r**3*Kdrag**2*k*vdsol*w2r + 2*w3r**3*Kdrag*k*rhogeq*vgsol*w3i*w1r +& 2*w3r**3*rhogeq**2*w2r*k*vgsol*w3i**2 + 2*w3r**3*Kdrag*k*rhogeq*vgsol*w2r*w3i +& w3r**3*Kdrag*rhogsol*k**2*cs**2*w1i - w3r**3*rhogeq**2*cs**2*k**3*w2r*vgsol -& 2*w3r**3*Kdrag*rhogsol*k**2*cs**2*w3i + w3r**3*Kdrag*rhogsol*k**2*cs**2*w2i +& 2*w3r**3*Kdrag*rhogsol*w2i*w3i*w1i - w3r**3*rhogeq*w2i**2*w1i**2*rhogsol - 2*w3r**3*Kdrag*rhogsol*w3i*w2r*w1r -& w3r**2*rhogeq*w2i*w3i*w1i*k*Kdrag*vdsol - w3r**3*rhogeq*w1r**2*w2i**2*rhogsol -& w3r**2*rhogeq*cs**4*k**4*w1r*rhogsol - 3*w3r**2*rhogeq**2*cs**2*k**3*w3i*w1i*vgsol -& 3*w3r**2*rhogeq*cs**2*k**3*w3i*Kdrag*vgsol - w3r**2*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol -& w3r**2*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol + w3r**2*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol +& w3r**2*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol - w3r**3*rhogeq*w2r**2*w1r**2*rhogsol +& w3r**2*rhogeq**2*w2i**2*w3i*w1i*k*vgsol + w3r**2*rhogeq**2*cs**2*k**3*w1i**2*vgsol +& w3r**3*rhogeq*cs**4*k**4*rhogsol - 3*w3r**2*rhogeq**2*cs**2*k**3*w3i*w2i*vgsol +& 2*w3r**2*rhogeq*w2r*w3i**2*w1r**2*rhogsol + w3r**2*rhogeq**2*cs**2*k**3*w1r**2*vgsol -& 2*w3r**2*rhogeq**2*w3i**2*w2i**2*k*vgsol + 2*w3r**2*rhogeq*w2i**2*w3i**2*w1r*rhogsol +& w3r**2*rhogeq**2*w3i*w2r**2*w1i*k*vgsol + 2*w3r**2*rhogeq*w1i*w3i**2*k*Kdrag*vdsol +& 2*w3r**2*rhogeq*w1i**2*w3i**2*w2r*rhogsol - 2*w3r**2*rhogeq*w1i*w3i**2*k*Kdrag*vgsol +& 2*w3r**2*rhogeq*w2r**2*w3i**2*w1r*rhogsol - 4*w3r**2*rhogeq**2*w2r*w3i**2*k*w1r*vgsol -& 3*w3r**2*rhogeq*w2r*w3i*w1r*k*Kdrag*vgsol - 2*w3r**2*rhogeq**2*w2r**2*w3i**2*k*vgsol +& 2*w3r**2*rhogeq*w2i*w3i**2*k*Kdrag*vdsol + w3r**3*rhogeq**2*w2r**2*k*w1r*vgsol -& 2*w3r**3*rhogeq*w3i**2*cs**2*k**2*rhogsol + w3r**4*rhogeq*w2i**2*w1r*rhogsol + w3r**4*Kdrag*rhogsol*w1i*w2r +& w3r**4*rhogeq*w2r*w1r**2*rhogsol + w3r**4*rhogeq*w1i**2*w2r*rhogsol - 2*w3r**4*rhogeq**2*k*w2i*w1i*vgsol -& 2*w3r**4*rhogeq*w1i*k*Kdrag*vgsol - w3r**4*rhogeq**2*w2r**2*k*vgsol + w3r**4*rhogeq*w1i*k*Kdrag*vdsol -& w3r**4*rhogeq**2*w1r**2*k*vgsol + w3r**4*rhogeq*w1r*cs**2*k**2*rhogsol + w3r**4*rhogeq*w2r*cs**2*k**2*rhogsol -& 2*w3r**4*rhogeq*w2i*k*Kdrag*vgsol - w3r**4*rhogeq**2*w1i**2*k*vgsol + w3r**4*rhogeq*w2r**2*w1r*rhogsol +& w3r**3*rhogeq*w2i*w1r*k*Kdrag*vgsol + w3r**4*Kdrag**2*k*vdsol + 2*w3r**3*rhogeq*w1i*w3i**2*rhogsol*w2i -& 2*w3r**4*rhogeq**2*w2r*k*w1r*vgsol + 2*w3r**3*rhogeq**2*w3i**2*k*w1r*vgsol -& w3r**3*rhogeq*w2i*w1r*k*Kdrag*vdsol + w3r**3*rhogeq**2*w2i**2*w1r*k*vgsol -& 2*w3r**3*rhogeq*w2r*w3i**2*w1r*rhogsol + w3r**4*rhogeq*w2i*k*Kdrag*vdsol - w3r**4*rhogeq**2*w2i**2*k*vgsol +& w3r**3*Kdrag**2*k*vgsol*w1r + w3r**4*Kdrag*rhogsol*w2i*w1r - w3r**4*Kdrag**2*k*vgsol -& w3r**3*Kdrag**2*k*vdsol*w1r + w3r**3*Kdrag**2*k*vgsol*w2r + w1i*w3i**3*k*Kdrag**2*vdsol +& 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r + w3r*rhogeq**2*w3i**4*w2r*k*vgsol +& 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r - 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r -& 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r + w3r*rhogeq**2*w3i**4*k*w1r*vgsol -& w3r*rhogeq*w3i**4*w2r*w1r*rhogsol + 2*w3r*w3i*cs**4*k**4*rhogeq*rhogsol*w2i + w3r*rhogeq*w3i**4*w1i*rhogsol*w2i& - w2i*w3i**3*k*Kdrag**2*vgsol + 2*w3r*rhogeq*w3i**3*k*Kdrag*vgsol*w2r + w2i*w3i**3*k*Kdrag**2*vdsol -& w1i*w3i**3*k*Kdrag**2*vgsol - w3r*rhogeq*w3i**4*cs**2*k**2*rhogsol -& 2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w1i*w2i**2 - 2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1i) !--break to avoid too many continuation lines rhod3r = rhod3r - rhodeq*( & 2*w3r*w3i**3*Kdrag*rhogsol*w2i*w1i - 2*w3r*w3i**3*Kdrag*rhogsol*w2r*w1r - 2*w3r*w3i**3*Kdrag*rhogsol*k**2*cs**2& + w3r*w3i**2*Kdrag**2*k*vgsol*w1r + 2*w3r*w3i*cs**4*k**4*rhogeq*rhogsol*w1i +& w3r*rhogeq*cs**2*k**2*w1i**2*w2r**2*rhogsol + w3r*rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol -& w3r*rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol + w3r**2*rhogeq**2*cs**2*k**3*w2r**2*vgsol +& w3r**2*rhogeq*w2r**2*w1i*k*Kdrag*vgsol - 2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w1i**2 -& 2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w1r**2 + w1r*w3i**2*cs**2*k**2*rhogeq*rhogsol*w2i**2 -& w1r*w3r**2*cs**2*k**2*rhogeq*rhogsol*w2i**2 - w2r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r**2 -& w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol + w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol -& w2r*w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol - w2r*w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol +& w2r*w3r*rhogeq*cs**4*k**4*w1r*rhogsol + 2*w2r*w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol +& rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r*w1r - w3r*w3i**2*rhogeq*w2i*w1r*k*Kdrag*vdsol +& 3*w3r*w3i**2*rhogeq**2*cs**2*k**3*w2r*vgsol + w3r*w3i**2*Kdrag*rhogsol*k**2*cs**2*w1i +& 2*w3r*rhogeq*w3i**3*k*Kdrag*vgsol*w1r + rhogeq*w3i**2*cs**2*k**2*rhogsol*w1r*w2r**2 -& w3r**2*rhogeq*rhogsol*k**2*cs**2*w2r**2*w1r - w2r*w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2 +& rhogeq*w2r*w3i**2*cs**2*k**2*rhogsol*w1r**2 - w3r*w3i**2*Kdrag*rhogsol*w2r**2*w1i -& w3r*w3i**2*Kdrag**2*k*vdsol*w2r + w3r*w3i**2*Kdrag**2*k*vgsol*w2r - rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r*w1r +& rhogeq**2*cs**2*k**3*w3i*w1i*vgsol*w2r**2 - w3r*w3i**2*Kdrag*rhogsol*w2i*w1r**2 +& w3r*w3i**2*Kdrag*rhogsol*k**2*cs**2*w2i - w3r*w3i**2*Kdrag*rhogsol*w1i*w2i**2 -& 2*w3i**2*cs**2*k**3*rhogeq**2*vgsol*w2r*w1r - w3i**2*cs**2*k**3*rhogeq**2*vgsol*w2r**2 -& w3r*w3i**2*Kdrag*rhogsol*w2i*w1i**2 - w3i*rhogsol*k**4*cs**4*rhogeq*w2r*w1i +& rhogeq*cs**2*k**2*w1i**2*w2r*rhogsol*w3i**2 + Kdrag*k*rhogeq*vgsol*w2r**2*w1i*w3i**2 -& w3r*w3i**2*Kdrag**2*k*vdsol*w1r - rhogeq*w3i**5*w2r*w1i*rhogsol + w3r*w3i**2*rhogeq*w2r*w1i*k*Kdrag*vgsol +& w3r*w3i**2*rhogeq**2*w2r*w1i**2*k*vgsol + w3r*w3i**2*rhogeq*w2i*w1r*k*Kdrag*vgsol -& w3r*w3i**2*rhogeq*w2i**2*w1i**2*rhogsol + w3r*w3i**2*rhogeq**2*w2r**2*k*w1r*vgsol -& w3r*w3i**2*rhogeq*w1r**2*w2i**2*rhogsol - w3r*w3i**2*rhogeq*w2r**2*w1r**2*rhogsol -& 3*w3r*w3i**2*rhogeq*cs**4*k**4*rhogsol + w3r*w3i**2*rhogeq**2*w2i**2*w1r*k*vgsol -& 4*cs**2*k**2*rhogeq*w3r*w3i**2*w2r*w1r*rhogsol - rhogeq**2*w3i**4*w1i**2*k*vgsol -& cs**2*k**3*rhogeq*w3i**3*Kdrag*vdsol - w3r*w3i**2*rhogeq*w1i**2*w2r**2*rhogsol +& cs**2*k**3*rhogeq*w3i**3*Kdrag*vgsol + 3*w3r*w3i**2*rhogeq**2*cs**2*k**3*w1r*vgsol -& w3r*w3i**2*rhogeq*w2r*w1i*k*Kdrag*vdsol + w3r*w3i**2*rhogeq**2*w2r*w1r**2*k*vgsol +& 4*cs**2*k**2*rhogeq*w3r*w3i**2*w2i*rhogsol*w1i - rhogeq**2*w3i**4*k*w1r**2*vgsol +& 2*rhogeq*w3i**3*w3r**2*k*Kdrag*vgsol + 2*rhogeq**2*w3i**3*w3r**2*w1i*k*vgsol +& rhogeq*w3i**4*cs**2*k**2*rhogsol*w1r - 2*rhogeq*w3i**3*w3r**2*k*Kdrag*vdsol +& rhogeq*w3i**4*w2r*cs**2*k**2*rhogsol - 2*rhogeq**2*w3i**4*k*w2i*w1i*vgsol - rhogeq*w3i**3*w2i*w1i*k*Kdrag*vdsol& + rhogeq**2*w3i**3*w2i*w1i**2*k*vgsol + Kdrag*w2i**2*vgsol*k*rhogeq*w1i*w3r**2 -& w3i**2*rhogeq**2*cs**2*k**3*vgsol*w2i**2 + 2*w3r**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i -& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i*w1i - rhogeq**2*w3i**4*w2r**2*k*vgsol +& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w1i + w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1r**2 +& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**2 + rhogeq*w3i**4*w1i**2*w2r*rhogsol - rhogeq**2*w3i**4*w2i**2*k*vgsol) !--break to avoid too many continuation lines rhod3r = rhod3r - rhodeq*( & rhogeq**2*w3i**5*w2i*k*vgsol + rhogeq*w3i**3*w2r*w1r*k*Kdrag*vdsol + rhogeq*w3i**4*w2i*k*Kdrag*vdsol +& rhogeq**2*w3i**3*w2i*k*vgsol*w1r**2 - 2*rhogeq**2*w3i**4*w2r*k*w1r*vgsol +& w3r*rhogeq*cs**2*k**2*w1r**2*rhogsol*w2i**2 + w3r*rhogeq*cs**2*k**2*w1i**2*rhogsol*w2i**2 -& 2*rhogeq*w3i**3*w3r**2*w2i*w1r*rhogsol - 2*rhogeq*w3i**3*w2r*w3r**2*rhogsol*w1i +& w3r**2*rhogeq**2*cs**2*k**3*vgsol*w2i**2 - w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w1r -& w3r*rhogeq*cs**4*k**4*rhogsol*w2i*w1i + 2*rhogeq**2*w3i**3*w3r**2*w2i*k*vgsol +& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w1r - w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w1r +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i*w1i + Kdrag*w3i**3*cs**2*k**2*rhogsol*w1r +& rhogeq*w3i**4*w2i**2*w1r*rhogsol - Kdrag*w3i**3*k*rhogeq*w1r**2*vgsol + Kdrag*w2r*w3i**3*cs**2*k**2*rhogsol -& rhogeq*w3i**5*w1r*w2i*rhogsol - Kdrag*w1r*w2i*w3i**4*rhogsol - rhogeq*w3i**5*k*Kdrag*vdsol +& rhogeq*w3i**5*k*Kdrag*vgsol - 2*w3i**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i + rhogeq**2*w3i**5*w1i*k*vgsol +& rhogeq*w3i**4*w2r**2*w1r*rhogsol + rhogeq*w3i**4*w1i*k*Kdrag*vdsol - Kdrag*w1i**2*rhogeq*k*vgsol*w3i**3 +& rhogeq*w3i**4*w2r*w1r**2*rhogsol - Kdrag*w2r*w1i*w3i**4*rhogsol + w3i**4*k*Kdrag**2*vgsol -& w3i**4*k*Kdrag**2*vdsol + w3i**3*rhogeq**2*k*vgsol*w2r**2*w1i - w3i**2*Kdrag**2*k*vgsol*w2r*w1r +& w3i**3*Kdrag*rhogsol*w2r*w1r**2 + w3i**3*Kdrag*rhogsol*w2r*w1i**2 + w3i**2*Kdrag**2*k*vdsol*w2r*w1r +& w3i**3*cs**2*k**3*rhogeq**2*vgsol*w1i - w3i**2*Kdrag*cs**2*k**2*rhogsol*w2r*w1i +& w3i**3*Kdrag*rhogsol*w2r**2*w1r + w3i**2*rhogeq*cs**4*k**4*rhogsol*w2r -& 2*w3i**3*cs**2*k**2*rhogeq*rhogsol*w2r*w1i - w3i**3*Kdrag*rhogeq*k*vgsol*w2r**2 -& 3*w3i**3*Kdrag*rhogeq*k*vgsol*w2r*w1r - w3i**3*Kdrag*rhogeq*k*vgsol*w2i**2 -& w3i**2*rhogeq**2*cs**2*k**3*vgsol*w1i**2 + w3i**2*rhogeq*k*Kdrag*vgsol*w1i**2*w2i -& w3i**2*rhogeq**2*cs**2*k**3*vgsol*w1r**2 + w3i**2*rhogeq*k*Kdrag*vgsol*w2i*w1r**2 -& w3i**3*Kdrag*rhogeq*k*vgsol*w1i*w2i - w3i**2*Kdrag**2*k*vdsol*w1i*w2i + w3i**2*Kdrag**2*k*vgsol*w1i*w2i -& w3i**2*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i - w3i**2*cs**2*k**3*rhogeq*Kdrag*vgsol*w1i +& w3i**3*Kdrag*rhogsol*w2i**2*w1r + w3i**2*rhogeq*cs**2*k**3*vdsol*Kdrag*w1i +& w3i**2*rhogeq*cs**2*k**3*vdsol*Kdrag*w2i - w3i**2*Kdrag*cs**2*k**2*rhogsol*w2i*w1r -& 2*w3i**3*rhogeq*cs**2*k**2*rhogsol*w2i*w1r + w3i**3*vgsol*k*rhogeq**2*w2i**2*w1i +& w3i**3*vgsol*rhogeq**2*k**3*cs**2*w2i + w3i**2*rhogeq*cs**4*k**4*rhogsol*w1r -& w3i*Kdrag*w3r**2*w1r**2*rhogeq*k*vgsol - w3i*Kdrag*w3r**2*w1i**2*k*rhogeq*vgsol -& w3i*w3r**2*w1i*k*Kdrag**2*vgsol + w3i*w3r**2*w1i*k*Kdrag**2*vdsol + w3i*Kdrag*w3r**2*w1r*cs**2*k**2*rhogsol +& w3i*Kdrag*w2r*w3r**2*cs**2*k**2*rhogsol + Kdrag*w2i**2*k*rhogeq*vgsol*w3i**2*w1i -& w3i*rhogeq*w3r**4*k*Kdrag*vdsol - w3i*rhogeq*w3r**4*rhogsol*w2i*w1r - w3i*rhogeq*w3r**4*rhogsol*w1i*w2r +& w3i*rhogeq**2*w3r**4*k*vgsol*w2i - w3i*w3r**2*Kdrag*rhogeq*k*vgsol*w2i**2 + w3i*w3r**2*Kdrag*rhogsol*w2r*w1r**2& - w3i*w3r**2*w2i*k*Kdrag**2*vgsol + w3i*w3r**2*w2i*k*Kdrag**2*vdsol + w3i*rhogeq*w3r**4*k*Kdrag*vgsol +& w3i*rhogeq**2*w3r**4*k*vgsol*w1i + w3i*w3r**2*Kdrag*rhogsol*w2r**2*w1r + w3i*w3r**2*Kdrag*rhogsol*w2r*w1i**2 +& w3i*w3r**2*Kdrag*rhogsol*w2i**2*w1r + 2*w3i*w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i -& w3i*w3r**2*Kdrag*rhogeq*k*vgsol*w2r**2 + 2*w3i*w3r**2*rhogeq*cs**2*k**2*rhogsol*w2i*w1r) rhod3r = rhod3r/(w3r**2 +& w3i**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r)/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 -& 2*w2i*w3i + w3r**2)/rhogeq/Kdrag rhod3i = - rhodeq*(w3r*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w1i + w2r*w3i*cs**2*k**3*rhogeq**2*vgsol*w1i**2 +& w2r*w3i*cs**2*k**3*rhogeq**2*vgsol*w1r**2 - w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1i +& rhogeq*w2r**2*w3i**2*cs**2*k**2*rhogsol*w1i - w3i**2*Kdrag*rhogsol*w2i**2*w1r**2 -& w3i**2*Kdrag*rhogsol*w2i**2*w1i**2 - w3r**2*Kdrag*rhogsol*w2i**2*w1i**2 +& rhogeq*w1i*rhogsol*k**2*cs**2*w3i**2*w2i**2 - w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1i**2 -& w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1r**2 - w2r*w3i*cs**4*k**4*rhogeq*rhogsol*w1r -& w2r*w3r*rhogeq*cs**4*k**4*rhogsol*w1i + w2r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1i +& rhogeq*w1i**2*rhogsol*k**2*cs**2*w3i**2*w2i - rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r**2*w2i +& w2r*w3r*rhogeq*cs**2*k**3*Kdrag*vdsol*w1r - w2r*w3r*rhogeq*cs**2*k**3*Kdrag*vgsol*w1r +& w3i*cs**4*k**4*rhogeq*rhogsol*w1i*w2i - w3i*cs**2*k**2*rhogeq*rhogsol*w2i**2*w1r**2 +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r*w2i - w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r*w2i -& rhogeq*w1i*rhogsol*k**2*cs**2*w3r**2*w2i**2 - w3i*cs**2*k**2*rhogeq*rhogsol*w2i**2*w1i**2 +& w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i + w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2i +& w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol*w2i - w3r*rhogeq*cs**4*k**4*w1r*rhogsol*w2i -& w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i + w3r**2*rhogeq*w2i**2*w1r*k*Kdrag*vgsol +& w3r**2*rhogeq*w1r*k*Kdrag*vgsol*w2r**2 - w3r**2*Kdrag*rhogsol*w1i**2*w2r**2 -& w3r**2*Kdrag*rhogsol*w2i**2*w1r**2 - w2r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1i -& w3i**2*Kdrag*rhogsol*w1r**2*w2r**2 - w3i**2*Kdrag*rhogsol*w1i**2*w2r**2 - w3r**2*Kdrag*rhogsol*w1r**2*w2r**2 +& w3i**2*rhogeq*w2i**2*w1r*k*Kdrag*vgsol + w3i**2*rhogeq*w1r*k*Kdrag*vgsol*w2r**2 -& w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2*w2i + w3i**2*cs**2*k**2*rhogeq*rhogsol*w1r**2*w2i +& rhogeq*w3r**4*rhogsol*w2r**2*w1i + rhogeq*w3r**4*rhogsol*w1i*w2i**2 + rhogeq*w3r**4*rhogsol*w2i*w1i**2 +& rhogeq*w3r**4*rhogsol*w2i*w1r**2 - w3r*rhogeq*w2r*w3i**2*w1r*k*Kdrag*vgsol - rhogeq**2*w3i**5*w2r*k*vgsol -& rhogeq**2*w3i**5*k*w1r*vgsol + rhogeq*w3i**5*w2r*w1r*rhogsol - w3i**2*cs**4*k**4*rhogeq*rhogsol*w2i +& 2*w3r**2*rhogeq*w3i**3*cs**2*k**2*rhogsol - 3*w3r*rhogeq*w2i*w3i**2*w1i*k*Kdrag*vgsol -& w3r*rhogeq*w2r*w3i**2*w1r*k*Kdrag*vdsol - 2*w3r**2*Kdrag*k*rhogeq*vgsol*w3i**2*w1r -& 2*w3r**2*Kdrag*k*rhogeq*vgsol*w2r*w3i**2 - 2*w3r**2*rhogeq**2*w2r*k*vgsol*w3i**3 +& 3*w3r*rhogeq**2*cs**2*k**3*w3i**2*w1i*vgsol + 3*w3r*rhogeq*cs**2*k**3*w3i**2*Kdrag*vgsol -& w3r*rhogeq**2*w2i**2*w3i**2*w1i*k*vgsol + 3*w3r*rhogeq**2*cs**2*k**3*w3i**2*w2i*vgsol -& w3r*rhogeq**2*w3i**2*w2r**2*w1i*k*vgsol + 2*w3r*rhogeq*w1i*w3i**3*k*Kdrag*vgsol -& w3r*rhogeq**2*w2i*w1i**2*w3i**2*k*vgsol + 2*w3r*rhogeq*w2i*w3i**3*k*Kdrag*vgsol -& w3r*rhogeq**2*w2i*k*vgsol*w3i**2*w1r**2 - 3*w3r*rhogeq*cs**2*k**3*w3i**2*Kdrag*vdsol -& w3i**3*rhogeq*w2i**2*w1i**2*rhogsol + w3i**2*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r -& w3i**3*rhogeq*w1r**2*w2i**2*rhogsol + w3i**3*rhogeq**2*w2r**2*k*w1r*vgsol + w3i**3*rhogeq**2*w2i**2*w1r*k*vgsol& + w3i**3*rhogeq*cs**4*k**4*rhogsol - rhogeq*w3i**5*w1i*rhogsol*w2i - w3i**4*Kdrag*rhogsol*w2i*w1i +& rhogeq*w3i**5*cs**2*k**2*rhogsol + w3i**4*Kdrag*rhogsol*w2r*w1r + w3i**2*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r +& w3i**4*Kdrag*rhogsol*k**2*cs**2 - w3i**2*cs**4*k**4*rhogeq*rhogsol*w1i - w3i**3*Kdrag**2*k*vgsol*w1r -& w3i**3*rhogeq**2*cs**2*k**3*w2r*vgsol + w3i**3*Kdrag*rhogsol*w2r**2*w1i - w3i**3*Kdrag*rhogsol*k**2*cs**2*w1i -& 2*rhogeq*w3i**4*k*Kdrag*vgsol*w1r - 2*w3r**2*rhogeq*w1i*w3i**3*rhogsol*w2i -& 2*w3r**2*rhogeq**2*w3i**3*k*w1r*vgsol + 2*w3r**2*rhogeq*w2r*w3i**3*w1r*rhogsol +& w3r*rhogeq*w2i*w3i**2*w1i*k*Kdrag*vdsol - w3i**3*rhogeq*w2i*w1r*k*Kdrag*vdsol -& w3i**3*Kdrag*rhogsol*k**2*cs**2*w2i - w3i**2*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r) !--break to avoid too many continuation lines rhod3i = rhod3i - rhodeq*( & w3i**3*Kdrag*rhogsol*w2i*w1i**2 - w3i**2*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r + w3i**3*Kdrag**2*k*vdsol*w1r +& w3i**3*rhogeq**2*w2r*w1i**2*k*vgsol - w3i**3*rhogeq*w2r**2*w1r**2*rhogsol - 2*rhogeq*w3i**4*k*Kdrag*vgsol*w2r -& Kdrag*w3r**4*rhogsol*k**2*cs**2 - w3i**3*Kdrag**2*k*vgsol*w2r - rhogeq*w3r**5*rhogsol*w2i*w1r +& w3i**3*Kdrag*rhogsol*w1i*w2i**2 + w3i**3*rhogeq*w2r*w1i*k*Kdrag*vgsol + Kdrag*w3r**4*w2i*rhogsol*w1i +& w3i**3*rhogeq*w2i*w1r*k*Kdrag*vgsol + rhogeq**2*w3i**4*w3r*w1i*k*vgsol - rhogeq*w3i**4*w3r*k*Kdrag*vdsol +& w3i**3*rhogeq**2*w2r*w1r**2*k*vgsol + w3i**3*Kdrag**2*k*vdsol*w2r + rhogeq*w3i**4*w3r*k*Kdrag*vgsol -& w3i**3*rhogeq**2*cs**2*k**3*w1r*vgsol - rhogeq*w3i**4*w2r*w3r*rhogsol*w1i - w3i**3*rhogeq*w1i**2*w2r**2*rhogsol& - rhogeq*w3i**4*w3r*w2i*w1r*rhogsol - w3i**3*rhogeq*w2r*w1i*k*Kdrag*vdsol - 2*w3r*w3i**3*k*Kdrag**2*vdsol +& 2*w3i**2*rhogeq**2*w3r**3*k*vgsol*w1i + 2*w3i**2*rhogeq*w3r**3*k*Kdrag*vgsol +& w3i**2*w3r*Kdrag*rhogsol*w2r*w1i**2 + w3i**2*w3r*Kdrag*rhogsol*w2r**2*w1r -& w3i**2*w3r*Kdrag*rhogeq*k*vgsol*w2r**2 + w3i**2*w3r*Kdrag*rhogsol*w2i**2*w1r -& 2*w3i**2*w3r*cs**2*k**2*rhogeq*rhogsol*w2r*w1i - 2*w3i**2*w3r*rhogeq*cs**2*k**2*rhogsol*w2i*w1r -& w3i*w3r**2*rhogeq*w1i**2*w2r**2*rhogsol + 2*w3i*w3r*rhogeq*cs**4*k**4*w2r*rhogsol -& w3i*w3r**4*rhogeq*w2i*rhogsol*w1i + w3i*w3r**4*rhogeq*rhogsol*k**2*cs**2 + w3i*w3r**4*rhogeq*w2r*w1r*rhogsol -& w3i*w3r**4*rhogeq**2*w2r*vgsol*k + rhogeq**2*w3i**4*w3r*w2i*k*vgsol - w3i*w3r**4*rhogeq**2*k*w1r*vgsol +& w3i*w3r**2*Kdrag*rhogsol*w2r**2*w1i + w3i*w3r**2*Kdrag*rhogsol*w2i*w1r**2 + w3i*w3r**2*Kdrag*rhogsol*w1i*w2i**2& + w3i*w3r**2*Kdrag**2*k*vdsol*w2r + w3i*w3r**2*rhogeq**2*w2r*w1r**2*k*vgsol +& w3i*w3r**2*rhogeq**2*w2r*w1i**2*k*vgsol + 3*w3i*w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol +& 2*w3i*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol - w3i*w3r**2*Kdrag*rhogsol*k**2*cs**2*w1i +& 3*w3i*w3r**2*rhogeq**2*cs**2*k**3*w2r*vgsol + 2*w3i*w3r*rhogeq*cs**4*k**4*w1r*rhogsol +& 2*w3i*w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol - w3i*w3r**2*Kdrag*rhogsol*k**2*cs**2*w2i -& w3i*w3r**2*rhogeq*w1r**2*w2i**2*rhogsol - w3i*w3r**2*rhogeq*w2i**2*w1i**2*rhogsol +& w3i**2*w3r*w1i*k*Kdrag**2*vdsol - w3i**2*Kdrag*w3r*w1r**2*rhogeq*k*vgsol -& w3i**2*Kdrag*w3r*w1i**2*k*rhogeq*vgsol + w3i**2*Kdrag*w3r*w1r*cs**2*k**2*rhogsol +& w3i**2*Kdrag*w2r*w3r*cs**2*k**2*rhogsol - w3i**2*w3r*w1i*k*Kdrag**2*vgsol -& 2*w3i**2*rhogeq*w3r**3*k*Kdrag*vdsol - 2*w3i**2*rhogeq*w3r**3*rhogsol*w2i*w1r -& 2*w3i**2*rhogeq*w3r**3*rhogsol*w1i*w2r + w3i**2*w3r*Kdrag*rhogsol*w2r*w1r**2 -& w3i**2*w3r*Kdrag*rhogeq*k*vgsol*w2i**2 - 2*w3i*w3r**3*Kdrag**2*k*vdsol - w3i**2*w3r*w2i*k*Kdrag**2*vgsol +& w3i**2*w3r*w2i*k*Kdrag**2*vdsol - w3i*w3r**2*Kdrag**2*k*vgsol*w1r + 2*w3i*w3r**3*rhogeq*w2i*k*Kdrag*vgsol -& 2*w3i*w3r**3*Kdrag*rhogsol*w2i*w1r + w3i*w3r**2*Kdrag**2*k*vdsol*w1r -& 2*w3i*w3r*rhogeq**2*cs**2*k**3*vgsol*w2i**2 - 2*w3i*w3r*rhogeq**2*cs**2*k**3*w2r**2*vgsol -& w3i*w3r**2*rhogeq*w2r**2*w1r**2*rhogsol - 2*w3i*w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol -& 2*w3i*w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol - 3*w3i*w3r**2*rhogeq*cs**4*k**4*rhogsol +& w3i*w3r**2*rhogeq**2*w2r**2*k*w1r*vgsol - w3i*w3r**2*rhogeq*w2r*w1i*k*Kdrag*vdsol -& 2*w3i*w3r**3*Kdrag*rhogsol*w1i*w2r + 2*w3i*w3r**3*rhogeq*w1i*k*Kdrag*vgsol) !--break to avoid too many continuation lines rhod3i = rhod3i - rhodeq*( & w3i*w3r**2*rhogeq*w2r*w1i*k*Kdrag*vgsol + w3i*w3r**2*Kdrag*rhogsol*w2i*w1i**2 +& rhogeq*rhogsol*w2r**2*w1i*w3i**4 - rhogeq*w3r**5*k*Kdrag*vdsol + rhogeq*w3r**3*k*Kdrag*vdsol*w2i*w1i -& rhogeq*w3r**3*k*Kdrag*vdsol*w2r*w1r + 2*rhogeq*w3r**2*rhogsol*w2r**2*w1i*w3i**2 +& w3i*w3r**2*rhogeq*w2i*w1r*k*Kdrag*vgsol + 2*rhogeq*w3r**2*rhogsol*w1i*w2i**2*w3i**2 +& 2*rhogeq*w3r**2*rhogsol*w2i*w1r**2*w3i**2 + 2*rhogeq*w3r**2*rhogsol*w2i*w1i**2*w3i**2 -& 2*Kdrag*w2r*w3r*w3i**3*rhogsol*w1i + rhogeq*w3r**4*k*Kdrag*vdsol*w2r + 2*rhogeq*w3r**2*k*Kdrag*vdsol*w2r*w3i**2& - Kdrag*w3r**3*w1r**2*rhogeq*k*vgsol - Kdrag*w3r**3*w1i**2*k*rhogeq*vgsol + Kdrag*w3r**3*w1r*cs**2*k**2*rhogsol& + Kdrag*w2r*w3r**3*cs**2*k**2*rhogsol + cs**2*k**3*rhogeq*w3r**3*Kdrag*vdsol +& w3i*w3r**2*rhogeq**2*w2i**2*w1r*k*vgsol - rhogeq**2*w3r**3*k*vgsol*w2i*w1r**2 -& rhogeq*rhogsol*k**2*cs**2*w3i**4*w2i + rhogeq**2*w3r**5*k*vgsol*w1i + rhogeq*w3r**5*k*Kdrag*vgsol -& w3i*w3r**2*rhogeq*w2i*w1r*k*Kdrag*vdsol - w3i*w3r**2*Kdrag**2*k*vgsol*w2r + rhogeq*rhogsol*w3i**4*w2i*w1r**2 +& 2*w3i*w3r**3*Kdrag**2*k*vgsol + w3i*rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol + rhogeq*rhogsol*w2i*w1i**2*w3i**4 +& rhogeq*k*Kdrag*vdsol*w2r*w3i**4 + 2*w3i*w1r*w3r*cs**2*k**2*rhogeq*rhogsol*w2i**2 + rhogeq**2*w3r**5*k*vgsol*w2i& + 2*rhogeq*w3r**2*k*Kdrag*vdsol*w3i**2*w1r - 2*w3i*w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol -& rhogeq*w3r**5*rhogsol*w1i*w2r + rhogeq*k*Kdrag*vdsol*w3i**4*w1r - 2*rhogeq*w3r**2*rhogsol*k**2*cs**2*w3i**2*w1i& - 2*w3i*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol - Kdrag*w2r*w3r**4*w1r*rhogsol + w3r**3*Kdrag*rhogsol*w2r**2*w1r& + Kdrag**2*k*vgsol*w2r*w1i*w3i**2 + w3r**2*Kdrag*k*rhogeq*vgsol*w2r*w1i**2 +& w3r**2*Kdrag*k*rhogeq*vgsol*w2r*w1r**2 + w3r**2*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r -& w3r**2*Kdrag*cs**2*k**2*rhogsol*w2r*w1r - w3r**2*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r +& rhogeq**2*cs**2*k**3*w1r*vgsol*w2i**2*w3i + 2*w3r**3*cs**2*k**2*rhogeq*rhogsol*w2r*w1i +& 2*w3i**2*rhogeq**2*w3r**3*k*vgsol*w2i + w3r**3*Kdrag*rhogsol*w2r*w1r**2 - w3r**3*Kdrag*rhogeq*k*vgsol*w2i**2 -& w3r**3*rhogeq**2*cs**2*k**3*vgsol*w1i + 2*w3i*w2r*w3r*cs**2*k**2*rhogeq*rhogsol*w1r**2 -& w3r**3*rhogeq**2*k*vgsol*w2r**2*w1i - w3r**3*Kdrag*rhogeq*k*vgsol*w2r**2 - rhogeq*w3r**4*rhogsol*k**2*cs**2*w2i& + rhogeq*rhogsol*w2i**2*w3i**4*w1i - rhogeq*w3r**4*rhogsol*k**2*cs**2*w1i -& 4*w3i*w3r*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i + w3r**3*w1i*k*Kdrag**2*vdsol - w3r**3*w2i*k*Kdrag**2*vgsol +& rhogeq*w3r**4*k*Kdrag*vdsol*w1r + w3r**3*w2i*k*Kdrag**2*vdsol - rhogeq*rhogsol*k**2*cs**2*w3i**4*w1i -& rhogeq**2*w3r**3*k*vgsol*w2i*w1i**2 - 2*rhogeq*w3r**2*rhogsol*k**2*cs**2*w3i**2*w2i -& w3r**3*w1i*k*Kdrag**2*vgsol - 4*w3i*w2r*w3r*rhogeq**2*cs**2*k**3*w1r*vgsol +& w3r**2*cs**4*k**4*rhogeq*rhogsol*w2i + 2*w3i*w3r*rhogeq*rhogsol*k**2*cs**2*w2r**2*w1r +& 2*w3r*w3i**3*k*Kdrag**2*vgsol - w3r**2*Kdrag**2*k*vdsol*w2i*w1r - Kdrag**2*k*vdsol*w2i*w1r*w3i**2 -& w3r**3*vgsol*k*rhogeq**2*w2i**2*w1i - w3r**3*Kdrag*rhogeq*k*vgsol*w2r*w1r +& 2*w3r**3*rhogeq*cs**2*k**2*rhogsol*w2i*w1r - 3*w3r**3*Kdrag*k*rhogeq*vgsol*w1i*w2i +& w3r**2*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r - w3r**2*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r +& Kdrag**2*k*vgsol*w2i*w1r*w3i**2 + rhogeq**2*cs**2*k**3*vgsol*w1i*w2r**2*w3r - w3r**2*Kdrag**2*k*vdsol*w2r*w1i -& Kdrag**2*k*vdsol*w2r*w1i*w3i**2 + w3r**2*cs**4*k**4*rhogeq*rhogsol*w1i +& w3r**2*Kdrag*cs**2*k**2*rhogsol*w1i*w2i + w3r**3*Kdrag*rhogsol*w2r*w1i**2 -& cs**2*k**3*rhogeq*w3r**3*Kdrag*vgsol + 2*w3i*w2r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r +& 4*cs**2*k**2*rhogeq*w3r**2*w3i*w2i*rhogsol*w1i - 4*cs**2*k**2*rhogeq*w3r**2*w3i*w2r*w1r*rhogsol -& 2*Kdrag*w1r*w2i*w3i**3*rhogsol*w3r + Kdrag*k*rhogeq*vgsol*w2r*w1r**2*w3i**2 + w3r**2*Kdrag**2*k*vgsol*w2r*w1i -& Kdrag*cs**2*k**2*rhogsol*w2r*w1r*w3i**2 + w3i**3*Kdrag*rhogsol*w2i*w1r**2 +& Kdrag*k*rhogeq*vgsol*w2r*w1i**2*w3i**2 + w3r**2*Kdrag**2*k*vgsol*w2i*w1r +& Kdrag*cs**2*k**2*rhogsol*w1i*w2i*w3i**2 + w3r**3*Kdrag*rhogsol*w2i**2*w1r -& w3r**3*vgsol*rhogeq**2*k**3*cs**2*w2i) rhod3i = rhod3i/(w3r**2 + w3i**2)/(w1i**2 - 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 -& 2*w3r*w1r)/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i + w3r**2)/rhogeq/Kdrag rhod2r = - rhodeq*(k*Kdrag**2*vdsol*w2i**3*w1i - k*Kdrag**2*vgsol*w2i**3*w1i -& 2*w3r*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i**2 + w3r*Kdrag*rhogsol*w2i**3*w1i**2 -& Kdrag*k*rhogeq*vgsol*w2i**3*w1i**2 + w3r*Kdrag*rhogsol*w2i**3*w1r**2 - Kdrag*k*rhogeq*vgsol*w2i**3*w1r**2 -& 2*w2i*w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i + w2i*w3r**2*rhogeq**2*k*vgsol*w2r**2*w1i -& w2i*w3r**2*Kdrag*rhogeq*k*vgsol*w2r**2 - w3r*rhogeq**2*cs**2*k**3*w2r**3*vgsol -& w3r*Kdrag*rhogsol*k**2*cs**2*w1i*w2r**2 + w3r*Kdrag**2*k*vdsol*w2r**2*w1r - w3r*Kdrag**2*k*vgsol*w2r**2*w1r +& w3r*Kdrag*k*rhogeq*vgsol*w2r**3*w1i - w3r*rhogeq*cs**2*k**2*w1i**2*w2r**2*rhogsol -& w3r*rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol + 2*w3r*rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol +& w3r**2*rhogeq**2*cs**2*k**3*w2r**2*vgsol + w3r**2*rhogeq*w2r**2*w1i*k*Kdrag*vgsol -& w3r**2*Kdrag*rhogsol*w2r**3*w1i + w3r**2*rhogeq**2*w2r**3*k*w1r*vgsol + w2i*w3r*rhogeq*k*Kdrag*vdsol*w2r**2*w1r& + w2i*w3r*Kdrag*rhogsol*w2r**2*w1r**2 + w2i*w3r*Kdrag*rhogsol*w2r**2*w1i**2 - w2i*w3r*rhogeq*rhogsol*w2r**4*w1i& + 2*w2i*w3r*rhogeq*cs**2*k**2*rhogsol*w2r**2*w1i + 2*w2i*w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r +& w2i*w3r*Kdrag*cs**2*k**2*rhogsol*w2r**2 - 2*w2i*w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r -& 4*w3r*rhogeq*cs**2*k**2*rhogsol*w2r*w2i**2*w1r - w3r*rhogeq*k*Kdrag*vdsol*w2r*w2i**2*w1i +& rhogeq**2*k*vgsol*w2i**5*w1i - w3r*rhogeq*rhogsol*w2i**5*w1i + 4*w3i*cs**2*k**2*rhogeq*rhogsol*w2r*w2i**2*w1i +& 2*w3r**2*rhogeq*rhogsol*w2r**2*w2i**2*w1r - w3r**2*rhogeq*rhogsol*w2r*w2i**2*w1r**2 +& w3r**2*rhogeq**2*k*vgsol*w2r*w2i**2*w1r + 2*vgsol*k*rhogeq**2*w2i**3*w2r**2*w1i +& 2*w3r*rhogeq*cs**2*k**2*rhogsol*w2i**2*w2r**2 + 3*w3r*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w2r -& 2*w3r*Kdrag*rhogsol*w2r*w1r*w2i**3 - 2*w3r*rhogeq*rhogsol*w2i**3*w2r**2*w1i -& w3r**2*rhogeq*rhogsol*w2r*w2i**2*w1i**2 + 2*w3r*rhogeq*rhogsol*w1i**2*w2r**2*w2i**2 +& 2*w3r*rhogeq*rhogsol*w2i**2*w1r**2*w2r**2 + w3r*w2r*Kdrag*rhogeq*k*vgsol*w2i**2*w1i -& 2*w3r**2*rhogeq**2*k*vgsol*w2i**2*w2r**2 + w3r*rhogeq**2*k*vgsol*w2r*w2i**2*w1i**2 +& w3r*rhogeq**2*k*vgsol*w2r*w2i**2*w1r**2 - 4*w3r*rhogeq**2*k*vgsol*w2r**2*w2i**2*w1r -& w3r*rhogeq*cs**4*k**4*w2r**2*rhogsol - w3r**2*rhogeq*w2r**3*w1r**2*rhogsol +& w1r*Kdrag*rhogsol*k**2*cs**2*w2i**3 + w2i*w3r**2*Kdrag*rhogsol*w2r**2*w1r - 2*w2i*w3r*Kdrag*rhogsol*w2r**3*w1r& - 3*w2i*w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1r + w2i*rhogeq**2*k*vgsol*w2r**4*w1i +& rhogeq**2*w1i**2*k*vgsol*w3r*w2r**3 + 2*w2i*w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1r +& w1r*w3i**2*cs**2*k**2*rhogeq*rhogsol*w2i**2 + w1r*w3r**2*cs**2*k**2*rhogeq*rhogsol*w2i**2 +& 2*Kdrag*w3r*w2r**3*k*rhogeq*vgsol*w2i + w3r*rhogeq**2*w1r**2*k*vgsol*w2r**3 - w3r*rhogeq*w2r**5*w1r*rhogsol -& rhogeq*w1i*w3r*w2r**3*k*Kdrag*vdsol + rhogeq*w1i**2*w3r*w2r**4*rhogsol + w3r*rhogeq*w2r**4*w1r**2*rhogsol +& w3r*rhogeq**2*w2r**5*k*vgsol + w3r*w2r**3*k*Kdrag**2*vgsol - w3r*w2r**3*k*Kdrag**2*vdsol +& Kdrag*w3r*w2r**4*rhogsol*w1i + w3r*rhogeq*w2r**4*cs**2*k**2*rhogsol +& w2r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r**2 - w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol +& w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol - w2r*w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol -& w2r*w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol + w2r*w3r*rhogeq*cs**4*k**4*w1r*rhogsol -& w2r*w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol - w2r*w3r**2*Kdrag*rhogsol*w1i*w2i**2 -& rhogeq*w2r*w3i*w1r*k*Kdrag*vdsol*w2i**2 + rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r*w1r -& rhogeq*w2i*w3i*w1i*k*Kdrag*vdsol*w2r**2 - rhogeq*w3i**2*cs**2*k**2*rhogsol*w1r*w2r**2 -& 2*w3r*rhogeq**2*w2r**4*k*w1r*vgsol - 2*w3r*rhogeq*w2r**3*w1r*rhogsol*w2i**2) !--break to avoid too many continuation lines rhod2r = rhod2r - rhodeq*( & 2*w3r*rhogeq**2*w2i**2*k*vgsol*w2r**3 - w3r**2*rhogeq**2*w2r**4*vgsol*k -& w3r**2*rhogeq*rhogsol*k**2*cs**2*w2r**2*w1r + w3r**2*rhogeq*w2r**4*w1r*rhogsol +& w2r*w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2 - w2r*w3r*rhogeq*rhogsol*w2i**4*w1r +& Kdrag*rhogsol*k**2*cs**2*w1i*w2r**3 - rhogeq**2*w2r**4*w3i**2*k*vgsol +& rhogeq*w2r*w3i**2*cs**2*k**2*rhogsol*w1r**2 + rhogeq*cs**4*k**4*w2r**3*rhogsol +& w2r*w3r*rhogeq**2*k*vgsol*w2i**4 + rhogeq*w2r**4*w3i**2*w1r*rhogsol + rhogeq**2*cs**2*k**3*w2r**2*vgsol*w1r**2& - 3*rhogeq*cs**4*k**4*w2r*rhogsol*w2i**2 - 2*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w2r*w1r +& 2*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w2r*w1r - rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r**2 -& 2*rhogeq*w2r*w3i**2*cs**2*k**2*rhogsol*w2i*w1i - rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r*w1r -& rhogeq**2*w1i**2*k*vgsol*w2r**4 + rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r**2 +& 2*rhogeq**2*cs**2*k**3*w3i*w1i*vgsol*w2r**2 - 3*rhogeq**2*cs**2*k**3*w2r**2*vgsol*w2i*w1i +& 2*rhogeq*cs**4*k**4*w2r*rhogsol*w2i*w1i - rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2r**2 -& 3*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w2r**2 - 2*rhogeq**2*w1i**2*k*vgsol*w2r**2*w2i**2 +& rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2r**2 + rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2r**2 +& 3*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w2r**2 - 4*rhogeq**2*w3i*w2r**2*w1i*k*vgsol*w2i**2 -& 2*rhogeq**2*w3i*w2r**4*w1i*k*vgsol + 2*rhogeq*w2r**2*w3i**2*w1r*rhogsol*w2i**2 +& 2*w2r*Kdrag*w3r*w2i**3*k*rhogeq*vgsol + rhogeq*cs**2*k**2*w2r**4*w1r*rhogsol +& rhogeq**2*w2r**3*w3i**2*k*w1r*vgsol - rhogeq**2*cs**2*k**3*w2r**3*w1r*vgsol -& rhogeq*cs**4*k**4*w1r*rhogsol*w2r**2 + w2r*w3r*w2i**2*k*Kdrag**2*vgsol - w2r*w3r*w2i**2*k*Kdrag**2*vdsol -& rhogeq*w2r*w3i**2*w1r**2*rhogsol*w2i**2 + 2*rhogeq*cs**2*k**2*w2r**2*w1r*rhogsol*w2i**2 +& rhogeq**2*w2i*k*vgsol*w3i*w1r**2*w2r**2 - 3*rhogeq**2*cs**2*k**3*w3i*w2i*vgsol*w2r**2 -& 2*Kdrag*k*rhogeq*vgsol*w2r**4*w1i - rhogeq*w2r**3*w3i**2*w1r**2*rhogsol + w3i*vdsol*Kdrag*k*rhogeq*w2r**4 -& vdsol*Kdrag*k*rhogeq*w2i*w2r**4 - 2*w3i*rhogeq*rhogsol*w2r**2*w2i**3*w1r + w3i*rhogeq*rhogsol*w2r*w2i**4*w1i -& w3i*rhogeq*rhogsol*w2i**5*w1r + w3i*rhogeq*rhogsol*w2r**5*w1i - w3i*rhogeq*rhogsol*w2i*w2r**4*w1r +& 2*w3i*rhogeq*rhogsol*w2i**2*w2r**3*w1i - w3i**2*cs**2*k**3*rhogeq**2*vgsol*w2r*w1r +& w3i**2*cs**2*k**3*rhogeq**2*vgsol*w2r**2 - 2*rhogsol*k**2*cs**2*Kdrag*w2i*w2r**3 +& w3i*rhogsol*k**2*cs**2*Kdrag*w2r**3 + w3i*rhogsol*k**2*cs**2*Kdrag*w2r*w2i**2 -& 2*rhogsol*k**2*cs**2*Kdrag*w2r*w2i**3 - w3i*vgsol*k*Kdrag**2*w2i*w2r**2 + vdsol*k*Kdrag**2*w2r**4 -& cs**2*k**2*rhogeq*rhogsol*w2r*w2i**4 + 2*w3i*rhogeq**2*k*vgsol*w2r**2*w2i**3 -& 2*cs**2*k**2*rhogeq*rhogsol*w2r**3*w2i**2 + w3i*rhogeq**2*k*vgsol*w2i*w2r**4 +& 2*w3i*Kdrag*rhogsol*w2r*w2i**3*w1i - cs**2*k**2*rhogeq*rhogsol*w2r**5 + w3i*rhogeq**2*k*vgsol*w2i**5 +& 2*rhogeq**2*k*vgsol*w2i**2*w2r**3*w1r + w3i*Kdrag*rhogsol*w2r**4*w1r + 2*w3i*Kdrag*rhogsol*w2i*w2r**3*w1i +& rhogeq*w2r**2*w3i*w1r**2*k*Kdrag*vgsol + w3i*vdsol*k*Kdrag**2*w2i*w2r**2 - vgsol*k*Kdrag**2*w2r**4 +& 2*vdsol*Kdrag*k*rhogeq*w2i**2*w2r**2*w1i - vdsol*Kdrag*k*rhogeq*w2i**5 + vdsol*Kdrag*k*rhogeq*w2r**4*w1i -& 2*vdsol*Kdrag*k*rhogeq*w2r**2*w2i**3 - w3i*rhogsol*k**4*cs**4*rhogeq*w2r*w1i +& 2*vgsol*k*rhogeq*Kdrag*w2i*w2r**3*w1r + 2*vgsol*k*rhogeq*Kdrag*w2r**2*w2i**3 +& 2*vgsol*k*rhogeq*Kdrag*w2r*w2i**3*w1r + vgsol*k*rhogeq*Kdrag*w2i*w2r**4 - 2*w3i*vgsol*k*rhogeq*Kdrag*w2r**4 +& vgsol*k*rhogeq*Kdrag*w2i**5 - Kdrag*w2r**3*rhogsol*w1i**2*w3i - Kdrag*w2r**2*k*rhogeq*vgsol*w2i*w3i**2 -& Kdrag*w2i**2*rhogsol*w3i*w2r*w1r**2 + Kdrag*w2r**2*rhogsol*k**2*cs**2*w2i*w1r -& Kdrag*w2i**2*rhogsol*w1i**2*w2r*w3i + w2i**2*k*Kdrag**2*vgsol*w2r*w1r - w2r**3*k*Kdrag**2*vdsol*w1r -& w2i**2*k*Kdrag**2*vdsol*w2r*w1r + rhogeq**2*w1i**2*w2r**2*k*vgsol*w2i*w3i +& rhogeq*cs**2*k**2*w1i**2*w2r*rhogsol*w3i**2 + Kdrag*k*rhogeq*vgsol*w2r**2*w1i*w3i**2 +& Kdrag*k*rhogeq*vgsol*w2r**2*w1i**2*w3i + w2r**2*k*Kdrag**2*vgsol*w3i*w1i - w2r**2*k*Kdrag**2*vdsol*w3i*w1i +& rhogeq**2*k*vgsol*w2r**5*w1r - 2*w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w2r*w1i**2 -& 2*w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w2r*w1r**2 - 2*rhogeq**2*k*vgsol*w2i**2*w2r**2*w1r**2) !--break to avoid too many continuation lines rhod2r = rhod2r - rhodeq*( & rhogeq**2*k*vgsol*w2r*w2i**4*w1r - Kdrag*w2r**2*k*rhogeq*vgsol*w2i*w3i*w1i -& Kdrag*w2r**2*k*rhogeq*vgsol*w2i*w1i**2 + Kdrag*w2r**3*k*rhogeq*vgsol*w3i*w1r -& Kdrag*w2i*vgsol*k*rhogeq*w1r**2*w2r**2 + Kdrag*w2i**2*k*rhogeq*vgsol*w2r*w3i*w1r + w2r**3*k*Kdrag**2*vgsol*w1r& - Kdrag*w2r**3*rhogsol*w1i*w3i**2 - Kdrag*w2r**2*rhogsol*k**2*cs**2*w3i*w1r +& rhogeq**2*w1i*w2r**2*k*vgsol*w2i*w3i**2 + Kdrag*w2r**2*rhogsol*w2i*w1r*w3i**2 -& rhogeq*w1i**2*w2r**3*rhogsol*w3i**2 - Kdrag*w2r**3*rhogsol*w3i*w1r**2 - rhogeq*w1i**2*w2i**2*rhogsol*w2r*w3i**2& - Kdrag*w2i**2*rhogsol*w1i*w2r*w3i**2 - w3r**2*rhogeq*w1i**2*w2r**3*rhogsol +& 2*rhogsol*k**4*cs**4*rhogeq*w2r*w2i*w3i + 3*cs**2*k**3*rhogeq**2*vgsol*w2r*w1r*w2i**2 +& 2*rhogeq*w2i**2*k*Kdrag*vdsol*w2r**2*w3i - rhogeq*w2r**3*w3i*w1r*k*Kdrag*vdsol +& Kdrag*rhogsol*k**2*cs**2*w1i*w2r*w2i**2 - 2*Kdrag*k*rhogeq*vgsol*w2r**2*w1i*w2i**2 -& 2*rhogeq**2*w2r**2*w3i**2*k*vgsol*w2i**2 - Kdrag**2*k*vgsol*w2i*w1i*w2r**2 + Kdrag**2*k*vdsol*w2i*w1i*w2r**2 +& w2r*rhogeq**2*vgsol*k*w2i**2*w1r*w3i**2 - 2*Kdrag*w2r**2*k*rhogeq*vgsol*w2i**2*w3i - k*Kdrag**2*vdsol*w2i**4 +& k*Kdrag**2*vgsol*w2i**4 + Kdrag*w2i**2*vgsol*k*rhogeq*w1i*w3r**2 - w3i**2*rhogeq**2*cs**2*k**3*vgsol*w2i**2 +& w2i**2*k*Kdrag**2*vdsol*w3r*w1r - w2i**2*k*Kdrag**2*vdsol*w3i*w1i + w2i**2*k*Kdrag**2*vgsol*w3i*w1i -& Kdrag*rhogsol*k**2*cs**2*w3i*w1r*w2i**2 - w2i**2*k*Kdrag**2*vgsol*w3r*w1r +& w3r**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i - w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i*w1i -& rhogeq**2*vgsol*k*w2i**4*w1r**2 - rhogeq**2*vgsol*k*w2i**4*w1i**2 - w3r**2*vgsol*k*rhogeq*Kdrag*w2i**3 -& w3r*Kdrag*rhogsol*w2i**4*w1i + cs**2*k**3*rhogeq*vgsol*Kdrag*w2i**3 + w3r**2*rhogeq**2*vgsol*k*w2i**3*w1i +& cs**2*k**3*rhogeq**2*vgsol*w2i**3*w1i + w3r*vdsol*Kdrag*k*rhogeq*w2i**3*w1r - w3i*vgsol*k*Kdrag**2*w2i**3 +& w3i*vdsol*k*Kdrag**2*w2i**3 - w3i**2*vgsol*k*rhogeq*Kdrag*w2i**3 - w3i*vgsol*k*rhogeq*Kdrag*w2i**3*w1i -& 3*w3r*vgsol*k*rhogeq*Kdrag*w2i**3*w1r - w3i*Kdrag*rhogsol*w2i**4*w1r + w3r*rhogsol*k**2*cs**2*Kdrag*w2i**3 +& w3r**2*rhogeq*rhogsol*w2i**4*w1r + w3i**2*rhogeq*rhogsol*w2i**4*w1r + w3i**2*Kdrag*rhogsol*w2i**3*w1r +& w3r**2*Kdrag*rhogsol*w2i**3*w1r - 2*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w1i +& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**3 + w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1r**2 +& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**2 - cs**2*k**3*rhogeq*vdsol*Kdrag*w2i**3 -& 2*w3r*rhogeq**2*k*vgsol*w2i**4*w1r - w3r**2*rhogeq**2*vgsol*k*w2i**4 + w3r*cs**2*k**2*rhogeq*rhogsol*w2i**4 -& w3i**2*rhogeq**2*vgsol*k*w2i**4 - w3i*vdsol*Kdrag*k*rhogeq*w2i**3*w1i + w3i*vdsol*Kdrag*k*rhogeq*w2i**4 +& rhogeq*rhogsol*k**2*cs**2*w2i**4*w1r + rhogeq*k*Kdrag*vdsol*w2i**4*w1i - 2*w3i*rhogeq**2*k*vgsol*w2i**4*w1i +& w3i*rhogeq**2*k*vgsol*w2i**3*w1i**2 + w3i*rhogeq**2*k*vgsol*w2i**3*w1r**2 -& 2*w3r*cs**2*k**2*rhogeq*rhogsol*w2i**3*w1i + w3i**2*rhogeq**2*vgsol*k*w2i**3*w1i +& w3r*rhogeq*cs**2*k**2*w1r**2*rhogsol*w2i**2 + w3r*rhogeq*cs**2*k**2*w1i**2*rhogsol*w2i**2 +& w3r*rhogeq*cs**4*k**4*rhogsol*w2i**2 - w3r*Kdrag*rhogsol*k**2*cs**2*w1i*w2i**2 -& w3r**2*rhogeq**2*cs**2*k**3*vgsol*w2i**2 - w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w1r -& w3r*rhogeq*cs**4*k**4*rhogsol*w2i*w1i + rhogeq*cs**4*k**4*w1r*rhogsol*w2i**2 -& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i**2 + w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i**2 -& rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i**2 + rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i**2 +& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w1r - rhogeq**2*cs**2*k**3*w1r**2*vgsol*w2i**2 -& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w1r - rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2i**2 +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i*w1i + Kdrag*w2i**2*k*rhogeq*vgsol*w3i*w1i**2 +& w3i**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i - 2*w3i*cs**2*k**2*rhogeq*rhogsol*w2i**3*w1r +& w3r*rhogeq*rhogsol*w2i**4*w1r**2 + w3r*rhogeq*rhogsol*w2i**4*w1i**2 - rhogeq**2*k*vgsol*w2r**4*w1r**2 +& Kdrag*w2i**2*k*rhogeq*vgsol*w3i**2*w1i + Kdrag*w2i**2*k*rhogeq*vgsol*w3i*w1r**2) rhod2r = rhod2r/(w2i**2 +& w2r**2)/rhogeq/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i + w3r**2)/(w2r**2 + w1r**2 + w2i**2 -& 2*w2i*w1i - 2*w2r*w1r + w1i**2)/Kdrag rhod2i =rhodeq*( - w3r**2*Kdrag*rhogsol*w1i*w2i**3 - w2r*w3i*vdsol*k*Kdrag**2*w2i**2 +& w2r*w3i**2*vgsol*k*rhogeq*Kdrag*w2i**2 + 3*w2r*w3i*vgsol*k*rhogeq*Kdrag*w2i**2*w1i +& w2r*w3r*vgsol*k*rhogeq*Kdrag*w2i**2*w1r + w2r*w3r**2*vgsol*k*rhogeq*Kdrag*w2i**2 -& 3*w2r*cs**2*k**3*rhogeq*vgsol*Kdrag*w2i**2 - w2r*w3r*rhogsol*k**2*cs**2*Kdrag*w2i**2 +& 2*w2r*w3i*Kdrag*rhogsol*w2i**3*w1r - w2r*w3i*cs**2*k**3*rhogeq**2*vgsol*w1i**2 +& 3*w2r*cs**2*k**3*rhogeq*vdsol*Kdrag*w2i**2 - w2r*w3r**2*Kdrag*rhogsol*w2i**2*w1r -& 3*w2r*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**2 - 2*Kdrag*k*rhogeq*vgsol*w2r**3*w1i*w2i +& 4*w2r*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i - w2r*w3i**2*Kdrag*rhogsol*w2i**2*w1r -& w2r*w3i*cs**2*k**3*rhogeq**2*vgsol*w1r**2 - w2r*w3i*vdsol*Kdrag*k*rhogeq*w2i**2*w1i +& w2r*w3i*vgsol*k*Kdrag**2*w2i**2 + Kdrag*vgsol*k*rhogeq*w1r**2*w2r**3 - Kdrag*w2i*k*rhogeq*vgsol*w2r**2*w3i*w1r& - Kdrag*w2r**3*rhogsol*w1r*w3i**2 - 3*cs**2*k**3*rhogeq**2*vgsol*w2r**2*w1r*w2i +& Kdrag*rhogsol*k**2*cs**2*w1i*w2r**2*w2i - w3i**2*Kdrag*rhogsol*w1i*w2i**3 +& 4*w2r*w3r*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i - w2r*w3r*Kdrag*rhogsol*w2i**2*w1i**2 -& Kdrag**2*k*vdsol*w1i*w2r**3 - w2r**2*rhogeq**2*vgsol*k*w2i*w1r*w3i**2 -& 2*w2r*w1r*w3r**2*cs**2*k**2*rhogeq*rhogsol*w2i - w2r*k*Kdrag**2*vdsol*w2i**2*w1i +& w2r*w3r*rhogeq*rhogsol*w2i**4*w1i - 2*w2r*w1r*w3i**2*cs**2*k**2*rhogeq*rhogsol*w2i +& w2r*Kdrag*k*rhogeq*vgsol*w2i**2*w1i**2 - w2r*rhogeq**2*k*vgsol*w2i**4*w1i - w2r*w3r*Kdrag*rhogsol*w2i**2*w1r**2& + w2r*k*Kdrag**2*vgsol*w2i**2*w1i - 2*Kdrag*w2r**3*k*rhogeq*vgsol*w2i*w3i + Kdrag**2*k*vgsol*w1i*w2r**3 +& rhogeq*w1i**2*w2i*rhogsol*w2r**2*w3i**2 - Kdrag*w2i*rhogsol*w1i*w2r**2*w3i**2 -& rhogsol*k**4*cs**4*rhogeq*w2r**2*w3i + rhogeq**2*w1i*w2r**3*k*vgsol*w3i**2 +& w3r**2*rhogeq**2*k*vgsol*w2r**3*w1i + w3r**2*Kdrag*rhogeq*k*vgsol*w2r**3 + w2r*w3i*rhogeq*rhogsol*w2i**4*w1r -& w2r*w3i*rhogeq**2*k*vgsol*w2i**4 + w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1i +& w2r*vdsol*Kdrag*k*rhogeq*w2i**4 - w2r*vgsol*k*rhogeq*Kdrag*w2i**4 + 2*w2r*w3i**2*rhogeq**2*cs**2*k**3*vgsol*w2i& + w2r*Kdrag*k*rhogeq*vgsol*w2i**2*w1r**2 - w2r*w1r*Kdrag*rhogsol*k**2*cs**2*w2i**2 -& 2*vgsol*k*rhogeq**2*w2i**2*w2r**3*w1i - 3*w3r*cs**2*k**3*rhogeq**2*vgsol*w2i*w2r**2 +& w3r*rhogeq*k*Kdrag*vdsol*w2r**3*w1r - w3r*Kdrag*rhogsol*w2r**3*w1r**2 - w3r*Kdrag*rhogsol*w2r**3*w1i**2 +& w3r*rhogeq*rhogsol*w2r**5*w1i - 4*w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w2i*w1i +& w3r**2*rhogeq*rhogsol*w2r**2*w2i*w1r**2 - w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r**2 +& w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r**2 + w3r*rhogeq*k*Kdrag*vdsol*w2r**2*w2i*w1i -& w3r*Kdrag*cs**2*k**2*rhogsol*w2r**3 - 2*w3r*rhogeq*cs**2*k**2*rhogsol*w2r**3*w1i +& 4*w3r*rhogeq*cs**2*k**2*rhogsol*w2r**2*w2i*w1r - w3r**2*rhogeq**2*k*vgsol*w2r**2*w2i*w1r -& w3r*rhogeq**2*k*vgsol*w2r**2*w2i*w1r**2 - w3r**2*Kdrag*rhogsol*w2r**3*w1r + w3r*Kdrag*rhogsol*w2r**4*w1r +& w3r*Kdrag*k*rhogeq*vgsol*w2r**3*w1r - 2*w2r*k*Kdrag**2*vgsol*w2i**3 + rhogeq*w2r**2*w3i*w1r*k*Kdrag*vdsol*w2i -& rhogeq*w3i*w1i*k*Kdrag*vdsol*w2r**3 + 2*w2r**2*w3r*rhogeq**2*k*vgsol*w2i**3 -& 2*w3i*cs**2*k**2*rhogeq*rhogsol*w2r**3*w1r - w3r*rhogeq**2*k*vgsol*w2r**2*w2i*w1i**2 -& rhogeq**2*k*vgsol*w2r**5*w1i - w2r**2*w3r**2*Kdrag*rhogsol*w1i*w2i + 2*w3r*rhogeq*rhogsol*w2i**2*w2r**3*w1i +& w3r**2*rhogeq*rhogsol*w2r**2*w2i*w1i**2 - w3r*w2r**2*Kdrag*rhogeq*k*vgsol*w2i*w1i +& rhogeq**2*cs**2*k**3*w2r**3*vgsol*w1i + 3*rhogeq*cs**4*k**4*w2r**2*rhogsol*w2i +& rhogeq*cs**2*k**3*Kdrag*vdsol*w2r**2*w1r - rhogeq*cs**2*k**3*Kdrag*vgsol*w2r**2*w1r -& 2*w2r**2*w3r*rhogeq*rhogsol*w2i**3*w1r - w3r*rhogeq*w2r**4*w1r*rhogsol*w2i + w3r*rhogeq**2*w2i*k*vgsol*w2r**4 +& 2*w2r*k*Kdrag**2*vdsol*w2i**3 - rhogeq*cs**2*k**3*Kdrag*vdsol*w2r**3 - w2r**2*w3r*w2i*k*Kdrag**2*vdsol +& 2*w2r**2*Kdrag*w3r*w2i**2*k*rhogeq*vgsol + rhogeq*w2r**2*w3i**2*w1r**2*rhogsol*w2i +& rhogeq**2*k*vgsol*w3i*w1r**2*w2r**3 - rhogeq*cs**4*k**4*w2r**2*rhogsol*w1i) !--break to avoid too many continuation lines rhod2i = rhod2i + rhodeq*(& rhogeq*cs**2*k**3*Kdrag*vgsol*w2r**3 + rhogeq*w2r**2*w3i**2*cs**2*k**2*rhogsol*w1i +& w3i**2*Kdrag*rhogsol*w2i**2*w1r**2 + rhogeq**2*cs**2*k**3*w3i*vgsol*w2r**3 +& 2*w3i*rhogeq*rhogsol*w2r**2*w2i**3*w1i + w3i*rhogeq*rhogsol*w2r**5*w1r + w3i*rhogeq*rhogsol*w2i*w2r**4*w1i +& w2r**2*w3r*w2i*k*Kdrag**2*vgsol + rhogsol*k**2*cs**2*Kdrag*w2r**4 - 2*w3i*rhogeq**2*k*vgsol*w2r**3*w2i**2 -& cs**2*k**2*rhogeq*rhogsol*w2r**4*w2i - 2*cs**2*k**2*rhogeq*rhogsol*w2r**2*w2i**3 - w3i*rhogeq**2*k*vgsol*w2r**5& + rhogeq**2*k*vgsol*w2i*w2r**4*w1r + vdsol*Kdrag*k*rhogeq*w2r**5 + 2*w3i*rhogeq*rhogsol*w2r**3*w2i**2*w1r +& w3i**2*Kdrag*rhogsol*w2i**2*w1i**2 + 2*vdsol*Kdrag*k*rhogeq*w2r**3*w2i**2 +& 2*vgsol*k*rhogeq*Kdrag*w2r**2*w2i**2*w1r + w3i*rhogsol*k**2*cs**2*Kdrag*w2r**2*w2i +& w3i*vgsol*k*Kdrag**2*w2r**3 - w2i*k*Kdrag**2*vdsol*w2r**2*w1r + rhogeq**2*w1i**2*w2r**3*k*vgsol*w3i -& w3i*vdsol*k*Kdrag**2*w2r**3 - w3i*Kdrag*rhogsol*w2r**4*w1i - 2*vgsol*k*rhogeq*Kdrag*w2r**3*w2i**2 -& Kdrag*w2i*rhogsol*w1i**2*w2r**2*w3i + w2i*k*Kdrag**2*vgsol*w2r**2*w1r + 3*Kdrag*w2r**3*k*rhogeq*vgsol*w3i*w1i +& Kdrag*w2r**3*k*rhogeq*vgsol*w1i**2 + w3r**2*Kdrag*rhogsol*w2i**2*w1i**2 -& rhogeq*w1i*rhogsol*k**2*cs**2*w3i**2*w2i**2 + w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1i**2 +& w3i*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1r**2 + 2*rhogeq**2*k*vgsol*w2r**2*w2i**3*w1r -& vgsol*k*rhogeq*Kdrag*w2r**5 + Kdrag*w2r**3*k*rhogeq*vgsol*w3i**2 - Kdrag*w2i*rhogsol*w3i*w2r**2*w1r**2 -& Kdrag*w2r**3*rhogsol*k**2*cs**2*w1r + 2*Kdrag*w2i**4*vgsol*k*rhogeq*w1r - 2*Kdrag*w2i**3*w2r*vgsol*k*rhogeq*w1i& + Kdrag*w2i**4*rhogsol*w3i*w1i + rhogeq*w1i*w2r**4*rhogsol*k**2*cs**2 +& 2*rhogeq*w1i*w2r**2*rhogsol*k**2*cs**2*w2i**2 - Kdrag*w3r*w2i**4*rhogsol*w1r +& w2r*w3i*cs**4*k**4*rhogeq*rhogsol*w1r + rhogeq*w1i*w3r*w2i**3*k*Kdrag*vdsol +& 2*Kdrag*w2r**3*rhogsol*w3i*w1r*w2i - 2*w2r*w3r*rhogeq*cs**4*k**4*rhogsol*w2i +& 2*w2r*w3r**2*rhogeq**2*cs**2*k**3*vgsol*w2i + rhogeq*w1i*w2i**4*rhogsol*k**2*cs**2 +& w2r*w3i*rhogeq**2*k*vgsol*w2i**2*w1r**2 + 2*w2r*w3r*cs**2*k**2*rhogeq*rhogsol*w2i**2*w1i -& 2*w2r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i + 2*w2r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i -& 2*w2r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i + w2r*w3r*rhogeq*cs**4*k**4*rhogsol*w1i +& 2*w2r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i - w2r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1i -& 2*w2r*rhogeq*cs**4*k**4*w1r*rhogsol*w2i + w2r*w3i*rhogeq**2*k*vgsol*w2i**2*w1i**2 +& w2r*w3i**2*rhogeq**2*vgsol*k*w2i**2*w1i - 2*w2r*w3r*rhogeq*cs**2*k**2*w1r**2*rhogsol*w2i -& 2*w2r*w3r*rhogeq*cs**2*k**2*w1i**2*rhogsol*w2i - w2r*w3i**2*rhogeq**2*cs**2*k**3*vgsol*w1i +& 2*w2r*w3i*cs**2*k**2*rhogeq*rhogsol*w2i**2*w1r - rhogeq**2*w1i**2*k*vgsol*w3r*w2i**3 +& rhogeq*w1i**2*rhogsol*k**2*cs**2*w3i**2*w2i + rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r**2*w2i -& w2r*w3r*rhogeq*cs**2*k**3*Kdrag*vdsol*w1r + 2*w2r*rhogeq**2*cs**2*k**3*w1r**2*vgsol*w2i +& w2r*w3r*rhogeq*cs**2*k**3*Kdrag*vgsol*w1r + 2*w2r*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2i -& w3i*cs**4*k**4*rhogeq*rhogsol*w1i*w2i - w3i*cs**2*k**2*rhogeq*rhogsol*w2i**2*w1r**2 +& w3r*rhogeq**2*cs**2*k**3*w2i**3*vgsol - w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r*w2i +& rhogeq**2*cs**2*k**3*w2i**3*w1r*vgsol + w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r*w2i -& rhogeq*w1i*rhogsol*k**2*cs**2*w3r**2*w2i**2 - w3r*w2i**3*k*Kdrag**2*vdsol +& w3r*Kdrag*rhogsol*k**2*cs**2*w1r*w2r**2 - w3r*Kdrag*k*rhogeq*vgsol*w2i**2*w1r**2 -& w3r*Kdrag*k*rhogeq*vgsol*w1r**2*w2r**2 - w3i*cs**2*k**2*rhogeq*rhogsol*w2i**2*w1i**2) !--break to avoid too many continuation lines rhod2i = rhod2i + rhodeq*( & w3i*cs**4*k**4*rhogeq*rhogsol*w2i**2 + rhogeq*cs**4*k**4*w2i**2*w1i*rhogsol -& w3r*Kdrag*k*rhogeq*vgsol*w1i**2*w2r**2 + w3r*Kdrag**2*k*vdsol*w2i**2*w1i + w3r*Kdrag**2*k*vdsol*w1i*w2r**2 +& w3r*Kdrag*rhogsol*k**2*cs**2*w2i**2*w1r - w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i -& w3r*rhogeq*cs**2*k**3*w2i**2*Kdrag*vdsol + w3r**2*rhogeq*w2i**3*w1i**2*rhogsol - 2*w2i*k*Kdrag**2*vgsol*w2r**3& - w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2i - w3r*Kdrag**2*k*vgsol*w2i**2*w1i - w3r*Kdrag**2*k*vgsol*w1i*w2r**2& - w3r*Kdrag*k*rhogeq*vgsol*w1i*w2i**3 - w3r*Kdrag*k*rhogeq*vgsol*w2i**2*w1i**2 +& w3r**2*rhogeq*w1r**2*w2i**3*rhogsol - w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol*w2i +& w3r*rhogeq*cs**4*k**4*w1r*rhogsol*w2i - w3r**2*rhogeq**2*w2i**3*w1r*k*vgsol -& w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i + w3r*rhogeq*cs**2*k**3*w2i**2*Kdrag*vgsol +& w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i - w3r**2*rhogeq*w2i**2*w1r*k*Kdrag*vgsol -& w3r**2*rhogeq*w1r*k*Kdrag*vgsol*w2r**2 + w3r**2*Kdrag*rhogsol*w1i**2*w2r**2 +& w3r**2*Kdrag*rhogsol*w2i**2*w1r**2 - Kdrag*rhogsol*k**2*cs**2*w3i*w1i*w2r**2 -& Kdrag*k*rhogeq*vgsol*w3i*w1r*w2i**3 - Kdrag*rhogsol*w1i**2*w2i**3*w3i +& w2r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1i - Kdrag*rhogsol*k**2*cs**2*w2i**2*w3i*w1i -& Kdrag**2*k*vgsol*w2i**2*w3i*w1r + w3i**2*Kdrag*rhogsol*w1r**2*w2r**2 + w3i**2*Kdrag*rhogsol*w1i**2*w2r**2 +& w3r**2*Kdrag*rhogsol*w1r**2*w2r**2 + w2r*w3r**2*rhogeq**2*vgsol*k*w2i**2*w1i -& 3*w2r*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w1i + w2r*w3r*vdsol*Kdrag*k*rhogeq*w2i**2*w1r -& w2r*w3r**2*rhogeq**2*cs**2*k**3*vgsol*w1i + 2*w2r*w3r*Kdrag*rhogsol*w2i**3*w1i -& w3i**2*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i - rhogeq*cs**2*k**3*w2i**2*w1r*Kdrag*vdsol -& Kdrag*rhogsol*w2i**3*w1r**2*w3i - w3i**2*rhogeq*w2i**2*w1r*k*Kdrag*vgsol -& w3i**2*rhogeq*w1r*k*Kdrag*vgsol*w2r**2 - rhogeq*w1r*k*Kdrag*vdsol*w2r**4 -& 2*rhogeq*w2i**2*w1r*k*Kdrag*vdsol*w2r**2 - 2*rhogeq*w1i*w3i**2*rhogsol*w2i**2*w2r**2 -& rhogeq*w1i*w3i**2*rhogsol*w2r**4 - 2*w3i*rhogeq*rhogsol*w2i**2*w1r**2*w2r**2 -& w3r*rhogeq**2*k*vgsol*w2i**3*w1r**2 - w3i*rhogeq*rhogsol*w1r**2*w2r**4 +& 2*w3i*rhogeq*rhogsol*k**2*cs**2*w2i**2*w2r**2 + w3i*rhogeq*rhogsol*k**2*cs**2*w2r**4 +& w3i**2*rhogeq*w1r**2*w2i**3*rhogsol - w3r**2*rhogeq*rhogsol*w2i**4*w1i -& 2*w3r**2*rhogeq*rhogsol*w2i**2*w1i*w2r**2 - w3i**2*rhogeq*rhogsol*w2i**4*w1i +& w3i**2*rhogeq*w2i**3*w1i**2*rhogsol - rhogeq*rhogsol*k**2*cs**2*w2i**5 +& w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2*w2i - w3i*rhogeq*rhogsol*w2i**4*w1r**2 +& w3i**2*cs**2*k**2*rhogeq*rhogsol*w1r**2*w2i + w3i*cs**2*k**2*rhogeq*rhogsol*w2i**4 +& 2*w2i*k*Kdrag**2*vdsol*w2r**3 - w3r*rhogeq*rhogsol*w2i**5*w1r - rhogeq*w1i**2*w2i**4*rhogsol*w3i -& cs**4*k**4*rhogeq*rhogsol*w2i**3 + w3r*w2i**3*k*Kdrag**2*vgsol - rhogeq*k*Kdrag*vdsol*w2i**4*w1r +& w3i*vdsol*Kdrag*k*rhogeq*w2i**3*w1r + w3i*rhogeq*rhogsol*w2i**5*w1i + w3r*rhogeq**2*k*vgsol*w2i**5 -& w3r*vdsol*Kdrag*k*rhogeq*w2i**4 - 2*w3r*vdsol*Kdrag*k*rhogeq*w2i**2*w2r**2 -& 2*Kdrag*w2i**3*k*rhogeq*vgsol*w2r*w3i - w2i**3*k*Kdrag**2*vdsol*w1r + w2i**3*k*Kdrag**2*vgsol*w1r +& 2*Kdrag*w3r*w2r**3*rhogsol*w1i*w2i + Kdrag*w2i**3*rhogsol*k**2*cs**2*w3i -& 2*rhogeq*w1i**2*w2i**2*rhogsol*w3i*w2r**2 - rhogeq*w1i**2*w2r**4*rhogsol*w3i - Kdrag*w2i**4*rhogsol*k**2*cs**2& + Kdrag*w2i**3*rhogsol*k**2*cs**2*w1i - w3r**2*rhogeq*rhogsol*w1i*w2r**4 - w3r*rhogeq*k*Kdrag*vdsol*w2r**4 +& 2*Kdrag*w3r*w2i**4*k*rhogeq*vgsol - w3i**2*rhogeq**2*w2i**3*w1r*k*vgsol + Kdrag**2*k*vdsol*w2i**2*w3i*w1r +& Kdrag**2*k*vdsol*w3i*w1r*w2r**2 - Kdrag**2*k*vgsol*w3i*w1r*w2r**2 + rhogeq*cs**2*k**3*w2i**2*w1r*Kdrag*vgsol +& rhogeq**2*w1r*w2i**5*k*vgsol) rhod2i = rhod2i/(w2i**2 + w2r**2)/rhogeq/(w2r**2 - 2*w3r*w2r + w2i**2 + w3i**2 - 2*w2i*w3i +& w3r**2)/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r + w1i**2)/Kdrag rhod1r =(2*w2i*w3r*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r*w3i**2 - w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w1r*w3i**2 +& rhogeq*w2r*w3i*w1r*k*Kdrag*vdsol*w2i**2*w3r**2 + w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w1r*w3i**2 -& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i*w1i*w3r**2 - Kdrag*w2i**2*k*rhogeq*vgsol*w2r*w3i*w1r*w3r**2 +& Kdrag*w2r**2*k*rhogeq*vgsol*w2i*w3i*w1i*w3r**2 + 4*w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w2r*w1i**2*w3r**2 -& rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r*w1r*w3r**2 + rhogeq*w2i*w3i*w1i*k*Kdrag*vdsol*w2r**2*w3r**2 +& w2i*w3r*rhogeq*k*Kdrag*vdsol*w2r**2*w1r*w3i**2 - 4*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w2r*w1r*w3r**2 +& 4*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w2r*w1r*w3r**2 + w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w3i**2 +& 2*rhogeq*cs**2*k**3*w3i**2*Kdrag*vgsol*w2r*w1r*w1i - 2*w2i*w3i**2*cs**2*k**2*rhogeq*rhogsol*w2r**2*w1r*w1i +& w1i**2*rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r*w1r - w1i**2*rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r*w1r +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i*w1i*w3r**2 - w3r*rhogeq*k*Kdrag*vdsol*w2r*w2i**2*w1i*w3i**2 +& 4*w3r*w2i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r*w3i*w1i - 2*rhogeq*cs**2*k**3*w3i**2*Kdrag*vdsol*w2r*w1r*w1i -& 2*w2r*rhogeq**2*cs**2*k**3*w1r*vgsol*w3i*w1i*w2i**2 - 4*w2i*w3r**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i*w3i**2 +& 3*w3r*w2r*Kdrag*rhogeq*k*vgsol*w2i**2*w1i*w3i**2 - w2i*w3r*Kdrag*k*rhogeq*vgsol*w2r**2*w1r*w3i**2 -& w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w3i**2 + rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r*w1r*w3r**2 +& 2*w3r*w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w2r**2 - 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r*w2i**2 -& 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r**3 - 4*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w1r*w2r**2 +& 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r**3 + 2*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r*w2i**2 +& 4*w3r*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w1r*w2r**2 + 2*w3r*w3i*cs**4*k**4*rhogeq*rhogsol*w2i**3 +& 4*w2r*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i*w1r*w3i**2 - 4*rhogeq**2*k*vgsol*w2r*w2i**2*w1r*w3i**3*w1i -& w3r*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i**4 - 2*w3r*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i**2*w2r**2 -& 2*w3r**3*Kdrag*rhogsol*w2r**2*w1i*w2i**2 - rhogeq*w3i**3*w2i*w1r*rhogsol*w2r**2*w1i**2 +& 2*w1r**2*rhogsol*k**4*cs**4*rhogeq*w2r*w2i*w3i - rhogeq*w3i**3*k*Kdrag*vdsol*w2r**2*w1i**2 +& w1i**2*rhogeq**2*k*vgsol*w2r*w2i**2*w1r*w3i**2 + w1i**3*w2i*rhogeq**2*k*vgsol*w2r**2*w3i**2 -& 2*w2r*rhogeq*w1i**3*rhogsol*k**2*cs**2*w3i**2*w2i + w1i**2*rhogeq**2*w2r**3*k*w1r*vgsol*w3i**2 -& 2*w2r*cs**2*k**2*rhogeq*rhogsol*w1r**2*w3i**2*w1i*w2i - 2*Kdrag*k*rhogeq*vgsol*w2r**3*w1i*w1r*w3i**2 -& 2*w2r*Kdrag*rhogeq*k*vgsol*w2i**2*w1i*w1r*w3i**2 + w1r**3*rhogeq**2*k*vgsol*w2r*w2i**2*w3i**2 -& 2*w1r**3*w2r*rhogeq**2*cs**2*k**3*vgsol*w2i*w3i - 2*w3i**2*cs**2*k**3*rhogeq**2*vgsol*w2r**2*w2i**2 -& w1r**3*w2r*rhogeq**2*cs**2*k**3*vgsol*w3i**2 - w3i*rhogsol*k**4*cs**4*rhogeq*w2r*w1i*w2i**2 -& w3i*rhogsol*k**4*cs**4*rhogeq*w2r**3*w1i - w2i*rhogeq*k*Kdrag*vdsol*w2r**2*w1r**2*w3i**2 +& w1r**3*rhogeq**2*w2r**3*k*vgsol*w3i**2 - w3i**2*rhogeq*k*Kdrag*vdsol*w2r**2*w1i**2*w2i -& w3i**2*cs**2*k**3*rhogeq**2*vgsol*w2r**4 + 2*rhogeq**2*cs**2*k**3*w3i*w1i*vgsol*w2r**2*w2i**2 -& rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r**3*w1r - 2*w3r*w3i**2*Kdrag*rhogsol*w2r**2*w1i*w2i**2 -& rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r*w1r*w2i**2 + rhogeq**2*cs**2*k**3*w3i*w1i*vgsol*w2r**4) !--break to avoid too many continuation lines rhod1r = rhod1r + (& 2*w2r*w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2*w2i**2 + 2*w2r**3*w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2 -& 2*rhogeq*w2r*w3i**2*cs**2*k**2*rhogsol*w1r**2*w2i**2 - 2*rhogeq*w2r**3*w3i**2*cs**2*k**2*rhogsol*w1r**2 +& rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r*w1r*w2i**2 + rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r**3*w1r +& w2r*w3r*rhogeq*cs**4*k**4*w1r*rhogsol*w2i**2 + w2r**3*w3r*rhogeq*cs**4*k**4*w1r*rhogsol +& w2r*w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol*w2i**2 + w2r**3*w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol +& w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i**2 + w2r**3*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol -& w2r**3*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol - w2r*w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2i**2 -& w2r**3*w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol - w2r*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i**2 +& 4*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w2i**3*w1i**2 + 4*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w2i*w1i**2*w2r**2 -& w3r*rhogeq**2*cs**2*k**3*w2r**4*w1r*vgsol + 2*w3r**2*rhogeq**2*cs**2*k**3*w2r**2*vgsol*w2i**2 +& w3r**2*rhogeq**2*cs**2*k**3*w2r**4*vgsol + w3r*rhogeq*cs**2*k**2*w2r**4*w1r**2*rhogsol +& 2*w3r*rhogeq*cs**2*k**2*w1i**2*w2r**2*rhogsol*w2i**2 - 4*w3r*w3i*cs**4*k**4*rhogeq*rhogsol*w1i*w2i**2 +& w3r*rhogeq*cs**2*k**2*w1i**2*w2r**4*rhogsol + 2*w3r*rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol*w2i**2 -& 2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w2r**4*w1i - 2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w1i*w2i**4 -& 4*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w1i*w2i**2*w2r**2 - w3i**3*Kdrag*rhogeq*k*vgsol*w2i**4 +& 2*w3i**3*Kdrag*rhogsol*w2r**2*w1r*w2i**2 + w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i**3*w1i +& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i*w1i*w2r**2 - w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w1r*w2r**2 -& w3r*rhogeq*cs**4*k**4*rhogsol*w2i**3*w1i + w3r*rhogeq*cs**2*k**3*w2i**3*Kdrag*vdsol*w1r +& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w1r*w2r**2 - w3r*rhogeq*cs**2*k**3*w2i**3*Kdrag*vgsol*w1r +& w3r*rhogeq*cs**2*k**2*w1i**2*rhogsol*w2i**4 + w3r**2*rhogeq**2*cs**2*k**3*vgsol*w2i**4 -& w3i*cs**4*k**4*rhogeq*rhogsol*w2i**3*w1r - w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w1r*w2r**2 -& w3r*rhogeq*cs**4*k**4*rhogsol*w2i*w1i*w2r**2 + w3r*rhogeq*cs**2*k**2*w1r**2*rhogsol*w2i**4 +& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**4*w1i + w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**3*w1r**2 +& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1r**2*w2r**2 - w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**3*w1i**2 -& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**2*w2r**2 - w3i**2*rhogeq**2*cs**2*k**3*vgsol*w2i**4 +& Kdrag*w2i**4*vgsol*k*rhogeq*w1i*w3r**2 - w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i**3*w1i -& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i*w1i*w2r**2 - 2*w3i**3*cs**2*k**3*rhogeq**2*vgsol*w2r*w1r*w2i -& rhogeq*w3i**3*w2i*w1r**3*rhogsol*w2r**2 + 2*w3i*w3r**2*Kdrag*rhogsol*w2r**2*w1r*w2i**2 -& w3i*w3r**2*Kdrag*rhogeq*k*vgsol*w2i**4 + Kdrag*w2i**4*k*rhogeq*vgsol*w3i**2*w1i +& 2*w1r**2*rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r**2 - 2*w1r**2*rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r**2 +& w1r**4*w2r*cs**2*k**2*rhogeq*rhogsol*w3i**2 + w3r*rhogeq**2*cs**2*k**3*w2r**3*vgsol*w3i**2 +& 2*w2i*w3r**2*rhogeq**2*k*vgsol*w2r**2*w1i*w3i**2 - w2i*w3r**4*Kdrag*rhogeq*k*vgsol*w2r**2 +& w2i*w3r**4*rhogeq**2*k*vgsol*w2r**2*w1i - 2*w2i*w3r**4*cs**2*k**2*rhogeq*rhogsol*w2r*w1i -& w3r*Kdrag*rhogsol*w2i**3*w1r**2*w3i**2 - Kdrag*w3r**3*w2r**4*rhogsol*w1i +& w3r*Kdrag*rhogsol*w2i**3*w1i**2*w3i**2 + 2*Kdrag*k*rhogeq*vgsol*w2i**3*w1r**2*w3i**2 -& 2*w1i**2*w2r*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i*w3i - w1i**2*w2r*rhogeq**2*cs**2*k**3*w1r*vgsol*w3i**2 -& w3r**3*w2r**3*k*Kdrag**2*vdsol + 2*Kdrag*k*rhogeq*vgsol*w2i**3*w1r**2*w3r**2 +& w1r**2*w2i*rhogeq**2*k*vgsol*w2r**2*w1i*w3i**2 + k*Kdrag**2*vgsol*w2i**3*w1i*w3i**2) !--break to avoid too many continuation lines rhod1r = rhod1r + (& k*Kdrag**2*vgsol*w2i**3*w1i*w3r**2 + w3r**3*w2r**3*k*Kdrag**2*vgsol +& 2*w1i**2*w2r*cs**2*k**2*rhogeq*rhogsol*w1r**2*w3i**2 - w3r**3*rhogeq*w2r**4*w1r**2*rhogsol -& rhogeq*w1i**2*w3r**3*w2r**4*rhogsol - w3r**4*rhogeq*w2r**3*w1r**2*rhogsol - k*Kdrag**2*vdsol*w2i**3*w1i*w3i**2& - w3r**4*Kdrag*rhogsol*w2r**3*w1i - w3r**3*Kdrag*rhogsol*w2i**3*w1r**2 + w3r**3*Kdrag*rhogsol*w2i**3*w1i**2 -& k*Kdrag**2*vdsol*w2i**3*w1i*w3r**2 - rhogeq**2*w3i**2*k*w1r**4*vgsol*w2r**2 +& Kdrag*w2r**3*rhogsol*w1i**2*w3i**3 + 2*w3r**2*rhogeq**2*w2r**3*k*w1r*vgsol*w3i**2 +& w2i*w3r**3*Kdrag*rhogsol*w2r**2*w1i**2 + w3r**4*rhogeq*w2r**2*w1i*k*Kdrag*vgsol -& w2i*w3r**3*Kdrag*rhogsol*w2r**2*w1r**2 + w3r**4*rhogeq**2*w2r**3*k*w1r*vgsol -& 2*w3r*rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol*w3i**2 - 2*w3r**2*Kdrag*rhogsol*w2r**3*w1i*w3i**2 +& 2*w2r*rhogeq**2*cs**2*k**3*w1r*vgsol*w3i**3*w1i + w3r**4*rhogeq**2*cs**2*k**3*w2r**2*vgsol +& 2*w3r*rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol*w3i**2 + 2*w3r**2*rhogeq**2*cs**2*k**3*w2r**2*vgsol*w3i**2 +& rhogeq**2*cs**2*k**3*w2r**2*vgsol*w1r**2*w3i*w1i - w1i**3*w3i*rhogsol*k**4*cs**4*rhogeq*w2r -& 2*w2r*cs**2*k**2*rhogeq*rhogsol*w1r**2*w3i**3*w1i + 3*w3r*Kdrag*k*rhogeq*vgsol*w2r**3*w1i*w3i**2 +& 2*rhogeq*w3i**3*cs**2*k**2*rhogsol*w1r*w2r**2*w1i + w3i**3*Kdrag*rhogsol*w2r**4*w1r -& 2*w3r**3*rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol + 2*w3r**3*rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol -& rhogeq*w2r**3*w3i**4*w1r**2*rhogsol - w3r**3*Kdrag**2*k*vgsol*w2r**2*w1r + w3r**3*Kdrag**2*k*vdsol*w2r**2*w1r +& 3*w3r**3*Kdrag*k*rhogeq*vgsol*w2r**3*w1i + 2*rhogeq*cs**4*k**4*w2r*rhogsol*w2i*w1i**2*w3i -& w3r*Kdrag**2*k*vgsol*w2r**2*w1r*w3i**2 + rhogeq*w2r**4*w3i**4*w1r*rhogsol - rhogeq**2*w2r**4*w3i**4*k*vgsol +& w3r**4*rhogeq*w2r**4*w1r*rhogsol + w3r*Kdrag**2*k*vdsol*w2r**2*w1r*w3i**2 -& w3r*Kdrag*rhogsol*k**2*cs**2*w1i*w2r**2*w3i**2 - w3r**4*rhogeq**2*w2r**4*vgsol*k +& w3r**3*rhogeq**2*cs**2*k**3*w2r**3*vgsol - w3r**3*Kdrag*rhogsol*k**2*cs**2*w1i*w2r**2 -& 2*w2i*w3r**2*Kdrag*rhogeq*k*vgsol*w2r**2*w3i**2 + 2*rhogeq*cs**4*k**4*w1r*rhogsol*w2r**2*w3i*w1i -& w3r**4*rhogeq*w1i**2*w2r**3*rhogsol - 2*w2i*w3r**3*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r +& 4*w3r**2*rhogeq*rhogsol*w2r**2*w2i**2*w1r*w3i**2 + w2i*w3r**3*Kdrag*cs**2*k**2*rhogsol*w2r**2 +& w2i*w3r*Kdrag*cs**2*k**2*rhogsol*w2r**2*w3i**2 - 2*rhogeq**2*cs**2*k**3*w2r**3*w1r*vgsol*w3i*w1i -& Kdrag*w2r**3*rhogsol*w3i**3*w1r**2 - w1r**3*rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r -& w3r**4*rhogeq*rhogsol*w2r*w2i**2*w1r**2 + w2i*w3r*Kdrag*rhogsol*w2r**2*w1i**2*w3i**2 +& 2*w3r**4*rhogeq*rhogsol*w2r**2*w2i**2*w1r + 2*w2i*w3r**3*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r -& rhogeq*w1i**2*w2r**3*rhogsol*w3i**4 - Kdrag*w2r**3*rhogsol*w1i*w3i**4 -& w2i*w3r*Kdrag*rhogsol*w2r**2*w1r**2*w3i**2 + w2i*w3r**3*rhogeq*k*Kdrag*vdsol*w2r**2*w1r +& 2*w3r**2*rhogeq*w2r**2*w1i*k*Kdrag*vgsol*w3i**2 - 4*w3r**2*rhogeq**2*k*vgsol*w2i**2*w2r**2*w3i**2 +& 2*w3r**2*rhogeq**2*k*vgsol*w2r*w2i**2*w1r*w3i**2 - 2*w3r*rhogeq*rhogsol*w2i**2*w1r**2*w2r**2*w3i**2 -& w3r**4*rhogeq*rhogsol*w2r*w2i**2*w1i**2 + w3i**3*Kdrag*rhogsol*w2i**4*w1r -& 2*w3r*rhogeq*rhogsol*w1i**2*w2r**2*w2i**2*w3i**2 - 2*w3r**2*rhogeq*rhogsol*w2r*w2i**2*w1i**2*w3i**2 +& w3r**4*rhogeq*rhogsol*w2i**4*w1r + w3i**3*vdsol*k*Kdrag**2*w2i**3 +& rhogeq*w1i*w3i**2*k*Kdrag*vdsol*w2r**2*w1r**2 + w3r**3*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w2r -& w3i**3*vgsol*k*Kdrag**2*w2i**3 + w3r**4*rhogeq**2*k*vgsol*w2r*w2i**2*w1r - w3r**3*Kdrag*rhogsol*w2i**4*w1i -& 2*w3r**2*rhogeq*rhogsol*w2r*w2i**2*w1r**2*w3i**2 - w3r**3*rhogeq*k*Kdrag*vdsol*w2r*w2i**2*w1i -& w3r**3*rhogeq*rhogsol*w2i**4*w1i**2 + 2*w3i**2*rhogsol*k**4*cs**4*rhogeq*w2r*w1i**2 +& 2*w2i*w3r**2*Kdrag*rhogsol*w2r**2*w1r*w3i**2 - w1r*Kdrag*rhogsol*k**2*cs**2*w2i**3*w3i**2 +& 2*w3r*rhogeq**2*k*vgsol*w2r**2*w2i**2*w1r*w3i**2 - w3r**3*rhogeq*rhogsol*w2i**4*w1r**2 -& w1r*Kdrag*rhogsol*k**2*cs**2*w2i**3*w3r**2 - 2*w3r*rhogeq**2*k*vgsol*w2r*w2i**2*w1r**2*w3i**2 -& w3i**4*rhogeq**2*vgsol*k*w2i**4 + w3r**4*Kdrag*rhogsol*w2i**3*w1r - w3r**4*rhogeq**2*vgsol*k*w2i**4 +& w3i**4*Kdrag*rhogsol*w2i**3*w1r - w3r*rhogeq*cs**4*k**4*w2r**2*rhogsol*w3i**2) !--break to avoid too many continuation lines rhod1r = rhod1r + (& 2*w3r*rhogeq**2*k*vgsol*w2r*w2i**2*w1i**2*w3i**2 + w3i**4*rhogeq*rhogsol*w2i**4*w1r +& 3*w3r**3*w2r*Kdrag*rhogeq*k*vgsol*w2i**2*w1i + 2*w3r**3*rhogeq**2*k*vgsol*w2r**2*w2i**2*w1r -& 2*w3r**3*rhogeq**2*k*vgsol*w2r*w2i**2*w1r**2 + 2*w3r**3*rhogeq**2*k*vgsol*w2r*w2i**2*w1i**2 -& 2*w3r**4*rhogeq**2*k*vgsol*w2i**2*w2r**2 - 2*w3r**3*rhogeq*rhogsol*w2i**2*w1r**2*w2r**2 +& w3r*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w2r*w3i**2 - 2*w3r**3*rhogeq*rhogsol*w1i**2*w2r**2*w2i**2 +& w1r*w3r**4*cs**2*k**2*rhogeq*rhogsol*w2i**2 + w1r*w3i**4*cs**2*k**2*rhogeq*rhogsol*w2i**2 +& 2*rhogeq**2*w1i**2*k*vgsol*w3r*w2r**3*w3i**2 + w2i*w3r**4*Kdrag*rhogsol*w2r**2*w1r -& 2*w3r**2*rhogeq*w2r**3*w1r**2*rhogsol*w3i**2 - w3r**3*rhogeq*cs**4*k**4*w2r**2*rhogsol +& w1r**3*rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r - 2*w3r**3*rhogeq**2*w1r**2*k*vgsol*w2r**3 +& 2*rhogeq**2*w1i**2*k*vgsol*w3r**3*w2r**3 - w2i*w3r**3*Kdrag*k*rhogeq*vgsol*w2r**2*w1r -& rhogeq*w1i*w3r**3*w2r**3*k*Kdrag*vdsol - 2*w3r*rhogeq**2*w1r**2*k*vgsol*w2r**3*w3i**2 +& w2r*w3r**3*rhogeq**2*cs**2*k**3*w1r**2*vgsol - w2r*w3r**3*rhogeq**2*cs**2*k**3*w1i**2*vgsol -& w1i**3*rhogeq*w2r**2*k*Kdrag*vgsol*w3i**2 + 2*w1r*w3i**2*cs**2*k**2*rhogeq*rhogsol*w2i**2*w3r**2 +& w2r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r**4 - rhogeq*w3i**4*cs**2*k**2*rhogsol*w1r*w2r**2 -& 2*w2r*w3r**2*Kdrag*rhogsol*w1i*w2i**2*w3i**2 - w2r*w3r**4*rhogeq**2*cs**2*k**3*w1r*vgsol -& rhogeq*w1i*w3r*w2r**3*k*Kdrag*vdsol*w3i**2 + w2r*w3r**3*rhogeq*cs**4*k**4*w1r*rhogsol -& Kdrag*w3r*w2r**4*rhogsol*w1i*w3i**2 - w3r*w2r**3*k*Kdrag**2*vdsol*w3i**2 + w3r*w2r**3*k*Kdrag**2*vgsol*w3i**2 +& rhogeq*rhogsol*w2r*w2i**2*w1i**3*w3i**3 - 4*rhogeq**2*w2r**3*k*w1r*vgsol*w3i**3*w1i +& w2r**2*k*Kdrag**2*vdsol*w3i**2*w1i**2 - w3r*rhogeq*w2r**4*w1r**2*rhogsol*w3i**2 -& rhogeq*w1i**2*w3r*w2r**4*rhogsol*w3i**2 + w3r*rhogeq**2*w2r**4*k*w1r*vgsol*w3i**2 -& w2r**2*k*Kdrag**2*vgsol*w3i**2*w1i**2 - Kdrag*rhogsol*k**2*cs**2*w1i*w2r**3*w3r**2 +& w2r*w3r**3*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol - w2r*w3r**3*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol +& w2r*w3r**4*cs**2*k**2*rhogeq*rhogsol*w1r**2 + 2*w2r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w3r**2*w3i**2 -& w3r**4*rhogeq*rhogsol*k**2*cs**2*w2r**2*w1r - rhogeq**2*w1i**4*k*vgsol*w3i**2*w2r**2 -& Kdrag*rhogsol*k**2*cs**2*w1i*w2r**3*w3i**2 + w2r*w3r*rhogeq**2*cs**2*k**3*w1r**2*vgsol*w3i**2 -& w2r*w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w3i**2 - w2r*w3r**4*Kdrag*rhogsol*w1i*w2i**2 +& rhogeq*w2r*w3i**3*w1r*k*Kdrag*vdsol*w2i**2 - 2*w2r*w3r**2*rhogeq**2*cs**2*k**3*w1r*vgsol*w3i**2 +& rhogeq**2*w3i**3*w1i**3*k*vgsol*w2r**2 + rhogeq*w2r*w3i**4*cs**2*k**2*rhogsol*w1r**2 +& w2r*w3r*rhogeq*cs**4*k**4*w1r*rhogsol*w3i**2 - 2*w2r*rhogeq*w1i**3*rhogsol*k**2*cs**2*w3i**3 -& rhogeq*cs**2*k**3*w3i**3*Kdrag*vdsol*w2r**2 + rhogeq*cs**4*k**4*w2r*rhogsol*w2i**2*w3i**2 +& w3r**3*rhogeq**2*w2r**4*k*w1r*vgsol - w1r**2*rhogeq*w2r**2*w1i*k*Kdrag*vgsol*w3i**2 -& rhogeq*cs**4*k**4*w2r*rhogsol*w2i**2*w3r**2 + 2*rhogeq**2*cs**2*k**3*w2r**2*vgsol*w1r**2*w3i**2 +& rhogeq*cs**2*k**3*w3i**3*Kdrag*vdsol*w2r*w1r + 2*rhogeq**2*w3i**3*w2r**2*w1i*k*vgsol*w2i**2 -& rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r**2*w3r**2 - w1r**2*w3i*rhogsol*k**4*cs**4*rhogeq*w2r*w1i -& 2*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2r**2*w3i**2 + rhogeq*cs**4*k**4*w2r**3*rhogsol*w3i**2 -& rhogeq*cs**4*k**4*w2r**3*rhogsol*w3r**2 + 2*w2r*w3r**2*cs**2*k**2*rhogeq*rhogsol*w1r**2*w3i**2 +& 2*w3r**2*rhogeq*w2r**4*w1r*rhogsol*w3i**2 - 2*w3r**2*rhogeq**2*w2r**4*vgsol*k*w3i**2 -& 2*rhogeq*w3i**2*cs**2*k**2*rhogsol*w1r*w2r**2*w3r**2 + rhogeq*w2i*w3i**3*w1i*k*Kdrag*vdsol*w2r**2 +& rhogeq*cs**2*k**3*w3i**3*Kdrag*vgsol*w2r**2 + rhogeq*cs**2*k**2*w2r**4*w1r*rhogsol*w3i**2 -& rhogeq*cs**2*k**2*w2r**4*w1r*rhogsol*w3r**2 + 2*rhogeq**2*cs**2*k**3*w2r**2*vgsol*w2i*w1i*w3i**2 -& 2*w2i*w3r*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r*w3i**2 + rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r**2*w3r**2 -& rhogeq*cs**2*k**3*w3i**3*Kdrag*vgsol*w2r*w1r + w2r*w3r**3*w2i**2*k*Kdrag**2*vgsol) !--break to avoid too many continuation lines rhod1r = rhod1r + (& rhogeq**2*w3i*w2r**4*w1i*k*vgsol*w3r**2 + rhogeq**2*w2r**3*w3i**4*k*w1r*vgsol +& 2*rhogeq*w2r**2*w3i**4*w1r*rhogsol*w2i**2 + rhogeq**2*w3i**3*w2r**4*w1i*k*vgsol -& 2*rhogeq*w2r*w3i**4*cs**2*k**2*rhogsol*w2i*w1i - w2r*w3r**3*w2i**2*k*Kdrag**2*vdsol -& rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2r**2*w3r**2 - rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w2r**2*w3i**2 +& rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w2r**2*w3r**2 + rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2r**2*w3i**2 +& w2r*w3r*w2i**2*k*Kdrag**2*vgsol*w3i**2 - rhogeq*cs**4*k**4*w1r*rhogsol*w2r**2*w3i**2 +& 3*rhogeq*cs**4*k**4*w1r*rhogsol*w2r**2*w3r**2 + rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2r**2*w3r**2 -& rhogeq*w2r*w3i**4*w1r**2*rhogsol*w2i**2 - 4*rhogeq*cs**4*k**4*w2r*rhogsol*w2i*w1i*w3i**2 -& 2*rhogeq**2*cs**2*k**3*w2r**3*w1r*vgsol*w3r**2 + rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w2r**2*w3i**2 +& Kdrag*k*rhogeq*vgsol*w2r**4*w1i*w3i**2 + Kdrag*k*rhogeq*vgsol*w2r**4*w1i*w3r**2 -& rhogeq**2*cs**2*k**3*w3i**3*w2i*vgsol*w2r**2 + w1i**3*w3r**3*rhogeq*rhogsol*w2i**3 +& 2*rhogeq**2*w2i*k*vgsol*w3i**3*w1r**2*w2r**2 - w2r*w3r*w2i**2*k*Kdrag**2*vdsol*w3i**2 -& rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w2r**2*w3r**2 - rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2r**2*w3i**2 -& w3i**4*cs**2*k**3*rhogeq**2*vgsol*w2r*w1r + 2*rhogeq*cs**2*k**2*w2r**2*w1r*rhogsol*w2i**2*w3i**2 -& 2*rhogeq*cs**2*k**2*w2r**2*w1r*rhogsol*w2i**2*w3r**2 + 2*rhogeq**2*w3i*w2r**2*w1i*k*vgsol*w2i**2*w3r**2 -& w3i**3*vgsol*k*Kdrag**2*w2i*w2r**2 + w3i**3*rhogsol*k**2*cs**2*Kdrag*w2r*w2i**2 +& w3i*rhogsol*k**2*cs**2*Kdrag*w2r**3*w3r**2 + w3i**3*rhogsol*k**2*cs**2*Kdrag*w2r**3 +& w3i**4*cs**2*k**3*rhogeq**2*vgsol*w2r**2 - rhogeq**2*cs**2*k**3*w3i*w2i*vgsol*w2r**2*w3r**2 +& 2*rhogeq**2*w2i*k*vgsol*w3i*w1r**2*w2r**2*w3r**2 - w3i*vgsol*k*Kdrag**2*w2i*w2r**2*w3r**2 +& w3i*Kdrag*rhogsol*w2r**4*w1r*w3r**2 - 2*w3r*rhogeq*cs**2*k**2*w1i**3*w2r**2*rhogsol*w3i +& 2*w3r*rhogeq**2*cs**2*k**3*w2r**3*vgsol*w3i*w1i - 2*w3r*w1r**2*w2i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r -& 2*w3r*w1i**3*w2i*rhogeq*cs**2*k**2*rhogsol*w2r**2 + 2*w3r*w1r**2*w2i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r +& 2*w3r*w1i**2*rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol + w3r*rhogeq*w1i**3*w3i**2*rhogsol*w2i*w2r**2 +& w3i*rhogsol*k**2*cs**2*Kdrag*w2r*w2i**2*w3r**2 + 2*w3r*w2r*w1i**3*rhogeq**2*cs**2*k**3*vgsol*w2i +& 2*w3r*w2r*rhogeq**2*cs**2*k**3*w1i**3*vgsol*w3i + w3r*w1i**4*rhogeq*cs**2*k**2*w2r**2*rhogsol +& 2*w3r*w2r*w1r**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i + w3r*w1i**2*rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol +& w3r*rhogeq*w2r**3*w1r**3*rhogsol*w3i**2 - 2*w3r*w2r*rhogeq*cs**2*k**3*w1i**2*Kdrag*vdsol*w3i +& 2*w3r*w2r*rhogeq*cs**2*k**3*w1i**2*Kdrag*vgsol*w3i - 2*w3r*w2r*cs**2*k**2*rhogeq*rhogsol*w1r**3*w3i**2 +& 2*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2r**2*w1r - 2*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2r**2*w1r +& 2*w3r*rhogeq**2*cs**2*k**3*w2r**2*vgsol*w2i*w1i*w1r - 2*w3r*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**3*w1r +& 4*w3r*rhogeq*rhogsol*k**2*cs**2*w2r**3*w1r*w3i*w1i + 2*w3r*w2r*Kdrag*rhogsol*w1i*w2i**2*w3i**2*w1r -& 2*w3r*w1r**2*rhogeq*cs**4*k**4*w2r**2*rhogsol + w3r*rhogeq*rhogsol*w2r*w2i**2*w1i**2*w3i**2*w1r -& w3r*w1r**2*w2r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol + w3r*w1r**2*w2r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol +& 2*w3r*w2r*rhogeq**2*cs**2*k**3*w1r**2*vgsol*w3i*w1i - 2*w3r*w2r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w3i**2*w1r +& w3r*rhogeq*rhogsol*w2r*w2i**2*w1r**3*w3i**2 - 4*w3r*rhogsol*k**4*cs**4*rhogeq*w2r*w2i*w3i*w1r +& w3r*w1r**3*rhogeq**2*cs**2*k**3*w2r**2*vgsol + w3r*rhogeq**2*w3i**2*k*w1r**3*vgsol*w2r**2 -& 4*w3r*rhogeq**2*cs**2*k**3*w2r**2*w1r*vgsol*w3i*w1i - 2*w3r*rhogeq*cs**2*k**2*w2r**2*w1r**2*rhogsol*w3i*w1i +& 2*w3r*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w2r*w3i*w1i + 4*w3r*w2i*cs**2*k**2*rhogeq*rhogsol*w2r*w1i*w3i**2*w1r -& 2*w3r*w1i**2*rhogeq*cs**2*k**2*rhogsol*w2r*w2i**2*w1r - 2*w3r*w1i**2*w2i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2r +& 2*w3r*w1i**2*w2i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r + w3r*rhogeq*w1i**2*w2r**3*rhogsol*w3i**2*w1r -& 2*w3r*rhogeq**2*cs**2*k**3*w3i*w2i*vgsol*w2r**2*w1r + w3r**3*rhogeq*w2r**3*w1r**3*rhogsol -& 2*w3r**3*rhogeq*w2r**2*w1i*k*Kdrag*vgsol*w1r - w3i*rhogsol*k**4*cs**4*rhogeq*w2r*w1i*w3r**2) !--break to avoid too many continuation lines rhod1r = rhod1r + (& w3i*vdsol*k*Kdrag**2*w2i*w2r**2*w3r**2 + 2*rhogeq*w2r**2*w3i**3*w1r**2*k*Kdrag*vgsol -& 4*w3r*rhogeq**2*cs**2*k**3*w2r*w1i**2*vgsol*w2i*w3i - w3r*w1r**4*w2r*rhogeq**2*cs**2*k**3*vgsol +& 4*w3r*w2i**2*cs**2*k**2*rhogeq*rhogsol*w2r*w1i*w1r*w3i + w3r*w1r**3*w2r*rhogeq*cs**4*k**4*rhogsol -& w3i**3*vgsol*k*rhogeq*Kdrag*w2r**4 - 2*w3r*rhogeq*w2r**2*w1i*k*Kdrag*vgsol*w3i**2*w1r +& w3r*rhogeq**2*w3i**2*k*w1r*vgsol*w2r**2*w1i**2 + 4*w3r*rhogeq**2*cs**2*k**3*w2r*w1r**2*vgsol*w2i*w3i +& 2*w3r*cs**2*k**3*rhogeq**2*w2r*vgsol*w2i*w1i*w3i**2 - 2*w3r*w2r**3*rhogeq*w1i**2*rhogsol*k**2*cs**2*w1r -& 2*w3r*w2r**3*cs**2*k**2*rhogeq*rhogsol*w1r**3 + rhogeq*w2r**3*w1r**2*rhogsol*w3i**3*w1i -& 2*w3r*rhogeq*cs**2*k**3*w3i*Kdrag*vdsol*w2r*w1r**2 - 4*w3r*w2i*rhogeq**2*k*vgsol*w2r**2*w1i*w3i**2*w1r -& 2*w3r*w1r**3*rhogeq*cs**2*k**2*rhogsol*w2r*w2i**2 - 2*w3r*w2i*w1i*rhogeq**2*cs**2*k**3*w1r*vgsol*w3i**2 +& w3i**3*vdsol*k*Kdrag**2*w2i*w2r**2 + 2*rhogeq*w2r**2*w3i*w1r**2*k*Kdrag*vgsol*w3r**2 -& 2*w3r*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1r**3 - 2*w3r*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**2*w1r +& 4*w3r*rhogeq**2*cs**2*k**3*w3i*w1i*vgsol*w2i**2*w1r + 2*w3r*rhogeq*cs**2*k**3*w3i*Kdrag*vgsol*w2r*w1r**2 +& 2*w3r*Kdrag*rhogsol*w2r**3*w1i*w3i**2*w1r - 2*w3r*w1i**2*w2r*rhogeq**2*cs**2*k**3*w1r**2*vgsol +& w3r*w1i**2*w2r*rhogeq*cs**4*k**4*w1r*rhogsol + w3r*w1i**3*w2r*rhogeq*cs**2*k**3*Kdrag*vdsol -& w3r*w1i**3*w2r*rhogeq*cs**2*k**3*Kdrag*vgsol - w3r*w1i**4*w2r*rhogeq**2*cs**2*k**3*vgsol +& w3r*rhogeq*w1i*w3i**2*rhogsol*w2i*w2r**2*w1r**2 - 2*w3r*w1r**2*w2i*rhogeq*cs**2*k**2*rhogsol*w2r**2*w1i +& Kdrag*w2i**2*rhogsol*w1i**2*w2r*w3i**3 + Kdrag*w2i**2*rhogsol*w1i**2*w2r*w3i*w3r**2 -& Kdrag*w2i**2*rhogsol*w3i*w2r*w1r**2*w3r**2 - Kdrag*w2i**2*rhogsol*w3i**3*w2r*w1r**2 -& Kdrag*w2r**2*k*rhogeq*vgsol*w2i*w3i**4 - w3i*vgsol*k*rhogeq*Kdrag*w2r**4*w3r**2 +& 2*w1r**3*rhogeq*cs**2*k**2*rhogsol*w2i**2*w3i**2 + Kdrag*w2r**3*rhogsol*w1i**2*w3i*w3r**2 -& w1r**3*w3i**3*rhogeq*rhogsol*w2i**3 - 4*w3r**3*w2i*rhogeq**2*k*vgsol*w2r**2*w1i*w1r -& w3i**3*rhogsol*k**4*cs**4*rhogeq*w2r*w1i + rhogeq*cs**2*k**2*w1i**2*w2r*rhogsol*w3i**4 -& w2r**3*k*Kdrag**2*vgsol*w1r*w3r**2 - 2*w1i**2*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w3i**2 -& 2*rhogeq**2*w1i**2*w2r**2*k*vgsol*w2i*w3i**3 - w2r**2*k*Kdrag**2*vdsol*w3i**3*w1i +& w2i**2*k*Kdrag**2*vdsol*w2r*w1r*w3i**2 + w1i**4*w2r*rhogeq*rhogsol*k**2*cs**2*w3i**2 +& w2r**2*k*Kdrag**2*vgsol*w3i**3*w1i + w2i**2*k*Kdrag**2*vdsol*w2r*w1r*w3r**2 -& 2*rhogeq**2*w1i**2*w2r**2*k*vgsol*w2i*w3i*w3r**2 + w2r**3*k*Kdrag**2*vdsol*w1r*w3i**2 -& w1r**2*vdsol*Kdrag*k*rhogeq*w2i**3*w3i**2 - w1r**2*vdsol*Kdrag*k*rhogeq*w2i**3*w3r**2 +& w2r**3*k*Kdrag**2*vdsol*w1r*w3r**2 - Kdrag*w2r**2*rhogsol*k**2*cs**2*w2i*w1r*w3i**2 -& w1r**2*Kdrag*k*rhogeq*vgsol*w1i*w2i**2*w3i**2 - w2i**2*k*Kdrag**2*vgsol*w2r*w1r*w3i**2 -& w2i**2*k*Kdrag**2*vgsol*w2r*w1r*w3r**2 - w1r**2*Kdrag*k*rhogeq*vgsol*w1i*w2i**2*w3r**2 -& Kdrag*w2r**2*rhogsol*k**2*cs**2*w2i*w1r*w3r**2 + w2i**2*k*Kdrag**2*vgsol*w3i**3*w1i +& 2*w3r*w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w1r**2 - w2i**2*k*Kdrag**2*vdsol*w3i**3*w1i +& w2i**2*k*Kdrag**2*vdsol*w3r**3*w1r - 2*w3r**3*w2r*cs**2*k**2*rhogeq*rhogsol*w1r**3 +& 2*w3r**3*w2r*Kdrag*rhogsol*w1i*w2i**2*w1r - w3i**4*rhogeq**2*cs**2*k**3*vgsol*w2i**2 -& Kdrag*w2i**2*k*rhogeq*vgsol*w2r*w3i**3*w1r + 2*Kdrag*w2i*vgsol*k*rhogeq*w1r**2*w2r**2*w3i**2 +& w3r**3*rhogeq*w2i*rhogsol*w1i*w2r**2*w1r**2 - 2*w3r**3*w2r*rhogeq*w1i**2*rhogsol*k**2*cs**2*w1r +& 2*Kdrag*w2i*vgsol*k*rhogeq*w1r**2*w2r**2*w3r**2 - Kdrag*w2r**3*k*rhogeq*vgsol*w3i*w1r*w3r**2 -& 2*rhogeq**2*w2r**2*w3i**4*k*vgsol*w2i**2 - Kdrag*w2i**2*rhogsol*w1i*w2r*w3i**4 -& rhogeq*w1i**2*w2i**2*rhogsol*w2r*w3i**4 - Kdrag*w2r**3*rhogsol*w3i*w1r**2*w3r**2) !--break to avoid too many continuation lines rhod1r = rhod1r + (& Kdrag*w2r**2*k*rhogeq*vgsol*w2i*w3i**3*w1i - 2*rhogeq*w1i**2*w2r**3*rhogsol*w3i**2*w3r**2 -& w2r**2*k*Kdrag**2*vdsol*w3i*w1i*w3r**2 + Kdrag*w2r**2*rhogsol*w2i*w1r*w3i**4 +& w2r**2*k*Kdrag**2*vgsol*w3i*w1i*w3r**2 - w2r**3*k*Kdrag**2*vgsol*w1r*w3i**2 +& 4*w3i**3*cs**2*k**2*rhogeq*rhogsol*w2i*w2r*w1i**2 + Kdrag*k*rhogeq*vgsol*w2r**2*w1i*w3i**4 +& 2*w3r**3*cs**2*k**3*rhogeq**2*w2r*vgsol*w2i*w1i + w3r**3*rhogeq*w2i*rhogsol*w1i**3*w2r**2 +& 2*w3r**3*Kdrag*rhogsol*w2r**3*w1i*w1r - Kdrag**2*k*vdsol*w2i*w1i*w2r**2*w3r**2 +& w3r**3*rhogeq**2*k*w1r**3*vgsol*w2r**2 + w3r*rhogeq*cs**2*k**2*w1r**4*rhogsol*w2i**2 +& Kdrag**2*k*vgsol*w2i*w1i*w2r**2*w3i**2 - 2*cs**2*k**3*rhogeq**2*vgsol*w2r*w1r*w2i**2*w3r**2 +& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w1r**3 + w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i*w1i*w1r**2 -& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w1r**3 + Kdrag**2*k*vgsol*w2i*w1i*w2r**2*w3r**2 +& w3r**3*rhogeq**2*k*w1r*vgsol*w2r**2*w1i**2 + rhogeq*w2r**3*w3i**3*w1r*k*Kdrag*vdsol +& 2*rhogsol*k**4*cs**4*rhogeq*w2r*w2i*w3i**3 + 2*rhogsol*k**4*cs**4*rhogeq*w2r*w2i*w3i*w3r**2 -& w2i**2*k*Kdrag**2*vgsol*w3r**3*w1r - Kdrag*w2r**2*rhogsol*k**2*cs**2*w3i*w1r*w3r**2 +& rhogeq**2*w1i*w2r**2*k*vgsol*w2i*w3i**4 - Kdrag*w2r**2*rhogsol*k**2*cs**2*w3i**3*w1r -& Kdrag*w2r**3*k*rhogeq*vgsol*w3i**3*w1r - w3i**4*vgsol*k*rhogeq*Kdrag*w2i**3 +& w3i*vdsol*k*Kdrag**2*w2i**3*w3r**2 - w3i*vgsol*k*Kdrag**2*w2i**3*w3r**2 +& 2*w2i**3*w1i*w3r*rhogeq**2*cs**2*k**3*w1r*vgsol + w3r**4*rhogeq**2*vgsol*k*w2i**3*w1i -& w3r*Kdrag*rhogsol*w2i**4*w1i*w3i**2 - Kdrag*rhogsol*k**2*cs**2*w1i*w2r*w2i**2*w3i**2 -& w2i**2*k*Kdrag**2*vgsol*w3r*w1r*w3i**2 - Kdrag*rhogsol*k**2*cs**2*w3i**3*w1r*w2i**2 -& Kdrag*rhogsol*k**2*cs**2*w1i*w2r*w2i**2*w3r**2 + rhogeq*w2r**3*w3i*w1r*k*Kdrag*vdsol*w3r**2 -& w3r**4*vgsol*k*rhogeq*Kdrag*w2i**3 + w2i**2*k*Kdrag**2*vgsol*w3i*w1i*w3r**2 +& 2*w3r*rhogeq*cs**2*k**2*w1i**2*rhogsol*w2i**2*w1r**2 - w2i**2*k*Kdrag**2*vdsol*w3i*w1i*w3r**2 +& w1i**3*rhogeq**2*cs**2*k**3*w3i*vgsol*w2r**2 + w2i**2*k*Kdrag**2*vdsol*w3r*w1r*w3i**2 -& 2*w3i**2*rhogeq**2*cs**2*k**3*vgsol*w2i**2*w3r**2 + 4*w3r**3*w2i*cs**2*k**2*rhogeq*rhogsol*w2r*w1i*w1r +& Kdrag*w2i**2*vgsol*k*rhogeq*w1i*w3r**4 + w3r**3*rhogeq*rhogsol*w2r*w2i**2*w1i**2*w1r -& 2*Kdrag*w2r**2*k*rhogeq*vgsol*w2i**2*w3i**3 + w2r*rhogeq**2*vgsol*k*w2i**2*w1r*w3i**4 -& Kdrag**2*k*vdsol*w2i*w1i*w2r**2*w3i**2 - 2*w2i**3*w1i**3*w3r*rhogeq*cs**2*k**2*rhogsol +& w3r**3*vdsol*Kdrag*k*rhogeq*w2i**3*w1r + 2*cs**2*k**3*rhogeq**2*vgsol*w2i**3*w1i*w3i**2 +& 2*w3i**2*Kdrag*rhogsol*w2i**3*w1r*w3r**2 - Kdrag*rhogsol*k**2*cs**2*w3i*w1r*w2i**2*w3r**2 +& 2*Kdrag*w2i**2*vgsol*k*rhogeq*w1i*w3r**2*w3i**2 - w3r*rhogeq*cs**4*k**4*rhogsol*w2i*w1i*w1r**2 -& w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w1r**3 + 2*w3r**2*rhogeq**2*vgsol*k*w2i**3*w1i*w3i**2 -& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i*w1i*w1r**2 + w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1r**4 -& 2*Kdrag*w2r**2*k*rhogeq*vgsol*w2i**2*w3i*w3r**2 - cs**2*k**3*rhogeq*vgsol*Kdrag*w2i**3*w3i**2 +& 2*w3r**2*rhogeq*rhogsol*w2i**4*w1r*w3i**2 + 2*Kdrag*k*rhogeq*vgsol*w2r**2*w1i*w2i**2*w3i**2 +& 2*Kdrag*k*rhogeq*vgsol*w2r**2*w1i*w2i**2*w3r**2 + w3r**3*rhogsol*k**2*cs**2*Kdrag*w2i**3 +& w3i*Kdrag*rhogsol*w2i**4*w1r*w3r**2 + cs**2*k**3*rhogeq*vgsol*Kdrag*w2i**3*w3r**2 +& w1r**2*w3r**3*rhogeq*rhogsol*w2i**3*w1i + 2*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**2*w1r**2 -& 2*w3r**2*vgsol*k*rhogeq*Kdrag*w2i**3*w3i**2 + w3r**4*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i +& w1r**2*vgsol*k*rhogeq**2*w2i**3*w1i*w3r**2 + w1r**2*vgsol*k*rhogeq**2*w2i**3*w1i*w3i**2) !--break to avoid too many continuation lines rhod1r = rhod1r + (& w1r**2*w3r*rhogeq*rhogsol*w2i**3*w1i*w3i**2 - 2*w2i*Kdrag*rhogsol*w2r**2*w1r*w3i**3*w1i +& rhogeq*rhogsol*w2r*w2i**2*w1r**2*w3i**3*w1i + w3r*rhogeq**2*k*vgsol*w2i**4*w1r*w3i**2 -& 2*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i**2*w1r + 2*w3r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i**2*w1r +& w3r**3*rhogeq**2*k*vgsol*w2i**4*w1r + cs**2*k**3*rhogeq*vdsol*Kdrag*w2i**3*w3i**2 -& cs**2*k**3*rhogeq*vdsol*Kdrag*w2i**3*w3r**2 - w3i**3*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**2 -& w3r*vgsol*k*rhogeq*Kdrag*w2i**3*w1r*w3i**2 + w3i*vgsol*k*rhogeq*Kdrag*w2i**3*w1i*w3r**2 -& w3i**3*cs**2*k**3*rhogeq**2*vgsol*w2i**3 + w3i**3*cs**2*k**3*rhogeq**2*vgsol*w2i*w1r**2 -& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**3*w3r**2 + w3r*vdsol*Kdrag*k*rhogeq*w2i**3*w1r*w3i**2 -& 2*w2i**3*w1i*w3i**3*Kdrag*rhogsol*w1r + w3r*rhogeq*cs**2*k**2*w1i**4*rhogsol*w2i**2 -& 2*w2i**3*w1i*w3r*rhogeq*cs**2*k**2*w1r**2*rhogsol - 2*w2i**2*w1i**2*w3i*cs**2*k**3*rhogeq*Kdrag*vgsol +& 2*w2i**2*w1i**2*w3i*cs**2*k**3*rhogeq*Kdrag*vdsol + 2*w3i**3*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w1i +& 2*w2i**2*w1i**2*w3r*rhogeq*cs**4*k**4*rhogsol - w3i**3*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i*w1i +& w3r*rhogsol*k**2*cs**2*Kdrag*w2i**3*w3i**2 - w3r**3*vgsol*k*rhogeq*Kdrag*w2i**3*w1r +& 2*w3r**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i*w3i**2 + w3i**3*vgsol*k*rhogeq*Kdrag*w2i**3*w1i +& 2*w2i*w1i**2*w3r*w3i*cs**4*k**4*rhogeq*rhogsol + w3i**3*rhogeq**2*k*vgsol*w2i**4*w1i -& 2*w2i**3*w1i*w3i*w3r**2*Kdrag*rhogsol*w1r + w3r**3*rhogeq*w1i**2*w2r**3*rhogsol*w1r +& w3r**3*rhogeq*rhogsol*w2r*w2i**2*w1r**3 + rhogeq*rhogsol*k**2*cs**2*w2i**4*w1r*w3i**2 -& rhogeq*rhogsol*k**2*cs**2*w2i**4*w1r*w3r**2 + w3i*vdsol*Kdrag*k*rhogeq*w2i**3*w1i*w3r**2 -& w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w1r*w1i**2 + w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i*w1i**3 +& w3i**3*vdsol*Kdrag*k*rhogeq*w2i**3*w1i + w3r*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w1r*w1i**2 -& 2*w3r**2*rhogeq**2*vgsol*k*w2i**4*w3i**2 - w3r*rhogeq*cs**4*k**4*rhogsol*w2i*w1i**3 -& w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w1r*w1i**2 + w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**4 -& w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i*w1i**3 - w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1i**2*w3r**2 +& w3i*cs**2*k**3*rhogeq**2*vgsol*w2i*w1r**2*w3r**2 + 2*w3i*cs**2*k**3*rhogeq**2*vgsol*w2i**2*w1i*w3r**2 +& 2*w3i*rhogsol*k**4*cs**4*rhogeq*w1i*w2i**2*w1r + 2*w3i*rhogeq**2*k*vgsol*w2i**3*w1r**2*w3r**2 -& 2*w3i*rhogeq**2*k*vgsol*w2i**3*w1i**2*w3r**2 - 2*w3r*rhogeq*cs**2*k**2*w1r**2*rhogsol*w2i**2*w3i**2 +& w3i*rhogeq**2*k*vgsol*w2i**4*w1i*w3r**2 + w3i**4*rhogeq**2*vgsol*k*w2i**3*w1i +& 2*w3i**3*rhogeq**2*k*vgsol*w2i**3*w1r**2 - 2*w3i**3*rhogeq**2*k*vgsol*w2i**3*w1i**2 -& w3i*cs**4*k**4*rhogeq*rhogsol*w2i*w1r*w3r**2 - w3r**4*rhogeq**2*cs**2*k**3*vgsol*w2i**2 -& w3r*Kdrag*rhogsol*k**2*cs**2*w1i*w2i**2*w3i**2 + w3r**3*rhogeq*cs**4*k**4*rhogsol*w2i**2 -& w3r*rhogeq*rhogsol*w2i**4*w1r**2*w3i**2 + rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i**2*w3r**2 -& rhogeq*cs**4*k**4*w1r*rhogsol*w2i**2*w3i**2 - rhogeq*cs**4*k**4*w1r*rhogsol*w2i**2*w3r**2 -& w3r**3*rhogeq*cs**4*k**4*rhogsol*w2i*w1i + 3*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i**2*w3i**2 +& 2*w2i*w1i*rhogeq*cs**4*k**4*w1r*rhogsol*w3i**2 + 2*w2i*w1i*rhogeq*cs**4*k**4*w1r*rhogsol*w3r**2 -& 2*w2i**3*w1i*rhogeq*cs**2*k**2*w1r*rhogsol*w3i**2 + 2*w2i**3*w1i*rhogeq*cs**2*k**2*w1r*rhogsol*w3r**2 -& rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w2i**2*w3r**2 + w3i*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i**2*w3r**2 -& w3i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i**2*w3r**2 - w3i**3*cs**4*k**4*rhogeq*rhogsol*w2i*w1r -& w3r**3*Kdrag*rhogsol*k**2*cs**2*w1i*w2i**2 - w3r*rhogeq*cs**4*k**4*rhogsol*w2i*w1i*w3i**2) !--break to avoid too many continuation lines rhod1r = rhod1r + (& w3r*rhogeq*cs**4*k**4*rhogsol*w2i**2*w3i**2 - 2*w3r**2*rhogeq**2*w1i**2*k*vgsol*w2r**2*w1r**2 +& w3r**2*w1r**3*rhogeq**2*w2r**3*k*vgsol - 2*w3r**3*rhogeq*cs**2*k**2*w1r**2*rhogsol*w2i**2 -& w3r**2*w3i*rhogeq*rhogsol*w2i*w1r*w2r**2*w1i**2 - w3r**2*w3i*rhogeq*k*Kdrag*vdsol*w2r**2*w1i**2 -& w3r*rhogeq*rhogsol*w2i**4*w1i**2*w3i**2 - 4*w3r**2*rhogeq**2*k*vgsol*w2r*w2i**2*w1r*w3i*w1i -& 4*w3r**2*w2r*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i*w1r - w2i**2*k*Kdrag**2*vdsol*w1r**2*w3r**2 +& w2i**2*k*Kdrag**2*vgsol*w1r**2*w3i**2 + w2i**2*k*Kdrag**2*vgsol*w1r**2*w3r**2 -& 4*vgsol*k*rhogeq**2*w2i**3*w1i*w3i**2*w3r*w1r - 4*vgsol*k*rhogeq**2*w2i**3*w1i*w3r**3*w1r -& 2*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w2i**2*w3r**2 + 2*w2i**2*w1i*Kdrag*rhogsol*k**2*cs**2*w1r*w3r**2 +& 2*w2i**2*w1i*Kdrag*rhogsol*k**2*cs**2*w1r*w3i**2 + w2i**2*w1i**2*Kdrag**2*k*vdsol*w3r**2 -& 3*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w2i**2*w3i**2 + 2*rhogeq**2*cs**2*k**3*w1r**2*vgsol*w2i**2*w3r**2 +& w3i**3*cs**2*k**3*rhogeq*Kdrag*vdsol*w2i**2 - w2i**2*w1i**2*Kdrag**2*k*vgsol*w3r**2 +& w2i**2*w1i**2*Kdrag**2*k*vdsol*w3i**2 - w2i**2*w1i**2*Kdrag**2*k*vgsol*w3i**2 -& w3i**3*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i**2 + w3i**4*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i +& w3i**3*cs**2*k**3*rhogeq*Kdrag*vgsol*w2i*w1i - w3r**3*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w1r +& w3r**3*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w1r - w2i**2*k*Kdrag**2*vdsol*w1r**2*w3i**2 +& 2*Kdrag*w2i**2*k*rhogeq*vgsol*w3i*w1r**2*w3r**2 + 2*w1r**2*rhogeq*cs**2*k**3*w2i*Kdrag*vgsol*w3r**2 -& w1r**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i*w3i**2 + w1r**2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i*w3r**2 +& 2*Kdrag*w2i**2*k*rhogeq*vgsol*w3i**3*w1r**2 - 2*w1r**2*rhogeq**2*w1i**2*k*vgsol*w2i**2*w3i**2 -& 2*w1r**2*rhogeq**2*w1i**2*k*vgsol*w2i**2*w3r**2 + Kdrag*w2i**2*k*rhogeq*vgsol*w3i**4*w1i -& w1i**2*vdsol*Kdrag*k*rhogeq*w2i**3*w3i**2 - w1i**2*vdsol*Kdrag*k*rhogeq*w2i**3*w3r**2 +& w1i**3*vdsol*Kdrag*k*rhogeq*w2i**2*w3r**2 + w1i**3*vdsol*Kdrag*k*rhogeq*w2i**2*w3i**2 -& w1i**2*w3i**3*rhogeq*rhogsol*w2i**3*w1r - w1i**2*w3i*rhogeq*rhogsol*w2i**3*w1r*w3r**2 -& Kdrag**2*k*vdsol*w2r**2*w1r**2*w3i**2 + 2*w1i**2*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w3i**2 +& 2*w1i**2*rhogeq*cs**2*k**2*w1r*rhogsol*w2i**2*w3i**2 - 2*rhogeq**2*cs**2*k**3*vgsol*w2i*w1i*w3r**3*w1r -& 2*rhogeq*cs**2*k**2*w1r*rhogsol*w2i**2*w3i**3*w1i + Kdrag**2*k*vgsol*w2r**2*w1r**2*w3i**2 -& 2*rhogeq*cs**2*k**2*w1r*rhogsol*w2i**2*w3r**2*w3i*w1i + w1i**3*vgsol*k*rhogeq**2*w2i**3*w3r**2 +& w1i**3*vgsol*k*rhogeq**2*w2i**3*w3i**2 - 2*rhogeq**2*w1i**2*k*vgsol*w3i**2*w2r**2*w1r**2 +& 2*Kdrag*rhogsol*k**2*cs**2*w1i*w2r**2*w3i**2*w1r + 2*w3r**2*Kdrag*rhogsol*k**2*cs**2*w1i*w2r**2*w1r -& 2*w3r**2*rhogeq*cs**2*k**2*w2r**2*w1r**3*rhogsol + w1i**3*w3r*rhogeq*rhogsol*w2i**3*w3i**2 +& w3r**2*w1r**3*w2r*rhogeq**2*cs**2*k**3*vgsol - w1r**4*rhogeq**2*k*vgsol*w2i**2*w3i**2 -& w1r**4*rhogeq**2*k*vgsol*w2i**2*w3r**2 - w1i**4*rhogeq**2*k*vgsol*w2i**2*w3r**2 -& w1i**4*rhogeq**2*k*vgsol*w2i**2*w3i**2 + w1r**2*vdsol*Kdrag*k*rhogeq*w2i**2*w1i*w3r**2 -& w1r**3*w3i*rhogeq*rhogsol*w2i**3*w3r**2 + w1r**2*vdsol*Kdrag*k*rhogeq*w2i**2*w1i*w3i**2 -& 2*w1r**2*rhogeq*cs**2*k**3*w2i*Kdrag*vdsol*w3r**2 - w3r**2*w2i*rhogeq*k*Kdrag*vdsol*w2r**2*w1r**2 -& w3r**2*rhogeq**2*w1r**4*k*vgsol*w2r**2 + w3r**2*w1r**4*w2r*cs**2*k**2*rhogeq*rhogsol -& w1i**3*Kdrag*k*rhogeq*vgsol*w2i**2*w3r**2 - w1i**3*Kdrag*k*rhogeq*vgsol*w2i**2*w3i**2) !--break to avoid too many continuation lines rhod1r = rhod1r + (& rhogeq**2*w3i**3*w1i*k*vgsol*w2r**2*w1r**2 + w3r**2*rhogeq*w1i*k*Kdrag*vdsol*w2r**2*w1r**2 +& w3r**2*rhogeq*rhogsol*w2r*w2i**2*w1r**2*w3i*w1i + w3r**2*w1i**2*rhogeq**2*k*vgsol*w2r*w2i**2*w1r -& 4*w3r**2*rhogeq**2*w2r**3*k*w1r*vgsol*w3i*w1i - 2*w3r**2*w1r**2*w2i*cs**2*k**2*rhogeq*rhogsol*w2r*w1i +& w3r**2*rhogeq*w1i**3*k*Kdrag*vdsol*w2r**2 + w3r**2*rhogeq*rhogsol*w2r*w2i**2*w1i**3*w3i -& w3r**2*rhogeq**2*w1i**4*k*vgsol*w2r**2 - w3r**2*Kdrag**2*k*vgsol*w2r**2*w1i**2 +& w3r**2*Kdrag**2*k*vdsol*w2r**2*w1i**2 - 2*w3r**2*w1i**3*w2i*cs**2*k**2*rhogeq*rhogsol*w2r +& w3r**2*w1i**3*w2i*rhogeq**2*k*vgsol*w2r**2 + w3r**2*rhogeq*w2r**3*w1r**2*rhogsol*w3i*w1i +& 2*w3r**2*rhogeq*rhogsol*k**2*cs**2*w2r**2*w1r*w3i*w1i - 2*w3r**2*w2r*cs**2*k**2*rhogeq*rhogsol*w1r**2*w3i*w1i +& w3r**2*w1i**2*rhogeq**2*w2r**3*k*w1r*vgsol - 2*w3r**2*w2r*rhogeq*w1i**3*rhogsol*k**2*cs**2*w3i -& 2*w3r**2*w2i*Kdrag*rhogsol*w2r**2*w1r*w3i*w1i - 2*w3r**2*w2r*Kdrag*rhogeq*k*vgsol*w2i**2*w1i*w1r -& 2*w3r**2*Kdrag*k*rhogeq*vgsol*w2r**3*w1i*w1r - w3r**2*w3i*rhogeq*rhogsol*w2i*w1r**3*w2r**2 -& w3r**2*w1i**3*rhogeq*w2r**2*k*Kdrag*vgsol + 2*w3r**2*w2r*rhogeq**2*cs**2*k**3*w1r*vgsol*w3i*w1i -& 2*w3r**2*w2r*rhogeq*cs**2*k**3*w1i*Kdrag*vdsol*w1r + 2*w3r**2*w2r*rhogeq*cs**2*k**3*w1i*Kdrag*vgsol*w1r +& w3r**2*w1r**3*rhogeq**2*k*vgsol*w2r*w2i**2 - 2*w3r**2*w2r*rhogeq*cs**4*k**4*w1r**2*rhogsol +& w1i**3*rhogeq**2*cs**2*k**3*vgsol*w2i*w3r**2 - w1i**3*rhogeq**2*cs**2*k**3*vgsol*w2i*w3i**2 -& w3r**2*w1r**2*rhogeq*w2r**2*w1i*k*Kdrag*vgsol + rhogeq*w1i**3*w3i**2*k*Kdrag*vdsol*w2r**2 +& w3r**2*w1r**2*w2i*rhogeq**2*k*vgsol*w2r**2*w1i + w2i**2*w1r**3*w3r**3*rhogeq**2*k*vgsol +& w3r**2*Kdrag**2*k*vgsol*w2r**2*w1r**2 - w3r**2*Kdrag**2*k*vdsol*w2r**2*w1r**2 +& w3r**2*w1i**4*w2r*rhogeq*rhogsol*k**2*cs**2 - rhogeq*w3i**3*k*Kdrag*vdsol*w2r**2*w1r**2 -& w2i**2*rhogeq**2*cs**2*k**3*w3i*w1i**3*vgsol + w3r**2*rhogeq*w1i**3*w2r**3*rhogsol*w3i -& w2i**2*w3r*rhogeq**2*cs**2*k**3*w1i**2*vgsol*w1r + 2*w3r**2*w2i*rhogeq*cs**2*k**2*rhogsol*w2r**2*w1i*w1r +& w3r**2*w3i*rhogeq**2*k*vgsol*w1i*w2r**2*w1r**2 - w3r**2*w3i*rhogeq*k*Kdrag*vdsol*w2r**2*w1r**2 -& w2i**2*w3r*rhogeq**2*cs**2*k**3*w1r**3*vgsol - w3r**2*w2i*w1i**2*rhogeq*k*Kdrag*vdsol*w2r**2 -& w2i**2*rhogeq**2*cs**2*k**3*w3i*w1i*vgsol*w1r**2 - 2*w2i**2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w1i*w1r**2 -& 2*w2i**2*Kdrag*k*rhogeq*vgsol*w1i*w3r**3*w1r - 2*w2i**2*w3r*w3i*cs**2*k**2*rhogeq*rhogsol*w1i**3 -& w2i**2*w1r**2*w3i*vdsol*Kdrag*k*rhogeq*w3r**2 - 2*w3r**2*w1i**2*rhogeq*rhogsol*k**2*cs**2*w2r**2*w1r +& w3r**2*w3i*rhogeq**2*k*vgsol*w1i**3*w2r**2 - 2*w3r**2*w2r*rhogeq**2*cs**2*k**3*w1r*vgsol*w2i*w3i +& 2*w3r**2*w1i**2*w2r*cs**2*k**2*rhogeq*rhogsol*w1r**2 + w3r**2*w1i**2*w2r*rhogeq**2*cs**2*k**3*w1r*vgsol +& w2i**2*w1i**3*rhogeq**2*w3i**3*k*vgsol + w2i**2*w1i**2*w3r*rhogeq**2*k*w1r*vgsol*w3i**2 +& w2i**2*w1i**3*rhogeq**2*w3i*k*vgsol*w3r**2 + w2i**2*w1i**2*w3r**3*rhogeq**2*k*w1r*vgsol -& w2i**2*w1r**2*w3i**3*vdsol*Kdrag*k*rhogeq - 2*w2i**2*Kdrag*k*rhogeq*vgsol*w1i*w3i**2*w3r*w1r -& w2i**2*w1i**2*w3i**3*vdsol*Kdrag*k*rhogeq - w2i**2*w1i**2*w3i*vdsol*Kdrag*k*rhogeq*w3r**2 +& w2i**2*w1r**3*w3r*rhogeq**2*k*vgsol*w3i**2 + w2i**2*w1r**2*rhogeq**2*w3i**3*w1i*k*vgsol +& w2i**2*w1r**2*rhogeq**2*w3i*w1i*k*vgsol*w3r**2 - 4*w3r*w2i*cs**2*k**3*rhogeq*Kdrag*vgsol*w2r*w3i*w1i +& w3r*w1r**4*rhogeq*cs**2*k**2*w2r**2*rhogsol + rhogeq*w1i**3*w2r**3*rhogsol*w3i**3) rhod1r = rhod1r*rhodeq/(w1i**2 - 2*w3i*w1i +& w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r)/(w3r**2 + w3i**2)/Kdrag/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i - 2*w2r*w1r& + w1i**2)/rhogeq/(w2i**2 + w2r**2) rhod1i = - ( - 2*rhogsol*Kdrag*w1i**3*rhodeq*w3r**2*w2i**3 - 2*rhodsol*rhogeq*Kdrag*w3i**4*w2i**2*w2r**2 -& rhodsol*rhogeq*Kdrag*w2r**4*w3i**4 - rhodsol*rhogeq*Kdrag*w3i**4*w2i**4 -& 2*rhogsol*Kdrag*w1i**3*rhodeq*w3r**2*w2i*w2r**2 - 2*rhodsol*rhogeq*Kdrag*w2r**4*w3i**2*w3r**2 -& 2*rhogsol*Kdrag*w1i**3*rhodeq*w3r**2*w2r**2*w3i - 2*rhogsol*Kdrag*w1i**3*rhodeq*w3r**2*w2i**2*w3i -& 2*rhogsol*Kdrag*w1i**3*rhodeq*w2r**2*w3i**3 - 2*rhogsol*Kdrag*w1i**3*rhodeq*w2i**2*w3i**3 -& 2*rhogsol*Kdrag*w1i**3*rhodeq*w2i**3*w3i**2 - rhodsol*rhogeq*Kdrag*w3r**4*w2i**4 -& rhodsol*rhogeq*Kdrag*w3r**4*w2r**4 - 2*rhodsol*rhogeq*Kdrag*w3r**4*w2i**2*w2r**2 -& 4*rhodsol*rhogeq*Kdrag*w3r**2*w2i**2*w2r**2*w3i**2 - 2*rhodsol*rhogeq*Kdrag*w3i**2*w2i**4*w3r**2 -& 2*rhogsol*Kdrag*w1i**3*rhodeq*w2i*w2r**2*w3i**2 + rhogsol*rhogeq*k**4*cs**4*w1i**3*rhodeq*w3r*w2r -& rhogsol*rhogeq*k**4*cs**4*w1i**3*rhodeq*w2i*w3i + w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r**2*w2i**2 -& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r*w3r*w3i**2 -& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r*w2r*w2i**2 - w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r*w2r**3 -& w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**2*w2i**4 - w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**4*w2i**2 +& w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**4*w2r**2 - vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w3r*w2i**3 +& w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**2*w2i**4 - w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w2r**4*w3i**2 -& 2*w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**2*w2i**2*w2r**2 -& vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w3r**3*w2i - w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**4*w2i**2 +& w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**2*w2r**4 - 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w2r**2*w3i**3 +& cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3i**4*w2i +& 2*w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**2*w2i**2*w2r**2 -& 2*w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**2*w2i**2*w3i**2 +& w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**4*w2r**2 + rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w3r*w2i**2*w3i**2 +& rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w3r*w2r**2*w3i**2 + rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w2r*w2i**2*w3i**2 +& rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w2r**3*w3r**2 + rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w2r*w2i**2*w3r**2 +& rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w2r**3*w3i**2 + rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w3r**3*w2i**2 +& rhogeq*k*Kdrag*vdsol*w1i**2*rhodeq*w3r**3*w2r**2 + 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w2i**2*w3i**3 +& 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w2i*w2r**2*w3i**2 +& cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3i*w2i**4 + 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w2i**3*w3i**2 +& 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3i*w2r**2*w2i**2 +& cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3i*w2r**4 +& 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3i**2*w2i*w3r**2 +& 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3r**2*w2i**2*w3i -& 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3r**2*w2r**2*w3i -& 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3r**2*w2i*w2r**2 -& 2*cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3r**2*w2i**3 -& 2*w1i*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w2i**3*w3i -& 2*w1i*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**2*w2i**2 -& 2*w1i*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i*w2i*w3r**2 -& 2*w1i*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w2i*w3i*w2r**2 +& 2*w1i*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**2*w2r**2 -& 2*w1i*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**3*w2i) !--break to avoid too many continuation lines rhod1i = rhod1i - (& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r**2*w3i**2 + cs**2*k**2*rhogsol*w1i**2*rhogeq*rhodeq*w3r**4*w2i +& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i**3*w3i + w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3i**2*w2i**2 +& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3i**3*w2i + w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i*w3i*w2r**2 -& 3*w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r**2*w2r**2 +& 4*w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r*w2r*w2i*w3i -& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r*w3r**3 + w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3i*w2i*w3r**2 +& 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w3r*w2r**2*w2i*w3i**2 + w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w3r**2*w2r**2*w3i +& w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w3r**2*w2i**2*w3i + w1r**2*rhogsol*rhogeq*rhodeq*w2r**4*w3i**3 -& 2*rhogsol*rhogeq*k**2*cs**2*w1r*rhodeq*w2r*w3i**4*w2i + 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w3r**3*w2i*w2r**2 +& 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w3i*w2i**2*w3r**2*w2r + 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w3i*w2r**3*w3r**2 +& 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w3r*w2i**3*w3i**2 - 4*vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w2r*w2i*w3i**2 -& vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w2r*w3i**3 - 2*rhogsol*rhogeq*k**2*cs**2*w1r*rhodeq*w2r*w2i*w3r**4 -& 4*rhogsol*rhogeq*k**2*cs**2*w1r*rhodeq*w2r*w2i*w3i**2*w3r**2 -& 2*rhogsol*rhogeq*k**2*cs**2*w1r*rhodeq*w3i*w3r*w2i**4 - 2*rhogsol*rhogeq*k**2*cs**2*w1r*rhodeq*w2r**4*w3i*w3r -& 4*rhogsol*rhogeq*k**2*cs**2*w1r*rhodeq*w3r*w3i*w2r**2*w2i**2 + 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w2i**3*w3r**3 -& vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w2r*w3i*w3r**2 -& vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w3r*w2i*w3i**2 -& vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w3r*w2i*w2r**2 -& 4*vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w3i*w3r*w2i**2 - vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w2r**3*w3i& - vgsol*Kdrag*w1i*k**3*cs**2*rhogeq*rhodeq*w2r*w3i*w2i**2 +& w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w2i*w2r**2*w3i**2 + 4*w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r*w2i*w3r**2 +& w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r*w3i*w3r**2 + w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w3r*w2i*w3i**2 +& w1r**2*rhogsol*rhogeq*rhodeq*w2r**2*w2i*w3r**4 + w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w2r**2*w3i**3 +& w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w2i**2*w3i**3 + w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w3r**2*w2i*w2r**2 +& w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w3r**2*w2i**3 + 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3i**3 +& 2*w1r*w1i*rhogsol*Kdrag*rhodeq*w3i**3*w2r**3 - 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2r**3*w3r**2 -& 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2r*w2i**2*w3r**2 + w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r**3*w3i& + w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r*w3i*w2i**2 + w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r*w3i**3 +& vgsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w3r**2*w2i**2 + w1r*vgsol*k*w1i**2*rhogeq**2*rhodeq*w2i**3*w3i**2 +& w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w3r**3*w2i + w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w3r*w2i**3 +& w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w3r*w2i*w2r**2 + vgsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w3r**2*w2r**2 +& vgsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w3i**2*w2i**2 + vgsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w2r**2*w3i**2 +& 2*w1i*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**2*w2r**2*w3i**2 -& 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w3r**3*w2r**2 +& 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w3r**3*w2i**2 +& 4*w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w3i*w3r*w2r**2 -& 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w3r*w2r**2*w3i**2) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w3r*w2i**2*w3i**2 +& 4*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2r*w2i*w3r**2*w3i +& 4*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2i*w3i*w3r*w2r**2 +& 4*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2i**3*w3i*w3r - 2*w1r*vdsol*Kdrag**2*k*w1i*rhodeq*w3r**2*w2r**2 -& 2*w1r*vdsol*Kdrag**2*k*w1i*rhodeq*w3i**2*w2i**2 - 2*w1r*vdsol*Kdrag**2*k*w1i*rhodeq*w2r**2*w3i**2 -& w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r**4*w2i + 4*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2r*w2i*w3i**3 +& 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2r*w2i**2*w3i**2 - 2*w1r*vdsol*Kdrag**2*k*w1i*rhodeq*w3r**2*w2i**2& - 2*w1r**3*rhogsol*Kdrag*rhodeq*w3r**3*w2r**2 - 2*w1r**3*rhogsol*Kdrag*rhodeq*w2r**3*w3i**2 +& w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r**3*w2i**2 - w1i**4*Kdrag*rhogeq*rhodsol*w2r**2*w3i**2 -& 2*w1r**3*rhogsol*Kdrag*rhodeq*w3r**3*w2i**2 - 2*w1r**3*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3r**2 +& w1r**2*rhogsol*Kdrag*rhodeq*w2i*w2r**2*w3i**3 + w1r**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i**3 +& w1r**2*rhogsol*Kdrag*rhodeq*w3i**4*w2r**2 - w1i**4*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2 -& w1i**4*Kdrag*rhogeq*rhodsol*w3r**2*w2r**2 - w1i**4*Kdrag*rhogeq*rhodsol*w3i**2*w2i**2 +& 2*w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**2*w3i**2 + 2*w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2r**2*w3i**2 +& 3*w1r**2*rhogsol*Kdrag*rhodeq*w3r*w2r**3*w3i**2 + w1r**2*rhogsol*Kdrag*rhodeq*w2r**4*w3i**2 +& w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2r**4 + w1r**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i*w3r**2 +& w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**4 + w1r**2*rhogsol*Kdrag*rhodeq*w2i*w3i*w2r**2*w3r**2 +& 3*w1r**2*rhogsol*Kdrag*rhodeq*w2r*w3r**3*w2i**2 + 2*w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**2*w2r**2 +& 3*w1r**2*rhogsol*Kdrag*rhodeq*w2r*w3r*w2i**2*w3i**2 + 2*w1r**2*rhogsol*Kdrag*rhodeq*w3i**2*w2i**2*w2r**2 +& w1r**2*rhogsol*Kdrag*rhodeq*w3i**2*w2i**4 + w1r**2*rhogsol*Kdrag*rhodeq*w3i**4*w2i**2 +& w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w3r*w2i**2*w3i**2 + w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w3r*w2r**2*w3i**2 +& w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w2r**3*w3i**2 + w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w2r*w2i**2*w3r**2 +& w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w2r*w2i**2*w3i**2 + w1r**2*rhogsol*Kdrag*rhodeq*w3r**4*w2i**2 +& w1r**2*rhogsol*Kdrag*rhodeq*w3r**4*w2r**2 + 3*w1r**2*rhogsol*Kdrag*rhodeq*w3r**3*w2r**3 -& 2*rhogsol*rhogeq*k**2*cs**2*w1i**3*rhodeq*w3i*w2i*w3r**2 - 2*rhogsol*rhogeq*k**2*cs**2*w1i**3*rhodeq*w3i**3*w2i& - 2*rhogsol*rhogeq*k**2*cs**2*w1i**3*rhodeq*w2i*w3i*w2r**2 -& 2*rhogsol*rhogeq*k**2*cs**2*w1i**3*rhodeq*w2i**3*w3i + 2*rhogsol*rhogeq*k**2*cs**2*w1i**3*rhodeq*w3r**2*w2r**2& - 2*rhogsol*rhogeq*k**2*cs**2*w1i**3*rhodeq*w3i**2*w2i**2 + w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w3r**3*w2i**2 +& w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w3r**3*w2r**2 + w1r**2*rhogeq*k*Kdrag*vdsol*rhodeq*w2r**3*w3r**2 +& rhogsol*rhogeq*w1i**3*rhodeq*w2r*w3r*w2i**2*w3i**2 - rhogsol*rhogeq*w1i**3*rhodeq*w2i*w2r**2*w3i**3 -& rhogsol*rhogeq*w1i**3*rhodeq*w2i**3*w3i**3 + w1i**4*rhogsol*Kdrag*rhodeq*w3r**2*w2i**2 +& rhogsol*rhogeq*w1i**3*rhodeq*w2r*w3r**3*w2i**2 - rhogsol*rhogeq*w1i**3*rhodeq*w2i**3*w3i*w3r**2 -& rhogsol*rhogeq*w1i**3*rhodeq*w2i*w3i*w2r**2*w3r**2 + rhogsol*rhogeq*w1i**3*rhodeq*w3r**3*w2r**3 +& rhogsol*rhogeq*w1i**3*rhodeq*w3r*w2r**3*w3i**2 + w1i**4*rhogsol*Kdrag*rhodeq*w3r**2*w2r**2 +& w1i**4*rhogsol*Kdrag*rhodeq*w3i**2*w2i**2 + w1i**4*rhogsol*Kdrag*rhodeq*w2r**2*w3i**2 +& w1r*Kdrag*rhogeq*k*vgsol*w1i**2*rhodeq*w3r**2*w2i**2 + w1r*Kdrag*rhogeq*k*vgsol*w1i**2*rhodeq*w3r**2*w2r**2 +& w1r*Kdrag*rhogeq*k*vgsol*w1i**2*rhodeq*w3i**2*w2i**2 + w1r*Kdrag*rhogeq*k*vgsol*w1i**2*rhodeq*w2r**2*w3i**2 +& w1i*vdsol*k*Kdrag**2*rhodeq*w3r**3*w2r**2 + w1i*vdsol*k*Kdrag**2*rhodeq*w2r**3*w3r**2 +& w1i*vdsol*k*Kdrag**2*rhodeq*w2r*w2i**2*w3r**2 + w1i*vdsol*k*Kdrag**2*rhodeq*w3r*w2i**2*w3i**2 +& w1i*vdsol*k*Kdrag**2*rhodeq*w3r*w2r**2*w3i**2 + w1i*vdsol*k*Kdrag**2*rhodeq*w2r**3*w3i**2) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & w1i*vdsol*k*Kdrag**2*rhodeq*w2r*w2i**2*w3i**2 + Kdrag*cs**2*k**2*rhogsol*w1i**2*rhodeq*w2r**2*w3i**2 -& rhogsol*w1r**3*rhogeq*rhodeq*w2r*w2i**2*w3i**3 - rhogsol*w1r**3*rhogeq*rhodeq*w3i**3*w2r**3 +& w1i*vdsol*k*Kdrag**2*rhodeq*w3r**3*w2i**2 - rhogsol*w1r**3*rhogeq*rhodeq*w3r*w2r**2*w2i*w3i**2 +& Kdrag*cs**2*k**2*rhogsol*w1i**2*rhodeq*w3r**2*w2i**2 + Kdrag*cs**2*k**2*rhogsol*w1i**2*rhodeq*w3r**2*w2r**2 +& Kdrag*cs**2*k**2*rhogsol*w1i**2*rhodeq*w3i**2*w2i**2 - w1i**2*Kdrag*rhogeq*rhodsol*w3i**4*w2i**2 -& w1i**2*Kdrag*rhogeq*rhodsol*w3i**4*w2r**2 - 4*w1i**2*Kdrag*rhogeq*rhodsol*w2i**3*w3i**3 -& rhogsol*w1r**3*rhogeq*rhodeq*w3r**3*w2i*w2r**2 - 2*w1i**2*Kdrag*rhogeq*rhodsol*w3r**2*w2r**2*w3i**2 -& w1i**2*Kdrag*rhogeq*rhodsol*w2r**4*w3i**2 - 2*w1i**2*Kdrag*rhogeq*rhodsol*w3i**2*w2i**2*w2r**2 -& 4*w1i**2*Kdrag*rhogeq*rhodsol*w2i*w2r**2*w3i**3 - 4*w1i**2*Kdrag*rhogeq*rhodsol*w2i*w3i*w2r**2*w3r**2 -& w1i**2*Kdrag*rhogeq*rhodsol*w3i**2*w2i**4 - rhogsol*w1r**3*rhogeq*rhodeq*w2i**3*w3r**3 -& rhogsol*w1r**3*rhogeq*rhodeq*w3i*w2i**2*w3r**2*w2r - rhogsol*w1r**3*rhogeq*rhodeq*w3i*w2r**3*w3r**2 -& rhogsol*w1r**3*rhogeq*rhodeq*w3r*w2i**3*w3i**2 - 2*w1i**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2*w2r**2 -& 4*w1i**2*Kdrag*rhogeq*rhodsol*w2i**3*w3i*w3r**2 - w1i**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**4 -& 2*w1i**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2*w3i**2 - w1i**2*Kdrag*rhogeq*rhodsol*w3r**4*w2r**2 -& w1i**2*Kdrag*rhogeq*rhodsol*w3r**2*w2r**4 + 2*w1i*Kdrag*rhogeq*rhodsol*w2r**4*w3r**2*w3i +& 4*w1i*Kdrag*rhogeq*rhodsol*w2r**2*w3i*w3r**2*w2i**2 + 2*w1i*Kdrag*rhogeq*rhodsol*w2r**4*w3i**3 +& 2*w1i*Kdrag*rhogeq*rhodsol*w2i**4*w3i**3 + 2*w1i*Kdrag*rhogeq*rhodsol*w2r**2*w2i*w3r**4 +& 4*w1i*Kdrag*rhogeq*rhodsol*w3i**2*w2r**2*w2i*w3r**2 + 4*w1i*Kdrag*rhogeq*rhodsol*w2i**3*w3i**2*w3r**2 -& 2*w1i*rhogsol*rhogeq*rhodeq*w3i**4*w2i**2*w2r**2 - w1i*rhogsol*rhogeq*rhodeq*w2r**4*w3i**4 -& w1i*rhogsol*rhogeq*rhodeq*w3i**4*w2i**4 + 2*w1i*Kdrag*rhogeq*rhodsol*w2i**3*w3r**4 -& 2*w1i*rhogsol*rhogeq*rhodeq*w2r**4*w3i**2*w3r**2 + 2*w1i*Kdrag*rhogeq*rhodsol*w2i**4*w3r**2*w3i +& 2*w1i*Kdrag*rhogeq*rhodsol*w2i*w2r**2*w3i**4 + 2*w1i*Kdrag*rhogeq*rhodsol*w3i**4*w2i**3 +& 4*w1i*Kdrag*rhogeq*rhodsol*w2r**2*w2i**2*w3i**3 - w1i**2*Kdrag*rhogeq*rhodsol*w3r**4*w2i**2 +& 2*w1r**2*rhogsol*rhogeq*rhodeq*w2r**2*w2i**2*w3i**3 - w1i*rhogsol*rhogeq*rhodeq*w3r**4*w2i**4 +& w1r**2*rhogsol*rhogeq*rhodeq*w2i**4*w3r**2*w3i + w1r**2*rhogsol*rhogeq*rhodeq*w2r**4*w3r**2*w3i +& w1r**2*rhogsol*rhogeq*rhodeq*w2i*w2r**2*w3i**4 + w1r**2*rhogsol*rhogeq*rhodeq*w2i**4*w3i**3 +& 2*w1r**2*rhogsol*rhogeq*rhodeq*w3i**2*w2r**2*w2i*w3r**2 +& 2*w1r**2*rhogsol*rhogeq*rhodeq*w2r**2*w3i*w3r**2*w2i**2 -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w2r**2*w2i**2 + 2*w1r**2*rhogsol*rhogeq*rhodeq*w2i**3*w3i**2*w3r**2& + w1r**2*rhogsol*rhogeq*rhodeq*w3i**4*w2i**3 - w1i*rhogsol*rhogeq*rhodeq*w3r**4*w2r**4 -& 2*w1i*rhogsol*rhogeq*rhodeq*w3r**4*w2i**2*w2r**2 - 4*w1i*rhogsol*rhogeq*rhodeq*w3r**2*w2i**2*w2r**2*w3i**2 -& 2*w1i*rhogsol*rhogeq*rhodeq*w3i**2*w2i**4*w3r**2 - w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w2i**4 -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2i**3*w3i**2 - 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2i**2*w3i**3 -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3r*w2i*w3i**2 - w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i**4*w2i -& w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w2r**4 - 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w3r*w2i**2*w2r -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w3r*w2r**3 -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2i*w2r**2*w3i**2 -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i**2*w2i*w3r**2 -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r**2*w2i**2*w3i + w1r**2*rhogsol*rhogeq*rhodeq*w2i**3*w3r**4 -& 2*w1r*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3r**3*w2i - vgsol*Kdrag*rhogeq*k**3*cs**2*w1i**3*rhodeq*w2r*w3i -& w1r*rhogsol*rhogeq*w1i**2*rhodeq*w3i**3*w2r**3 + rhogsol*w1r*k**4*cs**4*rhogeq*w1i**2*rhodeq*w2i*w3r -& w1r*rhogsol*rhogeq*w1i**2*rhodeq*w3i*w2r**3*w3r**2 - w1r*rhogsol*rhogeq*w1i**2*rhodeq*w3r*w2i**3*w3i**2 -& w1r*rhogsol*rhogeq*w1i**2*rhodeq*w3r*w2r**2*w2i*w3i**2 - w1r*rhogsol*rhogeq*w1i**2*rhodeq*w3r**3*w2i*w2r**2 -& w1r*rhogsol*rhogeq*w1i**2*rhodeq*w2i**3*w3r**3 + rhogsol*rhogeq*k**2*cs**2*w1i**4*rhodeq*w2r**2*w3i -& w1r*rhogsol*rhogeq*w1i**2*rhodeq*w3i*w2i**2*w3r**2*w2r - w1r*rhogsol*rhogeq*w1i**2*rhodeq*w2r*w2i**2*w3i**3) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & rhogsol*w1r*k**4*cs**4*rhogeq*w1i**2*rhodeq*w2r*w3i - vgsol*Kdrag*rhogeq*k**3*cs**2*w1i**3*rhodeq*w2i*w3r -& w1i*rhogsol*Kdrag*rhodeq*w2i*w2r**2*w3i**4 - w1i*rhogsol*Kdrag*rhodeq*w2i**4*w3i**3 -& w1i*rhogsol*Kdrag*rhodeq*w3i**4*w2i**3 + rhogsol*rhogeq*k**2*cs**2*w1i**4*rhodeq*w2i*w3r**2 -& 2*w1i*rhogsol*Kdrag*rhodeq*w2i**3*w3i**2*w3r**2 - w1i*rhogsol*Kdrag*rhodeq*w2i**4*w3r**2*w3i -& w1i*rhogsol*Kdrag*rhodeq*w2r**4*w3r**2*w3i - w1i*rhogsol*Kdrag*rhodeq*w2r**4*w3i**3 -& 2*w1i*rhogsol*Kdrag*rhodeq*w3i**2*w2r**2*w2i*w3r**2 - 2*w1i*rhogsol*Kdrag*rhodeq*w2r**2*w3i*w3r**2*w2i**2 -& 2*w1i*rhogsol*Kdrag*rhodeq*w2r**2*w2i**2*w3i**3 + rhogsol*rhogeq*k**2*cs**2*w1i**4*rhodeq*w2i**2*w3i +& rhogsol*rhogeq*k**2*cs**2*w1i**4*rhodeq*w2i*w3i**2 + rhogsol*rhogeq*k**4*cs**4*w1r**3*rhodeq*w2i*w3r +& rhogsol*rhogeq*k**4*cs**4*w1r**3*rhodeq*w2r*w3i + rhogsol*Kdrag*w1r**4*rhodeq*w3r**2*w2i**2 +& rhogsol*Kdrag*w1r**4*rhodeq*w3r**2*w2r**2 + rhogsol*Kdrag*w1r**4*rhodeq*w3i**2*w2i**2 +& rhogsol*Kdrag*w1r**4*rhodeq*w2r**2*w3i**2 - w1i*rhogsol*Kdrag*rhodeq*w2i**3*w3r**4 -& w1i*rhogsol*Kdrag*rhodeq*w2r**2*w2i*w3r**4 - vgsol*k**3*cs**2*rhogeq**2*w1r**4*rhodeq*w2i*w3r -& vgsol*k**3*cs**2*rhogeq**2*w1r**4*rhodeq*w2r*w3i + 2*w1r**3*Kdrag*rhogeq*rhodsol*w3r*w2i**2*w3i**2 +& 2*w1r**3*Kdrag*rhogeq*rhodsol*w3r*w2r**2*w3i**2 + 2*w1r**3*Kdrag*rhogeq*rhodsol*w2r**3*w3i**2 +& 2*w1r**3*Kdrag*rhogeq*rhodsol*w2r*w2i**2*w3i**2 + 2*w1r**3*Kdrag*rhogeq*rhodsol*w3r**3*w2i**2 +& 2*w1r**3*Kdrag*rhogeq*rhodsol*w3r**3*w2r**2 + 2*w1r**3*Kdrag*rhogeq*rhodsol*w2r**3*w3r**2 +& 2*w1r**3*Kdrag*rhogeq*rhodsol*w2r*w2i**2*w3r**2 + 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w3r**3*w2r**2 +& 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w2r**3*w3r**2 + 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w2r*w2i**2*w3r**2 +& 2*w1i**3*Kdrag*rhogeq*rhodsol*w2i**2*w3i**3 + 2*w1i**3*Kdrag*rhogeq*rhodsol*w2i**3*w3i**2 +& 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w3r**3*w2i**2 + 2*w1i**3*Kdrag*rhogeq*rhodsol*w3r**2*w2i**3 +& 2*w1i**3*Kdrag*rhogeq*rhodsol*w3r**2*w2r**2*w3i + 2*w1i**3*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2*w3i +& 2*w1i**3*Kdrag*rhogeq*rhodsol*w2i*w2r**2*w3i**2 + 2*w1i**3*Kdrag*rhogeq*rhodsol*w3r**2*w2i*w2r**2 +& 2*w1i**3*Kdrag*rhogeq*rhodsol*w2r**2*w3i**3 + 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w3r*w2i**2*w3i**2 +& 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w3r*w2r**2*w3i**2 + 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w2r**3*w3i**2 +& 2*w1r*w1i**2*Kdrag*rhogeq*rhodsol*w2r*w2i**2*w3i**2 + 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w2i**2*w3i**3 +& 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w2i*w2r**2*w3i**2 + 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w2i**3*w3i**2 +& 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w2r**2*w3i**3 - 2*w1r**2*w1i**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2 -& 2*w1r**2*w1i**2*Kdrag*rhogeq*rhodsol*w3r**2*w2r**2 - 2*w1r**2*w1i**2*Kdrag*rhogeq*rhodsol*w3i**2*w2i**2 -& 2*w1r**2*w1i**2*Kdrag*rhogeq*rhodsol*w2r**2*w3i**2 + 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i*w2r**2 +& 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**3 + 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2r**2*w3i +& 2*w1i*w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2*w3i - 2*w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2*w3i**2 -& 2*w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2r**2*w3i**2 - 4*w1r**2*Kdrag*rhogeq*rhodsol*w3r*w2r**3*w3i**2 -& w1r**2*Kdrag*rhogeq*rhodsol*w2r**4*w3i**2 - 2*w1r**2*Kdrag*rhogeq*rhodsol*w3i**2*w2i**2*w2r**2 -& w1r**2*Kdrag*rhogeq*rhodsol*w3i**2*w2i**4 - w1r**2*Kdrag*rhogeq*rhodsol*w3i**4*w2i**2 -& w1r**2*Kdrag*rhogeq*rhodsol*w3i**4*w2r**2 - w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2r**4 -& 2*w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2*w2r**2 - w1r**2*Kdrag*rhogeq*rhodsol*w3r**2*w2i**4 -& 4*w1r**2*Kdrag*rhogeq*rhodsol*w2r*w3r*w2i**2*w3i**2 - w1r**2*Kdrag*rhogeq*rhodsol*w3r**4*w2i**2 -& w1r**2*Kdrag*rhogeq*rhodsol*w3r**4*w2r**2 - 4*w1r**2*Kdrag*rhogeq*rhodsol*w2r*w3r**3*w2i**2 -& 4*w1r**2*Kdrag*rhogeq*rhodsol*w3r**3*w2r**3 + 2*w1r*Kdrag*rhogeq*rhodsol*w2r*w3i**4*w2i**2) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & 4*w1r*Kdrag*rhogeq*rhodsol*w3r**3*w2r**2*w2i**2 + 4*w1r*Kdrag*rhogeq*rhodsol*w2r**3*w3i**2*w3r**2 +& 4*w1r*Kdrag*rhogeq*rhodsol*w2r*w3i**2*w2i**2*w3r**2 + 2*w1r*Kdrag*rhogeq*rhodsol*w2r*w2i**2*w3r**4 +& 2*w1r*Kdrag*rhogeq*rhodsol*w3r**3*w2i**4 - 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w3r*w2r**2*w2i*w3i**2 -& 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w2r*w2i**2*w3i**3 - 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w3i**3*w2r**3 -& 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w3r*w2i**3*w3i**2 + 2*w1r*Kdrag*rhogeq*rhodsol*w2r**3*w3r**4 +& 2*w1r*Kdrag*rhogeq*rhodsol*w3r**3*w2r**4 + 2*w1r*Kdrag*rhogeq*rhodsol*w3r*w2r**4*w3i**2 +& 2*w1r*Kdrag*rhogeq*rhodsol*w3r*w2i**4*w3i**2 + 4*w1r*Kdrag*rhogeq*rhodsol*w3r*w2r**2*w3i**2*w2i**2 +& 2*w1r*Kdrag*rhogeq*rhodsol*w2r**3*w3i**4 - 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w2i**3*w3r**3 -& 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w3i*w2i**2*w3r**2*w2r - 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w3i*w2r**3*w3r**2 -& 4*w1i*w1r*Kdrag*rhogeq*rhodsol*w3r**3*w2i*w2r**2 - vdsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w3i**2*w2i**2 -& vdsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w2r**2*w3i**2 + vdsol*Kdrag*k**3*cs**2*rhogeq*w1r**3*rhodeq*w2i*w3i -& vdsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w3r**2*w2i**2 - vdsol*Kdrag*k**3*cs**2*rhogeq*w1r**3*rhodeq*w3r*w2r -& vdsol*Kdrag*k*rhogeq*w1r**3*rhodeq*w3r**2*w2r**2 - cs**2*k**2*rhogsol*Kdrag*w1r**2*rhodeq*w3r**2*w2i**2 -& cs**2*k**2*rhogsol*Kdrag*w1r**2*rhodeq*w3r**2*w2r**2 - cs**2*k**2*rhogsol*Kdrag*w1r**2*rhodeq*w3i**2*w2i**2 -& cs**2*k**2*rhogsol*Kdrag*w1r**2*rhodeq*w2r**2*w3i**2 - 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w3r*w2i*w3i**2& - 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w3i*w3r*w2i**2 -& 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w2r**3*w3i - 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w3r**3*w2i +& 2*vgsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r*w2i*w3i -& 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w2r*w2i*w3r**2 -& 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w3i*w3r*w2r**2 -& 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w2r*w3i*w2i**2 -& 2*rhogsol*rhogeq*k**2*cs**2*w1r**3*rhodeq*w2r*w2i*w3i**2 -& 2*vdsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w3r*w2i*w3i -& 2*vdsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r*w2i*w3i -& 2*vgsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r*w3r**2 -& 2*vgsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r**2*w3r +& 2*vgsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w3r*w2i*w3i +& 2*vdsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r*w3r**2 +& 2*vdsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r**2*w3r -& 2*rhogsol*k**4*cs**4*rhogeq*w1r**2*rhodeq*w3r*w2r*w2i - 2*rhogsol*k**4*cs**4*rhogeq*w1r**2*rhodeq*w3r*w2r*w3i -& 2*rhogsol*k**4*cs**4*rhogeq*w1r**2*rhodeq*w2r**2*w3i - vgsol*k**3*cs**2*rhogeq**2*w1r**3*rhodeq*w2i*w3i**2 -& 2*rhogsol*k**4*cs**4*rhogeq*w1r**2*rhodeq*w2i*w3r**2 + 2*vgsol*k**3*cs**2*rhogeq**2*w1r**3*rhodeq*w3r*w2r*w3i +& 2*vgsol*k**3*cs**2*rhogeq**2*w1r**3*rhodeq*w3r*w2r*w2i + vgsol*k**3*cs**2*rhogeq**2*w1r**3*rhodeq*w2r**2*w3i +& w1i*vdsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r*w3i) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & w1i*vdsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2i*w3r + vgsol*k**3*cs**2*rhogeq**2*w1r**3*rhodeq*w2i*w3r**2 -& vgsol*k**3*cs**2*rhogeq**2*w1r**3*rhodeq*w2i**2*w3i - w1i*vgsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2i*w3r -& w1i*vgsol*Kdrag*rhogeq*k**3*cs**2*w1r**2*rhodeq*w2r*w3i - w1r*rhogsol*Kdrag*rhodeq*w2r**3*w3i**4 -& w1r*rhogsol*Kdrag*rhodeq*w2r*w3i**4*w2i**2 - w1r*rhogsol*Kdrag*rhodeq*w3r*w2r**4*w3i**2 -& w1r*rhogsol*Kdrag*rhodeq*w3r*w2i**4*w3i**2 - 2*w1r*rhogsol*Kdrag*rhodeq*w3r*w2r**2*w3i**2*w2i**2 -& 2*w1r*rhogsol*Kdrag*rhodeq*w3r**3*w2r**2*w2i**2 - 2*w1r*rhogsol*Kdrag*rhodeq*w2r**3*w3i**2*w3r**2 -& 2*w1r*rhogsol*Kdrag*rhodeq*w2r*w3i**2*w2i**2*w3r**2 - w1r*rhogsol*Kdrag*rhodeq*w2r**3*w3r**4 -& w1r*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3r**4 - w1r*rhogsol*Kdrag*rhodeq*w3r**3*w2i**4 -& w1r*rhogsol*Kdrag*rhodeq*w3r**3*w2r**4 - 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3r**2 -& 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w3r*w2i**2*w3i**2 - 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w2r**3*w3i**2 -& 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w3r**3*w2i**2 - 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w3r**3*w2r**2 +& w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r*w2r**2*w3i**2 + w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2r**3*w3i**2 +& w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3i**2 + w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r*w2i**2*w3i**2 -& 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w2r**3*w3r**2 - 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w3r*w2r**2*w3i**2 -& 2*w1r*w1i**2*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3i**2 + w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r**3*w2r**2 +& w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2r**3*w3r**2 + w1r*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3r**2 -& 2*w1r**3*rhogsol*Kdrag*rhodeq*w2r**3*w3r**2 - 2*w1r**3*rhogsol*Kdrag*rhodeq*w3r*w2i**2*w3i**2 -& 2*w1r**3*rhogsol*Kdrag*rhodeq*w3r*w2r**2*w3i**2 - 2*w1r**3*rhogsol*Kdrag*rhodeq*w2r*w2i**2*w3i**2 -& 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w3r**3*w2i**2 - 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w3r**3*w2r**2 -& 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w2r**3*w3r**2 - 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w2r*w2i**2*w3r**2 -& 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w3r*w2i**2*w3i**2 - 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w3r*w2r**2*w3i**2& - 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w2r**3*w3i**2 - 2*w1i**2*vgsol*rhogeq*k*Kdrag*rhodeq*w2r*w2i**2*w3i**2 +& w1i*k*vgsol*rhogeq**2*rhodeq*w2r*w3i**4*w2i**2 + w1i*k*vgsol*rhogeq**2*rhodeq*w2r**3*w3i**4 +& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*w1i**2*rhodeq*w3r*w2r -& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*w1i**2*rhodeq*w2i*w3i - vgsol*k**3*cs**2*rhogeq**2*w1i**4*rhodeq*w2i*w3r -& vgsol*k**3*cs**2*rhogeq**2*w1i**4*rhodeq*w2r*w3i + w1i*k*vgsol*rhogeq**2*rhodeq*w3r*w2r**4*w3i**2 +& w1i*k*vgsol*rhogeq**2*rhodeq*w3r*w2i**4*w3i**2 + 2*w1i*k*vgsol*rhogeq**2*rhodeq*w3r*w2r**2*w3i**2*w2i**2 +& w1i*k*vgsol*rhogeq**2*rhodeq*w2r**3*w3r**4 + w1i*k*vgsol*rhogeq**2*rhodeq*w2r*w2i**2*w3r**4 +& w1i*k*vgsol*rhogeq**2*rhodeq*w3r**3*w2i**4 - vdsol*Kdrag*k*w1r*rhogeq*w1i**2*rhodeq*w3i**2*w2i**2 -& vdsol*Kdrag*k*w1r*rhogeq*w1i**2*rhodeq*w2r**2*w3i**2 - vdsol*Kdrag*k*w1r*rhogeq*w1i**2*rhodeq*w3r**2*w2r**2 +& w1i*k*vgsol*rhogeq**2*rhodeq*w3r**3*w2r**4 + 2*w1i*k*vgsol*rhogeq**2*rhodeq*w3r**3*w2r**2*w2i**2 +& 2*w1i*k*vgsol*rhogeq**2*rhodeq*w2r**3*w3i**2*w3r**2 + 2*w1i*k*vgsol*rhogeq**2*rhodeq*w2r*w3i**2*w2i**2*w3r**2 -& 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w2i**2*w3i**3 - 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w2i*w2r**2*w3i**2 -& 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i**2 - 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w2r**2*w3i**3 -& 2*vgsol*w1r**2*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2i*w3r -& 2*vgsol*w1r**2*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2r*w3i -& vdsol*Kdrag*k*w1r*rhogeq*w1i**2*rhodeq*w3r**2*w2i**2 - 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i*w2r**2 -& 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**3 - 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2r**2*w3i -& 2*w1i*w1r**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**2*w3i - vgsol*k*w1r*rhogeq**2*rhodeq*w3i**4*w2i**3 -& 2*vgsol*k*w1r*rhogeq**2*rhodeq*w2r**2*w2i**2*w3i**3 - 2*vgsol*k*w1r*rhogeq**2*rhodeq*w2r**2*w3i*w3r**2*w2i**2 -& vgsol*k*w1r*rhogeq**2*rhodeq*w2r**4*w3i**3 - vgsol*k*w1r*rhogeq**2*rhodeq*w2i**4*w3i**3 -& vgsol*k*w1r*rhogeq**2*rhodeq*w2i**4*w3r**2*w3i - vgsol*k*w1r*rhogeq**2*rhodeq*w2r**4*w3r**2*w3i -& vgsol*k*w1r*rhogeq**2*rhodeq*w2i*w2r**2*w3i**4 - vgsol*k*w1r*rhogeq**2*rhodeq*w2r**2*w2i*w3r**4 -& 2*vgsol*k*w1r*rhogeq**2*rhodeq*w3i**2*w2r**2*w2i*w3r**2 - 2*vgsol*k*w1r*rhogeq**2*rhodeq*w2i**3*w3i**2*w3r**2 +& rhogsol*w1i*k**4*cs**4*rhogeq*w1r**2*rhodeq*w3r*w2r - rhogsol*w1i*k**4*cs**4*rhogeq*w1r**2*rhodeq*w2i*w3i) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & 2*w1i**2*rhogsol*Kdrag*rhodeq*w3i**2*w2i**2*w2r**2 - vgsol*k*w1r*rhogeq**2*rhodeq*w2i**3*w3r**4 +& 2*w1i**2*rhogsol*Kdrag*rhodeq*w3r**2*w2r**2*w3i**2 + w1i**2*rhogsol*Kdrag*rhodeq*w3r**2*w2r**4 +& 2*w1i**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**2*w2r**2 + w1i**2*rhogsol*Kdrag*rhodeq*w3r*w2r**3*w3i**2 +& w1i**2*rhogsol*Kdrag*rhodeq*w2r*w3r*w2i**2*w3i**2 + w1i**2*rhogsol*Kdrag*rhodeq*w3r**3*w2r**3 +& 3*w1i**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i*w3r**2 + w1i**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**4 +& 3*w1i**2*rhogsol*Kdrag*rhodeq*w2i*w3i*w2r**2*w3r**2 + w1i**2*rhogsol*Kdrag*rhodeq*w3r**4*w2r**2 +& 2*w1i**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**2*w3i**2 + w1i**2*rhogsol*Kdrag*rhodeq*w2r**4*w3i**2 +& w1i**2*rhogsol*Kdrag*rhodeq*w3i**2*w2i**4 + w1i**2*rhogsol*Kdrag*rhodeq*w3i**4*w2i**2 +& w1i**2*rhogsol*Kdrag*rhodeq*w3i**4*w2r**2 + 3*w1i**2*rhogsol*Kdrag*rhodeq*w2i*w2r**2*w3i**3 +& 3*w1i**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i**3 + 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w2i**3*w3i +& 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w2i*w3i*w2r**2 +& 4*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w3i**2*w2i**2 -& 8*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2r*w2i*w3i + w1i**2*rhogsol*Kdrag*rhodeq*w2r*w3r**3*w2i**2 +& 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3r**3 +& 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w3i*w2i*w3r**2 +& 4*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w3r**2*w2r**2 - w1r*vgsol*k*Kdrag**2*rhodeq*w2i**2*w3i**3 -& w1r*vgsol*k*Kdrag**2*rhodeq*w2i**3*w3i**2 - w1r*vgsol*k*Kdrag**2*rhodeq*w2r**2*w3i**3 +& 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3r*w3i**2 +& 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2r*w2i**2 +& 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2r**3 + 2*w1i*vgsol*w1r*k**3*cs**2*rhogeq**2*rhodeq*w3i**3*w2i& - w1i*rhogsol*w1r**2*rhogeq*rhodeq*w2i**3*w3i**3 + w1i**2*rhogsol*Kdrag*rhodeq*w3r**4*w2i**2 -& w1i*rhogsol*w1r**2*rhogeq*rhodeq*w2i*w3i*w2r**2*w3r**2 + w1i*rhogsol*w1r**2*rhogeq*rhodeq*w3r*w2r**3*w3i**2 +& w1i*rhogsol*w1r**2*rhogeq*rhodeq*w2r*w3r*w2i**2*w3i**2 - w1i*rhogsol*w1r**2*rhogeq*rhodeq*w2i**3*w3i*w3r**2 -& w1i*rhogsol*w1r**2*rhogeq*rhodeq*w2i*w2r**2*w3i**3 - w1r*vgsol*k*Kdrag**2*rhodeq*w3r**2*w2i*w2r**2 -& w1r*vgsol*k*Kdrag**2*rhodeq*w3r**2*w2i**3 - w1r*vgsol*k*Kdrag**2*rhodeq*w3r**2*w2r**2*w3i -& w1r*vgsol*k*Kdrag**2*rhodeq*w3r**2*w2i**2*w3i - w1r*vgsol*k*Kdrag**2*rhodeq*w2i*w2r**2*w3i**2 +& w1i*rhogsol*w1r**2*rhogeq*rhodeq*w3r**3*w2r**3 + w1i*rhogsol*w1r**2*rhogeq*rhodeq*w2r*w3r**3*w2i**2 +& vgsol*Kdrag**2*k*rhodeq*w3r*w2r**2*w2i*w3i**2 + vgsol*Kdrag**2*k*rhodeq*w2r*w2i**2*w3i**3 +& vgsol*Kdrag**2*k*rhodeq*w3i**3*w2r**3 + vgsol*Kdrag**2*k*rhodeq*w3r**3*w2i*w2r**2 +& vgsol*Kdrag**2*k*rhodeq*w3i*w2r**3*w3r**2 + vgsol*Kdrag**2*k*rhodeq*w3r*w2i**3*w3i**2 -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w3i*w3r*w2i**2 -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w3i*w3r*w2r**2 + vgsol*Kdrag**2*k*rhodeq*w2i**3*w3r**3 -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w2r*w2i*w3r**2 + vgsol*Kdrag**2*k*rhodeq*w3i*w2i**2*w3r**2*w2r -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w3r**3*w2i -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w3r*w2i*w3i**2 -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w2r**3*w3i -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w2r*w3i*w2i**2 -& 2*w1r*rhogsol*k**2*cs**2*rhogeq*w1i**2*rhodeq*w2r*w2i*w3i**2 + 2*w1i*w1r*vgsol*k*Kdrag**2*rhodeq*w3r**2*w2r**2& + 2*w1i*w1r*vgsol*k*Kdrag**2*rhodeq*w3i**2*w2i**2 + 2*w1i*w1r*vgsol*k*Kdrag**2*rhodeq*w3r**2*w2i**2 +& 2*w1i*w1r*vgsol*k*Kdrag**2*rhodeq*w2r**2*w3i**2 + vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2r*w3i**3 -& 2*vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2r*w2i*w3i**2) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & 2*vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w3i*w3r*w2r**2 - vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2r**3*w3i& - vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2r*w3i*w2i**2 + vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w3r*w2i**3& - 2*vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w3i*w3r*w2i**2 -& vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w3r**3*w2i + vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w3r*w2i*w2r**2 -& vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w3r*w2i*w3i**2 - w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w3r*w2r**2*w2i*w3i**2& - w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w2r*w2i**2*w3i**3 + vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2r*w3i*w3r**2 -& w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w3r*w2i**3*w3i**2 - w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w3i**3*w2r**3 +& 2*vgsol*k**3*cs**2*rhogeq**2*w1i**2*rhodeq*w2r*w2i*w3r**2 - w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w3r**3*w2i*w2r**2 -& w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w2i**3*w3r**3 - w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w3i*w2i**2*w3r**2*w2r -& w1i*rhogeq*k*Kdrag*vdsol*rhodeq*w3i*w2r**3*w3r**2 + vdsol*Kdrag*k**3*cs**2*rhogeq*w1i**3*rhodeq*w2i*w3r +& vdsol*Kdrag*k**3*cs**2*rhogeq*w1i**3*rhodeq*w2r*w3i +& 2*w1r*vgsol*rhogeq**2*k**3*cs**2*w1i**2*rhodeq*w3r*w2r*w2i -& w1r*vgsol*rhogeq**2*k**3*cs**2*w1i**2*rhodeq*w2i**2*w3i -& w1r*vgsol*rhogeq**2*k**3*cs**2*w1i**2*rhodeq*w2i*w3i**2 +& w1r*vgsol*rhogeq**2*k**3*cs**2*w1i**2*rhodeq*w2i*w3r**2 +& 2*w1r*vgsol*rhogeq**2*k**3*cs**2*w1i**2*rhodeq*w3r*w2r*w3i +& w1r*vgsol*rhogeq**2*k**3*cs**2*w1i**2*rhodeq*w2r**2*w3i - vgsol*k**3*cs**2*rhogeq**2*w1i**3*rhodeq*w2r*w3r**2 -& vgsol*k**3*cs**2*rhogeq**2*w1i**3*rhodeq*w2r**2*w3r - w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i**2 +& vgsol*k**3*cs**2*rhogeq**2*w1i**3*rhodeq*w2i**2*w3r + 2*vgsol*k**3*cs**2*rhogeq**2*w1i**3*rhodeq*w2r*w2i*w3i +& vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r**3*w2r**2 - vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r**3*w2i**2 +& vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r**3*w3r**2 - w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**2*w3i -& w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2r**2*w3i**3 - w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2i**2*w3i**3 -& w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w2i*w2r**2*w3i**2 +& 4*w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w2i*w3i**2 -& w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i*w2r**2 - w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r**2*w2r**2*w3i +& w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2i*w2r**2 +& 4*w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3i*w3r*w2i**2 +& w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w3i*w3r**2 +& w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2i*w3i**2 - w1i*cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r**2*w2i**3 +& vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i**2*w3i**3 + 2*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3i**4*w2i +& w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r**3*w2i + w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2i**3 +& w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r**3*w3i + w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w3i*w2i**2 +& w1i*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w3i**3 + vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2i**3*w3i**2 +& vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2r**2*w2i*w3i**2 + 2*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w3r*w2i**4 +& vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r**3*w2i*w2r**2 + vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w2r**3*w3r**2 +& 4*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i*w3i**2*w3r**2 + 2*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i*w3r**4& + vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r*w2i**2*w3i**2 + vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2i**3*w3r**3 +& vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i*w2i**2*w3r**2*w2r +& 4*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r*w3i*w2r**2*w2i**2 + 2*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r**4*w3i*w3r& + vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3i**3*w2r**3 + 2*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r*w2i*w3r**2*w3i -& vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r*w2r**2*w3i**2 - vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r*w2i**2*w3r**2& + vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r*w2i**2*w3i**2) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & 2*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i*w3i*w3r*w2r**2 +& 2*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i**3*w3i*w3r + vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r**3*w3i**2 +& 2*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r*w2i*w3i**3 - vdsol*Kdrag**2*k*rhodeq*w3r*w2r**2*w2i*w3i**2 -& vdsol*Kdrag**2*k*rhodeq*w2r*w2i**2*w3i**3 - vdsol*Kdrag**2*k*rhodeq*w3r**3*w2i*w2r**2 -& vdsol*Kdrag**2*k*rhodeq*w3i*w2i**2*w3r**2*w2r - vdsol*Kdrag**2*k*rhodeq*w3i*w2r**3*w3r**2 -& vdsol*Kdrag**2*k*rhodeq*w3r*w2i**3*w3i**2 - vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r**3*w2r**2 +& vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w3r**3*w2i**2 - vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r**3*w3r**2 -& w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w3r**3*w2r**2 - w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w2r**3*w3r**2 -& w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w2r*w2i**2*w3r**2 +& 2*w1i*w1r*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i*w3i**2 +& 2*w1i*w1r*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r**2*w3i +& 2*w1i*w1r*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i**2*w3i -& w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w3r*w2i**2*w3i**2 - w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w3r*w2r**2*w3i**2 -& w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w2r**3*w3i**2 - w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w2r*w2i**2*w3i**2 -& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2i*w3i*w2r**2 - w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2i**3*w3i -& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3i**2*w2i**2 - w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r**2*w3i**2& + 2*w1i*w1r*vgsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i*w3r**2 -& 4*w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2r*w2i*w3i -& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3i**3*w2i - w1i*w1r**2*vgsol*k*rhogeq**2*rhodeq*w3r**3*w2i**2 -& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3i*w2i*w3r**2 -& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r**2*w2i**2 +& 3*w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r**2*w2r**2 - vgsol*k*rhogeq**2*w1i**3*rhodeq*w2r*w2i**2*w3i**2 +& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w3r**3 - vgsol*k*rhogeq**2*w1i**3*rhodeq*w2r**3*w3r**2 -& vgsol*k*rhogeq**2*w1i**3*rhodeq*w2r*w2i**2*w3r**2 - vgsol*k*rhogeq**2*w1i**3*rhodeq*w3r*w2i**2*w3i**2 -& vgsol*k*rhogeq**2*w1i**3*rhodeq*w3r*w2r**2*w3i**2 - vdsol*Kdrag**2*k*rhodeq*w2i**3*w3r**3 -& vgsol*k*rhogeq**2*w1i**3*rhodeq*w3r**3*w2r**2 - vgsol*k*rhogeq**2*w1i**3*rhodeq*w2r**3*w3i**2 +& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w3r*w3i**2 +& w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2r*w2i**2 + w1r*vgsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2r**3 -& vgsol*k*rhogeq**2*w1i**3*rhodeq*w3r**3*w2i**2 - vdsol*Kdrag**2*k*rhodeq*w3i**3*w2r**3 +& w1r*vdsol*k*Kdrag**2*rhodeq*w2i**2*w3i**3 + w1r*vdsol*k*Kdrag**2*rhodeq*w2i*w2r**2*w3i**2 +& w1r*vdsol*k*Kdrag**2*rhodeq*w2i**3*w3i**2 + w1r*vdsol*k*Kdrag**2*rhodeq*w3r**2*w2r**2*w3i +& w1r*vdsol*k*Kdrag**2*rhodeq*w3r**2*w2i**2*w3i + w1r*vdsol*k*Kdrag**2*rhodeq*w2r**2*w3i**3 +& w1r*vdsol*k*Kdrag**2*rhodeq*w3r**2*w2i*w2r**2 + w1r*vdsol*k*Kdrag**2*rhodeq*w3r**2*w2i**3 +& cs**2*k**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i*w3r**2 - cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r*w2r**3*w3i**2 -& cs**2*k**2*rhogsol*Kdrag*rhodeq*w2r*w3r*w2i**2*w3i**2 - cs**2*k**2*rhogsol*Kdrag*rhodeq*w3r**3*w2r**3 +& cs**2*k**2*rhogsol*Kdrag*rhodeq*w2i*w3i*w2r**2*w3r**2 - w1r**4*Kdrag*rhogeq*rhodsol*w2r**2*w3i**2 +& vgsol*Kdrag*k**3*cs**2*rhogeq*w1r**3*rhodeq*w3r*w2r - w1r**4*Kdrag*rhogeq*rhodsol*w3i**2*w2i**2 -& vgsol*Kdrag*k**3*cs**2*rhogeq*w1r**3*rhodeq*w2i*w3i - cs**2*k**2*rhogsol*Kdrag*rhodeq*w2r*w3r**3*w2i**2 +& cs**2*k**2*rhogsol*Kdrag*rhodeq*w2i*w2r**2*w3i**3 + cs**2*k**2*rhogsol*Kdrag*rhodeq*w2i**3*w3i**3 +& 2*w1i**2*rhogsol*rhogeq*rhodeq*w2i**3*w3i**2*w3r**2 + w1i**2*rhogsol*rhogeq*rhodeq*w2i**4*w3r**2*w3i +& w1i**2*rhogsol*rhogeq*rhodeq*w2r**4*w3r**2*w3i + w1i**2*rhogsol*rhogeq*rhodeq*w2r**4*w3i**3 +& 2*w1i**2*rhogsol*rhogeq*rhodeq*w3i**2*w2r**2*w2i*w3r**2) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & 2*w1i**2*rhogsol*rhogeq*rhodeq*w2r**2*w3i*w3r**2*w2i**2 + w1i**2*rhogsol*rhogeq*rhodeq*w2i*w2r**2*w3i**4 +& w1i**2*rhogsol*rhogeq*rhodeq*w2i**4*w3i**3 + w1i**2*rhogsol*rhogeq*rhodeq*w3i**4*w2i**3 +& 2*w1i**2*rhogsol*rhogeq*rhodeq*w2r**2*w2i**2*w3i**3 - w1r**4*Kdrag*rhogeq*rhodsol*w3r**2*w2i**2 -& w1r**4*Kdrag*rhogeq*rhodsol*w3r**2*w2r**2 + w1r**3*vgsol*k*rhogeq**2*rhodeq*w2i**2*w3i**3 +& w1r**3*vgsol*k*rhogeq**2*rhodeq*w2i*w2r**2*w3i**2 + w1r**3*vgsol*k*rhogeq**2*rhodeq*w2i**3*w3i**2 +& w1r**3*vgsol*k*rhogeq**2*rhodeq*w2r**2*w3i**3 + w1i**2*rhogsol*rhogeq*rhodeq*w2i**3*w3r**4 +& w1i**2*rhogsol*rhogeq*rhodeq*w2r**2*w2i*w3r**4 + w1r**3*vgsol*k*rhogeq**2*rhodeq*w3r**2*w2i*w2r**2 +& w1r**3*vgsol*k*rhogeq**2*rhodeq*w3r**2*w2r**2*w3i + w1r**3*vgsol*k*rhogeq**2*rhodeq*w3r**2*w2i**2*w3i +& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*w1i**2*rhodeq*w2i*w3i +& 2*w1r**2*rhogsol*rhogeq*k**2*cs**2*w1i**2*rhodeq*w2i*w3r**2 +& 2*w1r**2*rhogsol*rhogeq*k**2*cs**2*w1i**2*rhodeq*w2i**2*w3i -& w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*w1i**2*rhodeq*w3r*w2r - 2*rhogsol*rhogeq*k**4*cs**4*w1i**2*rhodeq*w3r*w2r*w3i& + 2*rhogsol*rhogeq*k**4*cs**4*w1i**2*rhodeq*w2i**2*w3i + 2*rhogsol*rhogeq*k**4*cs**4*w1i**2*rhodeq*w2i*w3i**2 +& 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2i**2*w3i**3 + 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2i*w2r**2*w3i**2 +& 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2i**3*w3i**2 + 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2i**2*w3i -& 2*rhogsol*rhogeq*k**4*cs**4*w1i**2*rhodeq*w3r*w2r*w2i +& 2*w1r**2*rhogsol*rhogeq*k**2*cs**2*w1i**2*rhodeq*w2i*w3i**2 +& 2*w1r**2*rhogsol*rhogeq*k**2*cs**2*w1i**2*rhodeq*w2r**2*w3i +& 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2i**3 + 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2r**2*w3i +& 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2r**2*w3i**3 + 2*Kdrag*vgsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w2r*w2i*w3i& + 2*Kdrag*vgsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w2r*w3i**2 -& 2*Kdrag*vdsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w2r*w3i**2 +& 2*Kdrag*vgsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w2i**2*w3r -& 2*Kdrag*vdsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w2i**2*w3r -& 2*Kdrag*vdsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w3r*w2i*w3i + w1r**3*vgsol*k*rhogeq**2*rhodeq*w3r**2*w2i**3 -& 2*Kdrag*vdsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w2r*w2i*w3i +& 2*Kdrag*vgsol*rhogeq*k**3*cs**2*w1i**2*rhodeq*w3r*w2i*w3i +& 2*w1i*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2i*w2r**2 - w1i*vgsol*Kdrag**2*k*rhodeq*w3r**3*w2i**2 -& w1i*vgsol*Kdrag**2*k*rhodeq*w3r**3*w2r**2 - w1i*vgsol*Kdrag**2*k*rhodeq*w2r**3*w3r**2 -& w1i*vgsol*Kdrag**2*k*rhodeq*w2r*w2i**2*w3r**2 - w1i*vgsol*Kdrag**2*k*rhodeq*w2r*w2i**2*w3i**2 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r**3*w2r**2 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i**2*w3r**2 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i*w3r**2*w3i -& 2*w1i*w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r*w3r**2 - 2*w1i*w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2i**2*w3r -& 2*w1i*w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r**2*w3r - 2*w1i*w1r*rhogsol*rhogeq*k**4*cs**4*rhodeq*w2r*w3i**2 -& w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w2i**3*w3i - 3*w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3i**2*w2i**2) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w2r**2*w3i**2 + 2*w1r**2*rhogsol*Kdrag*w1i**2*rhodeq*w3r**2*w2r**2 +& 2*w1r**2*rhogsol*Kdrag*w1i**2*rhodeq*w3i**2*w2i**2 + 2*w1r**2*rhogsol*Kdrag*w1i**2*rhodeq*w2r**2*w3i**2 -& w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3i*w2i*w3r**2 + w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r**2*w2r**2 +& w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w2r*w3r*w3i**2 + w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r**2*w2i**2 +& 4*w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r*w2r*w2i*w3i + w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r*w2r**3 +& w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r*w2r*w2i**2 - w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3i**3*w2i -& w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w2i*w3i*w2r**2 - 2*w1i*w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i*w3r**2& - 2*w1i*w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i**2*w3i -& 2*w1i*w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2i*w3i**2 -& 2*w1i*w1r*vdsol*Kdrag*rhogeq*k**3*cs**2*rhodeq*w2r**2*w3i + 2*w1r**2*rhogsol*Kdrag*w1i**2*rhodeq*w3r**2*w2i**2& + rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r**2*w2i**2*w3i - 2*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3i*w3r*w2r**3 -& 2*rhogsol*k**4*cs**4*rhogeq*rhodeq*w2r*w3r*w2i*w3i**2 + rhogsol*k**4*cs**4*rhogeq*rhodeq*w2i**3*w3i**2 +& rhogsol*k**4*cs**4*rhogeq*rhodeq*w2i*w2r**2*w3i**2 - rhogsol*k**4*cs**4*rhogeq*rhodeq*w2r**2*w3i**3 +& w1i*rhogsol*k**4*cs**4*rhogeq*rhodeq*w2r*w3r**3 + w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**4*w2i -& 2*rhogsol*k**4*cs**4*rhogeq*rhodeq*w2r*w3r**3*w2i - rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r**2*w2i*w2r**2 -& rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r**2*w2r**2*w3i - 2*rhogsol*k**4*cs**4*rhogeq*rhodeq*w3i*w3r*w2i**2*w2r +& w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i*w2r**4 + w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i*w2i**4 +& 2*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i*w2r**2*w2i**2 +& w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3r**4*w2i + 4*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w2r*w3r**3*w2i +& 2*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i**2*w2i*w3r**2 + vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w2i*w2r**2*w3i**3& + rhogsol*k**4*cs**4*rhogeq*rhodeq*w2i**2*w3i**3 - vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w2r*w3r*w2i**2*w3i**2 +& 4*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i*w3r*w2i**2*w2r +& 4*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w3i*w3r*w2r**3 +& 4*w1r**2*rhogsol*rhogeq*k**2*cs**2*rhodeq*w2r*w3r*w2i*w3i**2 - rhogsol*k**4*cs**4*rhogeq*rhodeq*w3r**2*w2i**3 -& vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w3r**3*w2r**3 + w1i*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3i**2 -& vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w2r*w3r**3*w2i**2 + vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w2i**3*w3i*w3r**2 +& vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w2i*w3i*w2r**2*w3r**2 - vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w3r*w2r**3*w3i**2 +& vdsol*Kdrag*k*w1r*rhogeq*rhodeq*w2i**3*w3i**3 + Kdrag*rhogeq*k*vgsol*rhodeq*w2r**3*w3i**4 +& Kdrag*rhogeq*k*vgsol*rhodeq*w2r*w3i**4*w2i**2 + 2*Kdrag*rhogeq*k*vgsol*rhodeq*w3r*w2r**2*w3i**2*w2i**2 -& w1i*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3r**2 -& w1i*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r**2*w3r +& w1i*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2i**2*w3r +& 2*w1i*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2i*w3i +& 2*w1i*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i*w3i +& 2*Kdrag*rhogeq*k*vgsol*rhodeq*w2r*w3i**2*w2i**2*w3r**2 + Kdrag*rhogeq*k*vgsol*rhodeq*w3r*w2r**4*w3i**2 +& Kdrag*rhogeq*k*vgsol*rhodeq*w3r*w2i**4*w3i**2 + Kdrag*rhogeq*k*vgsol*rhodeq*w3r**3*w2i**4 +& Kdrag*rhogeq*k*vgsol*rhodeq*w3r**3*w2r**4 + 2*Kdrag*rhogeq*k*vgsol*rhodeq*w2r**3*w3i**2*w3r**2 +& Kdrag*rhogeq*k*vgsol*rhodeq*w2r*w2i**2*w3r**4 + 2*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**3*w2r**2*w2i**2 -& vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3i**3 + vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3i*w2i**2 +& 2*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i*w3i**2 -& 2*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w3i*w3r*w2r**2 + vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r**3*w3i& - vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2i**3) !--break to avoid too many continuation lines rhod1i = rhod1i - ( & 2*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w3i*w3r*w2i**2 +& 2*w1r*cs**2*k**2*rhogsol*w1i*rhogeq*rhodeq*w2r**3*w3i**2 -& vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3i*w3r**2 -& vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2i*w2r**2 + vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w3r**3*w2i -& 2*vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i*w3r**2 -& vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w2i**2*w3i**2 + vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2r**2*w3i**2& - vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w3r*w2i**2*w3i**2 -& 2*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2i*w3i*w3r*w2r**2 -& 2*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w2i*w3r**2*w3i -& 2*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2i**3*w3i*w3r - vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r**3*w3i**2 -& 2*vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w2i*w3i**3 + vdsol*Kdrag*k**3*cs**2*rhogeq*rhodeq*w2r*w2i**2*w3r**2& + 2*vgsol*k**3*cs**2*rhogeq**2*w1i**3*rhodeq*w3r*w2i*w3i + vgsol*k**3*cs**2*rhogeq**2*w1i**3*rhodeq*w2r*w3i**2& + w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w3i**3*w2r**3 + w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w3i*w2i**2*w3r**2*w2r +& w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w3r*w2i**3*w3i**2 + w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w3r*w2r**2*w2i*w3i**2 +& w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w2r*w2i**2*w3i**3 - 2*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3i**2*w2i**2*w2r**2 +& w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w2i**3*w3r**3 + w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**3*w2i*w2r**2 +& w1i*Kdrag*rhogeq*k*vgsol*rhodeq*w3i*w2r**3*w3r**2 - w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3i**2*w2i**4 -& w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3i**4*w2i**2 - 3*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2i*w3i*w2r**2*w3r**2 -& 2*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2i**2*w2r**2 - w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2r**4*w3i**2 -& w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3i**4*w2r**2 - 3*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2i*w2r**2*w3i**3 -& 3*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2i**3*w3i**3 + vgsol*w1r**2*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2i*w3i**2 +& Kdrag*rhogeq*k*vgsol*rhodeq*w2r**3*w3r**4 - 2*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2i**2*w3i**2 -& 2*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2r**2*w3i**2 - w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2r*w3r*w2i**2*w3i**2& - 3*w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2i**3*w3i*w3r**2 - w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2i**4 -& w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**2*w2r**4 - w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**4*w2r**2 -& w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**3*w2r**3 - w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w2r*w3r**3*w2i**2 +& rhogsol*rhogeq*k**2*cs**2*w1r**4*rhodeq*w2i*w3r**2 + rhogsol*rhogeq*k**2*cs**2*w1r**4*rhodeq*w2i**2*w3i +& rhogsol*rhogeq*k**2*cs**2*w1r**4*rhodeq*w2i*w3i**2 + rhogsol*rhogeq*k**2*cs**2*w1r**4*rhodeq*w2r**2*w3i -& w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r**4*w2i**2 - w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r**4*w3r -& w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2i**4 - 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2i**3*w3i*w3r -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2i**2*w3r*w2r**2 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2i*w3i*w3r*w2r**2 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w3r*w2r**2*w3i**2 - w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3i**4 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w2i*w3i**3 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3i**2*w3r**2 -& 2*w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r**3*w3r**2 - w1i*vgsol*k**3*cs**2*rhogeq**2*rhodeq*w2r*w3r**4 -& w1i*vgsol*Kdrag**2*k*rhodeq*w3r*w2i**2*w3i**2 - w1i*vgsol*Kdrag**2*k*rhodeq*w3r*w2r**2*w3i**2 -& w1i*vgsol*Kdrag**2*k*rhodeq*w2r**3*w3i**2 - w1r*Kdrag*rhogeq*k*vgsol*rhodeq*w3r*w2r**3*w3i**2) rhod1i = rhod1i/(w1i**2 -& 2*w3i*w1i + w3r**2 + w1r**2 + w3i**2 - 2*w3r*w1r)/(w3r**2 + w3i**2)/Kdrag/(w2r**2 + w1r**2 + w2i**2 - 2*w2i*w1i& - 2*w2r*w1r + w1i**2)/rhogeq/(w2i**2 + w2r**2) endif !print*,'w1 = ',w1r,w1i !print*,'w2 = ',w2r,w2i !print*,'w3 = ',w3r,w3i !if (iplot==2) then ! print "(a,3('(',es10.3,',',es10.3,') '))",' vgas = ',vg1r,vg1i,vg2r,vg2i,vg3r,vg3i ! if (Kdrag > 0.) then ! print "(a,3('(',es10.3,',',es10.3,') '))",' vdust = ',vd1r,vd1i,vd2r,vd2i,vd3r,vd3i ! endif !else ! print "(a,3('(',es10.3,',',es10.3,') '))",' rhog = ',rhog1r,rhog1i,rhog2r,rhog2i,rhog3r,rhog3i ! if (Kdrag > 0.) then ! print "(a,3('(',es10.3,',',es10.3,') '))",' rhod = ',rhod1r,rhod1i,rhod2r,rhod2i,rhod3r,rhod3i ! endif !endif !------------------------------- ! F I N A L S O L U T I O N !------------------------------- do i=1,size(xplot) xk = 2.*pi/lambda*(xplot(i)-x0) arg1 = xk - w1r*time arg2 = xk - w2r*time arg3 = xk - w3r*time vgas = vgeq & + vg1r*exp(w1i*time)*cos(arg1) - vg1i*exp(w1i*time)*sin(arg1) & + vg2r*exp(w2i*time)*cos(arg2) - vg2i*exp(w2i*time)*sin(arg2) & + vg3r*exp(w3i*time)*cos(arg3) - vg3i*exp(w3i*time)*sin(arg3) vdust = vdeq & + vd1r*exp(w1i*time)*cos(arg1) - vd1i*exp(w1i*time)*sin(arg1) & + vd2r*exp(w2i*time)*cos(arg2) - vd2i*exp(w2i*time)*sin(arg2) & + vd3r*exp(w3i*time)*cos(arg3) - vd3i*exp(w3i*time)*sin(arg3) rhogas = rhogeq & + rhog1r*exp(w1i*time)*cos(arg1) - rhog1i*exp(w1i*time)*sin(arg1) & + rhog2r*exp(w2i*time)*cos(arg2) - rhog2i*exp(w2i*time)*sin(arg2) & + rhog3r*exp(w3i*time)*cos(arg3) - rhog3i*exp(w3i*time)*sin(arg3) rhodust = rhodeq & + rhod1r*exp(w1i*time)*cos(arg1) - rhod1i*exp(w1i*time)*sin(arg1) & + rhod2r*exp(w2i*time)*cos(arg2) - rhod2i*exp(w2i*time)*sin(arg2) & + rhod3r*exp(w3i*time)*cos(arg3) - rhod3i*exp(w3i*time)*sin(arg3) select case(iplot) case(4) yplot(i) = rhodust case(3) yplot(i) = rhogas case(2) yplot(i) = vdust case default yplot(i) = vgas end select enddo return end subroutine exact_dustywave end module dustywaves danieljprice-splash-4d1f09c/src/exact_fromfile.f90000066400000000000000000000062321477365367100221730ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------ ! reads an exact solution from a file ! ! file should contain two or more columns containing ! x axis data and y axis data ! ! this is plotted as a line on the chosen graph !------------------------------------------------ module exactfromfile implicit none public :: exact_fromfile private contains subroutine exact_fromfile(filename,xexact,yexact,ixcolfile,iycolfile,iexactpts,ierr) use asciiutils, only:get_ncolumns,get_nrows character(len=*), intent(in) :: filename real, intent(inout), dimension(:), allocatable :: xexact, yexact integer, intent(in) :: ixcolfile,iycolfile integer, intent(out) :: iexactpts, ierr integer :: i,j,ncolumns,nheaderlines,nrows integer, parameter :: lu = 33 character(len=10) :: str real :: dum ierr = 0 open(unit=lu,file=filename,iostat=ierr,status='old',form='formatted') if (ierr /= 0) then ierr = 1 print*,'error opening ',filename return endif !--query number of header lines call get_ncolumns(lu,ncolumns,nheaderlines) call get_nrows(lu,nheaderlines,nrows) rewind(lu) if (nrows > size(xexact) .or. nrows > size(yexact)) then if (allocated(xexact)) deallocate(xexact) if (allocated(yexact)) deallocate(yexact) allocate(xexact(nrows),yexact(nrows)) endif !--skip header lines do i=1,nheaderlines read(lu,*) enddo !--read data from file do i=1,size(xexact) if (ixcolfile > iycolfile) then read(lu,*,end=10,err=20) (dum,j=1,iycolfile-1),yexact(i),(dum,j=iycolfile+1,ixcolfile-1),xexact(i) elseif (ixcolfile==iycolfile) then read(lu,*,end=10,err=20) (dum,j=1,ixcolfile-1),xexact(i) yexact(i) = xexact(i) else read(lu,*,end=10,err=20) (dum,j=1,ixcolfile-1),xexact(i),(dum,j=ixcolfile+1,iycolfile-1),yexact(i) endif enddo read(lu,*,end=10,iostat=ierr) ! read one more line to see if we are at the end print*,'WARNING: reached array limits in ',trim(filename),': partial solution read' ierr = -1 close(lu) return 10 continue iexactpts = i-1 write(str,"(i10)") iexactpts print "(a)",' finished reading '//trim(filename)//': '//trim(adjustl(str))//' read' close(lu) return 20 print*,'error reading ',trim(filename),': partial solution read' iexactpts = i - 1 ierr = -2 close(lu) return end subroutine exact_fromfile end module exactfromfile danieljprice-splash-4d1f09c/src/exact_function.f90000066400000000000000000000155261477365367100222230ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2016 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! Plots arbitrary analytic function y = f(x) ! Uses the function parser module !---------------------------------------------------------------------- module exactfunction implicit none contains subroutine exact_function(string,xplot,yplot,time,ierr) use fparser, only:initf,evalf,endf,EvalErrType,EvalErrMsg,rn character(len=*), intent(in) :: string real, intent(in), dimension(:) :: xplot real, intent(in) :: time real, intent(out), dimension(size(xplot)) :: yplot integer, intent(out) :: ierr integer :: i,j,nvars real(kind=rn), dimension(:), allocatable :: val print "(a)",' Plotting function f(x) = '//trim(string) if (len_trim(string) <= 0) then print "(a)",' *** ERROR: blank function string in exact_function call' ierr = 1 return endif ierr = 0 ! !--work out how many subfunctions the string contains ! and allocate memory for the sub function values appropriately ! call get_nvars(string,nvars) allocate(val(nvars),stat=ierr) if (ierr /= 0) then print "(a)",' ERROR allocating memory for ',nvars,' sub-functions in exact_function' if (allocated(val)) deallocate(val) return endif call initf(nvars) call parse_subfunctions(string,nvars,.false.,ierr) if (EvalErrType /= 0) then print "(a)",' *** ERROR parsing function: '//trim(EvalerrMsg())//' ***' ierr = EvalErrType else do i=1,size(xplot) val(1) = xplot(i) ! type conversion here val(2) = time ! type conversion here !--evaluate sub-functions in order of dependency do j=3,nvars val(j) = evalf(j,val(1:j-1)) enddo yplot(i) = real(evalf(1,val(1:nvars))) ! type conversion back if (EvalErrType /= 0) ierr = EvalErrType enddo if (ierr /= 0) then print "(a)",' *** ERROR during function evaluation: '//trim(EvalerrMsg(ierr)) !--set exit error to zero so we plot the results anyway ierr = 0 endif endif call endf if (allocated(val)) deallocate(val) return end subroutine exact_function !---------------------------------------------------------------- ! check syntax in the function string - this subroutine ! mainly just an interface to checking routines in fparser !---------------------------------------------------------------- subroutine check_function(string,ierr,verbose) ! use fparser, only:checkf character(len=*), intent(in) :: string integer, intent(out) :: ierr logical, intent(in), optional :: verbose integer :: nvars call get_nvars(string,nvars) if (present(verbose)) then call parse_subfunctions(string,nvars,.true.,ierr,verbose=verbose) else call parse_subfunctions(string,nvars,.true.,ierr) endif ! ierr = checkf(string,(/'x'/)) end subroutine check_function !---------------------------------------------------------------- ! allow sub-function syntax (f(x) = y, y = 24*x) !---------------------------------------------------------------- subroutine parse_subfunctions(string,nvars,check,ierr,verbose) use fparser, only:checkf,parsef,EvalErrMsg,EvalErrType character(len=*), intent(in) :: string integer, intent(in) :: nvars logical, intent(in) :: check integer, intent(out) :: ierr logical, intent(in), optional :: verbose character(len=len(string)), dimension(nvars) :: var integer :: ieq,ivars,ivarsinit,lstr,j,icommaprev logical :: iverb iverb = .true. if (present(verbose)) iverb = verbose var(1) = 'x' var(2) = 't' ivarsinit = 2 ivars = ivarsinit lstr = len_trim(string) icommaprev = lstr+1 do j=lstr,1,-1 ! !--split the string according to commas ! if (string(j:j)==',') then !--sub functions must be of the form f(var) = val ieq = j + index(string(j+1:lstr),'=') if (ieq==j) then print "(a)",'*** Error in sub-function syntax, missing equals sign in comma-separated function list' ierr = 4 return endif !--variable is what lies to left of equals sign ivars = ivars + 1 var(ivars) = string(j+1:ieq-1) if (len_trim(var(ivars)) <= 0) then print "(a)",'*** Error in sub-function syntax, blank variable ' ierr = 3 return endif !--function is what lies to right of equals sign if (check) then if (iverb) then if (ivars==ivarsinit+1) print "(a)",'Evaluating sub-functions in the order:' print "(a)",trim(var(ivars))//' = '//string(ieq+1:icommaprev-1) endif ierr = checkf(string(ieq+1:icommaprev-1),var(1:ivars-1)) if (ierr /= 0) return else call parsef(ivars,string(ieq+1:icommaprev-1),var(1:ivars-1)) if (EvalErrType /= 0) then print "(a)",' *** ERROR parsing function: '//trim(EvalerrMsg())//' ***' ierr = EvalErrType return endif endif icommaprev = j endif enddo if (ivars /= nvars) then print "(a)",' Internal consistency error in parse_subfunctions:' print*,' nvars ',ivars,' not equal to that obtained in get_nvars, ',nvars endif ! !--finally, check/parse combined function ! if (check) then if (ivars >= ivarsinit .and. iverb) print "(1x,a)",'f('//trim(var(1))//') = '//string(1:icommaprev-1) ierr = checkf(string(1:icommaprev-1),var(1:ivars)) else call parsef(1,string(1:icommaprev-1),var(1:ivars)) if (EvalErrType /= 0) then print "(a)",' *** ERROR parsing function: '//trim(EvalerrMsg())//' ***' ierr = EvalErrType endif endif end subroutine parse_subfunctions !---------------------------------------------------------------- ! query the number of sub-functions (number of commas) !---------------------------------------------------------------- subroutine get_nvars(string,nvars) character(len=*), intent(in) :: string integer, intent(out) :: nvars integer :: j nvars = 2 do j=1,len_trim(string) if (string(j:j)==',') nvars = nvars + 1 enddo end subroutine get_nvars end module exactfunction danieljprice-splash-4d1f09c/src/exact_gresho.f90000066400000000000000000000035141477365367100216570ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! compute exact solution for gresho vortex problem ! ---------------------------------------------------------------------- module gresho implicit none contains subroutine exact_gresho(iplot,xplot,yplot,ierr) integer, intent(in) :: iplot real, intent(in), dimension(:) :: xplot real, intent(out), dimension(size(xplot)) :: yplot integer, intent(out) :: ierr print*,'plotting gresho vortex ' ! ! check for errors ! ierr = 0 select case(iplot) case(2) ! pressure where (xplot < 0.2) yplot = 5. + 12.5*xplot**2 elsewhere (xplot < 0.4) yplot = 9. + 12.5*xplot**2 - 20.*xplot + 4.*log(5.*xplot) elsewhere yplot = 3. + 4.*log(2.) end where case(1) ! vphi where (xplot < 0.2) yplot = 5.*xplot elsewhere (xplot < 0.4) yplot = 2. - 5.*xplot elsewhere yplot = 0. end where end select return end subroutine exact_gresho end module gresho danieljprice-splash-4d1f09c/src/exact_mhdshock.f90000066400000000000000000000246261477365367100221770ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! Plot exact solution for a magnetohydrodynamic shock ! (ie. one dimensional MHD Riemann problem) ! ! For want of a better solution these are just taken from the tables in ! Ryu & Jones (1995), ApJ 442, 228 or from ruler and pencil ! on the results in Balsara (1998), or from running the Athena code via ! http://rainman.astro.illinois.edu/ddr/oned/cgi-bin/athena.pl ! ! ---------------------------------------------------------------------- module mhdshock implicit none public :: exact_mhdshock integer, parameter, public :: nmhdshocksolns = 7 character(len=23), dimension(nmhdshocksolns), parameter, public :: mhdprob = & (/'Brio/Wu (gamma=2) ', & 'fast/slow shock (RJ95)', & '7 jump shock (RJ95)', & 'isothermal shock (B98) ', & 'rarefaction wave (RJ95)', & 'Mach 25 shock (DW94)', & 'Toth shock (RJ95/T00)'/) contains subroutine exact_mhdshock(iplot,ishk,time,gamma,xmin,xmax,xshock,xpts,ypts,npts,ierr) integer, intent(in) :: iplot,ishk integer, intent(out) :: npts,ierr real, intent(in) :: time,gamma,xmin,xmax,xshock real, dimension(:), intent(inout) :: xpts real, dimension(size(xpts)), intent(out) :: ypts real, dimension(16) :: rho,pr,vx,vy,vz,By,Bz real :: const, Bxzero,tfac print*,' Plotting exact mhd shock #',ishk,' at t = ',time ! !--set up grid for exact solution ! const = 1./sqrt(4.*3.1415926536) ierr = 0 select case(ishk) ! which solution to plot case(1) ! !--Brio & Wu problem with gamma = 2 ! tfac = time/0.1 vz = 0. Bz = 0. Bxzero = 0.75 npts = 14 xpts(1) = xmin xpts(2) = -0.18*tfac xpts(3) = -0.08*tfac xpts(4:6) = -0.03*tfac xpts(7) = -0.005*tfac xpts(8:9) = 0.06*tfac xpts(10:11) = 0.147*tfac xpts(12) = 0.33*tfac xpts(13) = 0.36*tfac xpts(14) = xmax rho(1:2) = 1.0 rho(3:4) = 0.67623 rho(5) = 0.827 rho(6) = 0.775 rho(7:8) = 0.6962 rho(9:10) = 0.2352 rho(11:12) = 0.117 rho(13:14) = 0.125 pr(1:2) = 1.0 pr(3:4) = 0.447 pr(5) = 0.727219 pr(6) = 0.6 pr(7:10) = 0.5160 pr(11:12) = 0.0876 pr(13:14) = 0.1 vx(1:2) = 0.0 vx(3:4) = 0.63721 vx(5) = 0.48 vx(6) = 0.52 vx(7:10) = 0.600 vx(11:12) = -0.24 vx(13:14) = 0.0 vy(1:2) = 0.0 vy(3:4) = -0.23345 vy(5) = -1.3 vy(6) = -1.4 vy(7:10) = -1.584 vy(11:12) = -0.166 vy(13:14) = 0. By(1:2) = 1.0 By(3:4) = 2.1*const By(5) = -1.2*const By(6) = -1.3*const By(7:10) = -1.9*const By(11:12) = -3.25*const By(13:14) = -1.0 case(2) ! !--fast/slow shock from RJ95 ! tfac = time/0.15 vz = 0. Bz = 0. Bxzero = 1.0 npts = 12 xpts(1) = xmin xpts(2) = -0.27*tfac xpts(3) = -0.09*tfac xpts(4) = -0.03*tfac xpts(5) = -0.01*tfac xpts(6:7) = 0.135*tfac xpts(8:9) = 0.25*tfac xpts(10:11) = 0.35*tfac xpts(12) = xmax rho(1:2) = 1.0 rho(3:4) = 0.5955 rho(5:6) = 0.55151 rho(7:8) = 0.41272 rho(9:10) = 0.2337 rho(11:12) = 0.2 pr(1:2) = 1.0 pr(3:4) = 0.42629 pr(5:8) = 0.37090 pr(9:10) = 0.12402 pr(11:12) = 0.1 vx(1:2) = 0.0 vx(3:4) = 0.81237 vx(5:8) = 0.89416 vx(9:10) = 0.24722 vx(11:12) = 0.0 vy(1:2) = 0.0 vy(3:4) = -0.59961 vy(5:8) = -0.5447 vy(9:10) = -0.91164 vy(11:12) = 0. By(1:2) = 1.0 By(3:4) = 0.28431 By(5:8) = 0.31528 By(9:10) = 0.43086 By(11:12) = 0.0 case(3) ! !--problem with 7 discontinuities from RJ95 ! tfac = time/0.2 Bxzero = 2.*const npts = 16 xpts(1) = xmin xpts(2:3) = -0.19*tfac xpts(4:5) = 0.03*tfac xpts(6:7) = 0.051*tfac xpts(8:9) = 0.12*tfac ! contact discontinuity xpts(10:11) = 0.18*tfac xpts(12:13) = 0.205*tfac xpts(14:15) = 0.45*tfac xpts(16) = xmax rho(1:2) = 1.08 rho(3:4) = 1.4903 rho(5:8) = 1.6343 rho(9:10) = 1.4735 rho(11:14) = 1.3090 rho(15:16) = 1.0 pr(1:2) = 0.95 pr(3:4) = 1.6558 pr(5:10) = 1.9317 pr(11:14) = 1.5844 pr(15:16) = 1.0 vx(1:2) = 1.2 vx(3:5) = 0.60588 vx(6:11) = 0.57538 vx(12:14) = 0.53432 vx(15:16) = 0.0 vy(1:2) = 0.01 vy(3:4) = 0.11235 vy(5:6) = 0.22157 vy(7:8) = 0.047602 vy(9:10) = 0.047601 vy(11:12) = -0.18411 vy(13:14) = -0.094572 vy(15:16) = 0.0 vz(1:2) = 0.5 vz(3:4) = 0.55686 vz(5:6) = 0.30125 vz(7:10) = 0.24734 vz(11:12) = 0.17554 vz(13:14) = -0.047286 vz(15:16) = 0.0 By(1:2) = 1.0155 By(3:4) = 1.4383 By(5:6) = 1.5716 By(7:10) = 1.4126 By(11:12) = 1.6103 By(13:14) = 1.5078 By(15:16) = 1.1284 Bz(1:2) = 0.56419 Bz(3:4) = 0.79907 Bz(5:6) = 0.48702 Bz(7:10) = 0.43772 Bz(11:12) = 0.49899 Bz(13:14) = 0.75392 Bz(15:16) = 0.56419 case(4) ! !--isothermal MHD problem from Balsara (1998) ! tfac = time/0.2 Bxzero = 2.*const npts = 14 xpts(1) = xmin xpts(2:3) = -0.15*tfac xpts(4:5) = 0.035*tfac xpts(6:7) = 0.07*tfac xpts(8:9) = 0.17*tfac xpts(10:11) = 0.2*tfac xpts(12:13) = 0.41*tfac xpts(14) = xmax rho(1:2) = 1.08 rho(3:6) = 1.515 rho(7:8) = 1.745 rho(9:12) = 1.36 rho(13:14) = 1.0 vx(1:2) = 1.2 vx(3:6) = 0.65 vx(7:8) = 0.62 vx(9:12) = 0.54 vx(13:14) = 0.0 vy(1:2) = 0.01 vy(3:4) = 0.13 vy(5:6) = 0.24 vy(7:8) = 0.071 vy(9:10) = -0.215 vy(11:12) = -0.125 vy(13:14) = 0.0 vz(1:2) = 0.5 vz(3:4) = 0.57 vz(5:6) = 0.31 vz(7:8) = 0.255 vz(9:10) = 0.165 vz(11:12) = -0.06 vz(13:14) = 0.0 By(1:2) = 3.6*const By(3:4) = 5.2*const By(5:6) = 5.7*const By(7:8) = 5.22*const By(9:10) = 5.96*const By(11:12) = 5.58*const By(13:14) = 4.0*const Bz(1:2) = 2.0*const Bz(3:4) = 2.885*const Bz(5:6) = 1.76*const Bz(7:8) = 1.62*const Bz(9:10) = 1.85*const Bz(11:12) = 2.79*const Bz(13:14) = 2.0*const pr = rho case(5) ! !--rarefaction from RJ95 ! tfac = time/0.1 npts = 6 vy = 0. vz = 0. Bz = 0. Bxzero = 0. xpts(1) = xmin xpts(2) = -0.27*tfac xpts(3) = -0.12*tfac xpts(4) = 0.12*tfac xpts(5) = 0.27*tfac xpts(6) = xmax rho(1:2) = 1.0 rho(3:4) = 0.49653 rho(5:6) = 1.0 pr(1:2) = 1.0 pr(3:4) = 0.31134 pr(5:6) = 1.0 vx(1:2) = -1.0 vx(3:4) = 0. ! this is approximate (to 10-7) vx(5:6) = 1.0 By(1:2) = 1.0 By(3:4) = 0.49638 By(5:6) = 1.0 case(6) ! !--mach 25 shocks from Dai and Woodward (1994) ! tfac = time/0.03 Bxzero = 4.*const npts = 6 rho(1:2) = 1.0 rho(3:4) = 3.982 rho(5:6) = 0.1 pr(1:2) = 1.0 pr(3:4) = 1806.0 pr(5:6) = 1.0 ! machno = 0.5*25.5 ! vs = sqrt(gamma*pr(1)/rho(1)) ! xpts(1) = xmin xpts(2:3) = -0.35*tfac xpts(4:5) = 0.35*tfac xpts(6) = xmax vx(1:2) = 36.87 vx(3:4) = 0.0 vx(5:6) = -36.87 vy(1:2) = -0.1546 vy(3:4) = -0.07727 vy(5:6) = 0.0 vz(1:2) = -0.03864 vz(3:4) = -0.01932 vz(5:6) = 0.0 By(1:2) = 4.0*const By(3:4) = 15.95*const By(5:6) = 4.0*const Bz(1:2) = 1.0*const Bz(3:4) = 3.988*const Bz(5:6) = 1.0*const case(7) ! !--Problem 1A in Ryu and Jones (1995) ! Bxzero = 5.*const npts = 12 tfac = time/0.08 xpts(1) = xmin xpts(2:3) = -0.386*tfac xpts(4:5) = -0.01*tfac xpts(6:7) = 0.0505*tfac xpts(8:9) = 0.12*tfac xpts(10:11) = 0.37*tfac xpts(12) = xmax rho(1:2) = 1.0 rho(3:4) = 2.6797 rho(5:6) = 2.6713 rho(7:8) = 3.8508 rho(9:10) = 3.7481 rho(11:12) = 1.0 pr(1:2) = 20.0 pr(3:4) = 150.98 pr(5:8) = 150.19 pr(9:10) = 143.57 pr(11:12) = 1.0 vx(1:2) = 10.0 vx(3:4) = 0.72113 vx(5:8) = 0.72376 vx(9:10) = 0.70505 vx(11:12) = -10.0 vy(1:2) = 0.0 vy(3:4) = 0.23139 vy(5:8) = 0.35684 vy(9:10) = -0.38804 vy(11:12) = 0.0 vz(1:12) = 0.0 By(1:2) = 1.4105 By(3:4) = 3.8389 By(5:8) = 4.0380 By(9:10) = 5.4272 By(11:12) = 1.4105 Bz(1:12) = 0.0 case default ierr = 1 npts = 0 ypts = 0. xpts = 0. return end select ! !--plot just the initial conditions at t=0 ! if (abs(time) <= 0.) then rho(1:2) = rho(1) pr(1:2) = pr(1) vx(1:2) = vx(1) vy(1:2) = vy(1) vz(1:2) = vz(1) By(1:2) = By(1) Bz(1:2) = Bz(1) xpts(3) = 0. xpts(4) = xpts(npts) rho(3:4) = rho(npts) pr(3:4) = pr(npts) vx(3:4) = vx(npts) vy(3:4) = vy(npts) vz(3:4) = vz(npts) By(3:4) = By(npts) Bz(3:4) = Bz(npts) npts = 4 endif ! !--translate positions if shock is not at x=0 ! xpts(:) = xpts(:) + xshock ! !--determine which parameter to plot ! select case(iplot) case(1) ypts(1:npts) = rho(1:npts) case(2) ypts(1:npts) = pr(1:npts) case(3) ypts(1:npts) = vx(1:npts) case(4) ypts(1:npts) = vy(1:npts) case(5) ypts(1:npts) = vz(1:npts) case(6) ypts(1:npts) = By(1:npts) case(7) ypts(1:npts) = Bz(1:npts) case(8) print*,'gamma = ',gamma if (abs(gamma-1.) > 1.e-5) then where (abs(rho(1:npts)) > 0.) ypts(1:npts) = pr(1:npts) / ((gamma-1.)*rho(1:npts)) end where else print*,' ***isothermal: utherm solution not valid' ypts(1:npts) = 0. endif case(9) ypts(1:npts) = Bxzero case default print*,'error: unknown solution to plot' end select return end subroutine exact_mhdshock end module mhdshock danieljprice-splash-4d1f09c/src/exact_planetdisc.f90000066400000000000000000000156341477365367100225240ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2017 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------------------------------------------- ! compute exact solution for various spiral structures: ! ! 1) planet-disc interaction in phi-r plane ! (Ogilvie & Lubow (2002), MNRAS 330, 950) ! 2) planet-disc interaction from Rafikov (2002) ! 3) general parameterised spiral arms !--------------------------------------------------------------------------- module planetdisc implicit none public :: exact_planetdisc integer, parameter :: maxspirals = 2 integer, parameter :: maxcoeff = 5 character(len=*), dimension(maxspirals), parameter, public :: labelspiral = & (/'Planet-disc interaction (Rafikov 2002; Ogilvie & Lubow 2002)',& 'Spiral arm fitting formula r(phi) = sum(a_i*phi^i,i=1,4) '/) contains subroutine exact_planetdisc(iplot,ispiral,use_clockwise,time,HonR,rplanet,q,phi0,narms,params,rplot,yplot,ierr) use plotlib, only:plot_line use geometry, only:set_planet_wake,planet_wake_t integer, intent(in) :: iplot,ispiral,narms logical, intent(in) :: use_clockwise integer, intent(out) :: ierr real, intent(in) :: time, HonR, rplanet, q, phi0, params(:,:) real, dimension(:), intent(inout) :: rplot real, dimension(size(rplot)), intent(out) :: yplot integer :: npts,iend,istart integer :: i,j,norbits,iarm logical :: use_ogilvie,use_nonlin real :: r,rr,phase,dr,phi,rmin,rmax,phimin,phimax,dphi,coeff(maxcoeff) real, parameter :: pi = 4.*atan(1.) real :: p,t0,dt,dir p = 0.5 t0 = 0. ierr = 0 npts = size(rplot) norbits = int(time/(2.*pi)) phase = phi0*pi/180. ! convert to radians !if (time > 0.) phase = phase + (time - (2.*pi*norbits)) use_ogilvie = .false. use_nonlin = .false. if (use_clockwise) then dir = -1. else dir = 1. endif select case(ispiral) case(2) print "(a,i2)",' Spiral arm fitting formula r = sum(a_i*phi^i,i=1,4) narms =',narms case default print "(a,f6.2,a,f8.1,a)",' Planet-disc interaction: H/R=',HonR,' q = ',q use_ogilvie = (abs(q - 0.5) < epsilon(q)) if (use_ogilvie) then print "(a)",' Using Ogilvie & Lubow (2002) exact solution' elseif (use_nonlin) then print "(a)",' Using Rafikov (2002) exact solution for power-law disc + CR21 non-linear corrections' else print "(a)",' Using Rafikov (2002) exact solution for power-law disc' endif end select select case(iplot) case(8) ! in planet-wake coordinates yplot(1:npts) = 0. ! planet wake is a straight line at eta=0 case(2) ! in phi-r plane istart = 1 do i=1,npts r = rplot(i) if (use_ogilvie) then ! ! Ogilvie & Lubow (2002) ! if (r > rplanet) then yplot(i) = phase - 2./(3.*HonR)*(sqrt(r**3) - 1.5*log(r) - 1.) else yplot(i) = phase + 2./(3.*HonR)*(sqrt(r**3) - 1.5*log(r) - 1.) endif else ! ! Rafikov (2002) ! rr = r/rplanet yplot(i) = phase + sign(1.,r-rplanet)*(1./(HonR))* & ((rr**(q-0.5))/(q-0.5) - (rr**(q+1.))/(q+1.) - 3./((2.*q-1.)*(q+1.))) endif if (yplot(i) > pi) then phase = phase - 2.*pi if (i > 1) then iend = i call plot_line(iend-istart+1,rplot(istart:iend),yplot(istart:iend)) istart = i+1 endif endif if (yplot(i) <= -pi) then phase = phase + 2.*pi ! plot separate line segments every time we cross the phase boundary if (i > 1) then iend = i call plot_line(iend-istart+1,rplot(istart:iend),yplot(istart:iend)) istart = i+1 endif endif enddo ierr = 1 ! do not plot outside this routine return case default ! in x-y plane ! define npts outside planet orbit rmin = 1.e-3 rmax = min(max(maxval(rplot),abs(minval(rplot))),5.*rplanet) dr = (rmax - rmin)/npts do iarm=1,narms if (ispiral==2) then phimin = params(1,iarm) + 90. ! add 90 deg for East of North convention phimax = params(2,iarm) + 90. coeff(:) = params(3:,iarm) dphi = (phimax - phimin)/npts !print*,' GOT RMIN = ',rmin,phimin,phimax, 'COEFFS=',coeff endif ! outside planet if (use_nonlin) then call set_planet_wake(rplanet,phase,p,q,HonR) t0 = 0. !1.89*3. !mp/mthermal endif do i=1,npts select case(ispiral) case(2) ! ! Spiral arm fitting formula ! phi = phimin + (i-1)*dphi r = 0. ! rmin do j=1,maxcoeff r = r + coeff(j)*((phi-phimin)*pi/180.)**(j-1) enddo phi = phi*pi/180. ! convert to radians case default r = rmax - (i-1)*dr rr = r/rplanet if (use_ogilvie) then ! ! Ogilvie & Lubow (2002) ! if (r > rplanet) then phi = phase - 2./(3.*HonR)*(sqrt(rr**3) - 1.5*log(rr) - 1.) else phi = phase + 2./(3.*HonR)*(sqrt(rr**3) - 1.5*log(rr) - 1.) endif else ! ! Rafikov (2002) ! phi = phase + sign(1.,r-rplanet)*(1./(HonR))* & ((rr**(q-0.5))/(q-0.5) - (rr**(q+1.))/(q+1.) - 3./((2.*q-1.)*(q+1.))) ! phi = phase-sign(1.,r-rplanet)*(1./(HonR))*(((r/rplanet)**(1.+q)) & ! *(1./(1.+q)-(1./(1.-p+q))*(r/rplanet)**(-p))-1./(1.+q)+1./(1.-p+q)) if (use_nonlin) then dt = planet_wake_t(r) - t0 if (dt > 0.) phi = phi + sign(1.,r-rplanet)*HonR*sqrt(dt) endif endif rplot(i) = dir*r*cos(phi) yplot(i) = r*sin(phi) end select !print*,'r, phi = ',r,phi,' : x, y = ',rplot(i),yplot(i) enddo call plot_line(npts,rplot,yplot) enddo ierr = 1 ! do not plot outside this routine end select end subroutine exact_planetdisc end module planetdisc danieljprice-splash-4d1f09c/src/exact_polytrope.f90000066400000000000000000000061711477365367100224270ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------- ! numerically integrate a polytrope ! with the density = 1 at the centre ! This uses scaled variables (no sigma in the equation) ! then the radius is scaled to give the correct mass ! Based on an old subroutine from Joe Monaghan !----------------------------------------- module polytrope implicit none public :: exact_polytrope contains subroutine exact_polytrope(gamma,polyk,totmass,rplot,denplot,npts,ierr) integer, intent(out) :: npts,ierr real, intent(in) :: gamma real, intent(in) :: polyk,totmass real, dimension(:), intent(inout) :: rplot real, dimension(size(rplot)), intent(out) :: denplot integer :: i,j real, parameter :: pi = 3.1415926536 real, dimension(size(rplot)) :: r,v,den real :: dr,an,rhs,rstar,totmassf real :: rhocentre,fac,rfac,G ierr = 0 print*,' gamma :',gamma dr = 0.001 G = 1. an = 1./(gamma-1.) v(1) = 0.0 v(2) = dr*(1.0 - dr*dr/6. ) r(1) = 0. i = 2 do while (v(i) >= 0.) r(i) = (i-1)*dr rhs = - r(i)*(v(i)/r(i))**an v(i+1) = 2*v(i) - v(i-1) + dr*dr*rhs i = i + 1 if (i+1 > size(rplot)) then dr = dr*2. r(2) = dr v(2) = dr*(1.0 - dr*dr/6. ) i = 2 endif enddo npts = i-1 rstar = r(npts) !-------------------------------------- ! calculate the mass out to radius r ! using the density without the central ! density multiplier- call this totmassf ! the true scaled totmass = 1. !---------------------------------------- den(1) = 1.0 totmassf = 0. do j = 2,npts den(j) = (v(j)/r(j))**an totmassf = totmassf + 4.*pi*r(j)*r(j)*den(j)*dr enddo !--------------------------------------------------- ! rescale the central density to give desired massq ! then rescale the radius to match this !--------------------------------------------------- fac = (gamma*polyk)/(4.*pi*G*(gamma - 1.)) rhocentre = ((totmass/totmassf)/fac**1.5)**(2./(3.*gamma - 4.)) rfac = sqrt(fac*rhocentre**(gamma - 2.)) print*,' Rstar = ',rstar*rfac print*,' central density :',rhocentre print*,' total mass :',totmass rplot = r * rfac denplot = rhocentre * den return end subroutine exact_polytrope end module polytrope danieljprice-splash-4d1f09c/src/exact_rhoh.f90000066400000000000000000000041351477365367100213300ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !---------------------------------------------------------- ! plots the relation between smoothing length and density ! ! ie. h = h_fact*(pmass/rho)^(1/ndim) ! !---------------------------------------------------------- module rhoh implicit none public :: exact_rhoh contains subroutine exact_rhoh(iplot,ndim,hfact,pmassval,xplot,yplot,ierr) integer, intent(in) :: iplot,ndim integer, intent(out) :: ierr real, intent(in) :: hfact,pmassval real, dimension(:), intent(in) :: xplot real, dimension(size(xplot)), intent(out) :: yplot if (hfact > 0.01) then ierr = 0 if (iplot==2) then ! x axis is h where (xplot > tiny(xplot)) yplot(:) = pmassval*(hfact/xplot(:))**ndim elsewhere yplot(:) = huge(yplot) end where else ! y axis is h where (xplot > tiny(xplot)) yplot(:) = hfact*(pmassval/xplot(:))**(1./FLOAT(ndim)) elsewhere yplot(:) = huge(yplot) end where endif write(*,"(a,f5.2,a,es9.2,a,i1,a)") ' plotting h = ',hfact, & '*(',pmassval,'/rho)**(1/',ndim,')' else print "(a)",'error: hfact = 0: can''t plot h vs rho exact solution' ierr = 1 endif return end subroutine exact_rhoh end module rhoh danieljprice-splash-4d1f09c/src/exact_ringspread.f90000066400000000000000000000224251477365367100225300ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! Plots Lynden-Bell & Pringle (1978) solution for viscous ! ring spreading in an accretion disk. ! ! Input: radius in disk ! Output: surface density ! ! D. Price, UofExeter 25.2.08 !---------------------------------------------------------------------- module ringspread implicit none public :: exact_ringspread, ringspreadfunc private contains subroutine exact_ringspread(iplot,time,Mdisk,Rdisk,viscnu,xplot,yplot,ierr) integer, intent(in) :: iplot real, intent(in) :: time,Mdisk,Rdisk,viscnu real, intent(in), dimension(:) :: xplot real, intent(out), dimension(size(xplot)) :: yplot integer, intent(out) :: ierr real, parameter :: pi = 3.1415926536 integer :: i real :: R2,sigma,tvisc double precision :: tau,x ! ! check for errors in input parameters ! ierr = 0 if (Mdisk <= 0.) then print*,'error: mass <= 0 in exact_ringspread' ierr = 2 return elseif (Rdisk <= 0.) then print*,'error: rdisk < 0 in exact_ringspread' ierr = 3 return elseif (viscnu <= tiny(viscnu)) then print*,'error: viscosity <= 0 in ringspreading solution' ierr = 4 return endif R2 = Rdisk*Rdisk tvisc = R2/(12.*viscnu) tau = time/tvisc print "(a,1pe9.2,a,1pe9.2,a,0pf6.2,a,f6.2)", & ' Plotting ring spreading solution: tau = ',tau,' nu = ',viscnu,' R0 = ',Rdisk,' M = ',Mdisk do i=1,size(xplot) x = xplot(i)/Rdisk sigma = Mdisk/real((pi*R2))*ringspreadfunc(x,tau) !print*,'x = ',xplot(i),Rdisk,tau,sigma select case(iplot) case(1) !--density yplot(i) = sigma case default !--pressure yplot(i) = 0. end select enddo return end subroutine exact_ringspread !---------------------------------------------------------------------- ! evaluates the surface density as a function of x and tau !---------------------------------------------------------------------- double precision function ringspreadfunc(x,tau) double precision, intent(in) :: x, tau double precision :: xfunc,besfunc,dummy,term if (tau <= epsilon(tau) .or. x <= tiny(x)) then ringspreadfunc = 0. else xfunc = 2.*x/tau term = exp(-(1.+x*x)/tau) !--prevent blowups at t=0: no point evaluating ! the Bessel function if the exp term is zero. if (term > tiny(term)) then call bessik(xfunc,0.25d0,besfunc,dummy,dummy,dummy) else besfunc = 0. endif ringspreadfunc = 1./(tau*x**0.25)*term*besfunc !print*,'ringspreadfunc = ',x,xfunc,-(1.+x*x)/tau,exp(-(1.+x*x)/tau),ringspreadfunc,xfunc,tau,besfunc endif return end function ringspreadfunc !---------------------------------------------------------------------- ! remainder of this file are routines for evaluating the modified ! Bessel function in the above solution !---------------------------------------------------------------------- subroutine bessik(x,xnu,ri,rk,rip,rkp) integer, parameter :: maxit = 10000 double precision, intent(in) :: x, xnu double precision, intent(out) :: ri,rip,rk,rkp double precision, parameter :: eps = 1.e-10, fpmin = 1.e-30, & xmin = 2., pi = 3.141592653589793d0 ! Returns the modified Bessel functions ri = I\nu, rk = K\nu and their ! derivatives rip = I'\nu and rkp = K'\nu, for positive x and for ! xn = \nu >= 0. The relative accuracy is within one or two significant ! digits of eps. ! ! All internal arithmetic in double precision ! ! This routine written by Daniel Price, UofExeter 25/2/08 ! Adapted from Press et. al. (1992) Numerical Recipes in FORTRAN 77 ! integer:: i,l,nl double precision :: a,a1,b,c,d,del,del1,delh,dels,e,f,fact,fact2, & ff,gam1,gam2,gammi,gampl,h,p,pimu,q,q1,q2,qnew,ril,ril1,rimu,rip1,ripl, & ritemp,rk1,rkmu,rkmup,rktemp,s,sum,sum1,x2,xi,xi2,xmu,xmu2 if (x <= 0. .or. xnu < 0.) then print*,' bad arguments in bessik ',x,xnu ! return endif nl = int(xnu+0.5d0) ! nl is the number of downward recurrences of the I's xmu = xnu - nl ! and upward recurrences of K's. xmu lies between xmu2 = xmu*xmu ! -1/2 and 1/2 xi = 1.d0/x xi2 = 2.d0*xi h = xnu*xi if (h < fpmin) h = fpmin b = xi2*xnu d = 0.d0 c = h do i=1,maxit b = b + xi2 d = 1.d0/(b + d) c = b + 1.d0/c del = c*d h = del*h if (abs(del-1.d0) < eps) goto 1 enddo print*,'x too large in bessik; try asymptotic expansion' 1 continue ril = fpmin ripl = h*ril ril1 = ril rip1 = ripl fact = xnu*xi do l=nl,1,-1 ritemp = fact*ril + ripl fact = fact - xi ripl = fact*ritemp + ril ril = ritemp enddo f = ripl/ril if (x < xmin) then x2 = 0.5d0*x pimu = pi*xmu if (abs(pimu) < eps) then fact = 1.d0 else fact = pimu/sin(pimu) endif d = -log(x2) e = xmu*d if (abs(e) < eps) then fact2 = 1.d0 else fact2 = sinh(e)/e endif ! Chebyshev evaluation of Gamma1, Gamma2 call beschb(xmu,gam1,gam2,gampl,gammi) ff = fact*(gam1*cosh(e) + gam2*fact2*d) ! f0 sum = ff e = exp(e) p = 0.5d0*e/gampl q = 0.5d0/(e*gammi) c = 1.d0 d = x2*x2 sum1 = p do i=1,maxit ff = (i*ff + p + q)/(i*i - xmu2) c = c*d/i p = p/(i - xmu) q = q/(i + xmu) del = c*ff sum = sum + del del1 = c*(p - i*ff) sum1 = sum1 + del1 if (abs(del) < abs(sum)*eps) goto 2 enddo print*,' bessk series failed to converge' 2 continue rkmu = sum rk1 = sum1*xi2 else b = 2.d0*(1.d0 + x) d = 1.d0/b delh = d h = delh q1 = 0.d0 q2 = 1.d0 a1 = 0.25d0 - xmu2 c = a1 q = c a = -a1 s = 1.d0 + q*delh do i=2,maxit a = a - 2*(i-1) c = -a*c/i qnew = (q1 - b*q2)/a q1 = q2 q2 = qnew q = q + c*qnew b = b + 2.d0 d = 1.d0/(b + a*d) delh = (b*d - 1.d0)*delh h = h + delh dels = q*delh s = s + dels if (abs(dels/s) < eps) goto 3 enddo print*,'bessik: failure to converge in cf2' 3 continue h = a1*h rkmu = sqrt(pi/(2.d0*x))*exp(-x)/s rk1 = rkmu*(xmu + x + 0.5d0 - h)*xi endif rkmup = xmu*xi*rkmu - rk1 rimu = xi/(f*rkmu - rkmup) ri = (rimu*ril1)/ril rip = (rimu*rip1)/ril do i=1,nl rktemp = (xmu + i)*xi2*rk1 + rkmu rkmu = rk1 rk1 = rktemp enddo rk = rkmu rkp = xnu*xi*rkmu - rk1 return end subroutine bessik subroutine beschb(x,gam1,gam2,gampl,gammi) integer, parameter :: nuse1=7,nuse2=8 double precision, intent(in) :: x double precision, intent(out) :: gam1,gam2,gammi,gampl ! ! Evaluates Gamma_1 and Gamma_2 by Chebyshev expansion for |x| < 1/2. ! Also returns 1/Gamma(1 + x) and 1/Gamma(1-x). ! ! In double precision, set NUSE1 = 7, NUSE2 = 8. ! In single precision, set NUSE1 = 2, NUSE2 = 5. ! ! This routine written by Daniel Price, UofExeter 25/2/08 ! Adapted from Press et. al. (1992) Numerical Recipes in FORTRAN 77 ! double precision :: xx,c1(7),c2(8) save c1,c2 data c1/-1.142022680371168d0, 6.5165112670737d-3, & 3.087090173086d-4, -3.4706269649d-6,6.9437664d-9, & 3.67795d-11,-1.356d-13/ data c2/1.843740587300905d0, -7.68528408447867d-2, & 1.2719271366546d-3, -4.9717367042d-6, -3.31261198d-8, & 2.423096d-10, -1.702d-13, -1.49d-15/ xx = 8.d0*x*x - 1.d0 ! multiply x by 2 to make range be -1 to 1, gam1 = chebev(-1.d0,1.d0,c1,NUSE1,xx) ! and then apply transformation for gam2 = chebev(-1.d0,1.d0,c2,NUSE2,xx) ! evaluating even Chebyshev series gampl = gam2 - x*gam1 gammi = gam2 + x*gam1 return end subroutine beschb double precision function chebev(a,b,c,m,x) integer, intent(in) :: m double precision, intent(in) :: a,b,x,c(m) ! ! Chebyshev evaluation: All arguments are input. c(1:m) is an array of ! Chebyshev coefficients, the first m elements of c output from chebft ! (which must have been called with the same a and b). The Chebyshev ! polynomial \sum_{k=1}^m c_k T_{k-1}(y) - c1/2 is evaluated at a ! point y = [ x - (b + a)/2 ] / [(b - a)/2], and the result is returned ! as the function value. ! ! This routine written by Daniel Price, UofExeter 25/2/08 ! Adapted from Press et. al. (1992) Numerical Recipes in FORTRAN 77 ! integer :: j double precision :: d, dd, sv, y, y2 if ((x-a)*(x-b) > 0.) then print*,'error: x not in range in chebev' chebev = 0. return endif d = 0. dd = 0. y = (2.*x - a - b)/(b - a) ! change of variable y2 = 2.*y do j=m,2,-1 ! Clenshaw's recurrence sv = d d = y2*d - dd + c(j) dd = sv enddo chebev = y*d - dd + 0.5*c(1) ! last step is different end function chebev end module ringspread danieljprice-splash-4d1f09c/src/exact_rochelobe.f90000066400000000000000000000173531477365367100223400ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------------- ! Plots Roche Lobes (equipotential surface) for a binary system ! Guts of it adapted from an original C routine by Simon Portugies-Zwart !----------------------------------------------------------------------- module rochelobe implicit none real, parameter :: roche_accuracy = 1.e-6 integer, parameter :: maxits = 100 contains !----------------------------------------------------------------------- ! Plot Roche Lobe ! ! INPUT: ! x1, y1 : position of primary ! x2, y2 : position of secondary ! m1, m2 : masses of components ! ! OUTPUT: ! xplot, yplot: contains (half of) the Roche lobe solution ! ierr : error condition to splash indicating plotting was done here !----------------------------------------------------------------------- subroutine exact_rochelobe(x1,y1,x2,y2,m1,m2,xplot,yplot,ierr) use plotlib, only:plot_line real, intent(in) :: x1,y1,x2,y2,m1,m2 real, dimension(:), intent(inout) :: xplot,yplot integer, intent(out) :: ierr real :: roche_radius1,roche_radius2,q,L1 real :: rlimit,llimit,xmax,xmin,ymax,xtmp real :: angle,cosangle,sinangle,dx,dy,sep integer :: i,npts npts = (size(xplot)-1)/2 if (npts < 1) return sep = sqrt((x2 - x1)**2 + (y2 - y1)**2) print "(4(a,es10.3))",' plotting Roche potential, m1 = ',m1,' m2 = ',m2,' sep = ',sep roche_radius1 = roche_radius(m1, m2) roche_radius2 = roche_radius(m2, m1) q = m2/m1 L1 = first_Lagrangian_point(1./q) ! We assume primary on the left if (m1 < m2) then q = 1/q L1 = first_Lagrangian_point(1./q) endif rlimit = right_limit(q, L1) llimit = left_limit(q, L1) call compute_lobes(q, L1, npts, xplot, yplot) xmin = xplot(1) xmax = xplot(2*npts) if (m1 < m2) then xtmp = xmin xmin = 1.-xmax xmax = 1.-xtmp endif ymax = -1000. do i=1,2*npts ymax = max(ymax,yplot(i)) enddo ! some tedious fiddling for q>1 case if (m1 < m2) then xplot(:) = 1. - xplot(:) endif ! scale to actual separation xplot = xplot*sep yplot = yplot*sep ! work out angle needed to rotate into corotating frame dx = x2 - x1 dy = y2 - y1 angle = -atan2(dy,dx) cosangle = cos(angle) sinangle = sin(angle) ! lobes are computed assuming primary is at the origin, so shift to xprim,yprim ! unrotated, this is just plot_line(xplot,yplot) and plot_line(xplot,-yplot) call plot_line(2*npts+1,xplot*cosangle + yplot*sinangle + x1,-xplot*sinangle + yplot*cosangle + y1) call plot_line(2*npts+1,xplot*cosangle - yplot*sinangle + x1,-xplot*sinangle - yplot*cosangle + y1) !--return non-zero ierr value as we do the plotting here ierr = 1 end subroutine exact_rochelobe ! ! calculates outer limit of roche-lobe ! subroutine rlimit(q, L, x, f, df, dummy) real, intent(in) :: q,L,x,dummy real, intent(out) :: f,df real :: qi,q11,cnst,r1,r2,r3 qi = 1./q q11 = 1./(1.+qi) cnst = qi/L+1./(1.-L)+0.5*(1.+qi)*(L-q11)**2 r1 = abs(x) r2 = abs(1-x) r3 = abs(x-q11) f = qi/r1+1./r2+0.5*(1.+qi)*r3**2 - cnst df = -qi*x/r1**3 +(1.-x)/r2**3 + (1.+qi)*(x-q11) end subroutine rlimit real function rtsafe(func,q,L,x1,x2,xll,xacc) real, intent(in) :: q,L,x1,x2,xll,xacc external :: func integer :: j real :: df,dx,dxold,f,fh,fl real :: temp,xh,xl,rts call func(q,L,x1,fl,df,xll) call func(q,L,x2,fh,df,xll) if ((fl > 0.0 .and. fh > 0.0) .or. (fl < 0.0 .and. fh < 0.0)) then !print*,'Error occured in rtsafe, exiting...',q,L,x1,x2,fl,fh rtsafe = 0. return endif if (abs(fl) < tiny(fl)) then rtsafe = x1 return endif if (abs(fh) < tiny(fh)) then rtsafe = x2 return endif call func(q, L, x1, f, df, xll) call func(q, L, x2, f, df, xll) if (fl < 0.0) then xl=x1 xh=x2 else xh=x1 xl=x2 endif rts = 0.5*(x1+x2) dxold = abs(x2-x1) dx = dxold call func(q, L, rts, f, df, xll) do j=1,maxits if ((((rts-xh)*df - f)*((rts-xl)*df - f) >= 0.0) & .or. (abs(2.0*f) > abs(dxold*df))) then dxold = dx dx = 0.5*(xh-xl) rts = xl+dx if (abs(xl-rts) < tiny(rts)) then rtsafe = rts return endif else dxold = dx dx = f/df temp = rts rts = rts - dx if (abs(temp-rts) < tiny(rts)) then rtsafe = rts return endif endif if (abs(dx) < xacc) then rtsafe = rts return endif call func(q, L, rts, f, df, xll) if (f < 0.0) then xl = rts else xh = rts endif enddo rtsafe = 0. return end function rtsafe real function left_limit(q, L) real, intent(in) :: q,L left_limit = rtsafe(rlimit,q,L,-0.5*L,-L,0., roche_accuracy); end function left_limit real function right_limit(q, L) real, intent(in) :: q,L right_limit = rtsafe(rlimit,q,L,1.5-0.5*L,2.0-L,0., roche_accuracy); end function right_limit ! ! return roche radius as fraction of the semi-major axis. ! So to obtain the true roche_radius call: ! real Rl = semi_major_axis * roche_radius(m1, m2); ! Eggleton PP., ApJ, 1983, 268, 368. ! real function roche_radius(mthis, mother) real, intent(in) :: mthis,mother real :: mr,q1_3,q2_3 mr = mthis/mother q1_3 = mr**(1./3.) q2_3 = q1_3**2 roche_radius = 0.49*q2_3/(0.6*q2_3 + log(1 + q1_3)) end function roche_radius real function first_Lagrangian_point(qinv) real, intent(in) :: qinv real :: fL, dfL, dL, L, q11 q11 = 1./(1.+qinv) L = 0.5 + 0.2222222*log10(qinv) dL = 1.e7 do while (abs(dL)>1.e-6) fL = qinv/L**2- 1./(1.-L)**2 - (1.+qinv)*L + 1. dfL=-2*qinv/L**3 - 2./(1.-L)**3 - (1.+qinv) dL = -fL/(dfL*L) L = L*(1.+dL) enddo first_Lagrangian_point = L end function first_Lagrangian_point subroutine rline(q, L, y, f, df, xl) real, intent(in) :: q, L, y, xl real, intent(out) :: f, df real :: xsq,onexsq,qi,q11,cnst,cnst2,r1,r2 xsq=xl*xl onexsq=(1.-xl)**2 qi=q q11=1./(1.+qi) cnst =qi/L+1./(1.-L) + 0.5*(1.+qi)*(L-q11)**2 cnst2=0.5*(1.+qi)*(xl-q11)**2 - cnst r1=sqrt(xsq+y) r2=sqrt(onexsq+y) f=qi/r1+1./r2+cnst2 df =-0.5*qi/r1**3 - 0.5/r2**3 end subroutine rline subroutine compute_lobes(q, L, npts, xplot, yplot) real, intent(in) :: q, L integer, intent(in) :: npts real, intent(out), dimension(2*npts+1) :: xplot,yplot real :: qi,q11,cnst,lrl,rrl,y1,y2,ysq,dxl,dxr integer :: i qi = 1/q q11 = 1./(1.+qi) cnst = qi/L+1./(1.-L) + 0.5*(1.+qi)*(L-q11)**2 lrl = left_limit(q, L) xplot(1) = lrl yplot(1) = 0. xplot(npts+1) = L yplot(npts+1) = 0. rrl = right_limit(q, L) xplot(2*npts) = rrl yplot(2*npts) = 0. y1 = 0. y2 = L*L !--left lobe dxl = (xplot(npts+1)-xplot(1))/real(npts) do i=1,npts xplot(i+1) = xplot(1) + i*dxl ysq = rtsafe(rline,qi,L,y1,y2,xplot(i+1),roche_accuracy) yplot(i+1) = sqrt(ysq) enddo !--right lobe dxr = (xplot(2*npts)-xplot(npts+1))/real(npts) do i=1,npts xplot(npts+i+1) = xplot(npts+1) + i*dxr ysq = rtsafe(rline,qi,L,y1,y2,xplot(npts+i+1),roche_accuracy) yplot(npts+i+1) = sqrt(ysq) enddo end subroutine compute_lobes end module rochelobe danieljprice-splash-4d1f09c/src/exact_sedov.f90000066400000000000000000000161761477365367100215200ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2015 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------------------------------------------- ! compute exact solution for Sedov-type point-like energy injection ! the solution is correct for 3D, I have attempted to fix it in 1D & 2D but ! not working yet. !--------------------------------------------------------------------------- module sedov implicit none public :: exact_sedov private :: etau,rhou,pru,dudlneta,eta0 contains subroutine exact_sedov(iplot,time,gam,rhozero,energy,rmax,rplot,yplot,ierr) integer, intent(in) :: iplot integer, intent(out) :: ierr real, intent(in) :: time, gam, rhozero, energy, rmax real, dimension(:), intent(inout) :: rplot real, dimension(size(rplot)), intent(out) :: yplot integer, parameter :: ndim = 3 integer :: npts real, parameter :: pi = 3.1415926536 real :: rshock, dr real :: rhoshock, ushock, prshock real :: eta_0, power real :: ubar,ubarzero,dubar real :: phi,dphi integer :: i,ishock ierr = 0 print*,' Plotting 3D Sedov similarity solution at t = ',time print*,' rhozero = ',rhozero,' energy = ',energy, ' rmax = ',rmax if (abs(time) < 1.e-10) then print*,'nothing at t=0, returning' ierr = 1 return endif npts = size(rplot) eta_0 = eta0(gam,ndim) print*,' eta0 = ',eta_0, ' gamma = ',gam power = 1./(ndim+2) dr = rmax/float(npts-1) ! !--calculate radius and velocity of shock from dimensional analysis ! rshock = eta_0*(energy*time**2./rhozero)**power !! ushock = 2.*power*eta_0*((energy*time**2./rhozero)**(power-1.))*energy*time/rhozero ushock = 2.*power*rshock/time print*,' rshock = ',rshock, ' ushock = ',ushock ! !--on x-y plots plot a circle at radius rshock ! if (iplot==0) then dphi = 2.*pi/real(npts-1) phi = 0. do i=1,npts phi = (i-1)*dphi rplot(i) = rshock*cos(phi) yplot(i) = rshock*sin(phi) enddo return endif ! !--jump conditions to find states behind shock ! rhoshock = rhozero*(gam+1.)/(gam-1.) prshock = 2./(gam+1.)*rhoshock*ushock**2 rplot(1) = 0.0 select case(iplot) case(2) yplot(1) = 0.0 ! shouldn't be zero for pressure case default yplot(1) = 0.0 end select ishock = INT((rshock - rplot(1))/dr) if (ishock > 0) then ishock = min(ishock,npts) ! !--the solution for rho is given as a function of ubar (dimensionless velocity) ! ubar varies from (gamma+1)/2*gamma at eta = 0 to 1 at eta = 1 ! (eta is the dimensionless radius eta = r/rshock, so eta=1 is the shock position) ! ubarzero = 0.5*(gam+1.)/gam dubar = (1.0 - ubarzero)/REAL(ishock-1) ! need to check the denominator ! !--solution behind shock front (similarity solution) ! (I really want to start from ubar = ubarzero, but am having problems) ! do i=2,ishock ubar = ubarzero + (i-1)*dubar ! again need to check this rplot(i) = etau(ubar,gam,ndim)*rshock select case(iplot) case(1) ! rho yplot(i) = rhoshock*rhou(ubar,gam) case(2) ! pr yplot(i) = prshock*(rplot(i)/rshock)**2*pru(ubar,gam) case(3) ! utherm yplot(i) = prshock*(rplot(i)/rshock)**2*pru(ubar,gam)/ & ((gam-1.)*rhoshock*rhou(ubar,gam)) case(4) ! 1/2 v^2 yplot(i) = 0.5*(4./(5.*(gam+1.))*rplot(i)/time*ubar)**2 case(5) yplot(i) = (4./(5.*(gam+1.))*rplot(i)/time*ubar) end select !print*,'u,r, rho = ',ubar,rplot(i),rhoplot(i) enddo endif ! !--solution ahead of shock front ! ishock = max(ishock,1) if (ishock < npts) then do i=ishock,npts rplot(i) = rshock + (i-ishock)*dr select case(iplot) case(1) ! rho yplot(i) = rhozero case default ! pr,utherm,v yplot(i) = 0. end select enddo endif return end subroutine exact_sedov ! !--eta (dimensionless radius) as a function of u_bar (dimensionless velocity) ! real function etau(u,gamma,ndim) integer, intent(in) :: ndim real, intent(in) :: u,gamma real :: gam1,term1,term2,power1,power2 gam1 = gamma-1. power1 = (-12.+7.*gamma-13.*gamma**2)/(5.*(-1.+gamma+6.*gamma**2)) power2 = gam1/(1.+2.*gamma) term1 = ((5.+5.*gamma+2.*u-6.*gamma*u)/(7.-gamma))**power1 term2 = ((2.*gamma*u-gamma-1.)/gam1)**power2 etau = u**(-2./(ndim+2.))*term1*term2 end function etau ! !--rhobar (dimensionless density) as a function of u_bar (dimensionless velocity) ! real function rhou(u,gamma) real, intent(in) :: u,gamma real :: gam1,power1,power2,power3,term1,term2,term3 gam1 = gamma-1. power1 = (2./(gamma-2.)) power2 = -(12.-7.*gamma+13.*gamma**2)/(2.-3.*gamma-11.*gamma**2+6.*gamma**3) power3 = 3./(1.+2.*gamma) term1 = ((1.+ gamma - 2.*u)/gam1)**power1 term2 = ((5.+5.*gamma+2.*u-6.*gamma*u)/(7.-gamma))**power2 term3 = ((2.*gamma*u - gamma -1.)/gam1)**power3 rhou = term1*term2*term3 end function rhou ! !--prbar (dimensionless pressure) as a function of u_bar (dimensionless velocity) ! real function pru(u,gamma) real, intent(in) :: u,gamma pru = (gamma+1. - 2.*u)/(2.*gamma*u - gamma - 1.)*u**2*rhou(u,gamma) end function pru ! !--du /dln eta - required for the integral to compute eta0 ! real function dudlneta(u,gamma) real, intent(in) :: u,gamma real :: term1,term2 term1 = u*(5.+5.*gamma + 2.*u - 6.*gamma*u)*(-1.-gamma+2.*gamma*u) term2 = 2.*(1.+gamma)*(1.+gamma - 2.*u - 2.*gamma*u + 2.*gamma*u**2) dudlneta = term1/term2 end function dudlneta ! !--eta_0 as a function of gamma ! real function eta0(gamma,ndim) integer, parameter :: ipts = 50000 real, parameter :: pi = 3.1415926536 integer, intent(in) :: ndim real, intent(in) :: gamma integer :: i real :: u0, u, du real :: sum, term, weight, factor ! if (abs(gamma-5./3.) < 1.e-3) then ! eta0 = 1.1517 ! else ! print*,'warning: don''t know eta0: integral not implemented' ! eta0 = 1.0 ! endif u0 = 0.5*(gamma+1.)/gamma du = (1. - u0)/REAL(ipts) ! !--integrate using Simpson's 1/3 rule ! sum = 0. do i=1,ipts weight = 1.0 if (mod(i,2)==0) then weight = 4./3. else weight = 2./3. endif if ((i==1).or.(i==ipts)) weight = 1./3. u = u0 + i*du term = (pru(u,gamma) + rhou(u,gamma)*u**2)*(etau(u,gamma,ndim)**(ndim+2))/dudlneta(u,gamma) sum = sum + weight*du*term enddo if (ndim==3) then factor = 4.*pi elseif (ndim==2) then factor = 2.*pi else factor = 1. endif eta0 = (factor*8.*sum/(25.*(gamma**2 - 1.)))**(-1./REAL(ndim+2)) end function eta0 end module sedov danieljprice-splash-4d1f09c/src/exact_shock.f90000066400000000000000000000314711477365367100215020ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2015 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! compute exact solution for the one dimensional Riemann problem ! (hydrodynamic shock) ! ! input parameters are initial left and right states of ! density, pressure and velocity ! ! Computes shock profile at time t ! ! Calls a separate subroutine to calculate the post-shock pressure ! and velocity (this is the difficult bit). ! ! Handles all cases of left and right-going shocks and rarefactions ! ! Daniel Price, Institute of Astronomy, Cambridge, 2004 ! University of Exeter 2004-2008 ! Monash University 2008- ! ! dprice@astro.ex.ac.uk !----------------------------------------------------------------------- module shock implicit none public :: exact_shock private :: get_pstar, get_pstar_isothermal, f_and_df contains subroutine exact_shock(iplot,time,gammain,xshock,rho_L,rho_R,p_L,p_R,v_L,v_R,rdust_to_gas,xplot,yplot,ierr) integer, intent(in) :: iplot integer, intent(out) :: ierr real, intent(in) :: time,gammain,xshock real, intent(in) :: rho_L,rho_R,p_L,p_R,v_L,v_R,rdust_to_gas real, dimension(:), intent(in) :: xplot real, dimension(size(xplot)), intent(out) :: yplot integer :: i real, dimension(size(xplot)) :: dens, pr, vel real :: cs_L,cs_R, gamfac real :: ppost, vpost, vleft, vright, gamma real :: xzero,xleft,xleftleft,xcontact,xright,xrightright logical :: useisothermal,leftisshock,rightisshock gamma = gammain print*,'Plotting exact Riemann solution at t = ',time,' gamma = ',gamma ! ! check for errors in input ! ierr = 0 if (rho_L <= 0. .or. rho_R <= 0.) then print*,'error: rho <= 0 on input : ',rho_L,rho_R ierr = 1 return elseif (p_L <= 0. .or. p_R <= 0.) then print*,'error: pr <= 0 on input ',p_L, p_R ierr = 2 return endif if (gamma < 1.) then print*,'Error: gamma = ',gamma,' setting to 5/3' gamma = 5./3. endif ! ! xzero is the position of the shock at t=0 ! xzero = xshock ! ! define sound speeds to left and right of shock tube ! cs_L = sqrt(gamma*p_L/rho_L) cs_R = sqrt(gamma*p_R/rho_R) if (rdust_to_gas > epsilon(rdust_to_gas)) then cs_L = cs_L*sqrt(1./(1.+rdust_to_gas)) cs_R = cs_R*sqrt(1./(1.+rdust_to_gas)) endif gamfac = (gamma-1.)/(gamma + 1.) !------------------------------------------------------------ ! find post-shock pressure via the Riemann solver ! (this version also returns the post shock speed vpost ! although this can be calculated from ppost) !------------------------------------------------------------ if (gamma > 1.0001) then call get_pstar(gamma,p_L,p_R,v_L,v_R,cs_L,cs_R,ppost,vpost) useisothermal = .false. else print*,'using isothermal solver...',p_L/rho_L, p_R/rho_R useisothermal = .true. call get_pstar_isothermal(cs_L*cs_L,v_L,v_R,rho_L,rho_R,ppost,vpost) endif !------------------------------------------------------------ ! using this, calculate various speeds needed in order to ! reconstruct the shock profile !------------------------------------------------------------ ! ! check whether solutions are shocks or rarefactions ! if (ppost > p_L) then leftisshock = .true. else leftisshock = .false. endif if (ppost > p_R) then rightisshock = .true. else rightisshock = .false. endif if (leftisshock) then write(*,"(a)",advance='no') ' left-going wave is a shock; ' else write(*,"(a)",advance='no') ' left-going wave is a rarefaction; ' endif if (rightisshock) then write(*,"(a)") 'right-going wave is a shock' else write(*,"(a)") 'right-going wave is a rarefaction' endif if (rightisshock) then ! right hand wave is a shock ! ! speed of the shock front ! vright = v_R + cs_R**2*(ppost/p_R - 1.)/(gamma*(vpost-v_R)) else ! right hand wave is a rarefaction ! ! speed at which the right end of rarefaction fan moves ! vright = cs_R + 0.5*(gamma+1.)*vpost - 0.5*(gamma-1.)*v_R endif ! ! repeat for left-going wave ! if (leftisshock) then vleft = -(v_L + cs_L**2*(ppost/p_L - 1.)/(gamma*(vpost-v_L))) else vleft = cs_L - 0.5*(gamma+1.)*vpost + 0.5*(gamma-1.)*v_L endif !------------------------------------------------------------- ! now work out the locations of various features in the shock !------------------------------------------------------------- ! ! position of left-going shock or back end of left-going rarefaction ! xleft = xzero - vleft*time if (leftisshock) then xleftleft = xleft else ! ! front end of left-going expansion fan (propagates at sound speed into "left" fluid) ! xleftleft = xzero - (cs_L - v_L)*time endif ! ! position of the interface between the "left" fluid from the "right" fluid ! (the contact discontinuity) ! xcontact = xzero + vpost*time ! ! position of right-going shock or back end of right-going rarefaction ! xright = xzero + vright*time if (rightisshock) then xrightright = xright else ! ! right end of right-going expansion fan (propagates at sound speed into "right" fluid) ! xrightright = xzero + (cs_R + v_R)*time endif !-------------------------------------------------------------- ! reconstruct the shock profile for all x !-------------------------------------------------------------- !--here is a cheap, dirty f90 version for crap compilers do i=1,size(xplot) if (xplot(i) <= xleftleft) then ! undisturbed medium to the left pr(i) = p_L dens(i) = rho_L vel(i) = v_L elseif (xplot(i) < xleft) then if (leftisshock) then pr(i) = ppost dens(i) = rho_L*(gamfac+ppost/p_L)/(1+gamfac*ppost/p_L) ! dens(i) = rho_L*(ppost/p_L)**(1./gamma) vel(i) = vpost else ! inside expansion fan if (useisothermal) then ! this is a bit of a guess dens(i) = rho_L*exp((xleftleft-xplot(i))/(cs_L*time) + v_L/cs_L) else dens(i) = rho_L*(gamfac*(xzero-xplot(i))/(cs_L*time) + gamfac*v_L/cs_L + (1.-gamfac))**(2./(gamma-1.)) endif pr(i) = p_L*(dens(i)/rho_L)**gamma vel(i) = (1.-gamfac)*(cs_L -(xzero-xplot(i))/time) + gamfac*v_L endif elseif (xplot(i) < xcontact) then ! between left expansion fan/shock and contact discontinuity ! post-shock, ahead of contact discontinuity but before right going wave pr(i) = ppost if (leftisshock) then dens(i) = rho_L*(gamfac+ppost/p_L)/(1+gamfac*ppost/p_L) else dens(i) = rho_L*(ppost/p_L)**(1./gamma) endif vel(i) = vpost elseif (xplot(i) < xright) then ! post-shock, ahead of contact discontinuity but before right going wave pr(i) = ppost if (rightisshock) then dens(i) = rho_R*(gamfac+ppost/p_R)/(1+gamfac*ppost/p_R) else dens(i) = rho_R*(ppost/p_R)**(1./gamma) endif vel(i) = vpost elseif (xplot(i) < xrightright) then if (rightisshock) then ! irrelevant as in this case xrightright = xright else ! inside expansion fan to right if (useisothermal) then ! this is a bit of a guess dens(i) = rho_R*exp(-(xrightright-xplot(i))/(cs_R*time) - v_R/cs_R) else dens(i) = rho_R*(gamfac*(xplot(i)-xzero)/(cs_R*time) - gamfac*v_R/cs_R + (1.-gamfac))**(2./(gamma-1.)) endif pr(i) = p_R*(dens(i)/rho_R)**gamma vel(i) = (1.-gamfac)*(-cs_R - (xzero-xplot(i))/time) + gamfac*v_R endif else ! undisturbed medium to the right pr(i) = p_R dens(i) = rho_R vel(i) = v_R endif enddo !--this is the beautiful, f95 version (which won't compile on pgf90) ! where(xplot <= xleft) ! <= otherwise problems at t=0 !! undisturbed medium to the left ! pr = p_L ! dens = rho_L ! vel = v_L ! elsewhere(xplot < xfan) !! inside expansion fan ! dens = rho_L*(gamfac*(xzero-xplot)/(cs_L*time) + (1.-gamfac))**(2./(gamma-1.)) ! pr = p_L*(dens/rho_L)**gamma ! vel = (1.-gamfac)*(cs_L -(xzero-xplot)/time) ! elsewhere(xplot < xcontact) !! between expansion fan and contact discontinuity ! pr = ppost ! dens = rho_L*(ppost/p_L)**(1./gamma) ! vel = vpost ! elsewhere(xplot < xshock) !! post-shock, ahead of contact discontinuity ! pr = ppost ! dens = rho_R*(gamfac+ppost/p_R)/(1+gamfac*ppost/p_R) ! vel = vpost ! elsewhere !! undisturbed medium to the right ! pr = p_R ! dens = rho_R ! vel = v_R ! end where !------------------------------------ ! determine which solution to plot !------------------------------------ select case(iplot) case(1) yplot = dens case(2) yplot = pr case(3) yplot = vel case(4) if (gamma > 1.0001) then yplot = pr/((gamma-1.)*dens) else yplot = pr/dens endif case(5) ! deltav, where vd = 0 yplot = -vel case(6) ! eps, where rhod = const yplot = rho_R/(dens + rho_R) end select return end subroutine exact_shock !------------------------------------------------------------------- ! Implementation of the exact Riemann solver given in Toro (1992) ! ! Solves for the post-shock pressure (pr) and velocity (vstar) ! given the initial left and right states ! ! Does not matter if high P / high rho is on left or right ! ! Daniel Price, Institute of Astronomy, Cambridge, UK, 2004 ! dprice@ast.cam.ac.uk !------------------------------------------------------------------- subroutine get_pstar(gamma,p_L,p_R,v_L,v_R,c_L,c_R,pr,vstar) real, parameter :: tol = 1.5e-6 real, intent(in) :: gamma,p_L,p_R,v_L,v_R,c_L,c_R real, intent(out) :: pr,vstar integer, parameter :: maxits = 30 integer :: its real :: prnew, f_L, f_R, dfdp_L, dfdp_R, f, df, dp real :: power, denom ! !--get an initial starting estimate of intermediate pressure ! this one is from Toro(1992) - gives basically the right answer ! for pressure jumps below about 4 ! power = (gamma-1.)/(2.*gamma) denom = c_L/p_L**power + c_R/p_R**power prnew = ((c_L + c_R + (v_L - v_R)*0.5*(gamma-1.))/denom)**(1./power) pr = p_L its = 0 !!print*,'initial guess = ',prnew do while (abs(prnew-pr) > tol .and. its < maxits) its = its + 1 pr = prnew ! !--evaluate the function and its derivatives ! call f_and_df(pr,p_L,c_L,gamma,f_L,dfdp_L) call f_and_df(pr,p_R,c_R,gamma,f_R,dfdp_R) ! !--then get new estimate of pr ! f = f_L + f_R + (v_R - v_L) df = dfdp_L + dfdp_R ! !--Newton-Raphson iterations ! dp = -f/df prnew = pr + dp enddo if (its==maxits) print*,'WARNING: its not converged in riemann solver' pr = prnew vstar = v_L - f_L print*,'its =',its,' p* =',prnew,'v* =',vstar,v_R + f_R end subroutine get_pstar ! !--pressure function ! H is pstar/p_L or pstar/p_R ! subroutine f_and_df(prstar,pr,cs,gam,fp,dfdp) real, intent(in) :: prstar, pr, gam, cs real, intent(out) :: fp,dfdp real :: H,term, power, gamm1, denom H = prstar/pr gamm1 = gam - 1. if (H > 1.) then ! shock denom = gam*((gam+1.)*H + gamm1) term = sqrt(2./denom) fp = (H - 1.)*cs*term dfdp = cs*term/pr + (H - 1.)*cs/term*(-1./denom**2)*gam*(gam+1.)/pr else ! rarefaction power = gamm1/(2.*gam) fp = (H**power - 1.)*(2.*cs/gamm1) dfdp = 2.*cs/gamm1*power*H**(power-1.)/pr endif end subroutine f_and_df !------------------------------------------------------------- ! Non-iterative isothermal Riemann solver ! from Balsara (1994), ApJ 420, 197-212 ! ! See also Cha & Whitworth (2003), MNRAS 340, 73-90 !------------------------------------------------------------- subroutine get_pstar_isothermal(cs2,v_L,v_R,rho_L,rho_R,pstar,vstar) real, intent(in) :: cs2,v_L,v_R,rho_L,rho_R real, intent(out) :: pstar,vstar real :: sqrtrho_L, sqrtrho_R, X, vdiff, determinant, vstar2 sqrtrho_L = sqrt(rho_L) sqrtrho_R = sqrt(rho_R) X = sqrtrho_L*sqrtrho_R/(sqrtrho_L + sqrtrho_R) vdiff = v_L - v_R determinant = (X*vdiff)**2 + 4.*cs2*X*(sqrtrho_L + sqrtrho_R) pstar = 0.25*(X*vdiff + sqrt(determinant))**2 vstar = v_L - (pstar - cs2*rho_L)/(sqrt(pstar*rho_L)) vstar2 = v_R + (pstar - cs2*rho_R)/(sqrt(pstar*rho_R)) print*,' pstar = ',pstar,' vstar = ',vstar,vstar2 end subroutine get_pstar_isothermal end module shock danieljprice-splash-4d1f09c/src/exact_shock_sr.f90000066400000000000000000000431261477365367100222060ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! compute exact solution for the one dimensional Riemann problem ! in Special Relativity ! ! input parameters are initial left and right states of ! density, pressure and velocity ! ! Computes shock profile at time t ! ! Calls the exact solution routine provided by Marti & Mueller ! ! Daniel Price, Institute of Astronomy, Cambridge, 2004 ! University of Exeter 2004-2008 ! Monash University 2008- ! ! daniel.price@monash.edu !----------------------------------------------------------------------- module shock_sr implicit none public :: exact_shock_sr contains subroutine exact_shock_sr(iplot,time,gamma,rho_L,rho_R,p_L,p_R,v_L,v_R,xplot,yplot,ierr) integer, intent(in) :: iplot integer, intent(out) :: ierr real, intent(in) :: time,gamma real, intent(in) :: rho_L,rho_R,p_L,p_R,v_L,v_R real, dimension(:), intent(inout) :: xplot real, dimension(size(xplot)), intent(out) :: yplot double precision, dimension(size(xplot)) :: rad,dens,pr,vel,uu double precision :: rhol,rhor,pl,prr,vl,vr,gam,t print*,'Plotting Special Relativistic Riemann solution at t = ',time,' gamma = ',gamma ! ! check for errors in input ! ierr = 0 if (rho_L <= 0. .or. rho_R <= 0.) then print*,'error: rho <= 0 on input : ',rho_L,rho_R ierr = 1 return elseif (p_L <= 0. .or. p_R <= 0.) then print*,'error: pr <= 0 on input ',p_L, p_R ierr = 2 return endif rhol = rho_L rhor = rho_R pl = p_L prr = p_R vl = v_L vr = v_R gam = gamma t = time rad(:) = xplot(:) call riemann(size(xplot),rad,dens,pr,vel,uu,rhol,rhor,pl,prr,vl,vr,gam,t,0.0d0) !------------------------------------ ! determine which solution to plot !------------------------------------ select case(iplot) case(1) yplot = real(dens) case(2) yplot = real(pr) case(3) yplot = real(vel) case(4) if (gamma > 1.0001) then yplot = real(pr/((gamma-1.)*dens)) else yplot = real(pr/dens) endif case(5) ! rho* yplot = real(dens/dsqrt(1.d0-vel**2)) end select return end subroutine exact_shock_sr ! ------------ !n name: r i e m a n n ! ------------ !p purpose: !p this program computes the solution of a 1d !p relativistic riemann problem (for constant-gamma ideal gases) with !p initial data ul if x<0.5 and ur if x>0.5 !p in the whole spatial domain [0, 1] ! !c comments: !c see marti and mueller, jfm, 1994 !c !c written by: jose-maria marti !c departamento de astronomia y astrofisica !c universidad de valencia !c 46100 burjassot (valencia), spain !c jose-maria.marti@uv.es !c and !c ewald mueller !c max-planck-institut fuer astrophysik !c karl-schwarzschild-str. 1 !c 85741 garching, germany !c emueller@mpa-garching.mpg.de !c !c Modifications by D. Price (daniel.price@sci.monash.edu.au): !c 07/2007: used as subroutine instead of program !c 09/2008: reformatted in free-form and included in exact_shock_sr module !c subroutine riemann(mn,rad,rhoa,pa,vela,ua,rholin,rhorin,plin,prin, & vlin,vrin,gamin,tin,x0) ! ------- ! common blocks ! ------- double precision rhol, pl, ul, hl, csl, vell, wl, & rhor, pr, ur, hr, csr, velr, wr common /states/ rhol, pl, ul, hl, csl, vell, wl, & rhor, pr, ur, hr, csr, velr, wr double precision rhols, uls, hls, csls, vells, vshockl common /ls/ rhols, uls, hls, csls, vells, vshockl double precision rhors, urs, hrs, csrs, velrs, vshockr common /rs/ rhors, urs, hrs, csrs, velrs, vshockr double precision gamma common /adind/ gamma ! --------- ! internal variables ! --------- integer, intent(in) :: mn integer n, i, iloop ! parameter (mn = 400) double precision tol, pmin, pmax, dvel1, dvel2, check !, xmin double precision, intent(in) :: rholin,rhorin,plin,prin,vlin,vrin,gamin,tin double precision ps, vels double precision, intent(out) :: rhoa(mn), pa(mn), vela(mn), ua(mn) double precision, intent(in) :: x0 double precision xi double precision, intent(in) :: rad(mn) double precision x1, x2, x3, x4, x5, t ! ------- ! initial states ! ------- ! write(*,*) ' adiabatic index of the gas: ' ! read (*,*) gamma gamma = gamin ! write(*,*) ' time for the solution: ' ! read (*,*) t t = tin ! xmin = x0 - 0.5d0 ! ----- ! left state ! ----- ! write(*,*) ' -- left state -- ' ! write(*,*) ' pressure : ' ! read (*,*) pl ! write(*,*) ' density : ' ! read (*,*) rhol ! write(*,*) ' flow velocity: ' ! read (*,*) vell pl = plin rhol = rholin vell = vlin pr = prin rhor = rhorin velr = vrin ! ------ ! right state ! ------ ! write(*,*) ' -- right state -- ' ! write(*,*) ' pressure : ' ! read (*,*) pr ! write(*,*) ' density : ' ! read (*,*) rhor ! write(*,*) ' flow velocity: ' ! read (*,*) velr ! ------------------------------ ! specific internal energy, specific enthalpy, sound speed and ! flow lorentz factors in the initial states ! ------------------------------ ul = pl/(gamma-1.d0)/rhol ur = pr/(gamma-1.d0)/rhor hl = 1.d0+ul+pl/rhol hr = 1.d0+ur+pr/rhor csl = dsqrt(gamma*pl/rhol/hl) csr = dsqrt(gamma*pr/rhor/hr) wl = 1.d0/dsqrt(1.d0-vell**2) wr = 1.d0/dsqrt(1.d0-velr**2) ! -------- ! number of points ! -------- n = mn ! ------------- ! tolerance for the solution ! ------------- tol = 0.d0 ! iloop = 0 pmin = (pl + pr)/2.d0 pmax = pmin 5 iloop = iloop + 1 pmin = 0.5d0*max(pmin,0.d0) pmax = 2.d0*pmax call getdvel(pmin, dvel1) call getdvel(pmax, dvel2) check = dvel1*dvel2 if (check > 0.d0) goto 5 ! --------------------------- ! pressure and flow velocity in the intermediate states ! --------------------------- call getp(pmin, pmax, tol, ps) vels = 0.5d0*(vells + velrs) ! --------------- ! solution on the numerical mesh ! --------------- ! ----------- ! positions of the waves ! ----------- if (pl >= ps) then x1 = x0 + (vell - csl )/(1.d0 - vell*csl )*t x2 = x0 + (vels - csls)/(1.d0 - vels*csls)*t else x1 = x0 + vshockl*t x2 = x1 endif x3 = x0 + vels*t if (pr >= ps) then x4 = x0 + (vels + csrs)/(1.d0 + vels*csrs)*t x5 = x0 + (velr + csr )/(1.d0 + velr*csr )*t else x4 = x0 + vshockr*t x5 = x4 endif ! ---------- ! solution on the mesh ! ---------- !do i=1,n ! rad(i) = xmin + dfloat(i-1)/dfloat(n-1) !enddo do i=1,n if (rad(i) <= x1) then pa(i) = pl rhoa(i) = rhol vela(i) = vell ua(i) = ul elseif (rad(i) <= x2) then xi = (rad(i) - x0)/t call raref(xi, rhol, csl, vell, 'l', & rhoa(i), pa(i), ua(i), vela(i)) elseif (rad(i) <= x3) then pa(i) = ps rhoa(i) = rhols vela(i) = vels ua(i) = uls elseif (rad(i) <= x4) then pa(i) = ps rhoa(i) = rhors vela(i) = vels ua(i) = urs elseif (rad(i) <= x5) then xi = (rad(i) - x0)/t call raref(xi, rhor, csr, velr, 'r', & rhoa(i), pa(i), ua(i), vela(i)) else pa(i) = pr rhoa(i) = rhor vela(i) = velr ua(i) = ur endif enddo ! open (3,file='solution.dat',form='formatted',status='new') ! write(3,150) n, t ! 150 format(i5,1x,f10.5) ! do 60 i=1,n ! write(3,200) rad(i),pa(i),rhoa(i),vela(i),ua(i) ! 60 continue ! 200 format(5(e15.8,1x)) ! close(3) return end subroutine riemann ! ---------- !n name: g e t d v e l ! ---------- !p purpose: !p compute the difference in flow speed between left and right intermediate !p states for given left and right states and pressure ! !c comments !c none subroutine getdvel( p, dvel ) ! ----- ! arguments ! ----- doubleprecision, intent(in) :: p doubleprecision, intent(out) :: dvel ! ------- ! common blocks ! ------- double precision rhols,uls,hls,csls,vells,vshockl common /ls/ rhols,uls,hls,csls,vells,vshockl double precision rhors,urs,hrs,csrs,velrs,vshockr common /rs/ rhors,urs,hrs,csrs,velrs,vshockr double precision rhol, pl, ul, hl, csl, vell, wl, & rhor, pr, ur, hr, csr, velr, wr common /states/ rhol, pl, ul, hl, csl, vell, wl, & rhor, pr, ur, hr, csr, velr, wr double precision gamma common /adind/ gamma ! ----- ! left wave ! ----- call getvel(p, rhol, pl, hl, csl, vell, wl, 'l', & rhols, uls, hls, csls, vells, vshockl ) ! ----- ! right wave ! ----- call getvel(p, rhor, pr, hr, csr, velr, wr, 'r', & rhors, urs, hrs, csrs, velrs, vshockr ) dvel = vells - velrs return end subroutine getdvel ! ------- !n name: g e t p ! ------- !p purpose: !p find the pressure in the intermediate state of a riemann problem in !p relativistic hydrodynamics ! !c comments: !c this routine uses a combination of interval bisection and inverse !c quadratic interpolation to find the root in a specified interval. !c it is assumed that dvel(pmin) and dvel(pmax) have opposite signs without !c a check. !c adapted from "computer methods for mathematical computation", !c by g. e. forsythe, m. a. malcolm, and c. b. moler, !c prentice-hall, englewood cliffs n.j. ! subroutine getp( pmin, pmax, tol, ps ) ! ----- ! arguments ! ----- doubleprecision, intent(in) :: pmin, pmax, tol doubleprecision, intent(out) :: ps ! ------- ! common blocks ! ------- doubleprecision gamma common /adind/ gamma doubleprecision rhol, pl, ul, hl, csl, vell, wl, & rhor, pr, ur, hr, csr, velr, wr common /states/ rhol, pl, ul, hl, csl, vell, wl, & rhor, pr, ur, hr, csr, velr, wr ! --------- ! internal variables ! --------- doubleprecision a, b, c, d, e, eps, fa, fb, fc, tol1, xm, p, q, r, s ! ------------- ! compute machine precision ! ------------- eps = 1.d0 10 eps = eps/2.d0 tol1 = 1.d0 + eps if ( tol1 > 1.d0 ) go to 10 ! ------- ! initialization ! ------- a = pmin b = pmax call getdvel(a,fa) call getdvel(b,fb) ! ----- ! begin step ! ----- 20 c = a fc = fa d = b - a e = d 30 if ( dabs(fc) >= dabs(fb) )go to 40 a = b b = c c = a fa = fb fb = fc fc = fa ! -------- ! convergence test ! -------- 40 tol1 = 2.d0*eps*dabs(b) + 0.5d0*tol xm = 0.5d0*(c - b) if ( dabs(xm) <= tol1 ) go to 90 if ( fb == 0.d0 ) go to 90 ! ------------ ! is bisection necessary? ! ------------ if ( dabs(e) < tol1 ) go to 70 if ( dabs(fa) <= dabs(fb) ) go to 70 ! ------------------ ! is quadratic interpolation possible? ! ------------------ if ( a /= c ) go to 50 ! ---------- ! linear interpolation ! ---------- s = fb/fa p = 2.d0*xm*s q = 1.d0 - s go to 60 ! ---------------- ! inverse quadratic interpolation ! ---------------- 50 q = fa/fc r = fb/fc s = fb/fa p = s*(2.d0*xm*q*(q - r) - (b - a)*(r - 1.d0)) q = (q - 1.d0)*(r - 1.d0)*(s - 1.d0) ! ------ ! adjust signs ! ------ 60 if ( p > 0.d0 ) q = -q p = dabs(p) ! -------------- ! is interpolation acceptable? ! -------------- if ( (2.d0*p) >= (3.d0*xm*q-dabs(tol1*q)) ) go to 70 if ( p >= dabs(0.5d0*e*q) ) go to 70 e = d d = p/q go to 80 ! ----- ! bisection ! ----- 70 d = xm e = d ! ------- ! complete step ! ------- 80 a = b fa = fb if ( dabs(d) > tol1 ) b = b+d if ( dabs(d) <= tol1 ) b = b+dsign(tol1,xm) call getdvel(b,fb) if ( (fb*(fc/dabs(fc))) > 0.d0) go to 20 go to 30 ! -- ! done ! -- 90 ps = b return end subroutine getp ! --------- !n name: g e t v e l ! --------- !p purpose: !p compute the flow velocity behind a rarefaction or shock in terms of the !p post-wave pressure for a given state ahead the wave in a relativistic !p flow ! !c comments: !c this routine closely follows the expressions in Marti and Mueller, !c J. fluid mech., (1994) subroutine getvel( p, rhoa, pa, ha, csa, vela, wa, s, & rho, u, h, cs, vel, vshock ) ! ----- ! arguments ! ----- double precision, intent(in) :: p, rhoa, pa, ha, csa, vela, wa character(len=1), intent(in) :: s double precision, intent(out) :: rho, u, h, cs, vel, vshock ! ------- ! common blocks ! ------- double precision gamma common /adind/ gamma ! --------- ! internal variables ! --------- double precision a, b, c, sign double precision j, wshock double precision k, sqgl1 ! --------------- ! left or right propagating wave ! --------------- sign = 0.d0 if (s=='l') sign = -1.d0 if (s=='r') sign = 1.d0 ! if (p > pa) then ! --- ! shock ! --- a = 1.d0+(gamma-1.d0)*(pa-p)/gamma/p b = 1.d0-a c = ha*(pa-p)/rhoa-ha**2 ! ---------------- ! check for unphysical enthalpies ! ---------------- if (c > (b**2/4.d0/a)) then print*,'getvel: unphysical specific enthalpy in intermediate state' return endif ! ----------------------------- ! specific enthalpy in the post-wave state ! (from the equation of state and the taub adiabat, ! eq.(74), mm94) ! ----------------------------- h = (-b+dsqrt(b**2-4.d0*a*c))/2.d0/a ! --------------- ! density in the post-wave state ! (from eq.(73), mm94) ! --------------- rho = gamma*p/(gamma-1.d0)/(h-1.d0) ! ------------------------ ! specific internal energy in the post-wave state ! (from the equation of state) ! ------------------------ u = p/(gamma-1.d0)/rho ! -------------------------- ! mass flux across the wave ! (from the rankine-hugoniot relations, eq.(71), mm94) ! -------------------------- j = sign*dsqrt((p-pa)/(ha/rhoa-h/rho)) ! ---------- ! shock velocity ! (from eq.(86), mm94 ! ---------- a = j**2+(rhoa*wa)**2 b = -vela*rhoa**2*wa**2 vshock = (-b+sign*j**2*dsqrt(1.d0+rhoa**2/j**2))/a wshock = 1.d0/dsqrt(1.d0-vshock**2) ! ------------------- ! flow velocity in the post-shock state ! (from eq.(67), mm94) ! ------------------- a = wshock*(p-pa)/j+ha*wa*vela b = ha*wa+(p-pa)*(wshock*vela/j+1.d0/rhoa/wa) vel = a/b ! --------------------- ! local sound speed in the post-shock state ! (from the equation of state) ! --------------------- cs = dsqrt(gamma*p/rho/h) else ! ------ ! rarefaction ! ------ ! --------------------------- ! politropic constant of the gas across the rarefaction ! --------------------------- k = pa/rhoa**gamma ! --------------- ! density behind the rarefaction ! --------------- rho = (p/k)**(1.d0/gamma) ! ------------------------ ! specific internal energy behind the rarefaction ! (from the equation of state) ! ------------------------ u = p/(gamma-1.d0)/rho ! -------------------- ! local sound speed behind the rarefaction ! (from the equation of state) ! -------------------- cs = dsqrt(gamma*p/(rho+gamma*p/(gamma-1.d0))) ! ------------------ ! flow velocity behind the rarefaction ! ------------------ sqgl1 = dsqrt(gamma-1.d0) a = (1.d0+vela)/(1.d0-vela)*((sqgl1+csa)/(sqgl1-csa)* & (sqgl1-cs )/(sqgl1+cs ))**(-sign*2.d0/sqgl1) vel = (a-1.d0)/(a+1.d0) endif end subroutine getvel ! -------- !n name: r a r e f ! -------- !p purpose: !p compute the flow state in a rarefaction for given pre-wave state ! !c comments: !c this routine closely follows the expressions in marti and mueller, !c j. fluid mech., (1994) subroutine raref( xi, rhoa, csa, vela, s, rho, p, u, vel ) ! ----- ! arguments ! ----- double precision, intent(in) :: xi double precision, intent(in) :: rhoa, csa, vela character, intent(in) :: s double precision, intent(out) :: rho, p, u, vel ! ------- ! common blocks ! ------- double precision gamma common /adind/ gamma ! --------- ! internal variables ! --------- double precision b, c, d, k, l, v, ocs2, fcs2, dfdcs2, cs2, sign ! --------------- ! left or right propagating wave ! --------------- sign = 0.d0 if (s=='l') sign = 1.d0 if (s=='r') sign = -1.d0 b = dsqrt(gamma - 1.d0) c = (b + csa)/(b - csa) d = -sign*b/2.d0 k = (1.d0 + xi)/(1.d0 - xi) l = c*k**d v = ((1.d0 - vela)/(1.d0 + vela))**d ocs2 = csa 25 fcs2 = l*v*(1.d0 + sign*ocs2)**d*(ocs2 - b) + (1.d0 - sign*ocs2)**d*(ocs2 + b) dfdcs2 = l*v*(1.d0 + sign*ocs2)**d* & (1.d0 + sign*d*(ocs2 - b)/(1.d0 + sign*ocs2)) + & (1.d0 - sign*ocs2)**d* & (1.d0 - sign*d*(ocs2 + b)/(1.d0 - sign*ocs2)) cs2 = ocs2 - fcs2/dfdcs2 if (abs(cs2 - ocs2)/ocs2 > 5.e-7) then ocs2 = cs2 goto 25 endif vel = (xi + sign*cs2)/(1.d0 + sign*xi*cs2) rho = rhoa*((cs2**2*(gamma - 1.d0 - csa**2))/ & (csa**2*(gamma - 1.d0 - cs2**2)))**(1.d0/(gamma - 1.d0)) p = cs2**2*(gamma - 1.d0)*rho/(gamma - 1.d0 - cs2**2)/gamma u = p/(gamma - 1.d0)/rho return end subroutine raref end module shock_sr danieljprice-splash-4d1f09c/src/exact_torus.f90000066400000000000000000000103161477365367100215420ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! Plots solution for equilibrium torus of Papaloizou & Pringle ! strictly valid for the midplane only (uses spherical r) ! ! Added by D. Price 16.1.06 ! ---------------------------------------------------------------------- module torus implicit none contains subroutine exact_torus(iplot,itorus,Mstar,Rtorus,AA,distortion,gamma,xplot,yplot,ierr) integer, intent(in) :: iplot,itorus real, intent(in) :: Mstar,Rtorus,AA,gamma,distortion real, intent(in), dimension(:) :: xplot real, intent(out), dimension(size(xplot)) :: yplot real :: term,densi,rxy integer, intent(out) :: ierr integer :: i,mytorus real :: ra2 integer, parameter :: nu = 2 real, parameter :: atorus = 0.2, currj0 = 1.0 ! ! check for errors ! ierr = 0 if (Mstar <= 0.) then print*,'error: mass <= 0 in exact_torus' ierr = 2 return elseif (Rtorus < 0.) then print*,'error: rtorus < 0 in exact_torus' ierr = 3 return endif mytorus = 1 select case(mytorus) ! !--Tokamak torus (in torus 'r' co-ordinate) ! case(2) if (nu <= 0 .or. (iplot < 4 .and. nu > 2)) then print*,'error: solution not found for nu value in tokamak torus' ierr = 5 return endif print*,' plotting tokamak torus' do i=1,size(xplot) ra2 = xplot(i)**2/atorus**2 if (nu==1) then term = currj0**2*atorus**2*(1. - ra2)*(7.*ra2**2 - 23.*ra2 + 13.)/96. elseif (nu==2) then term = currj0**2*atorus**2*(47. - 12.*ra2**5 + 75.*ra2**4 - 200.*ra2**3 + 270.*ra2**2 - 180*ra2)/720. endif if (abs(ra2) < tiny(ra2)) print*,'rho0 = ',term select case(iplot) case(1) !--density yplot(i) = Mstar*term**gamma case(2) !--pressure yplot(i) = term case(3) !--thermal energy yplot(i) = term case(4) !--Btheta if (xplot(i) > tiny(xplot(i))) then yplot(i) = 0.5*currj0*atorus**2/(nu+1)* & (1.-(1.-ra2)**(nu+1))/xplot(i) else yplot(i) = 0. endif case(5) !--Jphi current yplot(i) = currj0*(1. - ra2)**nu end select enddo ! !--Papaloizou & Pringle equilibrium torus ! case default if ((gamma-1.) <= 1e-4) then print*,'error: exact solution not valid for isothermal eos' ierr = 4 return endif do i=1,size(xplot) if (iplot /= 4) then !--plot quantities vs spherical r (assume z = 0) term = Mstar/(AA*Rtorus)*(gamma-1.)/gamma* & (Rtorus/xplot(i) - 0.5*(Rtorus/xplot(i))**2 - 1./(2.*distortion)) else !--plots with z (assume cyl r = Rtorus) rxy = sqrt(Rtorus**2 + xplot(i)**2) term = Mstar/(AA*Rtorus)*(gamma-1.)/gamma* & (Rtorus/rxy - 0.5 - 1./(2.*distortion)) endif if (term > tiny(term)) then densi = term**(1./(gamma-1.)) else densi = 0. endif select case(iplot) case(1) !--density yplot(i) = densi case(2,4) !--pressure yplot(i) = AA*densi**gamma case(3) !--thermal energy yplot(i) = AA/(gamma-1.)*densi**(gamma-1.) end select enddo end select return end subroutine exact_torus end module torus danieljprice-splash-4d1f09c/src/exact_toystar1D.f90000066400000000000000000000263251477365367100222670ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------ ! plot exact solution for toystar in one dimension ! ! linear solution uses Gegenbauer/Legendre polynomials ! ! non-linear solution solves ODEs, assumes linear velocity ! ! For details see Monaghan and Price (2004) MNRAS !------------------------------------------------------------ module toystar1D implicit none public :: exact_toystar1D, exact_toystar_ACplane private :: Pm, Gn contains subroutine exact_toystar1D(iplot,time,gamma,H0,A0,C0, & sigma,norder,xplot,yplot,npts,ierr) use plotlib, only:plot_pt1 integer, intent(in) :: iplot,norder,npts integer, intent(out) :: ierr real, intent(in) :: time,gamma,sigma real, intent(in) :: H0, C0, A0 ! parameters for toy star real, dimension(:), intent(inout) :: xplot real, dimension(size(xplot)), intent(out) :: yplot integer :: i,nsteps real :: const ! parameter for toy star real :: Hprev, Cprev, Aprev, Htemp, Ctemp, Atemp, H, C, A real :: radstar,dx,dt,tnow real :: rhoplot,deltarho real :: fprevC,fprevA,fprevH,ftempC,ftempA,ftempH real :: gamp1,gamm1,gam1,fact,constK,omega real :: fnorm logical :: linear linear = .false. if (norder >= 0) linear = .true. gamp1 = gamma + 1. gamm1 = gamma - 1. gam1 = 1./gamm1 constK = 0.25 ierr = 0 if (linear) then !--------------------------------------------------------------------------- ! linear solution uses Gegenbauer & Legendre Polynomials ! (this is for the toy star oscillations) omega = sqrt(0.5*(norder+1.)*(norder+2.)) fnorm = 2.*(norder+1)*(norder+2)/real(2.*norder + 3.) print*,' Plotting toy star oscills: time, norder, omega = ', & time,norder,omega,H0,C0,A0 if (C0 <= 0.) then print*,'*** C = 0 = illegal in input' ierr = 1 return else radstar = sqrt(H0/C0) endif xplot(1) = -radstar dx = (radstar-xplot(1))/float(npts-1) do i=2,npts xplot(i) = xplot(1)+dx*(i-1) ! print*,i,' x,y = ',xplot(i),yplot(i) rhoplot = (H0 - C0*xplot(i)**2) if (rhoplot <= 0.) rhoplot = 0. deltarho = Pm(xplot(i),norder+1)*sin(omega*time) rhoplot = rhoplot**gam1 + 2.*omega*A0*deltarho/fnorm select case(iplot) case(1) ! plot solution for density yplot(i) = rhoplot case(2) ! plot solution for pressure yplot(i) = constK*rhoplot**gamma case(3) ! plot solution for utherm yplot(i) = constK*(rhoplot**gamm1)/gamm1 case(4) ! plot solution for vx yplot(i) = A0*Gn(xplot(i),norder)*cos(omega*time) case(5) ! plot solution for By yplot(i) = sigma*rhoplot end select enddo if (iplot==6) then ! plot By \propto rho dx = (H0**gam1)/float(npts-1) ! ie (rhomax - 0)/npts xplot(1) = 0. yplot(1) = sigma*xplot(1) do i=2,npts xplot(i) = xplot(1) + dx*(i-1) yplot(i) = sigma*(xplot(i)) enddo endif if (iplot==7) then ! plot current point on A-C plane call plot_pt1(C0,A0*cos(omega*time),4) ierr = 2 ! do not plot again else ! plot normal exact solution line ierr = 0 endif !--------------------------------------------------------------------------- ! non-linear solution for the fundamental (n=1) mode ! else ! ! solve for H, C and A given initial conditions on v, rho and the time. ! nsteps = 1000*(int(time) + 1) Hprev = H0 Cprev = C0 Aprev = A0 ! PRINT*,' nsteps,H,C,A in = ',nsteps,H0,C0,A0 dt = time/nsteps fact = 2.*(constK + 0.5*sigma**2)*gamma*gam1 const = (A0**2 + 1. + 2.*fact*C0*gam1)*C0**(-2./gamp1) print*,' Plotting toy star: time, H0, C0, A0, k = ', & time,Hprev,Cprev,Aprev,const tnow = 0. do i = 1,nsteps tnow = tnow + dt ! integrate using improved Euler fprevC = -Cprev*Aprev*gamp1 fprevA = fact*Cprev -1.-Aprev**2 fprevH = -Aprev*Hprev*gamm1 ! predictor Ctemp = Cprev + dt*(-Cprev*Aprev*gamp1) Atemp = Aprev + dt*(fact*Cprev-1.-Aprev**2) Htemp = Hprev + dt*(-Aprev*Hprev*gamm1) ftempC = -Ctemp*Atemp*gamp1 ftempA = fact*Ctemp -1. -Aprev**2 ftempH = -Atemp*Htemp*gamm1 ! corrector C = Cprev + 0.5*dt*(fprevC + ftempC) A = Aprev + 0.5*dt*(fprevA + ftempA) H = Hprev + 0.5*dt*(fprevH + ftempH) Cprev = C Aprev = A Hprev = H ! print*,' time = ',tnow ! if ((abs(C-C0) < 5.e-3).AND. & ! (abs(A-A0) < 5.e-3).AND.(tnow > 5e-3)) then ! PRINT*,'*** period, t = ',tnow,' err = ',abs(C-C0)+abs(A-A0) ! ENDIF enddo const = (A**2 + 1. + 2.*fact*C*gam1)*C**(-2./gamp1) print*,' C, A, H, k = ',C,A,H,const if (C <= 0.) then radstar = 0.5 print*,'*** C = 0 = illegal' ierr = 1 return else radstar = sqrt(H/C) endif xplot(1) = -radstar dx = (radstar-xplot(1))/float(npts-1) do i=2,npts xplot(i) = xplot(1)+dx*(i-1) ! print*,i,' x,y = ',xplot(i),yplot(i) rhoplot = (H - C*xplot(i)**2) if (rhoplot <= 0.) rhoplot = 0. rhoplot = rhoplot**gam1 select case(iplot) case(1) ! plot solution for density yplot(i) = rhoplot case(2) ! plot solution for pressure yplot(i) = constK*rhoplot**gamma case(3) ! plot solution for utherm yplot(i) = constK*(rhoplot**gamm1)/gamm1 case(4) ! plot solution for vx yplot(i) = A*xplot(i) case(5) ! plot solution for By yplot(i) = sigma*rhoplot end select enddo if (iplot==6) then ! plot By \propto rho dx = (H**gam1)/float(npts-1) ! ie (rhomax - 0)/npts xplot(1) = 0. yplot(1) = sigma*xplot(1) do i=2,npts xplot(i) = xplot(1) + dx*(i-1) yplot(i) = sigma*(xplot(i)) enddo endif if (iplot==7) then ! plot current point on A-C plane call plot_pt1(C,A,4) ierr = 2 ! do not plot again else ! plot normal exact solution line ierr = 0 endif ! !------------------------------------------------------------------------ ! endif return end subroutine exact_toystar1D ! !--function to evaluate the Gegenbauer polynomial of index n given x ! real function Gn(x,n) integer, intent(in) :: n real, intent(in) :: x integer :: i real :: Gnminus1,Gnminus2 real :: fnorm fnorm = 2.*(n+1)*(n+2)/real(2.*n + 3.) ! PRINT*,' fnorm = ',fnorm ! !--specify first two Gegenbauer polynomials ! Gnminus2 = 1. Gnminus1 = 3.*x Gn = 0. ! avoid compiler warning ! !--use recurrence relation to calculate the rest ! select case (n) case (0) Gn = Gnminus2 case (1) Gn = Gnminus1 case (2:) do i=2,n Gn = ((2*i+1)*x*Gnminus1 - (i+1)*Gnminus2)/real(i) Gnminus2 = Gnminus1 Gnminus1 = Gn enddo end select Gn = Gn/fnorm end function Gn ! !--function to calculate a Legendre Polynomial of order m ! real function Pm(x,m) integer, intent(in) :: m real, intent(in) :: x integer :: i real :: Pmminus1,Pmminus2 ! !--specify first two Legendre polynomials ! Pmminus2 = 1. Pmminus1 = x Pm = 0. ! avoid compiler warning select case(m) case (0) Pm = 1. case (1) Pm = x case (2:) ! use recurrence relation to calculate the rest do i=2,m Pm = ((2.*(i-1.)+1.)*x*Pmminus1 - (i-1.)*Pmminus2)/real(i) Pmminus2 = Pmminus1 Pmminus1 = Pm enddo end select end function Pm !---------------------------------------------------------------------- ! ! this subroutine plots the A-C relation in the 1D Toy star solution ! !---------------------------------------------------------------------- subroutine exact_toystar_ACplane(astart,cstart,sigma,gamma) use plotlib, only:plot_swin,plot_funx,plot_label,plot_box real, intent(in) :: astart,cstart,sigma,gamma real :: constk,gam1,gamm1,gamp1,fact real :: xstart,xend,xcentre,c,cnew,k real :: func,func2,funct,fderiv,ymin,ymax,extra external func,func2 common /kconst/ k,fact,gam1,gamp1 print*,' plotting a-c plane...' gamp1 = gamma + 1. gamm1 = gamma - 1. gam1 = 1./gamm1 constk = 0.25 ! print*,' k, kdash = ',constk,constk + 0.5*sigma**2 fact = 2.*(constk + 0.5*sigma**2)*gamma*gam1 k = (astart**2 + 1. + 2.*fact*cstart*gam1)*cstart**(-2./gamp1) ! print*,' k,fact = ',k,fact ! !--find limits of plot (ie. where a = 0) ! c = 1.e6 cnew = 0.25 do while (abs(c-cnew) > 1.e-5) c = cnew funct = k*c**(2./gamp1) - 2.*fact*c*gam1 - 1. fderiv = 2.*k/gamp1*c**(-gamm1/gamp1) - 2.*fact*gam1 cnew = c - funct/fderiv if (cnew < 0.) print*,'eek c < 0' enddo xstart = cnew c = 1.e6 cnew = 6.37935 do while (abs(c-cnew) > 1.e-5) c = cnew funct = k*c**(2./gamp1) - 2.*fact*c*gam1 - 1. fderiv = 2.*k/gamp1*c**(-gamm1/gamp1) - 2.*fact*gam1 cnew = c - funct/fderiv enddo xend = cnew ! print*,'plotting k = ',k,' cstart = ',cstart,' astart = ',astart ! print*,'min c = ',xstart,' max c = ',xend xstart = xstart + 0.000001 xend = xend - 0.000001 extra = 0.1*(xend-xstart) xcentre = 0.5*(xstart + xend) ymax = 1.5*func(xcentre) ymin = 1.5*func2(xcentre) call plot_swin(xstart-extra,xend+extra,ymin,ymax) call plot_box('bcnst',0.0,0,'1bvcnst',0.0,0) call plot_funx(func,10000,xstart,xend,1) call plot_funx(func2,10000,xstart,xend,1) call plot_label ('c','a',' ') return end subroutine exact_toystar_ACplane end module toystar1D !------------------------------------ ! ! these functions must be external ! !------------------------------------ real function func(x) real, intent(in) :: x real :: k,term,fact,gam1,gamp1 common /kconst/ k,fact,gam1,gamp1 ! print*,'k = ',k term = -1 -2.*fact*x*gam1 + k*x**(2./gamp1) if (term <= 0.) then ! print*,' warning: func < 0 ',term func = 0. else func = sqrt(term) endif end function func real function func2(x) implicit none real, intent(in) :: x real :: k,term,fact,gam1,gamp1 common /kconst/ k,fact,gam1,gamp1 ! print*,' k = ',k term = -1 -2.*fact*x*gam1 + k*x**(2./gamp1) if (term <= 0.) then func2 = 0. else func2 = -sqrt(term) endif end function func2 danieljprice-splash-4d1f09c/src/exact_toystar2D.f90000066400000000000000000000332331477365367100222640ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------ ! Exact solutions for toystar in two dimensions ! ! For details see Monaghan and Price (2005), in prep. ! !------------------------------------------------------------ module toystar2D implicit none public :: exact_toystar2D public :: etar, detadr ! public because they are used in setup contains !------------------------------------------------------------ ! calculate exact solution for toystar in two dimensions ! ! non-linear solution solves ODEs, assumes linear velocity ! ! the solutions are all plots against radius ! ! iplot = 0 gives x vs y ! ! iplot = 1->5 gives rho, pr, u, vx, vy vs r !------------------------------------------------------------ subroutine exact_toystar2D(iplot,time,gamma,polyk,totmass, & ampl,denscentre,C0,jorder,morder, & V11,V22,V12,V21,xplot,yplot,ierr) integer, intent(in) :: iplot,jorder,morder integer, intent(out) :: ierr real, intent(in) :: time,gamma,polyk,totmass real, intent(in) :: C0, ampl, denscentre ! parameters for toy star real, intent(in) :: V11,V22,V12,V21 real, dimension(:), intent(inout) :: xplot real, dimension(:), intent(out) :: yplot real, parameter :: pi = 3.141592653589 integer :: i,npts,nsteps integer :: jmode,smode real :: H,C,D,B,omega,omegasq real :: radstar,dx,nu2 !!,scalefac real :: rhoplot,deltarho,vplot,deltav real :: gamm1,gam1,constK,sigma,period real, dimension(8) :: params, paramsp,dparams real :: fac,dt,t,phi,dphi,cosphi,sinphi,denom real :: massbefore,massafter logical linear ierr = 1 npts = size(xplot) linear = (jorder >= 0 .and. morder >= 0) gamm1 = gamma - 1. if (gamm1 < 1.e-3) then print*,'Error: no toy star solution for isothermal yet' ierr = 1 return endif gam1 = 1./gamm1 if (polyK <= 0.) then print*,'Error: polytropic K <= 0 on input: using 0.25 by default' constK = 0.25 else constK = polyK !!0.25 ! this is K from P = K*rho**gamma endif omega = 1.0 ! this is omega from the main code (ie. from potential) omegasq = omega**2 B = 0. D = 0. if (linear) then !--------------------------------------------------------------------------- ! linear solution print*,' Plotting 2D toy star: linear solution r mode = ',jorder,' phi mode = ',morder jmode = jorder ! radial mode smode = morder ! non-axisymmetric modes (theta) ! sigma is the frequency of oscillation nu2 = (jmode + smode)*(jmode+smode + 2./gamm1) - smode**2 if (nu2 <= 0.) then print*,'Error: nu^2 < 0 in linear toy star ',nu2 print*,' radial mode = ',jmode,' theta mode = ',smode ierr = 2 return else sigma = sqrt(0.5*omegasq*gamm1*nu2) endif print*,' Amplitude = ',ampl,' period = ',2*pi/sigma,' H,C = ',denscentre,C0 !!scalefac = polyk*gamma/(sigma*gamm1) radstar = sqrt((2.*polyk*gamma*denscentre**gamm1)/gamm1) xplot(1) = 0. dx = (radstar-xplot(1))/float(npts-1) do i=1,npts xplot(i) = xplot(1)+dx*(i-1) ! print*,i,' x,y = ',xplot(i),yplot(i) rhoplot = (denscentre - C0*xplot(i)**2) if (rhoplot <= 0.) rhoplot = 0. deltarho = etar(jmode,smode,xplot(i)/radstar,gamma) ! functional form of rho(r) !!print*,'deltarho = ',rhoplot,deltarho,xplot(i) rhoplot = (rhoplot + deltarho*ampl*sin(sigma*time))**gam1 deltav = ampl*detadr(jmode,smode,xplot(i)/radstar,gamma) vplot = deltav*cos(sigma*time) select case(iplot) case(1) ! plot solution for density yplot(i) = rhoplot case(2) ! plot solution for pressure yplot(i) = constK*rhoplot**gamma case(3) ! plot solution for utherm yplot(i) = constK*(rhoplot**gamm1)/gamm1 case(4) ! plot solution for v_r yplot(i) = vplot case(5) yplot(i) = vplot**2 end select enddo !--------------------------------------------------------------------------- ! non-linear solution ! else if (jorder < 0 .and. smode < 0) then smode = 2 jmode = 0 else smode = 0 jmode = 2 endif print*,'Plotting 2D toy star: non-linear' ! solve for H, C and A given initial conditions on v, rho and the time. ! H = denscentre ! !--this is the static solution, determined from the total mass, polyk, gamma and omega ! radstar = sqrt(gamma*totmass/(pi*gamm1)) H = omegasq*gamm1*radstar**2/(2.*polyk*gamma) C = 0.5*gamm1*omegasq/(gamma*polyk) print*,' r_star = ',radstar,' rho = (',H,'-',C,'^2)**',gamm1 D = C B = 0. ! !--now solve the ODEs for V11,V22,V12,V21,H,C,D & B ! (we use a simple modified euler method) ! params(1)= V11 params(2)= V22 params(3)= V12 params(4)= V21 params(5)= H params(6)= C params(7)= D params(8)= B fac= 2.*gamma*polyk*gam1 massbefore = pi*gamm1/gamma*H**(gamma*gam1)/(sqrt(C*D - B**2)) ! !--get frequency to determine timestep ! nu2 = (jmode + smode)*(jmode+smode + 2./gamm1) - smode**2 if (nu2 <= 0.) then print*,'Error: nu^2 < 0 in exact toy star ',nu2 print*,' radial mode = ',jmode,' theta mode = ',smode ierr = 2 return else sigma = sqrt(0.5*omegasq*gamm1*nu2) endif ! !--solve ODE's ! period = 2.*pi/sigma dt = 0.001*period nsteps = int(time/dt) dt = time/real(nsteps) t = 0. do i=1,nsteps t = t + dt call param_derivs(params,dparams,fac,gamm1,omegasq) paramsp(:)= params(:) + 0.5*dt*dparams(:) call param_derivs(paramsp,dparams,fac,gamm1,omegasq) params(:)= params(:) + dt*dparams(:) enddo ! !--have now got solution at current time ! H= params(5) C= params(6) D= params(7) B= params(8) print*,' solved ODEs to time = ',t,' in ',nsteps,' nsteps ' massafter = pi*gamm1/gamma*H**(gamma*gam1)/(sqrt(C*D - B**2)) print*,' conserved mass before = ',massbefore,' after =',massafter if (C <= 0.) then radstar = 0.5 stop '*** C = 0 = illegal' !!elseif (A <= 1.e-5) then else radstar = sqrt(H/C) endif xplot(1) = 0. dx = (radstar-xplot(1))/float(npts-1) do i=1,npts xplot(i) = xplot(1)+dx*(i-1) ! print*,i,' x,y = ',xplot(i),yplot(i) rhoplot = (H - C*xplot(i)**2) if (rhoplot <= 0.) rhoplot = 0. rhoplot = rhoplot**gam1 select case(iplot) case(1) ! plot solution for density yplot(i) = rhoplot case(2) ! plot solution for pressure yplot(i) = constK*rhoplot**gamma case(3) ! plot solution for utherm yplot(i) = constK*(rhoplot**gamm1)/gamm1 case(4) ! plot solution for v_r yplot(i) = ampl*xplot(i) case(5) yplot(i) = (ampl*xplot(i))**2 end select enddo ! !------------------------------------------------------------------------ ! endif if (iplot > 0 .and. iplot <= 5) then ierr = 0 elseif (iplot==0) then print*,' plotting non-axisymmetric boundary' ! !--for x-y plots we plot the rho=0 curve (ie. toy star boundary) ! dphi = 2.*pi/real(npts-1) phi = 0. do i=1,npts phi = (i-1)*dphi cosphi = cos(phi) sinphi = sin(phi) denom = C*cosphi**2 + 2.*B*cosphi*sinphi + D*sinphi**2 radstar = sqrt(H/denom) xplot(i) = radstar*cosphi yplot(i) = radstar*sinphi enddo ierr = 0 ! call pgsfs(2) ! call pgcirc(0.0,0.0,radstar) ! ierr = 3 endif return end subroutine exact_toystar2D ! !--function that evaluates the polynomial for rho(r/re) for a given radial mode ! (from the power series solution to the 2nd order ODE) ! ! rad = r/r_star ! j = radial (axisymmetric) mode ! m = theta mode ! ! solution is for delta(rho**(gamma-1)) ! ie. rho**(gamma-1) = rho_0**(gamma-1) + etar ! ! and takes the form ! ! etar = rad**m sum_k a_k rad**k ! real function etar(j,m,rad,gamma) integer, intent(in) :: j,m ! j is the radial mode, m is the theta mode integer :: k,kprev real, intent(in) :: rad,gamma real :: denom,ak,akprev,gamm1,freqsq ! !--this solution is for arbitrary gamma ! gamm1 = gamma - 1. if (gamm1 < 1.e-3) then print*,'error gamma -1 <= 0' etar = 0. return endif ! !--the solution is of the form ! drhor = a_0 + a_2 (r/re)**2 + a_4 (r/re)**4 + ... ! where for j = k, coefficients >= a_k+2 are zero ! freqsq = (j+m)*(j+m + 2./gamm1) - m**2 akprev = 1.0 ! this is a_0 which is the amplitude etar = akprev !!print*,'mode = ',j,m,' nu^2 = ',freqsq,' a_0 = ',akprev ! !--the co-efficients for the terms above a_0 are calculated using ! the recurrence relation between the a_k's ! do k = 2,j,2 kprev = k-2 denom = real((kprev + 2 + m)**2 - m**2) ak = akprev*(kprev**2 + 2.*kprev*m + 2.*(kprev+m)/gamm1 - freqsq)/denom !!print*,'coeff ',k,' = ',ak,k**2,2.*k/gamm1 etar = etar + ak*rad**k akprev = ak enddo etar = etar * rad**m end function etar ! !--function that evaluates the polynomial for v(r/re) for a given radial mode ! (from the power series solution to the 2nd order ODE) ! real function detadr(j,m,rad,gamma) integer, intent(in) :: j, m ! j is the radial mode, m is the theta mode integer :: k,kprev real, intent(in) :: rad,gamma real :: denom,term1,term2 real :: ak,akprev,gamm1,freqsq ! !--this solution is for arbitrary gamma ! gamm1 = gamma - 1. if (gamm1 < 1.e-3) then print*,'error gamma -1 <= 0' detadr = 0. return endif ! !--the solution is of the form ! drhor = a_0 + a_2 (r/re)**2 + a_4 (r/re)**4 + ... ! where for j = k, coefficients >= a_k+2 are zero ! freqsq = (j+m)*(j+m + 2./gamm1) - m**2 detadr = 0. akprev = 1.0 ! this is a_0 which is the amplitude term1 = akprev term2 = 0. ! print*,'mode = ',j,m,' nu^2 = ',freqsq,' a_0 = ',akprev ! !--the co-efficients for the terms above a_0 are calculated using ! the recurrence relation between the a_k's ! do k = 2,j,2 kprev = k-2 denom = real((kprev + 2 + m)**2 - m**2) ak = akprev*(kprev**2 + 2.*kprev*m + 2.*(kprev+m)/gamm1 - freqsq)/denom !!print*,'coeff ',k,' = ',ak,k*ak,rad,(k-1) term1 = term1 + ak*rad**k term2 = term2 + k*ak*rad**(k-1) akprev = ak enddo if (m==0) then detadr = term2 else detadr = m*rad**(m-1)*term1 + rad**m*term2 endif end function detadr subroutine param_derivs(func,dfunc,fac,gamm1,omegasq) real, intent(in), dimension(8) :: func real, intent(out), dimension(8) :: dfunc real, intent(in) :: fac, gamm1,omegasq real :: term, gamma term = func(1) + func(2) gamma = gamm1 + 1. dfunc(1)= fac*func(6) - func(1)*func(1) - func(3)*func(4) - omegasq dfunc(2)= fac*func(7) - func(2)*func(2) - func(3)*func(4) - omegasq dfunc(3)= fac*func(8) - func(3)*term dfunc(4)= fac*func(8) - func(4)*term dfunc(5)= -gamm1*term*func(5) dfunc(6)= -2.*func(6)*func(1) - gamm1*func(6)*term - 2.*func(8)*func(4) dfunc(7)= -2.*func(7)*func(2) - gamm1*func(7)*term - 2.*func(8)*func(3) dfunc(8)= -func(6)*func(3) - func(7)*func(4) - gamma*func(8)*term return end subroutine param_derivs !---------------------------------------------------------------------- ! ! this subroutine plots the alpha-beta relation in the 2D Toy star solution ! !---------------------------------------------------------------------- subroutine exact_toystar_ACplane2D(astart,bstart,sigmain,gamma) use plotlib, only:plot_swin,plot_box,plot_label,plot_line real, intent(in) :: astart,bstart,sigmain,gamma integer, parameter :: npts = 2000 integer :: i real :: gamm1,gam1,sigma real :: polyk,Omega2,constk real :: xstart,xend,ymin,ymax,xi,term,extra real, dimension(npts) :: xplot, yplot print*,' plotting alpha-beta plane...' gamm1 = gamma - 1. gam1 = 1./gamm1 polyk = 0.25 Omega2 = 1.0 sigma = 1.0 print*,' alpha = ',astart,' beta = ',bstart, 'sigma = ',sigma,sigmain ! !--find integration constant from starting values of alpha and beta ! constk = (astart**2 + bstart**2 + Omega2 & + 2.*polyk*gamma*(sigma*bstart**gamma)*gam1**2)/bstart print*,' integration constant = ',constk ! !--find limits of plot (ie. where alpha = 0) ! xstart = 0.25 xend = 2.0 ! print*,'plotting k = ',k,' cstart = ',cstart,' astart = ',astart ! print*,'min c = ',xstart,' max c = ',xend xstart = xstart + 0.000001 xend = xend - 0.000001 extra = 0.1*(xend-xstart) !!xcentre = 0.5*(xstart + xend) ymax = 2.0 ymin = -2.0 call plot_swin(xstart-extra,xend+extra,ymin,ymax) call plot_box('bcnst',0.0,0,'1bvcnst',0.0,0) call plot_label ('beta','alpha',' ') do i=1,npts xi = xstart + (i-1)*npts xplot(i) = xi term = -(xi**2 + Omega2 + 2.*polyk*gamma*(sigma*xi**gamma)*gam1**2 + constk*xi) if (term <= 0) then yplot(i) = 0. else yplot(i) = sqrt(term) endif enddo call plot_line(npts,xplot,yplot) return end subroutine exact_toystar_ACplane2D end module toystar2D danieljprice-splash-4d1f09c/src/exact_wave.f90000066400000000000000000000041461477365367100213340ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- ! ---------------------------------------------------------------------- ! compute exact solution for a linear wave ! plots a sine function with a given amplitude, period and wavelength ! ---------------------------------------------------------------------- module wave implicit none contains subroutine exact_wave(time,ampl,period,lambda,x0,ymean,xplot,yplot,ierr) integer :: i real, parameter :: pi = 3.1415926536 real, intent(in) :: time, ampl, period, lambda, x0, ymean real, intent(in), dimension(:) :: xplot real, intent(out), dimension(size(xplot)) :: yplot integer, intent(out) :: ierr real :: omega print*,'plotting sine wave... mean = ',ymean print*,' lambda = ',lambda,' ampl = ',ampl,' period = ',period ! ! check for errors ! ierr = 0 if (lambda <= 0.) then print*,'error: lambda <= 0' ierr = 1 return endif if (abs(period) > tiny(period)) then omega = 2.*pi/period else print*,'warning: period <= 0' omega = 0. endif do i=1,size(xplot) if (abs(ymean) <= 0.) then yplot(i) = ymean + ampl*sin(2.*pi/lambda*(xplot(i)-x0) - omega*time) else yplot(i) = ymean*(1. + ampl*sin(2.*pi/lambda*(xplot(i)-x0) - omega*time)) endif enddo return end subroutine exact_wave end module wave danieljprice-splash-4d1f09c/src/extinction.f90000066400000000000000000000133561477365367100213750ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2022- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module extinction implicit none public :: get_extinction, get_extinction_los private contains !--------------------------------------------------------- ! routine to compute line-of-sight extinction to a ! collection of points (e.g. positions of sink particles) !--------------------------------------------------------- subroutine get_extinction(ncolumns,dat,npartoftype,masstype,itype,ndim,ntypes,& npts,xpts,ypts,zpts,coldens,icol) use labels, only:ix,ih,irho,ipmass use limits, only:get_particle_subset use projections3D, only:interpolate3D_proj_points use particle_data, only:icolourme use interpolation, only:get_n_interp,set_interpolation_weights use settings_data, only:iRescale,iverbose,required,UseTypeInRenderings use settings_part, only:iplotpartoftype use settings_render, only:npix,inormalise=>inormalise_interpolations,& idensityweightedinterpolation,exact_rendering use settings_xsecrot, only:anglex,angley,anglez use settings_units, only:units,unit_interp,unitzintegration use rotation, only:rotate_particles use params, only:int1 integer, intent(in) :: ncolumns,ntypes,ndim integer, intent(in) :: npartoftype(:) integer(kind=int1), intent(in) :: itype(:) real, intent(in) :: masstype(:) real, intent(in) :: dat(:,:) integer, intent(in) :: npts,icol real, intent(inout) :: xpts(npts),ypts(npts),zpts(npts) real, intent(out) :: coldens(:) integer :: n,ierr,mycol real, dimension(:), allocatable :: weight,x,y,z ! !--sanity checks ! if (ndim /= 3) then print "(a)",' ERROR: extinction only works with 3 dimensional data' return endif if (.not. (ih > 0 .and. ipmass > 0 .and. irho > 0)) then print "(a)",' ERROR: could not locate h,mass or rho in data' return endif if (icol < 0 .or. icol > ncolumns) then print "(a)",' ERROR: invalid column number for extinction' return endif mycol = icol if (mycol==0) mycol = irho ! !--set number of particles to use in the interpolation routines ! and allocate memory for weights ! n = get_n_interp(ntypes,npartoftype,UseTypeInRenderings,iplotpartoftype,size(itype),.false.) allocate(weight(n),x(n),y(n),z(n),stat=ierr) if (ierr /= 0) then print*,' ERROR allocating memory for interpolation weights, aborting...' return endif x(1:n) = dat(1:n,ix(1)) y(1:n) = dat(1:n,ix(2)) z(1:n) = dat(1:n,ix(3)) ! !--rotate positions if necessary ! call rotate_particles(n,x,y,z,anglex,angley,anglez) ! !--set interpolation weights (w = m/(rho*h^ndim) ! call set_interpolation_weights(weight,dat,itype,(iplotpartoftype .and. UseTypeInRenderings),& n,npartoftype,masstype,ntypes,ncolumns,irho,ipmass,ih,ndim,iRescale,& idensityweightedinterpolation,inormalise,units,unit_interp,required,.false.,isinktype=0) ! !--set default mask and apply range restrictions to data ! icolourme(:) = 1 call get_particle_subset(icolourme,dat,ncolumns) ! !--rotate positions if necessary ! call rotate_particles(npts,xpts,ypts,zpts,anglex,angley,anglez) ! ! interpolate column density (or other column-integrated quantity) ! to desired point locations ! call interpolate3D_proj_points(x,y,z,dat(1:n,ih),weight,dat(1:n,mycol),icolourme,n,& xpts,ypts,zpts,coldens,npts,inormalise,iverbose) ! ! adjust units of z-integrated quantity ! if (iRescale .and. units(ih) > 0. .and. .not.inormalise) then coldens = coldens*(unitzintegration/units(ih)) endif deallocate(x,y,z,weight) end subroutine get_extinction !-------------------------------------------------------------- ! routine to compute line-of-sight extinction from a ! given point (currently the origin) along a set of directions !-------------------------------------------------------------- subroutine get_extinction_los(ncolumns,dat,npartoftype,masstype,itype,ndim,ntypes,& ndirs,anglex_vals,angley_vals,anglez_vals,coldens,icol) use settings_xsecrot, only:anglex,angley,anglez use params, only:int1 integer, intent(in) :: ncolumns,ntypes,ndim integer, intent(in) :: npartoftype(:) integer(kind=int1), intent(in) :: itype(:) real, intent(in) :: masstype(:) real, intent(in) :: dat(:,:) integer, intent(in) :: ndirs,icol real, intent(in) :: anglex_vals(ndirs),angley_vals(ndirs),anglez_vals(ndirs) real, intent(out) :: coldens(ndirs) integer, parameter :: npts = 1 integer :: i real :: xpts(npts),ypts(npts),zpts(npts),coldensi(1) ! set the position from which to compute extinction as the origin xpts = 0.; ypts = 0.; zpts = 0. do i=1,ndirs anglex = anglex_vals(i) angley = angley_vals(i) anglez = anglez_vals(i) call get_extinction(ncolumns,dat,npartoftype,masstype,itype,ndim,ntypes,& npts,xpts,ypts,zpts,coldensi,icol) coldens(i) = coldensi(1) enddo end subroutine get_extinction_los end module extinction danieljprice-splash-4d1f09c/src/fieldlines.f90000066400000000000000000000347651477365367100213360ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2016 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! module for field line / flux tube plotting in 2 and 3 dimensions ! module fieldlines implicit none public :: streamlines,vecplot3D_proj private :: trace2D,interpolate_pt private contains !--------------------------------------------------------------------------- ! ! This subroutine integrates a 2D vector field to give the stream function ! Plotting the contours of this function gives the field/stream lines ! ! The solution is given by ! ! A(x,y) = \int v_x(x,y) dy - \int v_y(x,y) dx ! ! which we compute, knowing v_x and v_y on a fixed grid of square pixels, ! by a simple trapezoidal integration for each component. ! ! For SPH, this means we first interpolate the vector field to ! get v_x and v_y on the two-dimensional grid. This then also works for ! cross sections / projections of 3D vector fields by first interpolating ! to the 2D grid. ! ! ! Inputs: vecpixx(npixx,npixy) : x component of vector field on fixed grid ! vecpixy(npixx,npixy) : y component of vector field on fixed grid ! xmin, ymin : xmin and ymin of grid ! pixwidth : grid cell size (pixels are square) ! npixx,npixy : number of grid cells (pixels) in x,y ! ! Output: datpix(npixx,npixy) : stream function on fixed grid ! ! written by Daniel Price dprice@astro.ex.ac.uk ! ! Oct 2007: uses Simpson's rule instead of trapezoidal ! !--------------------------------------------------------------------------- subroutine streamlines(vecpixx,vecpixy,datpix,npixx,npixy,pixwidth) integer, intent(in) :: npixx,npixy real, intent(in), dimension(npixx,npixy) :: vecpixx,vecpixy real, intent(in) :: pixwidth real, intent(out), dimension(npixx,npixy) :: datpix real, dimension(npixx,npixy) :: datpix2 double precision :: fyj,fyjhalf,term,termi,termj,fxprevi,fyjprev double precision, dimension(npixx) :: fx,fxhalf integer :: i,j ! !--check for errors in input ! if (pixwidth <= 0.) then print "(1x,a)",'streamlines: error: pixel width <= 0' datpix = 0. return endif fyj = 0. fyjhalf = 0. ! !--perform the integration forwards ! do j=1,npixy do i=1,npixx term = 0. if (i==1) then fyj = 0. fyjhalf = 0. else fyjprev = fyj !--trapezoidal rule in x termj = 0.5*pixwidth*(vecpixy(i-1,j)+vecpixy(i,j)) fyj = fyj - termj if (mod(i-1,2)==0) then ! 3, 5, 7, 9 ... ! !--for odd points, use trapezoidal solution at half grid points ! to get Simpson's rule ! fyjhalf = fyjhalf - pixwidth*(vecpixy(i-2,j)+vecpixy(i,j)) term = term + 4./3.*fyj - 1./3.*fyjhalf else ! !--for even points, use Simpson's rule up to last odd point ! then finish with a trapezoidal integration over last two points ! term = term + 4./3.*fyjprev - 1./3.*fyjhalf - termj endif endif ! !--same as above but for integration in y ! if (j==1) then fx(i) = 0. fxhalf(i) = 0. fxprevi = 0. else fxprevi = fx(i) termi = 0.5*pixwidth*(vecpixx(i,j-1)+vecpixx(i,j)) fx(i) = fx(i) + termi if (mod(j-1,2)==0) then fxhalf(i) = fxhalf(i) + pixwidth*(vecpixx(i,j-2)+vecpixx(i,j)) term = term + 4./3.*fx(i) - 1./3.*fxhalf(i) else term = term + 4./3.*fxprevi - 1./3.*fxhalf(i) + termi endif endif datpix(i,j) = real(term) enddo enddo ! !--perform the integration backwards ! datpix2 = 0. do j=npixy,1,-1 do i=npixx,1,-1 term = 0. if (i==npixx) then fyj = 0. fyjhalf = 0. else fyjprev = fyj !--trapezoidal rule in x termj = 0.5*pixwidth*(vecpixy(i+1,j)+vecpixy(i,j)) fyj = fyj + termj if (mod(npixx-i,2)==0) then ! 3, 5, 7, 9 ... ! !--for odd points, use trapezoidal solution at half grid points ! to get Simpson's rule ! fyjhalf = fyjhalf + pixwidth*(vecpixy(i+2,j)+vecpixy(i,j)) term = term + 4./3.*fyj - 1./3.*fyjhalf else ! !--for even points, use Simpson's rule up to last odd point ! then finish with a trapezoidal integration over last two points ! term = term + 4./3.*fyjprev - 1./3.*fyjhalf + termj endif endif ! !--same as above but for integration in y ! if (j==npixy) then fx(i) = 0. fxhalf(i) = 0. fxprevi = 0. else fxprevi = fx(i) termi = 0.5*pixwidth*(vecpixx(i,j+1)+vecpixx(i,j)) fx(i) = fx(i) - termi if (mod(npixy-j,2)==0) then fxhalf(i) = fxhalf(i) - pixwidth*(vecpixx(i,j+2)+vecpixx(i,j)) term = term + 4./3.*fx(i) - 1./3.*fxhalf(i) else term = term + 4./3.*fxprevi - 1./3.*fxhalf(i) - termi endif endif datpix2(i,j) = real(term) enddo enddo ! !--average the two ! datpix = 0.5*(datpix + datpix2) return end subroutine streamlines !--------------------------------------------------------------------------------- ! ! THE REST OF THIS MODULE IS EITHER OLD, *VERY* EXPERIMENTAL AND/OR UNDOCUMENTED ! !--------------------------------------------------------------------------------- ! ! we want to trace the curve through a 2D vector field ! subroutine fieldlines2D(npart,x,y,vecx,vecy,h,pmass,rho,xmin,xmax,ymin,ymax) integer, intent(in) :: npart real, intent(in), dimension(npart) :: x,y,vecx,vecy,h,pmass,rho real, intent(in) :: xmin,xmax,ymin,ymax integer :: i,nlines real :: dx,dy,xstart,ystart,ymaxline nlines = 10 dx = (xmax-xmin)/nlines dy = (ymax-ymin)/nlines ystart = ymin ymaxline = ymin do while (ymaxline < ymax) do i=1,nlines xstart = xmin + (i-1)*dx + 0.5*dx print*,' tracing field line ',i,' x, y = ',xstart,ystart call trace2D(xstart,ystart,xmin,xmax,ymin,ymax,ymaxline, & x,y,vecx,vecy,h,pmass,rho,npart) enddo ystart = ymaxline + 0.5*dy enddo end subroutine fieldlines2D subroutine trace2D(xstart,ystart,xmin,xmax,ymin,ymax,ymaxline, & x,y,vecx,vecy,h,pmass,rho,npart) use plotlib, only:plot_line integer, intent(in) :: npart real, intent(in) :: xstart,ystart,xmin,xmax,ymin,ymax real, intent(inout) :: ymaxline real, dimension(npart), intent(in) :: x,y,vecx,vecy,h,pmass,rho integer :: ipt,npix real, dimension(2) :: xline, yline real :: runit,runit1,dx,dy,vx,vy,pixwidth,sign xline(1) = xstart yline(1) = ystart npix = 100 pixwidth = (xmax - xmin)/npix ipt = 0 sign = 1.0 do while ((xline(1) >= xmin .and. xline(1) <= xmax) .and. & (yline(1) >= ymin .and. yline(1) <= ymax) .and. ipt < 10*npix) ipt = ipt + 1 ! !--get dx and dy from interpolation of vector field from particles ! call interpolate_pt(xline(1),yline(1),vx,vy, & x,y,vecx,vecy,h,pmass,rho,npart) ! !--get unit vector in direction of vector ! runit = sqrt(vx**2 + vy**2) if (runit > 0) then runit1 = 1./runit dx = vx*runit1*pixwidth dy = vy*runit1*pixwidth else dx = 0. dy = 0. endif if (ipt==1 .and. dy < 0.) sign = -1.0 xline(2) = xline(1) + sign*dx yline(2) = yline(1) + sign*dy !!print*,'x, y = ',xline(2),yline(2) ymaxline = max(ymaxline,yline(2)) ! !--plot line segment ! call plot_line(2,xline,yline) xline(1) = xline(2) yline(1) = yline(2) enddo if (ipt >= 10*npix) print*,'WARNING: infinite field line' end subroutine trace2D ! !--interpolate from particles to single point ! would be nice to know neighbours ! subroutine interpolate_pt(xpt,ypt,vxpt,vypt,x,y,vecx,vecy,h,pmass,rho,npart) use kernels, only:radkernel2,wfunc,cnormk2D integer, intent(in) :: npart real, dimension(npart), intent(in) :: x,y,vecx,vecy,h,pmass,rho real, intent(in) :: xpt, ypt real, intent(out) :: vxpt, vypt real :: rho1i,term,const,dx,dy,hi1,q2,wab integer :: i vxpt = 0. vypt = 0. const = cnormk2D do i=1,npart dx = xpt - x(i) dy = ypt - y(i) hi1 = 1./h(i) q2 = (dx*dx + dy*dy)*hi1*hi1 ! !--if particles are within range, calculate contribution to this pt ! if (q2 < radkernel2) then if (rho(i) > 0.) then rho1i = 1./rho(i) else rho1i = 0. endif term = const*pmass(i)*rho1i wab = wfunc(q2) vxpt = vxpt + term*vecx(i)*wab vypt = vypt + term*vecy(i)*wab endif enddo end subroutine interpolate_pt !-------------------------------------------------------------------------- ! Visualisation of a 3D vector field in projection ! by means of "iron filings" drawn on particles ! ! We draw a line on each particle in the direction of the vector field ! This line is illuminated by reflections from a lighting source, and ! is drawn with an opacity proportional to the field strength, such that ! strong field regions are highlighted. ! ! For details of the lighting algorithm, see e.g. ! Stalling, Zoeckler and Hege, 1997, IEEE Trans. Viz. Comp. Graphics, 3, 118-128 ! ! Added by D. Price, Dec 2011 !-------------------------------------------------------------------------- subroutine vecplot3D_proj(x,y,z,vx,vy,vz,vecmax,weight,itype,n,dx,zobs,dscreen) use plotlib, only:plot_line,plot_bbuf,plot_ebuf,plot_slw,plot_sci,plot_set_opacity use plotlib, only:plot_qcr,plot_scr,plot_qlw,plot_arro,plot_sah use sort, only:indexx integer, intent(in) :: n real, dimension(n), intent(in) :: x,y,z,vx,vy,vz,weight integer, dimension(n), intent(in) :: itype real, intent(inout) :: vecmax real, intent(in) :: dx,zobs,dscreen integer, dimension(n) :: iorder integer :: i,ipart,np real, dimension(2) :: xpts,ypts real :: vxi,vyi,vzi,dvmag,zfrac,vmax,vmag,frac,ri,gi,bi,term,lw real :: toti,fambient,diffuse,specular,fdiff,fspec,ldotn,vdotr,ldott,vdott integer :: pdiff,nspec,lwold real, dimension(3) :: vunit,lighting,viewangle logical :: white_bg,use3Dperspective ! !--get the max adaptively if it is not already set ! if (vecmax <= 0. .or. vecmax > 0.5*huge(vecmax)) then vmax = 0. do i=1,n if (itype(i) >= 0 .and. weight(i) > 0.) then vmax = max(vx(i)**2 + vy(i)**2 + vz(i)**2,vmax) endif enddo vmax = sqrt(vmax) vecmax = vmax else vmax = vecmax endif use3Dperspective = abs(dscreen) > tiny(dscreen) ! !--work out whether or not we have a white or black ! background colour ! !call plot_sah(1,20.,1.0) call plot_qcr(0,ri,gi,bi) white_bg = (ri + gi + bi > 1.5) ! !--specify the parameters in the lighting algorithm ! these should differ depending on whether we are drawing ! on a white or black background ! if (white_bg) then fambient = 0. fdiff = 0.1 fspec = 0.5 else fambient = 0.3 fdiff = 0.7 fspec = 0.8 endif pdiff = 4 nspec = 12 ! !--specify the viewing and lighting angles ! viewangle = (/0.,0.,1./) !lighting = (/0.3,0.3,1./) lighting = (/0.,0.,1./) !--make sure these are normalised !lighting = lighting/sqrt(dot_product(lighting,lighting)) print*,'plotting 3D field structure: min,max = ',1.e-3*vmax,vmax ! !--first sort the particles in z so that we do the opacity in the correct order ! call indexx(n,z,iorder) call plot_bbuf call plot_qcr(1,ri,gi,bi) np = 0 zfrac = 1. call plot_qlw(lwold) lw = 2.*lwold over_particles: do ipart=1,n i = iorder(ipart) if (itype(i) >= 0 .and. weight(i) > 0.) then if (use3Dperspective) then if (z(i) > zobs) cycle over_particles zfrac = abs(dscreen/(z(i)-zobs)) endif !if (mod(ipart,10)/=0) cycle over_particles ! lw = min(zfrac,2.5) vxi = vx(i) vyi = vy(i) vzi = vz(i) ! !--we draw lines on each particle with an ! opacity proportional to the field strength ! vmag = sqrt(vxi**2 + vyi**2 + vzi**2) dvmag = 1./vmag vunit = abs((/vxi,vyi,vzi/)*dvmag) frac = min(vmag/vmax,1.0) if (frac >= 1.e-3) then !--specify the length of line to draw term = 1.5*dx*dvmag*zfrac !term = term*(vmag/vmax)**0.2 xpts(1) = x(i) - vxi*term xpts(2) = x(i) + vxi*term ypts(1) = y(i) - vyi*term ypts(2) = y(i) + vyi*term !--draw "halo" in background colour with ! twice the thickness, same opacity call plot_slw(2.*lw) call plot_sci(0) call plot_set_opacity(frac) call plot_line(2,xpts,ypts) !--Phong lighting ldott = dot_product(lighting,vunit) ldotn = sqrt(1. - ldott**2) diffuse = fdiff*(ldotn)**pdiff vdott = dot_product(viewangle,vunit) vdotr = ldotn*sqrt(1. - vdott**2) - ldott*vdott specular = fspec*(vdotr)**nspec toti = (fambient + diffuse + specular) !--draw line with intensity proportional ! to the amount of lighting !call plot_scr(1,toti,toti,toti,max(frac,0.15)) call plot_scr(1,toti,toti,toti,max(frac,0.05)) call plot_sci(1) call plot_slw(lw) call plot_line(2,xpts,ypts) !call plot_arro(xpts(1),ypts(1),xpts(2),ypts(2)) np = np + 1 endif endif enddo over_particles !--reset opacity for both foreground and background colour indices call plot_sci(0) call plot_set_opacity(1.0) call plot_sci(1) call plot_scr(1,ri,gi,bi) call plot_set_opacity(1.0) call plot_ebuf call plot_slw(lwold) print*,' plotted ',np,' of ',n,' particles' end subroutine vecplot3D_proj end module fieldlines danieljprice-splash-4d1f09c/src/fparser.f90000066400000000000000000001443171477365367100206550ustar00rootroot00000000000000! ! Copyright (c) 2000-2008, Roland Schmehl. All rights reserved. ! ! This software is distributable under the BSD license. See the terms of the ! BSD license in the documentation provided with this software. ! module fparser !------- -------- --------- --------- --------- --------- --------- --------- ------- ! Fortran 90 function parser v1.1 !------- -------- --------- --------- --------- --------- --------- --------- ------- ! ! This function parser module is intended for applications where a set of mathematical ! fortran-style expressions is specified at runtime and is then evaluated for a large ! number of variable values. This is done by compiling the set of function strings ! into byte code, which is interpreted efficiently for the various variable values. ! ! The source code is available from http://fparser.sourceforge.net ! ! Please send comments, corrections or questions to the author: ! Roland Schmehl ! !------- -------- --------- --------- --------- --------- --------- --------- ------- ! The function parser concept is based on a C++ class library written by Juha ! Nieminen available from http://warp.povusers.org/FunctionParser/ !------- -------- --------- --------- --------- --------- --------- --------- ------- ! ! Modifications by D, Price for integration in SPLASH: ! 7th Aug 2009: added checkf interface routine to check syntax without compiling code ! added endf routine to stop memory leaks, also called from initf if needed ! bug fix with error message for sqrt(-ve) ! ! 9th Aug 2009: added Mathematical constant recognition (pi) ! ! 27th Jan 2010: check for -ve numbers to fractional powers and zero to negative power added ! ! 19th Oct 2016: added Fortran 2008 intrinsic functions ! added optional iErrType argument for error message printing ! ! 5th Mar 2019: added atan2 function (and parsing of functions with two arguments) implicit none !--modification here by D.Price: define type parameters here rather than in a separate module integer, parameter, public :: rn = KIND(0.0d0) ! Precision of real numbers !--modification (22/6/2018), adjusted integer kind to allow more than 128 variables integer, parameter, private :: is = SELECTED_INT_KIND(4) ! Data type of bytecode !--end modification !------- -------- --------- --------- --------- --------- --------- --------- ------- PUBLIC :: initf, & ! Initialize function parser for n functions parsef, & ! Parse single function string evalf, & ! Evaluate single function checkf, & ! Check syntax in a function string endf, & ! Clean up memory once finished EvalErrMsg ! Error message (Use only when EvalErrType>0) integer, PUBLIC :: EvalErrType ! =0: no error occured, >0: evaluation error !--modification by D. Price: add parseErr parameter (used in checkf) integer, PRIVATE :: ParseErrType ! =0: no error occured, >0: parse error !--modification by D. Price: add verboseness internal variable (used in checkf) LOGICAL, PRIVATE :: PrintErrors = .true. ! =0: no error occured, >0: parse error !--modification by J. Wurster: added cgs and code versions of mu0 real, PUBLIC :: mu0=1.0_rn ! =1 for code units, 4pi for cgs !------- -------- --------- --------- --------- --------- --------- --------- ------- PRIVATE SAVE integer(is), PARAMETER :: cImmed = 1, & cNeg = 2, & cAdd = 3, & cSub = 4, & cMul = 5, & cDiv = 6, & cPow = 7, & cAbs = 8, & cExp = 9, & cLog10 = 10, & cLog = 11, & cSqrt = 12, & cSinh = 13, & cCosh = 14, & cTanh = 15, & cSin = 16, & cCos = 17, & cTan = 18, & cAsin = 19, & cAcos = 20, & cAtan2 = 21, & cAtan = 22, & cBesj0 = 23, & cBesj1 = 24, & cBesy0 = 25, & cBesy1 = 26, & cerfcs = 27, & cerfc = 28, & cerf = 29, & cgamma = 30, & VarBegin = 31 CHARACTER (LEN=1), dimension(cAdd:cPow), PARAMETER :: Ops = (/ '+', & '-', & '*', & '/', & '^' /) CHARACTER (LEN=5), dimension(cAbs:cgamma), PARAMETER :: Funcs = (/'abs ', & 'exp ', & 'log10', & 'log ', & 'sqrt ', & 'sinh ', & 'cosh ', & 'tanh ', & 'sin ', & 'cos ', & 'tan ', & 'asin ', & 'acos ', & 'atan2', & 'atan ', & 'besj0', & 'besj1', & 'besy0', & 'besy1', & 'erfcs', & 'erfc ', & 'erf ', & 'gamf ' /) TYPE tComp integer(is), dimension(:), POINTER :: ByteCode integer :: ByteCodeSize real(rn), dimension(:), POINTER :: Immed integer :: ImmedSize real(rn), dimension(:), POINTER :: Stack integer :: StackSize, & StackPtr END TYPE tComp TYPE (tComp), dimension(:), POINTER :: Comp ! Bytecode integer, dimension(:), ALLOCATABLE :: ipos ! Associates function strings ! contains ! subroutine initf (n) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Initialize function parser for n functions !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: n ! Number of functions integer :: i !----- -------- --------- --------- --------- --------- --------- --------- ------- if (ASSOCIATED(Comp)) then print "(a)",' fparser warning: initf called repeatedly without prior call to endf' CALL endf ENDIF ALLOCATE (Comp(n)) DO i=1,n NULLIFY (Comp(i)%ByteCode,Comp(i)%Immed,Comp(i)%Stack) end do end subroutine initf ! subroutine endf() !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Clean up memory at the end of the function parsing/evaluation calls (D. Price) !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer :: i !----- -------- --------- --------- --------- --------- --------- --------- ------- if (ASSOCIATED(Comp)) then DO i=1,size(Comp) if (ASSOCIATED(Comp(i)%ByteCode)) DEALLOCATE ( Comp(i)%ByteCode, & Comp(i)%Immed, & Comp(i)%Stack ) enddo DEALLOCATE(Comp) ENDIF end subroutine endf ! subroutine parsef (i, FuncStr, Var, err, Verbose) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Parse ith function string FuncStr and compile it into bytecode !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: i ! Function identifier CHARACTER (LEN=*), INTENT(in) :: FuncStr ! Function string CHARACTER (LEN=*), dimension(:), INTENT(in) :: Var ! Array with variable names CHARACTER (LEN=LEN(FuncStr)) :: Func ! Function string, local use integer, INTENT(OUT), OPTIONAL :: err LOGICAL, INTENT(IN), OPTIONAL :: Verbose ! Turn error messages on/off !----- -------- --------- --------- --------- --------- --------- --------- ------- if (i < 1 .OR. i > SIZE(Comp)) then write(*,*) '*** Parser error: Function number ',i,' out of range' if (present(err)) err = 1 return END IF EvalErrType = 0 ! D. Price : to prevent accidental misuse ParseErrType = 0 PrintErrors = .true. if (present(Verbose)) PrintErrors = Verbose ALLOCATE (ipos(LEN(Func))) ! Char. positions in orig. string Func = FuncStr ! Local copy of function string CALL Replace ('**','^ ',Func) ! Exponent into 1-Char. format CALL RemoveSpaces (Func) ! Condense function string !CALL GetConstants (Func) CALL CheckSyntax (Func,FuncStr,Var) DEALLOCATE (ipos) if (present(err)) err = ParseErrType PrintErrors = .true. ! reset this to true !--D. Price: return after ParseErr here instead of stop inside CheckSyntax if (ParseErrType /= 0) return CALL Compile (i,Func,Var) ! Compile into bytecode end subroutine parsef ! integer FUNCTION checkf(FuncStr, Var, Verbose) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check syntax in a function string (added by D. Price) but do not compile it ! Returns an error code NOT related to ErrMsg ! Optional variable "verbose" determines whether or not error messages are printed !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(IN) :: FuncStr ! Function string CHARACTER (LEN=*), dimension(:), INTENT(IN) :: Var ! Array with variable names LOGICAL, INTENT(IN), OPTIONAL :: Verbose ! Turn error messages on/off CHARACTER (LEN=LEN(FuncStr)) :: Func ! Function string, local use !----- -------- --------- --------- --------- --------- --------- --------- ------- EvalErrType = 0 ! D. Price : to prevent accidental misuse ParseErrType = 0 PrintErrors = .true. if (present(Verbose)) PrintErrors = Verbose ALLOCATE (ipos(LEN(Func))) ! Char. positions in orig. string Func = FuncStr ! Local copy of function string CALL Replace ('**','^ ',Func) ! Exponent into 1-Char. format CALL RemoveSpaces (Func) ! Condense function string !CALL GetConstants (Func) CALL CheckSyntax (Func,FuncStr,Var) DEALLOCATE (ipos) PrintErrors = .true. ! reset this to true checkf = ParseErrType END FUNCTION checkf ! FUNCTION evalf (i, Val) RESULT (res) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Evaluate bytecode of ith function for the values passed in array Val(:) !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: i ! Function identifier real(rn), dimension(:), INTENT(in) :: Val ! Variable values real(rn) :: res ! Result integer :: IP, & ! Instruction pointer DP, & ! Data pointer SP ! Stack pointer real(rn), PARAMETER :: zero = 0._rn !----- -------- --------- --------- --------- --------- --------- --------- ------- DP = 1 SP = 0 DO IP=1,Comp(i)%ByteCodeSize SELECT CASE (Comp(i)%ByteCode(IP)) CASE (cImmed); SP=SP+1; Comp(i)%Stack(SP)=Comp(i)%Immed(DP); DP=DP+1 CASE (cNeg); Comp(i)%Stack(SP)=-Comp(i)%Stack(SP) CASE (cAdd); Comp(i)%Stack(SP-1)=Comp(i)%Stack(SP-1)+Comp(i)%Stack(SP); SP=SP-1 CASE (cSub); Comp(i)%Stack(SP-1)=Comp(i)%Stack(SP-1)-Comp(i)%Stack(SP); SP=SP-1 CASE (cMul); Comp(i)%Stack(SP-1)=Comp(i)%Stack(SP-1)*Comp(i)%Stack(SP); SP=SP-1 CASE (cDiv); if (Comp(i)%Stack(SP)==0._rn) then; EvalErrType=1; res=zero; return; ENDIF Comp(i)%Stack(SP-1)=Comp(i)%Stack(SP-1)/Comp(i)%Stack(SP); SP=SP-1 ! D. Price: check for zero to negative powers and negative numbers to fractional powers CASE (cPow); if (Comp(i)%Stack(SP-1)==0._rn .and.Comp(i)%Stack(SP)<0._rn) & THEN; EvalErrType=1; res=zero; return; ENDIF if (Comp(i)%Stack(SP-1)<=0._rn .and.(Comp(i)%Stack(SP) /= nint(Comp(i)%Stack(SP)))) & THEN; EvalErrType=5; res=zero; return; ENDIF Comp(i)%Stack(SP-1)=Comp(i)%Stack(SP-1)**Comp(i)%Stack(SP); SP=SP-1 CASE (cAbs); Comp(i)%Stack(SP)=ABS(Comp(i)%Stack(SP)) CASE (cExp); Comp(i)%Stack(SP)=exp(Comp(i)%Stack(SP)) CASE (cLog10); if (Comp(i)%Stack(SP)<=0._rn) then; EvalErrType=3; res=zero; return; ENDIF Comp(i)%Stack(SP)=LOG10(Comp(i)%Stack(SP)) CASE (cLog); if (Comp(i)%Stack(SP)<=0._rn) then; EvalErrType=3; res=zero; return; ENDIF Comp(i)%Stack(SP)=log(Comp(i)%Stack(SP)) CASE (cSqrt); if (Comp(i)%Stack(SP)<0._rn) then; EvalErrType=2; res=zero; return; ENDIF Comp(i)%Stack(SP)=sqrt(Comp(i)%Stack(SP)) CASE (cSinh); Comp(i)%Stack(SP)=SINH(Comp(i)%Stack(SP)) CASE (cCosh); Comp(i)%Stack(SP)=COSH(Comp(i)%Stack(SP)) CASE (cTanh); Comp(i)%Stack(SP)=TANH(Comp(i)%Stack(SP)) CASE (cSin); Comp(i)%Stack(SP)=sin(Comp(i)%Stack(SP)) CASE (cCos); Comp(i)%Stack(SP)=cos(Comp(i)%Stack(SP)) CASE (cTan); Comp(i)%Stack(SP)=TAN(Comp(i)%Stack(SP)) CASE (cAsin); if ((Comp(i)%Stack(SP)<-1._rn).OR.(Comp(i)%Stack(SP)>1._rn)) then EvalErrType=4; res=zero; return; ENDIF Comp(i)%Stack(SP)=asin(Comp(i)%Stack(SP)) CASE (cAcos); if ((Comp(i)%Stack(SP)<-1._rn).OR.(Comp(i)%Stack(SP)>1._rn)) then EvalErrType=4; res=zero; return; ENDIF Comp(i)%Stack(SP)=acos(Comp(i)%Stack(SP)) CASE (cAtan2); Comp(i)%Stack(SP-1)=atan2(Comp(i)%Stack(SP-1),Comp(i)%Stack(SP)); SP=SP-1 CASE (cAtan); Comp(i)%Stack(SP)=atan(Comp(i)%Stack(SP)) CASE (cBesj0); Comp(i)%Stack(SP)=bessel_j0(Comp(i)%Stack(SP)) CASE (cBesj1); Comp(i)%Stack(SP)=bessel_j1(Comp(i)%Stack(SP)) CASE (cBesy0); if (Comp(i)%Stack(SP)<=0._rn) then; EvalErrType=6; res=zero; return; ENDIF Comp(i)%Stack(SP)=bessel_y0(Comp(i)%Stack(SP)) CASE (cBesy1); if (Comp(i)%Stack(SP)<=0._rn) then; EvalErrType=7; res=zero; return; ENDIF Comp(i)%Stack(SP)=bessel_y1(Comp(i)%Stack(SP)) CASE (cerf); Comp(i)%Stack(SP)=erf(Comp(i)%Stack(SP)) CASE (cerfc); Comp(i)%Stack(SP)=erfc(Comp(i)%Stack(SP)) CASE (cerfcs); Comp(i)%Stack(SP)=erfc_scaled(Comp(i)%Stack(SP)) CASE (cgamma); if (Comp(i)%Stack(SP)==-abs(nint(Comp(i)%Stack(SP)))) then; EvalErrType=8; res=zero; return; ENDIF Comp(i)%Stack(SP)=gamma(Comp(i)%Stack(SP)) CASE DEFAULT; SP=SP+1; Comp(i)%Stack(SP)=Val(Comp(i)%ByteCode(IP)-VarBegin+1) END SELECT end do EvalErrType = 0 res = Comp(i)%Stack(1) END FUNCTION evalf ! subroutine CheckSyntax (Func,FuncStr,Var) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check syntax of function string, returns 0 if syntax is ok !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: Func ! Function string without spaces CHARACTER (LEN=*), INTENT(in) :: FuncStr ! Original function string CHARACTER (LEN=*), dimension(:), INTENT(in) :: Var ! Array with variable names integer(is) :: n CHARACTER (LEN=1) :: c real(rn) :: r LOGICAL :: err integer :: ParCnt, & ! Parenthesis counter j,ib,in,lFunc,inold,ibold !----- -------- --------- --------- --------- --------- --------- --------- ------- j = 1 ParCnt = 0 lFunc = LEN_TRIM(Func) step: DO if (j > lFunc) then CALL ParseErrMsg (j, FuncStr) EXIT ENDIF c = Func(j:j) !-- -------- --------- --------- --------- --------- --------- --------- ------- ! Check for valid operand (must appear) !-- -------- --------- --------- --------- --------- --------- --------- ------- if (c == '-' .OR. c == '+') then ! Check for leading - or + j = j+1 if (j > lFunc) then CALL ParseErrMsg (j, FuncStr, 'Missing operand') EXIT ENDIF c = Func(j:j) if (ANY(c == Ops) .or. c == ',') then CALL ParseErrMsg (j, FuncStr, 'Multiple operators') EXIT ENDIF END IF n = MathFunctionIndex (Func(j:)) if (n > 0) then ! Check for math function j = j+LEN_TRIM(Funcs(n)) if (j > lFunc) then CALL ParseErrMsg (j, FuncStr, 'Missing function argument') EXIT ENDIF c = Func(j:j) if (c /= '(') then CALL ParseErrMsg (j, FuncStr, 'Missing opening parenthesis') EXIT ENDIF if (n == cAtan2) then ! Check #args for function with two arguments if (CountArgs(Func(j:)) /= 2) then CALL ParseErrMsg (j, FuncStr, 'Function expects two arguments') EXIT ENDIF ELSE if (CountArgs(Func(j:)) > 1) then CALL ParseErrMsg (j, FuncStr, 'Too many function arguments') EXIT ENDIF ENDIF END IF if (c == '(') then ! Check for opening parenthesis ParCnt = ParCnt+1 j = j+1 CYCLE step END IF if (SCAN(c,'0123456789.') > 0) then ! Check for number r = RealNum (Func(j:),ib,in,err) if (err) then CALL ParseErrMsg (j, FuncStr, 'Invalid number format: '//Func(j+ib-1:j+in-2)) EXIT ENDIF j = j+in-1 if (j > lFunc) EXIT c = Func(j:j) ELSE ! Check for variable n = VariableIndex (Func(j:),Var,ib,in) if (n == 0) then ! DP: If not a variable, check for constants ibold = ib inold = in r = MathConst (Func(j:),ib,in,err) if (err) then ! Return error if constants not found CALL ParseErrMsg (j, FuncStr, 'Invalid element: '//Func(j+ib-1:j+in-2)) ib = ibold in = inold EXIT ENDIF ENDIF j = j+in-1 if (j > lFunc) EXIT c = Func(j:j) END IF DO WHILE (c == ')') ! Check for closing parenthesis ParCnt = ParCnt-1 if (ParCnt < 0) CALL ParseErrMsg (j, FuncStr, 'Mismatched parenthesis') if (Func(j-1:j-1) == '(') CALL ParseErrMsg (j-1, FuncStr, 'Empty parentheses') j = j+1 if (j > lFunc) EXIT c = Func(j:j) end do !-- -------- --------- --------- --------- --------- --------- --------- ------- ! Now, we have a legal operand: A legal operator or end of string must follow !-- -------- --------- --------- --------- --------- --------- --------- ------- if (j > lFunc) EXIT if (ANY(c == Ops) .or. c == ',') then ! Check for multiple operators if (j+1 > lFunc) CALL ParseErrMsg (j, FuncStr) if (ANY(Func(j+1:j+1) == Ops)) CALL ParseErrMsg (j+1, FuncStr, 'Multiple operators') ELSE ! Check for next operand CALL ParseErrMsg (j, FuncStr, 'Missing operator') END IF !-- -------- --------- --------- --------- --------- --------- --------- ------- ! Now, we have an operand and an operator: the next loop will check for another ! operand (must appear) !-- -------- --------- --------- --------- --------- --------- --------- ------- j = j+1 end do step if (ParCnt > 0) CALL ParseErrMsg (j, FuncStr, 'Missing )') end subroutine CheckSyntax ! FUNCTION EvalErrMsg ( ierrType ) RESULT (msg) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Return error message !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), dimension(8), PARAMETER :: m = (/ 'Division by zero ', & 'Argument of SQRT negative ', & 'Argument of LOG <= 0 ', & 'Argument of ASIN or ACOS illegal ', & '-ve number to fractional power ', & 'Argument of Bessel_y0 <= 0 ', & 'Argument of Bessel_y1 <= 0 ', & 'Argument of Gamma function illegal '/) CHARACTER (LEN=LEN(m)) :: msg integer, INTENT(in), OPTIONAL :: ierrType !----- -------- --------- --------- --------- --------- --------- --------- ------- if (present(ierrType)) then if (iErrType < 1 .OR. iErrType > SIZE(m)) then msg = '' ELSE msg = m(iErrType) ENDIF ELSE if (EvalErrType < 1 .OR. EvalErrType > SIZE(m)) then msg = '' ELSE msg = m(EvalErrType) ENDIF ENDIF END FUNCTION EvalErrMsg ! subroutine ParseErrMsg (j, FuncStr, Msg) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Print error message (modification by D.Price: do not terminate program, ! also added option to not print error message) !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: j CHARACTER (LEN=*), INTENT(in) :: FuncStr ! Original function string CHARACTER (LEN=*), OPTIONAL, INTENT(in) :: Msg integer :: k !----- -------- --------- --------- --------- --------- --------- --------- ------- if (PrintErrors) then if (PRESENT(Msg)) then write(*,*) '*** Error in syntax of function string: '//Msg ELSE write(*,*) '*** Error in syntax of function string:' ENDIF write(*,*) write(*,'(A)') ' '//FuncStr if (ALLOCATED(ipos)) then ! Avoid out-of-bounds-errors if (SIZE(ipos) >= j) then DO k=1,ipos(j) write(*,'(A)',ADVANCE='NO') ' ' ! Advance to the jth position end do write(*,'(A)') '?' ENDIF ENDIF ENDIF ParseErrType = 1 end subroutine ParseErrMsg ! FUNCTION OperatorIndex (c) RESULT (n) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Return operator index !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=1), INTENT(in) :: c integer(is) :: n,j !----- -------- --------- --------- --------- --------- --------- --------- ------- n = 0 DO j=cAdd,cPow if (c == Ops(j)) then n = j EXIT END IF end do END FUNCTION OperatorIndex ! FUNCTION MathFunctionIndex (str) RESULT (n) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Return index of math function beginnig at 1st position of string str !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: str integer(is) :: n,j integer :: k CHARACTER (LEN=LEN(Funcs)) :: fun !----- -------- --------- --------- --------- --------- --------- --------- ------- n = 0 DO j=cAbs,cgamma ! Check all math functions k = MIN(LEN_TRIM(Funcs(j)), LEN(str)) CALL LowCase (str(1:k), fun) if (fun == Funcs(j)) then ! Compare lower case letters n = j ! Found a matching function EXIT END IF end do END FUNCTION MathFunctionIndex ! FUNCTION VariableIndex (str, Var, ibegin, inext) RESULT (n) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Return index of variable at begin of string str (returns 0 if no variable found) !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: str ! String CHARACTER (LEN=*), dimension(:), INTENT(in) :: Var ! Array with variable names integer(is) :: n,j ! Index of variable integer, OPTIONAL, INTENT(out) :: ibegin, & ! Start position of variable name inext ! Position of character after name integer :: ib,in,lstr !----- -------- --------- --------- --------- --------- --------- --------- ------- n = 0 lstr = LEN_TRIM(str) if (lstr > 0) then DO ib=1,lstr ! Search for first character in str if (str(ib:ib) /= ' ') EXIT ! When lstr>0 at least 1 char in str end do DO in=ib,lstr ! Search for name terminators if (SCAN(str(in:in),'+-*/^,) ') > 0) EXIT end do DO j=1,SIZE(Var,kind=is) if (str(ib:in-1) == Var(j)) then n = j ! Variable name found EXIT END IF end do !--else below added by D. Price - should never be required though ELSE ! blank string ib = 1 ! to avoid compiler warnings in = 2 ! and any possible seg fault END IF if (PRESENT(ibegin)) ibegin = ib if (PRESENT(inext)) inext = in END FUNCTION VariableIndex ! subroutine RemoveSpaces (str) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Remove Spaces from string, remember positions of characters in old string !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(inout) :: str integer :: k,lstr !----- -------- --------- --------- --------- --------- --------- --------- ------- lstr = LEN_TRIM(str) ipos = 0 do k=1,lstr ipos(k) = k enddo k = 1 DO WHILE (str(k:lstr) /= ' ') if (str(k:k) == ' ') then str(k:lstr) = str(k+1:lstr)//' ' ! Move 1 character to left ipos(k:lstr) = (/ ipos(k+1:lstr), 0 /) ! Move 1 element to left k = k-1 END IF k = k+1 end do end subroutine RemoveSpaces ! subroutine Replace (ca,cb,str) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Replace ALL appearances of character set ca in string str by character set cb !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: ca CHARACTER (LEN=LEN(ca)), INTENT(in) :: cb ! LEN(ca) must be LEN(cb) CHARACTER (LEN=*), INTENT(inout) :: str integer :: j,lca !----- -------- --------- --------- --------- --------- --------- --------- ------- lca = LEN(ca) DO j=1,LEN_TRIM(str)-lca+1 if (str(j:j+lca-1) == ca) str(j:j+lca-1) = cb end do end subroutine Replace ! FUNCTION CountArgs(str) RESULT(n) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Count number of arguments in a function string !----- -------- --------- --------- --------- --------- --------- --------- ------- CHARACTER (LEN=*), INTENT(in) :: str integer :: n,j n = 1 DO j=1,len_trim(str) if (str(j:j) == ',') n = n + 1 enddo END FUNCTION CountArgs ! subroutine Compile (i, F, Var) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Compile i-th function string F into bytecode !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: i ! Function identifier CHARACTER (LEN=*), INTENT(in) :: F ! Function string CHARACTER (LEN=*), dimension(:), INTENT(in) :: Var ! Array with variable names integer :: istat !----- -------- --------- --------- --------- --------- --------- --------- ------- if (ASSOCIATED(Comp(i)%ByteCode)) DEALLOCATE ( Comp(i)%ByteCode, & Comp(i)%Immed, & Comp(i)%Stack ) Comp(i)%ByteCodeSize = 0 Comp(i)%ImmedSize = 0 Comp(i)%StackSize = 0 Comp(i)%StackPtr = 0 CALL CompileSubstr (i,F,1,LEN_TRIM(F),Var) ! Compile string to determine size ALLOCATE ( Comp(i)%ByteCode(Comp(i)%ByteCodeSize), & Comp(i)%Immed(Comp(i)%ImmedSize), & Comp(i)%Stack(Comp(i)%StackSize), & STAT = istat ) if (istat /= 0) then write(*,*) '*** Parser error: Memory allocation for byte code failed' stop ELSE Comp(i)%ByteCodeSize = 0 Comp(i)%ImmedSize = 0 Comp(i)%StackSize = 0 Comp(i)%StackPtr = 0 CALL CompileSubstr (i,F,1,LEN_TRIM(F),Var) ! Compile string into bytecode END IF ! end subroutine Compile ! subroutine AddCompiledByte (i, b) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Add compiled byte to bytecode !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: i ! Function identifier integer(is), INTENT(in) :: b ! Value of byte to be added !----- -------- --------- --------- --------- --------- --------- --------- ------- Comp(i)%ByteCodeSize = Comp(i)%ByteCodeSize + 1 if (ASSOCIATED(Comp(i)%ByteCode)) Comp(i)%ByteCode(Comp(i)%ByteCodeSize) = b end subroutine AddCompiledByte ! FUNCTION MathItemIndex (i, F, Var) RESULT (n) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Return math item index, if item is real number, enter it into Comp-structure !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: i ! Function identifier CHARACTER (LEN=*), INTENT(in) :: F ! Function substring CHARACTER (LEN=*), dimension(:), INTENT(in) :: Var ! Array with variable names integer(is) :: n ! Byte value of math item !----- -------- --------- --------- --------- --------- --------- --------- ------- n = 0 if (SCAN(F(1:1),'0123456789.') > 0) then ! Check for begin of a number Comp(i)%ImmedSize = Comp(i)%ImmedSize + 1 if (ASSOCIATED(Comp(i)%Immed)) Comp(i)%Immed(Comp(i)%ImmedSize) = RealNum (F) n = cImmed ELSE ! Check for a variable n = VariableIndex (F, Var) if (n > 0) then n = VarBegin+n-1_is ELSE ! Check for Mathematical constants n = MathConstIndex(i, F) ENDIF END IF END FUNCTION MathItemIndex ! FUNCTION MathConstIndex (i, F, ibegin, inext) RESULT (n) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Routine added by D. Price ! Substitute values for Mathematical Constants (e.g. pi) !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: i ! Function identifier CHARACTER (LEN=*), INTENT(in) :: F ! Function substring integer, OPTIONAL, INTENT(out) :: ibegin, & ! Start position of real number inext ! 1st character after real number integer(is) :: n ! Byte value of math item real(rn) :: res LOGICAL :: err integer :: ib,in !----- -------- --------- --------- --------- --------- --------- --------- ------- n = 0 res = MathConst(F,ib,in,err) if (.not.err) then Comp(i)%ImmedSize = Comp(i)%ImmedSize + 1 if (ASSOCIATED(Comp(i)%Immed)) Comp(i)%Immed(Comp(i)%ImmedSize) = res n = cImmed ELSE ib = 1 in = 1 END IF if (PRESENT(ibegin)) ibegin = ib if (PRESENT(inext)) inext = in END FUNCTION MathConstIndex ! FUNCTION CompletelyEnclosed (F, b, e) RESULT (res) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check if function substring F(b:e) is completely enclosed by a pair of parenthesis !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: F ! Function substring integer, INTENT(in) :: b,e ! First and last pos. of substring LOGICAL :: res integer :: j,k !----- -------- --------- --------- --------- --------- --------- --------- ------- res=.false. if (F(b:b) == '(' .AND. F(e:e) == ')') then k = 0 DO j=b+1,e-1 IF (F(j:j) == '(') then k = k+1 ELSEif (F(j:j) == ')') then k = k-1 END IF if (k < 0) EXIT end do if (k == 0) res=.true. ! All opened parenthesis closed END IF END FUNCTION CompletelyEnclosed FUNCTION TwoArgs (F, b, e, m) RESULT (res) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check if function substring F(b:e) has two arguments i.e. f(a,b) !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: F ! Function substring integer, INTENT(in) :: b,e ! First and last pos. of substring integer, INTENT(out) :: m LOGICAL :: res res = .false. m = INDEX(F(b:e),',') if (m > 0) then res = .true. m = b + m - 1 ENDIF END FUNCTION TwoArgs ! RECURSIVE subroutine CompileSubstr (i, F, b, e, Var) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Compile i-th function string F into bytecode !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: i ! Function identifier CHARACTER (LEN=*), INTENT(in) :: F ! Function substring integer, INTENT(in) :: b,e ! Begin and end position substring CHARACTER (LEN=*), dimension(:), INTENT(in) :: Var ! Array with variable names integer(is) :: n integer :: b2,j,k,io,m CHARACTER (LEN=*), PARAMETER :: calpha = 'abcdefghijklmnopqrstuvwxyz'// & 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check for special cases of substring !----- -------- --------- --------- --------- --------- --------- --------- ------- ! write(*,*) 'PARSING F(b:e) = '//F(b:e) IF (F(b:b) == '+') then ! Case 1: F(b:e) = '+...' ! write(*,*)'1. F(b:e) = "+..."' CALL CompileSubstr (i, F, b+1, e, Var) return ELSEif (CompletelyEnclosed (F, b, e)) then ! Case 2: F(b:e) = '(...)' ! write(*,*)'2. F(b:e) = "(...)"' CALL CompileSubstr (i, F, b+1, e-1, Var) return ELSEif (SCAN(F(b:b),calpha) > 0) then n = MathFunctionIndex (F(b:e)) if (n > 0) then b2 = b+INDEX(F(b:e),'(')-1 if (CompletelyEnclosed(F, b2, e)) then ! Case 3: F(b:e) = 'fcn(...)' ! write(*,*)'3. F(b:e) = "fcn(...)"' if (n == cAtan2 .and. TwoArgs(F,b2+1,e-1,m)) then ! print*,' SPLITTING ',b,m,e,' F(b:e)=',F(b2+1:e-1) CALL CompileSubstr (i, F, b2+1, m-1, Var) CALL CompileSubstr (i, F, m+1, e-1, Var) ELSE CALL CompileSubstr(i, F, b2+1, e-1, Var) ENDIF CALL AddCompiledByte (i, n) return END IF END IF ELSEif (F(b:b) == '-') then if (CompletelyEnclosed (F, b+1, e)) then ! Case 4: F(b:e) = '-(...)' ! write(*,*)'4. F(b:e) = "-(...)"' CALL CompileSubstr (i, F, b+2, e-1, Var) CALL AddCompiledByte (i, cNeg) return ELSEif (SCAN(F(b+1:b+1),calpha) > 0) then n = MathFunctionIndex (F(b+1:e)) if (n > 0) then b2 = b+INDEX(F(b+1:e),'(') if (CompletelyEnclosed(F, b2, e)) then ! Case 5: F(b:e) = '-fcn(...)' ! write(*,*)'5. F(b:e) = "-fcn(...)"' if (n == cAtan2 .and. TwoArgs(F,b2+1,e-1,m)) then CALL CompileSubstr (i, F, b2+1, m-1, Var) CALL CompileSubstr (i, F, m+1, e-1, Var) ELSE CALL CompileSubstr(i, F, b2+1, e-1, Var) ENDIF CALL AddCompiledByte (i, n) CALL AddCompiledByte (i, cNeg) return END IF END IF ENDIF ENDIF ! write(*,*) 'PROCEED TO OPERATORS',TwoArgs(F,b,e,m),F(b:e) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check for operator in substring: check only base level (k=0), exclude expr. in () !----- -------- --------- --------- --------- --------- --------- --------- ------- DO io=cAdd,cPow ! Increasing priority +-*/^ k = 0 DO j=e,b,-1 IF (F(j:j) == ')') then k = k+1 ELSEif (F(j:j) == '(') then k = k-1 END IF if (k == 0 .AND. F(j:j) == Ops(io) .AND. IsBinaryOp (j, F)) then if (ANY(F(j:j) == Ops(cMul:cPow)) .AND. F(b:b) == '-') then ! Case 6: F(b:e) = '-...Op...' with Op > - ! write(*,*)'6. F(b:e) = "-...Op..." with Op > -' CALL CompileSubstr (i, F, b+1, e, Var) CALL AddCompiledByte (i, cNeg) return ELSE ! Case 7: F(b:e) = '...BinOp...' ! write(*,*)'7. Binary operator',F(j:j) CALL CompileSubstr (i, F, b, j-1, Var) CALL CompileSubstr (i, F, j+1, e, Var) CALL AddCompiledByte (i, OperatorIndex(Ops(io))) Comp(i)%StackPtr = Comp(i)%StackPtr - 1 return END IF END IF end do end do !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check for remaining items, i.e. variables or explicit numbers !----- -------- --------- --------- --------- --------- --------- --------- ------- b2 = b if (F(b:b) == '-') b2 = b2+1 n = MathItemIndex(i, F(b2:e), Var) ! write(*,*)'8. AddCompiledByte ',n CALL AddCompiledByte (i, n) Comp(i)%StackPtr = Comp(i)%StackPtr + 1 if (Comp(i)%StackPtr > Comp(i)%StackSize) Comp(i)%StackSize = Comp(i)%StackSize + 1 if (b2 > b) CALL AddCompiledByte (i, cNeg) end subroutine CompileSubstr ! FUNCTION IsBinaryOp (j, F) RESULT (res) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Check if operator F(j:j) in string F is binary operator ! Special cases already covered elsewhere: (that is corrected in v1.1) ! - operator character F(j:j) is first character of string (j=1) !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE integer, INTENT(in) :: j ! Position of Operator CHARACTER (LEN=*), INTENT(in) :: F ! String LOGICAL :: res ! Result integer :: k LOGICAL :: Dflag,Pflag !----- -------- --------- --------- --------- --------- --------- --------- ------- res=.true. if (F(j:j) == '+' .OR. F(j:j) == '-') then ! Plus or minus sign: if (j == 1) then ! - leading unary operator ? res = .false. ELSEif (SCAN(F(j-1:j-1),'+-*/^(') > 0) then ! - other unary operator ? res = .false. ELSEif (SCAN(F(j+1:j+1),'0123456789') > 0 .AND. & ! - in exponent of real number ? SCAN(F(j-1:j-1),'eEdD') > 0) then Dflag=.false.; Pflag=.false. k = j-1 DO WHILE (k > 1) ! step to the left in mantissa k = k-1 IF (SCAN(F(k:k),'0123456789') > 0) then Dflag=.true. ELSEif (F(k:k) == '.') then if (Pflag) then EXIT ! * EXIT: 2nd appearance of '.' ELSE Pflag=.true. ! * mark 1st appearance of '.' ENDIF ELSE EXIT ! * all other characters END IF end do if (Dflag .AND. (k == 1 .OR. SCAN(F(k:k),'+-*/^(') > 0)) res = .false. END IF END IF END FUNCTION IsBinaryOp ! FUNCTION RealNum (str, ibegin, inext, error) RESULT (res) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Get real number from string - Format: [blanks][+|-][nnn][.nnn][e|E|d|D[+|-]nnn] !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: str ! String real(rn) :: res ! Real number integer, OPTIONAL, INTENT(out) :: ibegin, & ! Start position of real number inext ! 1st character after real number LOGICAL, OPTIONAL, INTENT(out) :: error ! Error flag integer :: ib,in,istat LOGICAL :: Bflag, & ! .T. at begin of number in str InMan, & ! .T. in mantissa of number Pflag, & ! .T. after 1st '.' encountered Eflag, & ! .T. at exponent identifier 'eEdD' InExp, & ! .T. in exponent of number DInMan, & ! .T. if at least 1 digit in mant. DInExp, & ! .T. if at least 1 digit in exp. err ! Local error flag !----- -------- --------- --------- --------- --------- --------- --------- ------- Bflag=.true.; InMan=.false.; Pflag=.false.; Eflag=.false.; InExp=.false. DInMan=.false.; DInExp=.false. ib = 1 in = 1 DO WHILE (in <= LEN_TRIM(str)) SELECT CASE (str(in:in)) CASE (' ') ! Only leading blanks permitted ib = ib+1 if (InMan .OR. Eflag .OR. InExp) EXIT CASE ('+','-') ! Permitted only IF (Bflag) then InMan=.true.; Bflag=.false. ! - at beginning of mantissa ELSEif (Eflag) then InExp=.true.; Eflag=.false. ! - at beginning of exponent ELSE EXIT ! - otherwise stop ENDIF CASE ('0':'9') ! Mark IF (Bflag) then InMan=.true.; Bflag=.false. ! - beginning of mantissa ELSEif (Eflag) then InExp=.true.; Eflag=.false. ! - beginning of exponent ENDIF if (InMan) DInMan=.true. ! Mantissa contains digit if (InExp) DInExp=.true. ! Exponent contains digit CASE ('.') IF (Bflag) then Pflag=.true. ! - mark 1st appearance of '.' InMan=.true.; Bflag=.false. ! mark beginning of mantissa ELSEif (InMan .AND..NOT.Pflag) then Pflag=.true. ! - mark 1st appearance of '.' ELSE EXIT ! - otherwise stop END IF CASE ('e','E','d','D') ! Permitted only if (InMan) then Eflag=.true.; InMan=.false. ! - following mantissa ELSE EXIT ! - otherwise stop ENDIF CASE DEFAULT EXIT ! stop at all other characters END SELECT in = in+1 end do err = (ib > in-1) .OR. (.NOT.DInMan) .OR. ((Eflag.OR.InExp).AND..NOT.DInExp) if (err) then res = 0.0_rn ELSE read(str(ib:in-1),*,IOSTAT=istat) res err = istat /= 0 END IF if (PRESENT(ibegin)) ibegin = ib if (PRESENT(inext)) inext = in if (PRESENT(error)) error = err END FUNCTION RealNum ! FUNCTION MathConst (str, ibegin, inext, error) RESULT (res) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Return values of Mathematical constants in string !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: str ! String real(rn) :: res ! Real number integer, OPTIONAL, INTENT(out) :: ibegin, & ! Start position of real number inext ! 1st character after real number LOGICAL, OPTIONAL, INTENT(out) :: error ! Error flag integer :: ib,in LOGICAL :: err ! Local error flag !----- -------- --------- --------- --------- --------- --------- --------- ------- ib = 1 in = 1 err = .false. if (len(str) < 2) then res = 0.0_rn err = .true. ELSE if (str(1:2)=='pi') then res = 3.14159265358979323846_rn in = 3 ELSEif (str(1:2)=='mu') then res = mu0 in = 3 ELSE res = 0.0_rn err = .true. ENDIF ENDIF if (PRESENT(ibegin)) ibegin = ib if (PRESENT(inext)) inext = in if (PRESENT(error)) error = err END FUNCTION MathConst ! subroutine LowCase (str1, str2) !----- -------- --------- --------- --------- --------- --------- --------- ------- ! Transform upper case letters in str1 into lower case letters, result is str2 !----- -------- --------- --------- --------- --------- --------- --------- ------- IMPLICIT NONE CHARACTER (LEN=*), INTENT(in) :: str1 CHARACTER (LEN=*), INTENT(out) :: str2 integer :: j,k CHARACTER (LEN=*), PARAMETER :: lc = 'abcdefghijklmnopqrstuvwxyz' CHARACTER (LEN=*), PARAMETER :: uc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' !----- -------- --------- --------- --------- --------- --------- --------- ------- str2 = str1 DO j=1,LEN_TRIM(str1) k = INDEX(uc,str1(j:j)) if (k > 0) str2(j:j) = lc(k:k) end do end subroutine LowCase ! end module fparser danieljprice-splash-4d1f09c/src/geometry.f90000066400000000000000000001027211477365367100210370ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2018 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! Standalone module containing subroutines to transform between ! different co-ordinate systems, for co-ordinates and vectors ! (e.g. from cartesian to cylindrical polar and vice versa) ! ! itype must be one of the following: ! itype = 1 : cartesian (default) ! itype = 2 : cylindrical ! itype = 3 : spherical ! itype = 4 : toroidal ! itype = 5 : rotated cartesian ! ! Currently handles: ! ! cartesian -> cylindrical, spherical polar ! cylindrical <-> cartesian ! spherical polar <-> cartesian ! toroidal r,theta,phi <-> cartesian ! rotated cartesian <-> cartesian ! ! written by Daniel Price 2004-2021 ! as part of the SPLASH SPH visualisation package !----------------------------------------------------------------- module geometry implicit none integer, parameter, public :: maxcoordsys = 8 integer, parameter, public :: igeom_cartesian = 1 integer, parameter, public :: igeom_cylindrical = 2 integer, parameter, public :: igeom_spherical = 3 integer, parameter, public :: igeom_toroidal = 4 integer, parameter, public :: igeom_rotated = 5 integer, parameter, public :: igeom_flaredcyl = 6 integer, parameter, public :: igeom_logflared = 7 integer, parameter, public :: igeom_planetwake = 8 character(len=24), dimension(maxcoordsys), parameter, public :: labelcoordsys = & (/'cartesian x,y,z ', & 'cylindrical R,phi,z ', & 'spherical r,phi,theta', & 'toroidal r,theta,phi', & 'rotated x_1,x_2,x_3', & 'flared cyl R,phi,zdash', & 'log flared logR,phi,zd', & 'planet wake t,eta,z '/) character(len=6), dimension(3,maxcoordsys), parameter, public :: labelcoord = & reshape((/'x ','y ','z ', & 'R ','\phi ','z ', & 'r ','\phi ','\theta', & 'r_t ','\theta','\phi ', & 'x_1 ','x_2 ','x_3 ', & 'R ','\phi ','zdash ', & 'log R ','\phi ','zdash ', & 't ','\eta ','z '/),shape=(/3,maxcoordsys/)) public :: coord_transform, vector_transform, coord_transform_limits public :: coord_is_length, coord_is_periodic, print_error public :: set_rotation_angles, get_coord_limits public :: set_flaring_index public :: set_planet_wake,planet_wake_t,planet_wake_eta public :: planet_wake_phi,planet_wake_r real, parameter, private :: pi = 4.*atan(1.) real, parameter, private :: Rtorus = 1.0 real, parameter, public :: small_number = 1.e-15 real, parameter, public :: large_number = 1.e30 ! rotated cartesian real, private :: sina = 2./3. real, private :: cosa = sqrt(5.)/3. real, private :: sinb = 2./sqrt(5.) real, private :: cosb = 1./sqrt(5.) ! flared cylindrical real, private :: xref = 1. real, private :: beta = 1.5 ! planet wake real, private :: hp_on_rp = 0.05 real, private :: rp = 1. real, private :: phi_p = 0. real, private :: p_index = 1. real, private :: q_index = 0.25 integer, parameter, public :: ierr_invalid_dimsin = 1 integer, parameter, public :: ierr_invalid_dimsout = 2 integer, parameter, public :: ierr_invalid_dims = 3 integer, parameter, public :: ierr_warning_assuming_cartesian = -1 integer, parameter, public :: ierr_not_implemented = -2 abstract interface pure real function func(x) real, intent(in) :: x end function func end interface private contains !----------------------------------------------------------------- ! utility that returns whether or not a particular coordinate ! in a given coordinate system has dimensions of length or not !----------------------------------------------------------------- pure logical function coord_is_length(ix,igeom) integer, intent(in) :: ix,igeom coord_is_length = .false. select case(igeom) case(igeom_toroidal, igeom_spherical) if (ix==1) coord_is_length = .true. case(igeom_cylindrical,igeom_flaredcyl) if (ix==1 .or. ix==3) coord_is_length = .true. case(igeom_logflared) if (ix==3) coord_is_length = .true. case(igeom_planetwake) if (ix==1 .or. ix==3) coord_is_length = .true. case default coord_is_length = .true. end select end function coord_is_length !----------------------------------------------------------------- ! utility that returns whether or not a particular coordinate ! in a given coordinate system is periodic !----------------------------------------------------------------- pure logical function coord_is_periodic(ix,igeom) integer, intent(in) :: ix,igeom coord_is_periodic = .false. if ((igeom==igeom_cylindrical .or. igeom==igeom_spherical .or. & igeom==igeom_flaredcyl .or. igeom==igeom_logflared .and. ix==2) .or. & (igeom==igeom_toroidal .and. ix==3) .or. & (igeom==igeom_planetwake .and. ix==2)) then coord_is_periodic = .true. endif end function coord_is_periodic !-------------------------------------------------------- ! utility to handle error printing so transform routines ! do not generate verbose output !-------------------------------------------------------- subroutine print_error(ierr) integer, intent(in) :: ierr select case(ierr) case(ierr_invalid_dimsin) print*,'Error: coord transform: invalid number of dimensions on input' case(ierr_invalid_dimsout) print*,'Error: coord transform: invalid number of dimensions on output' case(ierr_invalid_dims) print*,'Error: coord transform: ndimout must be <= ndimin' case(ierr_warning_assuming_cartesian) print*,'warning: using default cartesian output' case(ierr_not_implemented) print*,'warning: coord transform not fully implemented' case default print*,' unknown error' end select end subroutine print_error !------------------------------------------------------------- ! utility to set rotation angles for rotated cartesian system !------------------------------------------------------------- subroutine set_rotation_angles(a,b,sin_a,sin_b,cos_a,cos_b) real, intent(in), optional :: a,b,sin_a,sin_b,cos_a,cos_b if (present(a)) then sina = sin(a) cosa = cos(a) endif if (present(b)) then sinb = sin(b) cosb = cos(b) endif if (present(sin_a)) then sina = sin_a cosa = sqrt(1. - sina**2) endif if (present(sin_b)) then sinb = sin_b cosb = sqrt(1. - sinb**2) endif if (present(cos_a)) then cosa = cos_a if (.not.present(sin_a)) sina = sqrt(1. - cosa**2) endif if (present(cos_b)) then cosb = cos_b if (.not.present(cos_b)) sinb = sqrt(1. - cosb**2) endif end subroutine set_rotation_angles !------------------------------------------------------------- ! utility to set flaring index and reference radius for ! flared cylindrical coordinate systems !------------------------------------------------------------- subroutine set_flaring_index(r_ref,findex) real, intent(in) :: r_ref,findex xref = r_ref beta = findex end subroutine set_flaring_index !------------------------------------------------------------- ! utility to set parameters for ! planet wake coordinate system from Rafikov 2002 !------------------------------------------------------------- subroutine set_planet_wake(r,phi,p,q,honr) real, intent(in) :: r,phi,p,q,honr rp = r phi_p = phi p_index = p q_index = q hp_on_rp = honr end subroutine set_planet_wake !------------------------------------------------------------- ! t coordinate for planet wake, from Rafikov 2002 !------------------------------------------------------------- pure real function planet_wake_t(r) result(t) real, intent(in) :: r real :: rr,coeff rr = r / rp coeff = 1.5*hp_on_rp**(-2.5)/(2.**0.25) if (rr > 0.) then t = coeff*integrate_trap(planet_t_integrand,1.,rr) else t = large_number endif end function planet_wake_t !------------------------------------------------------------- ! inverse of above, i.e. find r(t) by rootfinding !------------------------------------------------------------- pure real function planet_wake_r(t) result(r) real, intent(in) :: t real :: rr,coeff,fr,fr_dash,dr integer :: it if (t >= large_number) then r = 0. return endif rr = 2. ! initial guess coeff = 1.5*hp_on_rp**(-2.5)/(2.**0.25) fr = 1e6 ! not converged it = 0 do while (abs(fr) > 1.e-6*rr .and. it < 30) fr = t - coeff*integrate_trap(planet_t_integrand,1.,rr) fr_dash = -coeff*planet_t_integrand(rr) dr = -fr/fr_dash ! Newton-Raphson if (rr + dr < 0.8*rr) then ! take care approaching zero rr = 0.8*rr ! elseif (rr + dr > 1.2*rr) then ! rr = 1.2*rr else rr = rr + dr endif it = it + 1 !print*,it,'rr=',rr*rp,' fr = ',fr,fr_dash,fr*rr enddo r = rr*rp end function planet_wake_r !------------------------------------------------------------- ! eta coordinate for planet wake, from Rafikov 2002 !------------------------------------------------------------- pure real function planet_wake_eta(r,phi) result(eta) real, intent(in) :: r,phi real :: phi_w,deltaphi,coeff phi_w = planet_wake_phiw(r) deltaphi = phi - phi_w ! wrap to between -pi and pi deltaphi = atan2(sin(deltaphi),cos(deltaphi)) coeff = 1.5/hp_on_rp eta = coeff * deltaphi end function planet_wake_eta !------------------------------------------------------------- ! inverse of above, i.e. phi(r,eta) !------------------------------------------------------------- pure real function planet_wake_phi(r,eta) result(phi) real, intent(in) :: r,eta real :: coeff coeff = 1.5/hp_on_rp phi = eta/coeff + planet_wake_phiw(r) ! wrap to -pi,pi phi = atan2(sin(phi),cos(phi)) end function planet_wake_phi !------------------------------------------------------------- ! phi_w(r) for planet wake, from Rafikov 2002 !------------------------------------------------------------- pure real function planet_wake_phiw(r) result(phi_w) real, intent(in) :: r real :: rr rr = r / rp if (rr <= 0.) then phi_w = phi_p return endif phi_w = phi_p + sign(1.,r-rp)/hp_on_rp*((rr**(q_index-0.5))/(q_index-0.5) & - (rr**(q_index+1.))/(q_index+1.) & - 3./((2.*q_index-1.)*(q_index+1.))) end function planet_wake_phiw !------------------------------------------------------------- ! t(r) for planet wake, from Rafikov 2002 !------------------------------------------------------------- pure real function planet_t_integrand(x) result(f) real, intent(in) :: x real :: w,rho rho = 5.*q_index + p_index w = 0.5*rho - 11./4. f = (-(1. - x**1.5)*abs(1. - x**1.5)**0.5) * x**w !f = (abs(1. - x**1.5)**1.5) * x**w end function planet_t_integrand !------------------------------------------------------------------- ! helper routine to integrate a function using the trapezoidal rule !------------------------------------------------------------------- pure real function integrate_trap(f,xmin,xmax) result(g) real, intent(in) :: xmin,xmax procedure(func) :: f real :: fx,fprev,dx,x integer, parameter :: npts = 128 integer :: i g = 0. dx = (xmax-xmin)/(npts) fprev = f(xmin) do i=2,npts x = xmin + i*dx fx = f(x) g = g + 0.5*dx*(fx + fprev) fprev = fx enddo end function integrate_trap !----------------------------------------------------------------- ! Subroutine to transform between different co-ordinate systems ! (e.g. from cartesian to cylindrical polar and vice versa) ! ! xin(ndimin) : input co-ordinates, in ndimin dimensions ! itypein : input co-ordinate type ! ! xout(ndimout) : output co-ordinates, in ndimout dimensions ! itypeout : output co-ordinate type ! !----------------------------------------------------------------- pure subroutine coord_transform(xin,ndimin,itypein,xout,ndimout,itypeout,err) integer, intent(in) :: ndimin,ndimout,itypein,itypeout real, intent(in) :: xin(ndimin) real, intent(out) :: xout(ndimout) integer, intent(out), optional :: err real :: rcyl,phi,xi(3),xouti(3),sintheta integer :: ierr ! !--check for errors in input ! ierr = 0 if (itypeout==itypein) then xout(1:ndimout) = xin(1:ndimout) return elseif (ndimin < 1.or.ndimin > 3) then ierr = ierr_invalid_dimsin if (present(err)) err = ierr return elseif (ndimout < 1.or.ndimout > 3) then ierr = ierr_invalid_dimsout if (present(err)) err = ierr return elseif (ndimout > ndimin) then ierr = ierr_invalid_dims if (present(err)) err = ierr return endif if (itypein /= 1 .and. itypeout /= 1) ierr = ierr_warning_assuming_cartesian ! !--now do transformation ! select case(itypein) case(2) ! !--input is cylindrical polars, output is cartesian ! if (ndimout==1) then xout(1) = xin(1) else ! r,phi,z -> x,y,z xout(1) = xin(1)*cos(xin(2)) xout(2) = xin(1)*sin(xin(2)) if (ndimout > 2) xout(3) = xin(3) endif case(3) ! !--input is spherical polars, output is cartesian ! select case(ndimout) case(1) ! r -> x xout(1) = xin(1) case(2) ! r,phi -> x,y xout(1) = xin(1)*cos(xin(2)) xout(2) = xin(1)*sin(xin(2)) case(3) ! r,phi,theta -> x,y,z sintheta = sin(xin(3)) xout(1) = xin(1)*cos(xin(2))*sintheta xout(2) = xin(1)*sin(xin(2))*sintheta xout(3) = xin(1)*cos(xin(3)) end select case(4) ! !--input is torus co-ordinates, output is cartesian ! if (ndimin /= 3) then xout(1:ndimout) = xin(1:ndimout) else rcyl = xin(1)*cos(xin(2)) + Rtorus xout(1) = rcyl*cos(xin(3)) if (ndimout >= 2) xout(2) = rcyl*sin(xin(3)) if (ndimout >= 3) xout(3) = xin(1)*sin(xin(2)) endif case(5) ! !--input is rotated cartesian coordinates, output is cartesian ! xi = 0. xi(1:ndimin) = xin xouti(1) = xi(1)*cosa*cosb - xi(2)*sinb - xi(3)*sina*cosb xouti(2) = xi(1)*cosa*sinb + xi(2)*cosb - xi(3)*sina*sinb xouti(3) = xi(1)*sina + xi(3)*cosa xout(1:ndimout) = xouti case(6,7) ! !--input is flared cylindrical polars or log flared, output is cartesian ! rcyl = xin(1) if (itypein==7) rcyl = 10**xin(1) ! log flared if (ndimout==1) then xout(1) = rcyl else ! r,phi,zdash -> x,y,z xout(1) = rcyl*cos(xin(2)) xout(2) = rcyl*sin(xin(2)) if (ndimout > 2) xout(3) = xin(3)*(rcyl/xref)**beta endif case(igeom_planetwake) ! !--input is planet wake, output is cartesian ! rcyl = planet_wake_r(xin(1)) if (ndimout==1) then xout(1) = rcyl else ! t,eta,z -> x,y,z phi = planet_wake_phi(rcyl,xin(2)) xout(1) = rcyl*cos(phi) xout(2) = rcyl*sin(phi) if (ndimout > 2) xout(3) = xin(3) endif ! !--input is cartesian co-ordinates ! case default select case(itypeout) case(2) ! !--output is cylindrical ! if (ndimin==1) then xout(1) = abs(xin(1)) ! cylindrical r else xout(1) = sqrt(dot_product(xin(1:2),xin(1:2))) if (ndimout >= 2) xout(2) = atan2(xin(2),xin(1)) ! phi if (ndimout==3) xout(3) = xin(3) ! z endif case(3) ! !--output is spherical ! xout(1) = sqrt(dot_product(xin,xin))! r if (ndimout >= 2) xout(2) = atan2(xin(2),xin(1)) ! phi if (ndimout >= 3) then ! theta = acos(z/r) if (xout(1) > 0.) then xout(3) = acos(xin(3)/xout(1)) else xout(3) = 0. endif endif case(4) ! !--output is torus r,theta,phi co-ordinates ! if (ndimin /= 3) then ! not applicable if ndim < 3 xout(1:ndimout) = xin(1:ndimout) else rcyl = sqrt(xin(1)**2 + xin(2)**2) xout(1) = sqrt(xin(3)**2 + (rcyl - Rtorus)**2) if (ndimout >= 2) xout(2) = atan2(xin(3),rcyl-Rtorus) ! asin(xin(3)/xout(1)) if (ndimout >= 3) xout(3) = atan2(xin(2),xin(1)) endif case(5) ! !--output is rotated cartesian x1, x2, x3 ! xi = 0. xi(1:ndimin) = xin xouti(1) = cosa*(xi(1)*cosb + xi(2)*sinb) + xi(3)*sina xouti(2) = xi(2)*cosb - xi(1)*sinb xouti(3) = -sina*(xi(1)*cosb + xi(2)*sinb) + xi(3)*cosa xout(1:ndimout) = xouti(1:ndimout) case(6,7) ! !--output is flared cylindrical ! if (ndimin==1) then xout(1) = abs(xin(1)) ! cylindrical r else xout(1) = sqrt(dot_product(xin(1:2),xin(1:2))) if (ndimout >= 2) xout(2) = atan2(xin(2),xin(1)) ! phi if (ndimout==3) then if (xout(1) > 0.) then xout(3) = xin(3)*(xref/xout(1))**beta ! zdash else xout(3) = xin(3) ! this is arbitrary endif endif endif ! !--output is log flared ! if (itypeout==7) xout(1) = log10(max(xout(1),small_number)) case(igeom_planetwake) ! !--output is planet wake ! if (ndimin==1) then rcyl = abs(xin(1)) xout(1) = planet_wake_t(rcyl) else rcyl = sqrt(dot_product(xin(1:2),xin(1:2))) phi = atan2(xin(2),xin(1)) xout(1) = planet_wake_t(rcyl) if (ndimout >= 2) xout(2) = planet_wake_eta(rcyl,phi) if (ndimout==3) xout(3) = xin(3) endif case default ! ! just copy ! xout(1:ndimout) = xin(1:ndimout) end select end select if (present(err)) err = ierr return end subroutine coord_transform !----------------------------------------------------------------- ! Subroutine to transform vector components ! between different co-ordinate systems ! (e.g. from cartesian to cylindrical polar and vice versa) ! ! Arguments: ! xin(ndimin) : input co-ordinates, in ndimin dimensions ! vecin(ndimin) : components of vector in input co-ordinate basis ! itypein : input co-ordinate type ! ! vecout(ndimout) : components of vector in output co-ordinate basis ! itypeout : output co-ordinate type ! ! coords must be one of the following: ! 'cartesian' (default) ! 'cylindrical' ! 'spherical' ! ! Currently handles: ! ! cartesian -> cylindrical, spherical polar ! cylindrical -> cartesian ! spherical polar -> cartesian ! !----------------------------------------------------------------- pure subroutine vector_transform(xin,vecin,ndimin,itypein,vecout,ndimout,itypeout,err) integer, intent(in) :: ndimin,ndimout,itypein,itypeout real, intent(in) :: xin(ndimin),vecin(ndimin) real, intent(out) :: vecout(ndimout) integer, intent(out), optional :: err integer :: i,ierr real :: dxdx(3,3) real :: sinphi,cosphi,sintheta,costheta real :: rr,rr1,rcyl,rcyl2,rcyl1,fac,zdash ierr = 0 ! !--check for errors in input ! if (ndimout > ndimin) then ierr = ierr_invalid_dims if (present(err)) err = ierr return elseif (itypein==itypeout) then vecout(1:ndimout) = vecin(1:ndimout) return elseif (ndimin < 1.or.ndimin > 3) then ierr = ierr_invalid_dimsin if (present(err)) err = ierr return elseif (ndimout < 1.or.ndimout > 3) then ierr = ierr_invalid_dimsout if (present(err)) err = ierr return elseif (itypein==igeom_planetwake .or. itypeout==igeom_planetwake) then ierr = ierr_not_implemented if (present(err)) err = ierr vecout(1:ndimout) = vecin(1:ndimout) return endif ! !--set Jacobian matrix to zero ! dxdx = 0. ! !--calculate non-zero components of Jacobian matrix for the transformation ! select case(itypein) case(6,7) ! !--input is flared cylindrical or log flared, output is cartesian ! rcyl = xin(1) sinphi = sin(xin(2)) cosphi = cos(xin(2)) fac = 1. if (itypein==7) then rcyl = 10**(xin(1)) if (rcyl > small_number) fac = rcyl*log(10.) ! dR/d(log R) endif dxdx(1,1) = cosphi*fac ! dx/dr dxdx(1,2) = -sinphi ! 1/r*dx/dphi dxdx(2,1) = sinphi*fac ! dy/dr dxdx(2,2) = cosphi ! 1/r*dy/dphi dxdx(3,1) = beta*xin(3)*(rcyl**(beta - 1.))/xref**beta*fac ! dz/dR if (rcyl > small_number) then dxdx(3,3) = 1.*(rcyl/xref)**beta ! dz/dzdash else dxdx(3,3) = 1. endif ! !--rotated cartesian ! case(5) call coord_transform(vecin,ndimin,itypein,vecout,ndimout,itypeout,err=ierr) if (present(err)) err = ierr return case(4) ! !--input is toroidal, output cartesian ! dxdx(1,1) = cos(xin(2))*cos(xin(3)) ! dx/dr dxdx(1,2) = -sin(xin(2))*cos(xin(3)) ! 1/r dx/dtheta dxdx(1,3) = -sin(xin(3)) ! 1/rcyl dx/dphi dxdx(2,1) = cos(xin(2))*sin(xin(3)) ! dy/dr dxdx(2,2) = -sin(xin(2))*sin(xin(3)) ! 1/r dy/dtheta dxdx(2,3) = cos(xin(3)) ! 1/rcyl dy/dphi dxdx(3,1) = sin(xin(2)) ! dz/dr dxdx(3,2) = cos(xin(2)) ! 1/r dz/dtheta ! dxdx(3,3) = 0. ! dz/dphi case(3) ! !--input is spherical polars, output cartesian ! sinphi = sin(xin(2)) cosphi = cos(xin(2)) sintheta = sin(xin(3)) costheta = cos(xin(3)) dxdx(1,1) = cosphi*sintheta ! dx/dr dxdx(1,2) = -sinphi ! 1/rcyl dx/dphi dxdx(1,3) = cosphi*costheta ! 1/r dx/dtheta dxdx(2,1) = sinphi*sintheta ! dy/dr dxdx(2,2) = cosphi ! 1/rcyl dy/dphi dxdx(2,3) = sinphi*costheta ! 1/r dy/dtheta dxdx(3,1) = costheta ! dz/dr dxdx(3,3) = -sintheta ! 1/r dz/dtheta case(2) ! !--input is cylindrical polars, output cartesian ! sinphi = sin(xin(2)) cosphi = cos(xin(2)) dxdx(1,1) = cosphi ! dx/dr dxdx(1,2) = -sinphi ! 1/r*dx/dphi dxdx(2,1) = sinphi ! dy/dr dxdx(2,2) = cosphi ! 1/r*dy/dphi dxdx(3,3) = 1. ! dz/dz ! !--input is cartesian co-ordinates (default) ! case default select case(itypeout) case(6,7) ! !--output is flared cylindrical ! rr = sqrt(dot_product(xin(1:min(ndimin,2)),xin(1:min(ndimin,2)))) sinphi = 0. fac = 1. if (rr > small_number) then rr1 = 1./rr cosphi = xin(1)*rr1 if (ndimin >= 2) sinphi = xin(2)*rr1 if (itypeout==7) fac = rr1/log(10.) ! d(log R)/dR else rr1 = 1./xref cosphi = 1. endif dxdx(1,1) = fac*cosphi ! xin(1)*rr1 = dr/dx dxdx(1,2) = fac*sinphi ! xin(2)*rr1 = dr/dy dxdx(2,1) = -sinphi ! r*dphi/dx dxdx(2,2) = cosphi ! r*dphi/dy if (ndimin==3 .and. ndimout==3) then zdash = xin(3)*(xref*rr1)**beta dxdx(3,1) = -beta*cosphi*zdash*rr1 ! dzdash/dx dxdx(3,2) = -beta*sinphi*zdash*rr1 ! dzdash/dy dxdx(3,3) = 1.*(xref*rr1)**beta ! dzdash/dz endif case(5) call coord_transform(vecin,ndimin,itypein,vecout,ndimout,itypeout,err=ierr) return case(4) ! ! output is toroidal ! rcyl = sqrt(xin(1)**2 + xin(2)**2) sinphi = 0. if (rcyl > tiny(rcyl)) then rcyl1 = 1./rcyl cosphi = xin(1)*rcyl1 sinphi = xin(2)*rcyl1 else rcyl1 = 0. cosphi = 1. endif rr = sqrt((rcyl - Rtorus)**2 + xin(3)**2) if (rr > tiny(rr)) then rr1 = 1./rr costheta = (rcyl - Rtorus)*rr1 sintheta = xin(3)*rr1 else rr1 = 0. costheta = 1. sintheta = 0. endif dxdx(1,1) = costheta*cosphi ! dr/dx dxdx(1,2) = costheta*sinphi ! dr/dy dxdx(1,3) = sintheta ! dr/dz dxdx(2,1) = -sintheta*cosphi ! dtheta/dx dxdx(2,2) = -sintheta*sinphi ! dtheta/dy dxdx(2,3) = costheta ! dtheta/dz dxdx(3,1) = -sinphi ! dphi/dx dxdx(3,2) = cosphi ! dphi/dy ! dxdx(3,3) = 0. ! dphi/dz case(3) ! ! output is spherical ! rr = sqrt(dot_product(xin,xin)) cosphi = 1. sinphi = 0. costheta = 1. sintheta = 0. if (ndimin==3 .and. rr > 0.) costheta = xin(3)/rr if (ndimin >= 2) then rcyl2 = dot_product(xin(1:2),xin(1:2)) if (rcyl2 > 0.) then rcyl = sqrt(rcyl2) rcyl1 = 1./rcyl cosphi = xin(1)*rcyl1 sinphi = xin(2)*rcyl1 sintheta = rcyl/rr else rcyl = 0. endif endif dxdx(1,1) = cosphi*sintheta ! dr/dx dxdx(1,2) = sinphi*sintheta ! dr/dy dxdx(1,3) = costheta ! dr/dz dxdx(2,1) = -sinphi !-xin(2)*rcyl1 = rcyl dphi/dx dxdx(2,2) = cosphi ! xin(1)*rcyl1 = rcyl dphi/dy dxdx(2,3) = 0. dxdx(3,1) = costheta*cosphi ! xin(1)*xin(3)*rr1*rcyl1 = r dtheta/dx dxdx(3,2) = costheta*sinphi ! xin(2)*xin(3)*rr1*rcyl1 = r dtheta/dy dxdx(3,3) = -sintheta ! -rcyl2*rr1*rcyl1 = r dtheta/dz case(2) ! !--output is cylindrical ! rr = sqrt(dot_product(xin(1:min(ndimin,2)),xin(1:min(ndimin,2)))) sinphi = 0. if (rr > tiny(rr)) then rr1 = 1./rr cosphi = xin(1)*rr1 if (ndimin >= 2) sinphi = xin(2)*rr1 else cosphi = 1. endif dxdx(1,1) = cosphi ! dr/dx dxdx(1,2) = sinphi ! dr/dy dxdx(2,1) = -sinphi ! r*dphi/dx dxdx(2,2) = cosphi ! r*dphi/dy dxdx(3,3) = 1. ! dz/dz case default ierr = ierr_warning_assuming_cartesian vecout(1:ndimout) = vecin(1:ndimout) return end select end select ! !--now perform transformation using Jacobian matrix ! do i=1,ndimout vecout(i) = dot_product(dxdx(i,1:ndimin),vecin(1:ndimin)) enddo if (present(err)) err = ierr return end subroutine vector_transform !------------------------------------------------------------------ ! this subroutine attempts to switch plot limits / boundaries ! between various co-ordinate systems. !------------------------------------------------------------------ recursive subroutine coord_transform_limits(xmin,xmax,itypein,itypeout,ndim) integer, intent(in) :: itypein,itypeout,ndim real, dimension(ndim), intent(inout) :: xmin,xmax real, dimension(ndim) :: xmaxtemp,xmintemp real :: rcyl integer :: i ! !--check for errors in input ! if (ndim < 1 .or. ndim > 3) then print*,'Error: limits coord transform: ndim invalid on input' return endif ! !--for transformations that are not to/from cartesian ! we transform to cartesians as an intermediate step ! if (itypein /= 1 .and. itypeout /= 1) then call coord_transform_limits(xmin,xmax,itypein,1,ndim) call coord_transform_limits(xmin,xmax,1,itypeout,ndim) return endif !print*,'modifying plot limits for new coordinate system' ! !--by default do nothing ! xmintemp(1:ndim) = xmin(1:ndim) xmaxtemp(1:ndim) = xmax(1:ndim) select case(itypein) case(6,7) ! !--flared cylindrical or log flared in, cartesian out ! rcyl = abs(xmax(1)) if (itypein==igeom_logflared) rcyl = 10**(abs(xmax(1))) xmintemp(:) = -rcyl xmaxtemp(:) = rcyl if (ndim > 2) then xmintemp(3) = xmin(3)*(rcyl/xref)**beta xmaxtemp(3) = xmax(3)*(rcyl/xref)**beta endif case(5) ! !--rotated cartesian in, cartesian out ! call coord_transform(xmin,ndim,itypein,xmintemp,ndim,itypeout) call coord_transform(xmax,ndim,itypein,xmaxtemp,ndim,itypeout) case(4) ! !--toroidal in, cartesian out ! xmintemp(1:min(ndim,2)) = -Rtorus - xmax(1) xmaxtemp(1:min(ndim,2)) = Rtorus + xmax(1) if (ndim==3) then xmintemp(3) = -xmax(1) xmaxtemp(3) = xmax(1) endif case(3) ! !--spherical in, cartesian out ! xmintemp(1:ndim) = -xmax(1) xmaxtemp(1:ndim) = xmax(1) case(2) ! !--cylindrical in, cartesian out ! xmintemp(1:max(ndim,2)) = -xmax(1) xmaxtemp(1:max(ndim,2)) = xmax(1) case default ! !--input is cartesian ! select case(itypeout) case(5) ! !--rotated cartesian ! call coord_transform(xmin,ndim,itypein,xmintemp,ndim,itypeout) call coord_transform(xmax,ndim,itypein,xmaxtemp,ndim,itypeout) case(4) ! !--output is toroidal ! xmintemp(1) = 0. xmaxtemp(1) = max(maxval(abs(xmax(1:min(ndim,2))))-Rtorus, & maxval(abs(xmin(1:min(ndim,2))))-Rtorus) if (ndim >= 2) then xmintemp(2) = -0.5*pi xmaxtemp(2) = 0.5*pi if (ndim >= 3) then xmintemp(3) = -pi xmaxtemp(3) = pi endif endif ! !--output is spherical ! case(3) !--rmin, rmax xmintemp(1) = 0. xmaxtemp(1) = max(maxval(abs(xmin(1:ndim))), & maxval(abs(xmax(1:ndim)))) if (ndim >= 2) then xmintemp(2) = -pi xmaxtemp(2) = pi if (ndim >= 3) then xmintemp(3) = 0. xmaxtemp(3) = pi endif endif ! !--output is cylindrical, flared cylindrical or log flared cylindrical ! case(2,6,7) !--rmin, rmax xmintemp(1) = 0. if (ndim >= 2) then xmaxtemp(1) = sqrt(max(xmin(1)**2,xmin(2)**2,xmax(1)**2,xmax(2)**2)) xmintemp(2) = -pi xmaxtemp(2) = pi if (itypeout==igeom_flaredcyl .and. ndim >= 3) then xmintemp(3) = xmin(3)*(xref/xmaxtemp(1))**beta xmaxtemp(3) = xmax(3)*(xref/xmaxtemp(1))**beta endif else xmaxtemp(1) = max(abs(xmin(1)),abs(xmax(1))) endif if (itypeout==igeom_logflared) then xmintemp(1) = log10(small_number) ! log zero xmaxtemp(1) = log10(xmaxtemp(1)) endif end select end select do i=1,ndim xmin(i) = min(xmintemp(i),xmaxtemp(i)) xmax(i) = max(xmintemp(i),xmaxtemp(i)) enddo return end subroutine coord_transform_limits !------------------------------------------------------------ ! Routine to assist with interpolation in non-cartesian ! coordinate systems ! ! IN: ! xin - position in cartesian coords ! rad - radius of sphere around xin in cartesians ! OUT: ! xout - position in desired coord system ! xmin, xmax - bounding box of sphere in new coord system ! !------------------------------------------------------------ subroutine get_coord_limits(rad,xin,xout,xmin,xmax,itypein) real, intent(in) :: rad,xin(3) real, intent(out) :: xout(3),xmin(3),xmax(3) integer, intent(in) :: itypein real :: r,rcyl,dphi,dtheta,fac select case(itypein) case(igeom_planetwake) ! planet wake rcyl = sqrt(xin(1)**2 + xin(2)**2) dphi = atan2(xin(2),xin(1)) xout(1) = planet_wake_t(rcyl) xout(2) = planet_wake_eta(rcyl,dphi) xout(3) = xin(3) xmin(1) = planet_wake_t(max(rcyl-rad,0.)) ! min "time" xmax(1) = planet_wake_t(rcyl+rad) ! max "time" xmin(2) = -pi xmax(2) = pi xmin(3) = xout(3)-rad xmax(3) = xout(3)-rad case(4) ! toroidal rcyl = sqrt(xin(1)**2 + xin(2)**2) r = sqrt(xin(3)**2 + (rcyl - Rtorus)**2) xout(1) = r xout(2) = atan2(xin(3),rcyl-Rtorus) ! asin(xin(3)/xout(1)) xout(3) = atan2(xin(2),xin(1)) xmin(1) = max(r-rad,0.) xmax(1) = r+rad if (r > 0. .and. xmin(1) > 0.) then dtheta = asin(rad/r) xmin(2) = max(xout(2) - dtheta,0.) xmax(2) = min(xout(2) + dtheta,pi) dphi = atan(rad/r) xmin(3) = xout(3)-dphi xmax(3) = xout(3)+dphi else xmin(2) = 0. xmax(2) = pi xmin(3) = -pi xmax(3) = pi endif case(3) ! spherical r = sqrt(dot_product(xin,xin)) xout(1) = r xout(2) = atan2(xin(2),xin(1)) ! phi if (r > 0.) then xout(3) = acos(xin(3)/r) ! theta = acos(z/r) else xout(3) = 0. endif xmin(1) = max(r - rad,0.) xmax(1) = r + rad if (r > 0. .and. xmin(1) > 0.) then rcyl = sqrt(xin(1)**2 + xin(2)**2) if (rcyl > rad) then dphi = asin(rad/rcyl) xmin(2) = xout(2)-dphi xmax(2) = xout(2)+dphi else xmin(2) = -pi xmax(2) = pi endif dtheta = asin(rad/r) xmin(3) = xout(3)-dtheta xmax(3) = xout(3)+dtheta xmin(3) = max(xmin(3),0.) xmax(3) = min(xmax(3),pi) else xmin(2) = -pi xmax(2) = pi xmin(3) = 0. xmax(3) = pi endif case(2,6,7) ! cylindrical, flared cylindrical r = sqrt(xin(1)**2 + xin(2)**2) fac = 1. if ((itypein==6 .or. itypein==7) .and. r > small_number) fac = (xref/r)**beta xout(1) = r xout(2) = atan2(xin(2),xin(1)) xout(3) = xin(3)*fac xmin(1) = max(r-rad,0.) xmax(1) = r+rad if (r > 0. .and. xmin(1) > 0.) then dphi = atan(rad/r) xmin(2) = xout(2)-dphi xmax(2) = xout(2)+dphi else xmin(2) = -pi xmax(2) = pi endif xmin(3) = xout(3)-rad*fac xmax(3) = xout(3)+rad*fac if (itypein==7) then xout(1) = log10(max(r,small_number)) xmin(1) = log10(max(xmin(1),small_number)) xmax(1) = log10(max(xmax(1),small_number)) endif case default xout = xin xmin = xin - rad xmax = xin + rad end select end subroutine get_coord_limits end module geometry danieljprice-splash-4d1f09c/src/geomutils.f90000066400000000000000000000233001477365367100212070ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! Utility module containing wrapper routines for coordinate ! transformations !----------------------------------------------------------------- module geomutils implicit none public :: change_coords, changecoords, changeveccoords public :: set_coordlabels private contains !----------------------------------------------------------------- ! transform all columns of data for a given particle ! to new coordinate system (does both coordinates ! and components of vectors) ! this version uses DOUBLE PRECISION for vals !----------------------------------------------------------------- subroutine change_coords(vals,ncols,ndim,icoords,icoordsnew,x0,v0) use params, only:doub_prec use geometry, only:coord_transform,vector_transform use labels, only:ix,iamvec,ivx integer, intent(in) :: ncols,ndim,icoords,icoordsnew real(kind=doub_prec), dimension(ncols), intent(inout) :: vals real, dimension(ndim), intent(in) :: x0,v0 real, dimension(ndim) :: xcoords,xcoordsnew,vec,vecnew integer :: iamvecprev,icol !--perform transformations on coordinates xcoords(1:ndim) = vals(ix(1:ndim)) - x0(1:ndim) call coord_transform(xcoords(1:ndim),ndim,icoords,xcoordsnew(1:ndim),ndim,icoordsnew) vals(ix(1:ndim)) = xcoordsnew(1:ndim) !--transform all vector quantities to new coord system iamvecprev = 0 do icol=1,ncols - ndim + 1 if (iamvec(icol) > 0 .and. iamvec(icol) /= iamvecprev) then iamvecprev = iamvec(icol) if (icol==ivx) then vec(1:ndim) = vals(iamvec(icol):iamvec(icol)+ndim-1) - v0(1:ndim) else vec(1:ndim) = vals(iamvec(icol):iamvec(icol)+ndim-1) endif call vector_transform(xcoords,vec,ndim,icoords,vecnew,ndim,icoordsnew) vals(iamvec(icol):iamvec(icol)+ndim-1) = vecnew(1:ndim) endif enddo end subroutine change_coords !------------------------------------------------------------------- ! interface to coordinate-system transformations !------------------------------------------------------------------- subroutine changecoords(iplotx,iploty,iplotz,xplot,yplot,zplot,ntot,ndim,itrackpart,dat) use geometry, only:coord_transform,labelcoordsys use settings_data, only:xorigin,icoords,icoordsnew,debugmode use labels, only:is_coord,ix integer, intent(in) :: iplotx,iploty,iplotz,ntot,ndim,itrackpart real, dimension(:), intent(inout) :: xplot,yplot,zplot real, dimension(:,:), intent(in) :: dat real, dimension(ndim) :: xcoords,xcoordsnew integer :: j,ixcoord,iycoord,izcoord logical :: iscoordx,iscoordy,iscoordz iscoordx = is_coord(iplotx,ndim) iscoordy = is_coord(iploty,ndim) iscoordz = is_coord(iplotz,ndim) ! should always be true if x and y are coords if (iscoordx .or. iscoordy) then if (debugmode) print*,'changing coords from ',trim(labelcoordsys(icoords)), & ' to ',trim(labelcoordsys(icoordsnew)) if (itrackpart > 0) print*,'coords relative to particle ',itrackpart !--get offsets in range 1->ndim for the case where particle ! coords are not first in plot arrays ixcoord = iplotx - ix(1) + 1 if (iscoordx .and. (ixcoord <= 0 .or. ixcoord > ndim)) then print*,'ERROR in x coordinate offset in arrays: cannot change coordinate system' return endif iycoord = iploty - ix(1) + 1 if (iscoordy .and. (iycoord <= 0 .or. iycoord > ndim)) then print*,'ERROR in y coordinate offset in arrays: cannot change coordinate system' return endif izcoord = iplotz - ix(1) + 1 if (iscoordz .and. (izcoord <= 0 .or. izcoord > ndim)) then print*,'ERROR in z coordinate offset in arrays: cannot change coordinate system' return endif do j=1,ntot if (itrackpart > 0 .and. itrackpart <= ntot) then xcoords(1:ndim) = dat(j,ix(1:ndim)) - dat(itrackpart,ix(1:ndim)) else xcoords(1:ndim) = dat(j,ix(1:ndim)) - xorigin(1:ndim) endif call coord_transform(xcoords(1:ndim),ndim,icoords, & xcoordsnew(1:ndim),ndim,icoordsnew) if (iscoordx) xplot(j) = xcoordsnew(ixcoord) if (iscoordy) yplot(j) = xcoordsnew(iycoord) if (iscoordz) zplot(j) = xcoordsnew(izcoord) enddo endif end subroutine changecoords !------------------------------------------------------------------- ! interface to coordinate-system transformations for vectors !------------------------------------------------------------------- subroutine changeveccoords(iplot,xploti,ntot,ndim,itrackpart,dat) use geometry, only:vector_transform,labelcoordsys use settings_data, only:xorigin,icoords,icoordsnew,debugmode use labels, only:ivx,iamvec,ix integer, intent(in) :: iplot,ntot,ndim,itrackpart real, dimension(:), intent(inout) :: xploti real, dimension(ndim) :: xcoords,vecnew,vecin real, dimension(:,:), intent(in) :: dat integer :: j if (iamvec(iplot) > 0) then if (iplot-iamvec(iplot)+1 <= ndim) then if (debugmode) print*,'changing vector component from ', & trim(labelcoordsys(icoords)),' to ',trim(labelcoordsys(icoordsnew)) if (itrackpart > 0 .and. iamvec(iplot)==ivx) then print*,'velocities relative to particle ',itrackpart endif do j=1,ntot if (itrackpart > 0 .and. itrackpart <= ntot) then xcoords(1:ndim) = dat(j,ix(1:ndim)) - dat(itrackpart,ix(1:ndim)) if (iamvec(iplot)==ivx) then vecin(1:ndim) = dat(j,iamvec(iplot):iamvec(iplot)+ndim-1) & - dat(itrackpart,iamvec(iplot):iamvec(iplot)+ndim-1) else vecin(1:ndim) = dat(j,iamvec(iplot):iamvec(iplot)+ndim-1) endif else xcoords(1:ndim) = dat(j,ix(1:ndim)) - xorigin(1:ndim) vecin(1:ndim) = dat(j,iamvec(iplot):iamvec(iplot)+ndim-1) endif call vector_transform(xcoords(1:ndim),vecin(1:ndim), & ndim,icoords,vecnew(1:ndim),ndim,icoordsnew) xploti(j) = vecnew(iplot-iamvec(iplot)+1) enddo else print*,'error: can''t convert vector components with ndimV > ndim' endif endif return end subroutine changeveccoords !---------------------------------------------------------------- ! ! routine to set labels for vector quantities and spatial ! coordinates depending on the coordinate system used. ! !---------------------------------------------------------------- subroutine set_coordlabels(numplot) use geometry, only:labelcoord,coord_is_length use labels, only:label,unitslabel,iamvec,labelvec,ix,labeldefault use settings_data, only:icoords,icoordsnew,ndim,iRescale,debugmode integer, intent(in) :: numplot integer :: i integer, save :: icoordsprev = -1 ! !--sanity check on icoordsnew... ! (should not be zero) ! if (icoordsnew <= 0) then if (icoords > 0) then icoordsnew = icoords else icoordsnew = 1 endif endif ! !--store the previous value of icoordsnew that was used ! last time we adjusted the labels ! if (icoordsprev < 0) icoordsprev = icoordsnew ! !--set coordinate and vector labels (depends on coordinate system) ! if (icoordsnew /= icoords .or. icoordsnew /= icoordsprev) then ! !--here we are using a coordinate system that differs from the original ! one read from the code (must change labels appropriately) ! if (debugmode) print*,'DEBUG: changing coordinate labels ...' do i=1,ndim if (ix(i) > 0) then label(ix(i)) = labelcoord(i,icoordsnew) if (iRescale .and. coord_is_length(i,icoordsnew)) then label(ix(i)) = trim(label(ix(i)))//trim(unitslabel(ix(i))) endif endif enddo ! elseif (icoordsnew /= icoordsprev) then !! !!--here we are reverting back to the original coordinate system !! so we have to re-read the original labels from the data read !! ! call get_labels endif ! !--set vector labels if iamvec is set and the labels are the default ! if (icoordsnew > 0) then do i=1,numplot if (iamvec(i) /= 0 .and. & (icoordsnew /= icoords .or. icoordsnew /= icoordsprev & .or. index(label(i),trim(labeldefault)) /= 0)) then if (i-iamvec(i)+1 > 0) then if (icoordsnew==1) then label(i) = trim(labelvec(iamvec(i)))//'_'//trim(labelcoord(i-iamvec(i)+1,icoordsnew)) else label(i) = trim(labelvec(iamvec(i)))//'_{'//trim(labelcoord(i-iamvec(i)+1,icoordsnew))//'}' endif else print "(a,i2,a,i2)",' ERROR with vector labels, referencing '// & trim(labelvec(iamvec(i)))//' in column ',i,' iamvec = ',iamvec(i) endif if (iRescale) then label(i) = trim(label(i))//trim(unitslabel(i)) endif endif enddo endif icoordsprev = icoordsnew return end subroutine set_coordlabels end module geomutils danieljprice-splash-4d1f09c/src/get_data.f90000066400000000000000000000471501477365367100207600ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2016 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! wrapper for the main data read ! ensures that same procedure occurs on initial read as from menu option ! ! drives reading of all files listed on command line ! ! Arguments: ! ireadfile : if < 0, reads from all files ! if > 0, reads only from the filename rootname(ireadfile) ! if = 0, no data read, just call labelling and exact_params ! module getdata implicit none public :: get_data, get_labels integer, private :: ncolumnsfirst private contains subroutine get_data(ireadfile,gotfilenames,firsttime,iposinfile) use asciiutils, only:ucase use filenames, only:rootname,nstepsinfile,nfiles,nsteps,maxfile,ifileopen,iposopen use limits, only:set_limits use settings_data, only:ncolumns,iendatstep,ncalc,ivegotdata, & DataisBuffered,iCalcQuantities,iverbose, & iRescale,required,ipartialread,lowmemorymode,debugmode use settings_data, only:buffer_steps_in_file use particle_data, only:dat,maxcol use prompting, only:prompt use calcquantities, only:calc_quantities use timing, only:wall_time,print_time use geomutils, only:set_coordlabels use adjustdata, only:adjust_data_codeunits use readdata, only:read_data integer, intent(in) :: ireadfile logical, intent(in) :: gotfilenames logical, intent(in), optional :: firsttime integer, intent(in), optional :: iposinfile logical :: setlimits,isfirsttime,verbose logical, parameter :: dotiming = .true. integer :: i,istart,ierr,ipos,nsteps_read real :: t1,t2 if (.not.gotfilenames) then if (nfiles <= 0 .or. nfiles > maxfile) nfiles = 1 call prompt('Enter number of files to read ',nfiles,1,maxfile) do i=1,nfiles call prompt('Enter filename to read',rootname(i),noblank=.true.) enddo endif ! !--set everything to zero initially ! ncolumns = 0 ncalc = 0 nsteps = 0 istart = 1 ierr = 0 ivegotdata = .false. ifileopen = ireadfile DataIsBuffered = .false. ipartialread = .false. isfirsttime = .false. if (present(firsttime)) isfirsttime = firsttime if (debugmode) then iverbose = 2 elseif (isfirsttime) then iverbose = 1 else iverbose = 0 endif ! ipos is the offset for *which* timestep to read from files containing multiple steps ipos = 1 if (present(iposinfile)) then if (iposinfile > 0) ipos = iposinfile endif iposopen = 0 ! !--nstepsinfile is initialised to negative ! this is set progressively as files are read ! for non-buffered data file 1 is read and the rest are assumed to be the same ! then these files are corrected as they are read. By initialising nstepsinfile ! to negative, this means that if we get dud files (with nstepsinfile=0) we ! know that this is really the file contents (not just an initialised value of nstepsinfile) ! and can skip the file on the second encounter (see timestepping.f90) ! if (isfirsttime) then nstepsinfile(:) = -1 ncolumnsfirst = 0 required = .true. if (lowmemorymode) required = .false. call endian_info() endif if (ireadfile <= 0) then ! !--read all steps from the data file ! nstepsinfile(1:nfiles) = 0 required = .true. print "(/a)",' reading ALL dumpfiles into memory' !call endian_info() do i=1,nfiles call read_data(rootname(i),istart,ipos,nstepsinfile(i)) istart = istart + nstepsinfile(i) ! number of next step in data array if (nstepsinfile(i) > 0 .and. ncolumnsfirst==0 .and. ncolumns > 0) then ncolumnsfirst = ncolumns elseif (nstepsinfile(i) > 0 .and. ncolumns /= ncolumnsfirst) then print "(a,i2,a,i2,a)",' WARNING: file contains ',ncolumns, & ' columns (',ncolumnsfirst,' previously)' ncolumns = max(ncolumns,ncolumnsfirst) endif enddo nsteps = istart - 1 if (nsteps > 0) then ivegotdata = .true. DataIsBuffered = .true. else ncolumns = 0 endif print "(a,i6,a,i3)",' >> Finished data read, nsteps = ',nsteps,' ncolumns = ',ncolumns ! !--set labels (and units) for each column of data ! !print "(/a)",' setting plot labels...' if (ivegotdata .and. ncolumns > 0) then call get_labels call adjust_data_codeunits ! !--do some basic sanity checks ! call check_data_read() call rescale_data(isfirsttime,nsteps) endif ! !--reset coordinate and vector labels (depending on coordinate system) ! Need to do this BEFORE calculating quantities ! if (ivegotdata) call set_coordlabels(ncolumns) ! !--calculate various additional quantities ! if (nsteps >= 1 .and. iCalcQuantities) then call calc_quantities(1,nsteps) endif ! !--set plot limits ! if (ierr > 0 .and. ivegotdata .and. nstepsinfile(1) >= 1) then call set_limits(1,nsteps,1,ncolumns+ncalc) endif elseif (ireadfile > 0) then ! !--read from a single file only ! nstepsinfile(ireadfile) = 0 !if (isfirsttime) print "(/a)",' reading single dumpfile' if (dotiming) call wall_time(t1) call read_data(rootname(ireadfile),istart,ipos,nstepsinfile(ireadfile)) ! !--do some basic sanity checks ! if (debugmode) print "(a,i3)",' DEBUG: ncolumns from data read = ',ncolumns if (debugmode) print "(a,i3)",' DEBUG: nsteps in file = ',nstepsinfile(ireadfile) if (buffer_steps_in_file) then nsteps_read = nstepsinfile(ireadfile) else nsteps_read = 1 iposopen = ipos endif !--try different endian if failed the first time !if (nstepsinfile(ireadfile)==0) then ! print "(a)",' trying different endian' ! call read_data_otherendian(rootname(ireadfile),istart,nstepsinfile(ireadfile)) !endif if (dotiming) then call wall_time(t2) if (t2-t1 > 1.) then if (ipartialread) then call print_time(t2-t1,'time for (partial) data read = ') print* else call print_time(t2-t1,'time for data read = ') print* endif endif ! do i=1,ncolumns+ncalc ! print*,' required(',i,') = ',required(i) ! enddo endif !!print*,'nsteps in file = ',nstepsinfile(ireadfile) if (ANY(nstepsinfile(1:ireadfile) > 0)) ivegotdata = .true. if (.not.ivegotdata) ncolumns = 0 ! !--set ncolumns on first step only ! if (ivegotdata .and. ncolumnsfirst==0 .and. ncolumns > 0) then ncolumnsfirst = ncolumns endif !--override ncolumns from file and warn if different to first file if (ncolumnsfirst > 0 .and. nstepsinfile(ireadfile) > 0) then verbose = any(required(min(ncolumnsfirst,ncolumns)+1:)) if (ncolumns /= ncolumnsfirst) then if (verbose) write(*,"(1x,a,i2,a,i2,a)",advance='NO') 'WARNING: file has ',ncolumns, & ' columns (',ncolumnsfirst,' previously)' if (ncolumns < ncolumnsfirst) then if (verbose) write(*,"(a,i2,/)") ', data=0 for columns > ',ncolumns dat(:,ncolumns+1:min(ncolumnsfirst,maxcol),1:nstepsinfile(ireadfile)) = 0. elseif (ncolumns > ncolumnsfirst) then if (verbose) write(*,"(a,i2,a)") ', columns > ',ncolumnsfirst,' ignored' if (verbose) print "(10x,a,/)",'(read this file first to use this data)' else if (verbose) write (*,*) endif ncolumns = ncolumnsfirst endif endif ! !--assume there are the same number of steps in the other files ! which have not been read ! do i=1,nfiles if (nstepsinfile(i)==-1) then nstepsinfile(i) = nstepsinfile(ireadfile) endif enddo nsteps = sum(nstepsinfile(1:nfiles)) ! !--set labels (and units) for each column of data ! allow this to be overridden by the presence of a splash.columns file ! !!print "(/a)",' setting plot labels...' if (ivegotdata .and. ncolumns > 0) then call get_labels if (ivegotdata) call set_coordlabels(ncolumns) call adjust_data_codeunits call check_data_read() call rescale_data(isfirsttime,nsteps_read) endif ! !--reset coordinate and vector labels (depending on coordinate system) ! Need to do this BEFORE calculating quantities ! if (ivegotdata) call set_coordlabels(ncolumns) ! !--calculate various additional quantities ! if (nsteps_read > 0 .and. iCalcQuantities) then if (ipartialread .and. .not.any(required(ncolumns+1:))) then !--for partial data reads do a "pretend" call to calc quantities ! just to get ncalc and column labels right call calc_quantities(1,nsteps_read,dontcalculate=.true.) else call calc_quantities(1,nsteps_read) endif endif ! !--only set limits if reading the first file for the first time ! setlimits = (ireadfile==1 .and. ivegotdata .and. nstepsinfile(1) >= 1) if (.not.present(firsttime)) then setlimits = .false. elseif (.not.firsttime) then setlimits = .false. endif if (setlimits) then call set_limits(1,nsteps_read,1,ncolumns+ncalc) !--also set iendatstep the first time around iendatstep = nsteps endif endif end subroutine get_data !---------------------------------------------------------------------- ! ! The following is a wrapper routine for the call to set_labels which ! overrides the label setting from the splash.columns file if present. ! Also adds the units label if the data has been rescaled. ! !---------------------------------------------------------------------- subroutine get_labels use asciiutils, only:read_asciifile use filenames, only:fileprefix use labels, only:label use settings_data, only:ncolumns use particle_data, only:maxcol use params, only:maxplot use readdata, only:set_labels logical :: iexist integer :: nlabelsread call set_labels ! !--check that label settings are sensible, fix where possible ! call check_labels ! !--look for a .columns file to override the default column labelling ! inquire(file=trim(fileprefix)//'.columns',exist=iexist) nlabelsread = 0 if (iexist) then call read_asciifile(trim(fileprefix)//'.columns',nlabelsread,label(1:min(ncolumns,maxcol,maxplot))) if (nlabelsread < ncolumns) & print "(a,i3)",' end of file in '//trim(fileprefix)//'.columns file: labels read to column ',nlabelsread endif end subroutine get_labels !---------------------------------------------------------------------- ! ! Apply physical units to data ! !---------------------------------------------------------------------- subroutine rescale_data(firsttime,nsteps_read) use filenames, only:unitsfile use labels, only:label,unitslabel,unitslabel_default,labelzintegration,labelzintegration_default,& map_shifted_columns,labelorig,labelreq use settings_data, only:ncolumns,iRescale,idefaults_file_read,iverbose,debugmode,enforce_code_units use settings_units, only:units,units_calc,units_default,unitzintegration,unitzintegration_default,read_unitsfile use particle_data, only:maxcol,dat,time use params, only:maxplot logical, intent(in) :: firsttime integer, intent(in) :: nsteps_read integer :: i,j,icol,ierr integer :: imap(maxplot) ! ! turn physical units on by default if: ! 1) the data read has set the physical units ! 2) they have not been switched off ! if (firsttime .and. any(abs(units_default(0:ncolumns)-1.0) > tiny(units))) then units = units_default unitslabel = unitslabel_default unitzintegration = unitzintegration_default labelzintegration = labelzintegration_default if (.not.idefaults_file_read .and. .not.enforce_code_units) iRescale = .true. endif ! !--override default units by reading .units file ! if (firsttime) call read_unitsfile(trim(unitsfile),ncolumns,ierr,iverbose) if (firsttime) then labelorig = '' labelreq = '' endif ! !--apply physical units to data ! if (iRescale .and. any(abs(units(0:ncolumns)-1.0) > tiny(units))) then if (debugmode) write(*,"(a)") ' rescaling data...' units_calc = units imap = map_shifted_columns() do j=1,nsteps_read do i=1,min(ncolumns,maxcol) icol = imap(i) !print*,i,' imap=',icol !if (icol /= i) print*,' shift data WAS ',i,units(i),unitslabel(i),' USING ',icol,units(icol),unitslabel(icol) if (abs(units(icol)-1.0) > tiny(units) .and. abs(units(icol)) > tiny(units)) then dat(:,i,j) = dat(:,i,j)*units(icol) endif enddo enddo do i=1,nsteps_read if (time(i) > -0.5*huge(0.)) time(i) = time(i)*units(0) enddo endif ! !--add units labels to labels ! if (iRescale) then do i=1,min(ncolumns,maxcol,maxplot) if (index(label(i),trim(unitslabel(i)))==0) label(i) = trim(label(i))//trim(unitslabel(i)) enddo endif end subroutine rescale_data !---------------------------------------------------------------- ! ! utility to check that label settings are sensible ! !---------------------------------------------------------------- subroutine check_labels use settings_data, only:ndim,ndimV,ncolumns,iverbose use labels, only:ix,irho,ih,ipmass use particle_data, only:masstype integer :: i,ndimset if (ndim /= 0 .and. ncolumns > 0) then if (ndim < 0 .or. ndim > 3) then print "(a)",' ERROR with ndim setting in data read, using ndim=3' ndim = 3 endif if (ndimV < 0 .or. ndimV > 3) then print "(a)",' ERROR with ndimV setting in data read, using ndimV=3' ndimV = 3 endif if (ndim >= 2 .and. any(ix(2:ndim)==ix(1))) then print "(a)",' WARNING: error in ix setting in set_labels: fixing ' ix(1) = max(ix(1),1) do i=2,ndim ix(i) = i enddo endif if (ndim >= 1) then do i=1,ndim if (ix(i) <= 0) then ix(i) = i print "(a)",' WARNING: ndim > 0 but zero ix setting in set_labels: fixing ' endif enddo endif ndimset = 0 do i=1,3 if (ix(i) /= 0) ndimset = ndimset + 1 enddo if (ndimset /= ndim) then print "(2(a,i2))",' ERROR: labels for ',ndimset,& ' coordinates set but got ndim = ',ndim endif if (irho > ncolumns .or. irho < 0) then print "(a)",' ERROR with irho setting in data read' irho = 0 endif if (ih > ncolumns .or. ih < 0) then print "(a)",' ERROR with ih setting in data read ' ih = 0 endif if (ipmass > ncolumns .or. ipmass < 0) then print "(a)",' ERROR with ipmass setting in data read' ipmass = 0 endif if (iverbose >= 1) then if (irho==0 .or. ih==0) then print "(4(/,a))",' WARNING: Rendering capabilities cannot be enabled', & ' until positions of density, smoothing length and particle', & ' masses are known (specified using the integer variables ', & ' irho,ih and ipmass in the read_data routine)' elseif (irho > 0 .and. ih > 0 .and. ipmass==0 .and. all(masstype(:,:) < tiny(0.))) then print "(2(/,a))",' WARNING: Particle masses not read as array but mass not set:', & ' RENDERING WILL NOT WORK! ' endif endif endif end subroutine check_labels !---------------------------------------------------------------- ! ! utility to check things about the data read ! !---------------------------------------------------------------- subroutine check_data_read use params, only:maxplot,maxparttypes use settings_data, only:ncolumns,ndim,ndimV,ntypes,ivegotdata use particle_data, only:npartoftype,iamtype,dat use labels, only:labeltype integer :: i,j,ntoti,nunknown,itype integer, dimension(maxparttypes) :: noftype if (ncolumns < 0) then print "(a)",' ERROR: ncolumns < 0 in data read' ncolumns = 0 elseif (ncolumns > maxplot) then print "(/,71('*'),/,'*',a,i3,a,'*',/,71('*'))",& ' ERROR: ncolumns > ',maxplot,' in data read: cannot list all columns in menu ' ncolumns = maxplot endif if (ndim > 3) then; print "(a)",' ERROR: ndim > 3 in data read, setting ndim = 3'; ndim = 3; endif if (ndim < 0) then; print "(a)",' ERROR: ndim < 0 in data read, setting ndim = 0'; ndim = 0; endif if (ndimV > 3) then; print "(a)",' ERROR: ndimV > 3 in data read, setting ndimV = 3'; ndimV = 3; endif if (ndimV < 0) then; print "(a)",' ERROR: ndimV < 0 in data read, setting ndimV = 0'; ndimV = 0; endif if (ntypes < 0) then; print "(a)",' ERROR: ntypes < 0 in data read'; ntypes = 0; endif if (allocated(npartoftype)) then if (size(npartoftype(:,1)) < ntypes) then print "(a)",' ERROR: too many particle types for allocated array size in data read' ntypes = size(npartoftype(:,1)) endif do i=1,ntypes do j=1,size(npartoftype(i,:)) if (npartoftype(i,j) < 0) then print "(a)",' ERROR: number of '//trim(labeltype(i))//' particles < 0 in data read' npartoftype(i,j) = 0 endif enddo enddo ntoti = sum(npartoftype(:,1)) if (ntoti > size(dat(:,1,1))) then print "(2(a,i10),a)",' ERROR: size of dat array (',size(dat(:,1,1)),& ') too small for number of particles (',ntoti,')' ivegotdata = .false. endif !if (debugmode) then ! !--for mixed type storage, check that the number of particles ! of each type adds up to npartoftype ! ntoti = sum(npartoftype(:,1)) noftype(:) = 0 nunknown = 0 if (size(iamtype(:,1)) >= ntoti) then do i=1,ntoti itype = iamtype(i,1) if (itype > 0 .and. itype <= ntypes) then noftype(itype) = noftype(itype) + 1 else nunknown = nunknown + 1 endif enddo do itype=1,ntypes if (npartoftype(itype,1) /= noftype(itype)) then print "(a,i10,a,i10)",' ERROR in data read: got ',noftype(itype),' '//trim(labeltype(itype))// & ' particles from iamtype, but npartoftype = ',npartoftype(itype,1) endif enddo if (nunknown > 0) then print "(a,i10,a)",' ERROR in data read: got ',nunknown, & ' particles of unknown type in iamtype array from data read' endif endif !endif endif end subroutine check_data_read !------------------------------------- ! ! simple utility to spit out native ! endian-ness ! !------------------------------------- subroutine endian_info logical :: bigendian bigendian = IACHAR(TRANSFER(1,"a")) == 0 if (bigendian) then print "(a)",' native byte order on this machine is BIG endian' !--we no longer warn for little endian, as this is now most common !else ! print "(a)",' native byte order on this machine is LITTLE endian' endif end subroutine endian_info end module getdata danieljprice-splash-4d1f09c/src/globaldata.f90000066400000000000000000000126751477365367100213060ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------------- ! ! modules containing global variables ! !---------------------------------------------------------------------------- ! !--global parameters ! module params implicit none integer, parameter :: doub_prec = selected_real_kind(P=10,R=30) integer, parameter :: sing_prec = selected_real_kind(P=5,R=15) integer, parameter :: int1 = selected_int_kind(1) integer, parameter :: int8 = selected_int_kind(10) integer, parameter :: maxplot=512 ! maximum number of plots (for multiplot arrays) integer, parameter :: maxparttypes = 24 ! max # of different particle types integer, parameter :: ltag = 32 ! length of header tags integer, parameter :: maxhdr = 256 ! maximum number of header variables stored public end module params ! !--particle data ! module particle_data use params implicit none integer :: maxpart,maxstep,maxcol ! dimensions of dat array integer, allocatable, dimension(:) :: icolourme integer(kind=int1), allocatable, dimension(:,:) :: iamtype integer, allocatable, dimension(:,:) :: npartoftype real, allocatable, dimension(:,:) :: masstype real, allocatable, dimension(:) :: time, gamma real, allocatable, dimension(:,:) :: headervals real, allocatable, dimension(:,:,:) :: dat real, parameter :: time_not_read_val = -0.5*huge(0.) public contains logical function time_was_read(t) real, intent(in) :: t time_was_read = .true. if (t <= time_not_read_val) time_was_read = .false. end function time_was_read end module particle_data ! !--filenames ! module filenames implicit none integer, parameter :: maxfile = 10001 integer :: nfiles,nsteps,ifileopen,iposopen character(len=120), dimension(maxfile) :: rootname character(len=100) :: fileprefix character(len=120) :: defaultsfile,limitsfile,unitsfile,coloursfile integer, dimension(maxfile) :: nstepsinfile character(len=*), parameter :: tagline = & 'SPLASH: A visualisation tool for SPH data (c)2004-2025 Daniel Price and contributors' public contains subroutine set_filenames(prefix) character(len=*), intent(in) :: prefix fileprefix = trim(adjustl(prefix)) if (fileprefix(len_trim(fileprefix):len_trim(fileprefix))=='.') then fileprefix = fileprefix(1:len_trim(fileprefix)-1) endif defaultsfile = trim(adjustl(fileprefix))//'.defaults' limitsfile = trim(adjustl(fileprefix))//'.limits' unitsfile = trim(adjustl(fileprefix))//'.units' coloursfile = trim(adjustl(fileprefix))//'.colours' return end subroutine set_filenames end module filenames !------------------------------------ ! modules containing plot settings !------------------------------------ ! !--data ! module settings_data use params implicit none integer :: numplot,ncalc,ncolumns,nextra integer :: ndataplots integer :: ndim, ndimv integer :: ndusttypes integer :: idustfrac_plot = 0 integer :: ideltav_plot = 0 integer :: iautorender integer :: icoords,icoordsnew,iformat,ntypes,iexact integer :: istartatstep,iendatstep,nfreq integer :: iverbose integer, dimension(10) :: isteplist logical :: ivegotdata, DataIsBuffered, ipartialread logical :: buffer_data,iUseStepList,iCalcQuantities,iRescale logical :: idefaults_file_read,enforce_code_units logical :: buffer_steps_in_file = .false. !--required array is dimensioned 0:maxplot so that required(icol) = .true. ! does nothing bad if icol = 0 (much safer that way) logical :: lowmemorymode logical :: debugmode logical :: UseFakeDustParticles, UseFastRender logical, dimension(0:maxplot) :: required logical, dimension(maxparttypes) :: UseTypeInRenderings real, dimension(3) :: xorigin character(len=120) :: device character(len=20) :: track_string namelist /dataopts/ buffer_data,iCalcQuantities,iRescale,xorigin, & track_string,idustfrac_plot,ideltav_plot,UseFakeDustParticles public end module settings_data ! !--multiplot settings ! module multiplot use params implicit none integer :: nyplotmulti integer, dimension(maxplot) :: multiplotx,multiploty integer, dimension(maxplot) :: irendermulti,ivecplotmulti integer, dimension(maxplot) :: itrans,icontourmulti logical, dimension(maxplot) :: x_secmulti real, dimension(maxplot) :: xsecposmulti logical, dimension(maxplot) :: iusealltypesmulti logical, dimension(maxparttypes,maxplot) :: iplotpartoftypemulti ! !--sort these into a namelist for input/output ! namelist /multi/ nyplotmulti, & itrans,multiplotx,multiploty,irendermulti, & ivecplotmulti,icontourmulti,x_secmulti,xsecposmulti, & iusealltypesmulti,iplotpartoftypemulti public end module multiplot danieljprice-splash-4d1f09c/src/hdf5_helper_utils.c000066400000000000000000000033631477365367100224370ustar00rootroot00000000000000#include #include #include #include /* * utility function which checks whether a particular dataset * is present in the HDF5 file */ int checkfordataset(hid_t file_id, char *datasetname) { /* default is zero */ int ispresent=0; /* get number of datasets in file */ hsize_t ndatasets[1]; H5Gget_num_objs(file_id, ndatasets); /* loop over all datasets looking for dataset matching datasetname set function value to true (1) if it is present */ int i; char name[256]; for (i=0;i<(int)ndatasets[0];i++) { H5Gget_objname_by_idx(file_id, i, name, 256); /* printf(" dataset %s in file \n",name); */ if (strcmp(name,datasetname)==0) { /*printf(" %s in file \n",datasetname);*/ ispresent = 1; } } return ispresent; } /* * utility function to get dimensionality of a dataset */ int get_rank(hid_t dataspace_id) { int nrank = H5Sget_simple_extent_ndims(dataspace_id); hsize_t dims[nrank], maxdims[nrank]; nrank = H5Sget_simple_extent_dims(dataspace_id,dims,maxdims); int rank; if(nrank>1) { rank = dims[1]; } else { rank = 1; } return rank; } /* * utility function to get dimensionality of a dataset */ int get_rank_by_name(hid_t group_id, char *name) { if (!checkfordataset(group_id,name)) { return 0; } herr_t HDF5_error = -1; #if H5_VERSION_GE(1,8,0) hid_t dataset_id = H5Dopen2(group_id,name,H5P_DEFAULT); #else hid_t dataset_id = H5Dopen(group_id,name); #endif if (dataset_id == HDF5_error) { printf("ERROR opening %s data set \n",name); return 0; } hid_t dataspace_id = H5Dget_space(dataset_id); int rank = get_rank(dataspace_id); H5Dclose(dataset_id); return rank; } danieljprice-splash-4d1f09c/src/hdf5_helper_utils.h000066400000000000000000000004401477365367100224350ustar00rootroot00000000000000/* * The header file for the hdf5 utilities used in the * *util.c files */ #ifndef HDF5_UTILS_H_ #define HDF5_UTILS_H_ int checkfordataset(hid_t file_id, char *datasetname); int get_rank(hid_t dataspace_id); int get_rank_by_name(hid_t group_id, char *name); #endif // HDF5_UTILS_H_ danieljprice-splash-4d1f09c/src/imageutils.f90000066400000000000000000000227141477365367100213520ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2020- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Some utilities for image manipulation using SPH algorithms ! !---------------------------------------------------------------------- module imageutils use kernels, only:select_kernel,wfunc implicit none real, parameter :: pi = 4.*atan(1.) public :: image_denoise, image_denoise3D, image_rotate private contains !---------------------------------------------------------------------- ! ! denoise an image using adaptive kernel convolution ! i.e. variable smoothing lengths, where the smoothing scale ! is inversely proportional to the image intensity ! !---------------------------------------------------------------------- subroutine image_denoise(naxes,image,hh,iterations,imax,beam,skip,err) use interpolations2D, only:interpolate2D integer, intent(in) :: naxes(2) real, intent(inout) :: image(naxes(1),naxes(2)) real, intent(inout) :: hh(naxes(1)*naxes(2)) integer, intent(in), optional :: iterations real, intent(in), optional :: beam,imax integer, intent(out), optional :: err logical, intent(in), optional :: skip real, allocatable :: x(:),y(:),weight(:),dat(:) integer, allocatable :: mask(:) integer :: npixels,its,niter,i,j,n,ierr,iskip real :: imagemax,dx,dy,hfac,xmin,ymin logical :: do_skip ! choose default kernel if not already set if (.not.associated(wfunc)) call select_kernel(0) ! allocate memory for temporary arrays npixels = product(naxes) allocate(x(npixels),y(npixels),weight(npixels),dat(npixels),mask(npixels),stat=ierr) if (present(err)) err = ierr if (ierr /= 0) return dy = 1. dx = 1. xmin = 0.0 ymin = 0.0 mask(:) = 1 ! do not mask any pixels if (present(imax)) then imagemax = imax !print*,' imagemax = ',imagemax,' was ',maxval(image) else imagemax = maxval(image) endif do_skip = .true. if (present(skip)) do_skip = skip !fluxold = sum(image) !print*,' total intensity =',fluxold niter = 4 if (present(iterations)) niter = iterations hfac = 1.0 ! ! decide whether to subsample pixels ! no point using all if beam is large ! iskip = 1 ! as many particles as pixels if (present(beam)) then hfac = beam if (do_skip) then iskip = max(nint(0.5*hfac),1) if (iskip > 1) then print "(a,i2,a)",' beam is large compared to pixel scale, subsampling by factor of ',iskip,' for efficiency' print "(a)",' use --nosubsample to switch off' endif endif endif ! find the convolution length by iteration h_iterations: do its=1,niter n = 0 weight = 0. do j=1,naxes(2),iskip do i=1,naxes(1),iskip n = n + 1 x(n) = i - 0.5*dx y(n) = j - 0.5*dy if (niter > 0) then if (abs(image(i,j)) > 0.) then hh(n) = min(max(0.4*hfac*sqrt(imagemax/abs(image(i,j))),1.),5.*(its+1)*sqrt(hfac)) else hh(n) = 5.*(its+1)*sqrt(hfac) endif endif if (its==1) dat(n) = image(i,j) enddo enddo !print*,' sampling ',n,' pixels of ',naxes(1)*naxes(2) if (niter > 0) print "(' Iteration: ',i2,' of ',i2,': ',3(a,1g8.3))",its,niter,& 'beam: min = ',minval(hh(1:n)),' max = ',maxval(hh(1:n)),' mean = ',sum(hh(1:n))/n ! set weights for interpolation weight(1:n) = dx*dy*iskip**2/hh(1:n)**2 ! perform interpolation of dat array to new set of pixels (image) call interpolate2D(x,y,hh,weight,dat,mask,n, & xmin,ymin,image,naxes(1),naxes(2),dx,dy,& normalise=.false.,exact=.true.,periodicx=.false.,periodicy=.false.,iverbose=0) enddo h_iterations ! deallocate memory deallocate(x,y,mask,weight,dat) end subroutine image_denoise !---------------------------------------------------------------------- ! ! denoise an image using adaptive kernel convolution in 3D ! !---------------------------------------------------------------------- subroutine image_denoise3D(naxes,image,hh,iterations,imax,beam,err) use interpolations3D, only:interpolate3D integer, intent(in) :: naxes(3) real, intent(inout) :: image(naxes(1),naxes(2),naxes(3)) real, intent(inout) :: hh(naxes(1)*naxes(2)*naxes(3)) integer, intent(in), optional :: iterations real, intent(in), optional :: imax,beam integer, intent(out), optional :: err real, allocatable :: x(:),y(:),z(:),weight(:),dat(:) integer, allocatable :: mask(:) integer :: npixels,its,niter,i,j,k,n,ierr real :: imagemax,dx,dy,dz,xmin,ymin,zmin,hfac real(8), allocatable :: image_dp(:,:,:) ! choose default kernel if not already set if (.not.associated(wfunc)) call select_kernel(0) ! allocate memory for temporary arrays npixels = product(naxes) allocate(x(npixels),y(npixels),z(npixels),weight(npixels),dat(npixels),mask(npixels),stat=ierr) if (present(err)) err = ierr if (ierr /= 0) return if (size(hh) /= size(x)) then print*,' error: smoothing length array too small' ierr = 3 return endif dz = 1. dy = 1. dx = 1. xmin = 0.0 ymin = 0.0 zmin = 0.0 mask(:) = 1 ! do not mask any pixels if (present(imax)) then imagemax = imax else imagemax = maxval(image) endif niter = 4 if (present(iterations)) niter = iterations hfac = 1.0 if (present(beam)) hfac = beam allocate(image_dp(naxes(1),naxes(2),naxes(3))) ! find the convolution length by iteration h_iterations: do its=1,max(niter,1) n = 0 do k=1,naxes(3) do j=1,naxes(2) do i=1,naxes(1) n = n + 1 !print*,n,size(z),size(hh),size(dat),i,j,k x(n) = i - 0.5*dx y(n) = j - 0.5*dy z(n) = k - 0.5*dz if (niter > 0) then if (abs(image(i,j,k)) > 0.) then hh(n) = min(max(0.4*hfac*sqrt(imagemax/abs(image(i,j,k))),1.),5.*(its+1)*sqrt(hfac)) else hh(n) = 5.*(its+1)*sqrt(hfac) endif endif if (its==1) dat(n) = image(i,j,k) enddo enddo enddo if (niter > 0) print "(' Iteration: ',i2,' of ',i2,': ',3(a,1g8.3))",its,niter,& 'beam: min = ',minval(hh),' max = ',maxval(hh),' mean = ',sum(hh(1:npixels))/npixels weight(1:npixels) = dx*dy*dz/hh(1:npixels)**3 call interpolate3D(x,y,z,hh,weight,dat,mask,npixels, & xmin,ymin,zmin,image_dp,naxes(1),naxes(2),naxes(3),dx,dy,dz,& normalise=.false.,periodicx=.false.,periodicy=.false.,periodicz=.false.) image = real(image_dp) enddo h_iterations ! deallocate memory deallocate(x,y,z,mask,weight,dat) if (allocated(image_dp)) deallocate(image_dp) end subroutine image_denoise3D !---------------------------------------------------------------------- ! ! rotate an image by a specified angle using kernel interpolation ! !---------------------------------------------------------------------- subroutine image_rotate(naxes,image,angle,err) use interpolations2D, only:interpolate2D integer, intent(in) :: naxes(2) real, intent(inout) :: image(naxes(1),naxes(2)) real, intent(in) :: angle integer, intent(out), optional :: err real, allocatable :: x(:),y(:),weight(:),dat(:),hh(:) integer, allocatable :: mask(:) integer :: npixels,i,j,n,ierr real :: dx,dy,xmin,ymin,anglerad,xpos(2),x0,y0 ! choose default kernel if not already set if (.not.associated(wfunc)) call select_kernel(0) ! allocate memory for temporary arrays npixels = product(naxes) allocate(x(npixels),y(npixels),weight(npixels),dat(npixels),mask(npixels),hh(npixels),stat=ierr) if (present(err)) err = ierr if (ierr /= 0) return x0 = 0.5*naxes(1) y0 = 0.5*naxes(2) dy = 1. dx = 1. xmin = -0.5*naxes(1) ymin = -0.5*naxes(2) mask(:) = 1 ! do not mask any pixels hh(:) = 1.0 ! do not blur image n = 0 do j=1,naxes(2) do i=1,naxes(1) n = n + 1 x(n) = xmin + (i-0.5)*dx y(n) = ymin + (j-0.5)*dy dat(n) = image(i,j) enddo enddo ! convert angle to radians anglerad = angle*pi/180. ! rotate particles do i=1,n call rotatez(x(i),y(i),anglerad) enddo ! set weights for interpolation weight(:) = 1.0 !dx*dy/hh(1:n)**2 ! perform interpolation of dat array to new set of pixels (image) call interpolate2D(x,y,hh,weight,dat,mask,n, & xmin,ymin,image,naxes(1),naxes(2),dx,dy,& normalise=.false.,exact=.true.,periodicx=.false.,periodicy=.false.,iverbose=0) ! deallocate memory deallocate(x,y,mask,weight,dat) end subroutine image_rotate subroutine rotatez(x,y,anglez) real, intent(inout) :: x,y real, intent(in) :: anglez real :: r, phi ! !--rotate about z ! r = sqrt(x**2 + y**2) phi = atan2(y,x) phi = phi - anglez x = r*cos(phi) y = r*sin(phi) end subroutine rotatez end module imageutils danieljprice-splash-4d1f09c/src/initialise.f90000066400000000000000000000022711477365367100213350ustar00rootroot00000000000000module initialise implicit none !! !! initialise some variables !! this should only be called at code start !! contains subroutine defaults_set_initial use filenames, only:rootname use labels, only:label,labeltype,iamvec,labelvec,set_default_labels,reset_columnids use limits, only:lim,range use particle_data, only:maxpart,maxstep,maxcol use settings_data, only:UseTypeInRenderings,device integer :: i ! !--limits (could set them to anything but min & max must be different ! to enable them to be reset interactively if not set elsewhere) ! lim(:,1) = 0. lim(:,2) = 1. range(:,:) = 0. call reset_columnids() ! !--filenames ! rootname = ' ' ! !--data array sizes ! maxpart = 0 maxcol = 0 maxstep = 0 ! !--labels ! call set_default_labels(label) ! particle types labeltype(1) = 'gas' do i=2,size(labeltype) if (i > 9) then write(labeltype(i),"(a,1x,i2)") 'type',i else write(labeltype(i),"(a,1x,i1)") 'type',i endif enddo UseTypeInRenderings(:) = .false. UseTypeInRenderings(1) = .true. ! vector labels iamvec(:) = 0 labelvec = ' ' ! device from command line device = ' ' end subroutine defaults_set_initial end module initialise danieljprice-splash-4d1f09c/src/interactive.f90000066400000000000000000003432461477365367100215320ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module interactive_routines use colourbar, only:barisvertical,incolourbar,incolourbarlabel,adjustcolourbar implicit none public :: interactive_part,interactive_step,interactive_multi public :: set_movie_mode,save_limits private :: mvlegend,mvtitle,save_rotation private :: get_vptxy real, private :: xcursor = 0.5 real, private :: ycursor = 0.5 private contains ! !--interactive tools on particle plots ! allows user to change settings interactively ! ! Arguments: ! ! INPUT: ! npart : number of particles plotted ! iplotx : quantity plotted as x axis ! iploty : quantity plotted as y axis ! iplotz : quantity to use in selecting particles ! irender : quantity rendered ! xcoords(npart) : x coordinates of particles ! ycoords(npart) : y coordinates of particles ! zcoords(npart) : z coordinates (or third quantity) of particles ! hi(npart) : smoothing lengths of particles ! zmin, zmax : range of z within which to plot particles ! istep : current step position ! ilaststep : position of last timestep ! ! CHANGEABLE: ! icolourpart(npart) : flag indicating colour of particles ! xmin, xmax, ymin, ymax : current plot limits ! rendermin, rendermax : current rendering limits ! vecmax : maximum vector limits ! ! OUTPUT: ! iadvance : integer telling the loop how to advance the timestep ! irerender : if set, redo rendering. Anything which requires rendering ! to be recalculated must set this ! subroutine interactive_part(npart,iplotx,iploty,iplotz,irender,icontour,ivecx,ivecy, & xcoords,ycoords,zcoords,hi,icolourpart,iamtype,usetype,npartoftype,xmin,xmax,ymin,ymax, & rendermin,rendermax,renderminadapt,rendermaxadapt,contmin,contmax,& contminadapt,contmaxadapt,vecmax, & anglex,angley,anglez,ndim,xorigin,x_sec,zslicepos,dzslice, & zobserver,dscreen,use3Dopacity,rkappa,double_rendering,irerender,itrackpart,icolourscheme, & iColourBarStyle,labelrender,iadvance,istep,ilaststep,iframe,nframes,interactivereplot) use settings_xsecrot, only:setsequenceend use shapes, only:inshape,edit_shape,edit_textbox,delete_shape,nshapes,add_shape_interactive use multiplot, only:itrans use labels, only:is_coord,ix,get_sink_type use limits, only:assert_sensible_limits use settings_render, only:projlabelformat,iapplyprojformat use settings_data, only:ndataplots,ntypes,icoords,icoordsnew use plotlib, only:plot_qwin,plot_curs,plot_sfs,plot_circ,plot_line,plot_pt1, & plot_rect,plot_band,plot_sfs,plot_qcur,plot_left_click,plot_right_click,& plot_scroll_left,plot_scroll_right,plotlib_is_pgplot,& plot_shift_click,plot_lcur,plot_poly use params, only:int1,maxparttypes use part_utils, only:igettype use particleplots, only:plot_kernel_gr use legends, only:in_legend integer, intent(in) :: npart,icontour,ndim,iplotz,ivecx,ivecy,istep,ilaststep,iframe,nframes integer, intent(inout) :: irender,iColourBarStyle integer, intent(inout) :: iplotx,iploty,itrackpart,icolourscheme integer, intent(inout) :: iadvance integer, dimension(npart), intent(inout) :: icolourpart real, dimension(npart), intent(in) :: xcoords,ycoords,zcoords,hi integer(kind=int1), dimension(:), intent(in) :: iamtype logical, dimension(maxparttypes), intent(in) :: usetype integer, dimension(maxparttypes), intent(in) :: npartoftype real, intent(inout) :: xmin,xmax,ymin,ymax,rendermin,rendermax,vecmax,contmin,contmax,rkappa real, intent(inout) :: anglex,angley,anglez,zslicepos,dzslice,zobserver,dscreen real, intent(in) :: renderminadapt,rendermaxadapt,contminadapt,contmaxadapt real, intent(in), dimension(ndim) :: xorigin character(len=*), intent(inout) :: labelrender logical, intent(inout) :: x_sec logical, intent(out) :: irerender,interactivereplot logical, intent(in) :: use3Dopacity, double_rendering real, parameter :: pi=4.*atan(1.) integer, parameter :: maxpts = 64 integer :: i,iclosest,iclosestsink,ierr,ixsec,ishape,ilegend,itype,npts integer :: nmarked,ncircpart,itrackparttemp,iadvancenew,itypesink integer, dimension(1000) :: icircpart real :: xpt,ypt real :: xpt2,ypt2,xcen,ycen,xminwin,xmaxwin,yminwin,ymaxwin real :: xptmin,xptmax,yptmin,yptmax,zptmin,zptmax,rptmax2 real :: rmin,rminsink,rr,gradient,yint,dx,dy,dr,anglerad real :: xlength,ylength,renderlength,renderpt,zoomfac,scalefac real :: dxlength,dylength,xmaxin,ymaxin,contlength real, dimension(4) :: xline,yline real, dimension(maxpts) :: xpts,ypts character(len=1) :: char,char2 logical :: iexit, rotation, verticalbar, iamincolourbar, mixedtypes, use3Dperspective logical :: iadvanceset, leftclick, iselectpoly, iselectcircle logical, save :: print_help = .true. logical, save :: in_movie_mode = .false. if (plot_qcur()) then if (.not.print_help) print*,'entering interactive mode...press h in plot window for help' !print*, plot_left_click else !print*,'cannot enter interactive mode: device has no cursor' return endif mixedtypes = size(iamtype) >= npart use3Dperspective = abs(dscreen) > tiny(0.) iadvanceset = .false. char = 'A' xline = 0. yline = 0. ! !--convert saved cursor position (saved in viewport coords) ! back to coordinates ! call plot_qwin(xminwin,xmaxwin,yminwin,ymaxwin) call get_posxy(xcursor,ycursor,xpt,ypt,xminwin,xmaxwin,yminwin,ymaxwin) ! xpt = 0. ! ypt = 0. xpt2 = 0. ypt2 = 0. xmaxin = xmax ymaxin = ymax zoomfac = 1.0 scalefac = 1.1 ncircpart = 0 itrackparttemp = itrackpart iexit = .false. rotation = .false. irerender = .false. interactivereplot = .false. if (is_coord(iplotx,ndim) .and. is_coord(iploty,ndim) .and. ndim >= 2) rotation = .true. verticalbar = barisvertical(iColourBarStyle) if (iplotz > 0 .and. x_sec) then zptmin = zslicepos - 0.5*dzslice zptmax = zslicepos + 0.5*dzslice else !--if not using z range, make it encompass all the particles zptmin = -huge(zptmin) zptmax = huge(zptmax) endif interactiveloop: do while (.not.iexit) if (print_help) then char = 'h' ierr = 0 print_help = .false. else ierr = plot_curs(xpt,ypt,char) endif ! !--exit if the device is not interactive ! if (ierr==1) return !print*,'x,y = ',xpt,ypt,' function = ',char,iachar(char) ! !--find closest particle ! rmin = huge(rmin) rminsink = huge(rmin) iclosest = 0 iclosestsink = 0 itypesink = get_sink_type(ntypes) xlength = xmax - xmin ylength = ymax - ymin if (xlength > tiny(xlength)) then dxlength = 1./xlength else dxlength = 0. endif if (ylength > tiny(ylength)) then dylength = 1./ylength else dylength = 0. endif itype = 1 over_npart: do i=1,npart if (ntypes > 1) then if (mixedtypes) then itype = int(iamtype(i)) else itype = igettype(i,npartoftype) endif if (.not.usetype(itype)) cycle over_npart endif !--use distance normalised on screen rr = ((xcoords(i)-xpt)*dxlength)**2 + ((ycoords(i)-ypt)*dylength)**2 if (rr < rmin) then iclosest = i rmin = rr endif if (itype==itypesink .and. rr < rminsink) then iclosestsink = i rminsink = rr endif enddo over_npart !--query the position of the colour bar iamincolourbar = incolourbar(iColourBarStyle,4,xpt,ypt,xmin,xmax,ymin,ymax) select case(char) ! !--particle plot stuff ! case('p') if (iclosest > 0 .and. iclosest <= npart) then print*,' closest particle = ',iclosest,'x = ',xcoords(iclosest),' y =',ycoords(iclosest) call plot_number(iclosest,xcoords(iclosest),ycoords(iclosest)) else print*,'error: could not determine closest particle' endif case('c') if (iclosest > 0 .and. iclosest <= npart) then print*,'plotting circle of interaction on particle ',iclosest, & ' h = ',hi(iclosest) !--save settings for these ncircpart = ncircpart + 1 if (ncircpart > size(icircpart)) then print*,'WARNING: ncircles > array limits, cannot save' ncircpart = size(icircpart) else icircpart(ncircpart) = iclosest endif call plot_sfs(2) if (icoordsnew /= icoords) then call plot_kernel_gr(icoordsnew,icoords,iplotx,iploty,& xcoords(iclosest),ycoords(iclosest),zcoords(iclosest),2.*hi(iclosest)) else call plot_circ(xcoords(iclosest),ycoords(iclosest),2.*hi(iclosest)) endif else print*,'error: could not determine closest particle' endif case('t') !--track closest particle (must save to activate) if (itrackpart /= 0 .and. itrackparttemp==itrackpart) then itrackpart = 0 itrackparttemp = 0 print*,' particle tracking limits OFF' else if (iclosest > 0 .and. iclosest <= npart) then itrackparttemp = iclosest call plot_number(iclosest,xcoords(iclosest),ycoords(iclosest)) print*,' limits set to track particle ',itrackparttemp,' x, y = ', & xcoords(iclosest),ycoords(iclosest) print*,' save settings to activate ' else print*,'error: could not determine closest particle' endif endif case('g') ! draw a line between two points xline(2) = xpt yline(2) = ypt !--mark first point call plot_pt1(xpt,ypt,4) !--select second point print*,' select another point (using left click or g) to plot line ' ierr = plot_band(1,1,xline(2),yline(2),xline(3),yline(3),char2) !--draw line if left click or g select case(char2) case(plot_left_click,'g') print* !--mark second point call plot_pt1(xline(3),yline(3),4) xlength = xline(3)-xline(2) if (abs(xlength) < tiny(xlength)) then xline(1) = xline(2) xline(4) = xline(2) yline(1) = ymin yline(4) = ymax print*,' error: gradient = infinite' elseif (xline(2) < xline(3)) then xline(1) = xmin xline(4) = xmax else xline(1) = xmax xline(4) = xmin endif ylength = yline(3)-yline(2) dr = sqrt(xlength**2 + ylength**2) print*,' (x1,y1) = (',xline(2),',',yline(2),')' print*,' (x2,y2) = (',xline(3),',',yline(3),')' print*,' dr = ',dr,' dx = ',xlength,' dy = ',ylength if (abs(xlength) > tiny(xlength)) then gradient = ylength/xlength yint = yline(3) - gradient*xline(3) print*,' gradient = ',gradient,' y intercept = ',yint yline(1) = gradient*xline(1) + yint yline(4) = gradient*xline(4) + yint endif !--plot line joining the two points call plot_line(4,xline,yline) case default print*,' action cancelled' end select ! !--help ! case('h') print "(/,a)",' -------------- interactive mode commands -----------------------------' print*,' SPACE BAR : skip to next timestep/file' print*,' 0,1,2,3..9 and click : go forward/back n timesteps (back=r.click)' print*,' left click (or A) : zoom/select' print*,' right click (or X or b) : previous timestep' print*,' shift+left click : IRREGULAR particle selection' print*,' left click on colour bar : change rendering limits' print*,' +/- : zoom IN/OUT (_ for out by 20%) ' print*,' a : (a)dapt plot limits (inside box, over axes or colour bar)' print*,' l : (l)og / unlog axis (over x/y axis or colour bar)' print*,' o/C/n : re-centre plot on (o)rigin/(C)ursor/(n)earest sink position' print*,' backspace: delete annotation (over axes, legend, title or colour bar)' print*,' r : (r)eplot current plot' print*,' R : (R)eset/remove all range restrictions' print*,' p/c : label closest (p)article/plot (c)ircle of interaction' print*,' t : t)rack closest particle/turn tracking off (coord plots only)' print*,' g : plot a line and find its g)radient' print*,' ctrl-t, ^: add text or arrow(^) annotation at current position' print*,' ctrl-m : toggle Hollywood mode' print*,' G/T/H : move le(G)end, (T)itle or (H) vector legend to current position' print*,' m/M/i : change colour map (m=next,M=previous,i=invert) (rendered plots only)' if (irender > 0) print*,' f/F : f)lip to next/previous column in rendering (rendered plots only)' print*,' v/V/w : decrease/increase/adapt arrow size on vector plots (Z for x10)' if (ndim >= 3) then print*,' k/K : decrease/increase opacity on opacity-rendered plots (Z for x10)' endif print*,' e/E : use current frame/settings as end point to animation sequence' if (ndim > 1) then print*,' , . < > : rotate about z axis by +(-) 15,30 degrees (coord plots only)' if (ndim >= 3) then print*,' [ ] { } : rotate about x axis by +/- 15,30 degrees (coord plots only)' print*,' / \ ? | : rotate about y axis by +/- 15,30 degrees (coord plots only)' print*,' x : take cross section (coord plots only)' if (iplotz > 0) then print*,' u/U/d/D : move cross section/perspective pos. up/down (towards/away from observer)' endif endif endif print*,' s : (s)ave current settings for all steps' print*,' q/Q/esc : (q)uit plotting' print*,' z/Z(oom) : timestepping, zoom and limits-changing multiplied by 10' print*,'----------------------------------------------------------------------' case('s','S') itrackpart = itrackparttemp if (itrackpart<=0 .or. itrackpart > size(xcoords)) then call save_limits(iplotx,xmin,xmax) call save_limits(iploty,ymin,ymax) call save_itrackpart_recalcradius(itrackpart) ! set saved value to zero else print*,'tracking particle ',itrackpart,'x,y = ',xcoords(itrackpart),ycoords(itrackpart) if (is_coord(iplotx,ndim)) then call save_limits_track(iplotx,xmin,xmax,xcoords(itrackpart)) else call save_limits(iplotx,xmin,xmax) endif if (is_coord(iploty,ndim)) then call save_limits_track(iploty,ymin,ymax,ycoords(itrackpart)) else call save_limits(iploty,ymin,ymax) endif call save_itrackpart_recalcradius(itrackpart) endif if (irender > 0) call save_limits(irender,rendermin,rendermax) if (icontour > 0) then if (icontour==irender & .and. abs(rendermin-contmin) <= tiny(0.) & .and. abs(rendermax-contmax) <= tiny(0.)) then call reset_limits2(icontour) elseif (icontour==irender .and. .not.double_rendering) then call save_limits(icontour,contmin,contmax,setlim2=.true.) else call save_limits(icontour,contmin,contmax) endif endif if (ivecx > 0 .and. ivecy > 0) then call save_limits(ivecx,-vecmax,vecmax) call save_limits(ivecy,-vecmax,vecmax) endif if (ndim==3 .and. iplotz > 0 .and. irender > 0 .and. use3Dopacity) then call save_opacity(rkappa) endif if (ncircpart > 0) call save_circles(ncircpart,icircpart) if (rotation) call save_rotation(ndim,anglex,angley,anglez) if (iplotz > 0) then if (x_sec) then call save_xsecpos(zslicepos,x_sec) else call save_perspective(zobserver,dscreen) endif endif call save_windowsize() print*,'> interactively set limits saved <' ! !--actions on left click ! case(plot_left_click,plot_right_click,plot_shift_click) ! left click ! !--change colour bar limits ! leftclick = (char == plot_left_click) ishape = inshape(xpt,ypt,itrans(iplotx),itrans(iploty),xmin,xmax,ymin,ymax) if (ishape > 0) then call edit_shape(ishape,xpt,ypt,itrans(iplotx),itrans(iploty),first=.false.) iadvance = 0 interactivereplot = .true. iexit = .true. elseif (iamincolourbar .and. irender > 0 .and. leftclick) then if (incolourbarlabel(iColourBarStyle,4,xpt,ypt,xmin,xmax,ymin,ymax)) then if (verticalbar) then call edit_textbox(xpt,ypt,90.,0.,labelrender) projlabelformat = trim(labelrender) iapplyprojformat = irender else call edit_textbox(xpt,ypt,0.,0.,labelrender) projlabelformat = trim(labelrender) iapplyprojformat = irender endif iadvance = 0 interactivereplot = .true. iexit = .true. else print*,'click to set rendering limits' if (verticalbar) then ierr = plot_band(3,1,xpt,ypt,xpt2,ypt2,char2) else ierr = plot_band(4,1,xpt,ypt,xpt2,ypt2,char2) endif if (char2 == plot_left_click) then if (double_rendering) then call adjustcolourbar(iColourBarStyle,xpt,ypt,xpt2,ypt2,& xmin,xmax,ymin,ymax,contmin,contmax) !print*,'setting doublerender min = ',contmin !print*,'setting doublerender max = ',contmax else call adjustcolourbar(iColourBarStyle,xpt,ypt,xpt2,ypt2,& xmin,xmax,ymin,ymax,rendermin,rendermax) !print*,'setting render min = ',rendermin !print*,'setting render max = ',rendermax endif iadvance = 0 interactivereplot = .true. iexit = .true. endif endif ! !--zoom or mark particles ! else print*,'select area: ' !--Note: circle selection is not implemented in PGPLOT iselectpoly = (char==plot_shift_click .or.((.not.leftclick).and.plotlib_is_pgplot)) iselectcircle = (char==plot_right_click .and. .not.plotlib_is_pgplot) if (iselectpoly) then if (plotlib_is_pgplot) then print*,'left click/a)dd points; middle click/d)elete points; X/x)finish' else print*,'left click/a)dd points; middle click/d)elete points; q)uit/abort' if (irender <= 0) print*,'1-9 = close polygon and mark particles with colours 1-9' print*,'0 = close polygon and hide selected particles' print*,'p = close polygon and plot selected particles only' print*,'c = close polygon and plot circles of interaction on selected parts' endif else print*,'left click : zoom' if (irender <= 0) print*,'1-9 = mark selected particles with colours 1-9' print*,'0 = hide selected particles' print*,'p = plot selected particles only' print*,'c = plot circles of interaction on selected parts' endif if (leftclick .or. iselectcircle) then print*,'x = use particles within x parameter range only' print*,'y = use particles within y parameter range only' print*,'r = use particles within x and y parameter range only' print*,'R = remove all range restrictions' endif npts = 1 xpts(1) = xpt ! to avoid problems with uninitialised variables ypts(1) = ypt if (iselectpoly) then call plot_lcur(maxpts,npts,xpts,ypts,char2) if (plotlib_is_pgplot) then if (irender <= 0) print*,'1-9 = close polygon and mark particles with colours 1-9' print*,'0 = close polygon and hide selected particles' print*,'p = close polygon and plot selected particles only' print*,'c = close polygon and plot circles of interaction on selected parts' ierr = plot_band(0,1,xpt,ypt,xpt2,ypt2,char2) endif xptmin = minval(xpts(1:npts)) xptmax = maxval(xpts(1:npts)) yptmin = minval(ypts(1:npts)) yptmax = maxval(ypts(1:npts)) elseif (iselectcircle) then ierr = plot_band(8,1,xpt,ypt,xpt2,ypt2,char2) rptmax2 = (xpt2-xpt)**2 + (ypt2-ypt)**2 rr = sqrt(rptmax2) xptmin = xpt - rr xptmax = xpt + rr yptmin = ypt - rr yptmax = ypt + rr else ! left click: rectangle selection ierr = plot_band(2,1,xpt,ypt,xpt2,ypt2,char2) xptmin = min(xpt,xpt2) xptmax = max(xpt,xpt2) yptmin = min(ypt,ypt2) yptmax = max(ypt,ypt2) endif if (.not.(iselectcircle.or.iselectpoly) .or. char2==plot_left_click) then ! rectangle selection !print*,'xrange = ',xptmin,'->',xptmax !print*,'yrange = ',yptmin,'->',yptmax if (iplotz /= 0 .and. x_sec) then print*,'(zrange = ',zptmin,'->',zptmax,')' endif endif select case (char2) case(plot_left_click) ! zoom if another left click call plot_sfs(2) !--draw the selected shape in case zooming is slow if (iselectpoly) then call plot_poly(npts,xpts,ypts) elseif (iselectcircle) then call plot_circ(xpt,ypt,sqrt(rptmax2)) else call plot_rect(xpt,xpt2,ypt,ypt2) endif !--zoom is identical for rectangle, poly and circle selection xmin = xptmin xmax = xptmax ymin = yptmin ymax = yptmax iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. case('0','1','2','3','4','5','6','7','8','9') ! mark particles nmarked = 0 if (irender <= 0 .or. char2=='0' .or. char2=='1') then do i=1,npart if (inslice(zcoords(i),zptmin,zptmax) .and. & (leftclick .and. inrectangle(xcoords(i),ycoords(i),xptmin,xptmax,yptmin,yptmax) & .or.(iselectcircle .and. incircle(xcoords(i)-xpt,ycoords(i)-ypt,rptmax2)) & .or.(iselectpoly .and. inpoly(xcoords(i),ycoords(i),xpts,ypts,npts)))) then read(char2,*,iostat=ierr) icolourpart(i) if (ierr /=0) then print*,'*** error marking particle' icolourpart(i) = 1 !--translate 0 to icolourpart = -1 for non-plotted particles elseif (icolourpart(i)==0) then icolourpart(i) = -1 endif nmarked = nmarked + 1 endif enddo print*,'marked ',nmarked,' particles in selected region' endif iadvance = 0 if (nmarked > 0) irerender = .true. interactivereplot = .true. iexit = .true. case('p') ! plot selected particles only nmarked = 0 do i=1,npart if (inslice(zcoords(i),zptmin,zptmax) .and. & (leftclick .and. inrectangle(xcoords(i),ycoords(i),xptmin,xptmax,yptmin,yptmax) & .or.(iselectcircle .and. incircle(xcoords(i)-xpt,ycoords(i)-ypt,rptmax2)) & .or.(iselectpoly .and. inpoly(xcoords(i),ycoords(i),xpts,ypts,npts)))) then nmarked = nmarked + 1 if (icolourpart(i) <= 0) icolourpart(i) = 1 else icolourpart(i) = -1 endif enddo print*,'plotting selected ',nmarked,' particles only' iadvance = 0 irerender = .true. interactivereplot = .true. iexit = .true. case('c') ! set circles of interaction in marked region ncircpart = 0 do i=1,npart if (inslice(zcoords(i),zptmin,zptmax) .and. & (leftclick .and. inrectangle(xcoords(i),ycoords(i),xptmin,xptmax,yptmin,yptmax) & .or.(iselectcircle .and. incircle(xcoords(i)-xpt,ycoords(i)-ypt,rptmax2)) & .or.(iselectpoly .and. inpoly(xcoords(i),ycoords(i),xpts,ypts,npts)))) then if (ncircpart < size(icircpart)) then ncircpart = ncircpart + 1 icircpart(ncircpart) = i call plot_sfs(2) call plot_circ(xcoords(i),ycoords(i),2.*hi(i)) endif endif enddo print*,'set ',ncircpart,' circles of interaction in selected region' if (ncircpart==size(icircpart)) print*,' (first ',size(icircpart),' only)' case('x') call restrict_range(iplotx,xptmin,xptmax) iadvance = 0 irerender = .true. interactivereplot = .true. iexit = .true. case('y') call restrict_range(iploty,yptmin,yptmax) iadvance = 0 irerender = .true. interactivereplot = .true. iexit = .true. case('r') call restrict_range(iplotx,xptmin,xptmax) call restrict_range(iploty,yptmin,yptmax) iadvance = 0 irerender = .true. interactivereplot = .true. iexit = .true. case('R') call reset_ranges iadvance = 0 irerender = .true. interactivereplot = .true. iexit = .true. case default print*,' action cancelled' end select endif ! !--zooming ! case('-','_','+','o','C','n','N') ! zoom in/out xlength = xmax - xmin ylength = ymax - ymin xcen = 0.5*(xmax + xmin) ycen = 0.5*(ymax + ymin) renderlength = rendermax - rendermin contlength = contmax - contmin select case(char) case('-') xlength = zoomfac*scalefac*xlength ylength = zoomfac*scalefac*ylength renderlength = zoomfac*scalefac*renderlength contlength = zoomfac*scalefac*contlength case('_') xlength = 1.2*zoomfac*scalefac*xlength ylength = 1.2*zoomfac*scalefac*ylength renderlength = 1.2*zoomfac*scalefac*renderlength contlength = 1.2*zoomfac*scalefac*contlength case('+') xlength = xlength/(zoomfac*scalefac) ylength = ylength/(zoomfac*scalefac) renderlength = renderlength/(zoomfac*scalefac) contlength = contlength/(zoomfac*scalefac) case('o') if (itrackpart > 0) then print*,'centreing limits on tracked particle ',itrackpart,'x,y = ',xcoords(itrackpart),ycoords(itrackpart) xcen = xcoords(itrackpart) ycen = ycoords(itrackpart) else if (is_coord(iplotx,ndim)) then xcen = xorigin(iplotx) else xcen = 0. endif if (is_coord(iploty,ndim)) then ycen = xorigin(iploty) else ycen = 0. endif print*,' centreing plot on origin x,y = ',xcen,ycen endif case('C') xcen = xpt ycen = ypt case('n','N') if (iclosestsink > 0) then xcen = xcoords(iclosestsink) ycen = ycoords(iclosestsink) print*,'centreing limits on sink particle ',iclosestsink,'x,y = ',xcen,ycen else print*,'error: could not find closest sink particle, using origin instead' xcen = 0. ycen = 0. endif end select if (iamincolourbar .and. irender > 0) then !--rendering zoom does not allow pan - renderpt is always centre of axis if (double_rendering) then renderpt = 0.5*(contmin + contmax) contmin = renderpt - 0.5*contlength contmax = renderpt + 0.5*contlength call assert_sensible_limits(contmin,contmax) !print*,'zooming on colour bar: min, max = ',contmin,contmax else renderpt = 0.5*(rendermin + rendermax) rendermin = renderpt - 0.5*renderlength rendermax = renderpt + 0.5*renderlength call assert_sensible_limits(rendermin,rendermax) !print*,'zooming on colour bar: min, max = ',rendermin,rendermax endif iadvance = 0 interactivereplot = .true. iexit = .true. else if (xpt >= xmin .and. xpt <= xmax .and. ypt <= ymaxin) then xmin = xcen - 0.5*xlength xmax = xcen + 0.5*xlength call assert_sensible_limits(xmin,xmax) iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif if (ypt >= ymin .and. ypt <= ymax .and. xpt <= xmaxin) then ymin = ycen - 0.5*ylength ymax = ycen + 0.5*ylength call assert_sensible_limits(ymin,ymax) iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif endif if (char=='o') then xpt = xcen ypt = ycen endif case('a') ! reset plot limits if (iamincolourbar .and. irender > 0) then if (double_rendering) then contmin = contminadapt contmax = contmaxadapt call assert_sensible_limits(contmin,contmax) else rendermax = rendermaxadapt if (itrans(irender)==1 .and. renderminadapt < rendermaxadapt-5.) then ! if logged if (abs(rendermin-(rendermaxadapt-4.)) > epsilon(0.)) then rendermin = rendermaxadapt - 4. ! if logged, do not give 20 orders of mag print "(a)",' *** MIN SET 4 DEX FROM MAX, PRESS ''a'' AGAIN TO GIVE FULL RANGE ***' else rendermin = renderminadapt endif else rendermin = renderminadapt endif call assert_sensible_limits(rendermin,rendermax) endif iadvance = 0 ! that it should change the render limits interactivereplot = .true. iexit = .true. else xmaxin = xmax ymaxin = ymax if (xpt >= xmin .and. xpt <= xmax .and. ypt <= ymaxin) then call adapt_limits_interactive('x',npart,xcoords,xmin,xmax,icolourpart,iamtype,usetype) iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif if (ypt >= ymin .and. ypt <= ymax .and. xpt <= xmaxin) then call adapt_limits_interactive('y',npart,ycoords,ymin,ymax,icolourpart,iamtype,usetype) iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif endif ! !--zoom in/out on vector plots (arrow size) ! case('v') if (ivecx > 0 .and. ivecy > 0) then !print*,'decreasing vector arrow size' vecmax = zoomfac*scalefac*vecmax iadvance = 0 interactivereplot = .true. iexit = .true. endif case('V') if (ivecx > 0 .and. ivecy > 0) then !print*,'increasing vector arrow size' vecmax = vecmax/(zoomfac*scalefac) iadvance = 0 interactivereplot = .true. iexit = .true. endif case('w','W') if (ivecx > 0 .and. ivecy > 0) then !print*,'adapting vector arrow size' vecmax = -1.0 iadvance = 0 interactivereplot = .true. iexit = .true. endif ! !--change opacity on 3D opacity rendered plots ! case('k') if (ndim==3 .and. iplotz > 0 .and. irender /= 0 .and. use3Dopacity) then print*,'decreasing opacity by factor of ',1.5*zoomfac*scalefac rkappa = rkappa/(zoomfac*scalefac) iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('K') if (ndim==3 .and. iplotz > 0 .and. irender /= 0 .and. use3Dopacity) then print*,'increasing opacity by factor of ',1.5*zoomfac*scalefac rkappa = rkappa*(zoomfac*scalefac) iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif ! !--set/unset log axes ! case('l') ! !--change colour bar, y and x itrans between log / not logged ! if (iamincolourbar .and. irender > 0) then if (double_rendering) then !call change_itrans(irender,rendermin,rendermax) call change_itrans(icontour,contmin,contmax) else if (icontour==irender) then call change_itrans2(irender,rendermin,rendermax,contmin,contmax) else call change_itrans(irender,rendermin,rendermax) endif endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. elseif (xpt < xmin) then if (is_coord(iploty,ndim) .and. irender > 0) then print "(a)",'error: cannot log coordinate axes with rendering' else call change_itrans(iploty,ymin,ymax) iadvance = 0 interactivereplot = .true. iexit = .true. endif elseif (ypt < ymin) then if (is_coord(iplotx,ndim) .and. irender > 0) then print "(a)",'error: cannot log coordinate axes with rendering' else call change_itrans(iplotx,xmin,xmax) iadvance = 0 interactivereplot = .true. iexit = .true. endif endif ! !--reset all range restrictions ! case('R') call reset_ranges iadvance = 0 interactivereplot = .true. iexit = .true. ! !--save as end point of animation sequence ! case('e','E') call setsequenceend(istep,iplotx,iploty,irender,rotation, & anglex,angley,anglez,zobserver,use3Dopacity,rkappa, & x_sec,zslicepos,xmin,xmax,ymin,ymax,rendermin,rendermax) ! !--rotation ! case(',') if (rotation) then !print*,'changing z rotation angle by -15 degrees...' if (int(scalefac) > 1) then anglez = anglez - int(scalefac) else anglez = anglez - 15. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('<') if (rotation) then !print*,'changing z rotation angle by -30 degrees...' if (int(scalefac) > 1) then anglez = anglez - int(scalefac) else anglez = anglez - 30. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('.') if (rotation) then !print*,'changing z rotation angle by 15 degrees...' if (int(scalefac) > 1) then anglez = anglez + int(scalefac) else anglez = anglez + 15. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('>') if (rotation) then !print*,'changing z rotation angle by 30 degrees...' if (int(scalefac) > 1) then anglez = anglez + int(scalefac) else anglez = anglez + 30. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('/') if (rotation .and. ndim >= 2) then !print*,'changing y rotation angle by -15 degrees...' if (int(scalefac) > 1) then angley = angley - int(scalefac) else angley = angley - 15. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('?') if (rotation .and. ndim >= 2) then !print*,'changing y rotation angle by -30 degrees...' if (int(scalefac) > 1) then angley = angley - int(scalefac) else angley = angley - 30. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('\') if (rotation .and. ndim >= 2) then !print*,'changing y rotation angle by 15 degrees...' if (int(scalefac) > 1) then angley = angley + int(scalefac) else angley = angley + 15. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('|') if (rotation .and. ndim >= 2) then !print*,'changing y rotation angle by 30 degrees...' !print*,'changing y rotation angle by 15 degrees...' if (int(scalefac) > 1) then angley = angley + int(scalefac) else angley = angley + 30. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('[') if (rotation .and. ndim >= 3) then !print*,'changing x rotation angle by -15 degrees...' if (int(scalefac) > 1) then anglex = anglex - int(scalefac) else anglex = anglex - 15. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('{') if (rotation .and. ndim >= 3) then !print*,'changing x rotation angle by -30 degrees...' if (int(scalefac) > 1) then anglex = anglex - int(scalefac) else anglex = anglex - 30. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case(']') if (rotation .and. ndim >= 3) then !print*,'changing x rotation angle by 15 degrees...' if (int(scalefac) > 1) then anglex = anglex + int(scalefac) else anglex = anglex + 15. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('}') if (rotation .and. ndim >= 3) then !print*,'changing x rotation angle by 30 degrees...' if (int(scalefac) > 1) then anglex = anglex + int(scalefac) else anglex = anglex + 30. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif ! !--set cross section position ! case('x') if (rotation .and. ndim >= 3) then xline(1) = xpt yline(1) = ypt !--work out which is the third dimension do i=1,3 if (i /= iplotx .and. i /= iploty) ixsec = i enddo print*,' select cross section position (using left click or x)' ierr = plot_band(1,1,xline(1),yline(1),xline(2),yline(2),char2) !--work out cross section if left click or x again select case(char2) case(plot_left_click,'x') !--plot the cross section line call plot_line(2,xline(1:2),yline(1:2)) !--work out angle with the x axis ! and offset of line from origin dx = xline(2) - xline(1) dy = yline(2) - yline(1) anglerad = atan2(dy,dx) select case(ixsec) case(1) anglex = 180.*anglerad/pi + anglex print*,'setting angle x = ',anglex case(2) angley = 180.*anglerad/pi + angley print*,'setting angle y = ',angley case(3) anglez = 180.*anglerad/pi + anglez print*,'setting angle z = ',anglez end select iploty = ixsec !--work out offset of cross section line ! y intercept yint = yline(2) - (dy/dx)*xline(2) zslicepos = yint/cos(anglerad) !--if we are in column density mode, change back to cross-section mode x_sec = .true. print*,'iploty = ',ixsec, ' xsecpos = ',zslicepos iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. case default print*,' action cancelled' end select endif ! !--cross sections ! case('u') ! move cross section up by dxsec if (iplotz > 0 .and. ndim==3) then if (x_sec) then if (int(scalefac) > 1) dzslice = scalefac print*,'shifting cross section position up by ',dzslice zslicepos = zslicepos + dzslice iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. elseif (use3Dperspective) then if (abs(zobserver) < tiny(0.)) then print*,'resetting z position' zobserver = 1. else print*,'shifting perspective position up by factor of ',scalefac zobserver = scalefac*zoomfac*zobserver endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif endif case('U') ! move cross section up by 2*dxsec if (iplotz > 0 .and. ndim==3) then if (x_sec) then print*,'shifting cross section position up by ',2.*dzslice zslicepos = zslicepos + 2.*dzslice iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. elseif (use3Dperspective) then if (abs(zobserver) < tiny(0.)) then print*,'resetting z position' zobserver = 1. else print*,'shifting perspective position up by factor of 2' zobserver = 2.*scalefac*zoomfac*zobserver endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif endif case('d') ! move cross section down by dxsec if (iplotz > 0 .and. ndim==3) then if (x_sec) then if (int(scalefac) > 1) dzslice = scalefac print*,'shifting cross section position down by ',dzslice zslicepos = zslicepos - dzslice elseif (use3Dperspective) then if (abs(zobserver) < tiny(0.)) then print*,'resetting z position' zobserver = 1. else print*,'shifting perspective position down' zobserver = zobserver/(zoomfac*scalefac) endif endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif case('D') ! move cross section down by 2*dxsec if (iplotz > 0 .and. ndim==3) then if (x_sec) then print*,'shifting cross section position down by ',2.*dzslice zslicepos = zslicepos - 2.*dzslice elseif (use3Dperspective) then if (abs(zobserver) < tiny(0.)) then print*,'resetting z position' zobserver = 1. else print*,'shifting perspective position down by factor of 2' zobserver = zobserver/(2.*zoomfac*scalefac) endif endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. endif ! !--general plot stuff ! case('G') ! move legend here print*,'setting legend position to current location...' call mvlegend(xpt,ypt,xmin,xmax,ymax) iadvance = 0 interactivereplot = .true. iexit = .true. case('T') ! move title here print*,'setting title position to current location...' call mvtitle(xpt,ypt,xmin,xmax,ymax) iadvance = 0 interactivereplot = .true. iexit = .true. case('H') ! move vector legend here if (ivecx > 0 .and. ivecy > 0) then print*,'setting vector plot legend to current location...' call mvlegendvec(xpt,ypt,xmin,xmax,ymax) endif iadvance = 0 interactivereplot = .true. iexit = .true. case('f') ! change rendered quantity (next) if (irender /= 0 .and. ndim > 0) then irender = irender + 1 if (irender > ndataplots) irender = 1 if (is_coord(irender,ndim)) irender = ix(ndim) + 1 !if (irender==ndataplots+1) irender = 0 iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. else ! flip y axis iploty = iploty + 1 if (iploty > ndataplots) iploty = 1 iadvance = 0 interactivereplot = .true. iexit = .true. endif case('F') ! change rendered quantity (previous) if (irender /= 0 .and. ndim > 0) then irender = irender - 1 if (is_coord(irender,ndim)) irender = ix(1) - 1 if (irender < 1) irender = ndataplots !if (irender==ndim) irender = 0 iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. else ! flip y axis iploty = iploty - 1 if (iploty < 1) iploty = ndataplots iadvance = 0 interactivereplot = .true. iexit = .true. endif case(achar(13)) if (in_movie_mode) then call unset_movie_mode() in_movie_mode = .false. else call set_movie_mode(.true.) in_movie_mode = .true. endif iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. case('m') ! change colour map (next scheme) call change_colourmap(icolourscheme,1) iadvance = 0 interactivereplot = .true. !irerender = .true. iexit = .true. case('M') ! change colour map (previous scheme) call change_colourmap(icolourscheme,-1) iadvance = 0 interactivereplot = .true. iexit = .true. case('i') ! invert colour map icolourscheme = -icolourscheme call change_colourmap(icolourscheme,0) iadvance = 0 interactivereplot = .true. iexit = .true. case('^') ! add arrow call add_shape_interactive(xpt,ypt,itrans(iplotx),itrans(iploty),0,ierr,shape_type=3) if (ierr==0) then iadvance = 0 interactivereplot = .true. iexit = .true. endif case(achar(20)) ! add text shape call add_shape_interactive(xpt,ypt,itrans(iplotx),itrans(iploty),0,ierr,shape_type=6) if (ierr==0) then iadvance = 0 interactivereplot = .true. iexit = .true. endif case(achar(8)) ! delete plot annotation / colour bar (backspace) ishape = inshape(xpt,ypt,itrans(iplotx),itrans(iploty),xmin,xmax,ymin,ymax) if (ishape > 0) then call delete_shape(ishape,nshapes) iadvance = 0 interactivereplot = .true. iexit = .true. elseif (iamincolourbar .and. irender > 0) then iColourBarStyle = 0 iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. elseif (xpt < xmin .or. xpt > xmax .or. ypt < ymin .or. ypt > ymax) then call deleteaxes() iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. else ilegend = in_legend(xpt,ypt) if (legend_is_plotted(ilegend)) then call delete_legend(ilegend) iadvance = 0 interactivereplot = .true. iexit = .true. else print*,' nothing to delete at x,y =',xpt,',',ypt endif endif ! !--timestepping ! case('q','Q',achar(27),achar(3)) iadvance = -666 !print*,'quitting...' iexit = .true. case('b','B',plot_scroll_left) ! right click -> go back iadvance = -abs(iadvance) iexit = .true. case('r') ! replot iadvance = 0 interactivereplot = .true. irerender = .true. iexit = .true. case(' ',plot_scroll_right) ! space iadvance = abs(iadvance) iexit = .true. case('0','1','2','3','4','5','6','7','8','9') read(char,*,iostat=ierr) iadvancenew if (ierr /=0) then print*,'*** internal error setting timestep jump' iadvancenew = 1 endif if ((iadvance > 1 .or. iadvanceset) .and. iadvance <= 9999) then iadvance = 10*iadvance + iadvancenew if (iadvance > 9999) iadvance = 1 elseif (iadvancenew==0) then iadvance = 10 else iadvance = iadvancenew endif iadvance = int(zoomfac*iadvance) print*,' setting timestep jump / zoom factor = ',iadvance iadvanceset = .true. scalefac = iadvance case(')') iadvance = int(zoomfac*10) print*,' setting timestep jump = ',iadvance ! !--multiply everything by a factor of 10 ! case('z','Z') zoomfac = 10.*zoomfac if (zoomfac > 1000000.) then zoomfac = 1.0 endif print*,' LIMITS/TIMESTEPPING CHANGES NOW x ',zoomfac ! !--unknown ! case default if (iachar(char) >= iachar('a')) then print*,' x, y = ',xpt,ypt,'; unknown option "',trim(char), '" ',iachar(char) endif print*,' x, y = ',xpt,ypt,'; GOT ',iachar(char) end select ! !--save cursor position relative to the viewport ! call plot_qwin(xminwin,xmaxwin,yminwin,ymaxwin) call get_vptxy(xpt,ypt,xcursor,ycursor) if (rotation) then if (anglez >= 360.) anglez = anglez - 360. if (anglez < 0.) anglez = anglez + 360. if (ndim > 2) then if (angley >= 360.) angley = angley - 360. if (angley < 0.) angley = angley + 360. if (anglex >= 360.) anglex = anglex - 360. if (anglex < 0.) anglex = anglex + 360. endif endif ! !--do not let timestep go outside of bounds ! if we are at the first/last step, just print message and do nothing ! if iadvance trips over the bounds, jump to last/first step ! if (iadvance /= -666 .and. iexit) then if (istep + iadvance > ilaststep .and. iframe==nframes) then print "(1x,a)",'reached last timestep' if (ilaststep-istep > 0) then iadvance= ilaststep - istep else iexit = .false. endif elseif (istep + iadvance < 1 .and. iframe==1) then print "(1x,a)",'reached first timestep: can''t go back' if (1-istep < 0) then iadvance= 1 - istep else iexit = .false. endif endif endif enddo interactiveloop return end subroutine interactive_part ! ! cut down version of interactive mode -> controls timestepping only ! used in powerspectrum / extra plots ! THIS IS NOW LARGELY OBSOLETE (superseded by interactive_multi) ! AND WILL BE REMOVED IN FUTURE VERSIONS ! subroutine interactive_step(iadvance,istep,ilaststep,xmin,xmax,ymin,ymax,interactivereplot) use plotlib, only:plot_qcur,plot_curs,plot_band,plot_rect,plot_left_click integer, intent(inout) :: iadvance integer, intent(in) :: istep,ilaststep real, intent(inout) :: xmin,xmax,ymin,ymax logical, intent(out) :: interactivereplot integer :: ierr real :: xpt,ypt,xpt2,ypt2 real :: xlength, ylength, zoomfac character(len=1) :: char,char2 logical :: iexit if (plot_qcur()) then print*,'entering interactive mode...press h in plot window for help' else !print*,'cannot enter interactive mode: device has no cursor' return endif char = 'A' xpt = 0. ypt = 0. zoomfac = 1.0 iexit = .false. interactivereplot = .false. do while (.not.iexit) ierr = plot_curs(xpt,ypt,char) ! !--exit if the device is not interactive ! if (ierr==1) return print*,'x, y = ',xpt,ypt,' function = ',char select case(char) case('h') print*,'-------------- interactive mode commands --------------' print*,' select area and zoom : left click (or A)' print*,' zoom in by 10% : +' print*,' zoom out by 10(20)% : - (_)' print*,' (r)eplot current plot : r' print*,' next timestep/plot : space, n' print*,' previous timestep : right click (or X), b' print*,' jump forward (back) by n timesteps : 0,1,2,3..9 then left (right) click' print*,' G : move legend to current position' print*,' T : move title to current position' print*,' (h)elp : h' print*,' (q)uit plotting : q, Q, esc' print*,'-------------------------------------------------------' case(plot_left_click) ! left click ! !--draw rectangle from the point and reset the limits ! print*,'select area: ' print*,'left click : zoom' ierr = plot_band(2,1,xpt,ypt,xpt2,ypt2,char2) print*,xpt,ypt,xpt2,ypt2,char2 select case (char2) case(plot_left_click) ! zoom if another left click call plot_rect(xpt,xpt2,ypt,ypt2) xmin = min(xpt,xpt2) xmax = max(xpt,xpt2) ymin = min(ypt,ypt2) ymax = max(ypt,ypt2) iadvance = 0 interactivereplot = .true. iexit = .true. case default print*,' action cancelled' end select ! !--zooming ! case('-','_','+','o') ! zoom out by 10 or 20% xlength = xmax - xmin ylength = ymax - ymin select case(char) case('-') xlength = 1.1*zoomfac*xlength ylength = 1.1*zoomfac*ylength case('_') xlength = 1.2*zoomfac*xlength ylength = 1.2*zoomfac*ylength case('+') xlength = 0.9/zoomfac*xlength ylength = 0.9/zoomfac*ylength case('o') !--reset cursor to origin xpt = 0. ypt = 0. end select if (xpt >= xmin .and. xpt <= xmax .and. ypt <= ymax) then print*,'zooming on x axis' xmin = xpt - 0.5*xlength xmax = xpt + 0.5*xlength iadvance = 0 interactivereplot = .true. iexit = .true. endif if (ypt >= ymin .and. ypt <= ymax .and. xpt <= xmax) then print*,'zooming on y axis' ymin = ypt - 0.5*ylength ymax = ypt + 0.5*ylength iadvance = 0 interactivereplot = .true. iexit = .true. endif ! !--general plot stuff ! case('G') ! move legend here print*,'setting legend position to current location...' call mvlegend(xpt,ypt,xmin,xmax,ymax) case('T') ! move title here print*,'setting title position to current location...' call mvtitle(xpt,ypt,xmin,xmax,ymax) ! !--timestepping ! case('q','Q',achar(27),achar(3)) iadvance = -666 print*,'quitting...' iexit = .true. case('X','b','B') ! right click -> go back iadvance = -abs(iadvance) iexit = .true. case('r','R') ! replot iadvance = 0 interactivereplot = .true. iexit = .true. case(' ','n','N') ! space iadvance = abs(iadvance) iexit = .true. case('0','1','2','3','4','5','6','7','8','9') read(char,*,iostat=ierr) iadvance if (ierr /=0) then print*,'*** internal error setting timestep jump' iadvance = 1 endif iadvance = int(zoomfac*iadvance) print*,' setting timestep jump = ',iadvance case(')') iadvance = int(zoomfac*10) print*,' setting timestep jump = ',iadvance ! !--multiply everything by a factor of 10 ! case('z','Z') zoomfac = 10.*zoomfac if (zoomfac > 1000000.) then zoomfac = 1.0 endif print*,' LIMITS/TIMESTEPPING CHANGES NOW x ',zoomfac ! !--unknown ! case default print*,' x, y = ',xpt,ypt,'; unknown option "',trim(char), '" ',iachar(char) end select ! !--do not let timestep go outside of bounds ! if we are at the first/last step, just print message and do nothing ! if iadvance trips over the bounds, jump to last/first step ! if (iadvance /= -666 .and. iexit) then if (istep + iadvance > ilaststep) then print "(1x,a)",'reached last timestep' if (ilaststep-istep > 0) then iadvance= ilaststep - istep else iexit = .false. endif elseif (istep + iadvance < 1) then print "(1x,a)",'reached first timestep: can''t go back' if (1-istep < 0) then iadvance= 1 - istep else iexit = .false. endif endif endif enddo return end subroutine interactive_step ! ! interactive mode for multiple plots per page - requires determination of which plot/panel ! a mouse-click refers to from stored settings for the viewport and limits for each plot. ! (this could be made into the only subroutine required) ! subroutine interactive_multi(iadvance,istep,ifirststeponpage,ilaststep,iframe,ifirstframeonpage,nframes, & lastpanel,iplotxarr,iplotyarr,irenderarr,icontourarr,ivecarr,& use_double_rendering,xmin,xmax,vptxmin,vptxmax,vptymin,vptymax, & barwmulti,xminadapt,xmaxadapt,nacross,ndim,xorigin,icolourscheme, & iColourBarStyle,interactivereplot) use labels, only:is_coord,iamvec use limits, only:assert_sensible_limits use multiplot, only:itrans use shapes, only:add_shape_interactive,inshape,edit_shape,delete_shape,nshapes use plotlib, only:plot_qcur,plot_band,plot_qwin,plot_pt1,plot_curs,plot_line,plot_left_click use legends, only:in_legend integer, intent(inout) :: iadvance integer, intent(inout) :: istep,iframe,lastpanel,iColourBarStyle integer, intent(in) :: ifirststeponpage,ilaststep,nacross,ndim,ifirstframeonpage,nframes integer, intent(inout) :: icolourscheme integer, intent(in), dimension(:) :: iplotxarr,iplotyarr,irenderarr,icontourarr,ivecarr real, dimension(:), intent(in) :: vptxmin,vptxmax,vptymin,vptymax,barwmulti real, dimension(:), intent(inout) :: xmin,xmax,xminadapt,xmaxadapt real, intent(in), dimension(ndim) :: xorigin logical, intent(in) :: use_double_rendering logical, intent(out) :: interactivereplot integer :: ierr,ipanel,ipanel2,istepin,istepnew,i,istepjump,istepsonpage,ishape,ilegend integer :: istepjumpnew,ivecx,ivecy real :: xpt,ypt,xpt2,ypt2,xpti,ypti,renderpt,xptmin,xptmax,yptmin,yptmax real :: xlength,ylength,renderlength,contlength,zoomfac,scalefac real :: vptxi,vptyi,vptx2i,vpty2i,vptxceni,vptyceni real :: xmini,xmaxi,ymini,ymaxi,xcen,ycen,gradient,dr,yint,xmaxin real, dimension(4) :: xline,yline character(len=1) :: char,char2 logical :: iexit,iamincolourbar,verticalbar,double_render,istepjumpset logical, save :: print_help = .true. if (plot_qcur()) then if (.not.print_help) print*,'entering interactive mode...press h in plot window for help' else !print*,'cannot enter interactive mode: device has no cursor' return endif char = 'A' zoomfac = 1.0 scalefac = 1.1 xpt2 = 0. ypt2 = 0. verticalbar = barisvertical(iColourBarStyle) ! !--convert saved cursor position (saved in viewport coords) ! back to world coordinates: ! !--query window limits in world coords call plot_qwin(xmini,xmaxi,ymini,ymaxi) !--determine which plot the cursor falls on !print*,' saved xcursor,ycursor = ',xcursor,ycursor,vptxmin,vptxmax,vptymin,vptymax ipanel = getpanel(xcursor,ycursor) !print*,' saved panel = ',ipanel !--set the window to correspond to the panel we last left the cursor in call set_panel(ipanel) !--set the position in x,y relative to this panel call getxy(xcursor,ycursor,xpt,ypt,ipanel) !print*,' saved x,y = ',xpt,ypt call get_vptxy(xpt,ypt,vptxi,vptyi) !print*,'saved vptx,y = ',vptxi,vptyi,ipanel iexit = .false. interactivereplot = .false. istepin = istep istepnew = ifirststeponpage - iadvance istepsonpage = abs(istep - ifirststeponpage)/iadvance + 1 istepjump = 1 istepjumpset = .false. ! print*,'istep = ',istepnew ! print*,'steps on page = ',istepsonpage interactive_loop: do while (.not.iexit) if (print_help) then print_help = .false. char = 'h' ierr = 0 else ierr = plot_curs(xpt,ypt,char) endif ! !--exit if the device is not interactive ! if (ierr==1) return !print*,'x, y = ',xpt,ypt,' function = ',char ! !--determine which plot the cursor falls on ! call get_vptxy(xpt,ypt,vptxi,vptyi) ipanel = getpanel(vptxi,vptyi) !print*,'xpt,ypt = ',xpt,ypt,vptxi,vptyi,ipanel !--translate vpt co-ords to x,y in current panel call getxy(vptxi,vptyi,xpti,ypti,ipanel) !print*,'vptx,y = ',xpti,ypti,vptxi,vptyi,ipanel !--query the position of the colour bar if (ipanel > 0) then if (barwmulti(ipanel) > tiny(barwmulti)) then iamincolourbar = incolourbar(iColourBarStyle,4,xpti,ypti,xmin(iplotxarr(ipanel)), & xmax(iplotxarr(ipanel)),xmin(iplotyarr(ipanel)),xmax(iplotyarr(ipanel))) else !--for colour bars on tiled plots, use viewport coords iamincolourbar = incolourbar(iColourBarStyle,0,vptxi,vptyi,& minval(vptxmin),maxval(vptxmax),minval(vptymin),maxval(vptymax)) endif else iamincolourbar = .false. endif !--work out if this plot is double rendered or not double_render = (icontourarr(ipanel) > 0 .and. use_double_rendering) select case(char) case('h') print "(/,a)",' ------- interactive mode commands (multiple plots per page) --------' print*,' SPACE BAR (or n) : skip to next timestep/file' print*,' 0,1,2,3..9 and click : go forward/back n timesteps (back=r.click)' print*,' left click (or A) : zoom/select' print*,' right click (or X or b) : previous timestep' print*,' left click on colour bar : change rendering limits' print*,' +/- : zoom IN/OUT (_ for out by 20%) ' print*,' a : (a)dapt plot limits (inside box, over axes/colour bar)' print*,' l : (l)og / unlog axis (over x/y axis or colour bar)' print*,' o/C : re-centre plot on (o)rigin/(C)ursor position' print*,' backspace: delete annotation (over axes/legend/title/colour bar)' print*,' r : (r)eplot current plot' print*,' R : (R)eset/remove all range restrictions' print*,' g : plot a line and find its g)radient' print*,' ctrl-t, ^: add text or arrow(^) at current position' print*,' G/T/H : move le(G)end, (T)itle or (H) vector legend to current position' print*,' m/M/i : change colour map (m=next,M=previous,i=invert) (rendered plots only)' print*,' v/V/w : decrease/increase/adapt arrow size on vector plots (Z for x10)' print*,' s : (s)ave current settings for all steps' print*,' q/Q/esc : (q)uit plotting' print*,' z/Z(oom) : timestepping, zoom and limits-changing multiplied by 10' print*,'--------------------------------------------------------------------' case('g') ! draw a line between two points xline(2) = xpti yline(2) = ypti call set_panel(ipanel) !--mark first point call plot_pt1(xpti,ypti,4) !--select second point print*,' select another point (using left click or g) to plot line ' ierr = plot_band(1,1,xline(2),yline(2),xline(3),yline(3),char2) !--draw line if left click or g select case(char2) case(plot_left_click,'g') print* !--mark second point call plot_pt1(xline(3),yline(3),4) xlength = xline(3)-xline(2) if (abs(xlength) < tiny(xlength)) then xline(1) = xline(2) xline(4) = xline(2) yline(1) = xmin(iplotyarr(ipanel)) yline(4) = xmax(iplotyarr(ipanel)) print*,' error: gradient = infinite' elseif (xline(2) < xline(3)) then xline(1) = xmin(iplotxarr(ipanel)) xline(4) = xmax(iplotxarr(ipanel)) else xline(1) = xmax(iplotxarr(ipanel)) xline(4) = xmin(iplotxarr(ipanel)) endif ylength = yline(3)-yline(2) dr = sqrt(xlength**2 + ylength**2) print*,' (x1,y1) = (',xline(2),',',yline(2),')' print*,' (x2,y2) = (',xline(3),',',yline(3),')' print*,' dr = ',dr,' dx = ',xlength,' dy = ',ylength if (abs(xlength) > tiny(xlength)) then gradient = ylength/xlength yint = yline(3) - gradient*xline(3) print*,' gradient = ',gradient,' y intercept = ',yint yline(1) = gradient*xline(1) + yint yline(4) = gradient*xline(4) + yint endif !--plot line joining the two points call plot_line(4,xline,yline) call reset_panel case default print*,' action cancelled' end select case('s','S') do i=1,size(vptxmin) call save_limits(iplotxarr(i),xmin(iplotxarr(i)),xmax(iplotxarr(i))) call save_limits(iplotyarr(i),xmin(iplotyarr(i)),xmax(iplotyarr(i))) if (irenderarr(i) > 0) call save_limits(irenderarr(i),xmin(irenderarr(i)),xmax(irenderarr(i))) if (icontourarr(i) > 0) call save_limits(icontourarr(i),xmin(icontourarr(i)),xmax(icontourarr(i))) if (ivecarr(i) > 0) then ivecx = iamvec(ivecarr(i)) + iplotxarr(i) - 1 ivecy = iamvec(ivecarr(i)) + iplotyarr(i) - 1 if (ivecx > 0) call save_limits(ivecx,-xmax(ivecx),xmax(ivecx)) if (ivecy > 0) call save_limits(ivecy,-xmax(ivecy),xmax(ivecy)) endif enddo call save_windowsize() print*,'> interactively set limits saved <' case(plot_left_click) ! left click !ishape = inshape(xpt,ypt,itrans(iplotx),itrans(iploty)) !if (ishape > 0) then ! call edit_shape(ishape,xpt,ypt,itrans(iplotx),itrans(iploty),first=.false.) ! iadvance = 0 ! interactivereplot = .true. !! iexit = .true. !endif ! !--draw rectangle from the point and reset the limits ! print*,'select area: ' print*,'left click : zoom' print*,'x = use particles within x parameter range only' print*,'y = use particles within y parameter range only' print*,'r = use particles within x and y parameter range only' print*,'R = remove all range restrictions' ! !--change colour bar limits ! if (ipanel > 0 .and. iamincolourbar .and. irenderarr(ipanel) > 0) then print*,'click to set rendering limits' if (verticalbar) then ierr = plot_band(3,1,xpt,ypt,xpt2,ypt2,char2) else ierr = plot_band(4,1,xpt,ypt,xpt2,ypt2,char2) endif if (char2 == plot_left_click) then call get_vptxy(xpt2,ypt2,vptx2i,vpty2i) !--use centre point of first click and current click to ! better determine panel vptxceni = 0.5*(vptxi + vptx2i) vptyceni = 0.5*(vptyi + vpty2i) ipanel2 = getpanel(vptxceni,vptyceni) if (ipanel2 > 0 .and. ipanel2 /= ipanel) then print*,'panel = ',ipanel2,' was ',ipanel ipanel = ipanel2 endif call getxy(vptx2i,vpty2i,xpt2,ypt2,ipanel) !--reset first point according to current panel call getxy(vptxi,vptyi,xpti,ypti,ipanel) double_render = (icontourarr(ipanel) > 0 .and. use_double_rendering) if (barwmulti(ipanel) > tiny(barwmulti)) then if (double_render) then call adjustcolourbar(iColourBarStyle,vptxi,vptyi,vptx2i,vpty2i,& vptxmin(ipanel),vptxmax(ipanel),vptymin(ipanel),vptymax(ipanel),& xmin(icontourarr(ipanel)),xmax(icontourarr(ipanel))) else call adjustcolourbar(iColourBarStyle,vptxi,vptyi,vptx2i,vpty2i,& vptxmin(ipanel),vptxmax(ipanel),vptymin(ipanel),vptymax(ipanel),& xmin(irenderarr(ipanel)),xmax(irenderarr(ipanel))) endif else !--for global colour bars (ie. on tiled plots) use viewport co-ordinates to set render limits if (double_render) then call adjustcolourbar(iColourBarStyle,vptxi,vptyi,vptx2i,vpty2i,& minval(vptxmin),maxval(vptxmax),minval(vptymin),maxval(vptymax),& xmin(icontourarr(ipanel)),xmax(icontourarr(ipanel))) else call adjustcolourbar(iColourBarStyle,vptxi,vptyi,vptx2i,vpty2i,& minval(vptxmin),maxval(vptxmax),minval(vptymin),maxval(vptymax),& xmin(irenderarr(ipanel)),xmax(irenderarr(ipanel))) endif endif if (double_render) then print*,'setting double-render min, max = ',xmin(icontourarr(ipanel)),xmax(icontourarr(ipanel)) else print*,'setting render min, max = ',xmin(irenderarr(ipanel)),xmax(irenderarr(ipanel)) endif istep = istepnew interactivereplot = .true. iexit = .true. endif else ierr = plot_band(2,1,xpt,ypt,xpt2,ypt2,char2) !call pgrect(xpt,xpt2,ypt,ypt2) call get_vptxy(xpt2,ypt2,vptx2i,vpty2i) !--use centre point of first click and current click to ! better determine panel vptxceni = 0.5*(vptxi + vptx2i) vptyceni = 0.5*(vptyi + vpty2i) ipanel2 = getpanel(vptxceni,vptyceni) if (ipanel2 > 0 .and. ipanel2 /= ipanel) then ipanel = ipanel2 print*,'panel = ',ipanel endif if (ipanel <= 0) cycle interactive_loop call getxy(vptx2i,vpty2i,xpt2,ypt2,ipanel) !--reset first point according to current panel call getxy(vptxi,vptyi,xpti,ypti,ipanel) xptmin = min(xpti,xpt2) xptmax = max(xpti,xpt2) yptmin = min(ypti,ypt2) yptmax = max(ypti,ypt2) select case (char2) case(plot_left_click) ! zoom if another left click xmin(iplotxarr(ipanel)) = xptmin xmax(iplotxarr(ipanel)) = xptmax xmin(iplotyarr(ipanel)) = yptmin xmax(iplotyarr(ipanel)) = yptmax print*,'setting limits: xmin = ',xmin(iplotxarr(ipanel)),' xmax = ',xmax(iplotxarr(ipanel)) istep = istepnew interactivereplot = .true. iexit = .true. case('x') call restrict_range(iplotxarr(ipanel),xptmin,xptmax) istep = istepnew interactivereplot = .true. iexit = .true. case('y') call restrict_range(iplotyarr(ipanel),yptmin,yptmax) istep = istepnew interactivereplot = .true. iexit = .true. case('r') call restrict_range(iplotxarr(ipanel),xptmin,xptmax) call restrict_range(iplotyarr(ipanel),yptmin,yptmax) istep = istepnew interactivereplot = .true. iexit = .true. case('R') call reset_ranges istep = istepnew interactivereplot = .true. iexit = .true. case default print*,' action cancelled' end select endif ! !--zooming ! case('-','_','+','o','C') ! zoom in/out if (ipanel <= 0) cycle interactive_loop xlength = xmax(iplotxarr(ipanel)) - xmin(iplotxarr(ipanel)) ylength = xmax(iplotyarr(ipanel)) - xmin(iplotyarr(ipanel)) xcen = 0.5*(xmax(iplotxarr(ipanel)) + xmin(iplotxarr(ipanel))) ycen = 0.5*(xmax(iplotyarr(ipanel)) + xmin(iplotyarr(ipanel))) if (irenderarr(ipanel) > 0) then renderlength = xmax(irenderarr(ipanel)) - xmin(irenderarr(ipanel)) else renderlength = 0. endif if (icontourarr(ipanel) > 0) then contlength = xmax(icontourarr(ipanel)) - xmin(icontourarr(ipanel)) else contlength = 0. endif select case(char) case('-') xlength = zoomfac*scalefac*xlength ylength = zoomfac*scalefac*ylength renderlength = zoomfac*scalefac*renderlength contlength = zoomfac*scalefac*contlength case('_') xlength = 1.2*zoomfac*scalefac*xlength ylength = 1.2*zoomfac*scalefac*ylength renderlength = 1.2*zoomfac*scalefac*renderlength contlength = 1.2*zoomfac*scalefac*contlength case('+') xlength = xlength/(zoomfac*scalefac) ylength = ylength/(zoomfac*scalefac) renderlength = renderlength/(zoomfac*scalefac) contlength = contlength/(zoomfac*scalefac) case('o') if (is_coord(iplotxarr(ipanel),ndim)) then xcen = xorigin(iplotxarr(ipanel)) else xcen = 0. endif if (is_coord(iplotyarr(ipanel),ndim)) then ycen = xorigin(iplotyarr(ipanel)) else ycen = 0. endif print*,' centreing plot on origin x,y = ',xcen,ycen case('C') xcen = xpti ycen = ypti end select xmaxin = xmax(iplotxarr(ipanel)) if (iamincolourbar .and. irenderarr(ipanel) > 0) then if (double_render) then !--rendering zoom does not allow pan - renderpt is always centre of axis renderpt = 0.5*(xmin(icontourarr(ipanel)) + xmax(icontourarr(ipanel))) xmin(icontourarr(ipanel)) = renderpt - 0.5*contlength xmax(icontourarr(ipanel)) = renderpt + 0.5*contlength call assert_sensible_limits(xmin(icontourarr(ipanel)),xmax(icontourarr(ipanel))) !print*,'zooming on colour bar: min, max = ',xmin(icontourarr(ipanel)),xmax(icontourarr(ipanel)) else !--rendering zoom does not allow pan - renderpt is always centre of axis renderpt = 0.5*(xmin(irenderarr(ipanel)) + xmax(irenderarr(ipanel))) xmin(irenderarr(ipanel)) = renderpt - 0.5*renderlength xmax(irenderarr(ipanel)) = renderpt + 0.5*renderlength call assert_sensible_limits(xmin(irenderarr(ipanel)),xmax(irenderarr(ipanel))) !print*,'zooming on colour bar: min, max = ',xmin(irenderarr(ipanel)),xmax(irenderarr(ipanel)) endif istep = istepnew interactivereplot = .true. iexit = .true. else if (xpti >= xmin(iplotxarr(ipanel)) .and. xpti <= xmax(iplotxarr(ipanel)) .and. ypti <= xmax(iplotyarr(ipanel))) then xmin(iplotxarr(ipanel)) = xcen - 0.5*xlength xmax(iplotxarr(ipanel)) = xcen + 0.5*xlength call assert_sensible_limits(xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel))) !print*,'zooming on x axis: min, max = ',xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel)) istep = istepnew interactivereplot = .true. iexit = .true. endif if (ypti >= xmin(iplotyarr(ipanel)) .and. ypti <= xmax(iplotyarr(ipanel)) .and. xpti <= xmaxin) then xmin(iplotyarr(ipanel)) = ycen - 0.5*ylength xmax(iplotyarr(ipanel)) = ycen + 0.5*ylength call assert_sensible_limits(xmin(iplotyarr(ipanel)),xmax(iplotyarr(ipanel))) !print*,'zooming on y axis: min, max = ',xmin(iplotyarr(ipanel)),xmax(iplotyarr(ipanel)) istep = istepnew interactivereplot = .true. iexit = .true. endif endif case('a') ! adapt plot limits if (iamincolourbar .and. irenderarr(ipanel) > 0) then if (double_render) then !print*,'adapting double-render limits ',xminadapt(icontourarr(ipanel)),xmaxadapt(icontourarr(ipanel)) xmin(icontourarr(ipanel)) = xminadapt(icontourarr(ipanel)) xmax(icontourarr(ipanel)) = xmaxadapt(icontourarr(ipanel)) call assert_sensible_limits(xmin(icontourarr(ipanel)),xmax(icontourarr(ipanel))) else !print*,'adapting render limits ',xminadapt(irenderarr(ipanel)),xmaxadapt(irenderarr(ipanel)) xmax(irenderarr(ipanel)) = xmaxadapt(irenderarr(ipanel)) if (itrans(irenderarr(ipanel))==1 .and. & xminadapt(irenderarr(ipanel)) < xmaxadapt(irenderarr(ipanel))-5.) then ! if logged if (abs(xmin(irenderarr(ipanel))-(xmaxadapt(irenderarr(ipanel)) - 4.)) > epsilon(0.)) then xmin(irenderarr(ipanel)) = xmaxadapt(irenderarr(ipanel)) - 4. print "(a)",' *** MIN SET 4 DEX FROM MAX, PRESS ''a'' AGAIN TO GIVE FULL RANGE ***' else xmin(irenderarr(ipanel)) = xminadapt(irenderarr(ipanel)) endif else xmin(irenderarr(ipanel)) = xminadapt(irenderarr(ipanel)) endif call assert_sensible_limits(xmin(irenderarr(ipanel)),xmax(irenderarr(ipanel))) endif istep = istepnew interactivereplot = .true. iexit = .true. else !--save xmax before we go changing it so can check the y axis xmaxin = xmax(iplotxarr(ipanel)) if (xpti >= xmin(iplotxarr(ipanel)) .and. xpti <= xmax(iplotxarr(ipanel)) & .and. ypti <= xmax(iplotyarr(ipanel))) then print*,'adapting x limits ',xminadapt(iplotxarr(ipanel)),xmaxadapt(iplotxarr(ipanel)) xmin(iplotxarr(ipanel)) = xminadapt(iplotxarr(ipanel)) xmax(iplotxarr(ipanel)) = xmaxadapt(iplotxarr(ipanel)) call assert_sensible_limits(xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel))) istep = istepnew interactivereplot = .true. iexit = .true. endif if (ypti >= xmin(iplotyarr(ipanel)) .and. ypti <= xmax(iplotyarr(ipanel)) & .and. xpti <= xmaxin) then print*,'adapting y limits ',xminadapt(iplotyarr(ipanel)),xmaxadapt(iplotyarr(ipanel)) xmin(iplotyarr(ipanel)) = xminadapt(iplotyarr(ipanel)) xmax(iplotyarr(ipanel)) = xmaxadapt(iplotyarr(ipanel)) call assert_sensible_limits(xmin(iplotyarr(ipanel)),xmax(iplotyarr(ipanel))) istep = istepnew interactivereplot = .true. iexit = .true. endif endif ! !--zoom in/out on vector plots (arrow size) ! case('v') if (ivecarr(ipanel) > 0) then !print*,'decreasing vector arrow size' xmax(ivecarr(ipanel)) = zoomfac*scalefac*xmax(ivecarr(ipanel)) istep = istepnew interactivereplot = .true. iexit = .true. endif case('V') if (ivecarr(ipanel) > 0) then !print*,'increasing vector arrow size' xmax(ivecarr(ipanel)) = xmax(ivecarr(ipanel))/(zoomfac*scalefac) istep = istepnew interactivereplot = .true. iexit = .true. endif case('w','W') if (ivecarr(ipanel) > 0) then !print*,'adapting vector arrow size' xmax(ivecarr(ipanel)) = -1.0 istep = istepnew interactivereplot = .true. iexit = .true. endif ! !--set/unset log axes ! case('l') ! !--change colour bar, y and x itrans between log / not logged ! if (iamincolourbar .and. irenderarr(ipanel) > 0) then if (double_render) then call change_itrans2(icontourarr(ipanel),xmin(icontourarr(ipanel)),xmax(icontourarr(ipanel)),& xminadapt(icontourarr(ipanel)),xmaxadapt(icontourarr(ipanel))) else call change_itrans2(irenderarr(ipanel),xmin(irenderarr(ipanel)),xmax(irenderarr(ipanel)),& xminadapt(irenderarr(ipanel)),xmaxadapt(irenderarr(ipanel))) endif istep = istepnew interactivereplot = .true. iexit = .true. elseif (xpti < xmin(iplotxarr(ipanel))) then if (is_coord(iplotyarr(ipanel),ndim) .and. irenderarr(ipanel) > 0) then print "(a)",'error: cannot log coordinate axes with rendering' else call change_itrans2(iplotyarr(ipanel),xmin(iplotyarr(ipanel)),xmax(iplotyarr(ipanel)),& xminadapt(iplotyarr(ipanel)),xmaxadapt(iplotyarr(ipanel))) istep = istepnew interactivereplot = .true. iexit = .true. endif elseif (ypti < xmin(iplotyarr(ipanel))) then if (is_coord(iplotxarr(ipanel),ndim) .and. irenderarr(ipanel) > 0) then print "(a)",'error: cannot log coordinate axes with rendering' else call change_itrans2(iplotxarr(ipanel),xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel)),& xminadapt(iplotxarr(ipanel)),xmaxadapt(iplotxarr(ipanel))) istep = istepnew interactivereplot = .true. iexit = .true. endif endif ! !--reset all range restrictions ! case('R') call reset_ranges interactivereplot = .true. istep = istepnew iexit = .true. ! !--general plot stuff ! case('G') ! move legend here print*,'setting legend position to current location...' if (ipanel > 0) then call mvlegend(xpti,ypti,xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel)),xmax(iplotyarr(ipanel)),ipanel) istep = istepnew interactivereplot = .true. iexit = .true. endif case('T') ! move title here if (ipanel > 0) then print*,'setting title position to current location...' call mvtitle(xpti,ypti,xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel)),xmax(iplotyarr(ipanel))) istep = istepnew interactivereplot = .true. iexit = .true. endif case('H') ! move vector legend here if (ipanel > 0) then if (ivecarr(ipanel) > 0) then print*,'setting vector plot legend to current location...' call mvlegendvec(xpti,ypti,xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel)),xmax(iplotyarr(ipanel))) istep = istepnew interactivereplot = .true. iexit = .true. endif endif case('m') ! change colour map (next scheme) call change_colourmap(icolourscheme,1) istep = istepnew interactivereplot = .true. iexit = .true. case('M') ! change colour map (previous scheme) call change_colourmap(icolourscheme,-1) istep = istepnew interactivereplot = .true. iexit = .true. case('i') ! invert colour map icolourscheme = -icolourscheme call change_colourmap(icolourscheme,0) istep = istepnew interactivereplot = .true. iexit = .true. case('^') ! add arrow shape call set_panel(ipanel) print*,' adding arrow in panel ',ipanel call add_shape_interactive(xpti,ypti,itrans(iplotxarr(ipanel)),itrans(iplotyarr(ipanel)),ipanel,ierr,shape_type=3) if (ierr==0) then istep = istepnew interactivereplot = .true. iexit = .true. endif case(achar(20)) ! add text shape call set_panel(ipanel) print*,' adding text in panel ',ipanel call add_shape_interactive(xpti,ypti,itrans(iplotxarr(ipanel)),itrans(iplotyarr(ipanel)),ipanel,ierr) if (ierr==0) then istep = istepnew interactivereplot = .true. iexit = .true. endif case(achar(8)) ! delete plot annotation / colour bar (backspace) ishape = inshape(xpti,ypti,itrans(iplotxarr(ipanel)),itrans(iplotxarr(ipanel)),& xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel)),& xmin(iplotyarr(ipanel)),xmax(iplotyarr(ipanel))) if (ishape > 0) then call delete_shape(ishape,nshapes) istep = istepnew interactivereplot = .true. iexit = .true. elseif (iamincolourbar .and. irenderarr(ipanel) > 0) then iColourBarStyle = 0 istep = istepnew interactivereplot = .true. iexit = .true. elseif (xpti < xmin(iplotxarr(ipanel)) .or. xpti > xmax(iplotxarr(ipanel)) & .or. ypti < xmin(iplotyarr(ipanel)) .or. ypti > xmax(iplotyarr(ipanel))) then call deleteaxes() istep = istepnew interactivereplot = .true. iexit = .true. else ilegend = in_legend(xpt,ypt) if (legend_is_plotted(ilegend)) then call delete_legend(ilegend) iadvance = 0 interactivereplot = .true. iexit = .true. else print*,' nothing to delete at x,y =',xpti,',',ypti endif endif ! !--timestepping ! case('q','Q',achar(27),achar(3)) iadvance = -666 print*,'quitting...' iexit = .true. case('X','b','B') ! right click -> go back ! iadvance = -abs(iadvance) istep = istepin - (istepjump)*istepsonpage - iadvance*istepsonpage lastpanel = 0 iexit = .true. case('r') ! replot interactivereplot = .true. istep = istepnew iexit = .true. case(' ','n','N') ! space !iadvance = abs(iadvance) istep = istepin + (istepjump-1)*istepsonpage lastpanel = 0 iexit = .true. case('0','1','2','3','4','5','6','7','8','9') read(char,*,iostat=ierr) istepjumpnew if (ierr /=0) then print*,'*** internal error setting timestep jump' istepjumpnew = 1 endif if ((istepjump > 1 .or. istepjumpset) .and. istepjump <= 9999) then istepjump = 10*istepjump + istepjumpnew if (istepjump > 9999) istepjump = 1 elseif (istepjumpnew==0) then istepjump = 10 else istepjump = istepjumpnew endif istepjump = int(zoomfac*istepjump) print*,' setting timestep jump / zoom factor = ',istepjump istepjumpset = .true. scalefac = istepjump case(')') istepjump = int(zoomfac*10) print*,' setting timestep jump = ',istepjump ! !--multiply everything by a factor of 10 ! case('z','Z') zoomfac = 10.*zoomfac if (zoomfac > 1000000.) then zoomfac = 1.0 endif print*,' LIMITS/TIMESTEPPING CHANGES NOW x ',zoomfac ! !--unknown ! case default print*,' x, y = ',xpti,ypti,'; unknown option "',trim(char),'" ',iachar(char) end select ! !--save cursor position relative to the viewport ! call get_vptxy(xpt,ypt,xcursor,ycursor) call reset_panel ! !--do not let timestep go outside of bounds ! if we are at the first/last step, just print message and do nothing ! if iadvance trips over the bounds, jump to last/first step ! if (iadvance /= -666 .and. iexit) then if (istep + iadvance > ilaststep .and. iframe==nframes) then print "(1x,a)",'reached last timestep' if (istepin /= ilaststep) then istep = ilaststep - istepsonpage*iadvance else istep = istepin iexit = .false. endif elseif (istep + iadvance < 1 .and. ifirstframeonpage==1) then print "(1x,a)",'reached first timestep: can''t go back' if (ifirststeponpage /= 1) then istep = 1 - iadvance else istep = istepin iexit = .false. endif endif endif enddo interactive_loop return contains !-------- ! utility to return which panel we are in given a point on the viewport ! and the viewport limits for each panel. !-------- integer function getpanel(vptx,vpty) real, intent(in) :: vptx,vpty real :: vptxmini,vptxmaxi,vptymini,vptymaxi integer :: i,icol getpanel = 0 ! ! first try the basic procedure of checking if the ! cursor falls within the viewport of a particular panel ! do i=1,size(vptxmin) if (vptx > vptxmin(i) .and. vptx < vptxmax(i) .and. & vpty > vptymin(i) .and. vpty < vptymax(i)) getpanel = i enddo ! ! if this fails, use more generous limits around the margins ! icol = 0 if (getpanel==0) then do i=1,size(vptxmin) icol = icol + 1 if (icol > nacross) icol = 1 if (icol > 1 .and. i > 1) then ! if column>1 assign panel by being to the right of previous panel vptxmini = vptxmax(i-1)+barwmulti(i-1) else vptxmini = -0.1 ! allow for some error endif !--if last column extend xmax to right of page if (icol==nacross) then vptxmaxi = 1.1 elseif (verticalbar) then ! otherwise use max of current panel + space containing the colour bar vptxmaxi = vptxmax(i) + barwmulti(i) else vptxmaxi = vptxmax(i) endif !--if first row extend ymax to top of page if (i <= nacross) then vptymaxi = 1.1 else vptymaxi = vptymax(i) endif !--if last row then allow ymin to extend to bottom of page if (i > (size(vptxmin)-nacross)) then vptymini = -0.1 ! if not last row assign panel by being above row below elseif (i+nacross <= size(vptxmin)) then vptymini = vptymax(i+nacross) elseif (.not.verticalbar) then vptymini = vptymin(i) - barwmulti(i) else vptymini = vptymin(i) endif if (vptx > vptxmini .and. vptx < vptxmaxi .and. & vpty > vptymini .and. vpty < vptymaxi) then !print*,'matching panel ',i,vptx,vpty,vptxmini,vptxmaxi,vptymini,vptymaxi !if (getpanel /= 0) print*,'Warning: multiple matching panels found ',getpanel,i,vptx,vpty getpanel = i endif enddo endif ! ! if we still fail, just take the last panel ! if (getpanel <= 0 .or. getpanel > size(vptxmin)) then !print*,' vptx,y = ',vptx,vpty,vptxmin(:),vptxmax(:) !print*,'Error determining panel: assuming last ' getpanel = size(vptxmin) endif end function getpanel !-------- ! utility to return x,y coordinates in a given panel given viewport coords !-------- subroutine getxy(vptx,vpty,x,y,ipanel) real, intent(in) :: vptx,vpty real, intent(out) :: x,y integer, intent(in) :: ipanel if (ipanel > 0) then x = xmin(iplotxarr(ipanel)) + (vptx-vptxmin(ipanel))/(vptxmax(ipanel)-vptxmin(ipanel)) & *(xmax(iplotxarr(ipanel))-xmin(iplotxarr(ipanel))) y = xmin(iplotyarr(ipanel)) + (vpty-vptymin(ipanel))/(vptymax(ipanel)-vptymin(ipanel)) & *(xmax(iplotyarr(ipanel))-xmin(iplotyarr(ipanel))) else x = 0. y = 0. endif return end subroutine getxy !--- ! utility which translates between world co-ordinates (x,y) ! and viewport co-ordinates (relative to the whole viewport) !--- !subroutine get_vptxy(x,y,vptx,vpty,ipanel) ! implicit none ! real, intent(in) :: x,y ! real, intent(out) :: vptx,vpty ! integer, intent(in) :: ipanel ! ! if (ipanel > 0) then ! vptx = vptxmin(ipanel) + (x-xmin(iplotxarr(ipanel)))/& ! (xmax(iplotxarr(ipanel))-xmin(iplotxarr(ipanel)))*(vptxmax(ipanel)-vptxmini(ipanel)) ! vpty = vptymin(ipanel) + (y-xmin(iplotyarr(ipanel)))/&(xmax(iplotyarr(ipanel))-xmin(iplotyarr(ipanel)))*(vptymax(ipanel)-vptymini(ipanel)) ! else ! vptx = 0.5 ! vpty = 0.5 ! endif ! !end subroutine get_vptxy !-------- ! utility to reset the drawing surface so we can draw in a panel !-------- subroutine set_panel(ipanel) use plotlib, only:plot_svp,plot_swin integer, intent(in) :: ipanel if (ipanel > 0) then call plot_swin(xmin(iplotxarr(ipanel)),xmax(iplotxarr(ipanel)),xmin(iplotyarr(ipanel)),xmax(iplotyarr(ipanel))) !--really should save viewport setting here, but doesn't matter ! so long as interactive mode is the last thing called call plot_svp(vptxmin(ipanel),vptxmax(ipanel),vptymin(ipanel),vptymax(ipanel)) endif return end subroutine set_panel subroutine reset_panel use plotlib, only:plot_swin call plot_swin(xmini,xmaxi,ymini,ymaxi) end subroutine reset_panel end subroutine interactive_multi !-------------------------------------------------------------------- ! utilities to determine whether a point is in or out of a selection !-------------------------------------------------------------------- logical function inslice(x,xmin,xmax) real, intent(in) :: x,xmin,xmax inslice = (x >= xmin .and. x <= xmax) end function inslice logical function inrectangle(x,y,xmin,xmax,ymin,ymax) real, intent(in) :: x,y,xmin,xmax,ymin,ymax inrectangle = (x >= xmin .and. x <= xmax .and. y >= ymin .and. y <= ymax) end function inrectangle logical function incircle(x,y,r2) real, intent(in) :: x,y,r2 incircle = ((x*x + y*y) <= r2) end function incircle ! ! Point in polygon ! See: http://en.wikipedia.org/wiki/Even-odd_rule ! logical function inpoly(x,y,xpts,ypts,npts) real, intent(in) :: x,y real, dimension(:), intent(in) :: xpts,ypts integer, intent(in) :: npts integer :: i,j inpoly = .false. j = npts do i=1,npts if (((ypts(i) > y) .neqv. (ypts(j) > y)) .and. & (x < (xpts(j) - xpts(i))*(y-ypts(i))/(ypts(j) - ypts(i)) + xpts(i))) then inpoly = .not. inpoly endif j = i enddo end function inpoly !------------------------------------------------------------ ! utility which adapts plot limits based only on the ! particles being plotted !------------------------------------------------------------ subroutine adapt_limits_interactive(labeli,np,xarr,xmin,xmax,icolourpart,iamtype,iusetype) use params, only:int1 use limits, only:assert_sensible_limits character(len=*), intent(in) :: labeli integer, intent(in) :: np real, dimension(np), intent(in) :: xarr real, intent(out) :: xmin,xmax integer(kind=int1), dimension(:) , intent(in) :: iamtype integer, dimension(np), intent(in) :: icolourpart logical, dimension(:), intent(in) :: iusetype integer :: itype,i logical :: mixedtypes xmin = huge(xmin) xmax = -huge(xmax) mixedtypes = size(iamtype) >= np if (mixedtypes) then do i=1,np itype = int(iamtype(i)) if (itype > 0 .and. itype <= np) then if (iusetype(itype) .and. icolourpart(i) > 0) then xmin = min(xmin,xarr(i)) xmax = max(xmax,xarr(i)) endif endif enddo else xmin = minval(xarr,mask=(icolourpart >= 0)) xmax = maxval(xarr,mask=(icolourpart >= 0)) endif call assert_sensible_limits(xmin,xmax) !print "(1x,a)",' resetting '//trim(labeli)//' limits' end subroutine adapt_limits_interactive !------------------------------------------------------------ ! utility which translates between world co-ordinates (x,y) ! and viewport co-ordinates (relative to the whole viewport) !------------------------------------------------------------ subroutine get_vptxy(x,y,vptx,vpty) use plotlib, only:plot_qvp,plot_qwin real, intent(in) :: x,y real, intent(out) :: vptx,vpty real :: xmini,xmaxi,ymini,ymaxi real :: vptxmini,vptxmaxi,vptymini,vptymaxi call plot_qvp(0,vptxmini,vptxmaxi,vptymini,vptymaxi) call plot_qwin(xmini,xmaxi,ymini,ymaxi) vptx = vptxmini + (x-xmini)/(xmaxi-xmini)*(vptxmaxi-vptxmini) vpty = vptymini + (y-ymini)/(ymaxi-ymini)*(vptymaxi-vptymini) end subroutine get_vptxy !------------------------------------------------------------ ! utility to return x,y coordinates given viewport coords ! (only works for single-panelled plots) !------------------------------------------------------------ subroutine get_posxy(vptx,vpty,x,y,xmini,xmaxi,ymini,ymaxi) use plotlib, only:plot_qvp real, intent(in) :: vptx,vpty real, intent(out) :: x,y real, intent(in) :: xmini,xmaxi,ymini,ymaxi real :: vptxmini,vptxmaxi,vptymini,vptymaxi call plot_qvp(0,vptxmini,vptxmaxi,vptymini,vptymaxi) x = xmini + (vptx-vptxmini)/(vptxmaxi-vptxmini)*(xmaxi-xmini) y = ymini + (vpty-vptymini)/(vptymaxi-vptymini)*(ymaxi-ymini) return end subroutine get_posxy !----------------------------------------------------------- ! These subroutines interface to the actual plot settings !----------------------------------------------------------- ! !--plot a label showing the particle ID on the plot ! subroutine plot_number(i,xi,yi) use plotlib, only:plot_numb,plot_qch,plot_sch,plot_text integer, intent(in) :: i real, intent(in) :: xi,yi integer :: nc real :: charheight character(len=20) :: string !--convert number to text string call plot_numb(i,0,1,string,nc) !--query and store character height call plot_qch(charheight) !--change character height call plot_sch(2.0) !--plot text string call plot_text(xi,yi,string(1:nc)) !--reset character height call plot_sch(charheight) return end subroutine plot_number subroutine deleteaxes() use settings_page, only:iaxis,iPlotLegend,& !iPlotStepLegend, & iPlotTitles,iPlotScale use settings_vecplot, only:iVecplotLegend if (iaxis==-2) then ! !-- would be better to do this properly by ! determining whether or not the cursor is over ! the legend, shape, title or whatever annotation the user ! wishes to be deleted. Instead at the moment we just ! delete the legends once the axes are already gone, and ! then in a somewhat arbitrary order. ! iVecplotLegend = .false. if (iPlotLegend) then iPlotLegend = .false. elseif (iPlotTitles) then iPlotTitles = .false. elseif (iPlotScale) then iPlotScale = .false. endif elseif (iaxis <= 2 .and. iaxis > -2) then iaxis = iaxis - 1 elseif (iaxis > 2) then iaxis = -1 elseif (iaxis < -2) then iaxis = -2 endif end subroutine deleteaxes ! !--delete specific legends ! subroutine delete_legend(id) use legends, only:ilegend,ilegend_vec,ilegend_markers,ilegend_scale use settings_page, only:iPlotLegend,iPlotStepLegend,iPlotScale use settings_vecplot, only:iVecplotLegend integer, intent(in) :: id select case(id) case(ilegend_scale) if (iPlotScale) print*,'> deleting scale bar' iPlotScale = .false. case(ilegend_markers) if (iPlotStepLegend) print*,'> deleting marker legend' iPlotStepLegend = .false. case(ilegend_vec) if (iVecplotLegend) print*,'> deleting vector legend' iVecplotLegend = .false. case(ilegend) if (iPlotLegend) print*,'> deleting legend' iPlotLegend = .false. end select end subroutine delete_legend ! !--check if legend is actually being plotted ! logical function legend_is_plotted(id) use legends, only:ilegend,ilegend_vec,ilegend_markers,ilegend_scale use settings_page, only:iPlotLegend,iPlotStepLegend,iPlotScale use settings_vecplot, only:iVecplotLegend integer, intent(in) :: id legend_is_plotted = .false. select case(id) case(ilegend_scale) legend_is_plotted = iPlotScale case(ilegend_markers) legend_is_plotted = iPlotStepLegend case(ilegend_vec) legend_is_plotted = iVecplotLegend case(ilegend) legend_is_plotted = iPlotLegend end select end function legend_is_plotted ! !--move the legend to the current position ! subroutine mvlegend(xi,yi,xmin,xmax,ymax,ipanel) use settings_page, only:hposlegend,vposlegend,fjustlegend,iPlotLegend,iPlotLegendOnlyOnPanel use plotlib, only:plot_qcs real, intent(in) :: xi,yi,xmin,xmax,ymax integer, intent(in), optional :: ipanel real :: xch,ych iPlotLegend = .true. hposlegend = (xi - xmin)/(xmax-xmin) !--query character height in world coordinates call plot_qcs(4,xch,ych) vposlegend = (ymax - yi)/ych ! !--automatically change justification ! if (hposlegend < 0.25) then fjustlegend = 0.0 ! elseif (hposlegend > 0.75) then ! fjustlegend = 1.0 ! else ! fjustlegend = 0.5 ! endif if (present(ipanel)) then if (ipanel > 0 .and. iPlotLegendOnlyOnPanel > 0) iPlotLegendOnlyOnPanel = ipanel endif print*,'hpos = ',hposlegend,' vpos = ',vposlegend,' just = ',fjustlegend end subroutine mvlegend ! !--move the vector legend to the current position ! subroutine mvlegendvec(xi,yi,xmin,xmax,ymax) use settings_vecplot, only:hposlegendvec,vposlegendvec,iVecplotLegend use plotlib, only:plot_qcs real, intent(in) :: xi,yi,xmin,xmax,ymax real :: xch,ych iVecplotLegend = .true. hposlegendvec = (xi - xmin)/(xmax-xmin) !--query character height in world coordinates call plot_qcs(4,xch,ych) vposlegendvec = (ymax - yi)/ych print*,'hpos = ',hposlegendvec,' vpos = ',vposlegendvec end subroutine mvlegendvec ! !--move the title to the current position ! subroutine mvtitle(xi,yi,xmin,xmax,ymax) use settings_page, only:hpostitle,vpostitle,fjusttitle,iPlotTitles use plotlib, only:plot_qcs real, intent(in) :: xi,yi,xmin,xmax,ymax real :: xch,ych iPlotTitles = .true. hpostitle = (xi - xmin)/(xmax-xmin) !--query character height in world coordinates call plot_qcs(4,xch,ych) vpostitle = (yi - ymax)/ych !--automatically change justification if (hpostitle < 0.25) then fjusttitle = 0.0 elseif (hpostitle > 0.75) then fjusttitle = 1.0 else fjusttitle = 0.5 endif print*,'hpos = ',hpostitle,' vpos = ',vpostitle,' just = ',fjusttitle return end subroutine mvtitle ! !--saves current plot limits ! subroutine save_limits(iplot,xmin,xmax,setlim2) use labels, only:irhodust_start,irhodust_end integer, intent(in) :: iplot real, intent(in) :: xmin,xmax logical, intent(in), optional :: setlim2 real :: xmintemp,xmaxtemp integer :: i if (iplot > 0 .and. iplot >= irhodust_start .and. iplot <= irhodust_end) then ! !--if we save the limits for one dust density, apply to whole grid ! do i=irhodust_start,irhodust_end xmintemp = xmin xmaxtemp = xmax if (present(setlim2)) then call save_limits_i(i,xmintemp,xmaxtemp,setlim2) else call save_limits_i(i,xmintemp,xmaxtemp) endif enddo print*,'> applying saved limits to all dust species <' else ! !--otherwise just pass options through to save_limits_i ! if (present(setlim2)) then call save_limits_i(iplot,xmin,xmax,setlim2) else call save_limits_i(iplot,xmin,xmax) endif endif end subroutine save_limits ! !--save plot limits for one column ! subroutine save_limits_i(iplot,xmin,xmax,setlim2) use limits, only:lim,lim2 use labels, only:is_coord use multiplot, only:itrans use settings_data, only:ndim use settings_limits, only:iadapt,iadaptcoords use transforms, only:transform_limits_inverse integer, intent(in) :: iplot real, intent(in) :: xmin,xmax logical, intent(in), optional :: setlim2 logical :: uselim2 real :: xmintemp,xmaxtemp uselim2 = .false. if (present(setlim2)) uselim2 = setlim2 if (itrans(iplot) /= 0) then xmintemp = xmin xmaxtemp = xmax call transform_limits_inverse(xmintemp,xmaxtemp,itrans(iplot)) if (uselim2) then lim2(iplot,1) = xmintemp lim2(iplot,2) = xmaxtemp else lim(iplot,1) = xmintemp lim(iplot,2) = xmaxtemp endif else if (uselim2) then lim2(iplot,1) = xmin lim2(iplot,2) = xmax else lim(iplot,1) = xmin lim(iplot,2) = xmax endif endif ! !--change appropriate plot limits to fixed (not adaptive) ! if (is_coord(iplot,ndim)) then iadaptcoords = .false. else iadapt = .false. endif return end subroutine save_limits_i ! !--implements parameter range restriction ! subroutine restrict_range(iplot,xmin,xmax) use limits, only:range use multiplot, only:itrans use transforms, only:transform_limits_inverse integer, intent(in) :: iplot real, intent(in) :: xmin,xmax real :: xmintemp,xmaxtemp if (itrans(iplot) /= 0) then xmintemp = xmin xmaxtemp = xmax call transform_limits_inverse(xmintemp,xmaxtemp,itrans(iplot)) range(iplot,1) = xmintemp range(iplot,2) = xmaxtemp else range(iplot,1) = xmin range(iplot,2) = xmax endif return end subroutine restrict_range ! !--interface to routine which removes all parameter range restrictions ! subroutine reset_ranges() use limits, only:reset_all_ranges call reset_all_ranges() return end subroutine reset_ranges ! !--interface to routine which resets second set of limits ! subroutine reset_limits2(icol) use limits, only:reset_lim2 integer, intent(in) :: icol call reset_lim2(icol) return end subroutine reset_limits2 ! !--saves current plot limits for particle tracking ! subroutine save_limits_track(iplot,xmin,xmax,xi) use multiplot, only:itrans use settings_data, only:ndim use settings_limits, only:xminoffset_track,xmaxoffset_track use transforms, only:transform_limits_inverse integer, intent(in) :: iplot real, intent(in) :: xmin,xmax,xi real :: xmintemp,xmaxtemp if (iplot > ndim) then print*,'ERROR in save_limits_track: iplot>ndim' return elseif (itrans(iplot) /= 0) then xmintemp = xmin xmaxtemp = xmax call transform_limits_inverse(xmintemp,xmaxtemp,itrans(iplot)) xminoffset_track(iplot) = xi - xmintemp xmaxoffset_track(iplot) = xmaxtemp - xi else xminoffset_track(iplot) = abs(xi - xmin) xmaxoffset_track(iplot) = abs(xmax - xi) endif end subroutine save_limits_track ! !--recalculates radius ! subroutine save_itrackpart_recalcradius(itrackpart) use filenames, only:nsteps,nstepsinfile,ifileopen use settings_data, only:ncalc,DataIsBuffered,iCalcQuantities,track_string use calcquantities, only:calc_quantities,calc_quantities_use_x0 use part_utils, only:is_trackstring integer, intent(in) :: itrackpart if (is_trackstring(track_string)) then return ! do not overwrite strings like "maxdens" else write(track_string,"(i12)") itrackpart endif if (iCalcQuantities .and. itrackpart > 0) then if (ncalc > 0 .and. calc_quantities_use_x0()) then print "(a)",' Recalculating radius relative to tracked particle' if (DataIsBuffered) then call calc_quantities(1,nsteps) else call calc_quantities(1,nstepsinfile(ifileopen)) endif endif endif end subroutine save_itrackpart_recalcradius ! !--toggles log/unlog ! note this only changes a pure log transform: will not change combinations ! subroutine change_itrans(iplot,xmin,xmax) use multiplot, only:itrans use settings_data, only:numplot use transforms, only:transform_limits,transform_limits_inverse use labels, only:irhodust_start,irhodust_end integer, intent(in) :: iplot real, intent(inout) :: xmin, xmax if (iplot <= numplot) then if (itrans(iplot)==1) then itrans(iplot) = 0 !!--untransform the plot limits call transform_limits_inverse(xmin,xmax,1) else itrans(iplot) = 1 !!--transform the plot limits call transform_limits(xmin,xmax,itrans(iplot)) xmin = max(xmax-4.,xmin) ! no more than 4 dex by default endif endif if (iplot > 0 .and. iplot >= irhodust_start .and. iplot <= irhodust_end) then print*,'>> applying transform to all dust densities <<' itrans(irhodust_start:irhodust_end) = itrans(iplot) endif end subroutine change_itrans subroutine change_itrans2(iplot,xmin,xmax,xmina,xmaxa) use multiplot, only:itrans use settings_data, only:numplot use transforms, only:transform_limits,transform_limits_inverse integer, intent(in) :: iplot real, intent(inout) :: xmin, xmax, xmina, xmaxa if (iplot <= numplot) then if (itrans(iplot)==1) then itrans(iplot) = 0 !!--untransform the plot limits call transform_limits_inverse(xmin,xmax,1) call transform_limits_inverse(xmina,xmaxa,1) else itrans(iplot) = 1 !!--transform the plot limits call transform_limits(xmin,xmax,itrans(iplot)) call transform_limits(xmina,xmaxa,itrans(iplot)) xmin = max(xmax-4.,xmin) ! no more than 4 dex by default endif endif end subroutine change_itrans2 ! !--saves rotation options ! subroutine save_rotation(ndim,anglexi,angleyi,anglezi) use settings_xsecrot, only:anglex,angley,anglez integer, intent(in) :: ndim real, intent(in) :: anglexi,angleyi,anglezi anglez = anglezi if (ndim >= 3) then anglex = anglexi angley = angleyi endif return end subroutine save_rotation ! !--saves cross section position ! subroutine save_xsecpos(xsecpos,xsec) use settings_xsecrot, only:xsecpos_nomulti,xsec_nomulti real, intent(in) :: xsecpos logical, intent(in) :: xsec xsecpos_nomulti = xsecpos xsec_nomulti = xsec return end subroutine save_xsecpos ! !--saves 3D perspective ! subroutine save_perspective(zpos,dz) use settings_xsecrot, only:zobserver,dzscreenfromobserver real, intent(in) :: zpos,dz zobserver = zpos dzscreenfromobserver = dz return end subroutine save_perspective ! !--saves 3D opacity ! subroutine save_opacity(rkappai) use settings_xsecrot, only:taupartdepth real, intent(in) :: rkappai taupartdepth = rkappai return end subroutine save_opacity ! !--save the current paper size ! subroutine save_windowsize() use settings_page, only:ipapersize,ipapersizeunits,papersizex,aspectratio use plotlib, only:plot_qvsz real :: x1,x2,y1,y2,papersizey call plot_qvsz(0,x1,x2,y1,y2) if (abs(x2-x1 - 800.) > 0. .and. abs(y2-y1 - 600.) > 0.) then !print*,' saving paper size = ',x2-x1,' x ',y2-y1 ipapersize = 24 ! custom ipapersizeunits = 0 papersizex = x2-x1 papersizey = y2-y1 aspectratio = papersizey/papersizex endif end subroutine save_windowsize ! !--saves circles of interaction ! subroutine save_circles(ncircpartset,icircpartset) use settings_part, only:ncircpart,icircpart integer, intent(in) :: ncircpartset integer, intent(in), dimension(:) :: icircpartset integer :: imax imax = min(size(icircpartset),size(icircpart),ncircpartset) ncircpart = imax icircpart(1:imax) = icircpartset(1:imax) print*,'saving ',imax,' circles of interaction only' end subroutine save_circles ! !--change colour map ! subroutine change_colourmap(imap,istep) use colours, only:colour_set,ncolourschemes,icustom integer, intent(inout) :: imap integer, intent(in) :: istep imap = imap + istep if (abs(imap) > ncolourschemes .and. abs(imap) /= icustom) imap = 1 if (abs(imap) < 1) imap = ncolourschemes call colour_set(imap) end subroutine change_colourmap ! !--set movie mode ! subroutine set_movie_mode(live) use settings_page, only:iaxis,papersizex,aspectratio,ipapersize,ipapersizeunits,iPageColours use settings_limits, only:adjustlimitstodevice use settings_render, only:iColourBarStyle use pagecolours, only:set_pagecolours use plotlib, only:plotlib_is_pgplot,plot_pap use colourbar, only:set_floating_bar_style use system_utils, only:get_copyright use shapes, only:add_text logical, intent(in) :: live iaxis = -2 iPageColours = 2 if (.not.plotlib_is_pgplot) then ipapersize = 9 ipapersizeunits = 0 papersizex = 1280. aspectratio = 0.5625 if (live) call plot_pap(papersizex,aspectratio,ipapersizeunits) iColourBarStyle = 8 call set_floating_bar_style(iColourBarStyle,4) if (live) call set_pagecolours(iPageColours) adjustlimitstodevice = .true. endif call add_text(0.025,0.05,get_copyright()) end subroutine set_movie_mode ! !--unset movie mode ! subroutine unset_movie_mode() use settings_page, only:iaxis,papersizex,aspectratio,ipapersize,iPageColours use settings_limits, only:adjustlimitstodevice use settings_render, only:iColourBarStyle use pagecolours, only:set_pagecolours use plotlib, only:plotlib_is_pgplot,plot_pap use system_utils, only:get_copyright use shapes, only:delete_text iaxis = 0 iPageColours = 1 if (.not.plotlib_is_pgplot) then ipapersize = 0 papersizex = 800. aspectratio = 600./800. iColourBarStyle = 1 call plot_pap(papersizex,aspectratio,0) call set_pagecolours(iPageColours) adjustlimitstodevice = .true. endif call delete_text(get_copyright()) end subroutine unset_movie_mode end module interactive_routines danieljprice-splash-4d1f09c/src/interpolate1D.f90000066400000000000000000000125101477365367100217130ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module containing all of the routines required for 1D interpolation ! !---------------------------------------------------------------------- module interpolations1D implicit none public :: interpolate1D contains !-------------------------------------------------------------------------- ! subroutine to interpolate from particle data to even 1D grid of pixels ! ! The data is smoothed using the SPH summation interpolant, ! that is, we compute the smoothed array according to ! ! datsmooth(pixel) = sum_j w_j W(r-r_j, h_j) ! ! where _j is the quantity at the neighbouring particle j and ! W is the smoothing kernel, for which we use the usual cubic spline. ! For an SPH interpolation the weight for each particle should be ! the dimensionless quantity ! ! w_j = m_j / (rho_j * h_j**ndim) ! ! Other weights can be used (e.g. constants), but in this case the ! normalisation option should also be set. ! ! Input: particle coordinates : x (npart) ! smoothing lengths : hh (npart) ! interpolation weights : weight (npart) ! scalar data to smooth : dat (npart) ! ! number of pixels in x : npixx ! pixel width : pixwidth ! option to normalise interpolation : normalise (.true. or .false.) ! ! Output: smoothed data : datsmooth (npixx) ! ! Written by Daniel Price 2003-2006 !-------------------------------------------------------------------------- subroutine interpolate1D(x,hh,weight,dat,itype,npart, & xmin,datsmooth,npixx,pixwidth,normalise,iverbose) use kernels, only:cnormk1D,radkernel,wfunc,select_kernel integer, intent(in) :: npart,npixx real, intent(in), dimension(npart) :: x,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,pixwidth real, intent(out), dimension(npixx) :: datsmooth logical, intent(in) :: normalise integer, intent(in) :: iverbose real, dimension(npixx) :: datnorm integer :: i,ipix,ipixmin,ipixmax,i1,i2 real :: hi,hi1,radkern,q2,wab,const real :: term,termnorm,dx,xpix datsmooth = 0. term = 0. if (iverbose > 0) then if (normalise) then print*,'interpolating (normalised) from particles to 1D grid: npix,xmin,max=',npixx,xmin,xmin+npixx*pixwidth else print*,'interpolating (non-normalised) from particles to 1D grid: npix,xmin,max=',npixx,xmin,xmin+npixx*pixwidth endif endif if (abs(pixwidth) <= tiny(0.)) then if (iverbose >= 0) print*,'interpolate1D: error: pixel width = 0' return endif if (any(hh(1:npart) <= tiny(hh))) then if (iverbose > 0) print*,'interpolate1D: warning: ignoring some or all particles with h < 0' endif if (.not.associated(wfunc)) call select_kernel(0) const = cnormk1D ! normalisation constant ! !--loop over particles ! over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0) cycle over_parts ! !--skip particles with zero weights ! termnorm = const*weight(i) if (termnorm <= 0.) cycle over_parts ! !--skip particles with wrong h's ! hi = hh(i) if (hi <= tiny(hi)) cycle over_parts ! !--set kernel related quantities ! hi1 = 1./hi radkern = radkernel*hi ! radius of the smoothing kernel term = termnorm*dat(i) ! !--for each particle work out which pixels it contributes to ! i1 = int((x(i) - radkern - xmin)/pixwidth) i2 = int((x(i) + radkern - xmin)/pixwidth) + 1 ipixmin = i1 ipixmax = i2 if (i1 > i2) then ipixmax = i1 ipixmin = i2 endif if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (ipixmax > npixx) ipixmax = npixx ! to pixels in the image ! !--loop over pixels, adding the contribution from this particle ! do ipix = ipixmin,ipixmax xpix = xmin + (ipix-0.5)*pixwidth dx = xpix - x(i) q2 = dx*dx*hi1*hi1 ! !--SPH kernel - standard cubic spline ! wab = wfunc(q2) ! !--calculate data value at this pixel using the summation interpolant ! datsmooth(ipix) = datsmooth(ipix) + term*wab if (normalise) datnorm(ipix) = datnorm(ipix) + termnorm*wab enddo enddo over_parts ! !--normalise dat array ! if (normalise) then where (datnorm > 0.) datsmooth = datsmooth/datnorm end where endif end subroutine interpolate1D end module interpolations1D danieljprice-splash-4d1f09c/src/interpolate2D.f90000066400000000000000000001115161477365367100217220ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module containing all of the routines required for 2D interpolation ! !---------------------------------------------------------------------- module interpolations2D use kernels, only:radkernel2,radkernel,cnormk2D,wfunc,pint,select_kernel,soft_func use timing, only:wall_time,print_time use interpolation, only:iroll implicit none public :: interpolate2D, interpolate2D_xsec, interpolate2D_vec public :: interpolate_part, interpolate_part1 public :: interpolate2D_pixels, interpolate2D_fromgrid private contains !-------------------------------------------------------------------------- ! subroutine to interpolate from particle data to even grid of pixels ! ! The data is smoothed using the SPH summation interpolant, ! that is, we compute the smoothed array according to ! ! datsmooth(pixel) = sum_j w_j dat_j W(r-r_j, h_j) ! ! where _j is the quantity at the neighbouring particle j and ! W is the smoothing kernel, for which we use the usual cubic spline. ! For an SPH interpolation the weight for each particle should be ! the dimensionless quantity ! ! w_j = m_j / (rho_j * h_j**ndim) ! ! Other weights can be used (e.g. constants), but in this case the ! normalisation option should also be set. ! ! Input: particle coordinates : x,y (npart) ! smoothing lengths : hh (npart) ! interpolation weights : weight (npart) ! scalar data to smooth : dat (npart) ! ! number of pixels in x,y : npixx,npixy ! pixel width : pixwidth ! option to normalise interpolation : normalise (.true. or .false.) ! ! Output: smoothed data : datsmooth (npixx,npixy) ! ! Written by Daniel Price 2003-2020 ! Exact rendering implemented by Maya Petkova and Daniel Price 2018 !-------------------------------------------------------------------------- subroutine interpolate2D(x,y,hh,weight,dat,itype,npart, & xmin,ymin,datsmooth,npixx,npixy,pixwidthx,pixwidthy,& normalise,exact,periodicx,periodicy,iverbose) integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy real, intent(out), dimension(npixx,npixy) :: datsmooth logical, intent(in) :: normalise,exact,periodicx,periodicy integer, intent(in) :: iverbose real, dimension(npixx,npixy) :: datnorm integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax integer :: ipixi,jpixi real :: hi,hi1,radkern,q2,wab,const real :: term,termnorm,dx,dy,dy2,xpix,ypix,hi21 real :: t_start,t_end,t_used,xmini,ymini,denom,datnorm_min real, dimension(npixx) :: dx2i ! Maya real :: pixint,d1,d2,r0 call wall_time(t_start) if (.not.associated(wfunc)) call select_kernel(0) datsmooth = 0. datnorm = 0. if (iverbose > 0) then if (exact) then print "(1x,a)",'interpolating from particles to 2D grid (exact)...' elseif (normalise) then print "(1x,a)",'interpolating from particles to 2D grid (normalised)...' else print "(1x,a)",'interpolating from particles to 2D grid (non-normalised)...' endif endif if (abs(pixwidthx) < tiny(0.) .or. abs(pixwidthy) < tiny(0.)) then print "(1x,a)",'interpolate2D: error: pixel size = 0' return endif ! allow for negative pixel widths (just flips image) xmini = min(xmin,xmin + npixy*pixwidthy) ymini = min(ymin,ymin + npixy*pixwidthx) if (any(hh(1:npart) <= tiny(hh)) .and. iverbose >= 0) then print*,'interpolate2D: warning: ignoring some or all particles with h < 0' endif const = cnormk2D ! normalisation constant ! !--loop over particles ! !$omp parallel do default(none) & !$omp shared(hh,x,y,weight,dat,datsmooth,datnorm,itype,npart) & !$omp shared(xmini,ymini,normalise,exact,radkernel,const) & !$omp shared(pixwidthx,pixwidthy,periodicx,periodicy,npixx,npixy) & !$omp private(hi,radkern,wab) & !$omp private(hi1,hi21,term,termnorm,jpixi,ipixi) & !$omp private(ipixmin,ipixmax,jpixmin,jpixmax,denom) & !$omp private(q2,xpix,ypix,dx,dy,dx2i,dy2,r0,d1,d2,pixint) & !$omp private(i,ipix,jpix) & !$omp schedule (guided, 10) over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0) cycle over_parts ! !--skip particles with zero weights ! termnorm = const*weight(i) if (termnorm <= 0.) cycle over_parts ! !--skip particles with wrong h's ! hi = hh(i) if (hi <= tiny(hi)) cycle over_parts ! !--set kernel related quantities ! hi1 = 1./hi hi21 = hi1*hi1 radkern = radkernel*hi ! radius of the smoothing kernel term = termnorm*dat(i) denom = 1./abs(pixwidthx*pixwidthy)/const*hi**2 ! !--for each particle work out which pixels it contributes to ! ipixmin = int((x(i) - radkern - xmini)/abs(pixwidthx)) jpixmin = int((y(i) - radkern - ymini)/abs(pixwidthy)) ipixmax = int((x(i) + radkern - xmini)/abs(pixwidthx)) + 1 jpixmax = int((y(i) + radkern - ymini)/abs(pixwidthy)) + 1 ipixmin = min(ipixmin,ipixmax) ipixmax = max(ipixmin,ipixmax) jpixmin = min(jpixmin,jpixmax) jpixmax = max(jpixmin,jpixmax) if (.not.periodicx) then if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (ipixmax > npixx) ipixmax = npixx ! to pixels in the image endif if (.not.periodicy) then if (jpixmin < 1) jpixmin = 1 if (jpixmax > npixy) jpixmax = npixy endif if (exact .and. ipixmax-ipixmin < 5) then ! !--loop over pixels boundaries, adding the contribution from this particle ! !--first pixel row ! if (jpixmax >= jpixmin) then jpix = jpixmin jpixi = jpix if (periodicy) jpixi = iroll(jpix,npixy) ypix = ymini + (jpix-0.5)*pixwidthy dy = ypix - y(i) do ipix = ipixmin,ipixmax ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) xpix = xmini + (ipix-0.5)*pixwidthx dx = xpix - x(i) !--top boundary r0 = 0.5*pixwidthy - dy d1 = 0.5*pixwidthx + dx d2 = 0.5*pixwidthx - dx pixint = pint(r0, d1, d2, hi1) wab = pixint*denom !$omp atomic datsmooth(ipixi,jpixi) = datsmooth(ipixi,jpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) + termnorm*wab endif enddo endif ! !--first pixel column ! if (ipixmax >= ipixmin) then ipix = ipixmin ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) xpix = xmini + (ipix-0.5)*pixwidthx dx = xpix - x(i) do jpix = jpixmin,jpixmax jpixi = jpix if (periodicy) jpixi = iroll(jpixi,npixy) ypix = ymini + (jpix-0.5)*pixwidthy dy = ypix - y(i) !--left boundary r0 = 0.5*pixwidthx - dx d1 = 0.5*pixwidthy - dy d2 = 0.5*pixwidthy + dy pixint = pint(r0, d1, d2, hi1) wab = pixint*denom !$omp atomic datsmooth(ipixi,jpixi) = datsmooth(ipixi,jpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) + termnorm*wab endif enddo endif ! !--other pixels ! do jpix = jpixmin,jpixmax jpixi = jpix if (periodicy) jpixi = iroll(jpix,npixy) ypix = ymini + (jpix-0.5)*pixwidthy dy = ypix - y(i) do ipix = ipixmin,ipixmax ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) xpix = xmini + (ipix-0.5)*pixwidthx dx = xpix - x(i) ! !--Kernel integral ! !--bottom boundary r0 = 0.5*pixwidthy + dy d1 = 0.5*pixwidthx - dx d2 = 0.5*pixwidthx + dx pixint = pint(r0, d1, d2, hi1) wab = pixint*denom !$omp atomic datsmooth(ipixi,jpixi) = datsmooth(ipixi,jpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) + termnorm*wab endif if (jpix < jpixmax) then jpixi = jpix+1 if (periodicy) jpixi = iroll(jpixi,npixy) !$omp atomic datsmooth(ipixi,jpixi) = datsmooth(ipixi,jpixi) - term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) - termnorm*wab endif jpixi = jpix if (periodicy) jpixi = iroll(jpix,npixy) endif !--right boundary r0 = 0.5*pixwidthx + dx d1 = 0.5*pixwidthy + dy d2 = 0.5*pixwidthy - dy pixint = pint(r0, d1, d2, hi1) wab = pixint*denom !$omp atomic datsmooth(ipixi,jpixi) = datsmooth(ipixi,jpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) + termnorm*wab endif if (ipix < ipixmax) then ipixi = ipix+1 if (periodicx) ipixi = iroll(ipixi,npixx) !$omp atomic datsmooth(ipixi,jpixi) = datsmooth(ipixi,jpixi) - term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) - termnorm*wab endif endif enddo enddo else ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax dx2i(ipix) = ((xmini + (ipix-0.5)*pixwidthx - x(i))**2)*hi21 enddo ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax jpixi = jpix if (periodicy) jpixi = iroll(jpix,npixy) ypix = ymini + (jpix-0.5)*pixwidthy dy = ypix - y(i) dy2 = dy*dy*hi21 do ipix = ipixmin,ipixmax ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) ! xpix = xmin + (ipix-0.5)*pixwidthx ! dx = xpix - x(i) q2 = dx2i(ipix) + dy2 ! dx2 pre-calculated; dy2 pre-multiplied by hi21 !q2 = (dx*dx + dy*dy)*hi1*hi1 ! !--SPH kernel ! wab = wkernel(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipixi,jpixi) = datsmooth(ipixi,jpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) + termnorm*wab endif enddo enddo endif enddo over_parts !$omp end parallel do !if (exact) then ! print*, 'sum of datpix = ', sum(datsmooth)/(npixx*npixy) ! print*, 'max of datpix = ', maxval(datsmooth) ! print*, 'min of datpix = ', minval(datsmooth) !endif ! !--normalise dat array ! if (normalise) then !where (datnorm > 0.) ! datsmooth = datsmooth/datnorm !end where ! ! compute the minimum possible value for datnorm, then multiply ! with a kernel-softened version of 1/x to avoid dividing by zero ! datnorm_min = minval(const*weight,mask=(weight > 0.)) datsmooth = datsmooth*soft_func(datnorm,datnorm_min) endif call wall_time(t_end) t_used = t_end - t_start if (t_used > 10.) call print_time(t_used) end subroutine interpolate2D !-------------------------------------------------------------------------- ! ! ** this version does vector quantities ! ! Input: particle coordinates : x,y (npart) ! smoothing lengths : hh (npart) ! interpolation weights : weight (npart) ! vector data to smooth : vecx (npart) ! vecy (npart) ! ! Output: smoothed vector field : vecsmoothx (npixx,npixy) ! : vecsmoothy (npixx,npixy) ! ! Daniel Price, University of Exeter, March 2005 ! Exact rendering implemented by Maya Petkova and Daniel Price 2018å !-------------------------------------------------------------------------- subroutine interpolate2D_vec(x,y,hh,weight,vecx,vecy,itype,npart, & xmin,ymin,vecsmoothx,vecsmoothy,npixx,npixy,pixwidthx,pixwidthy,& normalise,exact,periodicx,periodicy) integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,hh,weight,vecx,vecy integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy real, intent(out), dimension(npixx,npixy) :: vecsmoothx,vecsmoothy logical, intent(in) :: normalise,exact,periodicx,periodicy real, dimension(npixx,npixy) :: datnorm integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax integer :: ipixi,jpixi real :: hi,hi1,radkern,q2,wab,const real :: termnorm,termx,termy,dx,dy,xpix,ypix vecsmoothx = 0. vecsmoothy = 0. datnorm = 0. if (normalise) then print "(1x,a)",'interpolating vector field from particles to 2D grid (normalised)...' else print "(1x,a)",'interpolating vector field from particles to 2D grid (non-normalised)...' endif if (pixwidthx <= 0. .or. pixwidthy <= 0.) then print*,'interpolate2D_vec: error: pixel width <= 0' return endif if (any(hh(1:npart) <= tiny(hh))) then print*,'interpolate2D_vec: warning: ignoring some or all particles with h < 0' endif const = cnormk2D ! normalisation constant if (.not.associated(wfunc)) call select_kernel(0) ! !--loop over particles ! over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0) cycle over_parts ! !--skip particles with zero weights ! termnorm = const*weight(i) if (termnorm <= 0.) cycle over_parts ! !--skip particles with wrong h's ! hi = hh(i) if (hi <= tiny(hi)) cycle over_parts ! !--set kernel related quantities ! hi1 = 1./hi radkern = radkernel*hi ! radius of the smoothing kernel termx = termnorm*vecx(i) termy = termnorm*vecy(i) ! !--for each particle work out which pixels it contributes to ! ipixmin = int((x(i) - radkern - xmin)/pixwidthx) jpixmin = int((y(i) - radkern - ymin)/pixwidthy) ipixmax = int((x(i) + radkern - xmin)/pixwidthx) + 1 jpixmax = int((y(i) + radkern - ymin)/pixwidthy) + 1 if (.not.periodicx) then if (ipixmin < 1) ipixmin = 1 if (ipixmax > npixx) ipixmax = npixx endif if (.not.periodicy) then if (jpixmin < 1) jpixmin = 1 if (jpixmax > npixy) jpixmax = npixy endif ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax jpixi = jpix if (periodicy) jpixi = iroll(jpix,npixy) ypix = ymin + (jpix-0.5)*pixwidthy dy = ypix - y(i) do ipix = ipixmin,ipixmax ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) xpix = xmin + (ipix-0.5)*pixwidthx dx = xpix - x(i) q2 = (dx*dx + dy*dy)*hi1*hi1 ! !--SPH kernel ! wab = wfunc(q2) ! !--calculate data value at this pixel using the summation interpolant ! vecsmoothx(ipixi,jpixi) = vecsmoothx(ipixi,jpixi) + termx*wab vecsmoothy(ipixi,jpixi) = vecsmoothy(ipixi,jpixi) + termy*wab if (normalise) datnorm(ipixi,jpixi) = datnorm(ipixi,jpixi) + termnorm*wab enddo enddo enddo over_parts ! !--normalise dat arrays ! if (normalise) then where (datnorm > 0.) vecsmoothx = vecsmoothx/datnorm vecsmoothy = vecsmoothy/datnorm end where endif end subroutine interpolate2D_vec !-------------------------------------------------------------------------- ! subroutine to interpolate from particle data to even grid of pixels ! ! this version takes any 1D cross section through a 2D data set ! the 1D line is specified by two points, (x1,y1) and (x2,y2) ! (ie. this is for arbitrary oblique cross sections) ! ! NB: A similar version could be used for 2D oblique cross sections ! of 3D data. In this case we would need to find the intersection ! between the smoothing sphere and the cross section plane. However ! in 3D it is simpler just to rotate the particles first and then take ! a straight cross section. ! ! Input: particle coordinates : x,y (npart) ! smoothing lengths : hh (npart) ! interpolation weights : weight (npart) ! scalar data to smooth : dat (npart) ! ! Output: smoothed data : datsmooth (npixx) ! ! Daniel Price, Institute of Astronomy, Cambridge, Feb 2004 !-------------------------------------------------------------------------- subroutine interpolate2D_xsec(x,y,hh,weight,dat,itype,npart,& x1,y1,x2,y2,datsmooth,npixx,normalise) integer, intent(in) :: npart,npixx real, intent(in), dimension(npart) :: x,y,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: x1,y1,x2,y2 real, intent(out), dimension(npixx) :: datsmooth logical, intent(in) :: normalise real, dimension(npixx) :: datnorm integer :: i,ipix,ipixmin,ipixmax real :: hi,hi1,radkern,q2,wab,const real :: term,termnorm,dx,dy,xpix,ypix,pixwidth,xpixwidth,xlength real :: gradient,yintercept,aa,bb,cc,determinant,det real :: xstart,xend,ystart,yend,rstart,rend real :: tol logical :: xsame, ysame, debug debug = .false. ! !--check for errors in input ! tol = 1.e-3 ysame = (abs(y2 - y1) < tol) xsame = (abs(x2 - x1) < tol) if (xsame.and.ysame) then print*,'error: interpolate2D_xsec: zero length cross section' return endif if (npixx==0) then print*,'error: interpolate2D_xsec: npix = 0 ' return endif print*,'oblique 1D cross section through 2D data: npix =',npixx ! !--work out the equation of the line y = mx + c from the two points input ! gradient = 0. if (.not.xsame) gradient = (y2-y1)/(x2-x1) yintercept = y2 - gradient*x2 print*,'cross section line: y = ',gradient,'x + ',yintercept ! !--work out length of line and divide into pixels ! xlength = sqrt((x2-x1)**2 + (y2-y1)**2) pixwidth = xlength/real(npixx) xpixwidth = (x2 - x1)/real(npixx) if (debug) then print*,'length of line = ',xlength print*,'pixel width = ',pixwidth, ' in x direction = ',xpixwidth endif ! !--now interpolate to the line of pixels ! datsmooth = 0. datnorm = 0. const = cnormk2D ! normalisation constant if (.not.associated(wfunc)) call select_kernel(0) ! !--loop over particles ! over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0) cycle over_parts ! !--skip particles with zero weights ! termnorm = const*weight(i) if (termnorm <= 0.) cycle over_parts ! !--skip particles with wrong h's ! hi = hh(i) if (hi <= tiny(hi)) cycle over_parts ! !--set kernel related quantities ! hi1 = 1./hi radkern = radkernel*hi ! radius of the smoothing kernel term = termnorm*dat(i) ! !--for each particle work out which pixels it contributes to ! to do this we need to work out the two points at which the line ! intersects the particles smoothing circle ! given by the equation (x-xi)^2 + (y-yi)^2 = (2h)^2. ! The x co-ordinates of these points are the solutions to a ! quadratic with co-efficients: aa = 1. + gradient**2 bb = 2.*gradient*(yintercept - y(i)) - 2.*x(i) cc = x(i)**2 + y(i)**2 - 2.*yintercept*y(i) + yintercept**2 & - radkern**2 ! !--work out whether there are any real solutions and find them ! determinant = bb**2 - 4.*aa*cc if (determinant < 0) then !!print*,' particle ',i,': does not contribute ',x(i),y(i) else det = sqrt(determinant) xstart = (-bb - det)/(2.*aa) xend = (-bb + det)/(2.*aa) if (xstart < x1) xstart = x1 if (xstart > x2) xstart = x2 if (xend > x2) xend = x2 if (xend < x1) xend = x1 ystart = gradient*xstart + yintercept yend = gradient*xend + yintercept ! !--work out position in terms of distance (no. of pixels) along the line ! rstart = sqrt((xstart-x1)**2 + (ystart-y1)**2) rend = sqrt((xend-x1)**2 + (yend-y1)**2) ipixmin = int(rstart/pixwidth) ipixmax = int(rend/pixwidth) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (ipixmax < 1) ipixmax = 1 if (ipixmax > npixx) ipixmax = npixx if (ipixmin > npixx) ipixmax = npixx ! !--loop over pixels, adding the contribution from this particle ! !if (debug) print*,' particle ',i,': ',ipixmin,ipixmax,xstart,x(i),xend do ipix = ipixmin,ipixmax xpix = x1 + (ipix-0.5)*xpixwidth ypix = gradient*xpix + yintercept dy = ypix - y(i) dx = xpix - x(i) q2 = (dx*dx + dy*dy)*hi1*hi1 ! !--SPH kernel ! wab = wfunc(q2) ! !--calculate data value at this pixel using the summation interpolant ! datsmooth(ipix) = datsmooth(ipix) + term*wab if (normalise) datnorm(ipix) = datnorm(ipix) + termnorm*wab enddo endif enddo over_parts ! !--normalise dat array ! if (normalise) then where (datnorm > 0.) datsmooth = datsmooth/datnorm end where endif end subroutine interpolate2D_xsec !-------------------------------------------------------------------------- ! subroutine to render particles onto a pixel array ! at the maximum or minimum colour ! ! Written by Daniel Price 21/7/2008 !-------------------------------------------------------------------------- subroutine interpolate_part(x,y,hh,npart,xmin,ymin,datsmooth,npixx,npixy,pixwidth,datval,brightness) integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,hh real, intent(in) :: xmin,ymin,pixwidth,datval real, intent(inout), dimension(npixx,npixy) :: datsmooth real, intent(inout), dimension(npixx,npixy), optional :: brightness integer :: i if (pixwidth <= 0.) then print "(1x,a)",'interpolate_part: error: pixel width <= 0' return endif if (any(hh(1:npart) <= tiny(hh))) then print*,'interpolate_part: warning: ignoring some or all particles with h < 0' endif ! !--loop over particles ! if (present(brightness)) then do i=1,npart call interpolate_part1(x(i),y(i),hh(i),xmin,ymin,datsmooth,npixx,npixy,pixwidth,datval) enddo else do i=1,npart call interpolate_part1(x(i),y(i),hh(i),xmin,ymin,datsmooth,npixx,npixy,pixwidth,datval,brightness) enddo endif end subroutine interpolate_part !-------------------------------------------------------------------------- ! subroutine to render a single particle onto a pixel array ! ! Written by Daniel Price 21/7/2008 !-------------------------------------------------------------------------- subroutine interpolate_part1(xi,yi,hi,xmin,ymin,datsmooth,npixx,npixy,pixwidth,datval,brightness) real, intent(in) :: xi,yi,hi,xmin,ymin,pixwidth,datval integer, intent(in) :: npixx,npixy real, intent(inout), dimension(npixx,npixy) :: datsmooth real, intent(inout), dimension(npixx,npixy), optional :: brightness integer :: ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax real :: radkern,radkern2,rab2 real :: dx,dy2,xpix,ypix ! !--skip particles with wrong h's ! if (hi <= tiny(hi)) return ! !--set kernel related quantities ! radkern = max(hi,2.*pixwidth) radkern2 = radkern*radkern ! radius of the smoothing kernel ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkern - xmin)/pixwidth) jpixmin = int((yi - radkern - ymin)/pixwidth) ipixmax = int((xi + radkern - xmin)/pixwidth) + 1 jpixmax = int((yi + radkern - ymin)/pixwidth) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (jpixmin < 1) jpixmin = 1 ! to pixels in the image if (ipixmax > npixx) ipixmax = npixx if (jpixmax > npixy) jpixmax = npixy ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax ypix = ymin + (jpix-0.5)*pixwidth dy2 = (ypix - yi)**2 do ipix = ipixmin,ipixmax xpix = xmin + (ipix-0.5)*pixwidth dx = xpix - xi rab2 = dx**2 + dy2 ! !--set data value at this pixel to maximum ! if (rab2 < radkern2) then datsmooth(ipix,jpix) = datval if (present(brightness)) then brightness(ipix,jpix) = 1.0 endif endif enddo enddo end subroutine interpolate_part1 !-------------------------------------------------------------------------- ! subroutine to interpolate from arbitrary data to even grid of pixels ! ! The data is smoothed using the SPH summation interpolant, ! that is, we compute the smoothed array according to ! ! datsmooth(pixel) = sum_j dat_j W(r-r_j, \Delta) / sum_j W(r-r_j, \Delta) ! ! where _j is the quantity at the neighbouring particle j and ! W is the smoothing kernel. The interpolation is normalised. ! ! Input: data points : x,y (npart) ! third scalar to use as weight : dat (npart) (optional) ! ! number of pixels in x,y : npixx,npixy ! pixel width : pixwidth ! option to normalise interpolation : normalise (.true. or .false.) ! ! Output: smoothed data : datsmooth (npixx,npixy) ! ! Written by Daniel Price 2017 !-------------------------------------------------------------------------- subroutine interpolate2D_pixels(x,y,itype,npart, & xmin,ymin,xmax,ymax,datsmooth,npixx,npixy,& normalise,adaptive,dat,datpix2,fac,weights) use timing, only:wall_time,print_time integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,xmax,ymax real, intent(out), dimension(npixx,npixy) :: datsmooth logical, intent(in) :: normalise,adaptive real, intent(in), dimension(npart), optional :: dat,weights real, dimension(npixx,npixy), intent(out), optional :: datpix2 real, intent(in), optional :: fac real, dimension(npixx,npixy) :: datnorm,datold real, dimension(npixx) :: dx2i,qq2,wabi integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax,its,itsmax real :: hi,hi1,radkernx,radkerny,q2,wab,const real :: term,termnorm,dy,xpix,ypix,ddx,ddy real :: xi,yi,pixwidthx,pixwidthy,dy2 real :: t1,t2,hfac if (adaptive) then print "(1x,a)",'interpolating from particles to 2D pixels (adaptive)...' else print "(1x,a)",'interpolating from particles to 2D pixels...' endif if (adaptive) then itsmax = 3 else itsmax = 1 endif ! default smoothing length in units of pixel scale hfac = 1.5 if (present(fac)) then if (fac > 0.) hfac = fac endif call wall_time(t1) if (.not.associated(wfunc)) call select_kernel(0) iterations: do its=1,itsmax datsmooth = 0. datnorm = 0. const = cnormk2D ! normalisation constant ! !--loop over particles ! ddx = npixx/(xmax - xmin) ddy = npixy/(ymax - ymin) pixwidthx = 1. !/npixx pixwidthy = 1. !/npixy if (pixwidthx <= 0. .or. pixwidthy <= 0.) then print "(1x,a)",'interpolate2D: error: pixel width <= 0' return endif !$omp parallel do default(none) & !$omp shared(npart,itype,x,y,xmin,ymin,ddx,ddy,its,itsmax,weights) & !$omp shared(datold,datsmooth,datnorm,npixx,npixy,const,radkernel,radkernel2,dat) & !$omp shared(pixwidthx,pixwidthy,normalise,hfac) & !$omp private(i,xi,yi,ipix,jpix,hi,hi1) & !$omp private(radkernx,radkerny,ipixmin,ipixmax,jpixmin,jpixmax) & !$omp private(dx2i,xpix,ypix,dy,dy2,q2,wab,term,termnorm,qq2,wabi) over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0) cycle over_parts ! !--scale particle positions into viewport coordinates ! xi = (x(i) - xmin)*ddx yi = (y(i) - ymin)*ddy hi = 1.0*pixwidthx if (itsmax==1) hi=hi*hfac ! in units of pixel spacing ipix = int(xi) jpix = int(yi) if (its > 1 .and. ipix >= 1 .and. ipix <= npixx.and. jpix >= 1 .and. jpix <= npixy) then hi = max(min(hfac/sqrt(datold(ipix,jpix)),100.),1.) endif hi1 = 1./hi termnorm = const*hi1*hi1 ! !--set kernel related quantities ! radkernx = radkernel*hi ! radius of the smoothing kernel radkerny = radkernel*hi ! radius of the smoothing kernel if (present(weights)) then termnorm = termnorm*weights(i) endif if (present(dat)) then term = termnorm*dat(i) else term = termnorm endif if (termnorm <= 0.) cycle over_parts ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkernx)) jpixmin = int((yi - radkerny)) ipixmax = int((xi + radkernx)) + 1 jpixmax = int((yi + radkerny)) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (ipixmax > npixx) ipixmax = npixx ! to pixels in the image if (jpixmin < 1) jpixmin = 1 if (jpixmax > npixy) jpixmax = npixy ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax xpix = (ipix-0.5)*pixwidthx dx2i(ipix) = ((xpix - xi)**2)*hi1*hi1 enddo ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax ypix = (jpix-0.5)*pixwidthy dy = ypix - yi dy2 = dy*dy*hi1*hi1 do ipix = ipixmin,ipixmax q2 = dx2i(ipix) + dy2 ! !--SPH kernel ! if (q2 < radkernel2) then wab = wkernel(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + term*wab if (normalise) then !$omp atomic datnorm(ipix,jpix) = datnorm(ipix,jpix) + termnorm*wab endif endif enddo enddo enddo over_parts !$omp end parallel do if (present(dat)) then datold = datnorm else datold = datsmooth endif ! !--normalise dat array ! if (normalise) then where (datnorm > 0.) datsmooth = datsmooth/datnorm end where endif enddo iterations if (present(datpix2)) datpix2 = datnorm call wall_time(t2) if (t2-t1 > 1.) call print_time(t2-t1) end subroutine interpolate2D_pixels !-------------------------------------------------------------------------- ! subroutine to interpolate from even grid of pixels TO arbitrary points ! ! Input: data points : x,y (npart) ! smoothing length : hh (npart) ! number of pixels in x,y : npixx,npixy ! pixel width : pixwidth ! data on pixels : datpix(npixx,npixy) ! ! Output: smoothed data : dat (npart) ! ! Written by Daniel Price 2021 !-------------------------------------------------------------------------- subroutine interpolate2D_fromgrid(x,y,hh,dat,gradh,sigma,mask,npart, & xmin,ymin,datpix,npixx,npixy,pixwidthx,pixwidthy) use timing, only:wall_time,print_time integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,hh real, intent(out), dimension(npart) :: dat,gradh,sigma integer, intent(in), dimension(npart) :: mask real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy real, intent(in), dimension(npixx,npixy) :: datpix real, dimension(npixx) :: dx2i,qq2 integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax real :: hi,hi1,radkernx,radkerny,q2,wab,const,datpart real :: term,dy,xpix,ypix,xi,yi,dy2,dwabdh,gradhi real :: t1,t2 !print "(1x,a)",'interpolating from 2D pixels to particles...' call wall_time(t1) if (.not.associated(wfunc)) call select_kernel(0) const = cnormk2D ! normalisation constant if (pixwidthx <= 0. .or. pixwidthy <= 0.) then print "(1x,a)",'interpolate2D: error: pixel width <= 0' return endif ! !--loop over particles ! !$omp parallel do default(none) & !$omp shared(npart,mask,x,y,hh,xmin,ymin) & !$omp shared(dat,gradh,sigma,datpix,npixx,npixy,const,radkernel,radkernel2) & !$omp shared(pixwidthx,pixwidthy) & !$omp private(i,xi,yi,ipix,jpix,hi,hi1,datpart) & !$omp private(radkernx,radkerny,ipixmin,ipixmax,jpixmin,jpixmax) & !$omp private(dx2i,xpix,ypix,dy,dy2,q2,wab,term,qq2,dwabdh,gradhi) over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (mask(i) < 0) cycle over_parts xi = x(i) yi = y(i) hi = hh(i) ! in units of pixel spacing hi1 = 1./hi term = const*pixwidthx*pixwidthy*hi1*hi1 ! this is dx*dy/h**2 if (term <= 0.) cycle over_parts ! !--set kernel related quantities ! radkernx = radkernel*hi ! radius of the smoothing kernel radkerny = radkernel*hi ! radius of the smoothing kernel ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkernx - xmin)/abs(pixwidthx)) jpixmin = int((yi - radkerny - ymin)/abs(pixwidthy)) ipixmax = int((xi + radkernx - xmin)/abs(pixwidthx)) + 1 jpixmax = int((yi + radkerny - ymin)/abs(pixwidthy)) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure we only receive contributions if (ipixmax > npixx) ipixmax = npixx ! from pixels in the image if (jpixmin < 1) jpixmin = 1 if (jpixmax > npixy) jpixmax = npixy ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax xpix = xmin + (ipix-0.5)*pixwidthx dx2i(ipix) = ((xpix - xi)**2)*hi1*hi1 enddo ! !--loop over pixels, adding the contribution TO this particle ! datpart = 0. gradhi = 0. do jpix = jpixmin,jpixmax ypix = ymin + (jpix-0.5)*pixwidthy dy = ypix - yi dy2 = dy*dy*hi1*hi1 do ipix = ipixmin,ipixmax q2 = dx2i(ipix) + dy2 ! !--SPH kernel ! if (q2 < radkernel2) then wab = wkernel(q2) ! !--interpolate to particle using the summation interpolant ! datpart = datpart + datpix(ipix,jpix)*wab dwabdh = -(2.*wab + sqrt(q2)*dwkernel(q2)) gradhi = gradhi + datpix(ipix,jpix)*dwabdh endif enddo enddo dat(i) = term*datpart gradh(i) = term*gradhi*hi1 datpart = 0. do jpix = jpixmin,jpixmax ypix = ymin + (jpix-0.5)*pixwidthy dy = ypix - yi dy2 = dy*dy*hi1*hi1 do ipix = ipixmin,ipixmax q2 = dx2i(ipix) + dy2 ! !--SPH kernel ! if (q2 < radkernel2) then wab = wkernel(q2) ! !--interpolate to particle using the summation interpolant ! datpart = datpart + (datpix(ipix,jpix) - dat(i))**2*wab endif enddo enddo sigma(i) = sqrt(term*datpart) enddo over_parts !$omp end parallel do call wall_time(t2) if (t2-t1 > 1.) call print_time(t2-t1) end subroutine interpolate2D_fromgrid !------------------------------------------------------------ ! interface to kernel routine to avoid problems with openMP !----------------------------------------------------------- real function wkernel(q2) use kernels, only:wfunc real, intent(in) :: q2 wkernel = wfunc(q2) end function wkernel real function dwkernel(q2) use kernels, only:dwfunc real, intent(in) :: q2 dwkernel = dwfunc(q2) end function dwkernel end module interpolations2D danieljprice-splash-4d1f09c/src/interpolate3D.f90000066400000000000000000000522731477365367100217270ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module containing all of the routines required for interpolation ! from 3D data to a 3D grid (SLOW!) ! !---------------------------------------------------------------------- module interpolations3D use kernels, only:radkernel2,radkernel,cnormk3D,wallint use interpolation, only:iroll use timing, only:wall_time,print_time implicit none integer, parameter :: doub_prec = kind(0.d0) public :: interpolate3D,interpolate3D_vec contains !-------------------------------------------------------------------------- ! subroutine to interpolate from particle data to even grid of pixels ! ! The data is interpolated according to the formula ! ! datsmooth(pixel) = sum_b weight_b dat_b W(r-r_b, h_b) ! ! where _b is the quantity at the neighbouring particle b and ! W is the smoothing kernel, for which we use the usual cubic spline. ! ! For a standard SPH smoothing the weight function for each particle should be ! ! weight = pmass/(rho*h^3) ! ! this version is written for slices through a rectangular volume, ie. ! assumes a uniform pixel size in x,y, whilst the number of pixels ! in the z direction can be set to the number of cross-section slices. ! ! Input: particle coordinates : x,y,z (npart) ! smoothing lengths : hh (npart) ! weight for each particle : weight (npart) ! scalar data to smooth : dat (npart) ! ! Output: smoothed data : datsmooth (npixx,npixy,npixz) ! ! Daniel Price, Institute of Astronomy, Cambridge 16/7/03 ! Revised for "splash to grid", Monash University 02/11/09 ! Maya Petkova contributed exact subgrid interpolation, April 2019 !-------------------------------------------------------------------------- subroutine interpolate3D(x,y,z,hh,weight,dat,itype,npart,& xmin,ymin,zmin,datsmooth,npixx,npixy,npixz,pixwidthx,pixwidthy,pixwidthz,& normalise,periodicx,periodicy,periodicz) integer, intent(in) :: npart,npixx,npixy,npixz real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,zmin,pixwidthx,pixwidthy,pixwidthz real(doub_prec), intent(out), dimension(npixx,npixy,npixz) :: datsmooth logical, intent(in) :: normalise,periodicx,periodicy,periodicz real(doub_prec), allocatable :: datnorm(:,:,:) integer :: i,ipix,jpix,kpix integer :: iprintinterval,iprintnext integer :: ipixmin,ipixmax,jpixmin,jpixmax,kpixmin,kpixmax integer :: ipixi,jpixi,kpixi,nxpix,nwarn,threadid real :: xminpix,yminpix,zminpix,hmin !,dhmin3 real, dimension(npixx) :: dx2i real :: xi,yi,zi,hi,hi1,hi21,radkern,wab,q2,const,dyz2,dz2 real :: term,termnorm,dy,dz,ypix,zpix,xpixi,pixwidthmax,dfac real :: t_start,t_end,t_used logical :: iprintprogress ! Exact rendering real :: pixint, wint logical, parameter :: exact_rendering = .true. ! use exact rendering y/n integer :: usedpart, negflag !$ integer :: omp_get_num_threads,omp_get_thread_num integer(kind=selected_int_kind(10)) :: iprogress,j ! up to 10 digits if (exact_rendering) then print "(1x,a)",'interpolating to 3D grid (exact/Petkova+2018 on subgrid) ...' elseif (normalise) then print "(1x,a)",'interpolating to 3D grid (normalised) ...' else print "(1x,a)",'interpolating to 3D grid (non-normalised) ...' endif if (pixwidthx <= 0. .or. pixwidthy <= 0 .or. pixwidthz <= 0) then print "(1x,a)",'interpolate3D: error: pixel width <= 0' return endif !if (any(hh(1:npart) <= tiny(hh))) then ! print*,'interpolate3D: WARNING: ignoring some or all particles with h < 0' !endif call wall_time(t_start) datsmooth = 0. if (normalise) then allocate(datnorm(npixx,npixy,npixz)) datnorm = 0. endif ! !--print a progress report if it is going to take a long time ! (a "long time" is, however, somewhat system dependent) ! iprintprogress = (npart >= 100000) .or. (npixx*npixy > 100000) !.or. exact_rendering ! !--loop over particles ! iprintinterval = 25 if (npart >= 1e6) iprintinterval = 10 iprintnext = iprintinterval ! !--get starting CPU time ! !call cpu_time(t_start) usedpart = 0 xminpix = xmin - 0.5*pixwidthx yminpix = ymin - 0.5*pixwidthy zminpix = zmin - 0.5*pixwidthz pixwidthmax = max(pixwidthx,pixwidthy,pixwidthz) ! !--use a minimum smoothing length on the grid to make ! sure that particles contribute to at least one pixel ! hmin = 0.5*pixwidthmax !dhmin3 = 1./(hmin*hmin*hmin) const = cnormk3D ! normalisation constant (3D) nwarn = 0 j = 0_8 threadid = 1 ! !--loop over particles ! !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,dat,itype,datsmooth,npart) & !$omp shared(xmin,ymin,zmin,radkernel,radkernel2) & !$omp shared(xminpix,yminpix,zminpix,pixwidthx,pixwidthy,pixwidthz) & !$omp shared(npixx,npixy,npixz,const) & !$omp shared(datnorm,normalise,periodicx,periodicy,periodicz) & !$omp shared(hmin,pixwidthmax) & !$omp shared(iprintprogress,iprintinterval,j) & !$omp private(hi,xi,yi,zi,radkern,hi1,hi21) & !$omp private(term,termnorm,xpixi,iprogress) & !$omp private(ipixmin,ipixmax,jpixmin,jpixmax,kpixmin,kpixmax) & !$omp private(ipix,jpix,kpix,ipixi,jpixi,kpixi) & !$omp private(dx2i,nxpix,zpix,dz,dz2,dyz2,dy,ypix,q2,wab) & !$omp private(pixint,wint,negflag,dfac,threadid) & !$omp firstprivate(iprintnext) & !$omp reduction(+:nwarn,usedpart) !$omp master !$ print "(1x,a,i3,a)",'Using ',omp_get_num_threads(),' cpus' !$omp end master !$omp do schedule (guided, 2) over_parts: do i=1,npart ! !--report on progress ! if (iprintprogress) then !$omp atomic j=j+1_8 !$ threadid = omp_get_thread_num() iprogress = 100*j/npart if (iprogress >= iprintnext .and. threadid==1) then write(*,"(i3,'%.')",advance='no') iprogress iprintnext = iprintnext + iprintinterval endif endif ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_parts hi = hh(i) if (hi <= 0.) then cycle over_parts elseif (hi < hmin) then ! !--use minimum h to capture subgrid particles ! (get better results *without* adjusting weights) ! termnorm = const*weight(i) !*(hi*hi*hi)*dhmin3 if (.not.exact_rendering) hi = hmin else termnorm = const*weight(i) endif ! !--set kernel related quantities ! xi = x(i) yi = y(i) zi = z(i) hi1 = 1./hi hi21 = hi1*hi1 radkern = radkernel*hi ! radius of the smoothing kernel !termnorm = const*weight(i) term = termnorm*dat(i) dfac = hi**3/(pixwidthx*pixwidthy*pixwidthz*const) !dfac = hi**3/(pixwidthx*pixwidthy*const) ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkern - xmin)/pixwidthx) jpixmin = int((yi - radkern - ymin)/pixwidthy) kpixmin = int((zi - radkern - zmin)/pixwidthz) ipixmax = int((xi + radkern - xmin)/pixwidthx) + 1 jpixmax = int((yi + radkern - ymin)/pixwidthy) + 1 kpixmax = int((zi + radkern - zmin)/pixwidthz) + 1 if (.not.periodicx) then if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (ipixmax > npixx) ipixmax = npixx ! to pixels in the image endif if (.not.periodicy) then if (jpixmin < 1) jpixmin = 1 if (jpixmax > npixy) jpixmax = npixy endif if (.not.periodicz) then if (kpixmin < 1) kpixmin = 1 if (kpixmax > npixz) kpixmax = npixz endif negflag = 0 ! !--precalculate an array of dx2 for this particle (optimisation) ! nxpix = 0 do ipix=ipixmin,ipixmax nxpix = nxpix + 1 ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) xpixi = xminpix + ipix*pixwidthx !--watch out for errors with periodic wrapping... if (nxpix <= size(dx2i)) then dx2i(nxpix) = ((xpixi - xi)**2)*hi21 endif enddo !--if particle contributes to more than npixx pixels ! (i.e. periodic boundaries wrap more than once) ! truncate the contribution and give warning if (nxpix > npixx) then nwarn = nwarn + 1 ipixmax = ipixmin + npixx - 1 endif ! !--loop over pixels, adding the contribution from this particle ! do kpix = kpixmin,kpixmax kpixi = kpix if (periodicz) kpixi = iroll(kpix,npixz) zpix = zminpix + kpix*pixwidthz dz = zpix - zi dz2 = dz*dz*hi21 do jpix = jpixmin,jpixmax jpixi = jpix if (periodicy) jpixi = iroll(jpix,npixy) ypix = yminpix + jpix*pixwidthy dy = ypix - yi dyz2 = dy*dy*hi21 + dz2 nxpix = 0 do ipix = ipixmin,ipixmax if ((kpix==kpixmin).and.(jpix==jpixmin).and.(ipix==ipixmin)) then usedpart = usedpart + 1 endif nxpix = nxpix + 1 ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) q2 = dx2i(nxpix) + dyz2 ! dx2 pre-calculated; dy2 pre-multiplied by hi21 if (exact_rendering .and. ipixmax-ipixmin <= 4) then if (q2 < radkernel2 + 3.*pixwidthmax**2*hi21) then xpixi = xminpix + ipix*pixwidthx ! Contribution of the cell walls in the xy-plane pixint = 0.0 wint = wallint(zpix-zi+0.5*pixwidthz,xi,yi,xpixi,ypix,pixwidthx,pixwidthy,hi) pixint = pixint + wint wint = wallint(zi-zpix+0.5*pixwidthz,xi,yi,xpixi,ypix,pixwidthx,pixwidthy,hi) pixint = pixint + wint ! Contribution of the cell walls in the xz-plane wint = wallint(ypix-yi+0.5*pixwidthy,xi,zi,xpixi,zpix,pixwidthx,pixwidthz,hi) pixint = pixint + wint wint = wallint(yi-ypix+0.5*pixwidthy,xi,zi,xpixi,zpix,pixwidthx,pixwidthz,hi) pixint = pixint + wint ! Contribution of the cell walls in the yz-plane wint = wallint(xpixi-xi+0.5*pixwidthx,zi,yi,zpix,ypix,pixwidthz,pixwidthy,hi) pixint = pixint + wint wint = wallint(xi-xpixi+0.5*pixwidthx,zi,yi,zpix,ypix,pixwidthz,pixwidthy,hi) pixint = pixint + wint wab = pixint*dfac ! /(pixwidthx*pixwidthy*pixwidthz*const)*hi**3 if (pixint < -0.01d0) then print*, "Error: (",ipixi,jpixi,kpixi,") -> ", pixint, term*wab endif ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipixi,jpixi,kpixi) = datsmooth(ipixi,jpixi,kpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi,kpixi) = datnorm(ipixi,jpixi,kpixi) + termnorm*wab endif endif else if (q2 < radkernel2) then ! !--SPH kernel - standard cubic spline ! wab = wkernel(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipixi,jpixi,kpixi) = datsmooth(ipixi,jpixi,kpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi,kpixi) = datnorm(ipixi,jpixi,kpixi) + termnorm*wab endif endif endif enddo enddo enddo enddo over_parts !$omp enddo !$omp end parallel if (nwarn > 0) then print "(a,i11,a,/,a)",' interpolate3D: WARNING: contributions truncated from ',nwarn,' particles',& ' that wrap periodic boundaries more than once' endif ! !--normalise dat array ! if (normalise) then where (datnorm > tiny(datnorm)) datsmooth = datsmooth/datnorm end where endif if (allocated(datnorm)) deallocate(datnorm) call wall_time(t_end) t_used = t_end - t_start if (t_used > 10.) call print_time(t_used) !print*, 'Number of particles in the volume: ', usedpart end subroutine interpolate3D subroutine interpolate3D_vec(x,y,z,hh,weight,datvec,itype,npart,& xmin,ymin,zmin,datsmooth,npixx,npixy,npixz,pixwidthx,pixwidthy,pixwidthz,& normalise,periodicx,periodicy,periodicz) integer, intent(in) :: npart,npixx,npixy,npixz real, intent(in), dimension(npart) :: x,y,z,hh,weight real, intent(in), dimension(npart,3) :: datvec integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,zmin,pixwidthx,pixwidthy,pixwidthz real(doub_prec), intent(out), dimension(3,npixx,npixy,npixz) :: datsmooth logical, intent(in) :: normalise,periodicx,periodicy,periodicz real(doub_prec), dimension(npixx,npixy,npixz) :: datnorm integer :: i,ipix,jpix,kpix integer :: iprintinterval,iprintnext integer :: ipixmin,ipixmax,jpixmin,jpixmax,kpixmin,kpixmax integer :: ipixi,jpixi,kpixi,nxpix,nwarn real :: xminpix,yminpix,zminpix real, dimension(npixx) :: dx2i real :: xi,yi,zi,hi,hi1,hi21,radkern,wab,q2,const,dyz2,dz2 real :: termnorm,dy,dz,ypix,zpix,xpixi,ddatnorm real, dimension(3) :: term !real :: t_start,t_end logical :: iprintprogress !$ integer :: omp_get_num_threads integer(kind=selected_int_kind(10)) :: iprogress ! up to 10 digits datsmooth = 0. datnorm = 0. if (normalise) then print "(1x,a)",'interpolating to 3D grid (normalised) ...' else print "(1x,a)",'interpolating to 3D grid (non-normalised) ...' endif if (pixwidthx <= 0. .or. pixwidthy <= 0. .or. pixwidthz <= 0.) then print "(1x,a)",'interpolate3D: error: pixel width <= 0' return endif if (any(hh(1:npart) <= tiny(hh))) then print*,'interpolate3D: WARNING: ignoring some or all particles with h < 0' endif ! !--print a progress report if it is going to take a long time ! (a "long time" is, however, somewhat system dependent) ! iprintprogress = (npart >= 100000) .or. (npixx*npixy > 100000) !$ iprintprogress = .false. ! !--loop over particles ! iprintinterval = 25 if (npart >= 1e6) iprintinterval = 10 iprintnext = iprintinterval ! !--get starting CPU time ! !call cpu_time(t_start) xminpix = xmin - 0.5*pixwidthx yminpix = ymin - 0.5*pixwidthy zminpix = zmin - 0.5*pixwidthz const = cnormk3D ! normalisation constant (3D) nwarn = 0 !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,datvec,itype,datsmooth,npart) & !$omp shared(xmin,ymin,zmin,radkernel,radkernel2) & !$omp shared(xminpix,yminpix,zminpix,pixwidthx,pixwidthy,pixwidthz) & !$omp shared(npixx,npixy,npixz,const) & !$omp shared(iprintprogress,iprintinterval) & !$omp shared(datnorm,normalise,periodicx,periodicy,periodicz) & !$omp private(hi,xi,yi,zi,radkern,hi1,hi21) & !$omp private(term,termnorm,xpixi) & !$omp private(iprogress,iprintnext) & !$omp private(ipixmin,ipixmax,jpixmin,jpixmax,kpixmin,kpixmax) & !$omp private(ipix,jpix,kpix,ipixi,jpixi,kpixi) & !$omp private(dx2i,nxpix,zpix,dz,dz2,dyz2,dy,ypix,q2,wab) & !$omp reduction(+:nwarn) !$omp master !$ print "(1x,a,i3,a)",'Using ',omp_get_num_threads(),' cpus' !$omp end master ! !--loop over particles ! !$omp do schedule (guided, 2) over_parts: do i=1,npart ! !--report on progress ! if (iprintprogress) then iprogress = 100*i/npart if (iprogress >= iprintnext) then write(*,"('(',i3,'% -',i12,' particles done)')") iprogress,i iprintnext = iprintnext + iprintinterval endif endif ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_parts hi = hh(i) if (hi <= 0.) cycle over_parts ! !--set kernel related quantities ! xi = x(i) yi = y(i) zi = z(i) hi1 = 1./hi hi21 = hi1*hi1 radkern = radkernel*hi ! radius of the smoothing kernel termnorm = const*weight(i) term(:) = termnorm*datvec(i,:) ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkern - xmin)/pixwidthx) jpixmin = int((yi - radkern - ymin)/pixwidthy) kpixmin = int((zi - radkern - zmin)/pixwidthz) ipixmax = int((xi + radkern - xmin)/pixwidthx) + 1 jpixmax = int((yi + radkern - ymin)/pixwidthy) + 1 kpixmax = int((zi + radkern - zmin)/pixwidthz) + 1 if (.not.periodicx) then if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (ipixmax > npixx) ipixmax = npixx ! to pixels in the image endif if (.not.periodicy) then if (jpixmin < 1) jpixmin = 1 if (jpixmax > npixy) jpixmax = npixy endif if (.not.periodicz) then if (kpixmin < 1) kpixmin = 1 if (kpixmax > npixz) kpixmax = npixz endif ! !--precalculate an array of dx2 for this particle (optimisation) ! nxpix = 0 do ipix=ipixmin,ipixmax nxpix = nxpix + 1 ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) xpixi = xminpix + ipix*pixwidthx !--watch out for errors with perioic wrapping... if (nxpix <= size(dx2i)) then dx2i(nxpix) = ((xpixi - xi)**2)*hi21 endif enddo !--if particle contributes to more than npixx pixels ! (i.e. periodic boundaries wrap more than once) ! truncate the contribution and give warning if (nxpix > npixx) then nwarn = nwarn + 1 ipixmax = ipixmin + npixx - 1 endif ! !--loop over pixels, adding the contribution from this particle ! do kpix = kpixmin,kpixmax kpixi = kpix if (periodicz) kpixi = iroll(kpix,npixz) zpix = zminpix + kpix*pixwidthz dz = zpix - zi dz2 = dz*dz*hi21 do jpix = jpixmin,jpixmax jpixi = jpix if (periodicy) jpixi = iroll(jpix,npixy) ypix = yminpix + jpix*pixwidthy dy = ypix - yi dyz2 = dy*dy*hi21 + dz2 nxpix = 0 do ipix = ipixmin,ipixmax ipixi = ipix if (periodicx) ipixi = iroll(ipix,npixx) nxpix = nxpix + 1 q2 = dx2i(nxpix) + dyz2 ! dx2 pre-calculated; dy2 pre-multiplied by hi21 ! !--SPH kernel - standard cubic spline ! if (q2 < radkernel2) then wab = wkernel(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(1,ipixi,jpixi,kpixi) = datsmooth(1,ipixi,jpixi,kpixi) + term(1)*wab !$omp atomic datsmooth(2,ipixi,jpixi,kpixi) = datsmooth(2,ipixi,jpixi,kpixi) + term(2)*wab !$omp atomic datsmooth(3,ipixi,jpixi,kpixi) = datsmooth(3,ipixi,jpixi,kpixi) + term(3)*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi,kpixi) = datnorm(ipixi,jpixi,kpixi) + termnorm*wab endif endif enddo enddo enddo enddo over_parts !$omp enddo !$omp end parallel if (nwarn > 0) then print "(a,i11,a,/,a)",' interpolate3D: WARNING: contributions truncated from ',nwarn,' particles',& ' that wrap periodic boundaries more than once' endif ! !--normalise dat array ! if (normalise) then !$omp parallel do default(none) schedule(static) & !$omp shared(datsmooth,datnorm,npixz,npixy,npixx) & !$omp private(kpix,jpix,ipix,ddatnorm) do kpix=1,npixz do jpix=1,npixy do ipix=1,npixx if (datnorm(ipix,jpix,kpix) > tiny(datnorm)) then ddatnorm = 1./datnorm(ipix,jpix,kpix) datsmooth(1,ipix,jpix,kpix) = datsmooth(1,ipix,jpix,kpix)*ddatnorm datsmooth(2,ipix,jpix,kpix) = datsmooth(2,ipix,jpix,kpix)*ddatnorm datsmooth(3,ipix,jpix,kpix) = datsmooth(3,ipix,jpix,kpix)*ddatnorm endif enddo enddo enddo !$omp end parallel do endif return end subroutine interpolate3D_vec !------------------------------------------------------------ ! interface to kernel routine to avoid problems with openMP !----------------------------------------------------------- real function wkernel(q2) use kernels, only:wfunc real, intent(in) :: q2 wkernel = wfunc(q2) end function wkernel end module interpolations3D danieljprice-splash-4d1f09c/src/interpolate3D_geom.f90000066400000000000000000000423131477365367100227300ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module containing all of the routines required for interpolation ! from 3D data to a 3D grid in arbitrary coordinate systems (SLOW!) ! !---------------------------------------------------------------------- module interpolations3Dgeom use kernels, only:radkernel2,radkernel,cnormk3D use geometry, only:labelcoordsys,coord_is_length,igeom_cartesian,coord_transform use interpolation, only:doub_prec,iroll implicit none public :: interpolate3Dgeom,interpolate3Dgeom_vec contains !-------------------------------------------------------------------------- ! subroutine to interpolate from particle data to even grid of pixels ! ! The data is interpolated according to the formula ! ! datsmooth(pixel) = sum_b weight_b dat_b W(r-r_b, h_b) ! ! where _b is the quantity at the neighbouring particle b and ! W is the smoothing kernel, for which we use the usual cubic spline. ! ! For a standard SPH smoothing the weight function for each particle should be ! ! weight = pmass/(rho*h^3) ! ! this version is written for slices through a rectangular volume, ie. ! assumes a uniform pixel size in x,y, whilst the number of pixels ! in the z direction can be set to the number of cross-section slices. ! ! Input: particle coordinates : x,y,z (npart) ! smoothing lengths : hh (npart) ! weight for each particle : weight (npart) ! scalar data to smooth : dat (npart) ! ! Output: smoothed data : datsmooth (npix(1),npix(2),npix(3)) ! ! Daniel Price, Institute of Astronomy, Cambridge 16/7/03 ! Revised for "splash to grid", Monash University 02/11/09 ! Version for arbitrary coordinate systems 02/05/18 !-------------------------------------------------------------------------- subroutine interpolate3Dgeom(igeom,x,y,z,hh,weight,dat,itype,npart,& xmin,datsmooth,npix,pixwidth,xorigin,normalise,periodic) integer, intent(in) :: igeom,npart,npix(3) real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin(3),pixwidth(3),xorigin(3) real(doub_prec), intent(out), dimension(npix(1),npix(2),npix(3)) :: datsmooth logical, intent(in) :: normalise,periodic(3) real, dimension(npix(1),npix(2),npix(3)) :: datnorm integer :: i,ipix,jpix,kpix,ierr integer :: iprintinterval,iprintnext integer :: ipixmin(3),ipixmax(3) integer :: ipixi,jpixi,kpixi real :: xminpix(3),hmin !,dhmin3 real :: xi(3),xci(3),xcoord(3),hi,hi1,hi21,radkern,wab,q2,const real :: term,termnorm,xpix(3),dx(3) !real :: t_start,t_end logical :: iprintprogress !$ integer :: omp_get_num_threads integer(kind=selected_int_kind(10)) :: iprogress ! up to 10 digits datsmooth = 0. datnorm = 0. if (normalise) then print "(1x,a)",'interpolating from particles to 3D '//trim(labelcoordsys(igeom))//' grid (normalised) ...' else print "(1x,a)",'interpolating from particles to 3D '//trim(labelcoordsys(igeom))//' grid (non-normalised) ...' endif if (any(pixwidth <= 0.)) then print "(1x,a)",'interpolate3D: error: pixel width <= 0' return endif if (any(hh(1:npart) <= tiny(hh))) then print*,'interpolate3D: WARNING: ignoring some or all particles with h < 0' endif ! !--print a progress report if it is going to take a long time ! (a "long time" is, however, somewhat system dependent) ! iprintprogress = (npart >= 100000) .or. (npix(1)*npix(2) > 100000) !$ iprintprogress = .false. ! !--loop over particles ! iprintinterval = 25 if (npart >= 1e6) iprintinterval = 10 iprintnext = iprintinterval ! !--get starting CPU time ! !call cpu_time(t_start) xminpix(:) = xmin(:) - 0.5*pixwidth(:) !print*,' GRID LIMITS (min)',xminpix + 0.5*pixwidth !print*,' GRID LIMITS (max)',xminpix + npix*pixwidth ! !--use a minimum smoothing length on the grid to make ! sure that particles contribute to at least one pixel ! hmin = 0. do i=1,3 if (coord_is_length(i,igeom)) hmin = max(hmin,0.5*pixwidth(i)) enddo const = cnormk3D ! normalisation constant (3D) ! !--loop over particles ! !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,dat,itype,datsmooth,npart) & !$omp shared(xmin,radkernel,radkernel2) & !$omp shared(xminpix,pixwidth,xorigin) & !$omp shared(npix,const,igeom) & !$omp shared(datnorm,normalise,periodic) & !$omp shared(iprintprogress,iprintinterval) & !$omp shared(hmin) & !,dhmin3) & !$omp private(hi,xi,xci,xcoord,xpix,radkern,hi1,hi21) & !$omp private(term,termnorm) & !$omp private(iprogress,iprintnext) & !$omp private(ipixmin,ipixmax,ierr) & !$omp private(ipix,jpix,kpix,ipixi,jpixi,kpixi) & !$omp private(dx,q2,wab) !$omp master !$ print "(1x,a,i3,a)",'Using ',omp_get_num_threads(),' cpus' !$omp end master !$omp do schedule (guided, 2) over_parts: do i=1,npart ! !--report on progress ! if (iprintprogress) then iprogress = 100*i/npart if (iprogress >= iprintnext) then write(*,"('(',i3,'% -',i12,' particles done)')") iprogress,i iprintnext = iprintnext + iprintinterval endif endif ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_parts hi = hh(i) if (hi <= 0.) then cycle over_parts elseif (hi < hmin) then ! !--use minimum h to capture subgrid particles ! (get better results *without* adjusting weights) ! termnorm = const*weight(i) !*(hi*hi*hi)*dhmin3 hi = hmin else termnorm = const*weight(i) endif hi1 = 1./hi hi21 = hi1*hi1 radkern = radkernel*hi ! radius of the smoothing kernel !termnorm = const*weight(i) term = termnorm*dat(i) ! !--set kernel related quantities ! xci(1) = x(i) + xorigin(1) ! xci = position in cartesians xci(2) = y(i) + xorigin(2) xci(3) = z(i) + xorigin(3) call get_pixel_limits(xci,xi,radkern,ipixmin,ipixmax,npix,pixwidth,xmin,periodic,igeom,ierr) !print*,' got particle ',i,' x,y,z = ',xci,' r,phi,z = ',xi,' R=',radkern,' pixel limits = ',& ! (ipixmin(ipix),ipixmax(ipix),ipix=1,3) !read* if (ierr /= 0) cycle over_parts ! !--loop over pixels, adding the contribution from this particle ! do kpix = ipixmin(3),ipixmax(3) kpixi = kpix if (periodic(3)) kpixi = iroll(kpix,npix(3)) xcoord(3) = xminpix(3) + kpix*pixwidth(3) do jpix = ipixmin(2),ipixmax(2) jpixi = jpix if (periodic(2)) jpixi = iroll(jpix,npix(2)) xcoord(2) = xminpix(2) + jpix*pixwidth(2) do ipix = ipixmin(1),ipixmax(1) ipixi = ipix if (periodic(1)) ipixi = iroll(ipix,npix(1)) xcoord(1) = xminpix(1) + ipix*pixwidth(1) !--now transform to get location of pixel in cartesians call coord_transform(xcoord,3,igeom,xpix,3,igeom_cartesian) !--find distances using cartesians and perform interpolation dx = xpix(:) - xci(:) q2 = (dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3))*hi21 ! !--SPH kernel - standard cubic spline ! if (q2 < radkernel2) then wab = wkernel(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipixi,jpixi,kpixi) = datsmooth(ipixi,jpixi,kpixi) + term*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi,kpixi) = datnorm(ipixi,jpixi,kpixi) + termnorm*wab endif endif enddo enddo enddo enddo over_parts !$omp enddo !$omp end parallel ! !--normalise dat array ! if (normalise) then where (datnorm > tiny(datnorm)) datsmooth = datsmooth/datnorm end where endif return end subroutine interpolate3Dgeom subroutine interpolate3Dgeom_vec(igeom,x,y,z,hh,weight,datvec,itype,npart,& xmin,datsmooth,npix,pixwidth,xorigin,normalise,periodic) integer, intent(in) :: igeom,npart,npix(3) real, intent(in), dimension(npart) :: x,y,z,hh,weight real, intent(in), dimension(npart,3) :: datvec integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin(3),pixwidth(3),xorigin(3) real(doub_prec), intent(out), dimension(3,npix(1),npix(2),npix(3)) :: datsmooth logical, intent(in) :: normalise,periodic(3) real(doub_prec), dimension(npix(1),npix(2),npix(3)) :: datnorm integer :: i,ipix,jpix,kpix,ierr integer :: iprintinterval,iprintnext integer :: ipixmin(3),ipixmax(3) integer :: ipixi,jpixi,kpixi real :: xminpix(3),hmin !,dhmin3 real :: xi(3),xci(3),xcoord(3),hi,hi1,hi21,radkern,wab,q2,const real :: term(3),termnorm,xpix(3),dx(3),ddatnorm !real :: t_start,t_end logical :: iprintprogress !$ integer :: omp_get_num_threads integer(kind=selected_int_kind(10)) :: iprogress ! up to 10 digits datsmooth = 0. datnorm = 0. if (normalise) then print "(1x,a)",'interpolating to 3D '//trim(labelcoordsys(igeom))//' grid (normalised) ...' else print "(1x,a)",'interpolating to 3D '//trim(labelcoordsys(igeom))//' grid (non-normalised) ...' endif if (any(pixwidth <= 0.)) then print "(1x,a)",'interpolate3D: error: pixel width <= 0' return endif if (any(hh(1:npart) <= tiny(hh))) then print*,'interpolate3D: WARNING: ignoring some or all particles with h < 0' endif ! !--print a progress report if it is going to take a long time ! (a "long time" is, however, somewhat system dependent) ! iprintprogress = (npart >= 100000) .or. (npix(1)*npix(2) > 100000) !$ iprintprogress = .false. ! !--loop over particles ! iprintinterval = 25 if (npart >= 1e6) iprintinterval = 10 iprintnext = iprintinterval ! !--get starting CPU time ! !call cpu_time(t_start) xminpix(:) = xmin(:) - 0.5*pixwidth(:) ! !--use a minimum smoothing length on the grid to make ! sure that particles contribute to at least one pixel ! hmin = 0. do i=1,3 if (coord_is_length(i,igeom)) hmin = max(hmin,0.5*pixwidth(i)) enddo const = cnormk3D ! normalisation constant (3D) ! !--loop over particles ! !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,datvec,itype,datsmooth,npart) & !$omp shared(xmin,radkernel,radkernel2) & !$omp shared(xminpix,pixwidth,xorigin) & !$omp shared(npix,const,igeom) & !$omp shared(datnorm,normalise,periodic) & !$omp shared(hmin) & !,dhmin3) & !$omp shared(iprintprogress,iprintinterval) & !$omp private(hi,xi,xci,xcoord,xpix,radkern,hi1,hi21) & !$omp private(term,termnorm) & !$omp private(ipixmin,ipixmax,ierr) & !$omp private(iprogress,iprintnext) & !$omp private(ipix,jpix,kpix,ipixi,jpixi,kpixi) & !$omp private(dx,q2,wab) !$omp master !$ print "(1x,a,i3,a)",'Using ',omp_get_num_threads(),' cpus' !$omp end master !$omp do schedule (guided, 2) over_parts: do i=1,npart ! !--report on progress ! if (iprintprogress) then iprogress = 100*i/npart if (iprogress >= iprintnext) then write(*,"('(',i3,'% -',i12,' particles done)')") iprogress,i iprintnext = iprintnext + iprintinterval endif endif ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_parts hi = hh(i) if (hi <= 0.) then cycle over_parts elseif (hi < hmin) then ! !--use minimum h to capture subgrid particles ! (get better results *without* adjusting weights) ! termnorm = const*weight(i) !*(hi*hi*hi)*dhmin3 hi = hmin else termnorm = const*weight(i) endif hi1 = 1./hi hi21 = hi1*hi1 radkern = radkernel*hi ! radius of the smoothing kernel !termnorm = const*weight(i) term(:) = termnorm*datvec(i,:) ! !--set kernel related quantities ! xci(1) = x(i) + xorigin(1) ! xci = position in cartesians xci(2) = y(i) + xorigin(2) xci(3) = z(i) + xorigin(3) call get_pixel_limits(xci,xi,radkern,ipixmin,ipixmax,npix,pixwidth,xmin,periodic,igeom,ierr) if (ierr /= 0) cycle over_parts ! !--loop over pixels, adding the contribution from this particle ! do kpix = ipixmin(3),ipixmax(3) kpixi = kpix if (periodic(3)) kpixi = iroll(kpix,npix(3)) xcoord(3) = xminpix(3) + kpix*pixwidth(3) do jpix = ipixmin(2),ipixmax(2) jpixi = jpix if (periodic(2)) jpixi = iroll(jpix,npix(2)) xcoord(2) = xminpix(2) + jpix*pixwidth(2) do ipix = ipixmin(1),ipixmax(1) ipixi = ipix if (periodic(1)) ipixi = iroll(ipix,npix(1)) xcoord(1) = xminpix(1) + ipix*pixwidth(1) !--now transform to get location of pixel in cartesians call coord_transform(xcoord,3,igeom,xpix,3,igeom_cartesian) !--find distances using cartesians and perform interpolation dx = xpix(:) - xci(:) q2 = (dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3))*hi21 ! !--SPH kernel - standard cubic spline ! if (q2 < radkernel2) then wab = wkernel(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(1,ipixi,jpixi,kpixi) = datsmooth(1,ipixi,jpixi,kpixi) + term(1)*wab !$omp atomic datsmooth(2,ipixi,jpixi,kpixi) = datsmooth(2,ipixi,jpixi,kpixi) + term(2)*wab !$omp atomic datsmooth(3,ipixi,jpixi,kpixi) = datsmooth(3,ipixi,jpixi,kpixi) + term(3)*wab if (normalise) then !$omp atomic datnorm(ipixi,jpixi,kpixi) = datnorm(ipixi,jpixi,kpixi) + termnorm*wab endif endif enddo enddo enddo enddo over_parts !$omp enddo !$omp end parallel ! !--normalise dat array ! if (normalise) then !$omp parallel do default(none) schedule(static) & !$omp shared(datsmooth,datnorm,npix) & !$omp private(kpix,jpix,ipix,ddatnorm) do kpix=1,npix(3) do jpix=1,npix(2) do ipix=1,npix(1) if (datnorm(ipix,jpix,kpix) > tiny(datnorm)) then ddatnorm = 1./datnorm(ipix,jpix,kpix) datsmooth(1,ipix,jpix,kpix) = datsmooth(1,ipix,jpix,kpix)*ddatnorm datsmooth(2,ipix,jpix,kpix) = datsmooth(2,ipix,jpix,kpix)*ddatnorm datsmooth(3,ipix,jpix,kpix) = datsmooth(3,ipix,jpix,kpix)*ddatnorm endif enddo enddo enddo !$omp end parallel do endif end subroutine interpolate3Dgeom_vec !------------------------------------------------------------ ! interface to kernel routine to avoid problems with openMP !----------------------------------------------------------- real function wkernel(q2) use kernels, only:wfunc real, intent(in) :: q2 wkernel = wfunc(q2) end function wkernel !-------------------------------------------------------------------------- ! ! utility routine for use in above routines ! IN: ! xci - coordinates of particle in cartesians ! radkern - radius of kernel (e.g. 2h) ! OUT: ! xi - non-cartesian coordinates of particle (e.g. r, phi, z) ! ipixmin,ipixmax,jpixmin,jpixmax - pixel limits ! !-------------------------------------------------------------------------- subroutine get_pixel_limits(xci,xi,radkern,ipixmin,ipixmax,npix,pixwidth,xmin,periodic,igeom,ierr) use geometry, only:coord_is_periodic,get_coord_limits real, intent(in) :: xci(3),radkern,pixwidth(3),xmin(3) real, intent(out) :: xi(3) integer, intent(out) :: ipixmin(3),ipixmax(3),ierr integer, intent(in) :: igeom,npix(3) logical, intent(in) :: periodic(3) real :: xpixmin(3),xpixmax(3) integer :: i ierr = 0 ! !--get limits of rendering in new coordinate system ! call get_coord_limits(radkern,xci,xi,xpixmin,xpixmax,igeom) !print*,' R min = ',xpixmin(1),' Rmax = ',xpixmax(1) ! !--now work out contributions to pixels in the the transformed space ! do i=1,3 ipixmin(i) = int((xpixmin(i) - xmin(i))/pixwidth(i))+1 if (ipixmin(i) < 1) ierr = ierr + 1 ipixmax(i) = int((xpixmax(i) - xmin(i))/pixwidth(i))+1 if (ipixmax(i) < 1) ierr = ierr + 1 if (.not.periodic(i)) then if (ipixmin(i) < 1) ipixmin(i) = 1 ! make sure they only contribute if (ipixmax(i) > npix(i)) ipixmax(i) = npix(i) ! to pixels in the image endif enddo end subroutine get_pixel_limits end module interpolations3Dgeom danieljprice-splash-4d1f09c/src/interpolate3D_opacity.f90000066400000000000000000000415651477365367100234610ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2024 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module interpolate3D_opacity use projections3D, only:wfromtable,coltable,setup_integratedkernel,have_setup_kernel use kernels, only:radkernel,radkernel2,cnormk3D,wallint use sort, only:indexx use interpolation, only:weight_sink use timing, only:print_time,wall_time implicit none contains !-------------------------------------------------------------------------- ! $Id: interpolate3D_opacity.f90,v 1.16 2007/11/20 17:05:35 dprice Exp $ ! ! subroutine to do a ray trace through the particle data ! ! we use the radiation transport equation along a ray, that is ! the change in intensity from one side of a particle to the other is ! given by: ! ! I_nu = I_nu(0) exp(-tau_i) + S_nu (1 - exp(-tau_i)) ! ! where tau_i is the integrated optical depth through the particle, ! and S_nu is the colour calculated from a colour table for the rendered data. ! We calculate an intensity in red, green and blue for colour plots. ! ! tau_i = kappa \int rho dz ! ! this is calculated using the SPH kernel for rho, so for each pixel ! the optical depth is incremented as the sum ! ! tau_i = kappa \sum_j m_j \int W dz ! ! where \int W dz is the SPH kernel integrated along one spatial dimension. ! This is interpolated from a pre-calculated table (see module projections3D for this). ! ! kappa is the monochromatic mass extinction coefficient ! (particle cross section per unit mass) and is a constant for all particles ! which must be given as input (although see below for calculations of a ! meaningful values for kappa in terms of "surface depth in units of smoothing lengths") ! ! Input: particle coordinates : x,y,z (npart) - note that z is only required for perspective ! particle masses : pmass (npmass) ! smoothing lengths : hh (npart) ! weight : m/(h^3 rho) (not used, but skips particles with w <= 0) ! scalar data to smooth : dat (npart) ! ! Particle masses can be sent in as either a single scalar (npmass = 1) ! or as an array of length npart (npmass=npart) ! ! Settings: zobs, dz1 : settings for 3D projection ! rkappa : particle cross section per unit mass ! ! Output: smoothed data : datsmooth (npixx,npixy) ! optical depth on each pixel : tausmooth (npixx,npixy) ! !-------------------------------------------------------------------------- subroutine interp3D_proj_opacity(x,y,z,pmass,npmass,hh,weight,dat,zorig,itype,npart, & xmin,ymin,datsmooth,tausmooth,npixx,npixy,pixwidthx,pixwidthy,zobserver,dscreenfromobserver, & rkappa,zcut,iverbose,exact_rendering,datv,datvpix,badpix) real, parameter :: pi=4.*atan(1.) integer, intent(in) :: npart,npixx,npixy,npmass,iverbose real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat,zorig,rkappa real, intent(in), dimension(npmass) :: pmass integer, intent(in), dimension(npart) :: itype logical, intent(in) :: exact_rendering real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy,zobserver,dscreenfromobserver,zcut real, dimension(npixx,npixy), intent(out) :: datsmooth,tausmooth ! optional arguments for vector opacity rendering real, dimension(:,:), intent(in), optional :: datv real, dimension(:,:,:), intent(out), optional :: datvpix ! optional argument for checking unresolved pixels in the photosphere real, dimension(npixx,npixy), intent(out), optional :: badpix integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax,nused,nsink integer, dimension(npart) :: iorder integer(kind=selected_int_kind(12)) :: ipart integer :: nsubgrid,nok real :: hi,hi1,hi21,radkern,q2,wab,pmassav !real, dimension(npixx,npixy) :: datnorm real :: hsmooth,dati real :: term,dy,dy2,ypix,zfrac,hav,zcutoff real :: xpixmin,xpixmax,xmax,ypixmin,ypixmax,ymax real :: hmin,hminall,dfac,pixwidthz,pixint,zi,xpixi,zpix real :: fopacity,tau,rkappatemp,xi,yi real :: t_start,t_end,t_used logical :: adjustzperspective,rendersink real, dimension(npixx) :: xpix,dx2i real, allocatable :: datvi(:) real :: xminpix,yminpix character(len=10) :: str logical :: backwards datsmooth = 0. term = 0. tausmooth = 0. if (present(datvpix)) datvpix = 0. if (present(badpix)) badpix = 0. if (pixwidthx <= 0. .or. pixwidthy <= 0) then if (iverbose >= -1) print "(1x,a)",'ERROR: pixel width <= 0' return endif if (any(hh(1:npart) <= tiny(0.))) then if (iverbose > 1) print*,'interpolate3D_opacity: warning: ignoring some or all particles with h < 0' endif !--check that npmass is sensible if (npmass < 1 .or. npmass > npart) then if (iverbose >= -1) print*,'interpolate3D_opacity: ERROR in input number of particle masses ' return endif !--these values for npmass are not sensible but the routine will still work if (npmass /= 1 .and. npmass /= npart) then if (iverbose >= -1) print*,'WARNING: interpolate3D_opacity: number of particle masses input =',npmass endif if (abs(dscreenfromobserver) > tiny(dscreenfromobserver)) then adjustzperspective = .true. zcutoff = zobserver else adjustzperspective = .false. zcutoff = huge(zobserver) endif ! !--whether to raytrace backwards from observer, or forwards to observer ! backwards = .false. if (present(badpix)) backwards = .true. ! !--setup kernel table if not already set ! if (.not.have_setup_kernel) call setup_integratedkernel ! !--kappa is the opacity in units of length^2/mass ! sent as an input parameter as it should be kept constant throughout the simulation ! ! However we compute a reasonable estimate below based on the current plot so that ! we can give the "actual" optical depth for the current frame in terms of number of ! smoothing lengths. This is purely for diagnostic purposes only. ! !--calculate average h hav = sum(hh(1:npart))/real(npart) !--average particle mass pmassav = sum(pmass(1:npmass))/real(npmass) rkappatemp = pi*hav*hav/(pmassav*coltable(0)) str = '' if (exact_rendering) str = '(exact)' if (iverbose >= 0) print "(1x,a,g9.2,a)",'ray tracing '//trim(str)//& ': surface depth ~ ',rkappatemp/maxval(rkappa),' smoothing lengths' ! !--get starting time ! call wall_time(t_start) ! !--first sort the particles in z so that we do the opacity in the correct order ! if (backwards) then call indexx(npart,-z,iorder) ! sort front-to-back else call indexx(npart,z,iorder) ! sort back-to-front endif ! !--store x value for each pixel (for optimisation) ! xminpix = xmin - 0.5*pixwidthx yminpix = ymin - 0.5*pixwidthy xmax = xmin + npixx*pixwidthx ymax = ymin + npixy*pixwidthy do ipix=1,npixx xpix(ipix) = xminpix + ipix*pixwidthx enddo nused = 0 nsink = 0 nsubgrid = 0 nok = 0 hminall = huge(hminall) hmin = 0.5*max(pixwidthx,pixwidthy) if (iverbose >= 0) then write(*,"(a,45x,a)") ' 0% ',' 100%' write(*,"(1x,a)",advance='no') '|' endif !$omp parallel default(none) & !$omp shared(hh,z,x,y,zorig,pmass,dat,datv,weight,itype,datsmooth,npmass,npart) & !$omp shared(xmin,xmax,ymin,ymax,xminpix,yminpix,xpix,pixwidthx,pixwidthy,hmin) & !$omp shared(exact_rendering,backwards,iverbose,radkernel,radkernel2) & !$omp shared(badpix,datvpix) & !$omp shared(npixx,npixy,dscreenfromobserver,zobserver,adjustzperspective) & !$omp shared(zcut,zcutoff,iorder,rkappa,tausmooth) & !$omp private(hi,zfrac,xi,yi,zi,radkern,rendersink) & !$omp private(hi1,hi21,hsmooth,term,dati,datvi,pixwidthz) & !$omp private(ipixmin,ipixmax,jpixmin,jpixmax,xpixmin,xpixmax,ypixmin,ypixmax) & !$omp private(dx2i,q2,xpixi,ypix,zpix,dy,dy2,wab,dfac,pixint) & !$omp private(ipart,i,ipix,jpix,tau,fopacity) & !$omp reduction(+:nused,nsink,nsubgrid,nok) & !$omp reduction(min:hminall) !!$omp do ordered schedule(dynamic) over_particles: do ipart=1,npart ! !--render in order from back to front ! i = iorder(ipart) ! !--skip particles with itype < 0 ! if (itype(i) < 0) cycle over_particles ! !--progress bar ! !$omp single if (iverbose >= 0 .and. mod(ipart,npart/50)==0) then write(*,"('=')",advance='no') endif !$omp end single ! !--skip particles with weight < 0 ! but not if weight == weight_sink (=-1) ! rendersink = .false. if (abs(weight(i) - weight_sink) < tiny(0.)) then rendersink = .true. elseif (weight(i) <= 0.) then cycle over_particles endif ! !--allow slicing [take only particles with z(unrotated) < zcut] ! particle_within_zcut: if (zorig(i) < zcut .and. z(i) < zcutoff) then ! count particles within slice !$omp single nused = nused + 1 !$omp end single ! !--adjust h according to 3D perspective ! need to be careful -- the kernel quantities ! change with z (e.g. radkern, r^2/h^2) ! but *not* the 1/h^2 in tau (because the change in 1/h^2 in tau ! would be cancelled by the corresponding change to h^2 in kappa) ! hi = hh(i) if (hi <= 0.) cycle over_particles !--this is the term which multiplies tau if (npmass==npart) then term = rkappa(i)*pmass(i)/(hh(i)*hh(i)) ! dimensionless else term = rkappa(i)*pmass(1)/(hh(i)*hh(i)) endif ! !--sink particles can have weight set to -1 ! indicating that we should include them in the rendering ! if (rendersink) then dati = dat(i) !pmass(i)/(hh(i)**3) ! define "density" of a sink !$omp single nsink = nsink + 1 !$omp end single else dati = dat(i) endif if (present(datv)) datvi = datv(:,i) ! !--adjust apparent size of particles if 3D perspective set ! if (adjustzperspective) then zfrac = abs(dscreenfromobserver/(z(i)-zobserver)) hi = hi*zfrac endif !--these are the quantities used in the kernel r^2/h^2 radkern = radkernel*hi hi1 = 1./hi hi21 = hi1*hi1 ! !--determine colour contribution of current point ! (work out position in colour table) ! xi = x(i) xpixmin = xi - radkern if (xpixmin > xmax) cycle over_particles xpixmax = xi + radkern if (xpixmax < xmin) cycle over_particles yi = y(i) ypixmin = yi - radkern if (ypixmin > ymax) cycle over_particles ypixmax = yi + radkern if (ypixmax < ymin) cycle over_particles !--take resolution length as max of h and 1/2 pixel width if (.not.exact_rendering .and. hi < hmin) then hminall = min(hi,hminall) !$omp single nsubgrid = nsubgrid + 1 !$omp end single hsmooth = hmin else hsmooth = hi !$omp single nok = nok + 1 !$omp end single endif ! !--quantities for exact 3D wall integrals ! dfac = hi**2/(pixwidthx*pixwidthy) pixwidthz = 2.*radkern ! 3D box bounds entire particle in z direction zi = 0.; zpix = 0. ! ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkern - xmin)/pixwidthx) jpixmin = int((yi - radkern - ymin)/pixwidthy) ipixmax = int((xi + radkern - xmin)/pixwidthx) + 1 jpixmax = int((yi + radkern - ymin)/pixwidthy) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (jpixmin < 1) jpixmin = 1 ! to pixels in the image if (ipixmax > npixx) ipixmax = npixx ! (note that this optimises if (jpixmax > npixy) jpixmax = npixy ! much better than using min/max) ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax dx2i(ipix) = ((xpix(ipix) - xi)**2)*hi21 enddo ! !--loop over pixels, adding the contribution from this particle ! !$omp do schedule(dynamic) do jpix = jpixmin,jpixmax ypix = yminpix + jpix*pixwidthy dy = ypix - yi dy2 = dy*dy*hi21 do ipix = ipixmin,ipixmax q2 = dx2i(ipix) + dy2 ! dx2 pre-calculated; dy2 pre-multiplied by hi21 if (exact_rendering .and. ipixmax-ipixmin <= 10 .and. q2 < radkernel2 + 3.*pixwidthx*pixwidthy*hi21) then xpixi = xminpix + ipix*pixwidthx ! Contribution of the cell walls in the xy-plane pixint = 2.*wallint(0.5*pixwidthz,xi,yi,xpixi,ypix,pixwidthx,pixwidthy,hi) !pixint = pixint + wallint(0.5*pixwidthz,xi,yi,xpixi,ypix,pixwidthx,pixwidthy,hi) ! Contribution of the cell walls in the xz-plane pixint = pixint + wallint(ypix-yi+0.5*pixwidthy,xi,zi,xpixi,zpix,pixwidthx,pixwidthz,hi) pixint = pixint + wallint(yi-ypix+0.5*pixwidthy,xi,zi,xpixi,zpix,pixwidthx,pixwidthz,hi) ! Contribution of the cell walls in the yz-plane pixint = pixint + wallint(xpixi-xi+0.5*pixwidthx,zi,yi,zpix,ypix,pixwidthz,pixwidthy,hi) pixint = pixint + wallint(xi-xpixi+0.5*pixwidthx,zi,yi,zpix,ypix,pixwidthz,pixwidthy,hi) wab = pixint*dfac tau = wab*term tausmooth(ipix,jpix) = tausmooth(ipix,jpix) + tau ! !--render, obscuring previously drawn pixels by relevant amount ! also calculate total optical depth for each pixel ! if (backwards) then fopacity = exp(-tausmooth(ipix,jpix))*tau datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + fopacity*dati if (present(datv)) datvpix(:,ipix,jpix) = datvpix(:,ipix,jpix) + fopacity*datvi(:) if (present(badpix)) then if (tausmooth(ipix,jpix) < 1. .and. tau >= 0.33) badpix(ipix,jpix) = 1 endif else fopacity = 1. - exp(-tau) datsmooth(ipix,jpix) = (1.-fopacity)*datsmooth(ipix,jpix) + fopacity*dati if (present(datv)) datvpix(:,ipix,jpix) = (1.-fopacity)*datvpix(:,ipix,jpix) + fopacity*datvi(:) endif else ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfromtable(q2) tau = wab*term tausmooth(ipix,jpix) = tausmooth(ipix,jpix) + tau ! !--render, obscuring previously drawn pixels by relevant amount ! also calculate total optical depth for each pixel ! if (backwards) then fopacity = exp(-tausmooth(ipix,jpix))*tau datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + fopacity*dati if (present(datv)) datvpix(:,ipix,jpix) = datvpix(:,ipix,jpix) + fopacity*datvi(:) if (present(badpix)) then if (tausmooth(ipix,jpix) < 1. .and. tau >= 0.33) badpix(ipix,jpix) = 1 endif else fopacity = 1. - exp(-tau) datsmooth(ipix,jpix) = (1.-fopacity)*datsmooth(ipix,jpix) + fopacity*dati if (present(datv)) datvpix(:,ipix,jpix) = (1.-fopacity)*datvpix(:,ipix,jpix) + fopacity*datvi(:) endif endif endif enddo enddo !$omp end do endif particle_within_zcut enddo over_particles !$omp end parallel ! !--get ending wall time ! if (iverbose >= 0) print "('|',/)" ! end the progress bar if (nsink > 99) then if (iverbose >= 0) print*,'rendered ',nsink,' sink particles' elseif (nsink > 0) then if (iverbose >= 0) print "(1x,a,i2,a)",'rendered ',nsink,' sink particles' endif call wall_time(t_end) t_used = t_end - t_start if (t_used > 10. .and. iverbose >= 0) call print_time(t_used) if (zcut < huge(zcut) .and. iverbose >= 0) print*,'slice contains ',nused,' of ',npart,' particles' end subroutine interp3D_proj_opacity end module interpolate3D_opacity danieljprice-splash-4d1f09c/src/interpolate3D_proj_geom.f90000066400000000000000000000456351477365367100237740ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2018 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module containing routines required for 3D projections ! in different coordinate systems ! !---------------------------------------------------------------------- module projections3Dgeom use interpolation, only:iroll use projections3D, only:setup_integratedkernel,wfromtable,have_setup_kernel use kernels, only:radkernel,radkernel2 use geometry, only:igeom_cartesian,coord_transform,coord_is_length, & coord_transform_limits,igeom_cylindrical,& get_coord_limits,coord_is_periodic implicit none public :: interpolate3D_proj_geom, interpolate3D_xsec_geom ! public :: interpolate3D_proj_geom_vec character(len=5), parameter :: str = 'cpu s' contains !-------------------------------------------------------------------------- ! subroutine to interpolate from particle data to even grid of pixels ! ! The data is smoothed using the SPH summation interpolant, ! that is, we compute the smoothed array according to ! ! datsmooth(pixel) = sum_b weight_b dat_b W(r-r_b, h_b) ! ! where _b is the quantity at the neighbouring particle b and ! W is the smoothing kernel, for which we use the usual cubic spline ! ! ** This version is for 3D projections in alternative coordinate ! ** systems, e.g. \Int rho d\phi ! ! The (dimensionless) weight for each particle should be ! ! weight = pmass/(rho*h^3) ! ! the interface is written in this form to avoid floating exceptions ! on physically scaled data. ! ! Input: particle coordinates : x,y,z (npart) ! smoothing lengths : hh (npart) ! weight for each particle : weight (npart) ! scalar data to smooth : dat (npart) ! ! Output: smoothed data : datsmooth (npixx,npixy) ! ! Written by Daniel Price July 2011 !-------------------------------------------------------------------------- subroutine interpolate3D_proj_geom(x,y,z,hh,weight,dat,itype,npart, & xmin,ymin,datsmooth,npixx,npixy,pixwidthx,pixwidthy,normalise,igeom,& iplotx,iploty,iplotz,ix,xorigin) use timing, only:wall_time,print_time integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy real, intent(out), dimension(npixx,npixy) :: datsmooth logical, intent(inout) :: normalise integer, intent(in) :: igeom,iplotx,iploty,iplotz integer, dimension(3), intent(in) :: ix real, dimension(3), intent(in) :: xorigin real, dimension(npixx,npixy) :: datnorm integer :: ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax,ip,jp integer :: ixcoord,iycoord,izcoord,ierr,ncpus integer :: iprintinterval, iprintnext !$ integer :: omp_get_num_threads integer(kind=selected_int_kind(10)) :: iprogress,i ! up to 10 digits real, dimension(3) :: xcoord, xpix real, dimension(3), save :: xci, xi !$omp threadprivate(xci,xi) real :: hi,hi1,hi21,radkern,wab,q2,xminpix,yminpix real :: term,termnorm,dx,dx2,dy,dy2,dz real :: xmax,ymax,hmin,horigi real :: t_start,t_end,t_used logical :: iprintprogress,islengthx,islengthy,islengthz character(len=64) :: string datsmooth = 0. datnorm = 0. term = 0. string = 'projecting' if (normalise) then string = trim(string)//' (normalised, non-cartesian)' else string = trim(string)//' (non-cartesian)' endif ncpus = 0 !$omp parallel !$omp master !$ ncpus = omp_get_num_threads() !$omp end master !$omp end parallel if (ncpus > 0) then write (*,"(1x,a,': ',i4,' x ',i4,' on ',i3,' cpus')") trim(string),npixx,npixy,ncpus else write (*,"(1x,a,': ',i4,' x ',i4)") trim(string),npixx,npixy endif if (pixwidthx <= 0. .or. pixwidthy <= 0) then print "(1x,a)",'interpolate3D_proj_geom: error: pixel width <= 0' return endif if (any(hh(1:npart) < 0.)) then print*,'interpolate3D_proj_geom: warning: ignoring some or all particles with h < 0' endif ! !--get information about the coordinates ! call get_coord_info(iplotx,iploty,iplotz,ix(1),igeom,ixcoord,iycoord,izcoord,& islengthx,islengthy,islengthz,ierr) if (ierr /= 0) return ! !--if z coordinate is not a length, use normalised interpolation ! (e.g. azimuthally averaged density) ! !if (.not.islengthz) normalise = .true. ! !--check column density table has actually been setup ! if (.not.have_setup_kernel) call setup_integratedkernel ! !--print a progress report if it is going to take a long time ! (a "long time" is, however, somewhat system dependent) ! iprintprogress = (npart >= 100000) .or. (npixx*npixy > 100000) !$ iprintprogress = .false. ! !--loop over particles ! iprintinterval = 25 if (npart >= 1e6) iprintinterval = 10 iprintnext = iprintinterval ! !--get starting CPU time ! call wall_time(t_start) xminpix = xmin - 0.5*pixwidthx yminpix = ymin - 0.5*pixwidthy xmax = xmin + npixx*pixwidthx ymax = ymin + npixy*pixwidthy ! !--use a minimum smoothing length on the grid to make ! sure that particles contribute to at least one pixel ! hmin = 0. if (islengthx) hmin = 0.5*pixwidthx if (islengthy) hmin = max(hmin,0.5*pixwidthy) !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,dat,itype,datsmooth,npart,hmin) & !$omp shared(xmin,ymin,xmax,ymax,xminpix,yminpix,pixwidthx,pixwidthy) & !$omp shared(npixx,npixy,ixcoord,iycoord,izcoord,islengthx,islengthy,islengthz,igeom) & !$omp shared(datnorm,normalise,radkernel,radkernel2,xorigin) & !$omp shared(iprintprogress,iprintinterval) & !$omp private(hi,horigi,radkern) & !$omp private(hi1,hi21,term,termnorm) & !$omp private(iprogress) & !$omp firstprivate(iprintnext) & !$omp private(q2,dx,dx2,dy,dy2,dz,wab,xcoord,xpix) & !$omp private(i,ipix,jpix,ip,jp,ipixmin,ipixmax,jpixmin,jpixmax,ierr) !$omp do schedule (guided, 2) over_particles: do i=1,npart ! !--report on progress ! if (iprintprogress) then iprogress = 100*i/npart if (iprogress >= iprintnext) then write(*,"('(',i3,'% -',i12,' particles done)')") iprogress,i iprintnext = iprintnext + iprintinterval endif endif ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_particles ! !--set h related quantities ! horigi = hh(i) if (horigi <= 0.) cycle over_particles hi = max(horigi,hmin) radkern = radkernel*hi ! radius of the smoothing kernel ! !--get limits of contribution from particle in cartesian space ! xci(1) = x(i) + xorigin(1) ! xci = position in cartesians xci(2) = y(i) + xorigin(2) xci(3) = z(i) + xorigin(3) call get_pixel_limits(xci,xi,radkern,ipixmin,ipixmax,jpixmin,jpixmax,igeom,& npixx,npixy,pixwidthx,pixwidthy,xmin,ymin,ixcoord,iycoord,ierr) if (ierr /= 0) cycle over_particles ! !--set kernel related quantities ! hi1 = 1./hi hi21 = hi1*hi1 ! h gives the z length scale (NB: no perspective) if (islengthz) then termnorm = weight(i)*horigi elseif (igeom==igeom_cylindrical) then termnorm = weight(i) !*atan(radkern/xi(ixcoord))/pi !*horigi/xi(ixcoord) else termnorm = weight(i) endif term = termnorm*dat(i) ! !--loop over pixels, adding the contribution from this particle ! if (islengthz) then xcoord(izcoord) = xi(izcoord) ! assume all pixels at same r as particlefor theta-phi else xcoord(izcoord) = 0. ! use phi=0 so get x = r cos(phi) = r endif do jpix = jpixmin,jpixmax jp = iroll(jpix,npixy) xcoord(iycoord) = yminpix + jp*pixwidthy do ipix = ipixmin,ipixmax ip = iroll(ipix,npixx) xcoord(ixcoord) = xminpix + ip*pixwidthx !--now transform to get location of pixel in cartesians call coord_transform(xcoord,3,igeom,xpix,3,igeom_cartesian) !--find distances using cartesians and perform interpolation dy = xpix(iycoord) - xci(iycoord) dx = xpix(ixcoord) - xci(ixcoord) dz = xpix(izcoord) - xci(izcoord) ! z dir important if surface not flat (e.g. r slice) dx2 = dx*dx dy2 = dy*dy q2 = (dx2 + dy2 +dz*dz)*hi21 ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfromtable(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ip,jp) = datsmooth(ip,jp) + term*wab if (normalise) then !$omp atomic datnorm(ip,jp) = datnorm(ip,jp) + termnorm*wab endif endif !endif enddo enddo enddo over_particles !$omp enddo !$omp end parallel ! !--normalise dat array ! if (normalise) then !--normalise everywhere (required if not using SPH weighting) where (datnorm > tiny(datnorm)) datsmooth = datsmooth/datnorm end where endif ! !--get/print timings ! call wall_time(t_end) t_used = t_end - t_start if (t_used > 5.) call print_time(t_used) end subroutine interpolate3D_proj_geom !-------------------------------------------------------------------------- ! ! ** In this version 3D data is interpolated to a single 2D cross section ! ! ** Note that the cross section is always taken in the z co-ordinate ! ** so should submit the appropriate arrays as x, y and z. ! ! Input: particle coordinates : x1,x2,x3 (npart) ! particle masses : pmass (npart) ! density on particles : rho (npart) - must be computed separately ! smoothing lengths : hh (npart) - could be computed from density ! scalar data to smooth : dat (npart) ! cross section location: zslice ! ! Output: smoothed data : datsmooth (npixx,npixy) ! ! Daniel Price, Monash University 2nd May 2017 !-------------------------------------------------------------------------- subroutine interpolate3D_xsec_geom(x,y,z,hh,weight,dat,itype,npart,& xmin,ymin,zslice,datsmooth,npixx,npixy,pixwidthx,pixwidthy,normalise,igeom, & iplotx,iploty,iplotz,ix,xorigin) use kernels, only:cnormk3D,wfunc integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy,zslice real, intent(out), dimension(npixx,npixy) :: datsmooth logical, intent(in) :: normalise integer, intent(in) :: igeom,iplotx,iploty,iplotz integer, dimension(3), intent(in) :: ix real, dimension(3), intent(in) :: xorigin real, dimension(npixx,npixy) :: datnorm integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax,ip,jp integer :: ixcoord,iycoord,izcoord,ierr real :: hi,hi1,radkern,q2,wab,const,hi21 real :: termnorm,term,dx,dx2,dy,dy2,dz,dz2 real :: xmax,ymax,xminpix,yminpix real, dimension(3) :: xcoord,xpix,xci,xi logical :: islengthx,islengthy,islengthz datsmooth = 0. datnorm = 0. if (normalise) then print*,'taking fast cross section (normalised, non-cartesian)...',zslice else print*,'taking fast cross section (non-cartesian)...',zslice endif if (pixwidthx <= 0. .or. pixwidthy <= 0.) then print*,'interpolate3D_xsec: error: pixel width <= 0' return elseif (npart <= 0) then print*,'interpolate3D_xsec: error: npart = 0' return endif if (any(hh(1:npart) < 0.)) then print*,'interpolate3D_xsec_geom: WARNING: ignoring some or all particles with h < 0' endif const = cnormk3D ! !--get information about the coordinates ! call get_coord_info(iplotx,iploty,iplotz,ix(1),igeom,ixcoord,iycoord,izcoord,& islengthx,islengthy,islengthz,ierr) if (ierr /= 0) return ! !--if z coordinate is not a length, quit ! if (.not.islengthz) then print*,'interpolate3D_xsec_geom: ERROR xsec not implemented when z is an angle' return endif xminpix = xmin - 0.5*pixwidthx yminpix = ymin - 0.5*pixwidthy xmax = xmin + npixx*pixwidthx ymax = ymin + npixy*pixwidthy ! !--loop over particles ! over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_parts ! !--set h related quantities ! hi = hh(i) if (hi <= 0.) cycle over_parts !horigi = hh(i) !if (horigi <= 0.) cycle over_parts !hi = max(horigi,hmin) radkern = radkernel*hi ! radius of the smoothing kernel ! !--set kernel related quantities ! hi1 = 1./hi hi21 = hi1*hi1 ! !--for each particle, work out distance from the cross section slice. ! dz = zslice - z(i) dz2 = dz**2 xcoord(izcoord) = 1. ! !--if this is < 2h then add the particle's contribution to the pixels ! otherwise skip all this and start on the next particle ! if (dz2 < radkernel2) then ! !--get limits of contribution from particle in cartesian space ! xci(1) = x(i) + xorigin(1) xci(2) = y(i) + xorigin(2) xci(3) = z(i) + xorigin(3) call get_pixel_limits(xci,xi,radkern,ipixmin,ipixmax,jpixmin,jpixmax,igeom,& npixx,npixy,pixwidthx,pixwidthy,xmin,ymin,ixcoord,iycoord,ierr) if (ierr /= 0) cycle over_parts termnorm = const*weight(i) term = termnorm*dat(i) !/rescalefac ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax jp = iroll(jpix,npixy) xcoord(iycoord) = yminpix + jp*pixwidthy do ipix = ipixmin,ipixmax ip = iroll(ipix,npixx) xcoord(ixcoord) = xminpix + ip*pixwidthx !--now transform to get location of pixel in cartesians call coord_transform(xcoord,3,igeom,xpix,3,igeom_cartesian) !--find distances using cartesians and perform interpolation dy = xpix(iycoord) - xci(iycoord) dx = xpix(ixcoord) - xci(ixcoord) dx2 = dx*dx dy2 = dy*dy q2 = (dx*dx + dy*dy + dz2)*hi1*hi1 ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfunc(q2) ! !--calculate data value at this pixel using the summation interpolant ! datsmooth(ip,jp) = datsmooth(ip,jp) + term*wab if (normalise) then datnorm(ip,jp) = datnorm(ip,jp) + termnorm*wab endif endif enddo enddo endif ! if particle within 2h of slice enddo over_parts ! over particles ! !--normalise dat array ! if (normalise) then !--normalise everywhere (required if not using SPH weighting) where (datnorm > tiny(datnorm)) datsmooth = datsmooth/datnorm end where endif !datsmooth = datsmooth*rescalefac end subroutine interpolate3D_xsec_geom !-------------------------------------------------------------------------- ! ! utility routine for use in above routines ! !-------------------------------------------------------------------------- subroutine get_coord_info(iplotx,iploty,iplotz,ix1,igeom,ixcoord,iycoord,izcoord,& islengthx,islengthy,islengthz,ierr) integer, intent(in) :: iplotx,iploty,iplotz,ix1,igeom integer, intent(out) :: ixcoord,iycoord,izcoord,ierr logical, intent(out) :: islengthx,islengthy,islengthz ierr = 0 ! !--get plotted coordinates in range 1->ndim ! ixcoord = iplotx - ix1 + 1 iycoord = iploty - ix1 + 1 izcoord = iplotz - ix1 + 1 if (ixcoord <= 0 .or. ixcoord > 3) then print*,' ERROR finding x coordinate offset, cannot render' ierr = 1 endif if (iycoord <= 0 .or. iycoord > 3) then print*,' ERROR finding y coordinate offset, cannot render' ierr = 2 endif if (izcoord <= 0 .or. izcoord > 3) then print*,' ERROR finding y coordinate offset, cannot render' ierr = 3 endif ! !--check if coordinate is a length (i.e., not an angle) ! islengthx = coord_is_length(ixcoord,igeom) islengthy = coord_is_length(iycoord,igeom) islengthz = coord_is_length(izcoord,igeom) end subroutine get_coord_info !-------------------------------------------------------------------------- ! ! utility routine for use in above routines ! IN: ! xci - coordinates of particle in transformed space (e.g. r, phi, z) ! radkern - radius of kernel (e.g. 2h) ! OUT: ! xi - cartesian coordinates of particle ! ipixmin,ipixmax,jpixmin,jpixmax - pixel limits ! !-------------------------------------------------------------------------- subroutine get_pixel_limits(xci,xi,radkern,ipixmin,ipixmax,jpixmin,jpixmax,igeom,& npixx,npixy,pixwidthx,pixwidthy,xmin,ymin,ixcoord,iycoord,ierr) real, intent(in) :: xci(3),radkern,pixwidthx,pixwidthy,xmin,ymin real, intent(out) :: xi(3) integer, intent(out) :: ipixmin,ipixmax,jpixmin,jpixmax,ierr integer, intent(in) :: igeom,npixx,npixy,ixcoord,iycoord real :: xpixmin(3),xpixmax(3) ierr = 0 ! !--get limits of rendering in new coordinate system ! call get_coord_limits(radkern,xci,xi,xpixmin,xpixmax,igeom) ! !--now work out contributions to pixels in the the transformed space ! ipixmax = int((xpixmax(ixcoord) - xmin)/pixwidthx)+1 if (ipixmax < 1) ierr = 1 jpixmax = int((xpixmax(iycoord) - ymin)/pixwidthy)+1 if (jpixmax < 1) ierr = 2 ipixmin = int((xpixmin(ixcoord) - xmin)/pixwidthx) if (ipixmin > npixx) ierr = 3 jpixmin = int((xpixmin(iycoord) - ymin)/pixwidthy) if (jpixmin > npixy) ierr = 4 if (.not.coord_is_periodic(ixcoord,igeom)) then if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (ipixmax > npixx) ipixmax = npixx ! to pixels in the image endif if (.not.coord_is_periodic(iycoord,igeom)) then if (jpixmin < 1) jpixmin = 1 ! (note that this optimises if (jpixmax > npixy) jpixmax = npixy ! much better than using min/max) endif end subroutine get_pixel_limits end module projections3Dgeom danieljprice-splash-4d1f09c/src/interpolate3D_projection.f90000066400000000000000000001032571477365367100241620ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2017 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module containing all of the routines required for 3D projections ! (where rendered quantity is integrated along the line of sight) ! !---------------------------------------------------------------------- module projections3D implicit none integer, parameter :: maxcoltable = 1000 real, dimension(0:maxcoltable) :: coltable real, private :: dq2table = 4./maxcoltable real, private :: ddq2table = maxcoltable/4. public :: setup_integratedkernel public :: interpolate3D_projection,interpolate3D_proj_points public :: interpolate3D_proj_vec,interp3D_proj_vec_synctron public :: wfromtable public :: coltable logical, public :: have_setup_kernel = .false. private contains subroutine setup_integratedkernel !------------------------------------------------------------- ! tabulates the integral through the cubic spline kernel ! tabulated in (r/h)**2 so that sqrt is not necessary !------------------------------------------------------------- use kernels, only:wfunc,radkernel2,cnormk3D,select_kernel integer :: i,j real :: rxy2,deltaz,dz,z,q2,wkern,coldens integer, parameter :: npts = 100 ! force cubic kernel if not already set if (.not.associated(wfunc)) call select_kernel(0) have_setup_kernel = .true. !print "(1x,a)",'setting up integrated kernel table...' dq2table = radkernel2/maxcoltable ddq2table = 1./dq2table do i=0,maxcoltable-1 ! !--tabulate for (cylindrical) r**2 between 0 and radkernel**2 ! rxy2 = i*dq2table ! !--integrate z between 0 and sqrt(radkernel^2 - rxy^2) ! deltaz = sqrt(radkernel2 - rxy2) dz = deltaz/real(npts-1) coldens = 0. if (isnan(deltaz)) print "(a)",'WARNING: NaN in kernel table setup' do j=1,npts z = (j-1)*dz q2 = rxy2 + z*z wkern = wfunc(q2) if (j==1 .or. j==npts) then coldens = coldens + 0.5*wkern*dz ! trapezoidal rule else coldens = coldens + wkern*dz endif enddo coltable(i)=2.0*coldens*cnormk3D enddo coltable(maxcoltable) = 0. return end subroutine setup_integratedkernel ! ! This function interpolates from the table of integrated kernel values ! to give w(q) ! real function wfromtable(q2) real, intent(in) :: q2 real :: dxx,dwdx integer :: index, index1 ! !--find nearest index in table ! index = max(int(q2*ddq2table),0) ! the max prevents seg faults on NaNs for q2 !index = min(index,maxcoltable) ! should be unnecessary if q2 < radkernel checked index1 = min(index + 1,maxcoltable) ! !--find increment along from this index ! dxx = q2 - index*dq2table ! !--find gradient ! dwdx = (coltable(index1) - coltable(index))*ddq2table ! !--compute value of integrated kernel ! wfromtable = coltable(index) + dwdx*dxx end function wfromtable !-------------------------------------------------------------------------- ! subroutine to interpolate from particle data to even grid of pixels ! ! The data is smoothed using the SPH summation interpolant, ! that is, we compute the smoothed array according to ! ! datsmooth(pixel) = sum_b weight_b dat_b W(r-r_b, h_b) ! ! where _b is the quantity at the neighbouring particle b and ! W is the smoothing kernel, for which we use the usual cubic spline ! ! ** In this version 3D data is interpolated to a 2D grid by use of an ! ** integrated form of the kernel (that is W_ab in this case is ! ** the integral through the 3D kernel to give a 2D kernel) ! ** This results in a column density map of the interpolated quantity ! ** From a similar routine by Matthew Bate. ! ! The (dimensionless) weight for each particle should be ! ! weight = pmass/(rho*h^3) ! ! the interface is written in this form to avoid floating exceptions ! on physically scaled data. ! ! Input: particle coordinates : x,y,z (npart) - note that z is only required for perspective ! smoothing lengths : hh (npart) ! weight for each particle : weight (npart) ! scalar data to smooth : dat (npart) ! ! Output: smoothed data : datsmooth (npixx,npixy) ! ! Written by Daniel Price September 2003 ! 3D perspective added Nov 2005 !-------------------------------------------------------------------------- subroutine interpolate3D_projection(x,y,z,hh,weight,dat,itype,npart, & xmin,ymin,datsmooth,npixx,npixy,pixwidthx,pixwidthy,normalise,zobserver,dscreen, & useaccelerate,exact_rendering,iverbose) use kernels, only:radkernel,radkernel2,cnormk3D,wallint,soft_func use timing, only:wall_time,print_time integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy,zobserver,dscreen real, intent(out), dimension(npixx,npixy) :: datsmooth logical, intent(in) :: normalise real, dimension(npixx,npixy) :: datnorm logical, intent(in) :: useaccelerate,exact_rendering integer, intent(in) :: iverbose real :: row(npixx) integer :: ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax,npixpartx,npixparty integer :: iprintinterval, iprintnext,ipixi,jpixi,jpixcopy integer :: nsubgrid,nfull,nok,ncpus !$ integer :: omp_get_num_threads integer(kind=selected_int_kind(10)) :: iprogress,i ! up to 10 digits real :: hi,hi1,hi21,radkern,wab,q2,xi,yi,xminpix,yminpix real :: term,termnorm,dy,dy2,ypix,zfrac,hsmooth,horigi real :: xpixmin,xpixmax,xmax,ypixmin,ypixmax,ymax real :: hmin,fac,hminall,dfac,pixwidthz,pixint,zi,xpixi,zpix,term_exact,termnorm_exact real, dimension(npixx) :: xpix,dx2i real :: t_start,t_end,t_used,datnorm_min logical :: iprintprogress,use3Dperspective,accelerate character(len=32) :: string datsmooth = 0. term = 0. datnorm_min = huge(0.) string = 'projecting' if (normalise) then string = trim(string)//' (normalised)' datnorm = 0. elseif (useaccelerate) then string = trim(string)//' (fast)' elseif (exact_rendering) then string = trim(string)//' (exact/Petkova)' endif ncpus = 0 !$omp parallel !$omp master !$ ncpus = omp_get_num_threads() !$omp end master !$omp end parallel if (ncpus > 0 .and. iverbose >= 0) then write (*,"(1x,a,': ',i4,' x ',i4,' on ',i3,' cpus')") trim(string),npixx,npixy,ncpus elseif (iverbose >= 0) then write (*,"(1x,a,': ',i4,' x ',i4)") trim(string),npixx,npixy endif if (pixwidthx <= 0. .or. pixwidthy <= 0) then if (iverbose >= -1) print "(1x,a)",'ERROR: pixel width <= 0' return endif !nout = count(hh(1:npart) <= 0.) !if (nout > 0) then ! print*,'interpolate3D_projection: warning: ignoring ',nout,' particles with h <= 0' !endif ! !--check column density table has actually been setup ! if (.not.have_setup_kernel) call setup_integratedkernel ! !--print a progress report if it is going to take a long time ! (a "long time" is, however, somewhat system dependent) ! iprintprogress = (npart >= 100000) .or. (npixx*npixy > 100000) .and. iverbose >= 0 !$ iprintprogress = .false. ! !--loop over particles ! iprintinterval = 25 if (npart >= 1e6) iprintinterval = 10 iprintnext = iprintinterval use3Dperspective = abs(dscreen) > tiny(dscreen) ! !--get starting CPU time ! call wall_time(t_start) xminpix = xmin - 0.5*pixwidthx yminpix = ymin - 0.5*pixwidthy xmax = xmin + npixx*pixwidthx ymax = ymin + npixy*pixwidthy ! !--use a minimum smoothing length on the grid to make ! sure that particles contribute to at least one pixel ! hmin = 0.5*max(pixwidthx,pixwidthy) !dhmin3 = 1./(hmin*hmin*hmin) ! !--store x value for each pixel (for optimisation) ! do ipix=1,npixx xpix(ipix) = xminpix + ipix*pixwidthx enddo nsubgrid = 0 nok = 0 hminall = huge(hminall) !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,dat,itype,npart,iprintprogress,iprintinterval) & !$omp shared(xmin,ymin,xmax,ymax,xminpix,yminpix,xpix,pixwidthx,pixwidthy) & !$omp shared(npixx,npixy,dscreen,zobserver,use3dperspective,useaccelerate) & !$omp shared(normalise,radkernel,radkernel2,datsmooth,datnorm,cnormk3D,exact_rendering) & !$omp firstprivate(hmin) & !,dhmin3) & !$omp private(hi,zfrac,xi,yi,radkern,xpixmin,xpixmax,ypixmin,ypixmax) & !$omp private(hsmooth,horigi,hi1,hi21,term,termnorm,npixpartx,npixparty,jpixi,ipixi) & !$omp private(ipixmin,ipixmax,jpixmin,jpixmax,accelerate) & !$omp private(dx2i,row,q2,ypix,dy,dy2,wab,termnorm_exact,term_exact) & !$omp private(i,ipix,jpix,jpixcopy,fac,dfac,pixwidthz,pixint,zi,xpixi,zpix) & !$omp private(iprogress) & !$omp firstprivate(iprintnext) & !$omp reduction(+:nsubgrid,nok) & !$omp reduction(min:hminall) !$omp do schedule (guided, 2) over_particles: do i=1,npart ! !--report on progress ! if (iprintprogress) then iprogress = 100*i/npart if (iprogress >= iprintnext) then write(*,"('(',i3,'% -',i12,' particles done)')") iprogress,i iprintnext = iprintnext + iprintinterval endif endif ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_particles ! !--set h related quantities ! hi = hh(i) horigi = hi if (hi <= 0.) then cycle over_particles elseif (use3Dperspective) then if (z(i) > zobserver) cycle over_particles zfrac = abs(dscreen/(z(i)-zobserver)) hi = hi*zfrac endif radkern = radkernel*hi ! radius of the smoothing kernel !--cycle as soon as we know the particle does not contribute xi = x(i) xpixmin = xi - radkern if (xpixmin > xmax) cycle over_particles xpixmax = xi + radkern if (xpixmax < xmin) cycle over_particles yi = y(i) ypixmin = yi - radkern if (ypixmin > ymax) cycle over_particles ypixmax = yi + radkern if (ypixmax < ymin) cycle over_particles !--take resolution length as max of h and 1/2 pixel width if (.not.exact_rendering .and. hi < hmin) then hminall = min(hi,hminall) nsubgrid = nsubgrid + 1 hsmooth = hmin fac = 1. !(horigi*horigi*horigi)*dhmin3 ! factor by which to adjust the weight else fac = 1. hsmooth = hi nok = nok + 1 endif radkern = radkernel*hsmooth ! !--set kernel related quantities ! hi1 = 1./hsmooth hi21 = hi1*hi1 termnorm = weight(i)*fac*horigi term = termnorm*dat(i) ! h gives the z length scale (NB: no perspective) ! !--quantities for exact 3D wall integrals ! dfac = horigi**3/(pixwidthx*pixwidthy*cnormk3D) termnorm_exact = cnormk3D*weight(i) term_exact = termnorm_exact*dat(i) pixwidthz = 2.*radkern zi = 0.; zpix = 0. ! !--for each particle work out which pixels it contributes to ! npixpartx = int(radkern/pixwidthx) + 1 npixparty = int(radkern/pixwidthy) + 1 jpixi = int((yi-ymin)/pixwidthy) + 1 ipixi = int((xi-xmin)/pixwidthx) + 1 ipixmin = ipixi - npixpartx ipixmax = ipixi + npixpartx jpixmin = jpixi - npixparty jpixmax = jpixi + npixparty ! !--loop over pixels, adding the contribution from this particle ! copy by quarters if all pixels within domain ! accelerate = useaccelerate .and. (.not.normalise) & .and. npixpartx > 5 .and. npixparty > 5 & .and. ipixmin >= 1 .and. ipixmax <= npixx & .and. jpixmin >= 1 .and. jpixmax <= npixy if (accelerate) then !--adjust xi, yi to centre of pixel xi = xminpix + ipixi*pixwidthx yi = yminpix + jpixi*pixwidthy ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax dx2i(ipix) = ((xpix(ipix) - xi)**2)*hi21 enddo do jpix = jpixi,jpixmax ypix = yminpix + jpix*pixwidthy dy = ypix - yi dy2 = dy*dy*hi21 do ipix = ipixi,ipixmax q2 = dx2i(ipix) + dy2 ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfromtable(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + term*wab row(ipix) = term*wab else row(ipix) = 0. endif enddo !--NB: the following actions can and should be vectorized (but I don't know how...) !--copy top right -> top left do ipix=ipixmin,ipixi-1 !$omp atomic datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + row(ipixmax-(ipix-ipixmin)) enddo if (jpix /= jpixi) then jpixcopy = jpixi - (jpix-jpixi) !--copy top right -> bottom left do ipix=ipixmin,ipixi-1 !$omp atomic datsmooth(ipix,jpixcopy) = datsmooth(ipix,jpixcopy) + row(ipixmax-(ipix-ipixmin)) enddo !--copy top right -> bottom right do ipix=ipixi,ipixmax !$omp atomic datsmooth(ipix,jpixcopy) = datsmooth(ipix,jpixcopy) + row(ipix) enddo endif enddo else ipixmin = int((xi - radkern - xmin)/pixwidthx) ipixmax = int((xi + radkern - xmin)/pixwidthx) + 1 jpixmin = int((yi - radkern - ymin)/pixwidthy) jpixmax = int((yi + radkern - ymin)/pixwidthy) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (jpixmin < 1) jpixmin = 1 ! to pixels in the image if (ipixmax > npixx) ipixmax = npixx ! (note that this optimises if (jpixmax > npixy) jpixmax = npixy ! much better than using min/max) ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax dx2i(ipix) = ((xpix(ipix) - xi)**2)*hi21 enddo do jpix = jpixmin,jpixmax ypix = yminpix + jpix*pixwidthy dy = ypix - yi dy2 = dy*dy*hi21 do ipix = ipixmin,ipixmax q2 = dx2i(ipix) + dy2 ! dx2 pre-calculated; dy2 pre-multiplied by hi21 if (exact_rendering .and. ipixmax-ipixmin <= 2 .and. q2 < radkernel2 + 3.*pixwidthx*pixwidthy*hi21) then xpixi = xminpix + ipix*pixwidthx ! Contribution of the cell walls in the xy-plane pixint = 2.*wallint(0.5*pixwidthz,xi,yi,xpixi,ypix,pixwidthx,pixwidthy,hi) !pixint = pixint + wallint(0.5*pixwidthz,xi,yi,xpixi,ypix,pixwidthx,pixwidthy,hi) ! Contribution of the cell walls in the xz-plane pixint = pixint + wallint(ypix-yi+0.5*pixwidthy,xi,zi,xpixi,zpix,pixwidthx,pixwidthz,hi) pixint = pixint + wallint(yi-ypix+0.5*pixwidthy,xi,zi,xpixi,zpix,pixwidthx,pixwidthz,hi) ! Contribution of the cell walls in the yz-plane pixint = pixint + wallint(xpixi-xi+0.5*pixwidthx,zi,yi,zpix,ypix,pixwidthz,pixwidthy,hi) pixint = pixint + wallint(xi-xpixi+0.5*pixwidthx,zi,yi,zpix,ypix,pixwidthz,pixwidthy,hi) wab = pixint*dfac ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + term_exact*wab if (normalise) then !$omp atomic datnorm(ipix,jpix) = datnorm(ipix,jpix) + termnorm_exact*wab endif else ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfromtable(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + term*wab if (normalise) then !$omp atomic datnorm(ipix,jpix) = datnorm(ipix,jpix) + termnorm*wab endif endif endif enddo enddo endif enddo over_particles !$omp enddo !$omp end parallel ! !--normalise dat array ! if (normalise) then !--normalise everywhere (required if not using SPH weighting) !where (datnorm > tiny(datnorm)) ! datsmooth = datsmooth/(datnorm) !end where ! ! compute the minimum possible value for datnorm, then multiply ! with a kernel-softened version of 1/x to avoid dividing by zero ! datnorm_min = minval(weight*hh,mask=(weight > tiny(0.))) datsmooth = datsmooth*soft_func(datnorm,datnorm_min) endif ! !--warn about subgrid interpolation ! if (nsubgrid > 1) then nfull = int((xmax-xmin)/(hminall)) + 1 if (nsubgrid > 0.1*nok .and. iverbose >= -1) print "(a,i9,a,/,a,i6,a)",& ' Warning: pixel size > 2h for ',nsubgrid,' particles', & ' need',nfull,' pixels for full resolution' endif ! !--get/print timings ! call wall_time(t_end) t_used = t_end - t_start if (t_used > 10. .and. iverbose >= 0) call print_time(t_used) return end subroutine interpolate3D_projection !-------------------------------------------------------------------------- ! ! Same as previous but for a vector quantity ! ! Input: particle coordinates : x,y (npart) ! smoothing lengths : hh (npart) ! weight for each particle : weight (npart) ! vector data to smooth : vecx (npart) ! vecy (npart) ! ! Output: smoothed vector field : vecsmoothx (npixx,npixy) ! : vecsmoothy (npixx,npixy) ! ! Daniel Price 23/12/04 !-------------------------------------------------------------------------- subroutine interpolate3D_proj_vec(x,y,z,hh,weight,vecx,vecy,itype,npart,& xmin,ymin,vecsmoothx,vecsmoothy,npixx,npixy,pixwidthx,pixwidthy,normalise,& zobserver,dscreen,iverbose) use kernels, only:radkernel,radkernel2 integer, intent(in) :: npart,npixx,npixy,iverbose real, intent(in), dimension(npart) :: x,y,z,hh,weight,vecx,vecy integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy,zobserver,dscreen real, intent(out), dimension(npixx,npixy) :: vecsmoothx, vecsmoothy logical, intent(in) :: normalise real, dimension(:,:), allocatable :: datnorm integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax,ierr real :: hi,hi1,hi21,radkern,q2,wab,rab2,const,zfrac,hsmooth real :: termx,termy,termnorm,dx,dy,dy2,xpix,ypix vecsmoothx = 0. vecsmoothy = 0. termx = 0. termy = 0. if (normalise) then if (iverbose >= 0) print "(1x,a)",'projecting vector (normalised) from particles to pixels...' allocate(datnorm(npixx,npixy),stat=ierr) if (ierr /= 0) then if (iverbose >= -1) print "(a)",'interpolate3D_proj_vec: error allocating memory' return endif datnorm = 0. else if (iverbose >= 0) print "(1x,a)",'projecting vector from particles to pixels...' endif if (pixwidthx <= 0. .or. pixwidthy <= 0.) then if (iverbose >= -1) print "(a)",'interpolate3D_proj_vec: error: pixel width <= 0' return endif ! !--loop over particles ! !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,vecx,vecy,itype,vecsmoothx,vecsmoothy,npart) & !$omp shared(xmin,ymin,pixwidthx,pixwidthy,zobserver,dscreen,datnorm) & !$omp shared(npixx,npixy,normalise,radkernel,radkernel2) & !$omp private(hi,radkern,const,zfrac,ypix,xpix) & !$omp private(hsmooth,hi1,hi21,termx,termy,termnorm) & !$omp private(ipixmin,ipixmax,jpixmin,jpixmax) & !$omp private(dy,dy2,dx,rab2,q2,wab) & !$omp private(i,ipix,jpix) !$omp do schedule(guided, 2) over_particles: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_particles ! !--set kernel related quantities ! hi = hh(i) const = weight(i)*hi ! h gives the z length scale (NB: no perspective) if (hi <= 0.) then cycle over_particles elseif (abs(dscreen) > tiny(dscreen)) then if (z(i) > zobserver) cycle over_particles zfrac = abs(dscreen/(z(i)-zobserver)) hi = hi*zfrac endif !--take resolution length as max of h and 1/2 pixel width hsmooth = max(hi,0.5*min(pixwidthx,pixwidthy)) radkern = radkernel*hsmooth ! radius of the smoothing kernel hi1 = 1./hsmooth hi21 = hi1*hi1 termx = const*vecx(i) termy = const*vecy(i) termnorm = const ! !--for each particle work out which pixels it contributes to ! ipixmin = int((x(i) - radkern - xmin)/pixwidthx) jpixmin = int((y(i) - radkern - ymin)/pixwidthy) ipixmax = int((x(i) + radkern - xmin)/pixwidthx) + 1 jpixmax = int((y(i) + radkern - ymin)/pixwidthy) + 1 ! PRINT*,'particle ',i,' x, y, z = ',x(i),y(i),z(i),dat(i),rho(i),hi ! PRINT*,'pixels = ',ipixmin,ipixmax,jpixmin,jpixmax if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (jpixmin < 1) jpixmin = 1 ! to pixels in the image if (ipixmax > npixx) ipixmax = npixx if (jpixmax > npixy) jpixmax = npixy ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax ypix = ymin + (jpix-0.5)*pixwidthy dy = ypix - y(i) dy2 = dy*dy do ipix = ipixmin,ipixmax xpix = xmin + (ipix-0.5)*pixwidthx dx = xpix - x(i) rab2 = dx**2 + dy2 q2 = rab2*hi21 ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfromtable(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic vecsmoothx(ipix,jpix) = vecsmoothx(ipix,jpix) + termx*wab !$omp atomic vecsmoothy(ipix,jpix) = vecsmoothy(ipix,jpix) + termy*wab if (normalise) then !$omp atomic datnorm(ipix,jpix) = datnorm(ipix,jpix) + termnorm*wab endif endif enddo enddo enddo over_particles !$omp enddo !$omp end parallel if (normalise .and. allocated(datnorm)) then !--normalise everywhere where (datnorm > tiny(datnorm)) vecsmoothx = vecsmoothx/datnorm vecsmoothy = vecsmoothy/datnorm end where endif if (allocated(datnorm)) deallocate(datnorm) end subroutine interpolate3D_proj_vec !-------------------------------------------------------------------------- ! ! Computes synchrotron emission (Stokes Q, U) for a given B field ! at present assuming no faraday rotation ! ! For references see: ! ! Urbanik et al. (1997), A&A 326, 465 ! Sokoloff et al. (1998), MNRAS, 299, 189 ! Gomez & Cox (2004), ApJ 615, 744 (for Cosmic Ray distribution esp.) ! ! Faraday rotation could be included easily but ! I have not yet done so. ! ! Input: particle coordinates : x,y (npart) ! smoothing lengths : hh (npart) ! weight for each particle : weight (npart) ! vector data to smooth : vecx (npart) ! vecy (npart) ! ! Output: smoothed vector field : stokesQ (npixx,npixy) ! : stokesU (npixx,npixy) ! : stokesI (npixx,npixy) ! ! DOES NOT WORK FOR ROTATED CONFIGURATIONS YET!! ! (ie. z is assumed to be z_galaxy in the cosmic ray distribution) ! ! Daniel Price 14/03/07 !-------------------------------------------------------------------------- subroutine interp3D_proj_vec_synctron(x,y,z,hh,weight,vecx,vecy,itype,npart,& xmin,ymin,stokesQ,stokesU,stokesI,npixx,npixy,pixwidth,rcrit,zcrit,alpha, & qpixwidth,getIonly,utherm,uthermcutoff) use kernels, only:radkernel,radkernel2 integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,z,hh,weight,vecx,vecy integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidth,rcrit,zcrit,alpha,qpixwidth logical, intent(in) :: getIonly real, intent(out), dimension(npixx,npixy) :: stokesQ,stokesU,stokesI real, intent(in), dimension(npart), optional :: utherm real, intent(in), optional :: uthermcutoff integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax real :: hi,hi1,hi21,radkern,q2,wab,const,hsmooth real :: termx,termy,term,dy,dy2,ypix,xi,yi,zi real :: crdens,emissivity,Bperp,angle,pintrinsic,rcyl real, dimension(npixx) :: dx2i if (getIonly) then stokesI = 0. else stokesU = 0. stokesQ = 0. endif termx = 0. termy = 0. term = 0. pintrinsic = (3. + 3.*alpha)/(5. + 3.*alpha) if (getIonly) then print "(1x,a)",'getting synchrotron intensity map from B field...' else print "(1x,a)",'getting synchrotron polarisation map from B field...' print*,' assuming cosmic ray electron distribution exp(-r/',rcrit,' -z/',zcrit,') (kpc)' print*,' synchrotron spectral index I_nu = nu^-',alpha print*,' intrinsic polarisation fraction = ',pintrinsic endif if (present(utherm) .and. present(uthermcutoff)) then print*,' using only particles with utherm > ',uthermcutoff endif if (pixwidth <= 0.) then print "(a)",'interpolate3D_proj_vec_synchrotron: error: pixel width <= 0' return endif ! !--loop over particles ! !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,vecx,vecy,itype,stokesq,stokesu,stokesi,npart) & !$omp shared(xmin,ymin,pixwidth,rcrit,zcrit,alpha,radkernel,radkernel2) & !$omp shared(npixx,npixy,pintrinsic,qpixwidth,getionly,utherm,uthermcutoff) & !$omp private(hi,xi,yi,zi,radkern,const) & !$omp private(hsmooth,hi1,hi21,term,termx,termy) & !$omp private(rcyl,crdens,bperp,emissivity,angle) & !$omp private(ipixmin,ipixmax,jpixmin,jpixmax) & !$omp private(dy,dy2,dx2i,ypix,q2,wab) & !$omp private(i,ipix,jpix) !$omp do schedule(guided, 2) over_particles: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_particles ! !--skip particles with utherm < uthermcutoff ! if (present(utherm) .and. present(uthermcutoff)) then if (utherm(i) < uthermcutoff) cycle over_particles endif ! !--set kernel related quantities ! hi = hh(i) if (hi <= 0.) cycle over_particles const = weight(i)*hi ! h gives the z length scale (NB: no perspective) zi = z(i) !--take resolution length as max of h and 1/2 pixel width ! (for intensity calculation, qpixwidth is pixel width of Q,U calculation) hsmooth = max(hi,0.5*pixwidth,0.5*qpixwidth) hi1 = 1./hsmooth hi21 = hi1*hi1 radkern = radkernel*hsmooth ! radius of the smoothing kernel xi = x(i) yi = y(i) !--assumed distribution of cosmic ray electrons in galaxy ! (should use UNROTATED x,y if rotation added) rcyl = sqrt(xi**2 + yi**2) crdens = exp(-rcyl/rcrit - abs(zi)/zcrit) !--calculate synchrotron emissivity based on Bperp and a spectral index alpha Bperp = sqrt(vecx(i)**2 + vecy(i)**2) emissivity = crdens*Bperp**(1. + alpha) if (getIonly) then term = emissivity*const termx = 0. termy = 0. else term = 0. !--faraday rotation would change angle here angle = atan2(vecy(i),vecx(i)) termx = pintrinsic*emissivity*const*cos(angle) termy = pintrinsic*emissivity*const*sin(angle) endif ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkern - xmin)/pixwidth) jpixmin = int((yi - radkern - ymin)/pixwidth) ipixmax = int((xi + radkern - xmin)/pixwidth) + 1 jpixmax = int((yi + radkern - ymin)/pixwidth) + 1 ! PRINT*,'particle ',i,' x, y, z = ',x(i),y(i),z(i),dat(i),rho(i),hi ! PRINT*,'pixels = ',ipixmin,ipixmax,jpixmin,jpixmax if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (jpixmin < 1) jpixmin = 1 ! to pixels in the image if (ipixmax > npixx) ipixmax = npixx if (jpixmax > npixy) jpixmax = npixy ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax dx2i(ipix) = ((xmin + (ipix-0.5)*pixwidth - xi)**2)*hi21 enddo ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax ypix = ymin + (jpix-0.5)*pixwidth dy = ypix - yi dy2 = dy*dy*hi21 do ipix = ipixmin,ipixmax !xpix = xmin + (ipix-0.5)*pixwidth !dx = xpix - xi q2 = dx2i(ipix) + dy2 ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfromtable(q2) ! !--calculate data value at this pixel using the summation interpolant ! if (getIonly) then !$omp atomic stokesI(ipix,jpix) = stokesI(ipix,jpix) + term*wab else !$omp atomic stokesQ(ipix,jpix) = stokesQ(ipix,jpix) + termx*wab !$omp atomic stokesU(ipix,jpix) = stokesU(ipix,jpix) + termy*wab endif endif enddo enddo enddo over_particles !$omp enddo !$omp end parallel return end subroutine interp3D_proj_vec_synctron !-------------------------------------------------------------------------- ! ! Same as previous but for column integrated quantities on ! a collection of irregular points ! ! Input: particle coordinates : x,y (npart) ! smoothing lengths : hh (npart) ! weight for each particle : weight (npart) ! vector data to smooth : dat (npart) ! vecy (npart) ! ! Output: smoothed vector field : datsmoothx (npixx,npixy) ! : vecsmoothy (npixx,npixy) ! ! Daniel Price 23/12/04 !-------------------------------------------------------------------------- subroutine interpolate3D_proj_points(x,y,z,hh,weight,dat,itype,npart,& xpoints,ypoints,zpoints,datsmooth,npoints,normalise,iverbose) use kernels, only:radkernel2 integer, intent(in) :: npart,npoints,iverbose real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in), dimension(npoints) :: xpoints,ypoints,zpoints real, intent(out), dimension(npoints) :: datsmooth logical, intent(in) :: normalise real, dimension(:), allocatable :: datnorm integer :: i,j,ierr real :: hi,hi1,hi21,q2,wab,rab2 real :: term,termnorm,dx,dy,dz datsmooth = 0. term = 0. if (normalise) then if (iverbose >= 0) print "(1x,a)",'projecting (normalised) from particles to points...' allocate(datnorm(npoints),stat=ierr) if (ierr /= 0) then if (iverbose >= -1) print "(a)",'interpolate3D_proj_points: error allocating memory' return endif datnorm = 0. else if (iverbose >= 0) print "(1x,a)",'projecting from particles to points...' endif ! !--check column density table has actually been setup ! if (.not.have_setup_kernel) call setup_integratedkernel ! !--loop over particles ! !$omp parallel default(none) & !$omp shared(hh,z,x,y,weight,dat,itype,datsmooth,npart) & !$omp shared(xpoints,ypoints,zpoints,datnorm) & !$omp shared(npoints,normalise,radkernel2) & !$omp private(hi,hi1,hi21,term,termnorm) & !$omp private(i,j) & !$omp private(dz,dy,dx,rab2,q2,wab) !$omp do schedule(guided, 2) over_particles: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_particles ! !--set kernel related quantities ! hi = hh(i) if (hi <= 0.) cycle over_particles hi1 = 1./hi hi21 = hi1*hi1 termnorm = weight(i)*hi term = termnorm*dat(i) ! !--loop over points, adding the contribution from this particle ! over_points: do j = 1,npoints dz = zpoints(j) - z(i) if (dz > 0.) cycle over_points ! skip if point is behind particle dy = ypoints(j) - y(i) dx = xpoints(j) - x(i) rab2 = dx*dx + dy*dy q2 = rab2*hi21 ! !--SPH kernel - integral through cubic spline ! interpolate from a pre-calculated table ! if (q2 < radkernel2) then wab = wfromtable(q2) ! !--calculate data value at this pixel using the summation interpolant ! !$omp atomic datsmooth(j) = datsmooth(j) + term*wab if (normalise) then !$omp atomic datnorm(j) = datnorm(j) + termnorm*wab endif endif enddo over_points enddo over_particles !$omp enddo !$omp end parallel if (normalise .and. allocated(datnorm)) then !--normalise everywhere where (datnorm > tiny(datnorm)) datsmooth = datsmooth/datnorm end where endif if (allocated(datnorm)) deallocate(datnorm) end subroutine interpolate3D_proj_points end module projections3D danieljprice-splash-4d1f09c/src/interpolate3D_xsec.f90000066400000000000000000000274611477365367100227520ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module containing all of the routines required for cross sections ! through 3D data ! !---------------------------------------------------------------------- module xsections3D use kernels, only:cnormk3D,radkernel,radkernel2,wfunc,select_kernel implicit none public :: interpolate3D_fastxsec, interpolate3D_xsec_vec contains !-------------------------------------------------------------------------- ! ! ** In this version 3D data is interpolated to a single 2D cross section ! ** This is much faster than interpolating to a 3D grid ! ** and is efficient if only one or two cross sections are needed. ! ! ** Note that the cross section is always taken in the z co-ordinate ! ** so should submit the appropriate arrays as x, y and z. ! ! Input: particle coordinates : x,y,z (npart) ! particle masses : pmass (npart) ! density on particles : rho (npart) - must be computed separately ! smoothing lengths : hh (npart) - could be computed from density ! scalar data to smooth : dat (npart) ! cross section location: zslice ! ! Output: smoothed data : datsmooth (npixx,npixy) ! ! Daniel Price, Institute of Astronomy, Cambridge, 23/9/03 !-------------------------------------------------------------------------- subroutine interpolate3D_fastxsec(x,y,z,hh,weight,dat,itype,npart,& xmin,ymin,zslice,datsmooth,npixx,npixy,pixwidthx,pixwidthy,normalise,iverbose) integer, intent(in) :: npart,npixx,npixy,iverbose real, intent(in), dimension(npart) :: x,y,z,hh,weight,dat integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy,zslice real, intent(out), dimension(npixx,npixy) :: datsmooth logical, intent(in) :: normalise real, dimension(npixx,npixy) :: datnorm integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax real :: hi,hi1,radkern,q2,wab,const,xi,yi,hi21 real :: termnorm,term,dy,dy2,dz,dz2,ypix,rescalefac real, dimension(npixx) :: dx2i ! force cubic kernel if not already set if (.not.associated(wfunc)) call select_kernel(0) datsmooth = 0. datnorm = 0. if (iverbose >= 0) then if (normalise) then print*,'taking fast cross section (normalised)...',zslice else print*,'taking fast cross section (non-normalised)...',zslice endif endif if (pixwidthx <= 0. .or. pixwidthy <= 0. .and. iverbose >= -1) then print*,'interpolate3D_xsec: error: pixel width <= 0' return elseif (npart <= 0 .and. iverbose >= -1) then print*,'interpolate3D_xsec: error: npart = 0' return endif if (any(hh(1:npart) <= tiny(hh)) .and. iverbose >= -1) then print*,'interpolate3D_xsec: WARNING: ignoring some or all particles with h < 0' endif const = cnormk3D ! !--renormalise dat array by first element to speed things up ! if (dat(1) > tiny(dat)) then rescalefac = dat(1) else rescalefac = 1.0 endif ! !--loop over particles ! over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_parts ! !--set kernel related quantities ! hi = hh(i) if (hi <= 0.) cycle over_parts hi1 = 1./hi hi21 = hi1*hi1 radkern = radkernel*hi ! radius of the smoothing kernel ! !--for each particle, work out distance from the cross section slice. ! dz = zslice - z(i) dz2 = dz**2*hi21 ! !--if this is < 2h then add the particle's contribution to the pixels ! otherwise skip all this and start on the next particle ! if (dz2 < radkernel2) then xi = x(i) yi = y(i) termnorm = const*weight(i) term = termnorm*dat(i)/rescalefac ! !--for each particle work out which pixels it contributes to ! ipixmin = int((xi - radkern - xmin)/pixwidthx) jpixmin = int((yi - radkern - ymin)/pixwidthy) ipixmax = int((xi + radkern - xmin)/pixwidthx) + 1 jpixmax = int((yi + radkern - ymin)/pixwidthy) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (jpixmin < 1) jpixmin = 1 ! to pixels in the image if (ipixmax > npixx) ipixmax = npixx if (jpixmax > npixy) jpixmax = npixy ! !--precalculate an array of dx2 for this particle (optimisation) ! do ipix=ipixmin,ipixmax dx2i(ipix) = ((xmin + (ipix-0.5)*pixwidthx - xi)**2)*hi21 + dz2 enddo ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax ypix = ymin + (jpix-0.5)*pixwidthy dy = ypix - yi dy2 = dy*dy*hi21 do ipix = ipixmin,ipixmax q2 = dx2i(ipix) + dy2 ! !--SPH kernel - standard cubic spline ! if (q2 < radkernel2) then wab = wfunc(q2) ! !--calculate data value at this pixel using the summation interpolant ! datsmooth(ipix,jpix) = datsmooth(ipix,jpix) + term*wab if (normalise) datnorm(ipix,jpix) = datnorm(ipix,jpix) + termnorm*wab endif enddo enddo endif ! if particle within 2h of slice enddo over_parts ! over particles ! !--normalise dat array ! if (normalise) then !--normalise everywhere (required if not using SPH weighting) where (datnorm > tiny(datnorm)) datsmooth = datsmooth/datnorm end where endif datsmooth = datsmooth*rescalefac return end subroutine interpolate3D_fastxsec !-------------------------------------------------------------------------- ! program to interpolate from particle data to even grid of pixels ! ! The data is smoothed using the SPH summation interpolant, ! that is, we compute the smoothed array according to ! ! datsmooth(pixel) = sum_b m_b dat_b/rho_b W(r-r_b, h_b) ! ! where _b is the quantity at the neighbouring particle b and ! W is the smoothing kernel, for which we use the usual cubic spline ! ! ** In this version 3D data is interpolated to a single 2D cross section ! ** This is much faster than interpolating to a 3D grid ! ** and is efficient if only one or two cross sections are needed. ! ! ** Note that the cross section is always taken in the z co-ordinate ! ** so should submit the appropriate arrays as x, y and z. ! ! Input: particle coordinates : x,y,z (npart) ! particle masses : pmass (npart) ! density on particles : rho (npart) - must be computed separately ! smoothing lengths : hh (npart) - could be computed from density ! vector data to smooth : vecx (npart) ! vecy (npart) ! cross section location: zslice ! ! Output: smoothed vector field : vecsmoothx (npixx,npixy) ! : vecsmoothy (npixx,npixy) ! ! Daniel Price, Institute of Astronomy, Cambridge, 23/9/03 !-------------------------------------------------------------------------- subroutine interpolate3D_xsec_vec(x,y,z,hh,weight,vecx,vecy,itype,npart,& xmin,ymin,zslice,vecsmoothx,vecsmoothy,npixx,npixy,pixwidthx,pixwidthy,normalise,iverbose) integer, intent(in) :: npart,npixx,npixy,iverbose real, intent(in), dimension(npart) :: x,y,z,hh,weight,vecx,vecy integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,pixwidthx,pixwidthy,zslice real, intent(out), dimension(npixx,npixy) :: vecsmoothx, vecsmoothy logical, intent(in) :: normalise real, dimension(npixx,npixy) :: datnorm integer :: i,ipix,jpix,ipixmin,ipixmax,jpixmin,jpixmax real :: hi,hi1,radkern,q2,wab,const real :: termx,termy,termnorm,dx,dy,dz,dz2,xpix,ypix ! force cubic kernel if not already set if (.not.associated(wfunc)) call select_kernel(0) vecsmoothx = 0. vecsmoothy = 0. datnorm = 0. if (iverbose >= 0) then if (normalise) then print*,'taking fast cross section (normalised)...',zslice else print*,'taking fast cross section (non-normalised)...',zslice endif endif if (pixwidthx <= 0. .or. pixwidthy <= 0. .and. iverbose >= -1) then print*,'interpolate3D_xsec_vec: error: pixel width <= 0' return endif if (any(hh(1:npart) <= tiny(hh)) .and. iverbose >= -1) then print*,'interpolate3D_xsec_vec: WARNING: ignoring some or all particles with h < 0' endif const = cnormk3D ! normalisation constant (3D) ! !--loop over particles ! over_parts: do i=1,npart ! !--skip particles with itype < 0 ! if (itype(i) < 0 .or. weight(i) < tiny(0.)) cycle over_parts ! !--set kernel related quantities ! hi = hh(i) if (hi <= 0.) cycle over_parts hi1 = 1./hi radkern = radkernel*hi ! radius of the smoothing kernel ! !--for each particle, work out distance from the cross section slice. ! dz = zslice - z(i) dz2 = dz**2 ! !--if this is < 2h then add the particle's contribution to the pixels ! otherwise skip all this and start on the next particle ! if (abs(dz) < radkern) then termnorm = const*weight(i) termx = termnorm*vecx(i) termy = termnorm*vecy(i) ! !--for each particle work out which pixels it contributes to ! ipixmin = int((x(i) - radkern - xmin)/pixwidthx) jpixmin = int((y(i) - radkern - ymin)/pixwidthy) ipixmax = int((x(i) + radkern - xmin)/pixwidthx) + 1 jpixmax = int((y(i) + radkern - ymin)/pixwidthy) + 1 if (ipixmin < 1) ipixmin = 1 ! make sure they only contribute if (jpixmin < 1) jpixmin = 1 ! to pixels in the image if (ipixmax > npixx) ipixmax = npixx if (jpixmax > npixy) jpixmax = npixy ! !--loop over pixels, adding the contribution from this particle ! do jpix = jpixmin,jpixmax ypix = ymin + (jpix-0.5)*pixwidthy dy = ypix - y(i) do ipix = ipixmin,ipixmax xpix = xmin + (ipix-0.5)*pixwidthx dx = xpix - x(i) q2 = (dx*dx + dy*dy + dz2)*hi1*hi1 ! !--SPH kernel - standard cubic spline ! if (q2 < radkernel2) then wab = wfunc(q2) ! !--calculate data value at this pixel using the summation interpolant ! vecsmoothx(ipix,jpix) = vecsmoothx(ipix,jpix) + termx*wab vecsmoothy(ipix,jpix) = vecsmoothy(ipix,jpix) + termy*wab if (normalise) datnorm(ipix,jpix) = datnorm(ipix,jpix) + termnorm*wab endif enddo enddo endif ! if particle within 2h of slice enddo over_parts ! over particles ! !--normalise dat array(s) ! if (normalise) then where (datnorm > tiny(datnorm)) vecsmoothx = vecsmoothx/datnorm vecsmoothy = vecsmoothy/datnorm end where endif return end subroutine interpolate3D_xsec_vec end module xsections3D danieljprice-splash-4d1f09c/src/interpolate_vec.f90000066400000000000000000000140731477365367100223710ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !-------------------------------------------------------------------------- ! ! Module with some auxiliary routines related to vector interpolation ! !-------------------------------------------------------------------------- module interpolate_vec implicit none public :: interpolate_vec_average public :: mask_vectors private contains !-------------------------------------------------------------------------- ! ! Hides vector arrows (sets them to zero) where there are no particles ! contained in the pixel (as opposed to merely contributing to the pixel) ! ! means you can avoid funny looking plots with arrows in otherwise ! empty regions ! ! Daniel Price 26/3/07 ! !-------------------------------------------------------------------------- subroutine mask_vectors(xplot,yplot,itype,npart,xmin,xmax,ymin,ymax, & vecpixx,vecpixy,npixvecx,npixvecy,minincell,blankval) integer, intent(in) :: npart,npixvecx,npixvecy,minincell integer, dimension(npart), intent(in) :: itype real, dimension(npart), intent(in) :: xplot,yplot real, intent(in) :: xmin,xmax,ymin,ymax,blankval real, dimension(npixvecx,npixvecy), intent(inout) :: vecpixx,vecpixy integer, dimension(npixvecx,npixvecy) :: nincell integer :: icellx,icelly,j real :: dxcell1,dycell1 character(len=16) :: chmin !--write nice, neat information line write(chmin,"(g10.0)") minincell print "(2x,a)",'(hiding arrows where there are < '//trim(adjustl(chmin))//' particles in pixel cell)' dxcell1 = (npixvecx - 1)/(xmax-xmin + tiny(xmin)) dycell1 = (npixvecy - 1)/(ymax-ymin + tiny(ymin)) ! !--count particles which fall into each pixel ("cell") ! nincell(:,:) = 0 do j=1,npart if (itype(j) >= 0) then ! exclude not-plotted particles icellx = int((xplot(j) - xmin)*dxcell1) + 1 icelly = int((yplot(j) - ymin)*dycell1) + 1 !--count number of particles in each cell if (icellx > 0 .and. icellx <= npixvecx & .and. icelly > 0 .and. icelly <= npixvecy) then nincell(icellx,icelly) = nincell(icellx,icelly) + 1 endif endif enddo ! !--set vector arrow lengths to zero in cells where there are no particles ! where (nincell < minincell) vecpixx = blankval vecpixy = blankval end where return end subroutine mask_vectors !-------------------------------------------------------------------------- ! Interpolates vector quantity from particles to even grid of pixels ! ! This version just does a simple averaging by binning particles ! and taking the average of vx,vy in the cell to give a vector for ! that cell. This is because the interpolation of a vector quantity is ! usually to a *coarser* grid than the particles. ! ! Input: particle coordinates : x,y (npart) ! vector data to smooth : vecx (npart) ! vecy (npart) ! grid setup : xmin, ymin, dx ! ! Output: smoothed vector field : vecpixx (npixx,npixy) ! : vecpixy (npixx,npixy) ! ! Daniel Price, Institute of Astronomy, Cambridge, 20/8/04 !-------------------------------------------------------------------------- subroutine interpolate_vec_average(x,y,vecx,vecy,itype, & xmin,ymin,dx,dy,vecpixx,vecpixy,npart,npixx,npixy,z,zmin,zmax) integer, intent(in) :: npart,npixx,npixy real, intent(in), dimension(npart) :: x,y,vecx,vecy integer, intent(in), dimension(npart) :: itype real, intent(in) :: xmin,ymin,dx,dy real, intent(out), dimension(npixx,npixy) :: vecpixx, vecpixy real, intent(in), optional :: z(npart),zmin,zmax integer :: i,j,k,ix,iy integer, dimension(npixx,npixy) :: ihoc,numcell integer, dimension(npart) :: ll logical :: xsec !print "(a,i3,a,i3,a)",' averaging vector field onto ',npixx,'x',npixy,' pixels...' if (dx <= 0. .or. dy <= 0.) then print*,'interpolate_vec: error: pixel width <= 0' return endif ! !--interpolation is to a coarser grid, so just average ! bin particles into cells using a link list ! ihoc(:,:) = -1 ! head of chain numcell(:,:) = 0 xsec = present(z) .and. present(zmin) .and. present(zmax) over_parts: do i=1,npart if (xsec) then if (z(i) < zmin .or. z(i) > zmax) cycle over_parts endif if (itype(i) >= 0) then ix = int((x(i)-xmin)/dx)+1 iy = int((y(i)-ymin)/dy)+1 if ((ix >= 1).and.(ix <= npixx).and.(iy >= 1).and.(iy <= npixy)) then ll(i)=ihoc(ix,iy) ! set link list of this particle to old head of list ihoc(ix,iy) = i ! set head of chain to this particle endif endif enddo over_parts ! !--add up total vx,vy in each cell ! vecpixx(:,:) = 0. vecpixy(:,:) = 0. do j=1,npixy do i=1,npixx k = ihoc(i,j) do while (k /= -1) vecpixx(i,j) = vecpixx(i,j) + vecx(k) vecpixy(i,j) = vecpixy(i,j) + vecy(k) numcell(i,j) = numcell(i,j) + 1 k = ll(k) enddo enddo enddo ! !--divide by number of particles in that cell to get average vx,vy ! do j=1,npixy do i=1,npixx if (numcell(i,j) /= 0) then vecpixx(i,j) = vecpixx(i,j)/float(numcell(i,j)) vecpixy(i,j) = vecpixy(i,j)/float(numcell(i,j)) endif enddo enddo return end subroutine interpolate_vec_average end module interpolate_vec danieljprice-splash-4d1f09c/src/interpolation.f90000066400000000000000000000263721477365367100221020ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! Module containing utility routines for SPH kernel interpolation !----------------------------------------------------------------- module interpolation implicit none public :: iroll, set_interpolation_weights, get_n_interp real, parameter, public :: weight_sink = -1. integer, parameter, public :: doub_prec = kind(0.d0) private contains !-------------------------------------------------------------------------- ! ! utility to wrap pixel index around periodic domain ! indices that roll beyond the last position are re-introduced at the first ! !-------------------------------------------------------------------------- pure integer function iroll(i,n) integer, intent(in) :: i,n if (i > n) then iroll = mod(i-1,n) + 1 elseif (i < 1) then iroll = n + mod(i,n) ! mod is negative else iroll = i endif end function iroll !-------------------------------------------------------------------------- ! ! get maximum number of particles for which interpolation weights ! need to be computed ! !-------------------------------------------------------------------------- integer function get_n_interp(ntypes,npartoftype,UseType,iplotpartoftype,& iamtype_size,rendersinks) result(ninterp) integer, intent(in) :: ntypes,iamtype_size integer, intent(in) :: npartoftype(ntypes) logical, intent(in) :: iplotpartoftype(ntypes),UseType(ntypes),rendersinks integer :: ntoti ntoti = sum(npartoftype) ninterp = npartoftype(1) ! by default, only the gas particles if (any(UseType(2:ntypes) .and. iplotpartoftype(2:ntypes)) & .or. iamtype_size > 1 .or. rendersinks) ninterp = ntoti end function get_n_interp !------------------------------------------------------------------- ! Set interpolation weights for the particles. The weights are ! calculated using: ! ! w = m/(rho*h**ndim), ! ! where we need to handle a few special scenarios: ! ! 1) Firstly, the weight should be calculated in a consistent ! set of units. Safest way is to use the data as originally ! read from the dump file, before any unit scaling was applied. ! ! 2) Particle weights are set to zero for particle types not ! used in the rendering. ! ! 3) If particle mass not read, it is still possible to perform ! interpolations, but not using the SPH weights. These ! interpolations *must* therefore be normalised. !------------------------------------------------------------------- subroutine set_interpolation_weights(weighti,dati,iamtypei,usetype, & ninterp,npartoftype,masstype,ntypes,ndataplots,irho,ipmass,ih,ndim, & iRescale,idensityweighted,inormalise,units,unit_interp,required, & rendersinks,isinktype) integer, parameter :: doub_prec = selected_real_kind(P=10,R=30) integer, intent(in) :: ninterp,ntypes,ndataplots,isinktype real, dimension(:), intent(out) :: weighti real, dimension(:,:), intent(in) :: dati integer(kind=1), dimension(:), intent(in) :: iamtypei logical, dimension(:), intent(in) :: usetype logical, dimension(0:ndataplots), intent(in) :: required integer, intent(in) :: ih,irho,ipmass,ndim integer, dimension(:), intent(in) :: npartoftype real, dimension(:), intent(in) :: masstype logical, intent(in) :: iRescale,idensityweighted,rendersinks logical, intent(inout) :: inormalise real, dimension(0:ndataplots), intent(in) :: units real(doub_prec), intent(in) :: unit_interp integer :: i2,i1,itype,ipart real(doub_prec) :: dunitspmass,dunitsrho,dunitsh ! !-- unit_interp is a multiplication factor that can ! be used to scale the "weight" in case the ! units read from the read_data routine ! are inconsistent (this is the case for the SEREN read) ! dunitspmass = 1.d0 dunitsrho = 1.d0 dunitsh = 1.d0 if (iRescale) then if (ipmass > 0) dunitspmass = 1.d0/units(ipmass) if (ih > 0) dunitsh = 1.d0/units(ih) if (irho > 0) dunitsrho = 1.d0/units(irho) endif dunitspmass = dunitspmass * unit_interp if (ipmass > 0 .and. ipmass <= ndataplots .and. & irho > 0 .and. irho <= ndataplots .and. & ih > 0 .and. ih <= ndataplots .and. & required(ipmass) .and. required(irho) .and. required(ih)) then if (size(iamtypei) > 1) then ! !--particles with mixed types ! !$omp parallel do default(none) & !$omp shared(ninterp,iamtypei,weighti,dati,rendersinks,isinktype) & !$omp shared(usetype,idensityweighted,dunitsrho) & !$omp shared(ipmass,ih,irho,dunitspmass,dunitsh,ndim) & !$omp private(ipart,itype) do ipart=1,ninterp itype = iamtypei(ipart) if (.not.usetype(itype)) then if (rendersinks .and. itype==isinktype) then weighti(ipart) = weight_sink else weighti(ipart) = 0. endif elseif (idensityweighted) then if (dati(ipart,ih) > tiny(dati)) then weighti(ipart) = (dati(ipart,ipmass)*dunitspmass)/ & ((dati(ipart,ih)*dunitsh)**ndim) else weighti(ipart) = 0. endif else if (dati(ipart,irho) > tiny(dati) .and. dati(ipart,ih) > tiny(dati)) then weighti(ipart) = (dati(ipart,ipmass)*dunitspmass)/ & ((dati(ipart,irho)*dunitsrho)*(dati(ipart,ih)*dunitsh)**ndim) else weighti(ipart) = 0. endif endif enddo !$omp end parallel do else ! !--particles ordered by type ! i2 = 0 over_types: do itype=1,ntypes i1 = i2 + 1 i2 = i2 + npartoftype(itype) i2 = min(i2,ninterp) if (i1 > i2) cycle over_types !--set weights to zero for particle types not used in the rendering if (.not.usetype(itype)) then if (rendersinks .and. itype==isinktype) then weighti(i1:i2) = weight_sink else weighti(i1:i2) = 0. endif elseif (idensityweighted) then !--for density weighted interpolation use m/h**ndim where(dati(i1:i2,ih) > tiny(dati)) weighti(i1:i2) = (dati(i1:i2,ipmass)*dunitspmass)/ & ((dati(i1:i2,ih)*dunitsh)**ndim) elsewhere weighti(i1:i2) = 0. endwhere else !--usual interpolation use m/(rho h**ndim) where(dati(i1:i2,irho) > tiny(dati) .and. dati(i1:i2,ih) > tiny(dati)) weighti(i1:i2) = (dati(i1:i2,ipmass)*dunitspmass)/ & ((dati(i1:i2,irho)*dunitsrho)*(dati(i1:i2,ih)*dunitsh)**ndim) elsewhere weighti(i1:i2) = 0. endwhere endif enddo over_types endif if (idensityweighted) then print "(a)",' USING DENSITY WEIGHTED INTERPOLATION ' inormalise = .true. endif elseif (any(masstype(1:ntypes) > 0.) .and. & irho > 0 .and. irho <= ndataplots .and. & ih > 0 .and. ih <= ndataplots .and. & required(irho) .and. required(ih)) then if (size(iamtypei) > 1) then ! !--particles with mixed types ! !$omp parallel do default(none) & !$omp shared(ninterp,iamtypei,weighti,dati,rendersinks,isinktype) & !$omp shared(usetype,idensityweighted,dunitsrho,masstype) & !$omp shared(ih,irho,dunitspmass,dunitsh,ndim) & !$omp private(ipart,itype) do ipart=1,ninterp itype = iamtypei(ipart) if (.not.usetype(itype)) then if (rendersinks .and. itype==isinktype) then weighti(ipart) = weight_sink else weighti(ipart) = 0. endif elseif (idensityweighted) then if (dati(ipart,ih) > tiny(dati)) then weighti(ipart) = (masstype(itype)*dunitspmass)/ & ((dati(ipart,ih)*dunitsh)**ndim) else weighti(ipart) = 0. endif else if (dati(ipart,irho) > tiny(dati) .and. dati(ipart,ih) > tiny(dati)) then weighti(ipart) = (masstype(itype)*dunitspmass)/ & ((dati(ipart,irho)*dunitsrho)*(dati(ipart,ih)*dunitsh)**ndim) else weighti(ipart) = 0. endif endif enddo !$omp end parallel do else ! !--particles ordered by type ! i2 = 0 over_types2: do itype=1,ntypes i1 = i2 + 1 i2 = i2 + npartoftype(itype) i2 = min(i2,ninterp) if (i1 > i2) cycle over_types2 !--set weights to zero for particle types not used in the rendering if (.not.usetype(itype)) then if (rendersinks .and. itype==isinktype) then weighti(i1:i2) = weight_sink else weighti(i1:i2) = 0. endif else where(dati(i1:i2,irho) > tiny(dati) .and. dati(i1:i2,ih) > tiny(dati)) weighti(i1:i2) = masstype(itype)/ & ((dati(i1:i2,irho)*dunitsrho)*(dati(i1:i2,ih)*dunitsh)**ndim) elsewhere weighti(i1:i2) = 0. endwhere endif enddo over_types2 endif if (idensityweighted) then print "(a)",' USING DENSITY WEIGHTED INTERPOLATION ' inormalise = .true. endif else if (required(ih) .and. required(irho) .and. ih > 0 .and. irho > 0) then print "(a)",' WARNING: particle mass not set: using normalised interpolations' endif weighti(1:ninterp) = 1.0 !--if particle mass has not been set, then must use normalised interpolations inormalise = .true. if (size(iamtypei) > 1) then ! !--particles with mixed types ! !$omp parallel do default(none) & !$omp shared(ninterp,iamtypei,weighti,usetype) & !$omp private(ipart,itype) do ipart=1,ninterp itype = iamtypei(ipart) if (.not.usetype(itype)) weighti(ipart) = 0. enddo !$omp end parallel do endif endif end subroutine set_interpolation_weights end module interpolation danieljprice-splash-4d1f09c/src/kernels.f90000066400000000000000000000410061477365367100206450ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2018 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------- ! ! Module containing kernel functions used for interpolation ! !------------------------------------------------------------- module kernels implicit none integer, parameter, public :: nkernels = 6 character(len=24), dimension(0:nkernels), parameter, public :: kernelname = & (/'default [cubic] ', & 'M4 cubic spline (2h) ', & 'M5 quartic (2.5h)', & 'M6 quintic spline (3h) ', & 'Wendland C2 (2h) ', & 'Wendland C4 (2h) ', & 'Wendland C6 (2h) '/) real, parameter :: pi = 4.*atan(1.) integer, public :: ikernel = 0 real, public :: radkernel = 2. real, public :: radkernel2 = 4. real, public :: cnormk1D = 2./3. real, public :: cnormk2D = 10./(7.*pi) real, public :: cnormk3D = 1./pi integer, parameter :: doub_prec = kind(0.d0) procedure(k_func), pointer, public :: wfunc procedure(k_func), pointer, public :: dwfunc abstract interface pure function k_func(q) real, intent(in) :: q real :: k_func end function k_func end interface public :: select_kernel, select_kernel_by_name public :: pint,wallint,soft_func private contains !----------------------------------------------- ! ! Kernel selection routine, sets radkernel, ! cnormk values and pointer to kernel function ! !-------------------------------------- subroutine select_kernel(j) integer, intent(in) :: j if (j >= 1 .and. j <= nkernels) then !--print only if NOT using the default kernel print "(a,/)",' Using '//trim(kernelname(j))//' kernel' endif select case(j) case(6) ! Wendland 3D C6 ikernel = 6 radkernel = 2. cnormk1D = 15./16. cnormk2D = 39./(14.*pi) cnormk3D = 1365./(512.*pi) wfunc => w_wendlandc6 case(5) ! Wendland 3D C4 ikernel = 5 radkernel = 2. cnormk1D = 27./32. cnormk2D = 9./(4.*pi) cnormk3D = 495./(256.*pi) wfunc => w_wendlandc4 case(4) ! Wendland 3D C2 ikernel = 4 radkernel = 2. cnormk1D = 0.75 cnormk2D = 7./(4.*pi) cnormk3D = 21./(16.*pi) wfunc => w_wendlandc2 case(3) ! M6 quintic, 3h ikernel = 3 radkernel = 3.0 cnormk1D = 1./120. cnormk2D = 7./(478*pi) cnormk3D = 1./(120.*pi) wfunc => w_quintic case(2) ! M5 quartic, 2.5h ikernel = 2 radkernel = 2.5 cnormk1D = 1./24. cnormk2D = 96./(1199.*pi) cnormk3D = 1./(20.*pi) wfunc => w_quartic case default !-- cubic spline kernel if (j==1) then ikernel = 1 ! deliberately chose cubic spline else ikernel = 0 ! just whatever is the default endif radkernel = 2.0 cnormk1D = 2./3. cnormk2D = 10./(7.*pi) cnormk3D = 1./pi wfunc => w_cubic dwfunc => dw_cubic end select radkernel2 = radkernel*radkernel end subroutine select_kernel !-------------------------------------- ! ! Kernel selection based on string ! !-------------------------------------- subroutine select_kernel_by_name(string) use asciiutils, only:lcase character(len=*), intent(in) :: string integer :: i,jkern jkern = 0 ! !--check if string exactly matches a kernel name ! do i=1,nkernels if (trim(adjustl(lcase(string)))==trim(adjustl(lcase(kernelname(i))))) then jkern = i endif enddo ! !--if no match to a kernel name, look for other possible strings ! if (ikernel==0) then select case(trim(adjustl(lcase(string)))) case('wendlandc6','wendland c6','6th order wendland','wendland 3d c6','w6','wendland6') jkern = 6 case('wendlandc4','wendland c4','4th order wendland','wendland 3d c4','w4','wendland4') jkern = 5 case('wendlandc2','wendland c2','2nd order wendland','wendland 3d c2','w2','wendland2') jkern = 4 case('quintic','quintic spline','m6','quintic b-spline') jkern = 3 case('quartic','quartic spline','m5','quartic b-spline') jkern = 2 case('cubic','cubic spline','m4','cubic b-spline') jkern = 1 end select endif call select_kernel(jkern) end subroutine select_kernel_by_name !--------------------------------------- ! ! Functional forms of various kernels ! !-------------------------------------- pure real function w_cubic(q2) real, intent(in) :: q2 real :: q if (q2 < 1.0) then q = sqrt(q2) w_cubic = 1.-1.5*q2 + 0.75*q2*q elseif (q2 < 4.0) then q = sqrt(q2) w_cubic = 0.25*(2.-q)**3 else w_cubic = 0. endif end function w_cubic pure real function dw_cubic(q2) real, intent(in) :: q2 real :: q if (q2 < 1.0) then q = sqrt(q2) dw_cubic = q*(2.25*q - 3.) elseif (q2 < 4.0) then q = sqrt(q2) dw_cubic = -0.75*(2.-q)**2 else dw_cubic = 0. endif end function dw_cubic pure real function w_quartic(q2) real, intent(in) :: q2 real :: q q = sqrt(q2) if (q < 0.5) then w_quartic = (2.5-q)**4 - 5.*(1.5-q)**4 + 10.*(0.5-q)**4 elseif (q < 1.5) then w_quartic = (2.5-q)**4 - 5.*(1.5-q)**4 elseif (q < 2.5) then w_quartic = (2.5-q)**4 else w_quartic = 0. endif end function w_quartic pure real function w_quintic(q2) real, intent(in) :: q2 real :: q,q4 if (q2 < 1.0) then q = sqrt(q2) q4 = q2*q2 w_quintic = 66.-60.*q2 + 30.*q4 - 10.*q4*q elseif ((q2 >= 1.0).and.(q2 < 4.0)) then q = sqrt(q2) w_quintic = (3.-q)**5 - 6.*(2.-q)**5 elseif ((q2 >= 4.0).and.(q2 < 9.0)) then q = sqrt(q2) w_quintic = (3.-q)**5 else w_quintic = 0.0 endif end function w_quintic pure real function w_quartic2h(q2) real, intent(in) :: q2 real :: q q = sqrt(q2) if (q < 0.4) then w_quartic2h = (2.-q)**4 - 5.*(1.2-q)**4 + 10.*(0.4-q)**4 elseif (q < 1.2) then w_quartic2h = (2.-q)**4 - 5.*(1.2-q)**4 elseif (q < 2.) then w_quartic2h = (2.-q)**4 else w_quartic2h = 0. endif end function w_quartic2h pure real function w_wendlandc2(q2) real, intent(in) :: q2 real :: q if (q2 < 4.) then q = sqrt(q2) w_wendlandc2 = (1. - 0.5*q)**4*(2.*q + 1.) else w_wendlandc2 = 0. endif end function w_wendlandc2 pure real function w_wendlandc4(q2) real, intent(in) :: q2 real :: q if (q2 < 4.) then q = sqrt(q2) w_wendlandc4 = (1. - 0.5*q)**6*(35./12.*q2 + 3.*q + 1.) else w_wendlandc4 = 0. endif end function w_wendlandc4 pure real function w_wendlandc6(q2) real, intent(in) :: q2 real :: q if (q2 < 4.) then q = sqrt(q2) w_wendlandc6 = (1. - 0.5*q)**8*(4.*q2*q + 25./4.*q2 + 4.*q + 1.) else w_wendlandc6 = 0. endif end function w_wendlandc6 !--------------------------------------- ! ! Integrals of the kernel, used ! when performing exact interpolation ! See Petkova, Laibe & Bonnell (2018) ! !--------------------------------------- pure real function pint(r0, d1, d2, hi1) real, intent(in) :: r0, d1, d2, hi1 real :: ar0,q0,tphi1,tphi2,phi1,phi2 if (abs(r0) < tiny(0.)) then pint = 0. return elseif (r0 > 0.) then pint = 1. ar0 = r0 else pint = -1. ar0 = -r0 endif q0 = ar0*hi1 tphi1 = abs(d1)/ar0 tphi2 = abs(d2)/ar0 phi1 = atan(tphi1) phi2 = atan(tphi2) if (d1*d2 >= 0.) then pint = pint*(full_2d_mod(phi1,tphi1,q0) + full_2d_mod(phi2,tphi2,q0)) else if (abs(d1) < abs(d2)) then pint = pint*(full_2d_mod(phi2,tphi2,q0) - full_2d_mod(phi1,tphi1,q0)) else pint = pint*(full_2d_mod(phi1,tphi1,q0) - full_2d_mod(phi2,tphi2,q0)) endif endif end function pint !--------------------------------------- ! ! Helper functions for kernel integrals ! See Petkova, Laibe & Bonnell (2018) ! !--------------------------------------- pure real function full_2d_mod(phi,tphi,q0) real, intent(in) :: phi,tphi,q0 real :: q, phi1, phi2, tphi1, tphi2, cphi, cphi1, cphi2 if (q0 <= 1.0) then cphi = cos(phi) q = q0/cphi if (q <= 1.0) then full_2d_mod = F1_2d(phi,tphi,cphi,q0) elseif (q <= 2.0) then cphi1 = q0 phi1 = acos(q0) tphi1 = tan(phi1) ! tan (acos x) = sqrt(1-x**2)/x full_2d_mod = F2_2d(phi,tphi,cphi,q0) - F2_2d(phi1,tphi1,cphi1,q0) & + F1_2d(phi1,tphi1,cphi1,q0) else cphi1 = q0 phi1 = acos(q0) cphi2 = 0.5*q0 phi2 = acos(0.5*q0) tphi1 = tan(phi1) tphi2 = tan(phi2) full_2d_mod = F3_2d(phi) - F3_2d(phi2) + F2_2d(phi2,tphi2,cphi2,q0) & - F2_2d(phi1,tphi1,cphi1,q0) & + F1_2d(phi1,tphi1,cphi1,q0) endif elseif (q0 <= 2.0) then cphi = cos(phi) q = q0/cphi if (q <= 2.0) then full_2d_mod = F2_2d(phi,tphi,cphi,q0) else cphi2 = 0.5*q0 phi2 = acos(0.5*q0) tphi2 = tan(phi2) full_2d_mod = F3_2d(phi) - F3_2d(phi2) + F2_2d(phi2,tphi2,cphi2,q0) endif else ! q0 > 2 full_2d_mod = F3_2d(phi) endif end function full_2d_mod pure real function F1_2d(phi,tphi,cphi,q0) real, intent(in) :: phi,tphi,cphi,q0 real :: I2, I4, I5, logs, cphi2, q02, q03 !tphi = tan(phi) !cphi = cos(phi) cphi2 = cphi*cphi q02 = q0*q0 q03 = q02*q0 logs = log(tan(phi/2.+pi/4.)) I2 = tphi I4 = 1./3. * tphi*(2. + 1./cphi2) I5 = 1./16. * (0.5*(11.*sin(phi) + 3.*sin(3.*phi))/cphi2/cphi2 + 6.*logs) F1_2d = 5./7.*q02/pi * (I2 - 3./4.*q02 *I4 + 0.3*q03 *I5) end function F1_2d pure real function F2_2d(phi, tphi, cphi, q0) real, intent(in) :: phi, tphi, cphi, q0 real :: I0, I2, I3, I4, I5, logs, cphi2, q02, q03 ! tphi = tan(phi) ! cphi = cos(phi) cphi2 = cphi*cphi q02 = q0*q0 q03 = q02*q0 logs = log(tan(phi/2.+pi/4.)) I0 = phi I2 = tphi I4 = 1./3. * tphi*(2. + 1./(cphi2)) I3 = 1./2. * (tphi/cphi + logs) I5 = 1./16. * (0.5*(11.*sin(phi) + 3.*sin(3.*phi))/cphi2/cphi2 + 6.*logs) F2_2d = 5./7.*q02/pi * (2.*I2 - 2.*q0 *I3 + 3./4.*q02 *I4 - 1./10.*q03 *I5 & - 1./10./q02 *I0) end function F2_2d pure real function F3_2d(phi) real, intent(in) :: phi real :: I0 I0 = phi F3_2d = 0.5/pi *I0 end function F3_2d !------------------------------------------------------------ ! 3D functions to evaluate exact overlap of kernel with wall boundaries ! see Petkova, Laibe & Bonnell (2018), J. Comp. Phys !------------------------------------------------------------ real function wallint(r0, xp, yp, xc, yc, pixwidthx, pixwidthy, hi) real, intent(in) :: r0, xp, yp, xc, yc, pixwidthx, pixwidthy, hi real(doub_prec) :: R_0, d1, d2, dx, dy, h wallint = 0.0 dx = xc - xp dy = yc - yp h = hi ! ! Contributions from each of the 4 sides of a cell wall ! R_0 = 0.5*pixwidthy + dy d1 = 0.5*pixwidthx - dx d2 = 0.5*pixwidthx + dx wallint = wallint + pint3D(r0, R_0, d1, d2, h) R_0 = 0.5*pixwidthy - dy d1 = 0.5*pixwidthx + dx d2 = 0.5*pixwidthx - dx wallint = wallint + pint3D(r0, R_0, d1, d2, h) R_0 = 0.5*pixwidthx + dx d1 = 0.5*pixwidthy + dy d2 = 0.5*pixwidthy - dy wallint = wallint + pint3D(r0, R_0, d1, d2, h) R_0 = 0.5*pixwidthx - dx d1 = 0.5*pixwidthy - dy d2 = 0.5*pixwidthy + dy wallint = wallint + pint3D(r0, R_0, d1, d2, h) end function wallint real function pint3D(r0, R_0, d1, d2, hi) real(doub_prec), intent(in) :: R_0, d1, d2, hi real, intent(in) :: r0 real(doub_prec) :: ar0, aR_0 real(doub_prec) :: int1, int2 integer :: fflag = 0 if (abs(r0) < tiny(0.)) then pint3D = 0.d0 return endif if (r0 > 0.d0) then pint3D = 1.d0 ar0 = r0 else pint3D = -1.d0 ar0 = -r0 endif if (R_0 > 0.d0) then aR_0 = R_0 else pint3D = -pint3D aR_0 = -R_0 endif int1 = full_integral_3D(d1, ar0, aR_0, hi) int2 = full_integral_3D(d2, ar0, aR_0, hi) if (int1 < 0.d0) int1 = 0.d0 if (int2 < 0.d0) int2 = 0.d0 if (d1*d2 >= 0) then pint3D = pint3D*(int1 + int2) if (int1 + int2 < 0.d0) print*, 'Error: int1 + int2 < 0' elseif (abs(d1) < abs(d2)) then pint3D = pint3D*(int2 - int1) if (int2 - int1 < 0.d0) print*, 'Error: int2 - int1 < 0: ', int1, int2, '(', d1, d2,')' else pint3D = pint3D*(int1 - int2) if (int1 - int2 < 0.d0) print*, 'Error: int1 - int2 < 0: ', int1, int2, '(', d1, d2,')' endif end function pint3D real(doub_prec) function full_integral_3D(d, r0, R_0, h) real(doub_prec), intent(in) :: d, r0, R_0, h real(doub_prec) :: B1, B2, B3, a, logs, u, u2, h2 real(doub_prec), parameter :: pi = 4.*atan(1.) real(doub_prec) :: tanphi, phi, a2, cosp, cosp2, mu2, mu2_1, r0h, r03, r0h2, r0h3, r0h_2, r0h_3, tanp real(doub_prec) :: r2, R_, linedist2, phi1, phi2, cosphi, sinphi real(doub_prec) :: I0, I1, I_1, I_2, I_3, I_4, I_5 real(doub_prec) :: J_1, J_2, J_3, J_4, J_5 real(doub_prec) :: D1, D2, D3 r0h = r0/h tanphi = abs(d)/R_0 phi = atan(tanphi) if (abs(r0h) < tiny(0.) .or. abs(R_0/h) < tiny(0.) .or. abs(phi) < tiny(0.)) then full_integral_3D = 0.0 return endif h2 = h*h r03 = r0*r0*r0 r0h2 = r0h*r0h r0h3 = r0h2*r0h r0h_2 = 1./r0h2 r0h_3 = 1./r0h3 if (r0 >= 2.0*h) then B3 = 0.25*h2*h elseif (r0 > h) then B3 = 0.25*r03 *(-4./3. + (r0h) - 0.3*r0h2 + 1./30.*r0h3 - 1./15. *r0h_3+ 8./5.*r0h_2) B2 = 0.25*r03 *(-4./3. + (r0h) - 0.3*r0h2 + 1./30.*r0h3 - 1./15. *r0h_3) else B3 = 0.25*r03 *(-2./3. + 0.3*r0h2 - 0.1*r0h3 + 7./5.*r0h_2) B2 = 0.25*r03 *(-2./3. + 0.3*r0h2 - 0.1*r0h3 - 1./5.*r0h_2) B1 = 0.25*r03 *(-2./3. + 0.3*r0h2 - 0.1*r0h3) endif a = R_0/r0 a2 = a*a linedist2 = (r0*r0 + R_0*R_0) cosphi = cos(phi) R_ = R_0/cosphi r2 = (r0*r0 + R_*R_) D2 = 0.0 D3 = 0.0 if (linedist2 < h2) then !////// phi1 business ///// cosp = R_0/sqrt(h2-r0*r0) call get_I_terms(cosp,a2,a,I0,I1,I_2,I_3,I_4,I_5) D2 = -1./6.*I_2 + 0.25*(r0h) *I_3 - 0.15*r0h2 *I_4 + 1./30.*r0h3 *I_5 - 1./60. *r0h_3 *I1 + (B1-B2)/r03 *I0 endif if (linedist2 < 4.*h2) then !////// phi2 business ///// cosp = R_0/sqrt(4.0*h2-r0*r0) call get_I_terms(cosp,a2,a,I0,I1,I_2,I_3,I_4,I_5) D3 = 1./3.*I_2 - 0.25*(r0h) *I_3 + 3./40.*r0h2 *I_4 - 1./120.*r0h3 *I_5 + 4./15. *r0h_3 *I1 + (B2-B3)/r03 *I0 + D2 endif !////////////////////////////// call get_I_terms(cosphi,a2,a,I0,I1,I_2,I_3,I_4,I_5,phi=phi,tanphi=tanphi) if (r2 < h2) then full_integral_3D = r0h3/pi * (1./6. *I_2 - 3./40.*r0h2 *I_4 + 1./40.*r0h3 *I_5 + B1/r03 *I0) elseif (r2 < 4.*h2) then full_integral_3D= r0h3/pi * (0.25 * (4./3. *I_2 - (r0/h) *I_3 + 0.3*r0h2 *I_4 - & & 1./30.*r0h3 *I_5 + 1./15. *r0h_3 *I1) + B2/r03 *I0 + D2) else full_integral_3D = r0h3/pi * (-0.25*r0h_3 *I1 + B3/r03 *I0 + D3) endif end function full_integral_3D subroutine get_I_terms(cosp,a2,a,I0,I1,I_2,I_3,I_4,I_5,phi,tanphi) real(doub_prec), intent(in) :: cosp,a2,a real(doub_prec), intent(out) :: I0,I1,I_2,I_3,I_4,I_5 real(doub_prec), intent(in), optional :: phi,tanphi real(doub_prec) :: cosp2,p,tanp,u2,u,logs,I_1,mu2_1,fac cosp2 = cosp*cosp if (present(phi)) then p = phi tanp = tanphi else p = acos(cosp) tanp = sqrt(1.-cosp2)/cosp ! tan(p) endif mu2_1 = 1. / (1. + cosp2/a2) I0 = p I_2 = p + a2 * tanp I_4 = p + 2.*a2 * tanp + 1./3.*a2*a2 * tanp*(2. + 1./cosp2) u2 = (1.-cosp2)*mu2_1 u = sqrt(u2) logs = log((1.+u)/(1.-u)) I1 = atan2(u,a) fac = 1./(1.-u2) I_1 = 0.5*a*logs + I1 I_3 = I_1 + a*0.25*(1.+a2)*(2.*u*fac + logs) I_5 = I_3 + a*(1.+a2)*(1.+a2)/16. *( (10.*u - 6.*u*u2)*fac*fac + 3.*logs) end subroutine get_I_terms !------------------------------------------------------------ ! function to return a soft maximum for 1/x with no bias ! for x >> eps using the cubic spline kernel softening ! i.e. something equivalent to 1/sqrt(x**2 + eps**2) but ! with compact support, i.e. f=1/x when x > 2*eps !------------------------------------------------------------ pure elemental real function soft_func(x,eps) result(f) real, intent(in) :: x,eps real :: q,q2, q4, q6 q = x/eps q2 = q*q if (q < 1.) then q4 = q2*q2 f = (1./eps)*(q4*q/10. - 3.*q4/10. + 2.*q2/3. - 7./5.) elseif (q < 2.) then q4 = q2*q2 f = (1./eps)*(q*(-q4*q + 9.*q4 - 30.*q2*q + 40.*q2 - 48.) + 2.)/(30.*q) else f = -1./x endif f = -f end function soft_func end module kernels danieljprice-splash-4d1f09c/src/labels.f90000066400000000000000000000527451477365367100204600ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------- ! ! routines to do with storing and handling of plot labels ! !----------------------------------------------------------- module labels use params, only:maxplot,maxparttypes,maxhdr,ltag use asciiutils, only:count_non_blank implicit none integer, parameter :: lenlabel = 80 integer, parameter :: lenunitslabel = 40 ! length of units label character(len=lenlabel), dimension(maxplot+2) :: label,labelvec,labelreq,labelorig character(len=ltag), dimension(maxhdr) :: headertags character(len=20), dimension(maxparttypes) :: labeltype character(len=6), parameter :: labeldefault = 'column' character(len=lenunitslabel), dimension(0:maxplot), public :: unitslabel,unitslabel_default character(len=lenunitslabel) :: labelzintegration,labelzintegration_default integer, dimension(3) :: ix integer, dimension(maxplot) :: iamvec integer :: ivx,irho,iutherm,ipr,ih,irad,iBfirst,iBpol,iBtor,iax integer :: ipmass,ike,ispsound,itemp,ikappa integer :: idivb,iJfirst,irhostar,ipmomx integer :: iacplane,ipowerspec integer :: icv,iradenergy,iradFx integer :: isurfdens,itoomre integer :: ipdf,icolpixmap integer :: irhorestframe,idustfrac,ideltav integer :: idustfracsum,ideltavsum integer :: igrainsize,igraindens,ivrel integer :: irhodust_start,irhodust_end integer :: nreq public contains !-------------------------------------------------------------- ! ! utility to reset default settings for column identification ! !-------------------------------------------------------------- subroutine reset_columnids ! !--array positions of specific quantities ! Identification is used in exact solution ! plotting and calculation of additional quantities ! ix(:) = 0 ivx = 0 ! vx irho = 0 ! density ipr = 0 ! pressure iutherm = 0 ! thermal energy ih = 0 ! smoothing length irad = 0 ! radius ipmass = 0 ! particle mass ipr = 0 ! pressure irad = 0 ! radius ipowerspec = 0 ! power spectrum iBfirst = 0 ! Bx iax = 0 ! ax (acceleration) iBpol = 0 ! B_polx iBtor = 0 ! B_torx igrainsize = 0 ! grainsize igraindens = 0 ! graindens ivrel = 0 ! relative velocity itemp = 0 ! temperature ikappa = 0 ! opacity iradFx = 0 iacplane = 0 ike = 0 idivB = 0 iJfirst = 0 icv = 0 iradenergy = 0 icolpixmap = 0 irhorestframe = 0 idustfrac = 0 idustfracsum = 0 ideltav = 0 ideltavsum = 0 ipmomx = 0 irhodust_start = 0 irhodust_end = 0 headertags = '' end subroutine reset_columnids !-------------------------------------------------------------- ! ! set default column labels ! !-------------------------------------------------------------- subroutine set_default_labels(mylabel) character(len=*), intent(out) :: mylabel(:) integer :: i do i=1,size(mylabel) write(mylabel(i),"(a,1x,i3)") trim(labeldefault),i enddo end subroutine set_default_labels !-------------------------------------------------------------- ! ! query function for whether column is a spatial coordinate ! !-------------------------------------------------------------- logical function is_coord(icol,ndim) integer, intent(in) :: icol,ndim integer :: i is_coord = .false. do i=1,ndim if (ix(i)==icol) is_coord = .true. enddo end function is_coord !-------------------------------------------------------------- ! ! query function for whether column is a density ! mainly used to decide whether or not to use ! mass-weighted interpolation ! !-------------------------------------------------------------- logical function is_density(icol) integer, intent(in) :: icol is_density = .false. ! if we match known density columns if (icol==irho .or. icol==irhorestframe) is_density = .true. ! if label contains rho or dens if (icol > 0 .and. icol < size(label)) then if (index(label(icol),'rho') > 0) is_density = .true. if (index(label(icol),'dens') > 0) is_density = .true. else is_density = .true. ! icol = 0 should be true endif end function is_density !---------------------------------------------------------------- ! ! function returning the synonym of a label ! so two different labels can be identified as the same ! physical quantity, e.g. "radius" and "r" are both the radius ! !---------------------------------------------------------------- elemental function label_synonym(string) use asciiutils, only:lcase,string_delete character(len=*), intent(in) :: string character(len=max(len(string),8)) :: label_synonym character(len=len(string)) :: labeli integer :: k ! remove leading spaces and make lower case labeli = trim(adjustl(lcase(string))) ! split at whitespace or [ to avoid unit labels k = max(index(labeli,' '),index(labeli,'[')) if (k > 1) then labeli = labeli(1:k-1) endif ! also remove special characters call string_delete(labeli,'\d') call string_delete(labeli,'\u') call string_delete(labeli,'\') call string_delete(labeli,'_') ! remove log from the front of the label if (labeli(1:3)=='log') labeli = labeli(4:) if (labeli(1:3)=='den' .or. index(labeli,'rho') /= 0 .or. labeli(1:2)=='gr' .or. & (index(labeli,'density') /= 0 .and. irho==0)) then label_synonym = 'density' elseif (labeli(1:5)=='pmass' .or. labeli(1:13)=='particle mass') then label_synonym = 'pmass' elseif (trim(labeli)=='h' .or. labeli(1:6)=='smooth') then label_synonym = 'h' elseif (trim(labeli)=='u' .or. labeli(1:6)=='utherm' .or. labeli(1:5)=='eint' & .or.(index(labeli,'internal energy') /= 0)) then label_synonym = 'u' elseif (labeli(1:2)=='pr' .or. trim(labeli)=='p' .or. & (index(labeli,'pressure') /= 0 .and. ipr==0)) then label_synonym = 'pressure' elseif (trim(labeli)=='r' .or. labeli(1:3)=='rad') then label_synonym = 'radius' else ! by default the label synonym is the same as the original label label_synonym = labeli endif end function label_synonym !-------------------------------------------------------------- ! ! query function for whether column is a spatial coordinate ! returns the location of the third dimension in the ! list of columns ! !-------------------------------------------------------------- integer function get_z_dir(ndim,iplotx,iploty) result(iplotz) integer, intent(in) :: ndim,iplotx,iploty integer :: i iplotz = 0 do i=1,ndim if ((iplotx /= iploty.and. & (ix(i) /= iplotx).and.(ix(i) /= iploty))) iplotz = ix(i) enddo end function get_z_dir !-------------------------------------------------------------- ! ! query function for which coordinate is z ! returns an integer between 1 and ndim ! !-------------------------------------------------------------- integer function get_z_coord(ndim,iplotx,iploty) result(iplotz) integer, intent(in) :: ndim,iplotx,iploty integer :: i i = get_z_dir(ndim,iplotx,iploty) iplotz = i - ix(1) + 1 if (iplotz < 0) iplotz = 1 if (iplotz > ndim) iplotz = ndim end function get_z_coord !----------------------------------------------------------------- ! ! utility to strip the units label from a label string ! !----------------------------------------------------------------- elemental function strip_units(string,unitslab) character(len=lenlabel), intent(in) :: string character(len=*), intent(in) :: unitslab character(len=lenlabel) :: strip_units integer :: ipos strip_units = string if (len_trim(unitslab) > 0) then !--remove units label (only do this once) ipos = index(trim(strip_units),trim(unitslab)) if (ipos /= 0) then strip_units = strip_units(1:ipos-1)//& strip_units(ipos+len_trim(unitslab)+1:len_trim(strip_units)) endif endif end function strip_units !----------------------------------------------------------------- ! ! utility to strip spaces, escape sequences and ! units labels from strings (this can be called for both ! function strings and variable labels) ! !----------------------------------------------------------------- elemental function shortstring(string,unitslab) use asciiutils, only:string_delete character(len=lenlabel), intent(in) :: string character(len=*), intent(in), optional :: unitslab character(len=lenlabel) :: shortstring shortstring = string !--strip off the units label if (present(unitslab)) shortstring = strip_units(shortstring,unitslab) !--remove spaces call string_delete(shortstring,' ') !--remove escape sequences (\d etc.) call string_delete(shortstring,'\d') call string_delete(shortstring,'\u') call string_delete(shortstring,'\g') call string_delete(shortstring,'\') call string_delete(shortstring,'_') end function shortstring !------------------------------------------------------------------ ! ! Same as shortstring, but also strips any arithmetic operators ! should be applied to variable names, but not function strings ! !----------------------------------------------------------------- elemental function shortlabel(string,unitslab,lc) use asciiutils, only:string_delete,lcase character(len=lenlabel), intent(in) :: string character(len=*), intent(in), optional :: unitslab character(len=lenlabel) :: shortlabel logical, intent(in), optional :: lc if (present(unitslab)) then shortlabel = shortstring(string,unitslab) else shortlabel = shortstring(string) endif !--remove arithmetic operators from labels call string_delete(shortlabel,'**') call string_delete(shortlabel,'/') call string_delete(shortlabel,'*') call string_delete(shortlabel,'+') call string_delete(shortlabel,'-') call string_delete(shortlabel,'^') call string_delete(shortlabel,'sqrt(') call string_delete(shortlabel,'(') call string_delete(shortlabel,')') call string_delete(shortlabel,'{') call string_delete(shortlabel,'}') call string_delete(shortlabel,'[') call string_delete(shortlabel,']') call string_delete(shortlabel,'<') call string_delete(shortlabel,'>') call string_delete(shortlabel,'\(2268)') if (present(lc)) then if (lc) shortlabel = lcase(shortlabel) endif end function shortlabel !--------------------------------------------------------------- ! interface for adjusting the label for column-integrated plots !--------------------------------------------------------------- function integrate_label(labelin,iplot,izcol,normalise,iRescale,labelzint,& projlabelformat,iapplyprojformat) use asciiutils, only:string_replace,string_delete character(len=*), intent(in) :: labelin,labelzint,projlabelformat integer, intent(in) :: iplot,izcol,iapplyprojformat logical, intent(in) :: normalise,iRescale character(len=len(label)+20) :: integrate_label if (len_trim(projlabelformat) /= 0 .and. (iapplyprojformat==0 .or. iapplyprojformat==iplot)) then integrate_label = projlabelformat call string_replace(integrate_label,'%l',trim(labelin)) if (iRescale) then call string_replace(integrate_label,'%z',trim(label(izcol)(1:index(label(izcol),unitslabel(izcol))-1))) call string_replace(integrate_label,'%uz',trim(unitslabel(izcol))) else call string_replace(integrate_label,'%z',trim(label(izcol))) endif else if (normalise) then integrate_label = '< '//trim(labelin)//' >' else if (iRescale) then ! use composite units label e.g. \int rho_d [g/cm^3 pc] integrate_label = '\int '// & trim(labelin(1:index(labelin,unitslabel(iplot))-1))//' d'// & trim(label(izcol)(1:index(label(izcol),unitslabel(izcol))-1))// & get_unitlabel_coldens(iRescale,labelzint,unitslabel(iplot)) ! use mix of units labels \int rho_d [g/cm^3] dz [pc] !integrate_label = '\int '//trim(labelin)//' d'// & ! trim(label(izcol)(1:index(label(izcol),unitslabel(izcol))-1))//trim(labelzint) else integrate_label = '\int '//trim(labelin)//' d'//trim(shortlabel(label(izcol),unitslabel(izcol))) endif if (index(labelin,'\rho_{d,') > 0) then integrate_label = labelin(1:index(labelin,unitslabel(iplot))-1) call string_delete(integrate_label,'\rho_{d,') call string_delete(integrate_label,'}') integrate_label = trim(integrate_label)//' dust surface density' integrate_label = trim(integrate_label)//get_unitlabel_coldens(iRescale,labelzint,unitslabel(iplot)) endif if (iplot==irho .and. (index(labelin,'density') /= 0 .or. index(labelin,'rho') /= 0)) then integrate_label = 'column density' integrate_label = trim(integrate_label)//get_unitlabel_coldens(iRescale,labelzint,unitslabel(irho)) endif endif endif end function integrate_label !----------------------------------------------------------------- ! ! utility to convert the units label to g/cm^2 where appropriate ! would be nice to have a more robust way of knowing what the units mean ! !----------------------------------------------------------------- function get_unitlabel_coldens(iRescale,labelzint,unitlabel) use asciiutils, only:string_delete,string_replace logical, intent(in) :: iRescale character(len=*), intent(in) :: labelzint,unitlabel character(len=lenunitslabel) :: get_unitlabel_coldens if (iRescale .and. len_trim(labelzint) > 0) then get_unitlabel_coldens = trim(unitlabel)//trim(labelzint) call string_delete(get_unitlabel_coldens,']') call string_delete(get_unitlabel_coldens,'[') get_unitlabel_coldens = ' ['//trim(adjustl(get_unitlabel_coldens))//']' call string_replace(get_unitlabel_coldens,'/cm\u3\d cm','/cm^2') call string_replace(get_unitlabel_coldens,'/cm^3 cm','/cm^2') else get_unitlabel_coldens = ' ' endif end function get_unitlabel_coldens !----------------------------------------------------------------- ! ! utility to "guess" which particle type contains sink particles ! from the label ! !----------------------------------------------------------------- integer function get_sink_type(ntypes) integer, intent(in) :: ntypes integer :: i get_sink_type = 0 do i=1,ntypes if (get_sink_type==0 .and. index(labeltype(i),'sink') /= 0) get_sink_type = i if (get_sink_type==0 .and. index(labeltype(i),'compact object') /= 0) get_sink_type = i if (get_sink_type==0 .and. index(labeltype(i),'point mass') /= 0) get_sink_type = i enddo end function get_sink_type !----------------------------------------------------------------- ! ! utility to neatly print number of particles by type ! !----------------------------------------------------------------- subroutine print_types(noftype,ltype) integer, dimension(:), intent(in) :: noftype character(len=*), dimension(:), intent(in) :: ltype integer :: itype,n,i character(len=1) :: sp i = 0 sp = ' ' do itype=1,size(noftype) n = noftype(itype) if (n > 0) then i = i + 1 if (i > 1) sp = ',' if (n < 10000) then write(*,"(a,i4)",advance='no') trim(sp)//' n('//trim(ltype(itype))//') = ',n elseif (n < 1000000) then write(*,"(a,i6)",advance='no') trim(sp)//' n('//trim(ltype(itype))//') = ',n elseif (n < 100000000) then write(*,"(a,i8)",advance='no') trim(sp)//' n('//trim(ltype(itype))//') = ',n else write(*,"(a,i10)",advance='no') trim(sp)//' n('//trim(ltype(itype))//') = ',n endif endif enddo write(*,*) end subroutine print_types !----------------------------------------------------------------- ! ! utility to make labels for vector quantities ! these change depending on the coordinate system ! e.g. v_x, v_y, v_z; B_x, B_y, B_z ! !----------------------------------------------------------------- subroutine make_vector_label(lvec,ivec,nvec,iamveci,labelveci,labeli,labelx) character(len=*), intent(in) :: lvec integer, intent(in) :: ivec,nvec integer, intent(inout) :: iamveci(:) character(len=*), intent(inout) :: labelveci(:),labeli(:) character(len=*), intent(in) :: labelx(3) integer :: i character(len=len(lvec)) :: tmplvec tmplvec = lvec if (ivec > 0 .and. ivec+nvec <= size(labeli)) then iamveci(ivec:ivec+nvec-1) = ivec labelveci(ivec:ivec+nvec-1) = tmplvec do i=1,nvec labeli(ivec+i-1) = trim(tmplvec)//'_'//labelx(i) enddo endif end subroutine make_vector_label !----------------------------------------------------------------- ! ! utility to neatly format a grain size for use in plot label ! !----------------------------------------------------------------- function get_label_grain_size(sizecm) result(string) use asciiutils, only:string_delete real, intent(in) :: sizecm character(len=16) :: string character(len=6) :: ulab if (sizecm >= 1000.) then write(string,"(1pg10.3)") sizecm*1.e-5 ulab = 'km' elseif (sizecm >= 100.) then write(string,"(1pg10.3)") sizecm*0.01 ulab = 'm' elseif (sizecm >= 1.) then write(string,"(1pg10.3)") sizecm ulab = 'cm' elseif (sizecm >= 0.09) then write(string,"(1pg10.3)") sizecm*10. ulab = 'mm' elseif (sizecm >= 1.e-4) then write(string,"(1pg10.3)") sizecm*1.e4 ulab = '\gmm' elseif (sizecm >= 1.e-7) then write(string,"(1pg10.3)") sizecm*1.e7 ulab = 'nm' else write(string,"(1pg10.3)") sizecm ulab = 'cm' endif string = adjustl(string) call string_delete(string,'.000 ') call string_delete(string,'.00 ') call string_delete(string,'.0 ') call string_delete(string,'. ') string = trim(string)//trim(ulab) end function get_label_grain_size !----------------------------------------------------------------- ! ! save the list of labels that are actually used for plotting ! !----------------------------------------------------------------- subroutine set_required_labels(required) logical, intent(in) :: required(0:) integer :: icol ! save original list of labels labelorig = label nreq = 0 labelreq = '' do icol=1,size(required)-1 nreq = nreq + 1 if (required(icol)) then labelreq(icol) = shortlabel(label(icol),unitslabel(icol)) endif enddo !print*,'DEBUG: required labels:' !do icol=1,nreq ! if (len_trim(labelreq(icol)) > 0) print*,trim(labelreq(icol)) !enddo end subroutine set_required_labels !----------------------------------------------------------------- ! ! see if a column has shifted in the actual data ! !----------------------------------------------------------------- integer function check_for_shifted_column(icol,labelnew) result(inew) use asciiutils, only:match_tag integer, intent(in) :: icol character(len=*), intent(out), optional :: labelnew character(len=lenlabel) :: labelcol inew = icol labelcol = shortlabel(label(icol),unitslabel(icol)) if (trim(labelcol) /= trim(labelreq(icol)) .and. len_trim(labelreq(icol)) > 0) then if (.not.present(labelnew)) write(*,"(1x,a,i3,a)",advance='no') 'column ',icol,' has shifted: was '//& trim(labelreq(icol))//' but got '//trim(labelcol) inew = match_tag(shortlabel(label(1:maxplot),unitslabel(1:maxplot)),labelreq(icol)) if (inew > 0) then if (present(labelnew)) then labelnew = trim(shortlabel(label(inew),unitslabel(inew)))//trim(unitslabel(icol)) else print "(1x,a,i3)",': found '//trim(shortlabel(label(inew),unitslabel(inew)))//' in col ',inew endif else inew = icol endif endif end function check_for_shifted_column !----------------------------------------------------------------- ! ! compute the backwards map from inew -> icol based on where ! a column has been shifted to. This enables lookup of original ! units etc which can be used to scale the data ! !----------------------------------------------------------------- function map_shifted_columns() result(imap) integer :: imap(maxplot) integer :: i,icol do i=1,size(imap) imap(i) = i enddo do i=1,size(imap) icol = i if (len_trim(label(i)) > 0) icol = check_for_shifted_column(i) if (icol /= i .and. icol > 0) then !print*,i,' setting imap=',icol imap(icol) = i endif enddo end function map_shifted_columns !----------------------------------------------------------------- ! ! set labels for columns which have been tagged as vectors ! using the iamvec label ! !----------------------------------------------------------------- subroutine set_vector_labels(ncolumns,ndimV,iamveci,labelveci,labeli,labelcoordi) integer, intent(in) :: ncolumns,ndimV integer, intent(inout) :: iamveci(:) character(len=*), intent(in) :: labelcoordi(:) character(len=lenlabel), intent(inout) :: labelveci(:),labeli(:) character(len=lenlabel) :: tmplabel integer :: i ! !--set labels for vector quantities ! i = 1 do while (i <= ncolumns) if (iamvec(i) > 0) then tmplabel = labeli(i) call make_vector_label(tmplabel,i,ndimV,iamveci,labelveci,labeli,labelcoordi) i = i + ndimV else i = i + 1 endif enddo end subroutine set_vector_labels end module labels danieljprice-splash-4d1f09c/src/legends.f90000066400000000000000000000415311477365367100206260ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2018 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! module containing routines for plotting legends in PGPLOT ! subroutines: ! legend : plots time on plots ! legend_vec : plots legend with vector arrow ! legend_markers : plots different particle types ! legend_scale : plots a scale on co-ordinate plots !----------------------------------------------------------------- module legends implicit none public :: legend, legend_vec, legend_markers, legend_scale public :: prompt_panelselect, ipanelselect public :: in_legend ! store bounding box of each legend in global variables type box real :: x1,x2,y1,y2 end type box integer, parameter :: nlegend_types = 4 integer, parameter, public :: & ilegend = 1, & ilegend_vec = 2, & ilegend_markers = 3, & ilegend_scale = 4 type(box) :: bbox(nlegend_types) private contains !----------------------------------------------------------------- ! plots time on plot ! arguments: ! t : current time ! hpos : horizontal position as fraction of viewport ! vpos : vertical position in character heights from top !----------------------------------------------------------------- subroutine legend(legendtext,t,nvar,allvars,tags,unitslabel,hpos,vpos,fjust,usebox) use plotlib, only:plot_annotate use asciiutils, only:string_replace use parsetext, only:parse_text,rn use params, only:ltag real, intent(in) :: t,hpos,vpos,fjust integer, intent(in) :: nvar real, intent(in), dimension(nvar) :: allvars character(len=*), dimension(nvar), intent(in) :: tags character(len=*), intent(in) :: legendtext,unitslabel logical, intent(in) :: usebox character(len=len(legendtext)+len(unitslabel)+20) :: label real(kind=rn), dimension(nvar+1) :: vals character(len=ltag), dimension(nvar+1) :: vars label = trim(legendtext) ! ! if string does not contain any formatting ! append the time variable to it ! if (index(label,'%') <= 0) then if (t < 1.) then label = trim(label)//'%t.2' else label = trim(label)//'%t.3' endif endif ! ! parse string for functions of time and formatting ! i.e. %t.5 ! vars(1) = 't' vals(1) = real(t,kind=rn) if (nvar > 1) then vars(2:1+nvar) = tags(1:nvar) vals(2:1+nvar) = allvars(1:nvar) endif call parse_text(label,vars,vals) if (index(label,'%ut') > 0) then call string_replace(label,'%ut',trim(unitslabel)) else label = trim(label)//trim(unitslabel) endif if (usebox) call plot_box_around_text('T',trim(label),hpos,vpos,fjust) call plot_annotate('T',-vpos,hpos,fjust,trim(label)) ! save bounding box of legend for later queries call save_bbox('T',trim(label),hpos,vpos,fjust,ilegend) end subroutine legend !----------------------------------------------------------------- ! utility routine for plotting translucent box in legends !----------------------------------------------------------------- subroutine plot_box_around_text(pos,string,hpos,vpos,fjust) use plotlib, only:plot_qci,plot_sci,plot_sfs,plot_set_opacity,plot_rect character(len=1), intent(in) :: pos character(len=*), intent(in) :: string real, intent(in) :: hpos,vpos,fjust real :: x1,x2,y1,y2,ych integer :: ic call get_box_around_text(pos,string,hpos,vpos,fjust,x1,x2,y1,y2,ych) ! !--draw box around the string ! call plot_qci(ic) ! query colour index call plot_sci(0) ! background colour call plot_sfs(1) ! solid fill style call plot_set_opacity(0.5) call plot_rect(x1,x2,y1,y2,0.2*ych) ! draw a (rounded) rectangle call plot_set_opacity(1.0) call plot_sci(ic) ! restore colour index end subroutine plot_box_around_text !----------------------------------------------------------------- ! helper routine to find the bounding box of a text string !----------------------------------------------------------------- subroutine get_box_around_text(pos,string,hpos,vpos,fjust,x1,x2,y1,y2,ych) use plotlib, only:plot_qwin,plot_qcs,plot_qtxt character(len=1), intent(in) :: pos character(len=*), intent(in) :: string real, intent(in) :: hpos,vpos,fjust real, intent(out) :: x1,x2,y1,y2,ych real :: xmin,xmax,ymin,ymax,xpos,ypos real :: xbuf,ybuf,dx,dy,xch real :: xbox(4),ybox(4) ! !--convert hpos and vpos to x, y to plot arrow ! call plot_qwin(xmin,xmax,ymin,ymax) xpos = xmin + hpos*(xmax-xmin) call plot_qcs(4,xch,ych) select case(pos) case('B') ! from bottom ypos = ymin + (vpos + 1.)*ych case default ! 'T' = from top ypos = ymax - (vpos + 1.)*ych end select ! !--enquire bounding box of string ! call plot_qtxt(xpos,ypos,0.0,0.0,trim(string),xbox,ybox) xbuf = 0.25*xch ybuf = 0.5*ych dx = xbox(3) - xbox(1) dy = ybox(3) - ybox(1) + 0.25*ych x1 = xpos - fjust*dx - xbuf x2 = x1 + dx + 2.*xbuf y1 = ypos y2 = y1 + dy + ybuf end subroutine get_box_around_text !----------------------------------------------------------------- ! save the bounding box of a text string into the relevant ! global variable !----------------------------------------------------------------- subroutine save_bbox(pos,string,hpos,vpos,fjust,id) character(len=1), intent(in) :: pos character(len=*), intent(in) :: string real, intent(in) :: hpos,vpos,fjust integer, intent(in) :: id real :: ych if (id > 0 .and. id <= nlegend_types) then call get_box_around_text(pos,string,hpos,vpos,fjust,& bbox(id)%x1,bbox(id)%x2,bbox(id)%y1,bbox(id)%y2,ych) endif end subroutine save_bbox !----------------------------------------------------------------- ! plots vector plot legend ! arguments: ! t : current time ! hpos : horizontal position as fraction of viewport ! vpos : vertical position in character heights from top ! charheight : this is the text character height ! (legend_vec is called directly after plotting the arrows, ! which may use a different character size - so we plot ! the arrow here in the same way, but then revert to ! the text character height to write the text) !----------------------------------------------------------------- subroutine legend_vec(label,unitslabel,vecmax,dx,hpos,vpos,charheight) use plotlib, only:plot_qwin,plot_qch,plot_sch,plot_qcs,plot_numb,plot_qtxt, & plot_qci,plot_sci,plot_sfs,plot_rect,plot_sci,plot_text, & plot_qvp,plot_svp,plot_swin,plot_arro,plot_set_opacity real, intent(in) :: vecmax,dx,hpos,vpos,charheight character(len=*), intent(in) :: label,unitslabel real :: xmin,xmax,ymin,ymax real :: xch,ych,charheightarrow,adjustlength,vecmaxnew real :: xpos,ypos,xbox(4),ybox(4),dxlabel,dxstring real :: dxbuffer,dybuffer,dxbox,dybox real :: xminnew,xmaxnew,yminnew,ymaxnew,x1,x2,y1,y2 integer :: icolindex,mm,pp,nc,ndec character(len=len(label)+20) :: string ! !--convert hpos and vpos to x, y to plot arrow ! call plot_qwin(xmin,xmax,ymin,ymax) call plot_qch(charheightarrow) call plot_sch(charheight) xpos = xmin + hpos*(xmax-xmin) call plot_qcs(4,xch,ych) ypos = ymax - (vpos + 1.)*ych ! !--format string containing numerical value ! vecmax corresponds to arrow of length dx ! we will draw an arrow of length sqrt(dx^2 + ych^2) ! so adjust vecmax accordingly ! adjustlength = sqrt(0.5*dx**2 + ych**2)/dx vecmaxnew = adjustlength*vecmax ndec = 2 if (vecmaxnew < tiny(vecmaxnew)) then string = '0' nc = 1 else mm=int(vecmaxnew/10.**(int(log10(vecmaxnew)-ndec))) pp=int(log10(vecmaxnew)-ndec) call plot_numb(mm,pp,0,string,nc) endif string = '='//trim(string) ! write(string,"('=',1pe7.1)") vecmax ! !--enquire size of label ! call plot_qtxt(xpos,ypos,0.0,0.0,trim(label),xbox,ybox) dxlabel = xbox(3) - xbox(2) + 0.5*xch ! !--enquire size of string + units label ! call plot_qtxt(xpos,ypos,0.0,0.0,trim(string)//trim(unitslabel),xbox,ybox) dxstring = xbox(3) - xbox(2) ! !--set size of box in x direction ! dxbuffer = 0.25*xch ! these are size of margins (x and y) dybuffer = 0.25*ych dxbox = dxlabel + dxstring + 1.1*dx/sqrt(2.) + dxbuffer dybox = ych + 0.5*dybuffer ! !--draw box around all of the legend ! call plot_qci(icolindex) ! draw a (rounded) rectangle in the background colour with solid fill style call plot_sci(0) call plot_sfs(1) call plot_set_opacity(0.66) x1 = xpos - dxbuffer x2 = xpos + dxbox y1 = ypos - dybuffer y2 = ypos + dybox call plot_rect(x1,x2,y1,y2,0.33*ych) call plot_set_opacity(1.0) ! change to foreground colour index call plot_sci(1) ! draw an outline around the box ! call pgsfs(2) ! call pgrect(xpos-dxbuffer,xpos+dxbox,ypos-dybuffer,ypos + dybox) ! call pgsfs(1) ! !--save bounding box ! bbox(ilegend_vec)%x1 = x1 bbox(ilegend_vec)%x2 = x2 bbox(ilegend_vec)%y1 = y1 bbox(ilegend_vec)%y2 = y2 ! !--write label ! call plot_text(xpos,ypos,trim(label)) xpos = xpos + dxlabel ! !--Draw arrow. Here we have to perform tricks to get the arrow ! to appear even if outside the usual plotting area ! !--save viewport settings call plot_qvp(0,x1,x2,y1,y2) !--now allow the whole screen to be the viewport... call plot_svp(0.0,1.0,0.0,1.0) ! ...but correspondingly adjust window so that x and y positions ! are the same as in the old viewport xminnew = xmin - x1*(xmax-xmin)/(x2-x1) xmaxnew = xmax + (1.-x2)*(xmax-xmin)/(x2-x1) yminnew = ymin - y1*(ymax-ymin)/(y2-y1) ymaxnew = ymax + (1.-y2)*(ymax-ymin)/(y2-y1) call plot_swin(xminnew,xmaxnew,yminnew,ymaxnew) !--use character height original arrows were drawn with ! (this is to get the arrow head size right) call plot_sch(charheightarrow) !--draw arrow call plot_arro(xpos,ypos,xpos + dx/sqrt(2.),ypos + ych) !--restore viewport settings call plot_svp(x1,x2,y1,y2) call plot_swin(xmin,xmax,ymin,ymax) xpos = xpos + 1.1*dx/sqrt(2.) ! !--write numerical value and units label ! call plot_sch(charheight) !! call pgmtext('t',-vpos,hpos+0.02,0.0,trim(string)) call plot_text(xpos,ypos,trim(string)//trim(unitslabel)) ! !--restore colour index call plot_sci(icolindex) end subroutine legend_vec !------------------------------------------------------------------------- ! draw a legend for different line/marker styles ! uses current line style and colour ! plots this below the time legend !------------------------------------------------------------------------- subroutine legend_markers(icall,icolour,imarkerstyle,ilinestyle, & iplotpts,iplotline,text,hposlegend,vposlegend,alphalegend) use plotlib, only:plot_qwin,plot_qcs,plot_qci,plot_qls,plot_sci,plot_sls, & plot_line,plot_pt,plot_text,plot_stbg,plot_slc,plot_qlc,plot_set_opacity integer, intent(in) :: icall,icolour,imarkerstyle,ilinestyle logical, intent(in) :: iplotpts,iplotline character(len=*), intent(in) :: text real, intent(in) :: hposlegend,vposlegend,alphalegend integer :: icolourprev, ilinestyleprev,ilinecapprev real, dimension(3) :: xline,yline real :: xch, ych, xmin, xmax, ymin, ymax real :: vspace, vpos ! !--do not plot anything if string is blank ! if (len_trim(text) <= 0) return !call pgstbg(0) ! opaque text to overwrite previous ! !--set horizontal and vertical position and spacing ! in units of the character height ! vspace = 1.5 ! (in units of character heights) vpos = vposlegend + icall*vspace + 0.5 ! distance from top, in units of char height call plot_qwin(xmin,xmax,ymin,ymax) ! query xmax, ymax call plot_qcs(4,xch,ych) ! query character height in x and y units call plot_qci(icolourprev) ! save current colour index call plot_qls(ilinestyleprev) ! save current line style call plot_qlc(ilinecapprev) ! save the current line cap yline(:) = ymax - ((vpos - 0.5)*ych) xline(1) = xmin + hposlegend*(xmax-xmin) xline(2) = xline(1) + 1.5*xch xline(3) = xline(1) + 3.*xch call plot_sci(icolour) call plot_set_opacity(alphalegend) call plot_sls(ilinestyle) ! !--set round caps ! !call plot_slc(1) ! !--draw a small line segment ! if (iplotline) call plot_line(3,xline,yline) call plot_slc(ilinecapprev) call plot_sls(ilinestyleprev) ! !--draw points, only two if line is also plotted so that you can see the line ! three otherwise ! if (iplotpts .and. iplotline) then xline(2) = xline(3) call plot_pt(2,xline(1:2),yline(1:2),imarkerstyle) elseif (iplotpts) then call plot_pt(3,xline,yline,imarkerstyle) endif ! !--add text ! if (iplotline .or. iplotpts .and. len_trim(text) > 0) then call plot_text(xline(3) + 0.75*xch,yline(1)-0.25*ych,trim(text)) endif ! save (approximate) bounding box of legend for later queries call save_bbox('T',trim(text),hposlegend,vpos,0.,ilegend_markers) ! count the number of lines to give the extent in the y direction bbox(ilegend_markers)%y2 = bbox(ilegend_markers)%y2 + icall*ych call plot_sci(icolourprev) ! reset colour index call plot_set_opacity(1.0) call plot_stbg(-1) ! reset text background to transparent end subroutine legend_markers !------------------------------------------------------------------- ! plots labelled scale (horizontal error bar of a given length) ! can be used on co-ordinate plots to give a length scale ! ! e.g. would produce something like: ! ! |----| ! 10 AU ! ! arguments: ! dxscale : length of scale in current x units ! hpos : horizontal position as fraction of viewport ! vpos : vertical position in character heights from top ! text : label to print above scale !----------------------------------------------------------------- subroutine legend_scale(dxscale,hpos,vpos,text) use plotlib, only:plot_qwin,plot_qcs,plot_err1,plot_annotate real, intent(in) :: dxscale,hpos,vpos character(len=*), intent(in) :: text real :: xmin,xmax,ymin,ymax,xch,ych,xpos,ypos call plot_qwin(xmin,xmax,ymin,ymax) if (dxscale > (xmax-xmin)) then print "(a)",'Error: scale size exceeds x dimensions: scale not plotted' else call plot_qcs(4,xch,ych) !--draw horizontal "error bar" above text ypos = ymin + (vpos+1.25)*ych xpos = xmin + hpos*(xmax-xmin) call plot_err1(5,xpos,ypos,0.5*dxscale,1.0) !--write text at the position specified call plot_annotate('B',-vpos,hpos,0.5,trim(text)) ! save (approximate) bounding box of legend for later queries call save_bbox('B',trim(text),hpos,-vpos,0.5,ilegend_scale) endif end subroutine legend_scale !------------------------------------------------------------------- ! The following subroutines handle the plotting of annotation ! and legends only on particular panels !------------------------------------------------------------------- subroutine prompt_panelselect(string,iselect) use prompting, only:prompt character(len=*), intent(in) :: string integer, intent(inout) :: iselect print "(4(/,a))", & ' 0 : plot '//trim(string)//' on every panel ', & ' n : plot '//trim(string)//' on nth panel only ', & ' -1 : plot '//trim(string)//' on first row only ', & ' -2 : plot '//trim(string)//' on first column only ' call prompt('Enter selection ',iselect,-2) end subroutine prompt_panelselect !------------------------------------------------------------------- ! Function that evaluates the logic required to determine ! whether the annotation should be plotted on the current panel ! as per the prompts in prompt_panelselect !------------------------------------------------------------------- logical function ipanelselect(iselect,ipanel,irow,icolumn) integer, intent(in) :: iselect,ipanel,irow,icolumn ipanelselect = ((iselect > 0 .and. ipanel==iselect) & .or.(iselect==-1 .and. irow==1) & .or.(iselect==-2 .and. icolumn==1) & .or.(iselect==0)) end function ipanelselect !------------------------------------------------------------------- ! Function to determine whether the mouse is positioned over ! one of the legends !------------------------------------------------------------------- integer function in_legend(xpt,ypt) real, intent(in) :: xpt,ypt integer :: id in_legend = 0 do id=1,nlegend_types if (xpt >= bbox(id)%x1 .and. xpt <= bbox(id)%x2 .and. & ypt >= bbox(id)%y1 .and. ypt <= bbox(id)%y2) then in_legend = id exit ! exit loop endif enddo end function in_legend end module legends danieljprice-splash-4d1f09c/src/libexact.f90000066400000000000000000000255041477365367100210020ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2020 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module providing library version of splash exact routines ! specifies c interfaces to corresponding Fortran subroutines !------------------------------------------------------------------------- module libexact use shock, only:exact_shock use shock_sr, only:exact_shock_sr use sedov, only:exact_sedov use polytrope, only:exact_polytrope use toystar1D, only:exact_toystar1D use toystar2D, only:exact_toystar2D use gresho, only:exact_gresho use mhdshock, only:exact_mhdshock use rhoh, only:exact_rhoh use densityprofiles, only:exact_densityprofiles use torus, only:exact_torus use ringspread, only:exact_ringspread use dustywaves, only:exact_dustywave use rochelobe, only:exact_rochelobe use cshock, only:exact_cshock use planetdisc, only:exact_planetdisc use bondi, only:exact_bondi use libutils, only:check_argcv, c_real use iso_c_binding, only:c_int, c_bool implicit none public contains subroutine check_argcv_c() bind(c, name='check_argcv') call check_argcv() end subroutine check_argcv_c subroutine shock_c(iplot,npart,time,gamma,xshock,rho_L,rho_R,p_L,p_R,v_L,v_R,& rdust_to_gas,xplot,yplot,ierr) bind(c, name='_shock') integer(c_int), intent(in) :: iplot, npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,gamma,xshock real(c_real), intent(in) :: rho_L,rho_R,p_L,p_R,v_L,v_R,rdust_to_gas real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_shock(iplot,time,gamma,xshock,rho_L,rho_R,p_L,p_R,v_L,v_R,& rdust_to_gas,xplot,yplot,ierr) end subroutine shock_c subroutine shock_sr_c(iplot,npart,time,gamma,rho_L,rho_R,p_L,p_R,v_L,v_R,& xplot,yplot,ierr) bind(c, name='_shock_sr') integer(c_int), intent(in) :: iplot, npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,gamma real(c_real), intent(in) :: rho_L,rho_R,p_L,p_R,v_L,v_R real(c_real), intent(inout) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_shock_sr(iplot,time,gamma,rho_L,rho_R,p_L,p_R,v_L,v_R,xplot,yplot,ierr) end subroutine shock_sr_c subroutine sedov_c(iplot,npart,time,gamma,rhozero,energy,rmax,& rplot,yplot,ierr) bind(c, name='_sedov') integer(c_int), intent(in) :: iplot, npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,gamma real(c_real), intent(in) :: rhozero,energy,rmax real(c_real), intent(inout) :: rplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_sedov(iplot,time,gamma,rhozero,energy,rmax,rplot,yplot,ierr) end subroutine sedov_c subroutine polytrope_c(npart,gamma,polyk,totmass,rplot,yplot,& npartout,ierr) bind(c, name='_polytrope') integer(c_int), intent(in) :: npart integer(c_int), intent(out) :: ierr,npartout real(c_real), intent(in) :: gamma,polyk,totmass real(c_real), intent(inout) :: rplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_polytrope(gamma,polyk,totmass,rplot,yplot,npartout,ierr) end subroutine polytrope_c subroutine toystar1D_c(iplot,npart,time,gamma,H0,A0,C0,sigma,norder,& xplot,yplot,ierr) bind(c, name='_toystar1D') integer(c_int), intent(in) :: iplot,npart,norder integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,gamma,sigma,H0,A0,C0 real(c_real), intent(inout) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_toystar1D(iplot,time,gamma,H0,A0,C0,sigma,& norder,xplot,yplot,npart,ierr) end subroutine toystar1D_c subroutine toystar2D_c(iplot,npart,time,gamma,polyk,totmass,ampl,& denscentre,C0,jorder,morder,V11,V22,V12,V21,& xplot,yplot,ierr) bind(c, name='_toystar2D') integer(c_int), intent(in) :: iplot,npart,jorder,morder integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,gamma,polyk,totmass,& C0, ampl, denscentre,& V11,V22,V12,V21 real(c_real), intent(inout) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_toystar2D(iplot,time,gamma,polyk,totmass, & ampl,denscentre,C0,jorder,morder, & V11,V22,V12,V21,xplot,yplot,ierr) end subroutine toystar2D_c subroutine gresho_c(iplot,npart,xplot,yplot,ierr) bind(c, name='_gresho') integer(c_int), intent(in) :: iplot,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_gresho(iplot,xplot,yplot,ierr) end subroutine gresho_c subroutine mhdshock_c(iplot,npart,ishk,time,gamma,xmin,xmax,xshock,& xplot,yplot,npts,ierr) bind(c, name='_mhdshock') integer(c_int), intent(in) :: iplot,npart,ishk integer(c_int), intent(out) :: npts,ierr real(c_real), intent(in) :: time,gamma,xmin,xmax,xshock real(c_real), intent(inout) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_mhdshock(iplot,ishk,time,gamma,xmin,xmax,xshock,xplot,yplot,npts,ierr) end subroutine mhdshock_c subroutine rhoh_c(iplot,npart,ndim,hfact,pmassval,& xplot,yplot,ierr) bind(c, name='_rhoh') integer(c_int), intent(in) :: iplot,ndim,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: hfact,pmassval real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_rhoh(iplot,ndim,hfact,pmassval,xplot,yplot,ierr) end subroutine rhoh_c subroutine densityprofiles_c(iplot,npart,iprofile,Mspherex,Mspherey,& rsoftx,rsofty,xplot,yplot,ierr)& bind(c, name='_denstyprofiles') integer(c_int), intent(in) :: iplot,iprofile,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: Mspherex,Mspherey,rsoftx,rsofty real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_densityprofiles(iplot,iprofile,[Mspherex,Mspherey],& [rsoftx,rsofty],xplot,yplot,ierr) end subroutine densityprofiles_c subroutine torus_c(iplot,npart,itorus,Mstar,Rtorus,AA,distortion,& gamma,xplot,yplot,ierr) bind(c, name='_torus') integer(c_int), intent(in) :: iplot,itorus,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: Mstar,Rtorus,AA,gamma,distortion real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_torus(iplot,itorus,Mstar,Rtorus,AA,distortion,gamma,xplot,yplot,ierr) end subroutine torus_c subroutine ringspread_c(iplot,npart,time,Mdisk,Rdisk,viscnu,& xplot,yplot,ierr) bind(c, name='_ringspread') integer(c_int), intent(in) :: iplot,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,Mdisk,Rdisk,viscnu real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_ringspread(iplot,time,Mdisk,Rdisk,viscnu,xplot,yplot,ierr) end subroutine ringspread_c subroutine dustywave_c(iplot,npart,time,ampl,cs,Kdragin,lambda,x0,& rhog0,rhod0,xplot,yplot,ierr) bind(c, name='_dustywave') integer(c_int), intent(in) :: iplot,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time, ampl, cs, Kdragin, lambda, x0, rhog0, rhod0 real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_dustywave(iplot,time,ampl,cs,Kdragin,lambda,x0,& rhog0,rhod0,xplot,yplot,ierr) end subroutine dustywave_c subroutine rochelobe_c(npart,x1,y1,x2,y2,m1,m2,& xplot,yplot,ierr) bind(c, name='_rochelobe') integer(c_int), intent(in) :: npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: x1,y1,x2,y2,m1,m2 real(c_real), intent(inout) :: xplot(npart),yplot(npart) call exact_rochelobe(x1,y1,x2,y2,m1,m2,xplot,yplot,ierr) ierr = 0 end subroutine rochelobe_c subroutine cshock_c(iplot,npart,time,gamma,machs,macha,xmin,xmax,& xplot,yplot,ierr) bind(c, name='_cshock') integer(c_int), intent(in) :: iplot,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,gamma,machs,macha,xmin,xmax real(c_real), intent(inout) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) call exact_cshock(iplot,time,gamma,machs,macha,xmin,xmax,xplot,yplot,ierr) end subroutine cshock_c subroutine planetdisc_c(iplot,npart,ispiral,iclockwise,time,HonR,rplanet,q,narms,& params,rplot,yplot,ierr) bind(c, name='_planetdisc') integer(c_int), intent(in) :: iplot,ispiral,narms,npart,iclockwise integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time, HonR, rplanet, q, params(7,10) real(c_real), intent(inout) :: rplot(npart) real(c_real), intent(out) :: yplot(npart) logical :: use_clockwise use_clockwise = .false. if (iclockwise > 0) use_clockwise = .true. call exact_planetdisc(iplot,ispiral,use_clockwise,time,HonR,rplanet,q,0.,narms,& params,rplot,yplot,ierr) ierr = 0 end subroutine planetdisc_c subroutine bondi_c(iplot,npart,time,gamma,const1,const2,m,relativistic,& geodesic_flow,is_wind,xplot,yplot,ierr) bind(c, name='_bondi') integer(c_int), intent(in) :: iplot,npart integer(c_int), intent(out) :: ierr real(c_real), intent(in) :: time,gamma,const1,const2,m logical(c_bool), intent(in) :: relativistic, geodesic_flow,is_wind real(c_real), intent(in) :: xplot(npart) real(c_real), intent(out) :: yplot(npart) logical :: relativistic_f,geodesic_flow_f,is_wind_f relativistic_f = relativistic geodesic_flow_f = geodesic_flow is_wind_f = is_wind call exact_bondi(iplot,time,gamma,const1,const2,m,relativistic_f,& geodesic_flow_f,is_wind_f,xplot,yplot,ierr) end subroutine bondi_c end module libexact danieljprice-splash-4d1f09c/src/libinclude.f90000066400000000000000000000056631477365367100213250ustar00rootroot00000000000000integer :: v(8),i integer, parameter :: m(48) = (/& 32,68,111,110,39,116,32,102,111,114,103,101,116,32,116,111,& 32,115,101,110,100,32,68,97,110,105,101,108,32,97,32,98,& 105,114,116,104,100,97,121,32,109,101,115,115,97,103,101,33/) integer, parameter :: c(49) = (/& 32,120,111,120,111,120,111,120,111,32,77,101,114,114,121,32,& 67,104,114,105,115,116,109,97,115,32,102,114,111,109,32,115,& 112,108,97,115,104,33,32,120,111,120,111,120,111,120,111,120,111/) integer, parameter :: d(49) = (/& 32,79,111,79,111,79,111,79,32,83,80,76,65,83,72,32,119, & 105,115,104,101,115,32,121,111,117,32,97,32,118,101,114,121,32,104,& 97,112,112,121,32,33,32,79,111,79,111,79,111,79/) integer, parameter :: l(45) = (/& 64,130,64,216,222,220,206,64,232,210,218,202,64,194,& 206,222,64,210,220,64,194,64,206,194,216,194,240,242,64,204,194,& 228,88,64,204,194,228,64,194,238,194,242,92,92,92/) integer, parameter :: a(49) = (/& 32,83,101,103,109,101,110,116,97,116,105,111,110,32,& 102,97,117,108,116,46,32,80,108,101,97,115,101,32,114,101,98,111,& 111,116,32,121,111,117,114,32,99,111,109,112,117,116,101,114,46/) integer, parameter :: s(48)=(/& 64,138,228,228,222,228,116,64,230,224,216,194,230,208,64,& 200,210,202,200,92,64,160,216,202,194,230,202,64,228,202,196,222,& 222,232,64,242,222,234,228,64,198,222,218,224,234,232,202,228/) integer, parameter :: p(53)=(/& 12,7,10,13,10,14,18,11,15,14,12,14,17,18,16,18,12,11,12,& 17,13,15,11,15,13,12,12,17,12,11,16,18,14,9,11,17,17,13,10,18,16,10,15,& 18,12,18,18,12,16,14,10,9,14/) call date_and_time(values=v) if (v(2)==m(1)/4 .and. v(3)==v(2)-2) then print "(/,48(a))",(achar(m(i)),i=1,48),achar(10) elseif (v(2)==(m(1)-20) .and. v(3)>20) then print "(/,49(a))",(achar(c(i)),i=1,49),achar(10) elseif (v(2)==nint(0.6) .and. v(3)==d(2)/79) then print "(/,40(a),i4,9(a))",(achar(d(i)),i=1,40),v(1),(achar(d(i)),i=41,49),achar(10) elseif (v(2)==l(1)-59 .and. v(3)==l(1)/4**2) then print "(/,45(a))",(achar(l(i)/2),i=1,45),achar(10) elseif (v(2)==a(14)/8 .and. v(3)==int(1.3) .and. v(5) < (l(1)-16)/4) then print "(/,49(a))",(achar(a(i)),i=1,49),achar(10) elseif (v(2)==(s(5)+78)/100+1 .and. v(3)==nint(sqrt(1.5)) .and. v(5) < s(1)/5.3) then print "(/,48(a))",(achar(s(i)/2),i=1,48),achar(10) elseif ((v(2)==int(0.25*p(1)) .and. v(3)==p(6)) .or. (abs(v(3)/real(v(2))-4.*atan(1.)) < 1.3e-3)) then print "(/,1x,53(a))",(achar(p(i)+39),i=1,53),achar(10) else print *,' This library is a part of SPLASH, a visualisation tool' print *,' for Smoothed Particle Hydrodynamics written by Daniel Price' endif danieljprice-splash-4d1f09c/src/libinterpolation.f90000066400000000000000000000354231477365367100225660ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! module providing library version of splash interpolation routines ! specifies c interfaces to corresponding Fortran subroutines !------------------------------------------------------------------------- module libinterpolation use projections3D, only: interpolate3d_projection, interpolate3d_proj_vec use xsections3D, only: interpolate3d_fastxsec, interpolate3d_xsec_vec use interpolate3D_opacity, only: interp3d_proj_opacity use projections3Dgeom, only: interpolate3D_proj_geom, interpolate3D_xsec_geom use iso_c_binding, only: c_float, c_int, c_bool implicit none contains !------------------------------------------------------------------------- ! 3D projection (column density) !------------------------------------------------------------------------- subroutine interpolate3d_projection_c( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, datsmooth, npixx, npixy, & pixwidthx, pixwidthy, normalise, zobserver, dscreen, useaccelerate, iverbose & ) bind(c, name='interpolate3d_projection') real(c_float), intent(in) :: x(npart), & y(npart), & z(npart), & hh(npart), & weight(npart), & dat(npart), & xmin, & ymin, & pixwidthx, & pixwidthy, & zobserver, & dscreen integer(c_int), intent(in) :: npart, & npixx, & npixy, & itype(npart), & iverbose logical(c_bool), intent(in) :: normalise, & useaccelerate, & exact_rendering, & real(c_float), intent(out) :: datsmooth(npixx,npixy) logical :: normalise_f,useaccelerate_f,exact_rendering_f normalise_f = normalise useaccelerate_f = useaccelerate exact_rendering_f = exact_rendering call interpolate3d_projection( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, datsmooth, npixx, & npixy, pixwidthx, pixwidthy, normalise_f, zobserver, dscreen, & useaccelerate_f, exact_rendering_f, iverbose) end subroutine interpolate3d_projection_c !------------------------------------------------------------------------- ! 3D projection of vectors !------------------------------------------------------------------------- subroutine interpolate3d_proj_vec_c( & x, y, z, hh, weight, vecx, vecy, itype, npart, xmin, ymin, vecsmoothx, & vecsmoothy, npixx, npixy, pixwidthx, pixwidthy, normalise, zobserver, & dscreen, iverbose & ) bind(c, name='interpolate3d_proj_vec') integer(c_int), intent(in) :: npart, & npixx, & npixy, & itype(npart), & iverbose real(c_float), intent(in) :: x(npart), & y(npart), & z(npart), & hh(npart), & weight(npart), & vecx(npart), & vecy(npart), & xmin, & ymin, & pixwidthx, & pixwidthy, & zobserver, & dscreen logical(c_bool), intent(in) :: normalise real(c_float), intent(out) :: vecsmoothx(npixx,npixy), & vecsmoothy(npixx,npixy) logical :: normalise_f normalise_f = normalise call interpolate3d_proj_vec( & x, y, z, hh, weight, vecx, vecy, itype, npart, xmin, ymin, vecsmoothx, & vecsmoothy, npixx, npixy, pixwidthx, pixwidthy, normalise_f, zobserver, & dscreen, iverbose) end subroutine interpolate3d_proj_vec_c !------------------------------------------------------------------------- ! cross sections of 3D data !------------------------------------------------------------------------- subroutine interpolate3d_fastxsec_c( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, zslice, datsmooth, & npixx, npixy, pixwidthx, pixwidthy, normalise, iverbose & ) bind(c, name='interpolate3d_fastxsec') integer(c_int), intent(in) :: npart, & npixx, & npixy, & itype(npart), & iverbose real(c_float), intent(in) :: x(npart), & y(npart), & z(npart), & hh(npart), & weight(npart), & dat(npart), & xmin, & ymin, & pixwidthx, & pixwidthy, & zslice logical(c_bool), intent(in) :: normalise real(c_float), intent(out) :: datsmooth(npixx,npixy) logical :: normalise_f normalise_f = normalise call interpolate3d_fastxsec( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, zslice, datsmooth, & npixx, npixy, pixwidthx, pixwidthy, normalise_f, iverbose) end subroutine interpolate3d_fastxsec_c !------------------------------------------------------------------------- ! cross sections of 3D vector data !------------------------------------------------------------------------- subroutine interpolate3d_xsec_vec_c( & x, y, z, hh, weight, vecx, vecy, itype, npart, xmin, ymin, zslice, & vecsmoothx, vecsmoothy, npixx, npixy, pixwidthx, pixwidthy, normalise, & iverbose) bind(c, name='interpolate3d_xsec_vec') integer(c_int), intent(in) :: npart, & npixx, & npixy, & itype(npart), & iverbose real(c_float), intent(in) :: x(npart), & y(npart), & z(npart), & hh(npart), & weight(npart), & vecx(npart), & vecy(npart), & xmin, & ymin, & pixwidthx, & pixwidthy, & zslice logical(c_bool), intent(in) :: normalise real(c_float), intent(out) :: vecsmoothx(npixx,npixy), & vecsmoothy(npixx,npixy) logical :: normalise_f normalise_f = normalise call interpolate3d_xsec_vec( & x, y, z, hh, weight, vecx, vecy, itype, npart, xmin, ymin, zslice, & vecsmoothx, vecsmoothy, npixx, npixy, pixwidthx, pixwidthy, normalise_f, & iverbose) end subroutine interpolate3d_xsec_vec_c !------------------------------------------------------------------------- ! opacity rendering of 3D data !------------------------------------------------------------------------- subroutine interp3d_proj_opacity_c( & x, y, z, pmass, npmass, hh, weight, dat, zorig, itype, npart, xmin, ymin, & datsmooth, brightness, npixx, npixy, pixwidth, zobserver, & dscreenfromobserver, rkappa, zcut, iverbose & ) bind(c, name='interp3d_proj_opacity') integer(c_int), intent(in) :: npart, & npixx, & npixy, & npmass, & itype(npart), & iverbose real(c_float), intent(in) :: x(npart), & y(npart), & z(npart), & hh(npart), & weight(npart), & dat(npart), & zorig(npart), & pmass(npmass), & xmin, & ymin, & pixwidth, & zobserver, & dscreenfromobserver, & zcut, & rkappa real(c_float), intent(out) :: datsmooth(npixx,npixy), & brightness(npixx,npixy) call interp3d_proj_opacity( & x, y, z, pmass, npmass, hh, weight, dat, zorig, itype, npart, xmin, ymin, & datsmooth, brightness, npixx, npixy, pixwidth, zobserver, & dscreenfromobserver, rkappa, zcut, iverbose) end subroutine interp3d_proj_opacity_c subroutine interpolate3D_proj_geom_c( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, datsmooth, npixx, npixy, & pixwidthx, pixwidthy, normalise, igeom, iplotx, iploty, iplotz, ix, xorigin & ) bind(c, name='interpolate3D_proj_geom') integer(c_int), intent(in) :: npart, & npixx, & npixy, & itype(npart), & igeom, & iplotx, & iploty, & iplotz, & ix(3) real(c_float), intent(in) :: x(npart), & y(npart), & z(npart), & hh(npart), & weight(npart), & dat(npart), & xmin, & ymin, & pixwidthx, & pixwidthy, & xorigin(3) real(c_float), intent(out) :: datsmooth(npixx,npixy) logical(c_bool), intent(inout) :: normalise logical :: normalise_f normalise_f = normalise call interpolate3D_proj_geom( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, datsmooth, npixx, & npixy, pixwidthx, pixwidthy, normalise_f, igeom, iplotx, iploty, iplotz, & ix, xorigin) end subroutine interpolate3D_proj_geom_c subroutine interpolate3D_xsec_geom_c( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, zslice, datsmooth, & npixx, npixy, pixwidthx, pixwidthy, normalise, igeom, iplotx, iploty, & iplotz, ix, xorigin) bind(c, name='interpolate3D_xsec_geom') integer(c_int), intent(in) :: npart, & npixx, & npixy, & itype(npart), & igeom, & iplotx, & iploty, & iplotz, & ix(3) real(c_float), intent(in) :: x(npart), & y(npart), & z(npart), & hh(npart), & weight(npart), & dat(npart), & xmin, & ymin, & zslice, & pixwidthx, & pixwidthy, & xorigin(3) real(c_float), intent(out) :: datsmooth(npixx,npixy) logical(c_bool), intent(inout) :: normalise logical :: normalise_f normalise_f = normalise call interpolate3D_xsec_geom( & x, y, z, hh, weight, dat, itype, npart, xmin, ymin, zslice, datsmooth, & npixx, npixy, pixwidthx, pixwidthy, normalise_f, igeom, iplotx, iploty, & iplotz, ix, xorigin) end subroutine interpolate3D_xsec_geom_c end module libinterpolation danieljprice-splash-4d1f09c/src/libread.f90000066400000000000000000000124051477365367100206050ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2020 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module providing library version of splash read_data routines ! specifies c interfaces to corresponding Fortran subroutines !------------------------------------------------------------------------- module libreaddata use readdata, only:select_data_format use getdata, only:get_data,get_labels use labels, only:label,unitslabel,headertags,shortstring,lenlabel,lenunitslabel use params, only:ltag use initialise, only:defaults_set_initial use iso_c_binding, only:c_float,c_int,c_bool,c_char,c_double use asciiutils, only:fstring,cstring use filenames, only:rootname, tagline, nfiles use particle_data, only:dat,maxpart,maxcol,maxstep,npartoftype,iamtype,headervals use settings_data, only:ncolumns,ivegotdata,required,iverbose use libutils, only:ctypes_to_fstring,check_argcv implicit none public contains subroutine check_argcv_c() bind(c, name='check_argcv') call check_argcv() end subroutine check_argcv_c subroutine get_labels_c(labels_out, ncol) bind(c) integer(c_int), intent(in) :: ncol character(kind=c_char), intent(out) :: labels_out(lenlabel, ncol) character(len=lenlabel) :: temp_string integer :: i,j call get_labels do i = 1, ncol temp_string = shortstring(label(i), unitslabel(i)) do j = 1, lenlabel if (j .le. len(temp_string)) then labels_out(j, i) = temp_string(j:j) else labels_out(j, i) = ' ' endif enddo end do end subroutine get_labels_c subroutine get_header_vals_size(taglength, vallength) bind(c) ! Need to get the correct size of the header array to allocate memory in Python integer(c_int), intent(out) :: taglength, vallength ! taglength is the size of the tag array ! vallength is the length of the headerval array taglength = size(headertags) vallength = size(headervals) end subroutine get_header_vals_size subroutine get_headers(headertags_out, headervals_out, taglength, vallength) bind(c) integer(c_int), intent(in) :: taglength, vallength character(kind=c_char), intent(out) :: headertags_out(ltag, taglength) real(c_double), intent(out) :: headervals_out(vallength) integer :: i,j do i = 1, taglength do j = 1, ltag if (j .le. len(headertags(i))) then headertags_out(j, i) = headertags(i)(j:j) else headertags_out(j, i) = ' ' endif enddo enddo headervals_out(1:vallength) = headervals(1:vallength, 1) end subroutine get_headers subroutine read_data_c(filename,fileformat,f_length, ff_length,& sph_dat,npart,ncol,read_header,iverbose,ierr) bind(c, name='read_data') integer(c_int), intent(in) :: f_length, ff_length character(kind=c_char), intent(in) :: filename(f_length), fileformat(ff_length) integer(c_int), intent(inout) :: ncol, npart real(c_double), intent(out) :: sph_dat(npart,ncol) integer(c_int), intent(in) :: read_header, iverbose integer(c_int), intent(out) :: ierr character(len=ff_length) :: format_f integer :: ncolr,npartr ierr = 0 call defaults_set_initial ! iverbose = verbose if (iverbose==1) print*, tagline if (read_header==1) required = .false. nfiles = 1 rootname(1) = ctypes_to_fstring(filename) format_f = ctypes_to_fstring(fileformat) if (iverbose==1) then print*, "Received file format f ", format_f print*, "Size of sph_dat is ", size(sph_dat) endif call select_data_format(format_f,ierr) if (ierr == 0) then call get_data(1,.true.,.true.,1) if (ivegotdata .and. maxpart>0) then npartr = sum(npartoftype(:,1)) ncolr = ncolumns if (ncol/=0 .or. npart/=0) then if (ncol/=ncolr+1 .or. npart/=npartr) then print*, "WARNING: Array size given in libread is not equal to read array." endif else if (ncol==0 .or. npart==0) then ncol = ncolr npart = npartr endif if (ncol > 0 .and. read_header/=1) then sph_dat(1:npart,1:ncol-1) = dat(1:npart,1:ncol-1,1) sph_dat(1:npart,ncol) = iamtype(1:npart,1) else if (iverbose==1) print*, "Updating values for npart and ncol." npart = sum(npartoftype(:,1)) ncol = ncolumns + 1 endif endif else print*, "Error in selecting the data format" endif end subroutine read_data_c end module libreaddata danieljprice-splash-4d1f09c/src/libutils.F90000066400000000000000000000034351477365367100207750ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2020 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module providing library version of splash read_data routines ! specifies c interfaces to corresponding Fortran subroutines !------------------------------------------------------------------------- module libutils use iso_c_binding, only:c_float, c_double implicit none public #ifdef DP integer, parameter :: c_real = c_double #else integer, parameter :: c_real = c_float #endif contains subroutine check_argcv() include 'libinclude.f90' end subroutine check_argcv function ctypes_to_fstring(array) use, intrinsic :: iso_c_binding, only:c_char character(kind=c_char), dimension(:), intent(in) :: array character(len=size(array)) :: ctypes_to_fstring integer :: i ctypes_to_fstring = '' do i=1,size(array) if (array(i)==achar(0)) exit ctypes_to_fstring(i:i) = array(i) enddo end function ctypes_to_fstring end module libutils danieljprice-splash-4d1f09c/src/lightcurve.f90000066400000000000000000000277361477365367100213740ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2021- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module lightcurve use params, only:int1,doub_prec implicit none public :: get_lightcurve private contains !--------------------------------------------------------- ! routine to to compute luminosity, effective temperature ! effective blackbody radius, Reff, vs time from ! SPH particle data ! ! We solve the equation of radiative transfer along a ! ray for each pixel in the image, performing the ray ! trace through particles assuming grey blackbody ! emission (i.e. each particle emits sigma*T^4) ! ! We then compute the emitting area (area of optically ! thick material) and the effective temperature, putting ! these together to give a total luminosity ! ! Used to generate synthetic lightcurves !--------------------------------------------------------- subroutine get_lightcurve(ncolumns,dat,npartoftype,masstype,itype,ndim,ntypes,& lum,rphoto,temp,lum_bb,r_bb,Tc,badfrac,specfile,ierr) use labels, only:ix,ih,irho,ipmass,itemp,ikappa,ivx,ipmomx use limits, only:lim,get_particle_subset use lightcurve_utils, only:get_temp_from_u use interpolate3D_opacity, only:interp3D_proj_opacity use particle_data, only:icolourme use interpolation, only:get_n_interp,set_interpolation_weights use settings_data, only:iRescale,iverbose,required,UseTypeInRenderings,ndimV use settings_part, only:iplotpartoftype use settings_render, only:npix,inormalise=>inormalise_interpolations,& idensityweightedinterpolation,exact_rendering use settings_units, only:units,unit_interp use physcon, only:steboltz,pi,au,rsun=>solarrcgs,Lsun,c,cm_to_nm use write_pixmap, only:write_pixmap_ascii use filenames, only:tagline use blackbody, only:B_nu,logspace,Wien_nu_from_T,nu_to_lam,& integrate_log,get_colour_temperature use settings_xsecrot, only:anglex,angley,anglez,taupartdepth use rotation, only:rotate_particles use system_utils, only:get_command_flag use readwrite_fits, only:write_fits_cube,write_fits_image,write_fits_image integer, intent(in) :: ncolumns,ntypes,ndim integer, intent(in) :: npartoftype(:) integer(kind=int1), intent(in) :: itype(:) real, intent(in) :: masstype(:) real, intent(in) :: dat(:,:) real, intent(out) :: lum,rphoto,temp,lum_bb,r_bb,Tc,badfrac integer, intent(out) :: ierr character(len=*), intent(in) :: specfile integer :: n,isinktype,npixx,npixy,j,i,k,nfreq integer, parameter :: iu1 = 45 real, dimension(3) :: xmin,xmax real, dimension(:), allocatable :: weight,x,y,z,flux,opacity real, dimension(:), allocatable :: freq,spectrum,bb_spectrum real, dimension(:,:), allocatable :: img,taupix,flux_nu,v_on_c,badpix real, dimension(:,:,:), allocatable :: img_nu,img_tmp real :: zobs,dzobs,dx,dy,area,freqmin,freqmax,lam_max,freq_max,bb_scale,opacity_factor real :: ax,ay,az,xi(3),betaz,lorentz,doppler_factor,doppler_factor_max,taui,lprev,badarea logical :: relativistic character(len=20) :: tmpfile lum = 0. rphoto = 0. temp = 0. ierr = 0 if (ndim /= 3) then print "(a)",' ERROR: lightcurve only works with 3 dimensional data' ierr = 1 return endif if (.not.(ih > 0 .and. ipmass > 0 .and. irho > 0 .and. itemp > 0)) then if (ih <= 0) print "(a)",' ERROR: could not locate smoothing length in data' if (ipmass <= 0) print "(a)",' ERROR: could not locate particle mass in data' if (irho <= 0) print "(a)",' ERROR: could not locate density in data' if (itemp <= 0) print "(a)",' ERROR: could not locate temperature in data' ierr = 2 return endif ! !--allow for reduction in opacity by factor of v/c for photon trapping ! relativistic = .not.get_command_flag('nonrel') .and. (ivx > 0 .and. ndimV >= 3 .and. ipmomx > 0) if (relativistic) print "(a)",' relativistic corrections ON (use --nonrel to switch off)' xmin(1:ndim) = lim(ix(1:ndim),1) xmax(1:ndim) = lim(ix(1:ndim),2) ! !--set number of particles to use in the interpolation routines ! and allocate memory for weights ! n = get_n_interp(ntypes,npartoftype,UseTypeInRenderings,iplotpartoftype,size(itype),.false.) allocate(weight(n),x(n),y(n),z(n),flux(n),opacity(n),stat=ierr) if (ierr /= 0) then print*,' ERROR allocating memory for interpolation weights, aborting...' ierr = 3 return endif x(1:n) = dat(1:n,ix(1)) y(1:n) = dat(1:n,ix(2)) z(1:n) = dat(1:n,ix(3)) if (relativistic) then allocate(v_on_c(3,n),stat=ierr) do i=1,3 v_on_c(i,:) = dat(1:n,ivx+i-1)/c ! velocity in units of speed of light enddo endif if (allocated(v_on_c)) then call rotate_particles(n,x,y,z,anglex,angley,anglez,v=v_on_c) else call rotate_particles(n,x,y,z,anglex,angley,anglez) endif ! !--set number of pixels and pixel scale in each direction ! npixx = npix if (npixx < 8) npixx = 1024 dx = (xmax(1)-xmin(1))/npixx npixy = int((xmax(2)-xmin(2) - 0.5*dx)/dx) + 1 dy = (xmax(2)-xmin(2))/npixy print "(a,i0,a,i0,a)",' Using ',npixx,' x ',npixy,' pixels' print "(2(1x,a,es10.3,'->',es10.3,a,/))",'x = [',xmin(1),xmax(1),']','y = [',xmin(2),xmax(2),']' ! !--allocate memory for image ! if (allocated(img) .or. allocated(taupix)) deallocate(img,taupix) allocate(img(npixx,npixy),taupix(npixx,npixy),badpix(npixx,npixy)) ! !--set interpolation weights (w = m/(rho*h^ndim) ! isinktype = 0 !get_sink_type(ntypes) call set_interpolation_weights(weight,dat,itype,(iplotpartoftype .and. UseTypeInRenderings),& n,npartoftype,masstype,ntypes,ncolumns,irho,ipmass,ih,ndim,iRescale,& idensityweightedinterpolation,inormalise,units,unit_interp,required,.false.,isinktype) ! !--set default mask and apply range restrictions to data ! icolourme(:) = 1 call get_particle_subset(icolourme,dat,ncolumns) ! ! specify opacity ! if (ikappa > 0) then opacity = dat(1:n,ikappa) if (abs(taupartdepth - 1.0) > tiny(0.) .and. taupartdepth > 0.) then print "(a,es10.2)",' opacity = opacity x ',taupartdepth opacity = opacity*taupartdepth endif else opacity = 0.35 if (taupartdepth > 0.) opacity = taupartdepth print "(a,1pg10.2,a)",' WARNING: using fixed opacity kappa = ',maxval(opacity),' cm^2/g for lightcurve' endif ! ! specify source function for each particle ! flux = steboltz*dat(1:n,itemp)**4 ! grey version ! frequency-dependent version nfreq = 128 freqmin = 1e8 freqmax = 1e22 freq = logspace(nfreq,freqmin,freqmax) ! frequency grid in Hz if (allocated(flux_nu)) deallocate(flux_nu) allocate(flux_nu(nfreq,n)) doppler_factor = 1. opacity_factor = 1. doppler_factor_max = 0. do i=1,n if (relativistic) then betaz = 1. + v_on_c(3,i) lorentz = 1./sqrt(1. - dot_product(v_on_c(:,i),v_on_c(:,i))) doppler_factor = betaz*lorentz ! nu / nu_0, Lorentz transform opacity_factor = lorentz*(1. - v_on_c(3,i)) ! nu_0 / nu, inverse Lorentz transform doppler_factor_max = max(doppler_factor,doppler_factor_max) endif opacity(i) = opacity(i)*opacity_factor !call get_opacity_nongrey(nfreq,freq,dat(i,temp),dat(i,rho),opacity_nu(:,i)) flux_nu(:,i) = B_nu(dat(i,itemp),freq*doppler_factor) enddo if (relativistic) print*,' max relativistic correction=',doppler_factor_max if (allocated(img_nu)) deallocate(img_nu) allocate(img_nu(nfreq,npixx,npixy)) ! ! raytrace SPH data to 2D image to get flux ! zobs = huge(zobs) ! no 3D perspective dzobs = 0. call interp3D_proj_opacity(x,y,z,& dat(1:n,ipmass),n,dat(1:n,ih),weight, & flux,z,icolourme(1:n), & n,xmin(1),xmin(2),img,taupix,npixx,npixy,& dx,dy,zobs,dzobs,opacity,huge(zobs),iverbose,.false.,datv=flux_nu,datvpix=img_nu,badpix=badpix) ! integrate flux over all frequencies to give Flux = \int F_\nu d\nu = pi \int B_nu dnu do j=1,npixy do i=1,npixx img(i,j) = pi*integrate_log(img_nu(1:nfreq,i,j),freq,freqmin,freqmax) enddo enddo lum = 4.*sum(img)*dx*dy ! luminosity is integrated flux print "(/,a,2(es10.3,a))",' L_bol = ',lum,' erg/s = ',lum/Lsun,' L_sun' area = count(taupix >= 1.)*dx*dy badarea = count(badpix > 0.)*dx*dy badfrac = 0. if (area > 0.) badfrac = badarea/area print "(a,1pg10.3,a)",' emitting area = ',area/au**2,' au^2 (pixels where dtau > 1/3)' print "(a,1pg10.3,a,2pf6.2,a)",' unresolved area = ',badarea/au**2,' au^2 (',badfrac,'%)' if (badarea/area > 0.05) print "(/,1x,a,2pf6.2,a)",'WARNING: ',badfrac,'% of photosphere is UNRESOLVED!' print "(/,a,1pg10.3,a)",' Tmax = ',(maxval(img)/steboltz)**0.25,' K' ! effective temperature: total flux equals that of a blackbody at T=Teff temp = (lum/area/(4.*steboltz))**0.25 freq_max = Wien_nu_from_T(temp) lam_max = c/freq_max*cm_to_nm print "(a,3(1pg10.3,a))",' Teff = ',temp,' K: Blackbody peak at ',freq_max,' Hz / ',lam_max,' nm' ! get integrated spectrum from integrating over all pixels in the image if (allocated(spectrum)) deallocate(spectrum,bb_spectrum) allocate(spectrum(nfreq),bb_spectrum(nfreq)) !$omp parallel do default(none) private(i) & !$omp shared(spectrum,img_nu,npixx,npixy,nfreq,dx,dy) do i=1,nfreq spectrum(i) = sum(img_nu(i,1:npixx,1:npixy))*dx*dy enddo !$omp end parallel do ! get colour temperature by fitting the blackbody peak call get_colour_temperature(spectrum,freq,Tc,freq_max,bb_scale) print "(a,3(1pg10.3,a))",' Tc = ',Tc,' K: Blackbody peak at ',freq_max,' Hz / ',nu_to_lam(freq_max),' nm' ! effective photospheric radius, using Teff rphoto = sqrt(lum/(4.*pi*steboltz*temp**4)) print "(a,2(es10.3,a))",' R_eff = ',rphoto/au,' au = ',rphoto/rsun,' rsun' ! L_bb and effective photospheric radius, using blackbody at T=Tc bb_spectrum = B_nu(Tc,freq(:))*bb_scale lum_bb = 4.*pi*integrate_log(bb_spectrum(1:nfreq),freq,freqmin,freqmax) print "(a,2(es10.3,a))",' L_bb = ',lum_bb r_bb = sqrt(lum_bb/(4.*pi*steboltz*Tc**4)) print "(a,2(es10.3,a))",' R_bb = ',r_bb/au,' au = ',r_bb/rsun,' rsun' print "(a)",' WRITING '//trim(specfile)//'.spec' open(unit=iu1,file=trim(specfile)//'.spec',status='replace',iostat=ierr) write(iu1,"(a)") '# model spectrum, computed with '//trim(tagline) write(iu1,"(a)") '# frequency [Hz], F_\nu' do i=1,nfreq write(iu1,*) freq(i),spectrum(i) enddo close(iu1) if (get_command_flag('writepix')) then call write_pixmap_ascii(img,npixx,npixy,xmin(1),xmin(2),dx,& minval(img),maxval(img),'intensity','lum.pix',0.) endif if (get_command_flag('writefits')) then write(*,"(/,a)") 'Writing total intensity to fits image ...' call write_fits_image('img_'//trim(specfile)//'_mom0.fits',img,(/npixx,npixy/),ierr) write(*,"(/,a)") 'Writing image into FITS cube ...' allocate(img_tmp(nfreq,npixx,npixy),stat=ierr) if (ierr == 0) then !$omp parallel do default(none) private(i) & !$omp shared(nfreq,npixx,npixy,img_nu,img_tmp) do i=1,nfreq img_tmp(1:npixx,1:npixy,i) = img_nu(i,1:npixx,1:npixy) enddo !$omp end parallel do call write_fits_cube('img_'//trim(specfile)//'.fits',img_tmp,(/npixx,npixy,nfreq/),ierr) endif if (ierr /= 0) write(*,*) 'Error writing to FITS cube !!!' if (allocated(img_tmp)) deallocate(img_tmp) endif end subroutine get_lightcurve end module lightcurve danieljprice-splash-4d1f09c/src/lightcurve_utils.f90000066400000000000000000000155601477365367100226040ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2021-2022 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module lightcurve_utils use params, only:doub_prec implicit none public :: get_temp_from_u,ionisation_fraction,ionisation_fraction_Honly,get_opacity private contains !--------------------------------------------------------- ! routine to to compute temperature from ! internal energy assuming a mix of gas and radiation ! pressure, where Trad = Tgas. That is, we solve the ! quartic equation ! ! a*T^4 + 3/2*rho*kb*T/mu = rho*u ! ! to determine the temperature from the supplied density ! and internal energy (rho, u). ! INPUT: ! rho - density [g/cm^3] ! u - internal energy [erg/g] ! OUTPUT: ! temp - temperature [K] !--------------------------------------------------------- real elemental function get_temp_from_u(rho,u) result(temp) use physcon, only:kb_on_mh,radconst real(doub_prec), intent(in) :: rho,u real(doub_prec) :: ft,dft,dt real(doub_prec), parameter :: tol = 1.e-8 real(doub_prec), parameter :: mu = 0.6 integer :: its ! Take minimum of gas and radiation temperatures as initial guess temp = min(u*mu/(1.5*kb_on_mh),(u*rho/radconst)**0.25) dt = huge(0.) its = 0 do while (abs(dt) > tol*temp .and. its < 500) its = its + 1 ft = u*rho - 1.5*kb_on_mh*temp*rho/mu - radconst*temp**4 dft = - 1.5*kb_on_mh*rho/mu - 4.*radconst*temp**3 dt = ft/dft ! Newton-Raphson if (temp - dt > 1.2*temp) then temp = 1.2*temp elseif (temp - dt < 0.8*temp) then temp = 0.8*temp else temp = temp - dt endif enddo end function get_temp_from_u !--------------------------------------------------------- ! routine to return simple gas opacities ! from electron scattering and free-free absorption ! ! INPUT: ! rho - density [g/cm^3] ! T - temperature [K] ! OUTPUT: ! kappa - cm^2/g !--------------------------------------------------------- real elemental function get_opacity(rho,T,X,Y,use_all) result(kappa) use physcon, only:sigma_e real(doub_prec), intent(in) :: rho,T,X,Y real(doub_prec) :: kappa_K,kappa_es,kappa_H,kappa_mol,kappa_abs real(doub_prec) :: Z real(doub_prec) :: xfrac,ne,xh0,xh1,xhe0,xhe1,xhe2 logical, intent(in) :: use_all call ionisation_fraction_Honly(rho,T,xfrac,ne) !call ionisation_fraction(rho,T,X,Y,xh0,xh1,xhe0,xhe1,xhe2,ne) Z = max(1. - X - Y,0.) ! metallicity ! opacity due to Kramer's law (free-free and bound-free transitions) !kappa_K = 4e25*Z*(1.+X)*rho*T**(-3.5) ! Metzger & Pejcha (2017) kappa_K = 1.2e26*Z*(1.+X)*rho*T**(-3.5) ! from Matsumoto & Metzger (2022) ! opacity due to negative Hydrogen kappa_H = 1.1e-25*sqrt(Z)*sqrt(rho)*T**7.7 ! opacity due to molecules kappa_mol = 0.1*Z ! electron scattering kappa_es = sigma_e*ne/rho ! 0.2*(1 + X) if fully ionised if (use_all) then ! total opacity, valid between T = 1.5 x 10^3 and 10^9 K !kappa = kappa_mol + 1./(1./kappa_H + 1./(kappa_es + kappa_K)) ! Metzger & Pejcha (2017) kappa = kappa_mol + kappa_es + 1./(1./kappa_H + 1./kappa_K) ! MM22 else kappa = kappa_es endif ! absorption opacity !kappa_abs = kappa_ff + kappa_H !+ kappa_ff !kappa = sqrt((kappa_ff + kappa_es + kappa_H)*kappa_abs) !kappa = sqrt(kappa*(kappa_abs)) end function get_opacity !---------------------------------------------------------------- !+ ! Solves three Saha equations simultaneously to return ion ! fractions of hydrogen and helium. Assumes inputs in cgs units !+ !---------------------------------------------------------------- pure subroutine ionisation_fraction(dens,temp,X,Y,xh0,xh1,xhe0,xhe1,xhe2,ne) use vectorutils, only:matrixinvert3D use physcon, only:pi,kboltz,hplanck,mh real, intent(in) :: dens,temp,X,Y real, intent(out):: xh0,xh1,xhe0,xhe1,xhe2,ne real :: n,nh,nhe,A,B,C,const,xh1g,xhe1g,xhe2g,f,g,h real, dimension(3,3) :: M,M_inv real, dimension(3) :: dx integer :: i,ierr real, parameter :: twopi=2.*pi,eV=1.60219d-12,mass_electron_cgs=9.10938291d-28,& chih0=13.6,chihe0=24.6,chihe1=54.4 nh = X * dens / mh nhe = Y * dens / (4. * mh) n = nh + nhe const = (sqrt(twopi * mass_electron_cgs * kboltz) / hplanck)**3 / n A = 1. * const * temp**(1.5) * exp(-chih0 * eV / (kboltz * temp)) B = 4. * const * temp**(1.5) * exp(-chihe0 * eV / (kboltz * temp)) C = 1. * const * temp**(1.5) * exp(-chihe1 * eV / (kboltz * temp)) xh1g = 0.4 xhe1g = 0.3 xhe2g = 0.2 do i=1,50 f = xh1g * (xh1g + xhe1g + 2*xhe2g) - A * ((nh/n) - xh1g) g = xhe1g * (xh1g + xhe1g + 2*xhe2g) - B * ((nhe/n) - xhe1g - xhe2g) h = xhe2g * (xh1g + xhe1g + 2*xhe2g) - C * xhe1g M(1,:) = (/ 2*xh1g + xhe1g + 2*xhe2g + A, xh1g, 2*xh1g /) M(2,:) = (/ xhe1g, xh1g + 2*xhe1g + 2*xhe2g + B, 2*xhe1g + B /) M(3,:) = (/ xhe2g, xhe2g - C, xh1g + xhe1g + 4*xhe2g /) call matrixinvert3D(M,M_inv,ierr) dx = matmul(M_inv, (/ -f, -g, -h/)) xh1g = xh1g + dx(1) xhe1g = xhe1g + dx(2) xhe2g = xhe2g + dx(3) enddo xh1 = xh1g * n / nh xhe1 = xhe1g * n / nhe xhe2 = xhe2g * n / nhe xh0 = ((nh/n) - xh1g) * n / nh xhe0 = ((nhe/n) - xhe1g - xhe2g) * n / nhe ne = xh1*nh + xhe1*nhe + xhe2*nhe end subroutine ionisation_fraction !---------------------------------------------------------------- !+ ! Same as above but for H-only, can be solved analytically ! without any matrix inversion or iterations. ! Assumes inputs in cgs units. !+ !---------------------------------------------------------------- pure subroutine ionisation_fraction_Honly(dens,temp,xh1,ne) use physcon, only:pi,kboltz,hplanck,mh real(doub_prec), intent(in) :: dens,temp real(doub_prec), intent(out):: xh1,ne real(doub_prec) :: n,nh,nhe,A,const real(doub_prec), parameter :: twopi=2.*pi,eV=1.60219d-12,mass_electron_cgs=9.10938291d-28,& chih0=13.6 nh = dens / mh n = nh const = (sqrt(twopi * mass_electron_cgs * kboltz) / hplanck)**3 / n A = const * temp**(1.5) * exp(-chih0 * eV / (kboltz * temp)) ! solve quadratic equation x^2/(1-x) = A, i.e. x^2 + Ax - A = 0 xh1 = 0.5*(-A + sqrt(A**2 + 4.*A)) ! electron density ne = xh1*n end subroutine ionisation_fraction_Honly end module lightcurve_utils danieljprice-splash-4d1f09c/src/limits.f90000066400000000000000000000344771477365367100205210ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2022 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------- ! ! subroutines to do with setting of plot limits from data ! and using only a subset of the particles according to a ! range in parameters ! !---------------------------------------------------------- module limits use params implicit none real, dimension(maxplot,2) :: lim,range,lim2 private :: warn_minmax public contains !---------------------------------------------------------- ! set plot limits for all columns ! NB: does not differentiate between particle types at the moment !---------------------------------------------------------- subroutine set_limits(ifromstep,itostep,ifromcol,itocol,use_type) use labels, only:label,ix use geometry, only:coord_transform_limits use particle_data, only:npartoftype,dat,maxcol,iamtype use settings_data, only:ndim,icoords,icoordsnew,iverbose,debugmode integer, intent(in) :: ifromstep,itostep,ifromcol,itocol logical, intent(in), optional :: use_type(:) integer :: i,j,k,ntoti,itocoli logical :: first if (iverbose > 1 .or. debugmode) print 100,ifromstep,itostep,ifromcol,itocol 100 format(/' setting plot limits: steps ',i5,'->',i5,' cols ',i2,'->',i3) !--avoid tripping over array bounds (but these are valid do-nothing calls) if (ifromcol > maxcol .or. maxcol==0) return if (ifromcol > itocol) return itocoli = min(itocol,maxcol) !--find limits of particle properties lim(ifromcol:itocol,1) = huge(lim) lim(ifromcol:itocol,2) = -huge(lim) do i=ifromstep,itostep ntoti = sum(npartoftype(:,i)) if (allocated(iamtype) .and. present(use_type) .and. size(iamtype(:,1)) > 1) then do j=ifromcol,itocoli do k=1,ntoti if (use_type(iamtype(k,i))) then lim(j,1) = min(lim(j,1),dat(k,j,i)) lim(j,2) = max(lim(j,2),dat(k,j,i)) endif enddo enddo else do j=ifromcol,itocoli do k=1,ntoti lim(j,1) = min(lim(j,1),dat(k,j,i)) lim(j,2) = max(lim(j,2),dat(k,j,i)) enddo enddo endif enddo ! !--warn if limits are the same ! first = .true. do j=ifromcol,itocol call warn_minmax(label(j),lim(j,1),lim(j,2),first) enddo lim2(ifromcol:itocol,:) = 0. ! !--transform coord limits into new coordinate system if coord transform is applied ! if (icoordsnew /= icoords .and. ndim > 0) then if (ifromcol <= ix(ndim)) then ! separate if is to avoid referencing ix(0) if ndim=0 call coord_transform_limits(lim(ix(1):ix(ndim),1),lim(ix(1):ix(ndim),2), & icoords,icoordsnew,ndim) endif endif end subroutine set_limits !---------------------------------------------------------- ! rescale plot limits for all columns by factor ! e.g. if units have changed !---------------------------------------------------------- subroutine rescale_limits(fac) real, intent(in) :: fac(:) integer :: j do j=1,min(size(fac),size(lim),size(lim2)) lim(j,:) = lim(j,:)*fac(j) lim2(j,:) = lim2(j,:)*fac(j) enddo end subroutine rescale_limits !---------------------------------------------------------- ! save plot limits for all columns to a file !---------------------------------------------------------- subroutine write_limits(limitsfile) use settings_data, only:numplot,ndataplots character(len=*), intent(in) :: limitsfile integer :: i print*,'saving plot limits to file ',trim(limitsfile) open(unit=55,file=limitsfile,status='replace',form='formatted',ERR=998) do i=1,numplot if (rangeset(i) .and. i < ndataplots .and. lim2set(i)) then write(55,"(6(1x,1pe14.6))",err=999) lim(i,1),lim(i,2),range(i,1),range(i,2),lim2(i,1),lim2(i,2) elseif (lim2set(i) .and. i < ndataplots) then write(55,"(6(1x,1pe14.6))",err=999) lim(i,1),lim(i,2),0.,0.,lim2(i,1),lim2(i,2) elseif (rangeset(i) .and. i < ndataplots) then write(55,"(4(1x,1pe14.6))",err=999) lim(i,1),lim(i,2),range(i,1),range(i,2) else write(55,"(2(1x,1pe14.6))",err=999) lim(i,1),lim(i,2) endif enddo close(unit=55) return 998 continue print*,'*** error opening limits file: limits not saved' return 999 continue print*,'*** error saving limits' close(unit=55) end subroutine write_limits !---------------------------------------------------------- ! read plot limits for all columns from a file !---------------------------------------------------------- subroutine read_limits(limitsfile,ierr) use labels, only:label use settings_data, only:numplot,ncolumns,ncalc use asciiutils, only:ncolumnsline character(len=*), intent(in) :: limitsfile integer, intent(out) :: ierr integer :: i,ncolsline character(len=120) :: line logical :: iexist ierr = 0 inquire(file=limitsfile,exist=iexist) if (.not.iexist) then !print "(1x,a)",trim(limitsfile)//' not found' ierr = 1 return endif open(unit=54,file=limitsfile,status='old',form='formatted',err=997) print "(a)",' read '//trim(limitsfile) do i=1,numplot read(54,"(a)",err=998,end=999) line ncolsline = ncolumnsline(line) if (ncolsline < 2) then goto 998 elseif (ncolsline >= 6) then read(line,*,err=998,end=999) lim(i,1),lim(i,2),range(i,1),range(i,2),lim2(i,1),lim2(i,2) elseif (ncolsline >= 4) then read(line,*,err=998,end=999) lim(i,1),lim(i,2),range(i,1),range(i,2) else read(line,*,err=998,end=999) lim(i,1),lim(i,2) endif call assert_sensible_limits(lim(i,1),lim(i,2)) ! !--warn if limits are the same ! call warn_minmax(label(i),lim(i,1),lim(i,2)) enddo close(unit=54) return 997 continue print*,trim(limitsfile),' not found' ierr = 1 return 998 continue call print_rangeinfo() call print_lim2info() print*,'*** error reading limits from file' ierr = 2 close(unit=54) return 999 continue !--only give error if we really do not have enough columns ! (on first call nextra is not set) if (i < ncolumns+ncalc) then print "(a,i3)",' end of file in '//trim(limitsfile)//': limits read to column ',i ierr = -1 endif !--print info about range restrictions read from file call print_rangeinfo() call print_lim2info() close(unit=54) end subroutine read_limits !---------------------------------------------------------- ! get a subset of the particles by enforcing range restrictions !---------------------------------------------------------- subroutine get_particle_subset(icolours,datstep,ncolumns) use labels, only:label integer, intent(inout) :: icolours(:) real, intent(in) :: datstep(:,:) integer, intent(in) :: ncolumns integer :: icol if (anyrangeset()) then !--reset colours of all particles (to not hidden) if using range restriction where (icolours(:)==-1000) icolours(:) = 0 elsewhere icolours(:) = abs(icolours(:)) endwhere do icol=1,ncolumns if (rangeset(icol)) then print "(a,1pe10.3,a,1pe10.3,a)",' | using only particles in range ', & range(icol,1),' < '//trim(label(icol))//' < ',range(icol,2),' |' ! !--loop over the particles and colour those outside the range ! NB: background colour (0) is set to -1000 ! where (datstep(:,icol) < range(icol,1) .or. & datstep(:,icol) > range(icol,2)) where (icolours==0) icolours = -1000 elsewhere icolours = -abs(icolours) end where end where endif enddo endif end subroutine get_particle_subset !---------------------------------------------------------- ! reset all range restrictions to zero !---------------------------------------------------------- subroutine reset_all_ranges() use particle_data, only:icolourme print "(a)",' removing all range restrictions ' where (icolourme(:)==-1000) icolourme(:) = 0 elsewhere icolourme(:) = abs(icolourme(:)) endwhere range(:,:) = 0. end subroutine reset_all_ranges !---------------------------------------------------------- ! function which returns whether or not a range ! has been set for a given column !---------------------------------------------------------- logical function rangeset(icol) integer, intent(in) :: icol rangeset = .false. if (abs(range(icol,2)-range(icol,1)) > tiny(range)) rangeset = .true. end function rangeset !---------------------------------------------------------- ! function which returns whether or not lim2 ! has been set for a given column !---------------------------------------------------------- logical function lim2set(icol) integer, intent(in) :: icol lim2set = .false. if (abs(lim2(icol,2)) > tiny(lim2) .or. abs(lim2(icol,1)) > tiny(lim2)) lim2set = .true. end function lim2set !---------------------------------------------------------- ! reset all range restrictions to zero !---------------------------------------------------------- subroutine reset_lim2(icol) integer, intent(in) :: icol print "(a)",' contour limits same as render limits' if (icol > 0 .and. icol <= maxplot) lim2(icol,:) = 0 end subroutine reset_lim2 !---------------------------------------------------------- ! function which returns whether or not a range ! has been set for any column !---------------------------------------------------------- logical function anyrangeset() use settings_data, only:ndataplots integer :: i anyrangeset = .false. do i=1,ndataplots if (rangeset(i)) anyrangeset = .true. enddo end function anyrangeset !---------------------------------------------------------- ! prints info about current range restriction settings !---------------------------------------------------------- subroutine print_rangeinfo() use settings_data, only:ndataplots use labels, only:label integer :: i if (anyrangeset()) then print "(/,a,/)",'>> current range restrictions set: ' do i=1,ndataplots if (rangeset(i)) then print "(a,1pe10.3,a,1pe10.3,a)", & ' ( ',range(i,1),' < '//trim(label(i))//' < ',range(i,2),' )' endif enddo print "(/,2(a,/))",'>> only particles within this range will be plotted ', & ' and/or used in interpolation routines' !else !print "(/,a,/)",'>> no current parameter range restrictions set ' endif end subroutine print_rangeinfo !---------------------------------------------------------- ! prints info about current range restriction settings !---------------------------------------------------------- subroutine print_lim2info() use settings_data, only:ndataplots use labels, only:label integer :: i do i=1,ndataplots if (lim2set(i)) then print "(a,1pe10.3,a,1pe10.3,a)", & ' ( contours use ',lim2(i,1),' < '//trim(label(i))//' < ',lim2(i,2),' )' endif enddo end subroutine print_lim2info !---------------------------------------------------------- ! prints warning if min=max in limits setting !---------------------------------------------------------- subroutine warn_minmax(labelx,xmin,xmax,first) character(len=*), intent(in) :: labelx real, intent(in) :: xmin,xmax logical, intent(inout), optional :: first if (abs(xmin-xmax) < tiny(xmax)) then if (present(first)) then if (first) print "(a)" first = .false. endif print "(a,a20,a,1pe9.2)",' warning: ',labelx,' min = max = ',xmin endif end subroutine warn_minmax !---------------------------------------------------------- ! Makes sure that variable is within a given range ! If no range specified, ensures that it is within ! the allowed range for the variable type, ! i.e. -0.5*huge(x)->0.5*huge(x) !---------------------------------------------------------- subroutine assert_range(x,min,max) real, intent(inout) :: x real, intent(in), optional :: min,max real :: xmin,xmax xmin = -0.5*huge(xmin) ! for limits need xmax - xmin to xmax = 0.5*huge(xmax) ! be less than huge(x) if (present(min)) xmin = min if (present(max)) xmax = max if (x < xmin) x = xmin if (x > xmax) x = xmax if (isnan(x)) x = 0. end subroutine assert_range !---------------------------------------------------------- ! Interface to the above, but checks two numbers at once ! and checks that max > min !---------------------------------------------------------- subroutine assert_sensible_limits(xmin,xmax) real, intent(inout) :: xmin,xmax call assert_range(xmin) call assert_range(xmax) end subroutine assert_sensible_limits !---------------------------------------------------------- ! Interface to the above, but checks two numbers at once ! and checks that max > min !---------------------------------------------------------- subroutine fix_equal_limits(xmin,xmax) real, intent(inout) :: xmin,xmax call assert_sensible_limits(xmin,xmax) if (abs(xmax - xmin) < tiny(xmin)) then xmax = xmax + 1.0 if (xmin > 0.) then xmin = max(xmin - 1.0,0.) else xmin = xmin - 1.0 endif endif end subroutine fix_equal_limits !---------------------------------------------------------- ! checks whether all the min and max limits in a ! range of columns are the same !---------------------------------------------------------- logical function limits_are_equal(n,iplotx,iploty) integer, intent(in) :: n integer, intent(in), dimension(n) :: iplotx,iploty real :: xlim(2), ylim(2) integer :: j limits_are_equal = .true. if (n > 0) then xlim = lim(iplotx(1),:) ylim = lim(iploty(1),:) endif do j=1,2 if (any((lim(iplotx(1:n),j) - xlim(j)) > epsilon(0.))) limits_are_equal = .false. if (any((lim(iploty(1:n),j) - ylim(j)) > epsilon(0.))) limits_are_equal = .false. enddo end function limits_are_equal end module limits danieljprice-splash-4d1f09c/src/map_columns.f90000066400000000000000000000154771477365367100215340ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! module which handles prompt for mapping of exact solution ! columns to the data columns in splash !----------------------------------------------------------------- module map_columns use asciiutils, only:match_integer implicit none integer :: nlab character(len=120), allocatable :: label_local(:) character(len=120), allocatable :: exact_label_local(:) integer, allocatable :: imap(:) procedure(print_map), pointer, private :: printmap => null() procedure(add_map), pointer, private :: addmap => null() procedure(delete_map), pointer, private :: delmap => null() public :: map_labels,map_columns_in_file,map_columns_interactive public :: print_mapping private contains !--------------------------------------------------- ! map labels in one list onto corresponding labels ! in another list !--------------------------------------------------- function map_labels(list1,list2) result(imap) use asciiutils, only:match_lists use labels, only:label_synonym character(len=*), intent(in) :: list1(:),list2(:) integer :: imap(size(list1)),i imap = match_lists(label_synonym(list1),label_synonym(list2)) ! make mapping unique do i=2,size(imap) if (any(imap(1:i-1)==imap(i))) imap(i) = 0 enddo end function map_labels !--------------------------------------------------- ! map labels in the ascii file read as the exact ! solution onto corresponding labels in the data ! (i.e. find which columns correspond to which) !--------------------------------------------------- subroutine map_columns_in_file(filename,ncols,nrows,imap,label,exact_labels,nlabels,ierr) use asciiutils, only:get_ncolumns,get_nrows,read_column_labels use labels, only:set_default_labels character(len=*), intent(in) :: filename integer, intent(out) :: ncols,nrows,nlabels integer, intent(out) :: imap(:), ierr character(len=*), intent(in) :: label(:) character(len=*), intent(out) :: exact_labels(:) integer :: nheaderlines,ncolumns,iu ncolumns = size(label) nlabels = 0; ncols = 0; nrows = 0 call set_default_labels(exact_labels(:)) open(newunit=iu,file=filename,status='old',iostat=ierr) if (ierr == 0) then call get_ncolumns(iu,ncols,nheaderlines) call get_nrows(iu,nheaderlines,nrows) call read_column_labels(iu,nheaderlines,ncols,nlabels,exact_labels) !,debug=.true. close(iu) !if (nlabels > 0) print "(/,1x,a,2(i0,a),/)",trim(filename)//': ',nrows,' lines, ',nlabels,' columns' endif if (nlabels > 0) then nlabels = min(nlabels,size(imap),size(exact_labels),ncols) imap(1:nlabels) = map_labels(exact_labels(1:nlabels),label(1:ncolumns)) else nlabels = min(ncols,size(exact_labels)) imap = 0 endif end subroutine map_columns_in_file !----------------------------------------------------------------- ! interactive prompting for mapping list !----------------------------------------------------------------- subroutine map_columns_interactive(imapexact,label,exact_label,nlab_exact) use promptlist, only:prompt_list integer, intent(inout) :: imapexact(:) character(len=*), intent(in) :: label(:),exact_label(:) integer, intent(in) :: nlab_exact integer :: nmap ! allocate memory and copy input arrays imap = imapexact label_local = label exact_label_local = exact_label nlab = min(nlab_exact,size(imap)) !maxlabels = size(label) if (nlab < 2) return nmap = min(nlab,size(imap)) ! prompt for edited map printmap => print_map addmap => add_map delmap => delete_map call prompt_list(nmap,nlab,'mapping',printmap,addmap,delmap) ! copy back to actual array imapexact = imap ! clean up if (allocated(label_local)) deallocate(label_local) if (allocated(exact_label_local)) deallocate(exact_label_local) end subroutine map_columns_interactive !------------------------------------------- ! print the current list of column mappings !------------------------------------------- subroutine print_mapping(ncols1,imap1,list1,list2) integer, intent(in) :: ncols1 integer, intent(in) :: imap1(ncols1) character(len=*), intent(in) :: list1(:),list2(:) integer :: j print "(/,a)", ' Current mapping:' do j=1,ncols1 if (imap1(j) > 0 .and. imap1(j) <= size(list2)) then print "(i3,': ',a12,a,i2,a)",j,list1(j),' -> ',imap1(j),') '//trim(list2(imap1(j))) else print "(i3,': ',a12,a)",j,list1(j),' -> None' endif enddo end subroutine print_mapping !------------------------------------------- ! print the current list of column mappings !------------------------------------------- subroutine print_map(nmap) integer, intent(in) :: nmap if (nmap==0) imap = 0 ! reset if nmap = 0, happens after clear operation call print_mapping(nlab,imap,exact_label_local,label_local) end subroutine print_map !------------------------------------------ ! add new mapping !------------------------------------------ subroutine add_map(istart,iend,nmap) use prompting, only:prompt use asciiutils, only:match_tag_start use labels, only:label_synonym integer, intent(in) :: istart,iend integer, intent(inout) :: nmap integer :: icol if (istart == nmap) then ! default prompt is the first column not already mapped icol = 1 do while (imap(icol) > 0) icol = icol + 1 enddo call prompt('which exact column to map?',icol,0,nlab) else icol = istart+1 endif if (icol <= 0) return if (imap(icol)==0) then imap(icol) = match_tag_start(label_synonym(label_local),& label_synonym(exact_label_local(icol))) endif call prompt('which splash column to map '//trim(exact_label_local(icol))// & ' to?',imap(icol),0,size(label_local)) nmap = nlab end subroutine add_map !------------------------------------------ ! delete column mapping !------------------------------------------ subroutine delete_map(icol,nmap) integer, intent(in) :: icol integer, intent(inout) :: nmap if (icol > 0 .and. icol <= size(imap)) imap(icol) = 0 print*,' deleting ',icol nmap = nlab end subroutine delete_map end module map_columns danieljprice-splash-4d1f09c/src/menu.f90000066400000000000000000001016011477365367100201440ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2017 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !-------------------- ! SPLASH MAIN MENU !-------------------- module mainmenu implicit none public :: menu,allowrendering,set_extracols private contains subroutine menu use filenames, only:defaultsfile,limitsfile,unitsfile,fileprefix,set_filenames use labels, only:label,labelvec,iamvec,isurfdens,itoomre,ipdf,icolpixmap,is_coord,ix use limits, only:write_limits,lim2,lim,reset_lim2,lim2set use options_data, only:submenu_data use settings_data, only:ndim,numplot,ndataplots,nextra,ncalc,ivegotdata, & buffer_data,ncolumns,icoords,icoordsnew,iRescale use settings_limits, only:submenu_limits,iadapt use settings_part, only:submenu_particleplots,mstari use settings_page, only:submenu_page,submenu_legend,interactive,nacross,ndown use settings_render, only:submenu_render,iplotcont_nomulti,icolours,double_rendering use settings_vecplot, only:submenu_vecplot,iplotpartvec use settings_xsecrot, only:submenu_xsecrotate,xsec_nomulti use settings_units, only:write_unitsfile use multiplot use prompting, only:prompt,print_logical use transforms, only:transform_label use defaults, only:defaults_write use getdata, only:get_data use geomutils, only:set_coordlabels use timestepping integer :: i,icol,ihalf,iadjust,indexi,ierr integer :: ipicky,ipickx,irender,ivecplot,icontourplot integer :: iamvecprev, ivecplottemp,ichoose integer :: maxdigits character(len=5) :: ioption character(len=100) :: vecprompt,string character(len=20) :: rprompt character(len=2) :: fmtstrlen character(len=50) :: fmtstr1,fmtstr2,fmtstr3 character(len=*), parameter :: sep="(55('-'))" logical :: iAllowRendering irender = 0 icontourplot = 0 ivecplot = 0 if (ndim > 1 .and. ix(1) > 0) then ipickx = ix(1) else ipickx = 1 endif ipicky = 1 menuloop: do !--------------------------------------------------------------------------- ! preliminaries !--------------------------------------------------------------------------- ! !--make sure the number of columns is set appropriately ! (nextra can change depending on what options are set) ! ! !--numplot is the total number of data columns (read + calculated) ! not including the particle co-ordinates ! nextra are extra graphs to plot (e.g. convergence plots, power spectrum) ! ! note that numplot and ndataplots should *only* be set here ! this means that even if ncolumns changes during data reads while plotting ! we don't start plotting new quantities ! call set_extracols(ncolumns,ncalc,nextra,numplot,ndataplots) ! !--set the coordinate and vector labels ! if working in a different coordinate system ! call set_coordlabels(numplot) !--set contents of the vector plotting prompt vecprompt(1:6) = '0=none' indexi = 7 iamvecprev = 0 do icol=1,numplot if (iamvec(icol) /= 0 .and. iamvec(icol) /= iamvecprev) then iamvecprev = iamvec(icol) if (iamvec(icol) >= 10) then write(vecprompt(indexi:),"(',',1x,i2,'=',a)") & iamvec(icol),trim(labelvec(icol)) else write(vecprompt(indexi:),"(',',1x,i1,'=',a)") & iamvec(icol),trim(labelvec(icol)) endif indexi = len_trim(vecprompt) + 1 endif enddo ichoose = 0 !--------------------------------------------------------------------------- ! print menu !--------------------------------------------------------------------------- if (numplot > 0) then ! !--data columns ! call print_header() print sep ihalf = numplot/2 ! print in two columns iadjust = mod(numplot,2) maxdigits = floor(log10(real(maxplot)))+1 write(fmtstrlen,"(A1,I1)") "i",maxdigits fmtstr1 = "(1x,"//trim(adjustl(fmtstrlen))//",')',1x,a20,1x," & //trim(adjustl(fmtstrlen))//",')',1x,a20)" print fmtstr1, & (i,transform_label(label(i),itrans(i)), & ihalf + i + iadjust, transform_label(label(ihalf + i + iadjust), & itrans(ihalf+i+iadjust)),i=1,ihalf) if (iadjust /= 0) then fmtstr2 = "(1x,"//trim(adjustl(fmtstrlen))//",')',1x,a20)" print fmtstr2, & ihalf + iadjust,transform_label(label(ihalf + iadjust), & itrans(ihalf+iadjust)) endif ! !--multiplot ! print sep fmtstr3 = "(1x,' M)',1x,a,'[ '," & //trim(adjustl(fmtstrlen))//",' ]',5x,a2,') ',a)" print fmtstr3,'multiplot ',nyplotmulti,'m','set multiplot ' else ! !--if no data ! maxdigits = 1 print "(/a)",' No data: You may choose from the options below ' endif ! !--options ! print sep if (ndim <= 1) then print "(a)",' d(ata) p(age) o(pts) l(imits) le(g)end s(ave) q(uit)' else print "(a)",' d(ata) p(age) o(pts) l(imits) le(g)end h(elp)' print "(a)",' r(ender) v(ector) x(sec/rotate) s(ave) q(uit)' endif print sep ! !--prompt user for selection ! write(*,"(a)",ADVANCE='NO') 'Please enter your selection now (y axis or option):' read(*,"(a)",iostat=ierr) string if (ierr < 0) stop 'reached end of input' ! end of input (e.g. in script) if (ierr > 0) stop !'error reading input' ioption = string(1:maxdigits) !------------------------------------------------------------ ! if input is an integer and within range, plot data !------------------------------------------------------------ read(ioption,*,iostat=ierr) ipicky if (ierr /= 0) ipicky = -1 !--try to read more integers from the string ! if present, use these to set up an "instant multiplot" if (ipicky > 0 .and. ipicky < numplot+1 .and. len_trim(string) > 2) then call set_instant_multiplot(string,ipicky,ipickx,numplot,nyplotmulti,& multiplotx,multiploty,nacross,ndown) endif !--allow capital M to select the multiplot option if (ioption(1:1)=='M' .or. ipicky==0) ipicky = numplot+1 if (ipicky > 0 .and. ipicky <= numplot+1) then if (.not.ivegotdata) then ! !--do not allow plotting if no data - instead try to read data ! print*,' no data ' if (buffer_data) then call get_data(-1,.false.) else call get_data(1,.false.,firsttime=.true.) endif else ! !--if needed prompt for x axis selection ! if (ipicky <= (numplot-nextra)) then if (ipickx==0) then if (ndim > 1 .and. ix(1) > 0) then ipickx = ix(1) else ipickx = 1 ! do not allow zero as default endif endif if (ipickx==ipicky) then ! do not allow x same as y by default if (ipickx > 1) then ipickx = ipicky-1 else ipickx = ipicky+1 endif endif call prompt(' (x axis) ',ipickx) !--go back to y prompt if out of range if (ipickx > numplot .or. ipickx <= 0) cycle menuloop ! !--work out whether rendering is allowed ! iAllowRendering = allowrendering(ipickx,ipicky,xsec_nomulti) ! !--prompt for render and vector plots ! -> only allow if in "natural" coord system, otherwise h's would be wrong) ! (a future feature might be to interpolate in icoord then translate the pixels ! to icoordsnew, or alternatively plot non-cartesian pixel shapes) ! -> also do not allow if transformations are applied ! if (is_coord(ipicky,ndim) .and. is_coord(ipickx,ndim)) then if (iAllowRendering) then call prompt('(render) (0=none)',irender,0,(numplot-nextra)) if (irender > 0 .and. iplotcont_nomulti .and. icolours /= 0) then if (double_rendering) then rprompt = '2nd render' else rprompt = 'contours' endif call prompt('('//trim(rprompt)//') (0=none)',icontourplot,0,(numplot-nextra)) if (icontourplot==irender) then if (iadapt) then print "(a)",' limits for '//trim(rprompt)//' are adaptive' else if (.not.lim2set(icontourplot)) lim2(icontourplot,:) = lim(icontourplot,:) call prompt(' enter min for '//trim(rprompt)//':',lim2(icontourplot,1)) call prompt(' enter max for '//trim(rprompt)//':',lim2(icontourplot,2)) if (all(abs(lim2(icontourplot,:)-lim(icontourplot,:)) < tiny(lim))) then call reset_lim2(icontourplot) endif endif endif endif else irender = 0 endif if (any(iamvec(1:numplot) /= 0) .and. (icoordsnew==icoords)) then ivecplottemp = -1 ierr = 1 do while(ierr /= 0 .and. ivecplottemp /= 0) ivecplottemp = ivecplot ierr = 0 call prompt('(vector plot) ('//trim(vecprompt)//')',ivecplottemp,0,maxval(iamvec)) if (.not.any(iamvec(1:numplot)==ivecplottemp)) then print "(a)",'Error, value not in list' ierr = 1 endif enddo ivecplot = ivecplottemp else ivecplot = 0 endif if (ivecplot > 0 .and. irender==0) then call prompt('plot particles?',iplotpartvec) endif else if (iAllowRendering) then call prompt('(render) (0=none)',irender,0,(numplot-nextra)) else irender = 0 endif ivecplot = 0 endif elseif (ipicky > 0 .and. ipicky==itoomre .or. ipicky==isurfdens) then print "(a)",' setting x axis to r' if (ipicky==itoomre) call prompt('enter central mass for Toomre Q calculation [code units] ',mstari) ipickx = 1 irender = 0 ivecplot = 0 elseif (ipicky > 0 .and. ipicky==ipdf) then call prompt(' enter x axis for PDF calculation ',ipickx,1,ndataplots) irender = 0 ivecplot = 0 elseif (ipicky > 0 .and. ipicky==icolpixmap) then call prompt(' enter corresponding SPH column for particle data ',irender,0,ndataplots) ipickx = 0 ivecplot = 0 elseif (ipicky==numplot+1) then ! !--for multiplots, check that options are valid. If not, re-prompt for multiplot ! settings ! ipickx = 0 irender = 0 ivecplot = 0 if (any(multiploty(1:nyplotmulti) <= 0) .or. & any(multiploty(1:nyplotmulti) > numplot) .or. & any(multiplotx(1:nyplotmulti) <= 0) .or. & any(multiplotx(1:nyplotmulti) > numplot)) then print "(/,a,/)",'ERROR: multiplot settings out of range, please re-enter these' call options_multiplot endif endif ! !--call main plotting routine ! call timestep_loop(ipicky,ipickx,irender,icontourplot,ivecplot) endif !------------------------------------------------------------------------ ! if input is an integer > numplot+1, quit !------------------------------------------------------------------------ elseif (ipicky > numplot+1) then return else !------------------------------------------------------------------------ ! if input is a string, use menu options !------------------------------------------------------------------------ !-- Menu shortcuts; so you can type e.g. o2 and get the o)ptions menu, item 2 read(ioption(2:2),*,iostat=ierr) ichoose if (ierr /= 0) ichoose = 0 select case(ioption(1:1)) !------------------------------------------------------------------------ !+ Sets up plotting of (m)ultiple quantities per timestep case('m') call options_multiplot !------------------------------------------------------------------------ !+ This submenu sets options relating to the (d)ata read case('d','D') call submenu_data(ichoose) !------------------------------------------------------------------------ !+ This option turns (i)nteractive mode on/off case('i','I') interactive = .not.interactive print "(a)",' Interactive mode is '//print_logical(interactive) !------------------------------------------------------------------------ !+ This submenu sets (p)age setup options case('p','P') call submenu_page(ichoose) !------------------------------------------------------------------------ !+ This submenu sets particle plot (o)ptions case('o','O') call submenu_particleplots(ichoose) !------------------------------------------------------------------------ !+ This submenu sets le(g)end and title options case('g','G') call submenu_legend(ichoose) !------------------------------------------------------------------------ !+ This submenu sets (r)endering options case('r','R') if (ndim <= 1) print "(a)",'WARNING: these options have no effect in < 2D' call submenu_render(ichoose) !------------------------------------------------------------------------ !+ This submenu sets (v)ector plotting options case('v','V') if (ndim <= 1) print "(a)",'WARNING: these options have no effect in < 2D' call submenu_vecplot(ichoose) !------------------------------------------------------------------------ !+ This submenu sets cross section and rotation options case('x','X') if (ndim <= 1) print "(a)",'WARNING: these options have no effect in < 2D' call submenu_xsecrotate(ichoose) !------------------------------------------------------------------------ !+ This submenu sets options relating to the plot limits case('l','L') call submenu_limits(ichoose) !------------------------------------------------------------------------ !+ The (s)ave option saves default options to a !+ file called `splash.defaults'' in the current directory which !+ is read automatically upon the next invocation of splash. !+ This file uses namelist formatting and may be edited !+ manually prior to startup if desired. !+ Also save the current plot limits to a file called !+ 'splash.limits' which is read automatically case('s','S') if (ioption(2:2)=='a' .or. ioption(2:2)=='A') then call prompt('enter prefix for filenames: ',fileprefix,noblank=.true.) call set_filenames(trim(fileprefix)) endif call defaults_write(defaultsfile) call write_limits(limitsfile) if (iRescale) call write_unitsfile(unitsfile,ncolumns) !------------------------------------------------------------------------ !+ Slightly obsolete: prints whatever help may be helpful case('h','H') print "(10(/a))",' Hint: menu items can be shortcut by typing, e.g. o2 for ',& ' the o)ptions menu, item 2.',' ', & ' for detailed help, consult the user guide',' ',& ' (splash/docs/splash.pdf ',& ' or http://users.monash.edu.au/~dprice/splash/userguide/)', & ' ',' and/or the online FAQ. If you''re really stuck, email me! ' read* !------------------------------------------------------------------------ !+ (q)uit, unsurprisingly, quits. Typing a number greater !+ than the number of data columns also exits the program !+ (e.g. I often simply type 99 to exit). case('q','Q') return !------------------------------------------------------------------------ case DEFAULT print "(a)",'unknown option '//trim(ioption) end select endif enddo menuloop return contains !---------------------------------------------------- ! multiplot setup !---------------------------------------------------- subroutine options_multiplot use settings_page, only:nacross, ndown use settings_render, only:iplotcont_nomulti use limits, only:lim,lim2,lim2set,reset_lim2 use labels, only:is_coord,labeltype use params, only:maxparttypes use settings_data, only:ntypes use particle_data, only:npartoftype integer :: ifac,ierr,itype,nvalues,nt logical :: isamex, isamey, icoordplot, anycoordplot, imultisamepanel integer, dimension(maxparttypes) :: itypelist call prompt('Enter number of plots per timestep:',nyplotmulti,1,numplot) isamey = all(multiploty(1:nyplotmulti)==multiploty(1)) if (ndim >= 2) call prompt('Same y axis for all?',isamey) if (isamey) then call prompt('Enter y axis for all plots',multiploty(1),1,numplot) multiploty(2:nyplotmulti) = multiploty(1) endif isamex = all(multiplotx(1:nyplotmulti)==multiplotx(1)) call prompt('Same x axis for all?',isamex) if (isamex) then call prompt('Enter x axis for all plots',multiplotx(1),1,numplot) multiplotx(2:nyplotmulti) = multiplotx(1) endif ! only count particle types with non-zero numbers of particles nt = 0 do i=1,ntypes if (any(npartoftype(i,:) > 0)) nt = nt + 1 enddo anycoordplot = .false. do i=1,nyplotmulti print*,'-------------- Plot number ',i,' --------------' if (.not.isamey) then call prompt(' y axis ',multiploty(i),1,numplot) endif if (multiploty(i) <= ndataplots .and. .not.isamex) then call prompt(' x axis ',multiplotx(i),1,ndataplots) else if (multiploty(i)==isurfdens) then print "(a)",' setting x axis to r for surface density plot' multiplotx(i) = 1 elseif (multiploty(i)==itoomre) then print "(a)",' setting x axis to r for Toomre Q plot' multiplotx(i) = 1 elseif (multiploty(i)==ipdf) then call prompt(' enter x axis for PDF calculation ',multiplotx(i),1,ndataplots) elseif (multiploty(i)==icolpixmap) then call prompt(' enter corresponding SPH column for particle data ',irendermulti(i),0,ndataplots) multiplotx(i) = 1 elseif (.not.isamex) then multiplotx(i) = multiploty(i) endif endif ! !--work out whether rendering is allowed ! iAllowRendering = allowrendering(multiplotx(i),multiploty(i)) icoordplot = (is_coord(multiplotx(i),ndim) .and. is_coord(multiploty(i),ndim)) if (icoordplot) anycoordplot = icoordplot if (icoordplot) then if (iAllowRendering) then call prompt('(render) (0=none)',irendermulti(i),0,numplot-nextra) if (irendermulti(i) > 0 .and. iplotcont_nomulti .and. icolours /= 0) then if (double_rendering) then rprompt = '2nd render' else rprompt = 'contours' endif call prompt('('//trim(rprompt)//') (0=none)',icontourmulti(i),0,numplot-nextra) if (icontourmulti(i)==irendermulti(i)) then if (iadapt) then print "(a)",' limits for '//trim(rprompt)//' are adaptive ' else if (.not.lim2set(icontourmulti(i))) lim2(icontourmulti(i),:) = lim(icontourmulti(i),:) call prompt(' enter min for '//trim(rprompt)//':',lim2(icontourmulti(i),1)) call prompt(' enter max for '//trim(rprompt)//':',lim2(icontourmulti(i),2)) if (all(abs(lim2(icontourmulti(i),:)-lim(icontourmulti(i),:)) < tiny(lim))) then call reset_lim2(icontourmulti(i)) endif endif endif else icontourmulti(i) = 0 endif !iplotcontmulti(i) = iplotcont_nomulti endif if (any(iamvec(1:numplot) > 0)) then ivecplottemp = -1 ierr = 1 do while(ierr /= 0 .and. ivecplottemp /= 0) ivecplottemp = ivecplotmulti(i) ierr = 0 call prompt('(vector plot) ('//trim(vecprompt)//')',ivecplottemp,0,maxval(iamvec)) if (.not.any(iamvec(1:numplot)==ivecplottemp)) then print "(a)",'Error, value not in list' ierr = 1 endif enddo ivecplotmulti(i) = ivecplottemp else ivecplotmulti(i) = 0 endif if (ivecplotmulti(i) > 0 .and. irendermulti(i)==0) then call prompt('plot particles?',iplotpartvec) endif else ! !--set irender, icontour and ivecplot to zero if no rendering allowed ! if (multiploty(i) /= icolpixmap) irendermulti(i) = 0 icontourmulti(i) = 0 ivecplotmulti(i) = 0 endif if (icoordplot .and. ndim >= 2) then call prompt(' is this a cross section (no=projection)? ',x_secmulti(i)) if (x_secmulti(i)) then call prompt('enter co-ordinate location of cross section slice',xsecposmulti(i)) endif endif ! !--prompt for selection of different particle types ! if more than one SPH particle type is present ! itypelist = 0 if (nt >= 2) then call prompt('use all active particle types?',iusealltypesmulti(i)) if (iusealltypesmulti(i)) then nvalues = 0 itypelist(:) = 0 else ! !--prepare list of types based on current iplotpartoftypemulti ! nvalues = 0 do itype=1,ntypes if (iplotpartoftypemulti(itype,i)) then nvalues = nvalues + 1 itypelist(nvalues) = itype endif enddo if (nvalues==0) then print*,'warning: internal error in type list' itypelist(:) = 0 nvalues = 1 endif ! !--prompt for list of types to use ! do itype=1,ntypes if (any(npartoftype(itype,:) > 0)) then print "(i2,':',1x,a)",itype,'use '//trim(labeltype(itype))//' particles' endif enddo call prompt('Enter type or list of types to use',itypelist,nvalues,1,ntypes) ! !--set which particle types to plot ! iplotpartoftypemulti(:,i) = .false. iplotpartoftypemulti(itypelist(1:nvalues),i) = .true. endif else ! !--if ntypes < 2 always use the (only) particle type ! iusealltypesmulti(i) = .true. endif enddo if (isamex .and. .not.anycoordplot) then imultisamepanel = .false. !call prompt('plot all plots in same panel? (default is different panels)',imultisamepanel) else imultisamepanel = .false. endif if (nyplotmulti==1 .or. imultisamepanel) then nacross = 1 ndown = 1 print*,'setting nacross,ndown = ',nacross,ndown elseif (mod(nacross*ndown,nyplotmulti) /= 0) then !--guess nacross,ndown based on largest factor ifac = nyplotmulti/2 do while (mod(nyplotmulti,ifac) /= 0 .and. ifac > 1) ifac = ifac - 1 enddo if (ifac <= 1) then nacross = nyplotmulti/2 else nacross = ifac endif if (nacross <= 0) nacross = 1 ndown = nyplotmulti/nacross print*,'setting nacross,ndown = ',nacross,ndown else print*,'nacross = ',nacross,' ndown = ',ndown endif return end subroutine options_multiplot end subroutine menu !---------------------------------------------- ! utility function which determines whether ! or not rendering is allowed or not !---------------------------------------------- logical function allowrendering(iplotx,iploty,xsec) use labels, only:ih,irho,get_z_coord use multiplot, only:itrans use settings_data, only:ndim,ndataplots,icoords,icoordsnew use settings_render, only:icolour_particles use geometry, only:coord_is_length integer, intent(in) :: iplotx,iploty logical, intent(in), optional :: xsec integer :: itransx,itransy,iz logical :: is_xsec,islengthz if (present(xsec)) then is_xsec = xsec else is_xsec = .true. endif itransx = 0 itransy = 0 if (iplotx > 0) itransx = itrans(iplotx) if (iploty > 0) itransy = itrans(iploty) iz = get_z_coord(ndim,iplotx,iploty) islengthz = coord_is_length(iz,icoordsnew) ! !--work out whether rendering is allowed based on presence of rho, h & m in data read ! also must be in base coordinate system and no transformations applied ! if ((ih > 0 .and. ih <= ndataplots) & .and.(irho > 0 .and. irho <= ndataplots) & .and.(icoords==icoordsnew .or. (.not.is_xsec .or. (is_xsec .and. islengthz))) & .and.(itransx==0 .and. itransy==0)) then allowrendering = .true. else allowrendering = .false. if (icolour_particles) allowrendering = .true. endif end function allowrendering !---------------------------------------------- ! utility function which sets up the "extra" ! plot columns and returns the total number ! of allowed columns for plotting !---------------------------------------------- subroutine set_extracols(ncolumns,ncalc,nextra,numplot,ndataplots) use params, only:maxplot use labels, only:ipowerspec,iacplane,isurfdens,itoomre,ispsound,iutherm,ipdf,label,icolpixmap use settings_data, only:ndim,icoordsnew,ivegotdata,debugmode use settings_part, only:iexact use system_utils, only:lenvironment use write_pixmap, only:ireadpixmap integer, intent(in) :: ncolumns integer, intent(inout) :: ncalc integer, intent(out) :: nextra,numplot,ndataplots ! !-add extra columns (but not if nothing read from file) ! if (ncolumns > 0) then nextra = 0 ipowerspec = 0 iacplane = 0 isurfdens = 0 itoomre = 0 if (ndim==3 .and. icoordsnew==2 .or. icoordsnew==3) then nextra = nextra + 1 isurfdens = ncolumns + ncalc + nextra label(isurfdens) = 'Surface density' if (iutherm > 0 .and. iutherm <= ncolumns .or. ispsound > 0 .and. ispsound <= ncolumns) then nextra = nextra + 1 itoomre = ncolumns + ncalc + nextra label(itoomre) = 'Toomre Q parameter' endif endif if (ndim==3 .and. lenvironment('SPLASH_TURB')) then !--Probability Density Function nextra = nextra + 1 ipdf = ncolumns + ncalc + nextra label(ipdf) = 'PDF' endif if (ndim <= 1 .and. lenvironment('SPLASH_TURB')) then !! .or. ndim==3) then ! if 1D or no coord data (then prompts for which x) nextra = nextra + 1 ! one extra plot = power spectrum ipowerspec = ncolumns + ncalc + nextra label(ipowerspec) = '1D power spectrum' else ipowerspec = 0 endif if (iexact==6) then ! toy star plot a-c plane nextra = nextra + 1 iacplane = ncolumns + ncalc + nextra label(iacplane) = 'a-c plane' else iacplane = 0 endif !nextra = nextra + 1 !label(ncolumns+ncalc+nextra) = 'gwaves' if (ndim >= 2) then if (ireadpixmap) then nextra = nextra + 1 icolpixmap = ncolumns + ncalc + nextra label(icolpixmap) = '2D pixel map' endif endif endif ! !--now that we know nextra, set the total number of allowed plots (numplot). ! if (ivegotdata) then numplot = ncolumns + ncalc + nextra if (numplot > maxplot) then print "(a,i3,a)",' ERROR: total number of columns = ',numplot,' is greater ' print "(a,i3,a)",' than the current allowed maximum (',maxplot,').' print "(a)",' This is set by the parameter "maxplot" in the params module' print "(a)",' in the file globaldata.f90 -- edit this and recompile splash' print "(a)",' (or email me if this happens to increase the default limit)' stop endif ndataplots = ncolumns + ncalc else numplot = 0 ndataplots = 0 ncalc = 0 endif if (debugmode) print*,'DEBUG: numplot = ',numplot, ' ncalc = ',ncalc,' ndataplots = ',ndataplots return end subroutine set_extracols !---------------------------------------- ! instant multiplot setup from main menu !---------------------------------------- subroutine set_instant_multiplot(string,ipicky,ipickx,numplot,nmulti,multiplotx,multiploty,nx,ny) use params, only:maxplot use prompting, only:prompt character(len=*), intent(in) :: string integer, intent(in) :: numplot integer, intent(inout) :: ipicky,ipickx integer, intent(inout) :: nmulti,nx,ny integer, intent(inout) :: multiplotx(:),multiploty(:) integer :: ipickarr(maxplot),ierr,i ipickarr = 0 read(string,*,iostat=ierr) ipickarr i = 1 do while (i < size(ipickarr) .and. ipickarr(i) /= 0 .and. ipickarr(i) <= numplot) i = i + 1 enddo if (i > 2) then nmulti = i-1 !--make sure nmulti matches the number of panels on the page if (nmulti /= nx*ny) then nx = 1 ny = nmulti endif multiploty(1:nmulti) = ipickarr(1:nmulti) ipicky = numplot + 1 if (ipickx==0) ipickx = 1 ! do not allow zero as default call prompt(' (x axis) ',ipickx) multiplotx(1:nmulti) = ipickx endif end subroutine set_instant_multiplot !-------------------- ! print menu header !-------------------- subroutine print_header integer :: v(8),i integer, parameter :: m(48) = (/32,68,111,110,39,116,32,102,111,114,103,101,116,32,116,111,& 32,115,101,110,100,32,68,97,110,105,101,108,32,97,32,98,& 105,114,116,104,100,97,121,32,109,101,115,115,97,103,101,33/) integer, parameter :: c(49) = (/32,120,111,120,111,120,111,120,111,32,77,101,114,114,121,32,& 67,104,114,105,115,116,109,97,115,32,102,114,111,109,32,115,& 112,108,97,115,104,33,32,120,111,120,111,120,111,120,111,120,111/) integer, parameter :: d(49) = (/32,79,111,79,111,79,111,79,32,83,80,76,65,83,72,32,119, & 105,115,104,101,115,32,121,111,117,32,97,32,118,101,114,121,32,104,& 97,112,112,121,32,33,32,79,111,79,111,79,111,79/) integer, parameter :: l(45) = (/64,130,64,216,222,220,206,64,232,210,218,202,64,194,& 206,222,64,210,220,64,194,64,206,194,216,194,240,242,64,204,194,& 228,88,64,204,194,228,64,194,238,194,242,92,92,92/) integer, parameter :: a(49) = (/32,83,101,103,109,101,110,116,97,116,105,111,110,32,& 102,97,117,108,116,46,32,80,108,101,97,115,101,32,114,101,98,111,& 111,116,32,121,111,117,114,32,99,111,109,112,117,116,101,114,46/) integer, parameter :: s(48)=(/64,138,228,228,222,228,116,64,230,224,216,194,230,208,64,& 200,210,202,200,92,64,160,216,202,194,230,202,64,228,202,196,222,& 222,232,64,242,222,234,228,64,198,222,218,224,234,232,202,228/) integer, parameter :: p(53)=(/12,7,10,13,10,14,18,11,15,14,12,14,17,18,16,18,12,11,12,& 17,13,15,11,15,13,12,12,17,12,11,16,18,14,9,11,17,17,13,10,18,16,10,15,& 18,12,18,18,12,16,14,10,9,14/) call date_and_time(values=v) if (v(2)==m(1)/4 .and. v(3)==v(2)-2) then print "(/,48(a))",(achar(m(i)),i=1,48) elseif (v(2)==(m(1)-20) .and. v(3)>20) then print "(/,49(a))",(achar(c(i)),i=1,49) elseif (v(2)==nint(0.6) .and. v(3)==d(2)/79) then print "(/,40(a),i4,9(a))",(achar(d(i)),i=1,40),v(1),(achar(d(i)),i=41,49) elseif (v(2)==l(1)-59 .and. v(3)==l(1)/4**2) then print "(/,45(a))",(achar(l(i)/2),i=1,45) elseif (v(2)==a(14)/8 .and. v(3)==int(1.3) .and. v(5) < (l(1)-16)/4) then print "(/,49(a))",(achar(a(i)),i=1,49) elseif (v(2)==(s(5)+78)/100+1 .and. v(3)==nint(sqrt(1.5)) .and. v(5) < s(1)/5.3) then print "(/,48(a))",(achar(s(i)/2),i=1,48) elseif ((v(2)==int(0.25*p(1)) .and. v(3)==p(6)) .or. (abs(v(3)/real(v(2))-4.*atan(1.)) < 1.3e-3)) then print "(/,1x,53(a))",(achar(p(i)+39),i=1,53) else print "(/a)",' You may choose from a delectable sample of plots' endif end subroutine print_header end module mainmenu danieljprice-splash-4d1f09c/src/moments.f90000066400000000000000000000105411477365367100206640ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2023- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module moments implicit none contains !----------------------------------------------------------------- ! ! subroutine to compute moments from a data cube ! by interpolating the z dimension onto a finer grid ! with the SPH kernel and then integrating ! !----------------------------------------------------------------- subroutine get_moments(cube,zvals,hfac,moment_type,moments) use interpolations1D, only:interpolate1D use timing, only:wall_time,print_time real, intent(in) :: cube(:,:,:),zvals(:),hfac integer, intent(in) :: moment_type(:) real, intent(out), allocatable :: moments(:,:,:) real, allocatable :: profile(:),profile_smooth(:),hh(:),weight(:),zvals_smooth(:) integer, allocatable :: mask(:) real :: dz,dz_smooth,zmin integer :: i,j,k,m,nx,ny,nz,nm,nz_smooth,iu,jcount,ktmp(1),iprint,jprint real :: t1,t2 ! compute array dimensions nx = size(cube,1) ny = size(cube,2) nz = size(cube,3) nm = size(moment_type) nz_smooth = 10*nz ! allocate memory allocate(profile(nz),profile_smooth(nz_smooth),zvals_smooth(nz_smooth),hh(nz),weight(nz),mask(nz)) allocate(moments(nx,ny,nm)) ! set up the interpolation grid dz = zvals(2)-zvals(1) dz_smooth = (dz*nz)/nz_smooth zmin = zvals(1) - 0.5*dz do k=1,nz_smooth zvals_smooth(k) = zmin + (k-0.5)*dz_smooth enddo ! set smoothing length, weights and mask for interpolate1D routine mask = 1 hh = hfac*abs(dz) weight = abs(dz)/hh ! select which pixel to print out for debugging purposes jprint = ny/2 iprint = nx/2 + 10 ! progress bar and timing call wall_time(t1) write(*,"(/,a,45x,a)") ' 0% ',' 100%' write(*,"(1x,a)",advance='no') '|' jcount = 0 !$omp parallel do default(none) shared(cube,moments,moment_type,ny,nx,zvals,hh,weight,mask) & !$omp shared(nz,nz_smooth,nm,zmin,dz_smooth,zvals_smooth,jcount,iu,iprint,jprint) & !$omp private(j,i,k,m,ktmp,profile,profile_smooth) do j=1,ny ! ! print progress bar ! !$omp atomic jcount = jcount + 1 if (mod(jcount,ny/50)==0) write(*,"('=')",advance='no') do i=1,nx ! extract line profile in the z direction profile = cube(i,j,:) ! interpolate to a finer grid call interpolate1D(zvals,hh,weight,profile,mask,nz,zmin,profile_smooth,nz_smooth,dz_smooth,normalise=.false.,iverbose=0) ! compute desired moments at this pixel location do m=1,nm select case(moment_type(m)) case(9) ! peak velocity ktmp = maxloc(profile_smooth) moments(i,j,m) = zvals_smooth(ktmp(1)) case(8) ! peak intensity moments(i,j,m) = maxval(profile_smooth) case(1:2) moments(i,j,m) = sum(profile_smooth*zvals_smooth**moment_type(m)) case default ! moment 0 moments(i,j,m) = sum(profile_smooth) end select enddo ! ! print out line profile for a selected pixel for debugging purposes ! if (j==jprint .and. i==iprint) then open(newunit=iu,file='profile.dat',status='replace') do k=1,nz write(iu,*) zvals(k),profile(k) enddo close(iu) open(newunit=iu,file='profile_smooth.dat',status='replace') do k=1,nz_smooth write(iu,*) zvals_smooth(k),profile_smooth(k) enddo close(iu) endif enddo enddo !$omp end parallel do ! finish progress bar and timing call wall_time(t2) write(*,"(a)",advance='no') '|' call print_time(t2-t1) write(*,*) end subroutine get_moments end module moments danieljprice-splash-4d1f09c/src/no_fits.f90000066400000000000000000000255671477365367100206610ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2020- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module handling read and write of FITS files ! With thanks to Christophe Pinte ! !---------------------------------------------------------------------- module readwrite_fits use iso_fortran_env, only:real32,real64 implicit none public :: read_fits_image,write_fits_image,fits_error public :: read_fits_cube,write_fits_cube public :: read_fits_header public :: get_floats_from_fits_header,get_from_header,get_from_header_s public :: append_to_fits_cube public :: get_velocity_from_fits_header public :: flatten_header interface write_fits_image module procedure write_fits_image,write_fits_image64 end interface write_fits_image interface write_fits_cube module procedure write_fits_cube,write_fits_cube64 end interface write_fits_cube interface read_fits_image module procedure read_fits_image,read_fits_image64 end interface read_fits_image interface read_fits_cube module procedure read_fits_cube,read_fits_cube64 end interface read_fits_cube interface append_to_fits_cube module procedure append_to_fits_cube end interface append_to_fits_cube private contains !--------------------------------------------------- ! subroutine to read image from FITS file ! using cfitsio library !--------------------------------------------------- subroutine read_fits_image(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename real(kind=real32), intent(out), allocatable :: image(:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) integer, intent(out) :: naxes(2),ierr ierr = 1 naxes = 0 end subroutine read_fits_image !--------------------------------------------------- ! read FITS header from file !--------------------------------------------------- subroutine read_fits_header(filename,hdr,ierr) character, intent(in) :: filename character(len=80), allocatable, intent(out) :: hdr(:) integer, intent(out) :: ierr ierr = 1 end subroutine read_fits_header !--------------------------------------------------- ! internal subroutine to read FITS header information !--------------------------------------------------- subroutine read_fits_head(iunit,hdr,ierr) integer, intent(in) :: iunit integer, intent(out) :: ierr character(len=80), allocatable, intent(inout) :: hdr(:) ierr = 1 end subroutine read_fits_head !--------------------------------------------------- ! internal subroutine to write FITS header information ! excluding things we have changed !--------------------------------------------------- subroutine write_fits_head(iunit,hdr,ierr) integer, intent(in) :: iunit character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr ierr = 1 end subroutine write_fits_head !--------------------------------------------------- ! subroutine to read spectral cube from FITS file ! using cfitsio library !--------------------------------------------------- subroutine read_fits_cube(filename,image,naxes,ierr,hdr,hdu,velocity) character(len=*), intent(in) :: filename real(kind=real32), intent(out), allocatable :: image(:,:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) real(kind=real32), intent(out), allocatable, optional :: velocity(:) integer, intent(out) :: naxes(4),ierr integer, intent(in), optional :: hdu ! specify which hdu to read ierr = 1 naxes = 0 end subroutine read_fits_cube !--------------------------------------------------- ! error code handling !--------------------------------------------------- character(len=50) function fits_error(ierr) integer, intent(in) :: ierr select case(ierr) case(1) fits_error = 'not compiled with fits lib' case default fits_error = 'unknown error' end select end function fits_error !------------------------------------------------ ! Writing new fits file !------------------------------------------------ subroutine write_fits_image(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(2) real(kind=real32), intent(in) :: image(naxes(1),naxes(2)) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) ierr = 1 end subroutine write_fits_image !------------------------------------------------------------- ! Writing new fits file (convert from double precision input) !------------------------------------------------------------- subroutine write_fits_image64(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(2) real(kind=real64),intent(in) :: image(naxes(1),naxes(2)) real(kind=real32), allocatable :: img32(:,:) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) ierr = 1 end subroutine write_fits_image64 !------------------------------------------------ ! Writing new fits file !------------------------------------------------ subroutine write_fits_cube(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(3) real(kind=real32), intent(in) :: image(naxes(1),naxes(2),naxes(3)) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) ierr = 1 end subroutine write_fits_cube !------------------------------------------------ ! Writing new fits file !------------------------------------------------ subroutine append_to_fits_cube(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(3) real(kind=real32), intent(in) :: image(naxes(1),naxes(2),naxes(3)) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) ierr = 1 end subroutine append_to_fits_cube !------------------------------------------------------------- ! Writing new fits file (convert from double precision input) !------------------------------------------------------------- subroutine write_fits_cube64(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(3) real(kind=real64),intent(in) :: image(naxes(1),naxes(2),naxes(3)) character(len=80), intent(in), optional :: hdr(:) integer, intent(out) :: ierr ierr = 1 end subroutine write_fits_cube64 !------------------------------------------------------------- ! read fits file and convert to double precision !------------------------------------------------------------- subroutine read_fits_image64(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename real(kind=real64), intent(out), allocatable :: image(:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) integer, intent(out) :: naxes(2),ierr ierr = 1 naxes = 0 end subroutine read_fits_image64 !------------------------------------------------------------- ! read fits cube and convert to double precision !------------------------------------------------------------- subroutine read_fits_cube64(filename,image,naxes,ierr,hdr,velocity) character(len=*), intent(in) :: filename real(kind=real64), intent(out), allocatable :: image(:,:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) real(kind=real64), intent(inout), allocatable, optional :: velocity(:) integer, intent(out) :: naxes(4),ierr ierr = 1 naxes = 0 end subroutine read_fits_cube64 !-------------------------------------------------- ! read all floating point variables from fits header !-------------------------------------------------- subroutine get_floats_from_fits_header(hdr,tags,vals) character(len=80), intent(in) :: hdr(:) character(len=*), intent(out) :: tags(:) real, intent(out) :: vals(:) tags = '' vals = 0. end subroutine get_floats_from_fits_header !------------------------------------------------ ! get tag:val pairs from fits header record ! will extract anything readable as a floating ! point number !------------------------------------------------ subroutine get_fits_header_entry(record,key,rval,ierr) character(len=80), intent(in) :: record character(len=*), intent(out) :: key real, intent(out) :: rval integer, intent(out) :: ierr ierr = 1 rval = 0. end subroutine get_fits_header_entry !------------------------------------------------ ! get tag:val pairs from fits header record ! returns the string value !------------------------------------------------ subroutine get_fits_header_key_val(record,key,val,ierr) character(len=80), intent(in) :: record character(len=*), intent(out) :: key character(len=*), intent(out) :: val integer, intent(out) :: ierr ierr = 1 key = '' val = '' end subroutine get_fits_header_key_val !------------------------------------------------ ! search fits header to find a particular variable ! e.g. bmaj = get_from_header('BMAJ',hdr,ierr) !------------------------------------------------ function get_from_header(key,hdr,ierr) result(val) character(len=*), intent(in) :: key character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr real :: val ierr = 1 val = 0. end function get_from_header !------------------------------------------------ ! search fits header to find a particular string ! e.g. bmaj = get_from_header('BMAJ',hdr,ierr) !------------------------------------------------ function get_from_header_s(key,hdr,ierr) result(val) character(len=*), intent(in) :: key character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr character(len=1) :: val ierr = 1 val = '' end function get_from_header_s !------------------------------------------------ ! delete third dimension in the fits header !------------------------------------------------ subroutine flatten_header(hdr) character(len=80), intent(inout) :: hdr(:) end subroutine flatten_header !------------------------------------------------ ! get velocity grid from the fits file !------------------------------------------------ subroutine get_velocity_from_fits_header(nv,vel,hdr,ierr) integer, intent(in) :: nv real(kind=real32), intent(out) :: vel(nv) character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr ierr = 1 vel = 0. end subroutine get_velocity_from_fits_header end module readwrite_fits danieljprice-splash-4d1f09c/src/options_data.f90000066400000000000000000000177511477365367100217000ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2022 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing settings and options related to the data read ! includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module options_data implicit none public :: submenu_data,defaults_set_data private contains !--------------------------------------------- ! set default values for these options ! (most should be set upon call to read_data) !--------------------------------------------- subroutine defaults_set_data use settings_data use params, only:maxplot integer :: i numplot=maxplot ! reset if read from file ncalc = 0 ! number of columns to calculate(e.g. radius) nextra = 0 ! extra plots aside from particle data ncolumns=maxplot-ncalc ! number of columns in data file ndataplots = ncolumns ndim = 0 ! number of coordinate dimensions ndimV = ndim ! default velocity same dim as coords istartatstep = 1 ! timestep to start from iendatstep = 1000 ! timestep to finish on nfreq = 1 ! frequency of timesteps to read icoords = 1 ! coordinate system of simulation iformat = 0 ! file format buffer_data = .false. buffer_steps_in_file = .false. iUseStepList = .false. do i=1,size(isteplist) isteplist(i) = i enddo iCalcQuantities = .false. DataIsBuffered = .false. iRescale = .false. enforce_code_units = .false. idefaults_file_read = .false. ivegotdata = .false. ntypes = 1 xorigin = 0. track_string = '0' ! particle tracking limits (none) ipartialread = .false. ! strictly unnecessary as set in get_data iverbose = 1 UseFakeDustParticles = .false. iautorender = 0 end subroutine defaults_set_data !---------------------------------------------------------------------- ! sets options relating to current data ! (read new data or change timesteps plotted) !---------------------------------------------------------------------- subroutine submenu_data(ichoose) use filenames, only:nsteps,nstepsinfile,ifileopen use prompting, only:prompt,print_logical use getdata, only:get_data use settings_data, only:buffer_data,iCalcQuantities,iRescale, & DataIsBuffered,numplot,ncalc,ncolumns,UseFakeDustParticles use calcquantities, only:calc_quantities,setup_calculated_quantities use limits, only:set_limits,rescale_limits use labels, only:label,unitslabel,labelzintegration,lenlabel,strip_units,idustfrac use settings_units, only:units,units_old,set_units,write_unitsfile,unitzintegration use fparser, only:rn,mu0 integer, intent(in) :: ichoose integer :: ians,i,ncalcwas,maxopt,len_max character(len=1) :: charp character(len=lenlabel) :: labeli,labelui logical :: UnitsHaveChanged,iRescaleprev,oldval ians = ichoose print "(a)",'----------------- data read options -------------------' if (ians <= 0 .or. ians > 3) then print 10, print_logical(iCalcQuantities), print_logical(iRescale) 10 format( & ' 0) exit ',/, & ' 1) calculate extra quantities ( ',a,' )',/, & ' 2) physical units on/off/edit ( ',a,' )') if (idustfrac > 0) then print & "(' 3) use fake dust particles ( ',a,' )')",print_logical(UseFakeDustParticles) maxopt = 3 else maxopt = 2 endif call prompt('enter option',ians,0,maxopt) endif ! !--options ! select case(ians) ! case(2) ! iUseStepList = .false. ! call prompt('Start at timestep ',istartatstep,1,nsteps) ! call prompt('End at timestep ',iendatstep,istartatstep,nsteps) ! call prompt(' Frequency of steps to read',nfreq,1,nsteps) ! print *,' Steps = ',(iendatstep-istartatstep+1)/nfreq ! !------------------------------------------------------------------------ ! case(3) ! iUseStepList = .true. ! istartatstep = 1 ! nfreq = 1 ! iendatstep = min(iendatstep,size(isteplist),nsteps) ! call prompt('Enter number of steps to plot ', & ! iendatstep,1,size(isteplist)) ! do i=1,iendatstep ! if (isteplist(i) <= 0 .or. isteplist(i) > nsteps) isteplist(i) = i ! write(fmtstring,"(a,i2)") 'Enter step ',i ! call prompt(fmtstring,isteplist(i),1,nsteps) ! enddo case(1) ncalcwas = ncalc call setup_calculated_quantities(ncalc) iCalcQuantities = (ncalc > 0) if (iCalcQuantities) then if (DataIsBuffered) then call calc_quantities(1,nsteps) call set_limits(1,nsteps,ncolumns+ncalcwas+1,ncolumns+ncalc) else if (ifileopen > 0) then call calc_quantities(1,nstepsinfile(ifileopen)) call set_limits(1,nstepsinfile(ifileopen),ncolumns+ncalcwas+1,ncolumns+ncalc) endif endif else print "(/a)",' Calculation of extra quantities is '//print_logical(iCalcQuantities) endif !------------------------------------------------------------------------ case(2) print "(/,a,/)",' Current settings for physical units:' len_max = min(maxval(len_trim(label(:))),20) labeli = 'dz '//trim(labelzintegration) print "(2x,a,es10.3,a)",labeli(1:len_max+3)//' = ',unitzintegration,' x dz' labeli = 'time'//trim(unitslabel(0)) print "(' 0) ',a,es10.3,a)",labeli(1:len_max)//' = ',units(0),' x time' do i=1,ncolumns labeli = strip_units(label(i),unitslabel(i)) labelui = trim(labeli)//trim(unitslabel(i)) print "(i3,') ',a,es10.3,a)",i,labelui(1:len_max)//' = ',units(i),' x '//trim(labeli) enddo print "(a)" UnitsHaveChanged = .false. iRescaleprev = iRescale units_old = 1.d0 if (iRescale) units_old = units charp='y' if (iRescale) charp = 'n' call prompt('Use physical units? y)es, n)o, e)dit',charp,& list=(/'y','Y','n','N','e','E'/),noblank=.true.) select case(charp(1:1)) case('y','Y') iRescale = .true. case('e','E') call set_units(ncolumns,numplot,UnitsHaveChanged) if (.not.iRescale .and. UnitsHaveChanged) iRescale = .true. case default iRescale = .false. end select if ((iRescale .and..not. iRescaleprev) .or. (iRescaleprev .and..not.iRescale) & .or. UnitsHaveChanged) then if (iRescale) then mu0 = 12.566370614359_rn else mu0 = 1.0_rn endif if (buffer_data) then call get_data(-1,.true.) else call get_data(1,.true.,firsttime=.false.) endif if (iRescale) then call rescale_limits(fac=units(1:)/units_old(1:)) else ! switching from physical back to code units units_old = 1.d0 call rescale_limits(fac=units_old(1:)/units(1:)) endif endif case(3) oldval = UseFakeDustParticles call prompt( 'Use fake dust particles?',UseFakeDustParticles) ! re-read data if option has changed if (UseFakeDustParticles .neqv. oldval) then if (buffer_data) then call get_data(-1,.true.) else call get_data(1,.true.,firsttime=.true.) endif endif end select end subroutine submenu_data end module options_data danieljprice-splash-4d1f09c/src/options_limits.f90000066400000000000000000000243721477365367100222650ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing settings and options related to the plot limits ! includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module settings_limits implicit none logical :: iadapt, iadaptcoords, adjustlimitstodevice real :: scalemax real, dimension(3) :: xminoffset_track, xmaxoffset_track contains !--------------------------------------------- ! set default values for these options !--------------------------------------------- subroutine defaults_set_limits use multiplot, only:itrans iadapt = .true. ! adaptive plot limits iadaptcoords = .false. adjustlimitstodevice = .false. scalemax = 1.0 ! for rescaling adaptive limits itrans(:) = 0 ! no transformations (log10 etc) xminoffset_track = 0.5 ! offset of limits from tracked particle xmaxoffset_track = 0.5 ! end subroutine defaults_set_limits !---------------------------------------------------------------------- ! submenu with options relating to plot limits !---------------------------------------------------------------------- subroutine submenu_limits(ichoose) use filenames, only:nsteps,nstepsinfile,ifileopen use settings_data, only:ndataplots,numplot,ndim,iCalcQuantities, & DataIsBuffered,track_string,ntypes use calcquantities, only:calc_quantities use multiplot, only:itrans use prompting, only:prompt,print_logical use limits, only:lim,range,rangeset,anyrangeset,print_rangeinfo use labels, only:label,ix,irad,is_coord,labeltype use transforms, only:ntrans,transform_label use part_utils, only:is_trackstring,get_itrackpart integer, intent(in) :: ichoose integer :: iaction,ipick,i,index,ierr integer :: itrackoffset,itracktype character(len=120) :: transprompt,fmtstring character(len=12) :: string,string2 character(len=len(track_string)) :: track_string_prev ! zoom = 1.0 iaction = ichoose if (iadapt) then string = 'ADAPT' else string = 'FIXED' endif if (iadaptcoords) then string2 = 'ADAPT' else string2 = 'FIXED' endif print "(a)",'------------------ limits options ---------------------' 10 format( & ' 0) exit ',/, & ' 1) use adaptive/fixed limits ( ',a,', ',a,' ) ',/, & ' 2) set limits manually ',/, & ' 3) set particle tracking ( ',a,' )',/, & ' 4) subset data by parameter range ( ',a,')',/, & ' 5) apply log/other transformations to columns ') if (iaction <= 0 .or. iaction > 5) then print 10,trim(string),trim(string2),trim(track_string),print_logical(anyrangeset()) call prompt('enter option ',iaction,0,5) endif ! !--limits ! select case(iaction) !------------------------------------------------------------------------ case(1) !+ With limits set to adaptive, plot limits are minimum !+ and maximum of quantities at current timestep. !+ However, the co-ordinate limits are not adapted !+ in the case of rendered plots. With fixed limits, the !+ plot limits retain their default values for all timesteps. call prompt('Use adaptive plot limits?',iadapt) call prompt('Use adaptive plot limits on coordinate axes?',iadaptcoords) call prompt('Adjust limits to aspect ratio of device?',adjustlimitstodevice) print "(a)",'adaptive plot limits = '//print_logical(iadapt)// & ' on coords = '//print_logical(iadaptcoords) !------------------------------------------------------------------------ case(2) !+ Manually sets the plot limits for each column of data ipick = 1 do while (ipick > 0) ipick = 0 !write(*,*) if (ndim >= 1) then write(fmtstring,'(a,i3,a)') 'Enter column number to set limits (0=quit;',numplot+1,'=centred cube in xyz)' call prompt(trim(fmtstring),ipick,0,numplot+1) else write(fmtstring,'(a,i3,a)') 'Enter column number to set limits (0=quit)' call prompt(trim(fmtstring),ipick,0,numplot) endif if (ipick==numplot+1 .and. ndim >= 1) then call prompt(trim(label(ix(1)))//' max ',lim(ix(1),2)) lim(ix(1),1) = -lim(ix(1),2) print*,'>> '//trim(label(ix(1)))//' limits set (min,max) = ',lim(ix(1),:) if (ndim >= 2) then lim(ix(2:ndim),1) = lim(ix(1),1) lim(ix(2:ndim),2) = lim(ix(1),2) print*,'>> '//trim(label(ix(2)))//' limits set (min,max) = ',lim(ix(2),:) if (ndim >= 3) print*,'>> '//trim(label(ix(3)))//' limits set (min,max) = ',lim(ix(3),:) endif elseif (ipick > 0) then call prompt(trim(label(ipick))//' min ',lim(ipick,1)) call prompt(trim(label(ipick))//' max ',lim(ipick,2)) print*,'>> '//trim(label(ipick))//' limits set (min,max) = ',lim(ipick,1),lim(ipick,2) if (is_coord(ipick,ndim)) then iadaptcoords = .false. elseif (ipick <= numplot) then iadapt = .false. endif endif enddo !------------------------------------------------------------------------ case(3) !+ Co-ordinate limits are centred on the selected !+ particle for all timesteps, with offsets as input by the user. !+ This effectively gives the `Lagrangian' perspective. track_string_prev = track_string print "(3(a,/))",'To track particle 4923, enter 4923', & 'To track the 43rd particle of type 3, enter 3:43',& 'To track the maximum density, enter maxdens' call prompt('Enter particle to track: ',track_string,noblank=.true.) call get_itrackpart(track_string,itracktype,itrackoffset,ierr) do while (ierr /= 0 .or. itracktype < 0 .or. itracktype > ntypes .or. itrackoffset < 0) if (itracktype < 0 .or. itracktype > ntypes) print "(a)",'invalid particle type' if (itrackoffset < 0) print "(a)",'invalid particle index' if (ierr /= 0) print "(a)",'syntax error in string' track_string = '0' call prompt('Enter particle to track: ',track_string,noblank=.true.) call get_itrackpart(track_string,itracktype,itrackoffset,ierr) enddo if (itracktype > 0) then write(string,"(i12)") itrackoffset string = adjustl(string) print "(a)",'=> tracking '//trim(labeltype(itracktype))//' particle #'//trim(string) elseif (itrackoffset > 0) then write(string,"(i12)") itrackoffset string = adjustl(string) print "(a)",'=> tracking particle '//trim(string) elseif (is_trackstring(track_string)) then print "(a)",'=> tracking particle at '//trim(track_string) else track_string = '0' print "(a)",'=> particle tracking limits OFF' endif if (itrackoffset > 0) then do i=1,ndim call prompt('Enter offset for '//trim(label(ix(i)))//'min:', & xminoffset_track(i)) call prompt('Enter offset for '//trim(label(ix(i)))//'max :', & xmaxoffset_track(i)) enddo if ((trim(track_string) /= trim(track_string_prev)) & .and. iCalcQuantities .and. irad > 0 .and. irad <= numplot) then !--radius calculation is relative to tracked particle print "(a)",' recalculating radius relative to tracked particle ' if (DataIsBuffered) then call calc_quantities(1,nsteps) else call calc_quantities(1,nstepsinfile(ifileopen)) endif endif endif !------------------------------------------------------------------------ case(4) !+ Plot subset of data by restricting parameter range ipick = 1 do while (ipick > 0) ipick = 0 call print_rangeinfo() call prompt('Enter column to use to restrict data set (-1=none/unset all,0=quit)',ipick,-1,ndataplots) if (ipick > 0) then print*,'current plot limits for '//trim(label(ipick))//': (min,max) = ',lim(ipick,1),lim(ipick,2) call prompt(trim(label(ipick))//' min value ',range(ipick,1)) call prompt(trim(label(ipick))//' max value ',range(ipick,2),range(ipick,1)) if (.not.rangeset(ipick)) then print*,'>> min=max: no restriction set' endif elseif (ipick==-1) then print "(a)",'>> removing all range restrictions on data set' range(:,:) = 0. endif write(*,*) enddo !------------------------------------------------------------------------ case(5) !+ Applies log, inverse and other transformations to data columns index = 1 do i=1,ntrans write(transprompt(index:),"(1x,i1,'=',a,',')") i,trim(transform_label('x',i)) index = len_trim(transprompt) + 1 enddo ipick = 1 do while (ipick > 0 .and. ipick <= numplot) ipick = 0 call prompt('Enter column to apply transform (0=quit,-1=all) ',ipick) if (ipick <= numplot .and. ipick /= 0) then print "(a)", trim(transprompt) if (ipick < 0) then ipick = 0 call prompt('Which transform (or multiple e.g. 321)?',ipick,0) itrans(:) = ipick ipick = -99 else call prompt('Which transform (or multiple e.g. 321)?',itrans(ipick),0) endif endif enddo end select end subroutine submenu_limits end module settings_limits danieljprice-splash-4d1f09c/src/options_page.f90000066400000000000000000000646301477365367100217010ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2017 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing page settings and options ! includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module settings_page use settings_limits, only:iadapt,iadaptcoords,adjustlimitstodevice,xminoffset_track,xmaxoffset_track use labels, only:lenlabel implicit none integer :: iaxis,nacross,ndown,ipapersize,nstepsperpage,linewidth,iscalepanel,linepalette integer :: iPlotLegendOnlyOnPanel,modlinestyle,modcolour,maxlinestyle,maxcolour integer :: iPageColours,ipapersizeunits logical :: iColourEachStep,iChangeStyles,tile,interactive,nomenu logical :: iPlotLegend,iPlotStepLegend,iPlotTitles,usecolumnorder logical :: iPlotScale,iUseBackgroundColourForAxes,usesquarexy real :: papersizex,aspectratio real :: hposlegend,vposlegend,fjustlegend,hpostitle,vpostitle,fjusttitle real :: charheight,alphalegend real :: dxscale,hposscale,vposscale,yscalealt real :: xminpagemargin,xmaxpagemargin,yminpagemargin,ymaxpagemargin character(len=lenlabel) :: legendtext, scaletext character(len=lenlabel) :: labelyalt integer, parameter :: maxc = 16 real :: colourpalette(3,maxc) namelist /pageopts/ iaxis,nacross,ndown,interactive,iadapt,iadaptcoords, & nstepsperpage,iColourEachStep,iChangeStyles,tile,ipapersize,papersizex,aspectratio, & iPlotLegend,iPlotStepLegend,hposlegend,vposlegend,iPlotTitles,hpostitle, & vpostitle,fjusttitle,legendtext,iPageColours,charheight,linewidth,& fjustlegend,iPlotLegendOnlyOnPanel, & iPlotScale,dxscale,scaletext,hposscale,vposscale,iscalepanel,iUseBackgroundColourForAxes, & usesquarexy,maxlinestyle,modlinestyle,maxcolour,modcolour,usecolumnorder,ipapersizeunits,& adjustlimitstodevice,alphalegend,yscalealt,labelyalt,xminoffset_track,xmaxoffset_track, & xminpagemargin,xmaxpagemargin,yminpagemargin,ymaxpagemargin,linepalette contains !--------------------------------------------- ! set default values for these options !--------------------------------------------- subroutine defaults_set_page use shapes, only:defaults_set_shapes use plotlib, only:plotlib_maxlinecolour interactive = .true. ! default for interactive mode iaxis = 0 ! turns axes off/on nstepsperpage = 1 iColourEachStep = .true. ! change colours if nstepsperpage > 1 iChangeStyles = .false. ! change marker/ line styles if nstepsperpage > 1 tile = .true. usecolumnorder = .true. nacross = 1 ! number of plots across page ndown = 1 ! number of plots down page ipapersize = 0 ! paper size option papersizex = 0.0 ! size of x paper (no call to PGPAP if zero) aspectratio = 0.0 ! aspect ratio of paper (no call to PGPAP if zero) ipapersizeunits = 1 ! units in which the paper size is set iPlotLegend = .true. ! whether or not to plot legend iPlotStepLegend = .false. ! timestep legend hposlegend = 0.95 ! horizontal legend position as fraction of viewport vposlegend = 2.0 ! vertical legend position in character heights fjustlegend = 1.0 ! justification factor for legend alphalegend = 0.5 ! transparency of overlaid annotation legendtext = 't=' iPlotLegendOnlyOnPanel = 0 iPlotTitles = .false. ! whether or not to plot titles hpostitle = 0.5 ! horizontal title position as fraction of viewport vpostitle = 1.0 ! vertical title position in character heights fjusttitle = 0.5 ! justification factor for title iPageColours = 0 charheight = 1.0 ! character height linewidth = 0 ! line width linepalette = 0 iPlotScale = .false. hposscale = 0.5 vposscale = 1.0 dxscale = 1.0 scaletext = '1 unit' iscalepanel = 0 maxlinestyle = 5 modlinestyle = 1 modcolour = 1 maxcolour = plotlib_maxlinecolour yscalealt = 1. labelyalt = ' ' usesquarexy = .true. ! spatial dimensions have same scale call defaults_set_shapes xminpagemargin = 0. xmaxpagemargin = 0. yminpagemargin = 0. ymaxpagemargin = 0. colourpalette = reshape((/0.,0.,0., & 0.933,0.173,0.173, & 0.18,0.545,0.341, & 0., 0., 1., & 0.192, 0.31, 0.31, & 0.58, 0., 0.827, & 0.0, 0.825, 0.825, & 1., 0.31, 0., & 0.373, 0.62, 0.627, & 0.933, 0.796, 0.678,& 0.0, 1.0, 0.5, & 0.0, 0.5, 1.0, & 0.5, 0.0, 0.0, & 1.0, 0.0, 0.5, & 0.333, 0.333, 0.333,& 0.667, 0.667, 0.667/),shape(colourpalette)) return end subroutine defaults_set_page !--------------------------------------------- ! changed default values for evsplash !--------------------------------------------- subroutine defaults_set_page_ev nstepsperpage = 1000 iColourEachStep = .true. ! change colours if nstepsperpage > 1 iChangeStyles = .true. ! change marker/ line styles if nstepsperpage > 1 iPlotLegend = .true. ! whether or not to plot legend iPlotStepLegend = .true. ! timestep legend hposlegend = 0.1 ! horizontal legend position as fraction of viewport vposlegend = 2.0 ! vertical legend position in character heights fjustlegend = 0.0 ! justification factor for legend end subroutine defaults_set_page_ev !--------------------------------------------- ! changed default values for 360 video !--------------------------------------------- subroutine defaults_set_page_360 iPageColours = 2 iaxis = -2 ipapersize = 18 ipapersizeunits = 0 papersizex = 1080. !4320. aspectratio = 0.5 iPageColours = 2 adjustlimitstodevice = .true. end subroutine defaults_set_page_360 !---------------------------------------------------------------------- ! submenu with options relating to page setup !---------------------------------------------------------------------- subroutine submenu_page(ichoose) use params, only:maxplot use prompting, only:prompt,print_logical use pagecolours, only:pagecolourscheme,colour_fore,colour_back,maxpagecolours,& write_coloursfile,read_coloursfile use plotlib, only:plotlib_supports_alpha,plotlib_maxlinecolour,plotlib_maxlinestyle,& plotlib_is_pgplot,plotlib_maxpalette use filenames, only:coloursfile integer, intent(in) :: ichoose integer :: iaction,i,iunitsprev,ierr,nc real :: papersizey,mnraslength character(len=15) :: paperfmtstr character(len=3) :: string iaction = ichoose papersizey = papersizex*aspectratio if (ipapersizeunits > 0) then write(paperfmtstr,"(f5.2,1x,f5.2)") papersizex,papersizey else write(paperfmtstr,"(i5,' x ',i4)") nint(papersizex),nint(papersizey) endif print "(a)",'---------------- page setup options -------------------' if (iaction <= 0 .or. iaction > 8) then print "( "// & "' 0) exit ',/, "// & "' 1) plot n steps on top of each other (n =',i4,')',/, "// & "' 2) axes options (',i2,')',/, "// & "' 3) change paper size ("//trim(paperfmtstr)//" )',/, "// & "' 4) subdivide page into panels (',i2,1x,'x',1x,i2,', tiling is ',a,')',/, "// & "' 5) spatial dimensions have same scale ( ',a,' )',/,"// & "' 6) set character height (',f4.1,')',/,"// & "' 7) adjust line width (',i2, ')',/,"// & "' 8) set page and line colours ( ',a,' )')", & nstepsperpage,iaxis,nacross,ndown,print_logical(tile), & trim(print_logical(usesquarexy)),charheight,linewidth,& trim(pagecolourscheme(iPageColours,short=.true.)) call prompt('enter option ',iaction,0,8) endif select case(iaction) !------------------------------------------------------------------------ case(1) call prompt('Enter number of timesteps per panel ',nstepsperpage,1) print*,'Plotting up to ',nstepsperpage,' timesteps per panel' if (nstepsperpage > 1) then if (iadapt .or. iadaptcoords) then print "(a)",'(note that adaptive plot limits are now off)' iadapt = .false. iadaptcoords = .false. endif if (nstepsperpage > 14) then print "(a)",'(warning: steps per panel > number of colours, ie. colours will repeat)' endif call prompt('Use different colours for each step?',iColourEachStep) if (iColourEachStep) then call prompt('How often to change colour? (1=every step, 2=every 2nd step etc.)',modcolour,1) call prompt('Enter max number of colours to use before repeating (16=plot lib max)',& maxcolour,1,plotlib_maxlinecolour) endif !! if (.not.iColourEachStep) icolourthisstep = 1 call prompt('Use different markers/line style for each step? ',iChangeStyles) if (iChangeStyles) then call prompt('How often to change line style (1=every step, 2=every 2nd step etc.)',modlinestyle,1) write(string,"(i3)",iostat=ierr) plotlib_maxlinestyle call prompt('Enter max number of line styles to cycle through before repeating ('// & trim(adjustl(string))//'=plot lib max)',maxlinestyle,1,plotlib_maxlinestyle) endif if (iColourEachStep .or. iChangeStyles) then print "(/,a,/,a)",' (to change the legend text, create a file called', & ' ''legend'' in the working directory, with one label per line)' call prompt('Plot legend of marker styles/colours?',iPlotStepLegend) endif endif return !------------------------------------------------------------------------ case(2) print*,'-4 : draw box and major tick marks only;' print*,'-3 : draw box and tick marks (major and minor) only;' print*,'-2 : draw no box, axes or labels;' print*,'-1 : draw box only;' print*,' 0 : draw box and label it with coordinates;' print*,' 1 : same as AXIS=0, but also draw the coordinate axes (X=0, Y=0);' print*,' 2 : same as AXIS=1, but also draw grid lines at major increments of the coordinates;' print*,' 3 : draw box, ticks and numbers but no axes labels;' print*,' 4 : same as AXIS=0, but with a second y-axis scaled and labelled differently' print*,' 5 : draw box, major ticks and numbers but no axes labels;' print*,'10 : draw box and label X-axis logarithmically;' print*,'20 : draw box and label Y-axis logarithmically;' print*,'30 : draw box and label both axes logarithmically.' call prompt('enter axis option ',iaxis,-4,30) if (iaxis==4) then call prompt('enter scale factor for alternative y axis',yscalealt,0.) call prompt('enter label for alternative y axis',labelyalt) endif print *,' axis = ',iaxis return !------------------------------------------------------------------------ case(3) print*,' 0) plotting library default ' print*,' 1) small square : 2.92 x 2.92 inches' print*,' 2) medium square : 5.85 x 5.85 inches' print*,' 3) large square : 8.00 x 8.00 inches' print*,' 4) single small graph : 5.85 x 4.13 inches' print*,' 5) duo small graph : 11.70 x 4.13 inches' print*,' 6) duo graph : 11.70 x 6.00 inches' if (plotlib_is_pgplot) then print*,' 7) Custom size ' call prompt(' Enter option for paper size ',ipapersize,0,7) else print*,' 7) 800 x 600 pixels' print*,' 8) 640 x 360 pixels (360p)' print*,' 9) 1280 x 720 pixels (720p)' print*,'10) 1920 x 1080 pixels (1080p/Full HD)' print*,'11) 1024 x 768 pixels' print*,'12) 1440 x 900 pixels' print*,'13) 2560 x 1440 pixels' print*,'14) 2560 x 1600 pixels' print*,'15) 3840 x 2160 pixels (4KTV/Ultra HD)' print*,'16) 4096 x 2160 pixels (Cinema 4K)' print*,'17) 5120 x 2880 pixels (5K)' print*,'18) 4320 x 2160 pixels (2160s)' print*,'19) 8640 x 4320 pixels (4320s)' print*,'20) 27320 x 3072 pixels (CAVE-2)' print*,'21) 1/3 of A4 journal page 79mm x 180 mm' print*,'22) 1/2 of A4 journal page 118mm x 180 mm' print*,'23) full A4 journal page 236mm x 180 mm' print*,'24) Custom size ' call prompt(' Enter option for paper size ',ipapersize,0,24) endif select case(ipapersize) case(1) ipapersizeunits = 1 papersizex = 0.25*11.7 aspectratio = 1.0 case(2) ipapersizeunits = 1 papersizex = 0.5*11.7 aspectratio = 1.0 case(3) ipapersizeunits = 1 papersizex = 8.0 aspectratio = 1.0 case(4) ipapersizeunits = 1 papersizex = 0.5*11.7 aspectratio = 1./sqrt(2.) case(5) ipapersizeunits = 1 papersizex = 11.7 aspectratio = 0.5/sqrt(2.) case(6) ipapersizeunits = 1 papersizex = 11.7 papersizey = 6.0 aspectratio = papersizey/papersizex case(7) if (plotlib_is_pgplot) then ipapersizeunits = 1 call prompt(' x size (inches) ',papersizex,0.0) call prompt(' y size (inches) or aspect ratio (-ve)',papersizey) if (papersizey < 0.0) then aspectratio = abs(papersizey) else aspectratio = papersizey/papersizex endif else ipapersizeunits = 0 papersizex = 800. papersizey = 600. aspectratio = papersizey/papersizex endif case(8:23) if (plotlib_is_pgplot) then ipapersizeunits = 1 papersizex = 0. ! use PGPLOT default aspectratio = 0. else ipapersizeunits = 0 mnraslength = 56.*0.42175 ! 56pc = 672pts converted to cm select case(ipapersize) case(8) papersizex = 640. papersizey = 360. case(9) papersizex = 1280. papersizey = 720. case(10) papersizex = 1920. papersizey = 1080. case(11) papersizex = 1024. papersizey = 768. case(12) papersizex = 1440. papersizey = 900. case(13) papersizex = 2560. papersizey = 1440. case(14) papersizex = 2560. papersizey = 1600. case(15) papersizex = 3840. papersizey = 2160. case(16) papersizex = 4096. papersizey = 2160. case(17) papersizex = 5120. papersizey = 2880. case(18) papersizex = 4320. papersizey = 2160. case(19) papersizex = 8640. papersizey = 4320. case(20) papersizex = 27320. papersizey = 3072. case(21) ! 1/3 of MNRAS page ipapersizeunits = 2 papersizex = 18. papersizey = mnraslength/3. case(22) ! 1/2 of MNRAS page ipapersizeunits = 2 papersizex = 18. papersizey = 0.5*mnraslength case(23) ! full MNRAS page, allowing 2cm for caption ipapersizeunits = 2 papersizex = 18. papersizey = mnraslength - 2. end select aspectratio = papersizey/papersizex endif case(24) if (plotlib_is_pgplot) then ipapersizeunits = 1 papersizex = 0. ! use PGPLOT default aspectratio = 0. else iunitsprev = ipapersizeunits print*,' 0) pixels ' print*,' 1) inches ' print*,' 2) cm ' call prompt(' choose units for paper size',ipapersizeunits,0,2) if (ipapersizeunits /= iunitsprev) then select case(ipapersizeunits) case(2) papersizex = 29.7 papersizey = 21.0 case(1) papersizex = 11.0 papersizey = 8.5 case(0) papersizex = 800. papersizey = -0.75 case default papersizex = 0. papersizey = 0. end select endif call prompt(' x size in above units ',papersizex,1.) call prompt(' y size or aspect ratio (-ve)',papersizey) if (papersizey < 0.0) then aspectratio = abs(papersizey) else aspectratio = papersizey/papersizex endif endif case default ipapersizeunits = 1 papersizex = 0.0 ! no call to PGPAP if they are zero aspectratio = 0.0 end select call prompt('Adjust plot limits to match device aspect ratio?',adjustlimitstodevice) return !------------------------------------------------------------------------ case(4) call prompt('Enter number of plots across (columns):',nacross,1,maxplot) call prompt('Enter number of plots down (rows):',ndown,1,maxplot/nacross) if (nacross*ndown > 1) then call prompt('Tile plots on the page where possible?',tile) call prompt('Plot panels across-then-down? (no=down-then-across)',usecolumnorder) endif return !------------------------------------------------------------------------ case(5) usesquarexy = .not.usesquarexy print "(a)",' Same scale for spatial dimensions is '//print_logical(usesquarexy) !------------------------------------------------------------------------ case(6) call prompt('Enter character height ',charheight,0.1,10.) return !------------------------------------------------------------------------ case(7) print "(3(/,a))",' Setting line width to 0 means automatic line width choice:', & ' This gives width = 2 for vector devices (/ps,/cps etc)', & ' and width = 1 elsewhere (e.g. for pixel devices)' print* call prompt('Enter line width (0=auto)',linewidth,0) return !------------------------------------------------------------------------ case(8) print "(3(/,i1,')',1x,a))",(i,pagecolourscheme(i),i=0,maxpagecolours) call prompt(' Choose page colour scheme ',iPageColours,0,maxpagecolours) write(*,"(3(/,a))",advance='no') & ' Overlaid (that is, drawn inside the plot borders) axis ',& ' ticks, legend text and titles are by default plotted ', & ' in the foreground colour' if (iPageColours > 0) then print "(a,/)",' [i.e. '//trim(colour_fore(iPageColours))//'].' call prompt('Do you want to plot these in background colour [i.e. '& //trim(colour_back(iPageColours))//'] instead?',& iUseBackgroundColourForAxes) else print "(a,/)",'.' call prompt('Use background colour for these? ',iUseBackgroundColourForAxes) endif if (iUseBackgroundColourForAxes .and. plotlib_supports_alpha) then call prompt('Enter opacity for overlaid text and annotation ',alphalegend,0.0,1.0) endif print "(9(/,a))",& '-1: custom', & ' 0: giza default line palette ', & ' 1: default PGPLOT line palette', & ' 2: modified Tricco palette', & ' 3: cheer up emo kid / grandma''s pillow', & ' 4: outback desert moonscape',& ' 5: colourblind safe line palette', & ' 6: optimum line palette', & ' 7: graph-a-licious' call prompt('Enter line palette',linepalette,-1,plotlib_maxpalette) if (linepalette < 0) then call read_coloursfile(coloursfile,maxc,colourpalette,nc,ierr) if (ierr /= 0 .or. nc <= 0) then print*,' writing colours to file '//trim(coloursfile) call write_coloursfile(trim(coloursfile),maxc,colourpalette) else print*,' colours written to file '//trim(coloursfile) endif print*,' edit this file to change the line palette' print*,' ** press any key to continue **' read* endif return end select return end subroutine submenu_page !---------------------------------------------------------------------- ! submenu with options relating to legend and title settings !---------------------------------------------------------------------- subroutine submenu_legend(ichoose) use filenames, only:fileprefix use prompting, only:prompt,print_logical use shapes, only:nshapes,labelshapetype,shape,submenu_shapes use legends, only:prompt_panelselect use labels, only:headertags,count_non_blank integer, intent(in) :: ichoose integer :: iaction,i,ierr,i1,i2,nhdr character(len=50) :: string iaction = ichoose print "(a)",'---------------- legend and title options -------------------' if (iPlotStepLegend) then print "(/,a,/,a,/)",' Hint: to change the step legend text, create a file called', & ' '''//trim(fileprefix)//'.legend'' in the working directory, with one label per line' endif if (iPlotTitles) then if (.not.iPlotStepLegend) print "(a)" print "(a,/,a,/)",' To set the plot titles, create a file called', & ' '''//trim(fileprefix)//'.titles'' in the working directory, with one title per line' endif if (iaction <= 0 .or. iaction > 6) then !--format shape settings string if (nshapes > 0) then i2 = 2 string = ': ' else i2 = 0 string = ' ' endif do i=1,nshapes i1 = i2 + 1 i2 = min(i1 + len_trim(labelshapetype(shape(i)%itype)),len(string)) write(string(i1:i2),"(a)",iostat=ierr) trim(labelshapetype(shape(i)%itype)(1:i2-i1)) if (i < nshapes .and. i2 < len(string)) then write(string(i2:i2+1),"(', ')",iostat=ierr) i2 = i2 + 1 endif enddo !--print menu print 20,print_logical(iPlotLegend),hposlegend,vposlegend,fjustlegend,trim(legendtext), & print_logical(iPlotTitles),hpostitle,vpostitle,fjusttitle, & print_logical(iPlotStepLegend), print_logical(iPlotScale), & nshapes,trim(string) 20 format(' 0) exit ',/, & ' 1) time legend settings (',1x,a,1x,f5.2,1x,f5.2,1x,f5.2,1x,'"',a,'")',/, & ' 2) title settings (',1x,a,1x,f5.2,1x,f5.2,1x,f5.2,')',/, & ' 3) legend for multiple steps per page on/off (',1x,a,1x,')',/, & ' 4) plot scale |---| on coordinate plots (',1x,a,1x,')',/, & ' 5) annotate plot (e.g. arrow,square,circle,text) (',1x,i2,a,')') iaction = 0 call prompt(' Enter option ',iaction,0,6) endif select case(iaction) case(1) call prompt('Plot time legend? ',iPlotLegend) print "(a)",'Time legend is '//print_logical(iPlotLegend) if (iPlotLegend) then print "(7(/,a),/)", & ' Example format strings: ', & ' t = : this is the default format "t = 0.1 years"', & ' t = %t.5 : with time to 5 significant figures', & ' Time: %t dog-%ut : gives "Time: 0.1 dog-years"', & ' %(t + 2013) : prints time offset by 2013', & ' %(t + 2013).5 : as above, to 5 sig. figs.', & ' %(t*100) : multiplied by 100' nhdr = count_non_blank(headertags) print "(a)",' You can print any header variables using %(var):' print "(43(2x,6(a),/))",headertags(1:nhdr) print "(a)" call prompt('Enter legend text ',legendtext) print "(a)",'------ set legend position (can also be done interactively) --------' call prompt('Enter horizontal position as fraction of viewport', & hposlegend,0.0,1.0) call prompt('Enter vertical position in character heights from top',vposlegend) call prompt('Enter justification factor (0.0=left 1.0=right)',fjustlegend,0.0,1.0) call prompt_panelselect('legend',iPlotLegendOnlyOnPanel) endif case(2) print "(/,a,/,a,/)",' To set the plot titles, create a file called', & ' '''//trim(fileprefix)//'.titles'' in the working directory, with one title per line' call prompt('Use plot titles? ',iPlotTitles) print "(a)",'Titles are '//print_logical(iPlotTitles) if (iPlotTitles) then print "(a)",'------ set title position (can also be done interactively) --------' call prompt('Enter horizontal position as fraction of viewport', & hpostitle,0.0,1.0) call prompt('Enter vertical position in character heights above top',vpostitle) call prompt('Enter justification factor (0.0=left 1.0=right)',fjusttitle,0.0,1.0) endif case(3) iPlotStepLegend = .not.iPlotStepLegend print "(a)",'Step legend is '//print_logical(iPlotStepLegend) if (iPlotStepLegend) then print "(/,a,/,a,/)",' Hint: to change the step legend text, create a file called', & ' '''//trim(fileprefix)//'.legend'' in the working directory, with one label per line' print*,' press return to continue ' read* endif case(4) call prompt('Plot scale on co-ordinate plots? ',iPlotScale) if (iPlotScale) then call prompt('Enter length of scale in the current x,y,z units ',dxscale) call prompt('Enter text to appear below scale (e.g. ''10 AU'')',scaletext) call prompt('Enter horizontal position as fraction of viewport', & hposscale,0.0,1.0) call prompt('Enter vertical position in character heights above bottom',vposscale) if (nacross*ndown > 1) then call prompt('Enter which panel on the plotting page the scale should appear on '// & '(0=all co-ordinate plots)',iscalepanel,0,nacross*ndown) endif endif case(5) call submenu_shapes() end select end subroutine submenu_legend end module settings_page danieljprice-splash-4d1f09c/src/options_particleplots.f90000066400000000000000000000426411477365367100236500ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing settings and options relating to particle plots ! includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module settings_part use params use settings_data, only:icoordsnew,iexact implicit none integer, dimension(maxparttypes) :: imarktype,idefaultcolourtype,itypeorder integer, dimension(100) :: icircpart integer, dimension(maxplot) :: ilocerrbars logical, dimension(maxparttypes) :: iplotpartoftype,PlotOnRenderings,UseTypeInContours integer :: ncircpart,ismooth_particle_plots integer :: linestyle, linecolour,linestylethisstep,linecolourthisstep,ErrorBarType logical :: iplotline,ilabelpart,ifastparticleplot,iploterrbars real :: hfacmarkers,rref,betaflare,mstari namelist /plotopts/ iplotline,linestyle,linecolour, & imarktype,iplotpartoftype,PlotOnRenderings, & iexact,icoordsnew,ifastparticleplot,idefaultcolourtype,& itypeorder,UseTypeInContours,iploterrbars,ilocerrbars,hfacmarkers,& ErrorBarType,ismooth_particle_plots,rref,betaflare,mstari contains !--------------------------------------------- ! set default values for these options !--------------------------------------------- subroutine defaults_set_part use settings_data, only:icoords integer :: i ncircpart = 0 iplotline = .false. ! plot line joining the particles linestyle = 1 ! line style for above linecolour = 1 linestylethisstep = 1 linecolourthisstep = 1 iexact = 0 ! exact solution to plot ilabelpart = .false. ! plot particle numbers icoordsnew = icoords icircpart(:) = 0 iplotpartoftype(1) = .true. ! whether or not to plot particles of certain types iplotpartoftype(2:maxparttypes) = .false. PlotOnRenderings = .false. imarktype = 1 ! marker type for all particles imarktype(2) = 4 ! marker type for ghost/dark matter particles imarktype(3) = 17 ! marker type for sink particles imarktype(5) = 3 ! marker type for star particles (gadget) idefaultcolourtype = -1 ! default colour for each particle type ifastparticleplot = .true. ! allow crowded-field elimination on particle plots do i=1,maxparttypes itypeorder(i) = i enddo UseTypeInContours(:) = iplotpartoftype(:) iploterrbars = .false. ! plot error bars for a particular column ilocerrbars(:) = 0 ! location of data for error bars in dat array hfacmarkers = 1.0 ErrorBarType = 0 ismooth_particle_plots = 0 rref = 1. betaflare = 1.25 mstari = 1. ! used in Toomre Q calculation return end subroutine defaults_set_part !--------------------------------------------- ! changed default values for these options !--------------------------------------------- subroutine defaults_set_part_ev iplotline = .true. ! plot line joining the particles iplotpartoftype(1:maxparttypes) = .false. ! whether or not to plot particles of certain types UseTypeInContours(:) = iplotpartoftype(:) return end subroutine defaults_set_part_ev !--------------------------------------------- ! changed default values for these options !--------------------------------------------- subroutine initialise_coord_transforms use geometry, only:set_flaring_index call set_flaring_index(rref,betaflare) end subroutine initialise_coord_transforms !---------------------------------------------------------------------- ! submenu with options relating to particle plots !---------------------------------------------------------------------- subroutine submenu_particleplots(ichoose) use exact, only:options_exact,submenu_exact use labels, only:labeltype,ih,label,get_sink_type use limits, only:lim use settings_data, only:icoords,ntypes,ndim,UseTypeInRenderings, & ndataplots,idustfrac_plot,ideltav_plot use settings_render, only:iplotcont_nomulti use particle_data, only:npartoftype,iamtype use prompting, only:prompt,print_logical,print_logicals use geometry, only:maxcoordsys,labelcoordsys,coord_transform_limits,& igeom_flaredcyl,igeom_logflared,set_flaring_index,& igeom_planetwake,set_planet_wake use multiplot, only:itrans use plotlib, only:plotlib_maxlinestyle,plotlib_maxlinecolour use calcquantities, only:calc_quantities use settings_data, only:DataIsBuffered,numplot use filenames, only:nsteps,nstepsinfile,ifileopen use geomutils, only:set_coordlabels use calcquantities, only:setup_calculated_quantities use asciiutils, only:enumerate use exact, only:HonR,rplanet,q_index,phase integer, intent(in) :: ichoose integer :: i,iaction,n,itype,icoordsprev,ierr,icol,isinktype,nt character(len=2) :: charntypes character(len=20) :: substring2,substring3 character(len=1000) :: fmtstring character(len=120) :: contline logical :: ians integer :: itypes(maxparttypes) iaction = ichoose !--we require some tricks with the format string to print only the actual number of ! particle types rather than the whole array ! isinktype = get_sink_type(ntypes) nt = 0 do i=1,ntypes if (any(npartoftype(i,:) > 0) .or. i==isinktype) then nt = nt + 1 itypes(nt) = i endif enddo if (nt <= 0) then substring2 = "not applicable" elseif (nt==1) then substring2 = "i2" else write(charntypes,"(i2)") nt-1 substring2 = charntypes//"(i2,',',1x),i2" endif substring3 = enumerate(ismooth_particle_plots+1,(/'OFF ','FIXED','ADAPT'/),default=1) if (iplotcont_nomulti) then contline = "' use in contour plots: ( ',a,' )',/," else contline = ' ' endif fmtstring="("// & "' 0) exit ',/,"// & "' 1) turn on/off particles by type ( ',a,' )',/,"//trim(contline)// & "' 2) change graph markers for each type ( ',"//trim(substring2)//",' )',/,"// & "' 3) set colour for each particle type ( ',"//trim(substring2)//",' )',/,"// & "' 4) smooth particle plots ( ',a,' )',/,"// & "' 5) plot line joining particles ( ',a,' ) ',/,"// & "' 6) plot error bars/smoothing circles ( ',a,' ) ',/,"// & "' 7) change coordinate systems ( ',i2,' ) ',/,"// & "' 8) plot exact solution ( ',i2,' ) ',/,"// & "' 9) exact solution plot options ')" print "(a)",'------------- particle plot options -------------------' if (iaction <= 0 .or. iaction > 9) then if (iplotcont_nomulti) then print fmtstring,trim(print_logicals(iplotpartoftype(itypes(1:nt)))), & trim(print_logicals(UseTypeInContours(itypes(1:nt)),mask=UseTypeInRenderings(itypes(1:nt)))), & imarktype(itypes(1:nt)),idefaultcolourtype(itypes(1:nt)),trim(substring3), & print_logical(iplotline),print_logical(ncircpart > 0 .or.iploterrbars),icoordsnew,iexact else print fmtstring,trim(print_logicals(iplotpartoftype(itypes(1:nt)))), & imarktype(itypes(1:nt)),idefaultcolourtype(itypes(1:nt)),trim(substring3), & print_logical(iplotline),print_logical(ncircpart > 0 .or.iploterrbars),icoordsnew,iexact endif call prompt('enter option',iaction,0,9) endif ! select case(iaction) !------------------------------------------------------------------------ case(1) ! plot particles by type? over_types: do itype=1,ntypes if (all(npartoftype(itype,:) == 0) .and. itype/=isinktype) cycle over_types if (UseTypeinRenderings(itype) .and. ndim > 1) then call prompt('Plot '//trim(labeltype(itype))//' particles / use in renderings?',iplotpartoftype(itype)) if (iplotcont_nomulti) then call prompt('Use '//trim(labeltype(itype))//' particles in contour plots?',UseTypeInContours(itype)) endif else call prompt('Plot '//trim(labeltype(itype))//' particles?',iplotpartoftype(itype)) UseTypeInContours(itype) = .false. endif if (iplotpartoftype(itype) .and. itype > 1) then if (.not.UseTypeInRenderings(itype)) then call prompt('>> Plot '//trim(labeltype(itype))//' particles on top of rendered plots?',PlotOnRenderings(itype)) else PlotonRenderings(itype) = .false. endif elseif (.not.iplotpartoftype(itype)) then PlotonRenderings(itype) = .false. endif enddo over_types return !------------------------------------------------------------------------ case(2) print "(/,' Marker options (for all from -8->31, see plot library userguide):',11(/,i2,') ',a))", & 0,'square',1,'.',2,'+',3,'*',4,'o',5,'x',17,'bold circle',-8,'large bold circle', & 32,'solid circle, size proportional to h', & 33,'open circle, size proportional to h', & 34,'outlined solid circle, size prop. to h' !print*,'(0 Square) (1 .) (2 +) (3 *) (4 o) (5 x) (17 bold circle) (-8 bigger bold circle)' over_types2: do itype=1,ntypes if (all(npartoftype(itype,:) == 0) .and. itype/=isinktype) cycle over_types2 call prompt(' Enter marker to use for '//trim(labeltype(itype)) & //' particles:',imarktype(itype),-8,35) enddo over_types2 if (any(imarktype(1:ntypes) >= 32)) then print* call prompt(' Enter proportionality factor for scalable markers (radius = fac*h)',hfacmarkers) endif return !------------------------------------------------------------------------ case(3) print "(2(a,/),/,4(a,/))", & ' Warning: setting a colour for a particle type overrides', & ' (at each new timestep) colours set interactively ', & ' -1 = retain interactively set colours between timesteps', & ' 0 = background ',& ' 1 = foreground ',& ' 2->10 = various colours (see default colour indices for plot library)' over_types3: do itype=1,ntypes if (all(npartoftype(itype,:) == 0) .and. itype/=isinktype) cycle over_types3 call prompt(' Enter default colour for '//trim(labeltype(itype)) & //' particles:',idefaultcolourtype(itype),-1,14) enddo over_types3 return !------------------------------------------------------------------------ case(4) !print "(3(/,a))",' 0) no smoothing, raw particle plots',& ! ' 1) render particle plots with fixed h', & ! ' 2) render particle plots with adaptive h (slower)' call prompt('smooth particle plots? (0=none 1=fixed 2=adaptive)',ismooth_particle_plots,0,2) if (ismooth_particle_plots==0) then if (size(iamtype(:,1)) > 1) then print "(3(/,a),/)", & ' WARNING: changing type plotting order currently has no effect ', & ' when particle types are mixed in the dump file', & ' (for sphNG read disable this using -lowmem on the command line)' endif if (ntypes > 1) then ians = .false. call prompt('set plot order of particle types manually?',ians) if (ians) then print "(9(i1,'=',a,', '))",(i,trim(labeltype(i)),i=1,ntypes) call prompt('enter first particle type to plot',itypeorder(1),1,ntypes) do i=2,ntypes ierr = 1 do while (ierr /= 0) itype = itypeorder(i) call prompt('enter next particle type to plot',itype,1,ntypes) if (any(itypeorder(1:i-1)==itype)) then print "(a)",' error: cannot be same as previous type' ierr = 1 else itypeorder(i) = itype ierr = 0 endif enddo enddo endif endif print "(/,a,/,a,/)",' Fast particle plotting excludes particles in crowded regions', & ' Turn this option off to always plot every particle' call prompt('Allow fast particle plotting?',ifastparticleplot) endif return !------------------------------------------------------------------------ case(5) call prompt('plot line joining particles?',iplotline) if (iplotline) then call prompt('Enter line style to use ',linestyle,1,plotlib_maxlinestyle) call prompt('Enter colour for line ',linecolour,0,plotlib_maxlinecolour) endif return !------------------------------------------------------------------------ case(6) if (ndim <= 1 .or. ih <= 0) then icol = 0 do icol=1,ndataplots if (ilocerrbars(icol) > 0) print "(a,i2,a,i2,a)", & 'column ',ilocerrbars(icol),' contains errors for column ',icol,':'//label(icol) enddo if (any(ilocerrbars(1:ndataplots) > 0)) then call prompt('turn on plotting of error bars? ',iploterrbars) if (.not.iploterrbars) return else iploterrbars = .false. endif icol = 1 do while(icol /= 0) icol = 0 call prompt('Enter column to set location of error bars for (0=none)',icol,0,ndataplots) if (icol > 0) then call prompt('Enter location of error data for this column in the data',ilocerrbars(icol),0) if (ilocerrbars(icol) <= 0 .or. ilocerrbars(icol) > ndataplots) then print "(a,i2)",' WARNING: currently no data in column ',ilocerrbars(icol) else iploterrbars = .true. endif if (all(ilocerrbars(1:ndataplots) <= 0)) iploterrbars = .false. else if (all(ilocerrbars(1:ndataplots) <= 0)) iploterrbars = .false. endif enddo print "(2(/,a))",' 0) Default style |--|',& ' 1) Semi-transparent shaded region' call prompt('Select error bar style',ErrorBarType,0,1) else print*,'Circles of interaction can also be set interactively' call prompt('Enter number of circles to draw',ncircpart,0,size(icircpart)) if (ncircpart > 0) then do n=1,ncircpart if (icircpart(n)==0) then if (n > 1) then icircpart(n) = icircpart(n-1)+1 else icircpart(n) = 1 endif endif call prompt('Enter particle number to plot circle around', & icircpart(n),1,sum(npartoftype(:,1))) enddo endif endif return !------------------------------------------------------------------------ case(7) print "(' 0) reset (=',i2,')')",icoords do i=1,maxcoordsys print "(1x,i1,')',1x,a)",i,labelcoordsys(i) enddo icoordsprev = icoordsnew call prompt(' Enter coordinate system to plot in:', & icoordsnew,0,maxcoordsys) if (icoordsnew==0) icoordsnew = icoords select case(icoordsnew) !case(igeom_rotated) ! call prompt('enter rotation angle a (degrees)',rot_angle_a) ! call prompt('enter rotation angle b (degrees)',rot_angle_b) !call set_rotation_angles(rot_angle_a*pi/180.,rot_angle_b*pi/180.) case(igeom_flaredcyl,igeom_logflared) call prompt('enter reference radius (Rref) in z''=z(R/Rref)**(-beta)',rref) print "(2(/,a),/)",' Use beta = 1.5 - q to give correct flaring index in a disc', & ' where q is sound speed index i.e. cs = cs_0(R/R_0)^-q ' call prompt('enter flaring index beta',betaflare) call set_flaring_index(rref,betaflare) case(igeom_planetwake) call prompt('enter radial location of planet (r0)',rplanet) call prompt('enter disc aspect ratio H/R at rp',HonR) call prompt('enter sound speed index q (cs = R^-q)',q_index) call set_planet_wake(rplanet,phase,1.0,q_index,HonR) end select if (icoordsnew /= icoordsprev) then itrans(1:ndim) = 0 call coord_transform_limits(lim(1:ndim,1),lim(1:ndim,2), & icoordsprev,icoordsnew,ndim) call set_coordlabels(numplot) if (DataIsBuffered) then call calc_quantities(1,nsteps) else call calc_quantities(1,nstepsinfile(ifileopen)) endif endif return !------------------------------------------------------------------------ case(8) call submenu_exact(iexact) return !------------------------------------------------------------------------ case(9) call options_exact(iexact) return !------------------------------------------------------------------------ case default return end select return end subroutine submenu_particleplots end module settings_part danieljprice-splash-4d1f09c/src/options_powerspec.f90000066400000000000000000000077521477365367100227760ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2010 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing settings and options relating to power spectrum ! and Probability Distribution Function plots ! includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module settings_powerspec implicit none integer :: ipowerspecy, ipowerspecx, nfreqspec integer :: nwavelengths,npdfbins logical :: idisordered real :: freqmax,freqmin namelist /powerspecopts/ ipowerspecy,idisordered,nwavelengths,nfreqspec,npdfbins,freqmin,freqmax contains !--------------------------------------------- ! set default values for these options !--------------------------------------------- subroutine defaults_set_powerspec use settings_data, only:ndim idisordered = .true. ipowerspecy = max(ndim+1,2) ipowerspecx = 0 ! reset later nwavelengths = 128 freqmin = 1.0 freqmax = nwavelengths*freqmin nfreqspec = 1 npdfbins = 0 return end subroutine defaults_set_powerspec !---------------------------------------------------------------------- ! sets options and parameters for power spectrum calculation/plotting !---------------------------------------------------------------------- subroutine options_powerspec use settings_data, only:ndim,ndataplots,numplot use limits, only:lim use labels, only:ipowerspec use prompting, only:prompt real :: boxsize if (ipowerspecy < ndim+1) ipowerspecy = ndim+1 if (ipowerspecy > ndataplots) ipowerspecy = ndataplots call prompt('enter data to take power spectrum of',ipowerspecy,ndim+1,ndataplots) if (ipowerspecx /= 1) then if (ipowerspecx < 1) ipowerspecx = 1 if (ipowerspecx > ndataplots) ipowerspecx = ndataplots call prompt('enter column to use as "time" or "space"',ipowerspecx,1,ndataplots) endif ! !--if box size has not been set then use x limits ! if (abs(freqmin-1.0) < tiny(1.)) then boxsize = abs(lim(1,2) - lim(1,1)) if (boxsize > tiny(boxsize)) freqmin = 1./boxsize endif call prompt('enter min frequency (default=1/box size)',freqmin,0.0) call prompt('enter max frequency ',freqmax,min=freqmin) if (ipowerspec <= ndataplots .or. ipowerspec > numplot) then !--this should never happen print*,'*** ERROR: something wrong in powerspectrum limit setting' else print*,' wavelength range ',1./freqmax,'->',1./freqmin lim(ipowerspec,1) = freqmin lim(ipowerspec,2) = freqmax print*,' frequency range ',lim(ipowerspec,1),'->',lim(ipowerspec,2) if (nfreqspec <= 1) nfreqspec = 2*nwavelengths call prompt('how many frequency points between these limits? ',nfreqspec,nwavelengths) endif !! call prompt('use Lomb periodogram? (no=interpolate and fourier) ',idisordered) return end subroutine options_powerspec !----------------------------------------------------------------- ! ! settings for PDF calculation ! !----------------------------------------------------------------- subroutine options_pdf use prompting, only:prompt call prompt(' Enter number of bins between min and max of plot (0=auto)',npdfbins,0) end subroutine options_pdf end module settings_powerspec danieljprice-splash-4d1f09c/src/options_render.f90000066400000000000000000000354231477365367100222420ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2022 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing settings and options relating to renderings ! includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module settings_render use colourbar, only:ColourBarDisp,iplotcolourbarlabel,ColourBarPosx,ColourBarPosy,& ColourBarLen,ColourBarFmtStr,ColourBarWidth use labels, only:lenlabel use kernels, only:ikernel implicit none integer :: ncontours,npix,icolours,iColourBarStyle,iColourBarPos logical :: iplotcont_nomulti,ilabelcont logical :: icolour_particles,inormalise_interpolations logical :: ifastrender,idensityweightedinterpolation logical :: double_rendering,exact_rendering,iauto_densityweighted character(len=lenlabel+20) :: projlabelformat integer :: iapplyprojformat character(len=120) :: rgbfile namelist /renderopts/ npix,icolours,ncontours,iplotcont_nomulti, & icolour_particles,ColourBarDisp,inormalise_interpolations, & ifastrender,idensityweightedinterpolation,iColourBarStyle, & iplotcolourbarlabel,ilabelcont,projlabelformat,iapplyprojformat, & double_rendering,ikernel,ColourBarPosx,ColourBarPosy,ColourBarLen,& ColourBarFmtStr,ColourBarWidth,iColourBarPos,rgbfile,exact_rendering,& iauto_densityweighted contains !--------------------------------------------- ! set default values for these options !--------------------------------------------- subroutine defaults_set_render icolours = 2 ! colour scheme to use npix = 0 ! pixels in x direction for rendering iColourBarStyle = 1 ! whether or not to plot the colour bar and style iplotcont_nomulti = .false. ! plot contours icolour_particles = .false. ! colour particles instead of using pixels ncontours = 30 ! number of contours to plot ColourBarDisp = 5.0 ! displacement of colour bar label from edge inormalise_interpolations = .false. ! do not normalise interpolations ifastrender = .false. ! use accelerated rendering idensityweightedinterpolation = .false. iauto_densityweighted = .true. iplotcolourbarlabel = .true. ilabelcont = .false. ! print numeric labels on contours projlabelformat = ' ' iapplyprojformat = 0 double_rendering = .false. ikernel = 0 ! just take default kernel ColourBarPosx = 0.75 ! default values used for floating colour bars ColourBarPosy = 0.7 ColourBarLen = 0.25 ColourBarWidth = 2. ColourBarFmtStr = 'BCMSTV' iColourBarPos = 3 rgbfile = 'colours.ctb' exact_rendering = .false. return end subroutine defaults_set_render !--------------------------------------------- ! set default values for 360 video !--------------------------------------------- subroutine defaults_set_render_360 use colourbar, only:set_floating_bar_style iColourBarStyle = 7 call set_floating_bar_style(iColourBarStyle,4) end subroutine defaults_set_render_360 !----------------------------------------------------------------------------- ! options for rendered plots !----------------------------------------------------------------------------- subroutine submenu_render(ichoose) use colourbar, only:maxcolourbarstyles,labelcolourbarstyles,barisvertical,& isfloating,iscustombar,labelfloatingstyles,& set_floating_bar_style,maxfloatingstyles,ilogcolourbaraxis use colours, only:schemename,ncolourschemes,ncoltable,rgbtable,icustom use prompting, only:prompt,print_logical use params, only:maxplot use plotlib, only:plotlib_supports_alpha use filenames, only:fileprefix use kernels, only:select_kernel,kernelname,nkernels use projections3D, only:setup_integratedkernel use asciiutils, only:read_asciifile integer, intent(in) :: ichoose character(len=5) :: string,stringd character(len=20) :: kname integer :: ians,i,ierr,icolourprev ! !--rendering options ! ians = ichoose print "(a)",'----------------- rendering options -------------------' if (ians <= 0 .or. ians > 10) then if (npix > 0) then write(string,"(i5)") npix else string = 'AUTO' endif if (iauto_densityweighted) then stringd = 'AUTO' else stringd = print_logical(idensityweightedinterpolation) endif kname = '' if (ikernel >= 0 .and. ikernel <= nkernels) kname = trim(kernelname(ikernel)) print 10,trim(string),icolours,print_logical(iplotcont_nomulti), & iColourBarStyle,print_logical(icolour_particles), & print_logical(inormalise_interpolations),print_logical(ifastrender),& trim(stringd),trim(projlabelformat),& trim(kname) 10 format( & ' 0) exit ',/, & ' 1) set number of pixels ( ',a,' )',/, & ' 2) change colour scheme (',i2,' )',/, & ' 3) contour plot settings ( ',a,' )',/, & ' 4) change colour bar style ( ',i2,' )',/,& ' 5) use particle colours not pixels ( ',a,' )',/,& ' 6) normalise interpolations ( ',a,' )',/,& ' 7) use accelerated rendering ( ',a,' )',/,& ' 8) use density weighted interpolation ( ',a,' )',/, & ' 9) customize label on projection plots ( ',a,' )',/,& ' 10) set kernel ( ',a,' )') call prompt('enter option',ians,0,10) endif ! !--options ! select case(ians) !------------------------------------------------------------------------ case(1) print "(5(/,a),/)",' Note: setting number of pixels = 0 means that ', & ' the number of pixels will be automatically ', & ' chosen to match the device used for plotting.', & ' The number of pixels is then determined by ', & ' the page size (set in the p)age menu).' call prompt('enter number of pixels along x axis (0=auto)',npix,0,100000) !------------------------------------------------------------------------ case(2) ierr = 1 icolourprev = icolours write(*,"(i2,a,1x)") (i,': '//trim(schemename(i)),i=1,ncolourschemes) write(*,"(i3,a,1x)") icustom,': custom' print "(a)",'(-ve = inverse, 0 = contours only)' promptloop: do while (ierr /= 0) call prompt('enter colour scheme for rendering ',icolours,& -ncolourschemes+1,ncolourschemes+1,icustom,icustom) ! ! custom colour map from file !demonstration plot of all colour schemes ! ierr = 0 if (icolours==ncolourschemes+1) icolours=icustom if (icolours==-(ncolourschemes+1)) icolours=-icustom if (abs(icolours)==icustom) then call prompt('enter filename for rgb table',rgbfile,noblank=.true.) call read_asciifile(rgbfile,ncoltable,rgbtable,ierr) if (ierr /= 0 .or. ncoltable <= 0) then print "(a)",'ERROR: could not read colours from '//trim(rgbfile) else print "(a,i3,a)",'read ',ncoltable,' colours from '//trim(rgbfile) endif if (ierr /= 0) icolours = icolourprev endif enddo promptloop !------------------------------------------------------------------------ case(3) if (icolours==0) then print "(2(/,a),/)",' Warning: this option has no effect if colour scheme 0 is set', & ' (cannot plot contours on top of contours)' endif if (plotlib_supports_alpha) then call prompt(' allow contour/double render prompt?',iplotcont_nomulti) print "(3(/,a),/)",' Double rendering renders the first quantity in black and white', & ' and the second in colour with a transparent background ', & ' (such that data below the colour bar minimum appears transparent)' call prompt('use double rendering instead of contours?',double_rendering) else call prompt('allow contour plotting prompt?',iplotcont_nomulti) endif if (double_rendering) then print "(a)",' Second render prompt is '//trim(print_logical(iplotcont_nomulti)) else print "(a)",' Contour plotting prompt is '//trim(print_logical(iplotcont_nomulti)) endif if ((iplotcont_nomulti .or. icolours==0) .and. .not.double_rendering) then print "(5(/,a),/)",& ' To set contour levels and level labels manually, create a file called', & ' '''//trim(fileprefix)//'.contours'' in the working directory, with the following format:',& ' 1.0 label1 ', & ' 2.0 label2 ', & ' ...' call prompt('enter number of contours between min,max',ncontours,0,500) !call prompt('plot contour labels?',ilabelcont) endif !------------------------------------------------------------------------ case(4) do i=0,maxcolourbarstyles print "(i2,')',1x,a)",i,trim(labelcolourbarstyles(i)) enddo call prompt('enter colour bar style to use ',iColourBarStyle,0,maxcolourbarstyles) print "(a,/)",'colour bar style = '//trim(labelcolourbarstyles(iColourBarStyle)) if (iColourBarStyle > 0) then if (isfloating(iColourBarStyle)) then print "(5(a,/),a)",' Positioning of floating colour bar: ', & (trim(labelfloatingstyles(i)),i=1,maxfloatingstyles) call prompt('enter option',iColourBarPos,1,maxfloatingstyles) if (iColourBarPos >= 1 .and. iColourBarPos < maxfloatingstyles) ColourBarLen = 0.25 if (iColourBarPos == maxfloatingstyles) then call prompt('enter x position of colour bar as fraction of viewport',ColourBarPosx,-1.,1.5) call prompt('enter y position of colour bar as fraction of viewport',ColourBarPosy,-1.,1.5) call prompt('enter length of colour bar as fraction of viewport',ColourBarLen,0.,1.) else call set_floating_bar_style(iColourBarStyle,iColourBarPos) endif endif call prompt('plot colour bar label?',iplotcolourbarlabel) if (barisvertical(iColourBarStyle) .and. iplotcolourbarlabel) then call prompt('enter displacement of text from edge (character heights) ', & ColourBarDisp) endif call prompt('use log axis on colour bar?',ilogcolourbaraxis) if (iscustombar(iColourBarStyle)) then call prompt('enter width of colour bar in character heights',ColourBarWidth,0.,20.) if (barisvertical(iColourBarstyle)) then print "(a)",' A=axis,B=bottom,C=top,T=major ticks,S=minor ticks,N=labels,V=vertical,L=log,M=labels above' else print "(a)",' B=left,C=right,T=major ticks,S=minor ticks,N=labels,L=log,M=labels to left' if (ColourBarFmtStr=='BCMSTV') then ColourBarFmtStr='BCNST' ! use default string for horizontal bars instead endif endif call prompt('enter format code string for colour bar ticks/numbering',ColourBarFmtStr) endif endif !------------------------------------------------------------------------ case(5) icolour_particles = .not.icolour_particles print "(a)",' Use particle colours instead of pixels is ' & //trim(print_logical(icolour_particles)) !------------------------------------------------------------------------ case(6) call prompt('Use normalised interpolations?',inormalise_interpolations) print "(a)",' Normalisation of interpolations is ' & //trim(print_logical(inormalise_interpolations)) if (.not.inormalise_interpolations) then call prompt('Use exact rendering? (slower but more accurate)',exact_rendering) print "(a)",' Exact rendering is ' & //trim(print_logical(exact_rendering)) endif !------------------------------------------------------------------------ case(7) ifastrender = .not.ifastrender print "(a)",' Accelerated rendering is '//trim(print_logical(ifastrender)) if (ifastrender) then print*,' Warning: this is slightly approximate (particle position' print*,' assumed to be at centre of pixel)' endif !------------------------------------------------------------------------ case(8) idensityweightedinterpolation = .not.idensityweightedinterpolation print "(a)",' Density weighted interpolation is '// & print_logical(idensityweightedinterpolation) iauto_densityweighted = .not.idensityweightedinterpolation if (.not.idensityweightedinterpolation) & call prompt('Switch density weighting on/off automatically?',iauto_densityweighted) !------------------------------------------------------------------------ case(9) print "(5(/,a),/,4(/,a),/)", & ' Example format strings: ', & ' \(2268) %l d%z %uz : this is the default format "\int rho [g/cm^3] dz [cm]"', & ' column %l : would print "column density" for density', & ' surface %l : would print "surface density"', & ' %l integrated through %z : would print "density integrated through z"', & ' Format codes: ', & ' %l : label for rendered quantity ', & ' %z : label for ''z'' ', & ' %uz : units label for z (only if physical units applied)' call prompt(' enter label format for projection plots: ',projlabelformat) call prompt(' enter which column to apply format to (0=all) ',iapplyprojformat,0,maxplot) !------------------------------------------------------------------------ case(10) do i=0,nkernels print "(1x,i1,')',1x,a)",i,trim(kernelname(i)) enddo call prompt(' enter kernel to use for interpolations (0=default)',ikernel,0,nkernels) call select_kernel(ikernel) call setup_integratedkernel ! need to redo the kernel table if kernel has changed end select return end subroutine submenu_render end module settings_render danieljprice-splash-4d1f09c/src/options_vecplot.f90000066400000000000000000000165551477365367100224440ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing settings and options relating to vector plots ! includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module settings_vecplot implicit none integer :: npixvec,minpartforarrow,iVecLegendOnPanel logical :: UseBackgndColorVecplot, iplotpartvec logical :: iVecplotLegend,iplotstreamlines,iplotarrowheads logical :: iplotsynchrotron,ihidearrowswherenoparts,iallarrowssamelength real :: hposlegendvec,vposlegendvec real :: rcrit,zcrit,synchrotronspecindex,uthermcutoff namelist /vectoropts/ npixvec, UseBackgndColorVecplot,iplotpartvec,& iVecplotLegend,hposlegendvec,vposlegendvec,iplotstreamlines, & iplotarrowheads,iplotsynchrotron,rcrit,zcrit,synchrotronspecindex, & uthermcutoff,ihidearrowswherenoparts,minpartforarrow,iallarrowssamelength,& iVecLegendOnPanel contains !--------------------------------------------- ! set default values for these options !--------------------------------------------- subroutine defaults_set_vecplot npixvec = 40 ! pixels in x direction on vector plots UseBackgndColorVecplot = .false. ! plot vector plot using black/white iplotpartvec = .true. ! whether to plot particles on vector plot iVecplotLegend = .true. iVecLegendOnPanel = 0 ! all panels hposlegendvec = 0.02 vposlegendvec = -1.5 iplotstreamlines = .false. ! plot stream lines instead of arrows iplotarrowheads = .true. iplotsynchrotron = .false. zcrit = 2.5 ! kpc rcrit = 13. ! kpc synchrotronspecindex = 0.8 uthermcutoff = -1. ! flags this as uninitialised ihidearrowswherenoparts = .false. minpartforarrow = 1 iallarrowssamelength = .false. return end subroutine defaults_set_vecplot !---------------------------------------------------------------------- ! sets options relating to vector plots !---------------------------------------------------------------------- subroutine submenu_vecplot(ichoose) use prompting, only:prompt,print_logical use settings_data, only:ndim,numplot use labels, only:iutherm use limits, only:lim use legends, only:prompt_panelselect integer, intent(in) :: ichoose integer :: ians ians = ichoose print "(a)",'--------------- vector plot options -------------------' if (ians <= 0 .or. ians > 7) then print 10,npixvec,print_logical(UseBackgndColorVecplot), & print_logical(iVecplotLegend),print_logical(iplotstreamlines), & print_logical(iplotarrowheads), & print_logical(ihidearrowswherenoparts), & print_logical(iallarrowssamelength) 10 format( & ' 0) exit ',/, & ' 1) change number of pixels (',i4,' )',/, & ' 2) use background colour for arrows ( ',a,' )',/, & ' 3) vector plot legend settings ( ',a,' )',/, & ' 4) plot stream/field lines instead of arrows ( ',a,' )',/, & ' 5) turn arrow heads on/off ( ',a,' )',/, & ' 6) hide arrows where there are no particles ( ',a,' )',/, & ' 7) all arrows same length - ie. direction only ( ',a,' )') call prompt('enter option',ians,0,7) endif ! !--options ! select case(ians) !------------------------------------------------------------------------ case(1) call prompt('enter number of pixels',npixvec,1,1000) !------------------------------------------------------------------------ case(2) UseBackgndColorVecplot = .not.UseBackgndColorVecplot print*,'use background colour on vector plots = ', & print_logical(UseBackgndColorVecplot) !------------------------------------------------------------------------ case(3) call prompt('plot vector legend?',iVecplotLegend) if (iVecplotLegend) then print*,'note: H key in interactive mode can also be used to set positions' call prompt('Enter horizontal position as fraction of viewport', & hposlegendvec,0.0,1.0) call prompt('Enter vertical position in character heights from top', & vposlegendvec) call prompt_panelselect('vector legend',iVecLegendOnPanel) endif !------------------------------------------------------------------------ case(4) iplotstreamlines = .not.iplotstreamlines print "(2(a,/))",' Note: the number of stream lines plotted is determined by', & ' the "change number of contours" option in the r)ender menu' call prompt('use stream lines instead of arrows? ',iplotstreamlines) !------------------------------------------------------------------------ case(5) iplotarrowheads = .not.iplotarrowheads call prompt('plot arrow heads? ',iplotarrowheads) if (ndim==3 .and. .not.iplotarrowheads) then call prompt(' plot synchrotron map? ',iplotsynchrotron) if (iplotsynchrotron) then if (iutherm < 0 .or. iutherm > numplot) then print "(a)",' Warning: cannot use thermal energy cutoff in synchrotron plots' print "(a)",' (could not locate thermal energy in data columns)' endif call prompt(' enter rcrit for cosmic ray electron distribution exp(-r/rcrit -z/zcrit)',rcrit,0.) call prompt(' enter zcrit for cosmic ray electron distribution exp(-r/rcrit -z/zcrit)',zcrit,0.) call prompt(' enter synchrotron spectral index I_nu = nu^-alpha ',synchrotronspecindex,0.) if (iutherm > 0 .and. iutherm <= numplot) then !--set sensible default value for uthermcutoff if (uthermcutoff < -tiny(uthermcutoff)) then uthermcutoff = 0.5*(lim(iutherm,1) + lim(iutherm,2)) endif call prompt(' enter threshold thermal energy in current units (u < utherm not used) ',uthermcutoff,0.) endif endif endif !------------------------------------------------------------------------ case(6) call prompt('hide vector arrows where there are no particles ? ',ihidearrowswherenoparts) if (ihidearrowswherenoparts) then call prompt(' enter minimum number of particles in pixel cell for arrow to be plotted ',minpartforarrow,1) endif !------------------------------------------------------------------------ case(7) iallarrowssamelength = .not.iallarrowssamelength call prompt('make all arrows same length (ie. only show direction, not magnitude) ?',iallarrowssamelength) end select return end subroutine submenu_vecplot end module settings_vecplot danieljprice-splash-4d1f09c/src/options_xsecrotate.f90000066400000000000000000000664731477365367100231550ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2021 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module containing settings and options relating to cross sections, ! rotations and 3D plotting. ! Includes default values of these options and submenu for changing them !------------------------------------------------------------------------- module settings_xsecrot implicit none !--public variables integer, public :: nframes,nseq integer, public :: nxsec,irotateaxes logical, public :: xsec_nomulti, irotate, flythru, use3Dperspective, use3Dopacityrendering logical, public :: rendersinks real, public :: anglex, angley, anglez, zobserver, dzscreenfromobserver real, public :: taupartdepth,xsecwidth real, public :: xsecpos_nomulti,xseclineX1,xseclineX2,xseclineY1,xseclineY2 real, public, dimension(3) :: xorigin,xminrotaxes,xmaxrotaxes !--private variables related to animation sequences integer, parameter, private :: maxseq = 6 integer, dimension(maxseq), public :: iseqstart,iseqend,iseqtype integer, public :: icolchange real, public :: xminseqend,xmaxseqend,yminseqend,ymaxseqend real, public :: anglezend,angleyend,anglexend,zobserverend,taupartdepthend real, public :: xmincolend,xmaxcolend,xsecpos_nomulti_end logical, private :: ihavesetsequence character(len=*), dimension(maxseq), parameter, private :: labelseqtype = & (/'steady zoom on x and y axes ', & 'steady rotation ', & 'steady change of limits (e.g. for colour bar) ', & 'steady movement of 3D observer ', & 'sequence of cross section slices through a 3D box ', & 'steady change of opacity for 3D surface plots '/) !--namelists for writing to defaults file and .anim file public :: xsecrotopts namelist /xsecrotopts/ xsec_nomulti,xsecpos_nomulti,flythru, & xseclineX1,xseclineX2,xseclineY1,xseclineY2, & irotate,irotateaxes,anglex, angley, anglez, & xminrotaxes,xmaxrotaxes,use3Dperspective, & use3Dopacityrendering,zobserver,dzscreenfromobserver, & taupartdepth,xsecwidth,rendersinks public :: animopts namelist /animopts/ nseq,nframes,iseqstart,iseqend,iseqtype, & xminseqend,xmaxseqend,yminseqend,ymaxseqend, & anglezend,angleyend,anglexend,zobserverend,taupartdepthend, & icolchange,xmincolend,xmaxcolend,xsecpos_nomulti_end !--public procedure names public :: defaults_set_xsecrotate,submenu_xsecrotate,getsequencepos,insidesequence public :: setsequenceend procedure(add_sequence), pointer :: addseq => null() procedure(delete_sequence), pointer :: delseq => null() procedure(check_sequences), pointer :: checkseq => null() private contains !--------------------------------------------- ! set default values for these options !--------------------------------------------- subroutine defaults_set_xsecrotate xsec_nomulti = .false. ! take cross section of data / particles xsecpos_nomulti = 0. ! position of cross section flythru = .false. ! take series of cross sections through data xseclineX1 = 0.0 xseclineX2 = 0.0 xseclineY1 = 0.0 xseclineY2 = 0.0 xsecwidth = 0.0 ! width of xsec slices - zero means suggest better value to user irotate = .false. irotateaxes = 0 anglex = 0. angley = 0. anglez = 0. xminrotaxes = 0. xmaxrotaxes = 0. use3Dperspective = .false. use3Dopacityrendering = .false. zobserver = 0. dzscreenfromobserver = 0. taupartdepth = -1. ! determine kappa automatically !--defaults for animation sequences nseq = 0 nframes = 0 iseqstart(:) = 0 iseqend(:) = 0 iseqtype(:) = 0 xminseqend = 0. xmaxseqend = 0. yminseqend = 0. ymaxseqend = 0. anglezend = 360. angleyend = 0. anglexend = 0. icolchange = 0 xmincolend = 0. xmaxcolend = 0. zobserverend = 0. taupartdepthend = 2000.0 xsecpos_nomulti_end = 0. ihavesetsequence = .false. rendersinks = .false. end subroutine defaults_set_xsecrotate !---------------------------------------------------------------------- ! sets options relating to cross sectioning / rotation !---------------------------------------------------------------------- subroutine submenu_xsecrotate(ichoose) use filenames, only:nsteps,nstepsinfile,ifileopen use labels, only:irad,get_sink_type use prompting, only:prompt,print_logical use promptlist, only:prompt_list use settings_data, only:ndim,xorigin,iCalcQuantities,DataIsBuffered,ntypes use calcquantities, only:calc_quantities integer, intent(in) :: ichoose integer :: ians,i logical :: ichangedorigin character(len=1) :: labelx(3) character(len=4) :: text real, dimension(3) :: xorigintemp print "(a)",'---------- cross section / 3D plotting options --------' if (ndim==1) print*,' WARNING: none of these options have any effect in 1D' ians = ichoose if (xsec_nomulti) then text = 'xsec' else text = 'proj' endif if (ians <= 0 .or. ians > 5) then print 10,text,print_logical(irotate),anglex,angley,anglez, & print_logical(use3Dperspective),print_logical(use3Dopacityrendering), & nseq 10 format( & ' 0) exit ',/, & ' 1) switch between cross section/projection ( ',a4,' )',/, & ' 2) rotation and origin settings ( ',a,3(1x,f5.1),' )',/, & ' 3) 3D perspective on/off ( ',a,' )',/, & ' 4) 3D surface rendering on/off ( ',a,' )',/, & ' 5) set animation sequence (rotate,flythru etc.) ( ',i2,' )') call prompt('enter option',ians,0,5) endif ! !--options ! select case(ians) !------------------------------------------------------------------------ case(1) xsec_nomulti = .not.xsec_nomulti print *,' Cross section = ',xsec_nomulti !------------------------------------------------------------------------ case(2) call prompt('use rotation?',irotate) print "(a)",' rotation is '//trim(print_logical(irotate)) if (irotate) then print*,'note that rotations are done in the order z-y-x ' print*,'this means the y and x rotations are done about the *new* y and x axes' print*,'if in doubt, set the angles interactively in this order' call prompt('enter rotation angle about z axis (deg)',anglez,0.,360.) if (ndim==3) then call prompt('enter rotation angle about y axis (deg)',angley,0.,360.) call prompt('enter rotation angle about x axis (deg)',anglex,0.,360.) endif endif !xorigin(1:ndim) = 0.5*(lim(1:ndim,1) + lim(1:ndim,2)) xorigintemp(1:ndim) = xorigin(1:ndim) ichangedorigin = .false. print "(a)",' Note that origin settings affect both rotation and radius calculations' labelx=(/'x','y','z'/) do i=1,ndim call prompt('enter location of origin '//labelx(i),xorigin(i)) if (abs(xorigin(i)-xorigintemp(i)) > tiny(0.)) then ichangedorigin = .true. endif enddo !--recalculate radius if origin settings have changed if (ichangedorigin .and. iCalcQuantities .and. irad > 0) then if (DataIsBuffered) then call calc_quantities(1,nsteps) else call calc_quantities(1,nstepsinfile(ifileopen)) endif endif !------------------------------------------------------------------------ case(3) call prompt(' Use 3D perspective? ',use3Dperspective) if (use3Dperspective) then if (.not.irotate) irotate = .true. if (abs(anglez) < tiny(anglez) .and. & abs(angley) < tiny(angley) .and. & abs(anglex) < tiny(anglex)) then anglez = 30. anglex = 60. print "(a)",' setting default rotation angles to 30,0,60' endif endif !------------------------------------------------------------------------ case(4) call prompt(' Use 3D opacity rendering? ',use3Dopacityrendering) if (use3Dopacityrendering .and. get_sink_type(ntypes) > 0) then call prompt('Include sinks in opacity rendering (no=plot on top)?',rendersinks) endif !------------------------------------------------------------------------ case(5) call submenu_animseq() end select return end subroutine submenu_xsecrotate !---------------------------------------------------------------------- ! sets up animation sequences !---------------------------------------------------------------------- subroutine submenu_animseq() use promptlist, only:prompt_list use prompting, only:prompt addseq => add_sequence checkseq => check_sequences delseq => delete_sequence call prompt_list(nseq,maxseq,'sequence',checkseq,addseq,delseq) end subroutine submenu_animseq !----------------------------------- ! print the current list of shapes !----------------------------------- subroutine check_sequences(n) integer, intent(in) :: n integer :: iseq print "(/,a)", ' Current list of animation sequences:' if (n > 0) then do iseq=1,n print "(i2,') ',a)",iseq,labelseqtype(iseqtype(iseq)) enddo else print "(a)",' (none)' endif end subroutine check_sequences subroutine delete_sequence(iseq,n) integer, intent(in) :: iseq integer, intent(inout) :: n integer :: i if (iseq > 0 .and. n > 0 .and. iseq <= maxseq) then if (iseqtype(iseq) > 0 .and. iseqtype(iseq) <= maxseq) then print "(a,i1,': ',a)",' deleting sequence ',iseq,trim(labelseqtype(iseqtype(iseq))) endif iseqtype(iseq) = 0 do i=iseq+1,n iseqtype(i-1) = iseqtype(i) enddo n = n - 1 endif end subroutine delete_sequence subroutine add_sequence(istart,iend,n) use prompting, only:prompt use limits, only:lim use labels, only:ix,irho use settings_data, only:ndim,istartatstep,iendatstep,numplot use filenames, only:nsteps integer, intent(in) :: istart,iend integer, intent(inout) :: n integer :: i,j,ierr i = istart + 1 over_sequences: do while (i <= iend .and. i <= maxseq) if (i > n) n = i if (n > 0) then !--set sensible default value for number of frames if (nframes==0) then if (nsteps > 1) then nframes = 1 else nframes = 10 endif endif call prompt('Enter number of frames generated between dumps (applies to all sequences)',nframes,1,500) !call prompt('Use same sequence position for all plots on the page?',imultiframeseq) endif print "(a,i2,a)",'----------------- sequence ',i,' ----------------------' if (iseqstart(i)==0) iseqstart(i) = max(istartatstep,1) if (iseqend(i)==0) iseqend(i) = max(1,iendatstep,istartatstep) if (nsteps > 1) then call prompt('Enter starting dump for sequence ',iseqstart(i),1,nsteps) call prompt('Enter finishing dump for sequence ',iseqend(i),1,nsteps) endif ierr = 1 do while (ierr /= 0) print "(7(/,1x,i1,1x,':',1x,a))",0,'none (remove sequence) ', & (j,labelseqtype(j),j=1,maxseq) call prompt('Enter type of sequence ',iseqtype(i),0,maxseq) !--allow only one sequence of each type ierr = 0 if (i > 0) then do j=1,n if (i /= j .and. (iseqtype(j)==iseqtype(i)) .and. (iseqtype(i) > 0)) ierr = 2 enddo if (ierr==2) print "(/,a)",' Error: can only have one sequence of each type ' endif enddo select case(iseqtype(i)) case(1) print "(a)",'Note: zoom sequence starts using current fixed x,y plot limits' if (abs(xminseqend) < tiny(xminseqend) .and. abs(xmaxseqend) < tiny(xmaxseqend)) then xminseqend = lim(1,1) xmaxseqend = lim(1,2) endif call prompt(' Enter finishing xmin ',xminseqend) call prompt(' Enter finishing xmax ',xmaxseqend) if (abs(yminseqend) < tiny(yminseqend) .and. abs(ymaxseqend) < tiny(ymaxseqend)) then yminseqend = lim(2,1) ymaxseqend = lim(2,2) endif call prompt(' Enter finishing ymin ',yminseqend) call prompt(' Enter finishing ymax ',ymaxseqend) case(2) if (ndim < 2) then print "(a)",' ERROR: cannot use this sequence in 1D' iseqtype(i) = 0 endif if (.not.irotate) then print "(a)",' Turning rotation on...' irotate = .true. endif print "(a)",'Note: rotation sequence starts using current rotation settings' call prompt(' Enter finishing rotation angle (z axis) ',anglezend) call prompt(' Enter finishing rotation angle (y axis) ',angleyend) call prompt(' Enter finishing rotation angle (x axis) ',anglexend) case(3) if (icolchange <= 0 .or. icolchange > numplot) then if (irho > 0 .and. irho <= numplot) then icolchange = irho else icolchange = 1 endif endif call prompt(' Enter column to change limits ',icolchange,1,numplot) print "(a)",'Note: limits start from current fixed plot limits for this column' if (abs(xmincolend) < tiny(xmincolend) .and. abs(xmaxcolend) < tiny(xmaxcolend)) then xmincolend = lim(icolchange,1) xmaxcolend = lim(icolchange,2) endif call prompt(' Enter finishing minimum value ',xmincolend) call prompt(' Enter finishing maximum value ',xmaxcolend) case(4) if (ndim /= 3) then print "(a)",' ERROR: cannot use this sequence in < 3D' iseqtype(i) = 0 endif if (.not.use3Dperspective) then print "(a)",'Turning 3D perspective on...' use3Dperspective = .true. endif print "(a)",'Note: observer starts at current observer settings ' print "(a)",' (screen height does not change)' !--try to give sensible default values if (abs(zobserverend) < tiny(zobserverend)) then if (abs(zobserver) > tiny(zobserver)) then zobserverend = 5.*zobserver elseif (ix(3) > 0 .and. ix(3) <= numplot) then zobserverend = 10.*lim(ix(3),2) endif endif call prompt(' Enter finishing 3D observer height ',zobserverend) case(5) if (ndim /= 3) then print "(a)",' ERROR: cannot use this sequence in < 3D' iseqtype(i) = 0 endif if (.not.xsec_nomulti) then print "(a)",'Changing from projection to cross-section' xsec_nomulti = .true. if (use3Dperspective .and. .not.use3Dopacityrendering) then print "(a)",'Turning 3D perspecitve off' use3Dperspective = .false. endif endif print "(a)",'Note: slice position starts from value set at initial prompt' call prompt(' Enter finishing slice position ',xsecpos_nomulti_end) case(6) if (ndim /= 3) then print "(a)",' ERROR: cannot use this sequence in < 3D' iseqtype(i) = 0 endif if (.not.use3Dperspective .or. .not.use3Dopacityrendering) then print "(a)",'Turning 3D opacity rendering and 3D perspective on...' use3Dopacityrendering = .true. use3Dperspective = .true. endif print "(3(a,/))",'Note: opacity sequence starts from current opacity value ', & ' and that logarithmic steps are used if finishing value is', & ' set to more than 1000 times the starting value (or vice-versa) ' call prompt('Enter finishing opacity in units of average smoothing length ',taupartdepthend) case default call delete_sequence(i,n) exit over_sequences end select i = i + 1 enddo over_sequences if (all(iseqtype(1:n)==0)) then n = 0 else ihavesetsequence = .true. endif return end subroutine add_sequence !---------------------------------------------------------------------- ! ! subroutine called from interactive mode which sets the current ! plot settings as the end point to an animation sequence ! !---------------------------------------------------------------------- subroutine setsequenceend(ipos,iplotx,iploty,irender,rotation, & anglexi,angleyi,anglezi,zobserveri,use3Dopacity,taupartdepthi, & x_sec,xsecposi,xmin,xmax,ymin,ymax,rendermin,rendermax) use limits, only:lim use multiplot, only:itrans use settings_data, only:ndim,numplot use transforms, only:transform_limits,transform_limits_inverse,transform_label integer, intent(in) :: ipos,iplotx,iploty,irender real, intent(in) :: anglexi,angleyi,anglezi,zobserveri,taupartdepthi,xsecposi real, intent(in) :: xmin,xmax,ymin,ymax,rendermin,rendermax logical, intent(in) :: rotation, use3Dopacity,x_sec integer :: i real :: xminfixed,xmaxfixed,yminfixed,ymaxfixed,renderminfixed,rendermaxfixed nseq = 0 iseqtype(:) = 0 ! !--compare transformed limits ! xminfixed = lim(iplotx,1) xmaxfixed = lim(iplotx,2) call transform_limits(xminfixed,xmaxfixed,itrans(iplotx)) yminfixed = lim(iploty,1) ymaxfixed = lim(iploty,2) call transform_limits(yminfixed,ymaxfixed,itrans(iploty)) if (irender > 0 .and. irender <= numplot) then renderminfixed = lim(irender,1) rendermaxfixed = lim(irender,2) call transform_limits(renderminfixed,rendermaxfixed,itrans(irender)) endif !--set however many sequences are required to capture the change in parameters ! !--change of x-y limits if ( notequal(xmin,xminfixed) .or. notequal(xmax,xmaxfixed) & .or.notequal(ymin,yminfixed) .or. notequal(ymax,ymaxfixed)) then nseq = nseq + 1 iseqtype(nseq) = 1 xminseqend = xmin xmaxseqend = xmax yminseqend = ymin ymaxseqend = ymax print*,trim(transform_label('xmin,max',itrans(iplotx)))//' start = ',xminfixed,xmaxfixed, & ' end = ',xminseqend,xmaxseqend print*,trim(transform_label('ymin,max',itrans(iploty)))//' start = ',yminfixed,ymaxfixed, & ' end = ',yminseqend,ymaxseqend !--always store untransformed limits call transform_limits_inverse(xminseqend,xmaxseqend,itrans(iplotx)) call transform_limits_inverse(yminseqend,ymaxseqend,itrans(iploty)) endif !--change of rotation angles if (ndim >= 2 .and. rotation .and. & (notequal(anglexi,anglex).or.notequal(angleyi,angley).or.notequal(anglezi,anglez))) then nseq = nseq + 1 iseqtype(nseq) = 2 anglexend = anglexi angleyend = angleyi anglezend = anglezi print*,'angle x start = ',anglex,' end = ',anglexend print*,'angle y start = ',angley,' end = ',angleyend print*,'angle z start = ',anglez,' end = ',anglezend endif !--change of render limits if (ndim > 1 .and. irender > 0 .and. irender <= numplot) then if (notequal(rendermin,renderminfixed) .or. notequal(rendermax,rendermaxfixed)) then nseq = nseq + 1 iseqtype(nseq) = 3 icolchange = irender xmincolend = rendermin xmaxcolend = rendermax print*,trim(transform_label('rendermin,max',itrans(irender)))//' start = ',renderminfixed,rendermaxfixed, & ' end = ',xmincolend,xmaxcolend !--always store untransformed limits call transform_limits_inverse(xmincolend,xmaxcolend,itrans(irender)) endif endif !--change of observer position if (ndim==3 .and. notequal(zobserveri,zobserver)) then nseq = nseq + 1 iseqtype(nseq) = 4 zobserverend = zobserveri endif !--change of cross section position if (ndim==3 .and. x_sec .and. notequal(xsecpos_nomulti,xsecposi)) then nseq = nseq + 1 iseqtype(nseq) = 5 xsecpos_nomulti_end = xsecposi endif !--change of opacity if (use3Dopacity .and. notequal(taupartdepthi,taupartdepth)) then nseq = nseq + 1 iseqtype(nseq) = 6 taupartdepthend = taupartdepthi endif !--all sequences start from 1 and end at current dump position iseqstart(1:nseq) = 1 iseqend(1:nseq) = ipos if (nseq > 0) then print "(1x,a,i1,a)",'total of ',nseq,' sequences set:' do i=1,nseq print "(1x,i1,': ',a)",i,trim(labelseqtype(iseqtype(i))) enddo print "(a,i5)",' sequences start at dump 1 and end at dump ',ipos if (nframes <= 0) then if (ipos==1) then nframes = 10 else nframes = 1 endif print "(a,i3)",' setting number of frames = ',nframes endif else print "(a)",' no sequences set (no change in parameters)' endif return end subroutine setsequenceend !---------------------------------------------------------------------- ! utility function for comparing real numbers !---------------------------------------------------------------------- logical function notequal(r1,r2) real, intent(in) :: r1,r2 if (abs(r1-r2) > epsilon(r1)) then notequal = .true. else notequal = .false. endif end function notequal !---------------------------------------------------------------------- ! query function determining whether or not a given timestep ! is inside an animation sequence or not ! (and thus whether or not to generate extra frames) !---------------------------------------------------------------------- logical function insidesequence(ipos) integer, intent(in) :: ipos integer :: i insidesequence = .false. do i=1,nseq if (iseqtype(i) > 0 .and. iseqstart(i) <= ipos .and. iseqend(i) >= ipos) then insidesequence = .true. endif enddo return end function insidesequence !---------------------------------------------------------------------- ! query function which returns the current plot parameters ! based on the position in each sequence ! (given the current frame & dump position) !---------------------------------------------------------------------- subroutine getsequencepos(ipos,iframe,iplotx,iploty,irender,ivectorplot, & anglexi,angleyi,anglezi,zobserveri,dzscreen,taupartdepthi, & xsecposi,xmin,xmax,ymin,ymax,rendermin,rendermax,vecmax,& isetrenderlimits,isetvectorlimits) use limits, only:lim use multiplot, only:itrans use transforms, only:transform_limits integer, intent(in) :: ipos,iframe,iplotx,iploty,irender,ivectorplot real, intent(out) :: anglexi,angleyi,anglezi,zobserveri,dzscreen,taupartdepthi,xsecposi real, intent(out) :: xmin,xmax,ymin,ymax,rendermin,rendermax,vecmax logical, intent(out) :: isetrenderlimits,isetvectorlimits logical :: logtaudepth integer :: i,iposinseq,iposend real :: xfrac,xminstart,xmaxstart,xminend,xmaxend,yminstart,ymaxstart,yminend,ymaxend isetrenderlimits = .false. isetvectorlimits = .false. do i=1,nseq !--set starting values based on first position if (ipos >= iseqstart(i)) then iposinseq = (ipos-iseqstart(i))*nframes + iframe iposend = (iseqend(i)-iseqstart(i))*nframes + nframes xfrac = (iposinseq-1)/real(iposend-1) xfrac = min(xfrac,1.0) if (iposinseq > iposend) then print "(1x,a)",'--> '//trim(labelseqtype(iseqtype(i)))//' finished : frac = 1.0' else print "(1x,a,i3,a,i3,a,f5.2)",'--> frame ', & iposinseq,' / ',iposend,' of '//trim(labelseqtype(iseqtype(i)))//': frac = ',xfrac endif select case(iseqtype(i)) case(1) xminstart = lim(iplotx,1) xmaxstart = lim(iplotx,2) yminstart = lim(iploty,1) ymaxstart = lim(iploty,2) call transform_limits(xminstart,xmaxstart,itrans(iplotx)) call transform_limits(yminstart,ymaxstart,itrans(iploty)) xminend = xminseqend xmaxend = xmaxseqend yminend = yminseqend ymaxend = ymaxseqend call transform_limits(xminend,xmaxend,itrans(iplotx)) call transform_limits(yminend,ymaxend,itrans(iploty)) !--steps are linear in the transformed space ! and limits returned are *already transformed* xmin = xminstart + xfrac*(xminend - xminstart) xmax = xmaxstart + xfrac*(xmaxend - xmaxstart) ymin = yminstart + xfrac*(yminend - yminstart) ymax = ymaxstart + xfrac*(ymaxend - ymaxstart) case(2) anglexi = anglex + xfrac*(anglexend - anglex) angleyi = angley + xfrac*(angleyend - angley) anglezi = anglez + xfrac*(anglezend - anglez) case(3) !--steps are linear in the transformed space ! and limits returned are *already transformed* if (iplotx==icolchange) then xminstart = lim(iplotx,1) xmaxstart = lim(iplotx,2) call transform_limits(xminstart,xmaxstart,itrans(iplotx)) xminend = xmincolend xmaxend = xmaxcolend call transform_limits(xminend,xmaxend,itrans(iplotx)) xmin = xminstart + xfrac*(xminend - xminstart) xmax = xmaxstart + xfrac*(xmaxend - xmaxstart) elseif (iploty==icolchange) then yminstart = lim(iploty,1) ymaxstart = lim(iploty,2) call transform_limits(yminstart,ymaxstart,itrans(iploty)) yminend = xmincolend ymaxend = xmaxcolend call transform_limits(yminend,ymaxend,itrans(iploty)) ymin = yminstart + xfrac*(yminend - yminstart) ymax = ymaxstart + xfrac*(ymaxend - ymaxstart) elseif (irender==icolchange) then xminstart = lim(irender,1) xmaxstart = lim(irender,2) call transform_limits(xminstart,xmaxstart,itrans(irender)) xminend = xmincolend xmaxend = xmaxcolend call transform_limits(xminend,xmaxend,itrans(irender)) rendermin = xminstart + xfrac*(xminend - xminstart) rendermax = xmaxstart + xfrac*(xmaxend - xmaxstart) isetrenderlimits = .true. elseif (ivectorplot==icolchange) then xminstart = lim(ivectorplot,1) xmaxstart = lim(ivectorplot,2) call transform_limits(xminstart,xmaxstart,itrans(ivectorplot)) xminend = xmincolend xmaxend = xmaxcolend call transform_limits(xminend,xmaxend,itrans(ivectorplot)) vecmax = xmaxstart + xfrac*(xmaxend - xmaxstart) isetvectorlimits = .true. endif case(4) zobserveri = zobserver + xfrac*(zobserverend - zobserver) dzscreen = zobserveri case(5) xsecposi = xsecpos_nomulti + xfrac*(xsecpos_nomulti_end - xsecpos_nomulti) case(6) logtaudepth = (taupartdepthend > 1.001e3*taupartdepth) & .or.(taupartdepthend < 1.001e-3*taupartdepth) if (logtaudepth) then print "(a)",' (incrementing optical depth logarithmically)' taupartdepthi = taupartdepth*(taupartdepthend/taupartdepth)**xfrac else taupartdepthi = taupartdepth + xfrac*(taupartdepthend - taupartdepth) endif end select endif enddo end subroutine getsequencepos end module settings_xsecrot danieljprice-splash-4d1f09c/src/pagecolours.f90000066400000000000000000000125161477365367100215310ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2010 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !---------------------------------------------------------- ! module handling page colour schemes, for generic ! plotting library !---------------------------------------------------------- module pagecolours implicit none integer, parameter :: maxpagecolours = 2 contains !---------------------------------------------------------- ! query function for the colour scheme !---------------------------------------------------------- function pagecolourscheme(ischeme,short) integer, intent(in) :: ischeme character(len=21) :: pagecolourscheme logical, intent(in), optional :: short logical :: use_short use_short = .false. if (present(short)) use_short = short select case(ischeme) case(2) pagecolourscheme = 'white-on-black' case(1) pagecolourscheme = 'black-on-white' case default if (use_short) then pagecolourscheme = 'default' else pagecolourscheme = 'plot library default' endif end select end function pagecolourscheme !---------------------------------------------------------- ! set the colour index 1 and 0 of the plotting library ! corresponding to the foreground and background colours ! (must be called after the plot library is initialised) !---------------------------------------------------------- subroutine set_pagecolours(ischeme) use plotlib, only:plot_scr integer, intent(in) :: ischeme select case(ischeme) case(2) !--white-on-black call plot_scr(0,0.,0.,0.) call plot_scr(1,1.,1.,1.) case(1) !--black-on-white call plot_scr(0,1.,1.,1.) call plot_scr(1,0.,0.,0.) end select end subroutine set_pagecolours !---------------------------------------------------------- ! query function for the name of the foreground colour !---------------------------------------------------------- function colour_fore(ischeme) integer, intent(in) :: ischeme character(len=5) :: colour_fore select case(ischeme) case(2) colour_fore = 'white' case(1) colour_fore = 'black' case default colour_fore = ' ' end select end function colour_fore !---------------------------------------------------------- ! query function for the name of the background colour !---------------------------------------------------------- function colour_back(ischeme) integer, intent(in) :: ischeme character(len=5) :: colour_back select case(ischeme) case(2) colour_back = 'black' case(1) colour_back = 'white' case default colour_back = ' ' end select end function colour_back !---------------------------------------------------------- ! write line colours to file !---------------------------------------------------------- subroutine write_coloursfile(filename,nc,linecolours) character(len=*), intent(in) :: filename integer, intent(in) :: nc real, intent(in) :: linecolours(3,nc) integer :: i,ierr integer, parameter :: lu = 37 open(unit=lu,file=trim(filename),status='replace',iostat=ierr) do i=1,nc write(lu,"(3(f8.3,1x))") linecolours(:,i) enddo close(lu) end subroutine write_coloursfile !---------------------------------------------------------- ! read line colours from file !---------------------------------------------------------- subroutine read_coloursfile(filename,maxc,linecolours,nc,ierr) character(len=*), intent(in) :: filename integer, intent(in) :: maxc real, intent(out) :: linecolours(3,maxc) integer, intent(out) :: nc,ierr integer :: i integer, parameter :: lu = 38 ierr = 0 nc = 0 open(unit=lu,file=trim(filename),status='old',iostat=ierr) if (ierr /= 0) return do i=1,maxc read(lu,*,iostat=ierr) linecolours(:,i) if (ierr==0) nc = nc + 1 enddo if (nc > 0) ierr = 0 ! this is successful close(lu) end subroutine read_coloursfile !---------------------------------------------------------- ! read line colours from file !---------------------------------------------------------- subroutine set_linecolours(linepalette,filename,maxc,linecolours) use plotlib, only:plot_scr,plot_set_palette,plotlib_maxpalette character(len=*), intent(in) :: filename integer, intent(in) :: linepalette,maxc real, intent(out) :: linecolours(3,maxc) integer :: i,nc,ierr if (linepalette > 0 .and. linepalette <= plotlib_maxpalette) then call plot_set_palette(linepalette) elseif (linepalette < 0) then call read_coloursfile(filename,maxc,linecolours,nc,ierr) do i=1,nc call plot_scr(i+1,linecolours(1,i),linecolours(2,i),linecolours(3,i)) enddo endif end subroutine set_linecolours end module pagecolours danieljprice-splash-4d1f09c/src/parsetext.f90000066400000000000000000000147701477365367100212310ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! module containing routines to parse text strings containing ! variables. ! ! For example: ! %(t + 10) ! %(t*2) ! t = %t ! time = %t.5 ! specifying formatting to 5 sig-figs ! ! Uses the function parser module to evaluate the functions ! once extracted from the text. Functions that cannot be ! correctly evaluated are left intact in the text ! ! Dependencies: ! fparser module ! plot_numb from the plotting library !----------------------------------------------------------------- module parsetext use fparser, only:rn implicit none contains subroutine parse_text(string,vars,vals) use asciiutils, only:string_replace,string_sub,lcase character(len=*), intent(inout) :: string real(kind=rn), dimension(:), intent(in) :: vals character(len=*), dimension(:), intent(in) :: vars character(len=1) :: ch character(len=len(string)+128) :: newstring integer :: ia,iz,i0,i9,lenstr,npar,i,istart,iend,ndecimal,ierr,i1,i2 logical :: in_variable,parse real :: r integer, parameter :: ndecimal_default = 3 character(len=32) :: varstring ! !--look for strings of the form: ! ! %var ! %(var) ! %var.n ! %(var + 10).n ! %(var1*var2 + 10) ! %(var1*var2) ! ia = iachar('a') iz = iachar('z') i0 = iachar('0') i9 = iachar('9') lenstr = len(newstring) parse = .false. in_variable = .false. ! print*,'parsing ',trim(string) newstring = string npar = 0 ndecimal = ndecimal_default i1 = 0 i2 = 0 ! ! In the following we extract two substrings: ! ! string(istart:iend) is the string to replace, i.e. %(blah).5 ! string(i1:i2) is the variable/function to evaluate, i.e. blah ! i = 0 do while (i < lenstr) i = i + 1 ch = lcase(newstring(i:i)) select case(ch) case('%') in_variable = .true. if (i > 1) then if (newstring(i-1:i-1)=='\') in_variable = .false. endif if (in_variable) then istart = i iend = 0 i1 = i + 1 i2 = 0 endif case('(') if (in_variable) then npar = npar + 1 endif case(')') if (in_variable) then npar = max(npar - 1,0) if (i >= lenstr) then iend = i if (i2 < i1) i2 = iend parse = .true. elseif (npar==0) then if (newstring(i+1:i+1) /= '.') then iend = i if (i2 <= i1) i2 = iend parse = .true. endif endif endif case('.') if (in_variable .and. npar <= 0 .and. i < lenstr) then read(newstring(i+1:i+1),"(i1)",iostat=ierr) ndecimal if (ierr /= 0) ndecimal = 3 iend = i+1 if (i2 < i1) i2 = i - 1 parse = .true. endif case default if ((.not.((iachar(ch) >= ia .and. iachar(ch) <= iz) & .or.(iachar(ch) >= i0 .and. iachar(ch) <= i9)) & .or. i==lenstr) .and. npar <= 0) then if (in_variable) then if (i==lenstr) then iend = i else iend = i - 1 endif if (i2 < i1) i2 = iend parse = .true. endif endif end select if (parse) then in_variable = .false. !print*,'variable = ',newstring(istart:iend), ', ndecimal = ',ndecimal !print*,'formula = ',newstring(i1:i2),i1,i2 r = parse_formula(newstring(i1:i2),vars,vals,ierr) if (ierr==0) then !print*,' r = ',r,' ierr = ',ierr call get_varstring(r,ndecimal,varstring) !print*,'varstring: "',varstring,'"' call string_sub(newstring,istart,iend,trim(varstring)) endif i = i + (len_trim(varstring) - (iend - istart)) - 1 !print*,'newstring = ',newstring !(1:i),len_trim(varstring),iend-istart parse = .false. ndecimal = ndecimal_default endif enddo ! ! get rid of escape sequence on % ! call string_replace(newstring,'\%','%') ! ! replace original string (possibly truncated) ! string = trim(newstring) ! print*,' string: "',trim(newstring),'"' end subroutine parse_text !--------------------------------------------------------------------------- ! ! write the real number r to a string ! with ndec decimal places ! ! uses plot_numb to do the formatting ! !--------------------------------------------------------------------------- subroutine get_varstring(r,ndec,string) use plotlib, only:plot_numb real, intent(in) :: r integer, intent(in) :: ndec character(len=*), intent(out) :: string real :: rtmp integer :: mm,pp,nc if (abs(r) < tiny(r)) then string = '0' nc = 1 else rtmp = abs(r) mm = nint(r/10.**(int(log10(rtmp)-ndec))) pp = int(log10(rtmp) - ndec) call plot_numb(mm,pp,1,string,nc) endif end subroutine get_varstring !--------------------------------------------------------------------------- ! ! evaluate the variable or function via the function parser ! ! i.e. (t + 10) or (t*10) etc. ! ! OUTPUT: a real number ! ! unknown variables or un-parsable syntax return an error and a zero value ! !--------------------------------------------------------------------------- real function parse_formula(string,vars,vals,ierr) use fparser, only:initf,evalf,endf,checkf,parsef character(len=*), intent(in) :: string character(len=*), dimension(:), intent(in) :: vars real(kind=rn), dimension(:), intent(in) :: vals integer, intent(out) :: ierr call initf(1) ierr = checkf(string,vars,verbose=.false.) if (ierr==0) then call parsef(1,string,vars) parse_formula = real(evalf(1,vals)) else parse_formula = 0. endif call endf end function parse_formula end module parsetext danieljprice-splash-4d1f09c/src/particleplot.f90000066400000000000000000000625661477365367100217220ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module particleplots implicit none public :: particleplot,plot_errorbarsx,plot_errorbarsy public :: plot_kernel_gr contains ! ! Drives raw particle plots ! Handles different particle types, particle cross-sections, particle labelling ! fast-plotting added 12.10.06 (excludes particles in crowded fields) ! ! Arguments: ! ! subroutine particleplot(x,y,z,h,ntot,iplotx,iploty,icolourpart,iamtype,noftype,iplot_type, & use_zrange,zmin,zmax,labelz,xmin,xmax,ymin,ymax, & fast,verbose,datpix,nx,ny,dval,brightness) use params, only:int1 use labels, only:labeltype, maxparttypes,is_coord use settings_data, only:ndim,icoords,ntypes use settings_part, only:imarktype,ncircpart,icoordsnew,icircpart,itypeorder, & ilabelpart,iplotline,linestylethisstep,linecolourthisstep use interpolations2D, only:interpolate_part,interpolate_part1 use transforms, only:transform use part_utils, only:igettype use sort, only:indexx use plotlib, only:plot_qci,plot_bbuf,plot_ebuf,plot_sci,plot_sfs,plot_circ, & plot_pt,plot_numb,plot_text,plot_pt1,plot_qls,plot_sls, & plot_line,plot_qlw,plot_slw,plot_errb,plotlib_maxlinestyle integer, intent(in) :: ntot,iplotx, iploty integer(kind=int1), intent(in) :: iamtype(:) integer, intent(in) :: icolourpart(:) integer, intent(in) :: noftype(maxparttypes) real, intent(in) :: x(:), y(:), z(:), h(:) real, intent(in) :: zmin,zmax,xmin,xmax,ymin,ymax logical, intent(in) :: use_zrange,fast,verbose logical, intent(in) :: iplot_type(maxparttypes) character(len=*), intent(in) :: labelz integer, intent(in), optional :: nx,ny real, intent(inout), optional :: datpix(:,:),brightness(:,:) real, intent(in), optional :: dval integer :: j,n,itype,linewidth,icolourindex,nplotted,oldlinestyle,ierr integer :: lenstring,index1,index2,ntotplot,icolourstart,nlooptypes,ilooptype integer :: nplottedtype(maxparttypes) character(len=20) :: string integer, parameter :: ncellx = 500, ncelly = 500 ! for crowded field reduction integer(kind=int1) :: nincell(ncellx,ncelly,maxparttypes) integer :: icellx,icelly,maxz real :: dx1,dy1,dxpix logical :: mixedtypes real, allocatable :: xerrb(:), yerrb(:), herr(:) integer, allocatable :: iorder(:) !--query current character height and colour call plot_qci(icolourstart) ! !--check for errors in input ! ntotplot = sum(noftype(1:ntypes)) if (ntot < ntotplot) then if (verbose) print "(a)",' ERROR: number of particles input < number of each type ' if (verbose) print*,ntot,noftype(1:ntypes) return elseif (ntot /= ntotplot) then if (verbose) print "(a)",' WARNING: particleplot: total not equal to sum of types on input' if (verbose) print*,' ntotal = ',ntot,' sum of types = ',ntotplot endif maxz = size(z) if (maxz > ntot) maxz = ntot if (use_zrange .and. maxz < ntot) then if (verbose) print "(a)",' WARNING: particleplot: slice plot but z array too small - excluding particles > z array size' endif dxpix = 0. if (present(datpix)) then if (.not.(present(nx).and.present(ny).and.present(dval))) then if (verbose) print "(a)",' INTERNAL ERROR in call to particleplot: optional args not present' return else dxpix = (xmax - xmin)/real(nx) endif endif ! !--loop over all particle types ! index1 = 1 nplottedtype = 0 nlooptypes = ntypes mixedtypes = size(iamtype) > 1 if (mixedtypes .or. use_zrange) nlooptypes = 1 dx1 = (ncellx - 1)/(xmax-xmin + tiny(xmin)) dy1 = (ncelly - 1)/(ymax-ymin + tiny(ymin)) nincell = 0 over_types: do ilooptype=1,nlooptypes call plot_bbuf !--buffer plot output until each particle type finished if (mixedtypes .or. use_zrange) then index1 = 1 index2 = ntot itype = 0 else itype = itypeorder(ilooptype) if (itype==1) then index1 = 1 else index1 = sum(noftype(1:itype-1))+1 endif index2 = index1 + noftype(itype) - 1 if (.not.iplot_type(itype)) then call plot_ebuf cycle over_types endif endif if (index2 > ntot) then index2 = ntot print "(a)",' WARNING: incomplete data' endif if (index2 < index1) then call plot_ebuf cycle over_types endif if (use_zrange) then ! !--if particle cross section, plot particles only in a defined (z) coordinate range ! nplotted = 0 overj: do j=1,ntot if (mixedtypes) then itype = min(max(int(iamtype(j)),1),maxparttypes) else itype = igettype(j,noftype) endif if (.not. iplot_type(itype)) cycle overj if (j <= maxz) then if (z(j) > zmin .and. z(j) < zmax) then if (icolourpart(j) >= 0) then nplotted = nplotted + 1 nplottedtype(itype) = nplottedtype(itype) + 1 if (fast .and. noftype(itype) > 100) then if (in_cell(icellx,icelly,x(j),y(j),xmin,ymin,dx1,dy1,ncellx,ncelly)) then if (nincell(icellx,icelly,itype)==0) then nincell(icellx,icelly,itype) = nincell(icellx,icelly,itype) + 1_int1 ! this +1 of type int*1 call plot_sci(icolourpart(j)) call plot_particle(imarktype(itype),x(j),y(j),h(j)) endif endif else call plot_sci(icolourpart(j)) call plot_particle(imarktype(itype),x(j),y(j),h(j)) endif if (present(datpix)) then if (present(brightness)) then call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval,brightness) else call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval) endif endif endif !--plot circle of interaction if gas particle if (itype==1 .and. ncircpart > 0 .and. ANY(icircpart(1:ncircpart)==j)) then call plot_circ(x(j),y(j),2*h(j)) endif !!--plot particle label if (ilabelpart) then call plot_numb(j,0,1,string,lenstring) call plot_text(x(j),y(j),string(1:lenstring)) endif endif endif enddo overj do itype=1,ntypes if (iplot_type(itype) .and. nplottedtype(itype) > 0) then if (zmin < -0.1*huge(zmin)) then if (verbose) print*,'plotted ',nplottedtype(itype),' of ',noftype(itype), & trim(labeltype(itype))//' particles with ', trim(labelz),' < ',zmax else if (verbose) print*,'plotted ',nplottedtype(itype),' of ',noftype(itype), & trim(labeltype(itype))//' particles in range ', trim(labelz),' = ',zmin,' -> ',zmax endif endif enddo else ! !--otherwise plot all particles of this type using appropriate marker and colour ! call plot_qci(icolourindex) ! !--all particles in range have same colour and type ! if (.not.mixedtypes .and. all(icolourpart(index1:index2)==icolourpart(index1)) & .and. icolourpart(index1) >= 0) then call plot_sci(icolourpart(index1)) if (fast .and. (index2-index1) > 100) then !--fast-plotting only allows one particle per "grid cell" - avoids crowded fields if (verbose) write(*,"(a,i8,1x,a)") ' fast-plotting ',index2-index1+1,trim(labeltype(itype))//' particles' nincell = 0 do j=index1,index2 if (in_cell(icellx,icelly,x(j),y(j),xmin,ymin,dx1,dy1,ncellx,ncelly)) then if (nincell(icellx,icelly,itype)==0) then nincell(icellx,icelly,itype) = nincell(icellx,icelly,itype) + 1_int1 ! this +1 of type int*1 call plot_particle(imarktype(itype),x(j),y(j),h(j)) if (present(datpix)) then if (present(brightness)) then call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval,brightness) else call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval) endif endif endif endif enddo else !--plot all particles of this type if (verbose) print "(a,i8,1x,a)",' plotting ',index2-index1+1,trim(labeltype(itype))//' particles' select case(imarktype(itype)) case(32:35) do j=index1,index2 call plot_particle(imarktype(itype),x(j),y(j),h(j)) enddo call plot_sfs(1) case default call plot_pt(noftype(itype),x(index1:index2),y(index1:index2),imarktype(itype)) end select if (present(datpix)) then if (present(brightness)) then call interpolate_part(x(index1:index2),y(index1:index2),h(index1:index2), & noftype(itype),xmin,ymin,datpix,nx,ny,dxpix,dval,brightness) else call interpolate_part(x(index1:index2),y(index1:index2),h(index1:index2), & noftype(itype),xmin,ymin,datpix,nx,ny,dxpix,dval) endif endif endif else ! !--mixed colours and/or mixed types ! nplotted = 0 nplottedtype = 0 overj2: do j=index1,index2 if (icolourpart(j) >= 0) then if (mixedtypes) then itype = int(iamtype(j)) if (.not.iplot_type(itype)) cycle overj2 nplottedtype(itype) = nplottedtype(itype) + 1 endif nplotted = nplotted + 1 if (fast .and. noftype(itype) > 100) then if (in_cell(icellx,icelly,x(j),y(j),xmin,ymin,dx1,dy1,ncellx,ncelly)) then !--exclude particles if there are more than 2 particles per cell ! (two here because particles can have different colours) if (nincell(icellx,icelly,itype) <= 0) then nincell(icellx,icelly,itype) = nincell(icellx,icelly,itype) + 1_int1 ! this +1 of type int*1 call plot_sci(icolourpart(j)) call plot_particle(imarktype(itype),x(j),y(j),h(j)) if (present(datpix)) then if (present(brightness)) then call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval,brightness) else call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval) endif endif endif endif else call plot_sci(icolourpart(j)) call plot_particle(imarktype(itype),x(j),y(j),h(j)) if (present(datpix)) then if (present(brightness)) then call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval,brightness) else call interpolate_part1(x(j),y(j),h(j),xmin,ymin,datpix,nx,ny,dxpix,dval) endif endif endif endif enddo overj2 if (mixedtypes) then do itype=1,ntypes if (iplot_type(itype)) then if (fast .and. noftype(itype) > 100) then if (verbose) print*,' fast-plotted ',nplottedtype(itype),& ' of ',noftype(itype),trim(labeltype(itype))//' particles' elseif (noftype(itype) > 0) then if (verbose) print*,' plotted ',nplottedtype(itype),& ' of ',noftype(itype),trim(labeltype(itype))//' particles' endif endif enddo else if (fast .and. noftype(itype) > 100) then if (verbose) print*,' fast-plotted ',nplotted,' of ',index2-index1+1,trim(labeltype(itype))//' particles' else if (verbose) print*,' plotted ',nplotted,' of ',index2-index1+1,trim(labeltype(itype))//' particles' endif endif endif call plot_sci(icolourindex) if (ilabelpart) then !!--plot particle labels if (verbose) print*,'plotting particle labels ',index1,':',index2 do j=index1,index2 call plot_numb(j,0,1,string,lenstring) call plot_text(x(j),y(j),string(1:lenstring)) enddo endif endif index1 = index2 + 1 call plot_ebuf !--flush PGPLOT buffer at end of each type enddo over_types ! !--plot lines joining particles if relevant ! call plot_qci(icolourindex) call plot_sci(linecolourthisstep) ! i.e., don't plot a line for cross section plots (would plot all particles) ! but do if there is 3D perspective --> in which case zmin = -huge(x) if (iplotline .and. .not.(use_zrange .and. abs(zmax-zmin) < 0.5*huge(0.))) then call plot_qls(oldlinestyle) call plot_sls(linestylethisstep) if (ndim <= 1 .and. .false.) then ! sort particles by x in 1D allocate(iorder(noftype(1))) call indexx(noftype(1),x(1:noftype(1)),iorder) call plot_line(noftype(1),x(iorder),y(iorder)) deallocate(iorder) else call plot_line(noftype(1),x(1:noftype(1)),y(1:noftype(1))) endif if (noftype(2) > 0 .and. iplot_type(2)) then call plot_sls(mod(linestylethisstep+1,plotlib_maxlinestyle) + 1) call plot_line(noftype(2),x(noftype(1)+1:sum(noftype(1:2))),y(noftype(1)+1:sum(noftype(1:2)))) endif call plot_sls(oldlinestyle)! reset endif call plot_sci(icolourindex) ! !--plot circles of interaction (ie a circle of radius 2h) ! around all or selected particles. For plots with only one coordinate axis, ! these are plotted as error bars in the coordinate direction. ! !--this bit is also used for error bar plotting on x or y axis. ! if (ncircpart > 0) then ! !--set fill area style and line width ! call plot_qlw(linewidth) call plot_slw(2) call plot_qci(icolourindex) call plot_sci(2) call plot_sfs(2) if (ncircpart > 0) then if (is_coord(iplotx,ndim) .and. is_coord(iploty,ndim) .and. ncircpart > 0) then if (verbose) print*,'plotting ',ncircpart,' circles of interaction' do n = 1,ncircpart if (icircpart(n) > ntot) then if (verbose) print*,'error: particle index > number of particles' else if (icoordsnew /= icoords) then call plot_kernel_gr(icoordsnew,icoords,iplotx,iploty,& x(icircpart(n)),y(icircpart(n)),z(icircpart(n)),2*h(icircpart(n))) else call plot_circ(x(icircpart(n)),y(icircpart(n)),2*h(icircpart(n))) endif endif enddo else if (.not.allocated(herr)) then allocate(xerrb(ncircpart),yerrb(ncircpart),herr(ncircpart),stat=ierr) if (ierr /= 0) then print "(a)",' Error allocating memory in particleplot for circles of interaction' return endif endif !!--only on specified particles do n=1,ncircpart if (icircpart(n) > ntot) then print*,'error: particle index > number of particles' xerrb(n) = 0. yerrb(n) = 0. herr(n) = 0. else xerrb(n) = x(icircpart(n)) yerrb(n) = y(icircpart(n)) herr(n) = 2.*h(icircpart(n)) endif enddo if (is_coord(iplotx,ndim)) then if (verbose) print*,'plotting ',ncircpart,' error bars x axis ' call plot_errb(5,ncircpart,xerrb(1:ncircpart),yerrb(1:ncircpart),herr(1:ncircpart),1.0) elseif (is_coord(iploty,ndim)) then if (verbose) print*,'plotting ',ncircpart,' error bars y axis' call plot_errb(6,ncircpart,xerrb(1:ncircpart),yerrb(1:ncircpart),herr(1:ncircpart),1.0) endif if (allocated(herr)) deallocate(herr) if (allocated(xerrb)) deallocate(xerrb) if (allocated(yerrb)) deallocate(yerrb) endif endif call plot_slw(linewidth) call plot_sci(icolourindex) endif ! !--reset colour ! call plot_sci(icolourstart) return end subroutine particleplot !-------------------------------------------------------------------------------- ! ! subroutine implementing scalable markers ! default case is just an interface to usual particle plotting routine ! !-------------------------------------------------------------------------------- subroutine plot_particle(imarktype,x,y,h) use plotlib, only:plot_circ,plot_sfs,plot_sci,plot_pt1 use settings_part, only:hfacmarkers integer, intent(in) :: imarktype real, intent(in) :: x,y,h integer :: imarker real :: size if (h < 0.) return ! this will prevent plotting of merged sinks in Phantom select case(imarktype) case(32:35) imarker = imarktype - 31 size = hfacmarkers*h if (imarker <= 2) then call plot_sfs(imarker) call plot_circ(x,y,size) call plot_sfs(1) elseif (imarker==3) then call plot_sfs(1) call plot_circ(x,y,size) call plot_sfs(2) call plot_sci(0) call plot_circ(x,y,size) call plot_sfs(1) elseif (imarker==4) then call plot_sfs(1) call plot_circ(x,y,size) call plot_sfs(2) call plot_sci(1) call plot_circ(x,y,size) call plot_sfs(1) else call plot_circ(x,y,size) endif case default call plot_pt1(x,y,imarktype) end select end subroutine plot_particle !------------------------------------------------------------ ! ! function used to determine which cell a particle lies in ! returns TRUE if within allowed limits, FALSE if not ! !------------------------------------------------------------ logical function in_cell(ix,iy,x,y,xmin,ymin,dx1,dy1,nx,ny) integer, intent(out) :: ix,iy real, intent(in) :: x,y,xmin,ymin,dx1,dy1 integer, intent(in) :: nx,ny ix = int((x - xmin)*dx1) + 1 iy = int((y - ymin)*dy1) + 1 !--exclude particles if there are more than 2 particles per cell ! (two here because particles can have different colours) in_cell = (ix > 0 .and. ix <= nx .and. iy > 0 .and. iy <= ny) end function in_cell !-------------------------------------------------------------------------------- ! ! subroutine to plot the circle of interaction for a given particle ! in general coordinate systems (e.g. cylindrical coordinates) ! ! input: igeom : coordinate system (0,1=cartesian, 2=cylindrical, 3=spherical) ! x,y : particle location in cartesian space ! h : size of smoothing sphere ! (assumed isotropic in coordinate space) ! ! PGPLOT page must already be set up - this just draws the "circle" ! !-------------------------------------------------------------------------------- subroutine plot_kernel_gr(igeom,igeomold,iplotx,iploty,x,y,z,h) use geometry, only:coord_transform,maxcoordsys,labelcoordsys use plotlib, only:plot_line use labels, only:ix integer, intent(in) :: igeom,igeomold,iplotx,iploty real, intent(in) :: x,y,z,h integer, parameter :: npts = 100 ! big enough to give a smooth circle real, parameter :: pi = 3.1415926536 integer :: i,iplotz real, dimension(3) :: xtemp,xplot_coords real, dimension(3,npts) :: xpts real :: angle, dangle, xi, yi, zi if (igeom > 1 .and. igeom <= maxcoordsys) then print 10,labelcoordsys(igeom) else print 10,labelcoordsys(1) endif 10 format('coordinate system = ',a) iplotz = 0 do i=1,3 if (iplotx /= ix(i) .and. iploty /= ix(i)) iplotz = ix(i) enddo if (iplotz==0) return xplot_coords = (/x,y,z/) ! not actual x,y,z xtemp(iplotx-ix(1)+1) = xplot_coords(1) xtemp(iploty-ix(1)+1) = xplot_coords(2) xtemp(iplotz-ix(1)+1) = xplot_coords(3) !--e.g. from cylindricals TO cartesians call coord_transform(xtemp,3,igeom,xpts(:,1),3,igeomold) xi = xpts(1,1) yi = xpts(2,1) zi = xpts(3,1) ! !--step around a circle in co-ordinate space of radius h and store the ! location of the points in cartesian space in the 2D array xpts ! dangle = 2.*pi/REAL(npts-1) do i=1,npts angle = (i-1)*dangle xtemp(1) = xi + h*cos(angle) xtemp(2) = yi + h*sin(angle) xtemp(3) = zi ! !--translate back to actual coordinate system plotted ! call coord_transform(xtemp,3,igeomold,xpts(:,i),3,igeom) enddo ! !--now plot the circle using pgline ! call plot_line(npts,xpts(iplotx-ix(1)+1,:),xpts(iploty-ix(1)+1,:)) return end subroutine plot_kernel_gr !-------------------------------------------------------------------------------- ! ! Plot y-axis error bars, handling the case where the axes are transformed ! ! input x,y are in transformed space (i.e., already logged) ! input err is not transformed, (i.e., not logged) ! !-------------------------------------------------------------------------------- subroutine plot_errorbarsy(npts,x,y,err,itrans) use plotlib, only:plot_bbuf,plot_ebuf,plot_err1,plot_errb use transforms, only:transform,transform_inverse,islogged use settings_part, only:ErrorBarType use settings_data, only:iverbose integer, intent(in) :: npts,itrans real, intent(in), dimension(:) :: x,y,err real :: yval,errval real, dimension(2) :: val real, dimension(npts) :: errp,errm integer :: i if (iverbose >= 1) then if (npts < 10000) then print "(a,i4,a)",' plotting ',npts,' error bars y axis' else print "(a,i10,a)",' plotting ',npts,' error bars y axis' endif endif if (itrans /= 0) then if (islogged(itrans)) then errval = 0. !-300. else errval = 0. endif !call plot_bbuf do i=1,npts yval = y(i) call transform_inverse(yval,itrans) val(1) = yval + err(i) val(2) = yval - err(i) call transform(val,itrans,errval=errval) errp(i) = val(1) - y(i) errm(i) = y(i) - val(2) val(1) = val(1) - y(i) val(2) = y(i) - val(2) if (ErrorBarType /= 1) then call plot_err1(2,x(i),y(i),val(1),1.0) call plot_err1(4,x(i),y(i),val(2),1.0) endif enddo if (ErrorBarType==1) then call plot_errb(7,npts,x,y,errp,1.0) call plot_errb(8,npts,x,y,errm,1.0) endif !call plot_ebuf else if (ErrorBarType==1) then call plot_errb(9,npts,x,y,err,1.0) else call plot_errb(6,npts,x,y,err,1.0) endif endif end subroutine plot_errorbarsy !-------------------------------------------------------------------------------- ! ! Plot x-axis error bars, handling the case where the axes are transformed ! ! input x,y are in transformed space (i.e., already logged) ! input err is not transformed, (i.e., not logged) ! !-------------------------------------------------------------------------------- subroutine plot_errorbarsx(npts,x,y,err,itrans) use transforms, only:transform,transform_inverse,islogged use plotlib, only:plot_bbuf,plot_ebuf,plot_err1,plot_errb integer, intent(in) :: npts,itrans real, intent(in), dimension(:) :: x,y,err real :: xval,errval real, dimension(2) :: val integer :: i print*,'plotting ',npts,' error bars x axis ' if (itrans /= 0) then if (islogged(itrans)) then errval = -300. else errval = 0. endif call plot_bbuf do i=1,npts xval = x(i) call transform_inverse(xval,itrans) val(1) = xval + err(i) val(2) = xval - err(i) call transform(val,itrans,errval=errval) val(1) = val(1) - x(i) val(2) = x(i) - val(2) call plot_err1(1,x(i),y(i),val(1),1.0) call plot_err1(3,x(i),y(i),val(2),1.0) enddo call plot_ebuf else call plot_errb(5,npts,x,y,err,1.0) endif end subroutine plot_errorbarsx end module particleplots danieljprice-splash-4d1f09c/src/partutils.f90000066400000000000000000000271701477365367100212370ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------- ! ! utility routines to do with particle identification ! !----------------------------------------------------------- module part_utils use params, only:int1 implicit none public :: igettype,get_tracked_particle,get_itrackpart public :: locate_nth_particle_of_type public :: locate_first_two_of_type public :: locate_particle_from_string public :: get_binary,got_particles_of_type public :: get_positions_of_type,is_trackstring private contains !--------------------------------------------- ! utility returning the type of particle i ! when particles are ordered by type !--------------------------------------------- pure integer function igettype(i,noftype) use params, only:maxparttypes integer, intent(in) :: i integer, dimension(maxparttypes), intent(in) :: noftype integer :: ntot,ntot1,jtype ntot = 0 igettype = 1 ! so even if in error, will not lead to seg fault over_types: do jtype=1,maxparttypes ntot1 = ntot + noftype(jtype) if (i > ntot .and. i <= ntot1) then igettype = jtype exit over_types endif ntot = ntot1 enddo over_types end function igettype !------------------------------------------------------------------- ! routine to find which particle is being tracked, when it is ! given in the form of type:offset !------------------------------------------------------------------- integer function get_tracked_particle(string,noftype,iamtype,dat,irho) character(len=*), intent(in) :: string integer, dimension(:), intent(in) :: noftype integer(kind=int1), dimension(:), intent(in) :: iamtype integer, intent(in) :: irho real, dimension(:,:), intent(in) :: dat integer :: ntot,itype,ioffset,ierr call get_itrackpart(string,itype,ioffset,ierr) if ((itype <= 0 .or. itype > size(noftype)) .and. ioffset > 0) then !--type not set, itrackpart = itrackoffset get_tracked_particle = ioffset elseif (ierr == 0 .and. ioffset > 0) then !--want to select nth particle of a particular type call locate_nth_particle_of_type(ioffset,get_tracked_particle, & itype,iamtype,noftype,ntot) elseif (ierr == 0) then ntot = sum(noftype) get_tracked_particle = locate_particle_from_string(string,ntot,dat,irho) else get_tracked_particle = 0 endif end function get_tracked_particle !------------------------------------------------------------------- ! routine to find which particle is being tracked, when it is ! given in the form of type:offset !------------------------------------------------------------------- subroutine get_itrackpart(string,itracktype,itrackpart,ierr) character(len=*), intent(in) :: string integer, intent(out) :: itracktype,itrackpart,ierr integer :: ic ic = index(string,':') if (ic > 0) then read(string(1:ic-1),*,iostat=ierr) itracktype read(string(ic+1:),*,iostat=ierr) itrackpart if (itrackpart==0) itracktype = 0 else itracktype = 0 read(string,*,iostat=ierr) itrackpart if (itrackpart < 0 .or. ierr /= 0) itrackpart = 0 ! return ierr = 0 if the string is not a particle id but is still valid ! e.g. string='maxdens' if (ierr /= 0 .and. is_trackstring(string)) ierr = 0 endif end subroutine get_itrackpart !------------------------------------------------------------------- ! routine to locate first two particles of a given type in the data !------------------------------------------------------------------- subroutine locate_first_two_of_type(i1,i2,itype,iamtype,noftype,ntot) integer, intent(out) :: i1,i2,ntot integer, intent(in) :: itype integer(kind=int1), dimension(:), intent(in) :: iamtype integer, dimension(:), intent(in) :: noftype integer :: i,nfound !--locate first two sink particles in the data ntot = sum(noftype) if (size(iamtype(:))==1) then i1 = sum(noftype(1:itype-1)) + 1 i2 = i1 + 1 else i1 = 0 i2 = 0 i = 0 nfound = 0 do while ((i1==0 .or. i2==0) .and. i <= ntot) i = i + 1 if (iamtype(i)==itype) nfound = nfound + 1 if (nfound==1) i1 = i if (nfound==2) i2 = i enddo endif end subroutine locate_first_two_of_type !------------------------------------------------------------- ! routine to locate nth particle of a given type in the data !------------------------------------------------------------- pure subroutine locate_nth_particle_of_type(n,ipos,itype,iamtype,noftype,ntot) integer, intent(out) :: ipos,ntot integer, intent(in) :: n,itype integer(kind=int1), dimension(:), intent(in) :: iamtype integer, dimension(:), intent(in) :: noftype integer :: i,nfound ntot = sum(noftype) if (size(iamtype(:))==1) then ipos = sum(noftype(1:itype-1)) + n else ipos = 0 i = 0 nfound = 0 do while (ipos==0 .and. i < ntot) i = i + 1 if (iamtype(i)==itype) nfound = nfound + 1 if (nfound==n) ipos = i enddo endif end subroutine locate_nth_particle_of_type !------------------------------------------------------------- ! locate the particle corresponding to various strings ! e.g. maxdens = particle of maximum density !------------------------------------------------------------- pure integer function locate_particle_from_string(string,ntot,dat,irho) result(ipos) character(len=*), intent(in) :: string integer, intent(in) :: ntot real, intent(in) :: dat(:,:) integer, intent(in) :: irho integer :: ipos_tmp(1),ntoti ipos = 0 ipos_tmp = 0 ntoti = min(ntot,size(dat(:,1))) ! prevent bounds overflow select case(string(1:7)) case('maxdens') if (irho > 0 .and. irho <= size(dat(1,:))) ipos_tmp = maxloc(dat(1:ntoti,irho)) ipos = ipos_tmp(1) end select end function locate_particle_from_string !------------------------------------------------------------- ! validate strings for function above !------------------------------------------------------------- logical function is_trackstring(string) character(len=*), intent(in) :: string select case(string(1:7)) case('maxdens') is_trackstring = .true. case default is_trackstring = .false. end select end function is_trackstring !------------------------------------------------------------- ! check if any particles of type 'mytype' exist !------------------------------------------------------------- pure logical function got_particles_of_type(mytype,labeltype,npartoftype) character(len=*), intent(in) :: mytype,labeltype(:) integer, intent(in) :: npartoftype(:,:) integer :: itype got_particles_of_type = .false. do itype=1,size(npartoftype(:,1)) if (index(labeltype(itype),mytype) > 0) then if (any(npartoftype(itype,:) > 0)) got_particles_of_type = .true. endif enddo end function got_particles_of_type !---------------------------------------------------------- ! routine to get properties of particle binary system ! INPUT: ! i1, i2 : indexes of two particles to use ! dat(npart,ncolumns) : particle data ! ix(ndim) : columns containing positions ! ivx : column of first velocity component ! ipmass : column containing mass ! OUTPUT: ! x0 : centre of mass position ! v0 : velocity of centre of mass ! angle : angle of binary about centre of mass (radians) ! omega : angular velocity of binary around centre of mass !---------------------------------------------------------- subroutine get_binary(i1,i2,dat,x0,v0,angle,omega,ndim,ndimV,ncolumns,ix,ivx,ipmass,iverbose,ierr) integer, intent(in) :: i1,i2,ndim,ndimV,ncolumns,ivx,ipmass,iverbose integer, dimension(ndim), intent(in) :: ix real, dimension(:,:), intent(in) :: dat real, dimension(ndim), intent(out) :: x0,v0 real, intent(out) :: angle,omega integer, intent(out) :: ierr integer :: max real, dimension(ndim) :: x1,x2,v1,v2,dx,dv real :: m1,m2,dmtot,dR2 real, parameter :: pi = 4.*atan(1.) ierr = 0 max = size(dat(:,1)) if (i1 <= 0 .or. i2 <= 0 .or. i1 > max .or. i2 > max) then if (iverbose >= 2) print*,' star 1 = ',i1,' star 2 = ',i2 print "(a)",' ERROR locating sink particles in the data' ierr = 1 return endif x1 = 0. x2 = 0. x1(1:ndim) = dat(i1,ix(1:ndim)) x2(1:ndim) = dat(i2,ix(1:ndim)) !--get centre of mass if (ipmass > 0 .and. ipmass <= ncolumns) then m1 = dat(i1,ipmass) m2 = dat(i2,ipmass) else m1 = 1. m2 = 1. endif dmtot = 1./(m1 + m2) x0 = (m1*x1 + m2*x2)*dmtot if (iverbose >= 1) then print "(a,3(1x,es10.3),a,es10.3)",' :: star 1 pos =',x1(1:ndim),' m = ',m1 print "(a,3(1x,es10.3),a,es10.3)",' :: star 2 pos =',x2(1:ndim),' m = ',m2 print "(a,3(1x,es10.3))",' :: c. of mass =',x0(1:ndim) endif !--work out angle needed to rotate into corotating frame dx = x0 - x1 angle = -atan2(dx(2),dx(1)) !--get velocities if (ivx > 0 .and. ivx + ndimV <= ncolumns) then v1 = dat(i1,ivx:ivx+ndimV-1) v2 = dat(i2,ivx:ivx+ndimV-1) v0 = (m1*v1 + m2*v2)*dmtot dv = v2 - v0 dx = x2 - x0 dR2 = 1./dot_product(dx,dx) omega = dv(1)*(-dx(2)*dR2) + dv(2)*(dx(1)*dR2) if (iverbose >= 1) print "(a,3(1x,es10.3))",' :: vel c of m =',v0(1:ndimV) if (iverbose >= 1) print "(a,1x,es10.3,a,g12.4,a)",' :: omega =',omega,& ' angle =',-angle*180./pi,' degrees' else v0 = 0. omega = 0. endif end subroutine get_binary !---------------------------------------------------------- ! routine to extract positions of sink particles ! INPUT: ! dat(npart,ncolumns) : particle data ! ix(3) : columns containing positions ! itype : type of each particle ! ntypes : number of particle types ! npartoftype : number of particles of each type ! OUTPUT: ! nsinks : number of sink particles ! xpts : x positions of sink particles ! ypts : y positions of sink particles ! zpts : z positions of sink particles ! ierr : error code, ierr=0 means no error was encountered !---------------------------------------------------------- subroutine get_positions_of_type(dat,npartoftype,itype,iget_type,ix,n,xpts,ypts,zpts,ierr) integer, intent(in) :: npartoftype(:),ix(3),iget_type integer(kind=int1), intent(in) :: itype(:) real, intent(in) :: dat(:,:) integer, intent(out) :: n,ierr real, intent(out), allocatable :: xpts(:),ypts(:),zpts(:) integer :: i,j integer, allocatable :: ilist(:) ierr = 0 n = 0 if (iget_type > 0) n = npartoftype(iget_type) allocate(xpts(n),ypts(n),zpts(n),ilist(n),stat=ierr) if (ierr /= 0) then print*,' ERROR allocating memory for sink particle positions, aborting...' return endif j = 0 do i=1,sum(npartoftype) if (itype(i)==iget_type) then j = j + 1 ilist(j) = i endif enddo if (j /= n) print*,' WARNING: found ',j,' particles but expecting ',n if (j < n) n = j xpts = dat(ilist(1:n),ix(1)) ypts = dat(ilist(1:n),ix(2)) zpts = dat(ilist(1:n),ix(3)) deallocate(ilist) end subroutine get_positions_of_type end module part_utils danieljprice-splash-4d1f09c/src/pdfs.f90000066400000000000000000000172771477365367100201530ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !---------------------------------------------------------------- ! ! module for probability density function calculation ! and/or plotting on the particles ! !---------------------------------------------------------------- module pdfs implicit none public :: pdf_calc,pdf_write,mean_variance contains !----------------------------------------------------------------- ! ! subroutine bins particles into x, works out number in each bin, ! calculates normalisation for PDF. ! !----------------------------------------------------------------- subroutine pdf_calc(npart,xpart,xminplot,xmaxplot,nbins,xbin,pdf,pdfmin,pdfmax,& usefixedbins,ierr,mask,weight) !use transforms, only:transform,transform_inverse,transform_limits,convert_to_ln_fac integer, intent(in) :: npart,nbins real, dimension(:), intent(in) :: xpart real, intent(in) :: xminplot,xmaxplot real, intent(out), dimension(nbins) :: xbin,pdf real, intent(out) :: pdfmin,pdfmax logical, intent(in) :: usefixedbins integer, intent(out) :: ierr integer, intent(in), dimension(:), optional :: mask real, intent(in), dimension(:), optional :: weight integer :: ibin,i real :: dx,totprob,fi real :: xmin,xmax,xminpart,xmaxpart,weighti,totvol logical :: use_part ierr = 0 print "(a,i3,a)",' calculating PDF using ',nbins,' bins' if (present(weight)) print "(a)",' (using individual weights)' ! !--set bins in PDF: must always use all the particles ! note that xpart will already have been transformed ! so these are min and max in transformed space ! xminpart = minval(xpart(1:npart)) xmaxpart = maxval(xpart(1:npart)) if (usefixedbins) then xmin = xminplot xmax = xmaxplot print "(a,1pe10.3,a,1pe10.3)",' PDF bins are fixed between the current x limits, min = ',xminplot,' max = ',xmaxplot if (xminpart < xmin) print "(a)",' WARNING: particles fall outside of (fixed) bin range, will pile up on first bin' if (xmaxpart > xmax) print "(a)",' WARNING: particles fall outside of (fixed) bin range, will pile up on last bin' dx = (xmax - xmin)/real(nbins) print "(a,1pe10.3)",' bin width = ',dx do ibin=1,nbins xbin(ibin) = xmin + (ibin-1)*dx enddo else xmin = xminpart xmax = xmaxpart dx = (xmax - xmin)/real(nbins-1) print "(a,1pe10.3)",' bin width = ',dx do ibin=1,nbins xbin(ibin) = xmin + (ibin-0.5)*dx enddo endif ! !--now calculate probability of finding a particle at each x ! pdf(:) = 0. totvol = 0. do i=1,npart if (present(mask)) then use_part = (mask(i) >= 0) else use_part = .true. endif !--do not use hidden particles if (use_part) then ibin = int((xpart(i) - xmin)/dx) + 1 if (ibin < 1) ibin = 1 if (ibin > nbins) ibin = nbins if (present(weight)) then weighti = weight(i) else weighti = 1. endif totvol = totvol + weighti pdf(ibin) = pdf(ibin) + weighti endif enddo print*,' sum of weights = ',totvol ! !--get total area under pdf by trapezoidal rule ! totprob = 0. do ibin=1,nbins fi = pdf(ibin) totprob = totprob + dx*fi !!0.5*dx*(fi + fprev) enddo ! !--normalise pdf so total area is unity ! print*,'normalisation factor = ',totprob,totvol*dx ! =totvol*dx for volume weighted if (totprob <= 0.) then ierr = 1 print "(a)",' error in normalisation factor: returning non-normalised PDF' else pdf(1:nbins) = pdf(1:nbins)/totprob ! !--return min and max for adaptive plot limit setting ! (exclude zero as min) ! pdfmin = minval(pdf(1:nbins),mask=(pdf(1:nbins) > 0.)) pdfmax = maxval(pdf(1:nbins)) endif end subroutine pdf_calc !----------------------------------------------------------------- ! interface which controls plotting of PDF ! (so can easily change properties of PDF plotting, ! e.g. histogram vs. line) !----------------------------------------------------------------- !subroutine pdf_plot(nbins,xbin,pb) ! use plotutils, only:plotline !,plotbins ! implicit none ! integer, intent(in) :: nbins ! real, dimension(:), intent(in) :: xbin,pb ! !--plot as line segment, with blanking at zero ! ! call plotline(nbins,xbin,pb,blank=0.) ! !--plot as histogram, with blanking of zero ! ! call plotbins(nbins,xbin,pb,blank=0.) !end subroutine pdf_plot !----------------------------------------------------------------- ! routine to write pdf to file !----------------------------------------------------------------- subroutine pdf_write(nbins,xbin,pb,labelx,rootname,tagline) use asciiutils, only:safename character(len=*), intent(in) :: labelx,rootname,tagline integer, intent(in) :: nbins !,itransx real, intent(in), dimension(nbins) :: xbin,pb integer :: i,ierr integer, parameter :: iunit = 86 logical :: warned print "(a)",' writing to '//trim(rootname)//'_pdf_'//trim(safename(labelx))//'.dat' open(unit=iunit,file=trim(rootname)//'_pdf_'//trim(safename(labelx))//'.dat', & form='formatted',status='replace',iostat=ierr) if (ierr /= 0) then print "(a)",'ERROR: could not open file: no output' return endif write(iunit,"(a)",iostat=ierr) '# probability density function, calculated using '//trim(tagline) if (ierr /= 0) print "(a)",' ERROR writing header line' write(iunit,"(a,i5,a)",iostat=ierr) '# ',nbins,' bins evenly spaced in '//trim(labelx) write(iunit,"(a)") '# '//trim(labelx)//','//' P('//trim(labelx)//')' warned = .false. !--dump bins to file do i=1,nbins write(iunit,*,iostat=ierr) xbin(i),pb(i) if (ierr /= 0 .and. .not.warned) then print "(a)",' ERRORS during write' warned = .true. endif enddo close(iunit) return end subroutine pdf_write !------------------------------------------------- ! Subroutine to calculate the mean and variance ! of a set of data points ! Mean is trivial but variance uses a special ! formula to reduce round-off error ! see Press et al Numerical Recipes, section 14.2 ! this is similar to their subroutine avevar !------------------------------------------------- subroutine mean_variance(x,npts,xmean,xvariance) integer, intent(in) :: npts real, intent(in), dimension(npts) :: x real, intent(out) :: xmean, xvariance real :: roundoff, delta integer :: i ! !--calculate average ! xmean = 0. do i=1,npts xmean = xmean + x(i) enddo xmean = xmean/real(npts) ! !--calculate variance using the corrected two-pass formula ! ! var = 1/(n-1)*( sum (x-\bar{x}) - 1/n * (sum(x-\bar{x}) )^2 ) ! ! where the last term corrects for the roundoff error ! in the first term ! xvariance = 0. roundoff = 0. do i=1,npts delta = x(i) - xmean roundoff = roundoff + delta xvariance = xvariance + delta*delta enddo xvariance = (xvariance - roundoff**2/npts)/real(npts-1) return end subroutine mean_variance end module pdfs danieljprice-splash-4d1f09c/src/physcon.f90000066400000000000000000000045151477365367100206710ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------------- ! ! modules containing physical constants ! !---------------------------------------------------------------------------- module physcon use params, only:doub_prec implicit none real, parameter :: pi = 4.*atan(1.) real(doub_prec), parameter :: solarrcgs = 6.955d10 ! cm real(doub_prec), parameter :: solarmcgs = 1.989d33 ! g real(doub_prec), parameter :: steboltz = 5.67e-5 ! erg cm^-2 K^-4 s-1 real(doub_prec), parameter :: radconst = 7.5646d-15 ! Radiation constant erg cm^-3 K^-4 real(doub_prec), parameter :: kboltz = 1.38066d-16 real(doub_prec), parameter :: mh = 1.67262158d-24 ! g real(doub_prec), parameter :: au = 1.496d13 ! cm real(doub_prec), parameter :: c = 2.997924d10 ! Speed of light cm/s real(doub_prec), parameter :: hplanck = 6.6260755d-27 ! Planck's Constant erg/s real(doub_prec), parameter :: kb_on_mh = kboltz/mh real(doub_prec), parameter :: Lsun = 3.839d33 ! Solar luminosity, erg/s real(doub_prec), parameter :: cm_to_nm = 1.d7 real(doub_prec), parameter :: keV_to_erg = 1.6022d-9 ! k_eV to erg real(doub_prec), parameter :: keV_to_Hz = keV_to_erg/hplanck ! k_eV to erg real(doub_prec), parameter :: mass_electron_cgs = 9.10938291d-28 !Electron mass in g real(doub_prec), parameter :: qe = 4.8032068d-10 !charge on electron esu real(doub_prec), parameter :: sigma_e = 6.652e-25 ! Thomson cross section public end module physcon danieljprice-splash-4d1f09c/src/plotlib_giza.f90000066400000000000000000000404331477365367100216640ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------------------------------------------- ! The plotlib module in SPLASH provides a consistent API so that SPLASH ! can be compiled against different graphics libraries as the backend ! ! This version provides an interface to giza, a plotting ! library written by Daniel Price & James Wetter. ! ! Giza implements basic 2D plotting functionality ! on top of the cairo graphics library ! ! Interface written by James Wetter and Daniel Price (2010) !--------------------------------------------------------------------------- module plotlib use giza, only: & plot_arro=>giza_arrow, & plot_annotate=>giza_annotate, & plot_band=>giza_band, & plot_bbuf=>giza_begin_buffer,& plot_box=>giza_box, & plot_circ=>giza_circle, & plot_close=>giza_close, & plot_curs=>giza_get_key_press, & plot_ebuf=>giza_end_buffer, & plot_end=>giza_close_device, & plot_env=>giza_set_environment, & plot_errb=>giza_error_bars, & plot_funx=>giza_function_x, & plot_label=>giza_label, & plot_line=>giza_line, & plot_lcur=>giza_mark_line, & plot_olin=>giza_mark_points, & plot_ncur=>giza_mark_points_ordered, & plot_page=>giza_change_page, & plot_poly=>giza_polygon, & plot_pt1=>giza_single_point, & plot_pt=>giza_points, & plot_ptxt=>giza_ptext, & plot_qch=>giza_get_character_height, & plot_qci=>giza_get_colour_index, & plot_qcir=>giza_get_colour_index_range, & plot_qcr=>giza_get_colour_representation, & plot_qfs=>giza_get_fill, & plot_qlw=>giza_get_line_width,& plot_qls=>giza_get_line_style,& plot_qlc=>giza_get_line_cap, & plot_qtxt=>giza_qtext, & plot_qwin=>giza_get_window, & plot_rect=>giza_rectangle, & plot_sah=>giza_set_arrow_style, & plot_scf=>giza_set_font, & plot_sch=>giza_set_character_height, & plot_sci=>giza_set_colour_index, & plot_scir=>giza_set_colour_index_range, & plot_scr=>giza_set_colour_representation, & plot_set_palette=>giza_set_colour_palette, & plot_sfs=>giza_set_fill, & plot_slc=>giza_set_line_cap, & plot_sls=>giza_set_line_style,& plot_slw=>giza_set_line_width, & plot_stbg=>giza_set_text_background, & plot_svp=>giza_set_viewport, & plot_swin=>giza_set_window, & plot_text=>giza_text, & plot_wnad=>giza_set_window_equal_scale, & plot_qcur=>giza_device_has_cursor, & plot_rgb_from_table=>giza_rgb_from_table, & giza_contour, & giza_get_character_size, & giza_get_surface_size, & giza_get_viewport, & giza_open_device, & giza_open_device_size, & giza_render, & giza_render_gray, & giza_render_transparent, & giza_set_colour_table, & giza_stop_prompting, & giza_start_prompting, & plot_left_click=>giza_left_click_f, & plot_right_click=>giza_right_click_f, & plot_middle_click=>giza_middle_click_f, & plot_shift_click=>giza_shift_click_f, & plot_scroll_up=>giza_scroll_up_f, & plot_scroll_down=>giza_scroll_down_f, & plot_scroll_left=>giza_scroll_left_f, & plot_scroll_right=>giza_scroll_right_f, & giza_vector, & giza_format_number, & giza_query_device, & giza_draw_pixels, & giza_colour_index_min,& giza_colour_index_max,& giza_extend_none,& giza_extend_pad,& giza_extend_repeat, & giza_extend_reflect, & giza_filter_default implicit none logical, parameter :: plotlib_is_pgplot = .false. logical, parameter :: plotlib_supports_alpha = .true. integer, parameter :: plotlib_maxlinestyle = 6 integer, parameter :: plotlib_maxfillstyle = 5 integer, parameter :: plotlib_maxlinecolour = 16 integer, parameter :: plotlib_maxpalette = 7 integer, parameter :: plotlib_extend_pad = giza_extend_pad integer, parameter :: plotlib_extend_repeat = giza_extend_repeat integer, parameter :: plotlib_extend_reflect = giza_extend_reflect integer, parameter :: plotlib_extend_none = giza_extend_none public contains !--------------------------------------------- ! initialise the plotting library !--------------------------------------------- subroutine plot_init(devicein, ierr, papersizex, aspectratio, paperunits) use giza, only:giza_units_inches,giza_units_pixels,giza_units_mm character(len=*),intent(in) :: devicein integer,intent(out) :: ierr real, intent(in), optional :: papersizex,aspectratio integer, intent(in), optional :: paperunits real :: width,height integer :: units, id if (present(papersizex)) then width = papersizex if (present(aspectratio)) then height = width*aspectratio else height = width/sqrt(2.) endif if (present(paperunits)) then select case(paperunits) case(0) units = giza_units_pixels case(1) units = giza_units_inches case(2) units = giza_units_mm width = 10.*width height = 10.*height end select else units = giza_units_inches endif id = giza_open_device_size(devicein, 'splash', width, height, units) else id = giza_open_device(devicein,'splash') endif ! id<0 should return an error, but +ve id is OK if (id < 0) then ierr = id else ierr = 0 endif if (ierr==0) then call giza_stop_prompting endif end subroutine plot_init subroutine plot_gray(a, idim, jdim, i1, i2, j1, j2, a1, a2, tr, iextend, filter) integer,intent(in) :: IDIM, JDIM, I1, I2, J1, J2 real,intent(in) :: A(IDIM,JDIM), A1, A2, TR(6) real :: affine(6) integer, intent(in), optional :: iextend,filter integer :: ifilter call convert_tr_to_affine(tr,affine) ifilter = giza_filter_default if (present(filter)) ifilter = filter if (present(iextend)) then call giza_render_gray(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,a1,a2,iextend,ifilter,affine) else call giza_render_gray(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,a1,a2,0,ifilter,affine) endif end subroutine plot_gray subroutine plot_imag(a, idim, jdim, i1, i2, j1, j2, a1, a2, tr, iextend, filter) integer,intent(in) :: IDIM, JDIM, I1, I2, J1, J2 real,intent(in) :: A(IDIM,JDIM), A1, A2, TR(6) real :: affine(6) integer, intent(in), optional :: iextend,filter integer :: ifilter call convert_tr_to_affine(tr,affine) ifilter = giza_filter_default if (present(filter)) ifilter = filter if (present(iextend)) then call giza_render(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,a1,a2,iextend,ifilter,affine) else call giza_render(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,a1,a2,0,ifilter,affine) endif end subroutine plot_imag subroutine plot_imag_alpha(dat, alpha, idim, jdim, i1, i2, j1, j2, a1, a2, tr, iextend, filter) integer,intent(in) :: IDIM, JDIM, I1, I2, J1, J2 real,intent(in) :: dat(IDIM,JDIM), alpha(IDIM,JDIM), A1, A2, TR(6) real :: affine(6) integer, intent(in), optional :: iextend,filter integer :: ifilter call convert_tr_to_affine(tr,affine) ifilter = giza_filter_default if (present(filter)) ifilter = filter if (present(iextend)) then call giza_render(idim,jdim,dat,alpha,i1-1,i2-1,j1-1,j2-1,a1,a2,iextend,ifilter,affine) else call giza_render(idim,jdim,dat,alpha,i1-1,i2-1,j1-1,j2-1,a1,a2,0,ifilter,affine) endif end subroutine plot_imag_alpha subroutine plot_imag_transparent(a, idim, jdim, i1, i2, j1, j2, a1, a2, tr) integer,intent(in) :: IDIM, JDIM, I1, I2, J1, J2 real,intent(in) :: A(IDIM,JDIM), A1, A2, TR(6) real :: affine(6) call convert_tr_to_affine(tr,affine) call giza_render_transparent(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,a1,a2,0,0,affine) end subroutine plot_imag_transparent subroutine plot_ctab(l,r,g,b,nc,contra,bright) integer,intent(in) :: nc real,intent(in) :: l(nc),r(nc),g(nc),b(nc),contra,bright call giza_set_colour_table(l,r,g,b,nc,contra,bright) end subroutine plot_ctab subroutine plot_qvsz(paperunits,x1,x2,y1,y2) use giza, only:giza_get_paper_size,giza_units_device,giza_units_inches,giza_units_pixels,giza_units_mm real, intent(out) :: x1,x2,y1,y2 integer, intent(in) :: paperunits integer :: units x1 = 0. y1 = 0. select case(paperunits) case(0) units = giza_units_pixels case(1) units = giza_units_inches case(2) units = giza_units_mm case default units = giza_units_device end select call giza_get_paper_size(units,x2,y2) end subroutine plot_qvsz subroutine plot_bins(nbin,x,data,centre) integer, intent(in) :: nbin real, dimension(nbin), intent(in) :: x, data logical, intent(in) :: centre print*,' WARNING: plot_bins not implemented in giza' end subroutine plot_bins subroutine plot_qvp(units, x1, x2, y1, y2) integer,intent(in) :: units real,intent(out) :: x1, x2, y1, y2 call giza_get_viewport(units_giza(units),x1,x2,y1,y2) end subroutine plot_qvp subroutine plot_qcs(units,xch,ych) integer,intent(in) :: units real,intent(out) :: xch,ych call giza_get_character_size(units_giza(units),xch,ych) end subroutine plot_qcs subroutine plot_qcol(icolmin,icolmax) integer,intent(out) :: icolmin,icolmax icolmin = giza_colour_index_min icolmax = giza_colour_index_max end subroutine plot_qcol subroutine plot_scrn(ci,name,ier) integer,intent(in) :: ci character(len=*),intent(in) :: name integer,intent(out) :: ier print*,' WARNING: plot_scrn not implemented in giza' ier = 1 end subroutine plot_scrn subroutine plot_qinf(item,value,length) character(len=*),intent(in) :: item character(len=*),intent(out) :: value integer,intent(out) :: length character(len=10) :: datestring,timestring select case(item) case('VERSION','version') value = 'giza-1.1' case('STATE','state') print*,' WARNING: query for STATE not yet implemented in giza' case('USER','user') print*,' WARNING: query for USER not yet implemented in giza' case('NOW','now') call date_and_time(datestring,timestring) value = datestring(7:8)//'-'//datestring(5:6)//'-'//datestring(1:4)// & ' '//timestring(1:2)//':'//timestring(3:4) case('DEVICE','device') print*,' WARNING: query for DEVICE not yet implemented in giza' case('FILE','file') print*,' WARNING: query for FILE not yet implemented in giza' case('TYPE','type') call giza_query_device('type',value) case('DEV/TYPE','dev/type') print*,' WARNING: query for DEV/TYPE not yet implemented in giza' case('HARDCOPY','hardcopy') call giza_query_device('hardcopy',value) case('TERMINAL','terminal') !--in giza the current device is never the terminal value = 'NO' case('CURSOR','cursor') call giza_query_device('cursor',value) case('SCROLL','scroll') !--no scroll capability in any current giza devices value = 'NO' case default value = ' ' end select length = len_trim(value) end subroutine plot_qinf subroutine plot_numb(m,pp,form,string,nc) integer,intent(in) :: m,pp,form character(len=*),intent(out) :: string integer,intent(out) :: nc call giza_format_number(m,pp,form,string) nc = len_trim(string) end subroutine plot_numb subroutine plot_set_opacity(alpha) real, intent(in) :: alpha integer :: ci real :: red,green,blue call plot_qci(ci) call plot_qcr(ci,red,green,blue) call plot_scr(ci,red,green,blue,alpha) end subroutine plot_set_opacity subroutine plot_err1(dir,x,y,e,t) integer,intent(in) :: dir real,intent(in) :: x,y,e real,intent(in) :: t real, dimension(1) :: xi,yi,ei xi(1) = x yi(1) = y ei(1) = e call plot_errb(dir,1,xi,yi,ei,t) end subroutine plot_err1 subroutine plot_conb(a,idim,jdim,i1,i2,j1,j2,c,nc,tr,blank) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,nc real,intent(in) :: a(idim,jdim),c(*),tr(6),blank real :: affine(6) print*,' WARNING: blanking in contouring not implemented in giza' call convert_tr_to_affine(tr,affine) call giza_contour(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,nc,c,affine) end subroutine plot_conb subroutine plot_cons(a,idim,jdim,i1,i2,j1,j2,c,nc,tr) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,nc real,intent(in) :: a(idim,jdim),c(*),tr(6) real :: affine(6) call convert_tr_to_affine(tr,affine) call giza_contour(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,nc,c,affine) end subroutine plot_cons subroutine plot_conl(a,idim,jdim,i1,i2,j1,j2,c,tr,label,intval,mininit) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,intval,mininit real,intent(in) :: a(idim,jdim),c,tr(6) character(len=*),intent(in) :: label real :: affine(6) integer, parameter :: nc = 1 real, dimension(nc) :: clevel clevel(1) = c print*,' WARNING: labelled coutouring not implemented in giza' call convert_tr_to_affine(tr,affine) call giza_contour(idim,jdim,a,i1-1,i2-1,j1-1,j2-1,nc,clevel,affine) print*,'nc = ',nc end subroutine plot_conl subroutine plot_vect(a,b,idim,jdim,i1,i2,j1,j2,c,nc,tr,blank) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,nc real,intent(in) :: a(idim,jdim),b(idim,jdim),tr(6),blank,c real :: affine(6) call convert_tr_to_affine(tr,affine) call giza_vector(idim,jdim,a,b,i1-1,i2-1,j1-1,j2-1,c,nc,affine,blank) end subroutine plot_vect subroutine plot_pixl(ia,idim,jdim,i1,i2,j1,j2,x1,x2,y1,y2) use giza, only:giza_draw_pixels,giza_filter_default integer,intent(in) :: idim,jdim,i1,i2,j1,j2 integer,intent(in) :: ia(idim,jdim) real,intent(in) :: x1,x2,y1,y2 call giza_draw_pixels(IDIM, JDIM, IA, I1-1, I2-1, J1-1, J2-1, & X1, X2, Y1, Y2, 0, giza_filter_default) end subroutine plot_pixl subroutine plot_pap(widthin,aspect,paperunits) use giza, only:giza_set_paper_size use giza, only:giza_units_inches,giza_units_pixels,giza_units_mm real,intent(in) :: widthin,aspect integer, intent(in), optional :: paperunits integer :: units real :: width width = widthin units = giza_units_inches if (present(paperunits)) then select case(paperunits) case(0) units = giza_units_pixels case(1) units = giza_units_inches case(2) units = giza_units_mm width = 0.1*width end select endif call giza_set_paper_size(units,width,width*aspect) end subroutine plot_pap ! !--this subroutine can be called to ! make sure that the viewport lies exactly on ! pixel boundaries. ! ! unnecessary for giza ! subroutine plot_set_exactpixelboundaries() end subroutine plot_set_exactpixelboundaries !------------------------------------------------------------ ! Function to convert PGPLOT units value to giza units value !------------------------------------------------------------ integer function units_giza(pgplotunits) use giza, only:giza_units_normalized,giza_units_inches, & giza_units_mm,giza_units_pixels,giza_units_world integer, intent(in) :: pgplotunits select case(pgplotunits) case(0) units_giza = giza_units_normalized case(1) units_giza = giza_units_inches case(2) units_giza = giza_units_mm case(3) units_giza = giza_units_pixels case(4) units_giza = giza_units_world case default ! giza will give an error units_giza = pgplotunits end select end function units_giza subroutine convert_tr_to_affine(tr,affine) real, dimension(6), intent(in) :: tr real, dimension(6), intent(out) :: affine affine(1) = TR(2) affine(2) = TR(3) affine(3) = TR(5) affine(4) = TR(6) affine(5) = TR(1) + 0.5 * TR(2) affine(6) = TR(4) + 0.5 * TR(6) end subroutine convert_tr_to_affine end module plotlib danieljprice-splash-4d1f09c/src/plotlib_mock.f90000066400000000000000000000033211477365367100216560ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------------------------------------------- ! The mocking plotlib module to fake a real plotting module behaviour ! in external libraries (libexact) !--------------------------------------------------------------------------- module plotlib implicit none public contains subroutine plot_pt1(R1,R2,I) real :: R1, R2 integer :: I end subroutine subroutine plot_swin(R1,R2,R3,R4) real :: R1, R2, R3, R4 end subroutine subroutine plot_box(S1,R1,I1,S2,R2,I2) real :: R1, R2 integer :: I1, I2 character(len=*) :: S1, S2 end subroutine subroutine plot_funx(F1,I1,R1,R2,I2) real :: R1, R2, F1 integer :: I1, I2 external F1 end subroutine subroutine plot_label (S1,S2,S3) character(len=*) :: S1, S2, S3 end subroutine subroutine plot_line(I,R1,R2) real :: R1(:), R2(:) integer :: I end subroutine end module plotlib danieljprice-splash-4d1f09c/src/plotlib_pgplot.f90000066400000000000000000000460161477365367100222420ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------------------------------------------- ! The plotlib module in SPLASH provides a consistent API so that SPLASH ! can be compiled against different graphics libraries as the backend ! ! This version provides an interface to Tim Pearson's PGPLOT, ! which was the original backend used in SPLASH v1.x. Thus, ! the functions mostly translate directly to PGPLOT equivalents, ! and basically this is a Fortran 90 interface for PGPLOT. ! ! Interface written by James Wetter and Daniel Price (2010) !--------------------------------------------------------------------------- module plotlib implicit none logical, parameter :: plotlib_is_pgplot = .true. logical, parameter :: plotlib_supports_alpha = .false. integer, parameter :: plotlib_maxlinestyle = 5 integer, parameter :: plotlib_maxfillstyle = 5 integer, parameter :: plotlib_maxlinecolour = 16 integer, parameter :: plotlib_maxpalette = 7 integer, parameter :: plotlib_extend_pad = 1 ! not implemented in PGPLOT integer, parameter :: plotlib_extend_repeat = 2 ! not implemented in PGPLOT integer, parameter :: plotlib_extend_reflect = 3 ! not implemented in PGPLOT integer, parameter :: plotlib_extend_none = 0 ! not implemented in PGPLOT public character(len=1),parameter :: plot_left_click = 'A' character(len=1),parameter :: plot_right_click = 'X' character(len=1),parameter :: plot_middle_click = 'D' character(len=1),parameter :: plot_shift_click = achar(15) character(len=1),parameter :: plot_scroll_up = achar(21) character(len=1),parameter :: plot_scroll_down = achar(4) character(len=1),parameter :: plot_scroll_left = achar(12) character(len=1),parameter :: plot_scroll_right = achar(18) interface plot_qci subroutine PGQCI (CI) integer,intent(out) :: CI end subroutine PGQCI end interface interface plot_qlw subroutine PGQLW (LW) integer,intent(out) :: LW end subroutine PGQLW end interface interface plot_qcr subroutine PGQCR (CI, CR, CG, CB) integer,intent(in) :: CI real,intent(out) :: CR, CG, CB end subroutine PGQCR end interface interface plot_qvp subroutine PGQVP (UNITS, X1, X2, Y1, Y2) integer,intent(in) :: UNITS real,intent(out) :: X1, X2, Y1, Y2 end subroutine PGQVP end interface interface plot_qwin subroutine PGQWIN (X1, X2, Y1, Y2) real,intent(out) :: X1, X2, Y1, Y2 end subroutine PGQWIN end interface interface plot_ebuf subroutine PGEBUF end subroutine PGEBUF end interface interface plot_bbuf subroutine PGBBUF end subroutine PGBBUF end interface interface plot_qcs subroutine PGQCS(UNITS, XCH, YCH) integer,intent(in) :: UNITS real,intent(out) :: XCH, YCH end subroutine PGQCS end interface interface plot_annotate subroutine PGMTXT (SIDE, DISP, COORD, FJUST, TEXT) character(len=*),intent(in) :: SIDE, TEXT real,intent(in) :: DISP, COORD, FJUST end subroutine PGMTXT end interface interface plot_sch subroutine PGSCH (SIZE) real,intent(in) :: SIZE end subroutine PGSCH end interface interface plot_sci subroutine PGSCI (CI) integer,intent(in) :: CI end subroutine PGSCI end interface interface plot_slw subroutine PGSLW (LW) integer,intent(in) :: lw end subroutine PGSLW module procedure plot_slw_float end interface interface plot_page subroutine pgpage end subroutine pgpage end interface interface plot_close subroutine PGEND end subroutine PGEND end interface interface plot_svp subroutine pgsvp(XLEFT, XRIGHT, YBOT, YTOP) real,intent(in) :: XLEFT, XRIGHT, YBOT, YTOP end subroutine pgsvp end interface interface plot_swin subroutine pgswin(X1, X2, Y1, Y2) real,intent(in) :: X1, X2, Y1, Y2 end subroutine pgswin end interface interface plot_wnad subroutine pgwnad(X1, X2, Y1, Y2) real,intent(in) :: X1, X2, Y1, Y2 end subroutine pgwnad end interface interface plot_qvsz subroutine PGQVSZ (UNITS, X1, X2, Y1, Y2) integer,intent(in) :: UNITS real,intent(out) :: X1, X2, Y1, Y2 end subroutine PGQVSZ end interface interface plot_line subroutine pgline(npts,xline,yline) integer, intent(in) :: npts real, intent(in), dimension(npts) :: xline,yline end subroutine pgline end interface interface plot_box subroutine pgbox(XOPT, XTICK, NXSUB, YOPT, YTICK, NYSUB) character*(*),intent(in) :: XOPT, YOPT real,intent(in) :: XTICK, YTICK integer,intent(in) :: NXSUB, NYSUB end subroutine pgbox end interface interface plot_scr subroutine PGSCR (CI, CR, CG, CB) integer, intent(in) :: CI real, intent(in) :: CR, CG, CB end subroutine pgscr module procedure pgscra end interface interface plot_bins subroutine PGBIN (NBIN, X, DATA, CENTER) integer,intent(in) :: NBIN real,intent(in) :: X(*), DATA(*) LOGICAL,intent(in) :: CENTER end subroutine PGBIN end interface interface plot_imag module procedure plot_imag_transparent end interface interface plot_qcol subroutine pgqcol(icolmin,icolmax) integer,intent(out) :: icolmin,icolmax end subroutine pgqcol end interface interface plot_qcir subroutine pgqcir(icolmin,icolmax) integer,intent(out) :: icolmin,icolmax end subroutine pgqcir end interface interface plot_scir subroutine pgscir(icilo, icihi) integer,intent(in) :: icilo,icihi end subroutine pgscir end interface interface plot_ctab subroutine pgctab(l,r,g,b,nc,contra,bright) integer,intent(in) :: nc real,intent(in) :: l(nc),r(nc),g(nc),b(nc),contra,bright end subroutine pgctab end interface interface plot_qls subroutine pgqls(ls) integer,intent(out) :: ls end subroutine pgqls end interface interface plot_qfs subroutine pgqfs(fs) integer,intent(out) :: fs end subroutine pgqfs end interface interface plot_sls subroutine pgsls(ls) integer,intent(in) :: ls end subroutine pgsls end interface interface plot_sfs subroutine pgsfs(fs) integer,intent(in) :: fs end subroutine pgsfs end interface interface plot_rect subroutine pgrect(x1,x2,y1,y2) real,intent(in) :: x1,x2,y1,y2 end subroutine pgrect module procedure plot_rect_rounded end interface interface plot_arro subroutine pgarro(x1,y1,x2,y2) real,intent(in) :: x1,y1,x2,y2 end subroutine pgarro end interface interface plot_circ subroutine pgcirc(xcent,ycent,radius) real,intent(in) :: xcent,ycent,radius end subroutine pgcirc end interface interface plot_lcur subroutine pglcur (maxpt, npt, x, y) integer, intent(in) :: maxpt integer, intent(inout) :: npt real, intent(inout) :: x(*), y(*) end subroutine pglcur module procedure plot_clcur end interface plot_lcur interface plot_olin subroutine pgolin (maxpt, npt, x, y, symbol) integer, intent(in) :: maxpt integer, intent(inout) :: npt real, intent(inout) :: x(*), y(*) integer, intent(in) :: symbol end subroutine pgolin end interface plot_olin interface plot_ncur subroutine pgncur(maxpt, npt, x, y, symbol) integer, intent(in) :: maxpt integer, intent(inout) :: npt real, intent(inout) :: x(*), y(*) integer, intent(in) :: symbol end subroutine pgncur end interface plot_ncur interface plot_qtxt subroutine pgqtxt(x,y,angle,fjust,text,xbox,ybox) real,intent(in) :: x, y, angle, fjust character(len=*),intent(in) :: text real,intent(out),dimension(4) :: xbox,ybox end subroutine pgqtxt end interface interface plot_ptxt subroutine pgptxt(x,y,angle,fjust,text) real,intent(in) :: x,y,angle,fjust character(len=*),intent(in) :: TEXT end subroutine pgptxt end interface interface plot_stbg subroutine pgstbg(bg) integer,intent(in) :: bg end subroutine pgstbg end interface interface plot_curs ! integer function pgcurs(x,y,ch) ! real,intent(inout) :: x,y ! character*(*),intent(out) :: ch ! end function pgcurs module procedure pgcurs_sub end interface interface plot_pt subroutine pgpt(n,xpts,ypts,symbol) integer,intent(in) :: n real,intent(in) :: xpts(*),ypts(*) integer,intent(in) :: symbol end subroutine pgpt end interface interface plot_funx subroutine pgfunx(fx,n,ymin,ymax,pgflags) real,external :: fx integer,intent(in) :: n,pgflags real,intent(in) :: ymin,ymax end subroutine pgfunx end interface interface plot_label subroutine pglabel(xlbl,ylbl,toplbl) character(len=*),intent(in) :: xlbl,ylbl,toplbl end subroutine pglabel end interface interface plot_scrn subroutine pgscrn(ci,name,ier) integer,intent(in) :: ci character(len=*),intent(in) :: name integer,intent(out) :: ier end subroutine pgscrn end interface interface plot_poly subroutine pgpoly(n,xpts,ypts) integer,intent(in) :: n real,intent(in) :: xpts(*),ypts(*) end subroutine pgpoly end interface interface plot_qinf subroutine pgqinf(item,value,length) character(len=*),intent(in) :: item character(len=*),intent(out) :: value integer,intent(out) :: length end subroutine pgqinf end interface interface plot_band module procedure pgband_sub end interface interface plot_pt1 subroutine pgpt1(xpt,ypt,symbol) real,intent(in) :: xpt,ypt integer,intent(in) :: symbol end subroutine pgpt1 end interface interface plot_numb subroutine pgnumb(m,pp,form,string,nc) integer,intent(in) :: m,pp,form character(len=*),intent(out) :: string integer,intent(out) :: nc end subroutine pgnumb end interface interface plot_qch subroutine pgqch(ch) real,intent(out) :: ch end subroutine pgqch end interface interface plot_text subroutine pgtext(x,y,text) real,intent(in) :: x,y character(len=*),intent(in) :: text end subroutine pgtext end interface interface plot_err1 subroutine pgerr1(dir,x,y,e,t) integer,intent(in) :: dir real,intent(in) :: x,y,e real,intent(in) :: t end subroutine pgerr1 end interface interface plot_errb subroutine pgerrb(dir,n,x,y,e,t) integer,intent(in) :: dir,n real,intent(in) :: x(n),y(n),e(n) real,intent(in) :: t end subroutine pgerrb end interface interface plot_conb subroutine pgconb(a,idim,jdim,i1,i2,j1,j2,c,nc,tr,blank) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,nc real,intent(in) :: a(idim,jdim),c(*),tr(6),blank end subroutine pgconb end interface interface plot_cons subroutine pgcons(a,idim,jdim,i1,i2,j1,j2,c,nc,tr) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,nc real,intent(in) :: a(idim,jdim),c(*),tr(6) end subroutine pgcons end interface interface plot_conl subroutine pgconl(a,idim,jdim,i1,i2,j1,j2,c,tr,label,intval,mininit) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,intval,mininit real,intent(in) :: a(idim,jdim),c,tr(6) character(len=*),intent(in) :: label end subroutine pgconl end interface interface plot_sah subroutine pgsah(fs, angle, cutback) integer, intent(in) :: fs real, intent(in) :: angle, cutback end subroutine pgsah end interface interface plot_vect subroutine pgvect(a,b,idim,jdim,i1,i2,j1,j2,c,nc,tr,blank) integer,intent(in) :: idim,jdim,i1,i2,j1,j2,nc real,intent(in) :: a(idim,jdim),b(idim,jdim),tr(6),blank,c end subroutine pgvect end interface interface plot_pixl subroutine pgpixl(ia,idim,jdim,i1,i2,j1,j2,x1,x2,y1,y2) integer,intent(in) :: idim,jdim,i1,i2,j1,j2 integer,intent(in) :: ia(idim,jdim) real,intent(in) :: x1,x2,y1,y2 end subroutine pgpixl end interface interface plot_env subroutine pgenv(xmin,xmax,ymin,ymax,just,axis) real,intent(in) :: xmin,xmax,ymin,ymax integer,intent(in) :: just,axis end subroutine pgenv end interface contains !--------------------------------------------- ! initialise the plotting library !--------------------------------------------- subroutine plot_init(devicein, ierr, papersizex, aspectratio, paperunits) character*(*), intent(in) :: devicein integer, intent(out) :: ierr real, intent(in), optional :: papersizex,aspectratio integer, intent(in), optional :: paperunits integer :: pgopen real :: aspect if (devicein(1:1)=='?') then call pgbegin(0,'?',1,1) ierr = 1 else ierr = pgopen(devicein) endif !--check if there is an error ! (be careful here: from PGPLOT zero or -ve indicates an error) if (ierr <= 0) then if (ierr==0) ierr = -1 !--make sure we return an error return else ierr = 0 endif !-- Turn off promting call pgask(.false.) !-- set paper size if given if (present(papersizex)) then if (present(aspectratio)) then aspect = aspectratio else aspect = sqrt(2.) endif if (present(paperunits)) then !--make sure that the units are in inches for PGPLOT if (paperunits /= 1) return endif call plot_pap(papersizex,aspect) endif end subroutine plot_init subroutine plot_slc(lc) integer,intent(in) :: lc !--line cap has no effect in PGPLOT end subroutine plot_slc subroutine plot_pap(width,aspect,paperunits) real,intent(in) :: width,aspect integer, intent(in), optional :: paperunits if (present(paperunits)) then if (paperunits /= 1) print "(a)",' WARNING: units not valid for PGPLOT' endif call pgpap(width,aspect) end subroutine plot_pap subroutine plot_qlc(lc) integer,intent(out) :: lc lc = 0 end subroutine plot_qlc subroutine plot_set_opacity(alpha) real, intent(in) :: alpha !--opacity has no effect in PGPLOT end subroutine plot_set_opacity !--interface to set transparent colour ! (not implemented in PGPLOT) subroutine pgscra (CI, CR, CG, CB, CA) integer, intent(in) :: CI real, intent(in) :: CR, CG, CB, CA !--just throw away the alpha value call PGSCR(CI,CR,CG,CB) end subroutine pgscra !--floating point line widths ! (not implemented in PGPLOT) subroutine plot_slw_float (LW) real,intent(in) :: lw call PGSLW(nint(lw)) end subroutine plot_slw_float subroutine plot_rgb_from_table(frac,r,g,b) real, intent(in) :: frac real, intent(out) :: r,g,b !--rgb from table not implemented in PGPLOT end subroutine plot_rgb_from_table subroutine plot_set_palette(lp) integer, intent(in) :: lp !--set line palette not implemented in PGPLOT end subroutine plot_set_palette logical function plot_qcur() character(len=10) :: string integer :: nc call pgqinf('CURSOR',string,nc) if (string(1:nc)=='YES') then plot_qcur = .true. else plot_qcur = .false. endif end function plot_qcur ! !--inverts the return value of pgcurs ! function pgcurs_sub(x,y,ch) real,intent(inout) :: x,y character*(*),intent(out) :: ch integer :: pgcurs_sub,ierr integer, external :: pgcurs ierr = pgcurs(x,y,ch) if (ierr==0) then pgcurs_sub = 1 else pgcurs_sub = 0 endif end function pgcurs_sub !--transparent rendering does not work in PGPLOT, but ! we give it an interface anyway subroutine plot_imag_transparent(a, idim, jdim, i1, i2, j1, j2, a1, a2, tr, iextend) integer,intent(in) :: IDIM, JDIM, I1, I2, J1, J2 real,intent(in) :: A(IDIM,JDIM), A1, A2, TR(6) integer, intent(in), optional :: iextend call pgimag(a, idim, jdim, i1, i2, j1, j2, a1, a2, tr) end subroutine plot_imag_transparent subroutine plot_imag_alpha(dat, alpha, idim, jdim, i1, i2, j1, j2, a1, a2, tr, iextend) integer,intent(in) :: IDIM, JDIM, I1, I2, J1, J2 real,intent(in) :: dat(IDIM,JDIM), alpha(IDIM,JDIM), A1, A2, TR(6) real :: affine(6) integer, intent(in), optional :: iextend call pgimag(dat, idim, jdim, i1, i2, j1, j2, a1, a2, tr) end subroutine plot_imag_alpha !--giza version of plot_gray takes additional arguments subroutine plot_gray(a, idim, jdim, i1, i2, j1, j2, a1, a2, tr, iextend) integer,intent(in) :: IDIM, JDIM, I1, I2, J1, J2 real,intent(in) :: A(IDIM,JDIM), A1, A2, TR(6) integer, intent(in), optional :: iextend call pggray(a, idim, jdim, i1, i2, j1, j2, a1, a2, tr) end subroutine plot_gray !--version of lcur that returns last character pressed subroutine plot_clcur(maxpt, npt, x, y, ch) integer, intent(in) :: maxpt integer, intent(inout) :: npt real, intent(inout) :: x(*), y(*) character*(*),intent(out) :: ch call pglcur (maxpt, npt, x, y) ch = 'A' end subroutine plot_clcur !--rounded rectangle plotting ! (not implemented -- just calls pgrect) subroutine plot_rect_rounded(x1,x2,y1,y2,r) real,intent(in) :: x1,x2,y1,y2,r call pgrect(x1,x2,y1,y2) end subroutine plot_rect_rounded ! !--inverts the return value of pgband ! function pgband_sub(mode, posn, xref, yref, x, y, ch) integer,intent(in) :: mode, posn real,intent(in) :: xref, yref real,intent(inout) :: x, y character*(*),intent(out) :: ch integer :: ierr,pgband_sub integer,external :: pgband ierr = pgband(mode,posn,xref,yref,x,y,ch) if (ierr==1) then pgband_sub = 0 else pgband_sub = 1 endif end function pgband_sub ! !--this subroutine can be called after PGSVP to ! make sure that the viewport lies exactly on ! pixel boundaries. ! ! Queries PGPLOT routines directly so no need ! for input/output ! subroutine plot_set_exactpixelboundaries() real :: xminpix,xmaxpix,yminpix,ymaxpix real :: vptxmin,vptxmax,vptymin,vptymax real :: dv real, parameter :: tol = 1.e-6 ! ! setting axes adjusts the viewport, so query to get adjusted settings ! call pgqvp(0,vptxmin,vptxmax,vptymin,vptymax) !print*,'got ',vptxmin,vptxmax,vptymin,vptymax ! ! adjust viewport on pixel devices so that ! boundaries lie exactly on pixel boundaries ! ! query viewport size in pixels call pgqvp(3,xminpix,xmaxpix,yminpix,ymaxpix) !print*,' in pixels = ',xminpix,xmaxpix,yminpix,ymaxpix ! work out how many viewport coords/pixel dv = (vptymax - vptymin)/(ymaxpix-yminpix) ! adjust viewport min/max to lie on pixel boundaries vptymin = max((nint(yminpix)-tol)*dv,0.) vptymax = min((nint(ymaxpix)-tol)*dv,1.0-epsilon(1.0)) ! be careful of round-off errors ! same for x dv = (vptxmax - vptxmin)/(xmaxpix-xminpix) vptxmin = max((nint(xminpix)-tol)*dv,0.) vptxmax = min((nint(xmaxpix)-tol)*dv,1.0-epsilon(1.0)) ! be careful of round-off errors ! adjust viewport !print*,'adjusting ',vptxmin,vptxmax,vptymin,vptymax call pgsvp(vptxmin,vptxmax,vptymin,vptymax) !call pgqvp(3,xminpix,xmaxpix,yminpix,ymaxpix) !print*,' in pixels = ',xminpix,xmaxpix,yminpix,ymaxpix return end subroutine plot_set_exactpixelboundaries end module plotlib danieljprice-splash-4d1f09c/src/plotstep.f90000066400000000000000000005642411477365367100210670ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2024 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------ ! ! This is the core routine for the whole code. ! Drives the plotting pipeline, ie. calls all the routines which ! do the work. ! ! I am gradually trying to make this routine more modular... ! !------------------------------------------------------------------------ module timestep_plotting use params, only:maxplot,doub_prec implicit none integer, private :: ninterp integer, private :: iplotx,iploty,iplotz,irender,irenderplot,icontourplot integer, private :: ivectorplot,ivecx,ivecy integer, private :: nyplots,npartdim,nyplotfirstonpage,ifirststeponpage integer, private :: ngrid,nframefirstonpage integer, private :: just,ntitles,nsteplegendlines integer, private :: iplots,ipanel integer, private :: iframesave integer, private :: npixx,npixy,npixz integer, private :: icol_prev = 0 logical, allocatable, private :: use_type_prev(:) real, dimension(:), allocatable, private :: datpix1D, xgrid real, dimension(:,:), allocatable, private :: datpix,datpixcont,brightness,datpixtot real(doub_prec), dimension(:,:,:), allocatable, private :: datpix3D,datpixcont3D real, private :: xmin,xmax,ymin,ymax,zmin real, private :: rendermin,rendermax,vecmax,contmin,contmax real, private :: dz,zslicepos,zobservertemp,dzscreentemp,rkappatemp real, private :: dxgrid,xmingrid,xmaxgrid real, private :: angletempx, angletempy, angletempz !--buffer for interactive mode on multiplots integer, dimension(maxplot) :: iplotxtemp,iplotytemp,irendertemp,icontourtemp,ivecplottemp real, dimension(maxplot) :: xminmulti,xmaxmulti,xminadapt,xmaxadapt real, dimension(maxplot) :: vptxmin,vptxmax,vptymin,vptymax,barwmulti real, private :: xminadapti,xmaxadapti,yminadapti,ymaxadapti,renderminadapt,rendermaxadapt real, private :: contminadapt,contmaxadapt real, private :: xminwas = 0.,xmaxwas = 0.,yminwas = 0.,ymaxwas = 0. real, private :: renderminwas = 0.,rendermaxwas = 0.,contminwas = 0.,contmaxwas = 0. real, parameter, private :: pi = 4.*atan(1.) logical, private :: iplotpart,iplotcont,x_sec,isamexaxis,isameyaxis,iamrendering,idoingvecplot logical, private :: inewpage,tile_plots,lastplot,lastinpanel logical, private :: imulti,irerender,iAllowspaceforcolourbar logical, private :: interactivereplot,ihavesetcolours,vectordevice,gotcontours logical, private :: OneColourBarPerRow,OneColourBarPerColumn public :: initialise_plotting, plotstep private contains ! ! initialise plotting options ! called once for all steps ! subroutine initialise_plotting(ipicky,ipickx,irender_nomulti,icontour_nomulti,ivecplot) use params use colours, only:colour_set use colourbar, only:barisvertical use labels, only:label,ipowerspec,ih,ipmass,irho,ikappa,iamvec,isurfdens, & is_coord,itoomre,iutherm,ipdf,ix,icolpixmap,get_z_dir,& unitslabel,set_required_labels use limits, only:lim,rangeset,limits_are_equal use multiplot, only:multiplotx,multiploty,irendermulti,icontourmulti, & nyplotmulti,x_secmulti,ivecplotmulti use prompting, only:prompt use titles, only:read_titles,read_steplegend use settings_data, only:ndim,ndimV,numplot,ncolumns,ncalc,ndataplots,required, & icoords,icoordsnew,debugmode,ntypes,usetypeinrenderings, & idustfrac_plot,ideltav_plot,device,iRescale use settings_page, only:nacross,ndown,ipapersize,tile,papersizex,aspectratio,& iPageColours,iadapt,iadaptcoords,linewidth,linepalette,nomenu,& interactive,ipapersizeunits,usecolumnorder,colourpalette,maxc use pagecolours, only:set_pagecolours,set_linecolours use settings_part, only:linecolourthisstep,linecolour,linestylethisstep, & linestyle,iexact,iplotpartoftype,ismooth_particle_plots use settings_render, only:icolours,iplotcont_nomulti,iColourBarStyle,icolour_particles use settings_xsecrot, only:xsec_nomulti,xsecpos_nomulti,flythru,nxsec,irotate, & xseclineX1,xseclineX2,xseclineY1,xseclineY2,xsecwidth, & use3Dperspective,use3Dopacityrendering,zobserver,dzscreenfromobserver,rkappafac=>taupartdepth use settings_powerspec, only:options_powerspec,options_pdf use particle_data, only:npartoftype,masstype use projections3D, only:coltable use plotlib, only:plot_init,plot_qcur,plot_slw,plot_env,plot_curs,plot_band, & plot_close,plot_qinf use system_utils, only:renvironment use calcquantities, only:get_calc_data_dependencies use filenames, only:coloursfile use adjustdata, only:get_adjust_data_dependencies integer, intent(in) :: ipicky,ipickx,irender_nomulti,icontour_nomulti,ivecplot integer :: i,j,ifirst,iplotzprev,ilen,ierr,irow,icolumn,ntries logical :: iadapting,icoordplot,iallrendered,ians,iall_coord_plots,isamelimits real :: hav,pmassav,dzsuggest integer, dimension(:), allocatable :: ifirstinrow,ifirstincolumn character(len=1) :: char character(len=120) :: devstring character(len=30) :: string !------------------------------------------------------------------------ ! initialisations ! should initialise all saved variables here !------------------------------------------------------------------------ isamexaxis = .true. ! same x axis on all plots? (only relevant for >1 plots per page) isameyaxis = .true. ! same y axis on all plots? tile_plots = .false. iplots = 0 ! counter for how many plots have been plotted in total ipanel = 0 ! counter for which panel we are in on plotting page irender = 0 irenderplot = 0 ivectorplot = 0 x_sec = xsec_nomulti iplotcont = iplotcont_nomulti lastplot = .false. iplotpart = .true. irerender = .false. interactivereplot = .false. nyplotfirstonpage = 1 ! should be unnecessary, but to be on the safe side ifirststeponpage = 1 ! again, should be unnecessary nframefirstonpage = 1 iplotxtemp(:) = 1 ! this is just to be safe, so any spurious array access iplotytemp(:) = 2 ! does not give an out-of-bounds error irendertemp(:) = 0 ivecplottemp(:) = 0 xmin = 0. xmax = 0. ymin = 0. ymax = 0. rendermin = 0. rendermax = 0. contmin = 0. contmax = 0. vecmax = 0. xminadapt = huge(xminadapt) xmaxadapt = -huge(xmaxadapt) renderminadapt = huge(renderminadapt) rendermaxadapt = -huge(rendermaxadapt) contminadapt = huge(contminadapt) contmaxadapt = -huge(contmaxadapt) if (ndim==1) x_sec = .false. ! can't have xsec in 1D nxsec = 1 iamrendering = .false. idoingvecplot = .false. if (ipicky==numplot+1) then ! multiplot imulti = .true. nyplots = nyplotmulti iplotx = 0 ! set these to zero by default for multiplots iploty = 0 ! (they should not be used in that case) ! !--if doing multiplot can only take a single cross section slice ! flythru = .false. nxsec = 1 ! !--work out whether to tile plots and make labelling decisions ! if (any(multiplotx(1:nyplotmulti) /= multiplotx(1))) isamexaxis = .false. if (any(multiploty(1:nyplotmulti) /= multiploty(1))) then isameyaxis = .false. if (any(multiploty(1:nyplotmulti)==icolpixmap)) then isameyaxis = .true. do i=1,nyplotmulti if (.not.(multiploty(i)==icolpixmap .or. multiploty(i)==multiploty(1))) isameyaxis = .false. enddo endif endif if (any(irendermulti(1:nyplotmulti) > 0)) iamrendering = .true. if (any(x_secmulti(1:nyplotmulti))) x_sec = .true. if (any(ivecplotmulti(1:nyplotmulti) > 0)) idoingvecplot = .true. else ! !--or else set number of plots = 1 and use ipicky and ipickx ! imulti = .false. nyplots = 1 iploty = ipicky iplotx = ipickx if (irender_nomulti > 0) iamrendering = .true. if (ivecplot > 0) idoingvecplot = .true. endif !------------------------------------------------------------------------ ! initialise options to be set before plotting ! !--determine z coordinate for 3D plots ! icoordplot = is_coord(iploty,ndim) .and. is_coord(iplotx,ndim) iallrendered = iamrendering isamelimits = .true. iall_coord_plots = icoordplot iplotz = 0 if (imulti) then iall_coord_plots = .true. do i=1,nyplotmulti if (is_coord(multiplotx(i),ndim) .and. is_coord(multiploty(i),ndim)) then icoordplot = .true. !--this check is to see if any co-ordinate plots involve just particles ! (if so need to initialise the cross section slice width) if (irendermulti(i) <= 0) iallrendered = .false. iplotzprev = iplotz !!--work out coordinate that is not being plotted on cross-section/ 3D plots iplotz = 0 if (ndim >= 3 .and. (x_sec .or. use3Dperspective .or. irotate)) then iplotz = get_z_dir(ndim,multiplotx(i),multiploty(i)) !--use only first iplotz in the case of multiple slices ! (only effect is on default values for slice thickness etc below) if (iplotzprev > 0) iplotz = iplotzprev endif else iall_coord_plots = .false. endif enddo if (iall_coord_plots) isamelimits = limits_are_equal(nyplotmulti,multiplotx,multiploty) elseif (icoordplot) then !!--work out coordinate that is not being plotted if (ndim >= 3) then do j=1,ndim if ((iplotx /= iploty).and. & (ix(j) /= iplotx).and.(ix(j) /= iploty)) iplotz = ix(j) enddo endif endif if (debugmode) print*,'DEBUG: iplotz = ',iplotz ! !--work out whether or not to tile plots on the page ! if plots are coord plots, make tiling decisions based on iadaptcoords ! otherwise use iadapt ! if (icoordplot) then iadapting = iadaptcoords else iadapting = iadapt endif tile_plots = tile .and. (isamexaxis.and.isameyaxis .or. isameyaxis.and.ndown==1 & .or. isamexaxis.and.nacross==1 & .or. (iall_coord_plots .and. isamelimits)) .and. (nacross*ndown > 1) !--do not tile if limits are adaptive if (tile_plots .and. (iadapting .or. (iamrendering .and. iadapt .and. iColourbarStyle > 0))) then print "(a)",'WARNING: cannot tile plots because limits are set to adaptive' tile_plots = .false. elseif (.not. tile_plots .and. iall_coord_plots .and. nacross*ndown > 1 .and. .not.isamelimits) then print "(a)",'WARNING: cannot tile plots because x-y limits are different' endif !--( a further constraint on plot tiling is required in the case of ! multiple renderings which would involve different colour bars ) OneColourBarPerRow = .false. OneColourBarPerColumn = .false. if (iamrendering .and. icolours /= 0 .and. iColourbarStyle > 0) then !--this option means that a margin is set aside for a colour bar on tiled plots iAllowspaceforcolourbar = .true. !--do not allow tiled plots if multiple (different) colour bars are plotted if (tile_plots) then ifirst = 0 do i=1,nyplots if (irendermulti(i) > 0 .and. ifirst==0) ifirst = i if (ifirst > 0) then if (irendermulti(i) > 0 .and. irendermulti(i) /= irendermulti(ifirst)) then tile_plots = .false. endif endif enddo !--this means colour bars are not the same, but we can still tile if ! all the colour bars in each row are the same if (.not.tile_plots .and. mod(nacross*ndown,nyplots)==0) then ! only allow a single colour bar at end of row if the ! colour bar is plotted in the correct orientation OneColourBarPerRow = barisvertical(iColourBarStyle) OneColourBarPerColumn = .not.barisvertical(iColourBarStyle) allocate(ifirstinrow(ndown),ifirstincolumn(nacross)) ifirstinrow(:) = 0 ifirstincolumn(:) = 0 do i=1,nyplots if (usecolumnorder) then irow = (i-1)/nacross + 1 icolumn = i - ((i-1)/nacross)*nacross else irow = i - ((i-1)/ndown)*ndown icolumn = (i-1)/ndown + 1 endif if (ifirstinrow(irow)==0) ifirstinrow(irow) = i if (ifirstincolumn(icolumn)==0) ifirstincolumn(icolumn) = i if (irendermulti(i) /= irendermulti(ifirstinrow(irow))) then OneColourBarPerRow = .false. endif if (irendermulti(i) /= irendermulti(ifirstincolumn(icolumn))) then OneColourBarPerColumn = .false. endif enddo deallocate(ifirstinrow,ifirstincolumn) if (OneColourBarPerRow .or. OneColourBarPerColumn) tile_plots = .true. endif if (.not.tile_plots) print "(a)",'WARNING: cannot tile plots because of multiple colour bars' endif else iAllowspaceforcolourbar = .false. endif if (icoordplot) then if (x_sec .and. iplotz > 0) then ! !--if series of cross sections (flythru), set position of first one ! if (flythru) then nxsec = 10 if (.not.nomenu) call prompt(' enter number of '//trim(label(iplotz))// & ' cross-section slices',nxsec) !!--dz is the distance between slices dz = (lim(iplotz,2)-lim(iplotz,1))/float(nxsec) zslicepos = lim(iplotz,1) - 0.5*dz xsecpos_nomulti = zslicepos else ! !--if single cross-section, read position of cross-section slice ! if (.not.imulti) then !--make sure position falls within the limits if (xsecpos_nomulti < lim(iplotz,1) & .or. xsecpos_nomulti > lim(iplotz,2)) then xsecpos_nomulti = (lim(iplotz,2)+lim(iplotz,1))/2. endif if (.not.nomenu) call prompt(' enter '//trim(label(iplotz))// & ' position for cross-section slice:', & xsecpos_nomulti,lim(iplotz,1),lim(iplotz,2)) endif ! !--set thickness if plotting particles ! (default thickness is half of the average particle spacing) ! if (.not.iallrendered .or. icolour_particles) then if (xsecwidth > 0. .and. xsecwidth < (lim(iplotz,2)-lim(iplotz,1))) then !--already set dzsuggest = xsecwidth else !--xsecwidth not set; suggest a good value npartdim = int(maxval(npartoftype(:,1))**(1./real(ndim))) print*,'average # of particles in each dimension = ',npartdim if (npartdim > 0) then dzsuggest = (lim(iplotz,2)-lim(iplotz,1))/float(npartdim) else dzsuggest = 0.01*(lim(iplotz,2)-lim(iplotz,1)) endif endif dz = dzsuggest if (.not.nomenu) then if (imulti) then call prompt(' enter thickness for cross section slice(s):', & dz,0.0,lim(iplotz,2)-lim(iplotz,1)) else call prompt(' enter thickness of cross section slice:', & dz,0.0,lim(iplotz,2)-lim(iplotz,1)) endif endif !--if dz has been set from the prompt, save the setting, ! otherwise suggest (possibly different) value again next time if (abs(dz-dzsuggest) > tiny(dz)) xsecwidth = dz elseif (ndim==3) then ! !--for rendered cross sections in 3D, set thickness to 10% ! this is the distance slices are moved up and down in interactive mode ! dz = 0.1*(lim(iplotz,2)-lim(iplotz,1)) endif endif ! flythru or single ! !--set up for 1D cross sections through 2D data ! elseif (ndim==2 .and. x_sec) then ians = .false. if (.not.nomenu) call prompt('set cross section position interactively?',ians) if (ians) then ! !--set cross section position interactively ! call plot_init('/xw',ierr) call plot_env(lim(1,1),lim(1,2),lim(2,1),lim(2,2),1,0) ierr = plot_curs(xseclineX1,xseclineY1,char) print*,'please select cross section line' ierr = plot_band(1,1,xseclineX1,xseclineY1,xseclineX2,xseclineY2,char) print*,'cross section line: xmin = ',xseclineX1,' xmax = ',xseclineX2 print*,' ymin = ',xseclineY1,' ymax = ',xseclineY2 call plot_close else ! !--set position manually ! if (abs(xseclineX2-xseclineX1) < 1.e-5 .and. & abs(xseclineY2-xseclineY1) < 1.e-5) then !--if not already set (ie. if all = 0.0) ! then set default line to diagonal across the domain xseclineX1 = lim(1,1) xseclineX2 = lim(1,2) xseclineY1 = lim(2,1) xseclineY2 = lim(2,2) endif if (.not.nomenu) then print*,'enter position of cross section through 2D data:' call prompt('enter xmin of cross section line',xseclineX1) call prompt('enter xmax of cross section line',xseclineX2) call prompt('enter ymin of cross section line',xseclineY1) call prompt('enter ymax of cross section line',xseclineY2) endif endif endif if (iplotz > 0) then ! !--initialise 3D perspective ! if (use3Dperspective) then !--set default values if none set if (abs(zobserver) < tiny(zobserver)) zobserver = 10.*lim(iplotz,2) if (abs(dzscreenfromobserver) < tiny(dzscreenfromobserver)) dzscreenfromobserver = zobserver if (.not.nomenu) call prompt('enter z coordinate of observer ',zobserver) dzscreenfromobserver = zobserver endif ! call prompt('enter distance for unit magnification ',dzscreenfromobserver,0.) ! !--initialise opacity for 3D opacity rendering if it is not found as a data column (ikappa > 0) ! if (use3Dopacityrendering .and. (iamrendering .or. idoingvecplot)) then hav = lim(ih,2) !! 0.5*(lim(ih,2) + lim(ih,1)) if (ipmass > 0) then pmassav = lim(ipmass,1) if (pmassav <= epsilon(hav)) pmassav = 0.5*lim(ipmass,2) ! take 0.5*max if min is zero else ! handle case where mass is not a data column pmassav = maxval(masstype) do i=1,ntypes if (iplotpartoftype(i) .and. usetypeinrenderings(i) & .and. any(masstype(i,:) > 0.)) pmassav = min(pmassav,maxval(masstype(i,:))) enddo endif if (ikappa > 0) then if (rkappafac <= 0.) rkappafac = 1.0 if (.not.nomenu) call prompt('Enter opacity scaling factor ',rkappafac) else string = '[code units]' if (iRescale) string = trim(unitslabel(ih))//'^2 / '//trim(unitslabel(ipmass)) if (.not.nomenu) print "(a,es10.3,a)",' suggested value for kappa: ',pi*hav*hav/(pmassav*coltable(0)),trim(string) if (rkappafac <= 0.) rkappafac = pi*hav*hav/(pmassav*coltable(0)) if (.not.nomenu) call prompt('enter kappa (in current units)',rkappafac) endif endif endif endif !!--prompt for options if plotting power spectrum if (iploty==ipowerspec .and. .not. imulti & .or. (imulti.and.any(multiploty(1:nyplotmulti)==ipowerspec))) then call options_powerspec endif !!--prompt for options if plotting PDFs if (iploty==ipdf .and. .not. imulti & .or. (imulti.and.any(multiploty(1:nyplotmulti)==ipdf))) then call options_pdf endif !!--for fast data read, set which columns are required from the file ! (note that required(0)= whatever is a valid statement, just has no effect) required = .false. ! by default, no columns required if (debugmode) print*,'DEBUG: imulti = ',imulti,' iamrendering = ',iamrendering ! if (fastdataread) then if (imulti) then required(multiplotx(1:nyplotmulti)) = .true. required(multiploty(1:nyplotmulti)) = .true. required(irendermulti(1:nyplotmulti)) = .true. required(icontourmulti(1:nyplotmulti)) = .true. else if (iploty /= icolpixmap) required(iplotx) = .true. required(iploty) = .true. endif required(iplotz) = .true. if ((iamrendering .or. idoingvecplot) .and. & (iploty /= icolpixmap .or. imulti .or. iploty==0)) then required(ipmass) = .true. required(irho) = .true. required(ih) = .true. required(irender_nomulti) = .true. required(icontour_nomulti) = .true. if (use3Dopacityrendering) required(ikappa) = .true. endif !!--need to read columns used for range restrictions do i=1,ndataplots if (rangeset(i)) required(i) = .true. enddo !!--need mass for some exact solutions if (iexact==7 .or. iploty==isurfdens) required(ipmass) = .true. if (iploty==itoomre .and. iploty > 0) required(iutherm) = .true. !!--only require actual dependencies of calculated quantities if (any(required(ncolumns+1:ncolumns+ncalc))) call get_calc_data_dependencies(required) !if (any(required(ncolumns+1:ncolumns+ncalc))) required = .true. !!--vectors if (imulti) then do i=1,nyplotmulti if (ivecplotmulti(i) > 0) then required(ivecplotmulti(i):ivecplotmulti(i)+ndimV-1) = .true. endif enddo elseif (ivecplot > 0) then required(ivecplot:ivecplot+ndimV-1) = .true. endif !!--if geometry is not default must read all coords !! and if we are plotting a vector component, all components if (icoordsnew /= icoords) then required(ix(1:ndim)) = .true. if (iplotx > 0 .and. iplotx <= numplot) then if (iamvec(iplotx) > 0) required(iamvec(iplotx):iamvec(iplotx)+ndimV-1) = .true. endif if (iploty > 0 .and. iploty <= numplot) then if (iamvec(iploty) > 0) required(iamvec(iploty):iamvec(iploty)+ndimV-1) = .true. endif endif call get_adjust_data_dependencies(required) call set_required_labels(required) if (debugmode) print*,'DEBUG: required(1:ncolumns) = ',required(1:ncolumns+ncalc) !!--read step titles (don't need to store ntitles for this) nsteplegendlines = 0 call read_steplegend(nsteplegendlines) !!--read plot titles ntitles = 0 call read_titles(ntitles) !!------------------------------------------------------------------------ !! initialise the plotting library if (len_trim(device) <= 0) then devstring = '?' ! prompt for device else devstring = trim(device) ! device specified on command line endif ierr = 1 ntries = 0 do while(ierr /= 0) ntries = ntries + 1 if (ipapersize > 0 .and. papersizex > 0.0 .and. aspectratio > 0.0 ) then call plot_init(trim(devstring),ierr,papersizex,aspectratio,ipapersizeunits) else call plot_init(trim(devstring),ierr) ! use default paper size endif !--abort if device specified on command line returns an error if (len_trim(device) > 0 .and. ierr /= 0) then ! -ve indicates an error print "(a)",' ERROR: unknown device "'//trim(device)//'"' stop endif if (ierr /= 0) print "(a)",' ERROR opening plotting device' if (ntries > 10) return device='' ! reset the device after first time enddo !--query whether or not device is interactive if (plot_qcur()) then !--turn menu and interactive mode on if ! interactive device invoked from the command line if (nomenu) then interactive = .true. nomenu = .false. endif !--smoothing length is required if interactive device and coordinate plot if (icoordplot) required(ih) = .true. endif ! set line palette call set_linecolours(linepalette,coloursfile,maxc,colourpalette) !!--set background/foreground colours call set_pagecolours(iPageColours) !!--set colour table ! do this regardless of whether rendering or not if ((iamrendering .and. icolours /= 0) .or. (ismooth_particle_plots > 0)) then call colour_set(icolours) ihavesetcolours = .true. else ihavesetcolours = .false. endif !!--determine whether or not the device is vector or not ! this affects the choice of line with (if auto line width is used -- see below) ! and also the automatic resolution determination (should not apply to vector devices) ! call plot_qinf('TYPE',devstring,ilen) select case(devstring(1:ilen)) case('PS','CPS','VPS','VCPS','NULL','LATEX') vectordevice = .true. case default vectordevice = .false. end select !!--set line width (0=auto based on whether device is vector or not) if (linewidth <= 0) then if (vectordevice) then print "(a)",' setting line width = 2 for '//devstring(1:ilen)//' device' call plot_slw(2) else call plot_slw(1) endif else call plot_slw(linewidth) endif linecolourthisstep = linecolour linestylethisstep = linestyle end subroutine initialise_plotting !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Internal subroutines !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine plotstep(ipos,istep,istepsonpage,irender_nomulti,icontour_nomulti,ivecplot, & iamtype,npartoftype,masstype,dat,timei,gammai,headervalsi,ipagechange,iadvance) use params, only:int1,maxparttypes,doub_prec,maxhdr use colours, only:colour_set use filenames, only:nsteps,rootname,ifileopen,tagline use exact, only:exact_solution,atstar,ctstar,& sigma,iPlotExactOnlyOnPanel use toystar1D, only:exact_toystar_ACplane use toystar2D, only:exact_toystar_ACplane2D use labels, only:label,shortlabel,labelvec,iamvec,lenlabel, & lenunitslabel,ih,irho,ipmass,ix,iacplane, & ipowerspec,isurfdens,itoomre,ispsound,iutherm, & ipdf,icolpixmap,is_coord,labeltype, & labelzintegration,unitslabel,integrate_label, & get_sink_type,get_unitlabel_coldens,ikappa,& check_for_shifted_column,labelorig use limits, only:lim,get_particle_subset,lim2,lim2set use multiplot, only:multiplotx,multiploty,irendermulti,ivecplotmulti, & itrans,icontourmulti,x_secmulti,xsecposmulti,& iusealltypesmulti,iplotpartoftypemulti use particle_data, only:maxpart,maxcol,icolourme use settings_data, only:numplot,ndataplots,icoords,icoordsnew,ndim,ndimV,& nfreq,iRescale,iendatstep,ntypes,& UseTypeInRenderings,track_string,& required,ipartialread,xorigin,lowmemorymode,& debugmode,iverbose use settings_limits, only:iadapt use settings_part, only:iexact,iplotpartoftype,imarktype,PlotOnRenderings,UseTypeInContours, & iplotline,linecolourthisstep,linestylethisstep,ifastparticleplot, & iploterrbars,ilocerrbars,ismooth_particle_plots,mstari use settings_page, only:nacross,ndown,interactive,iaxis,usesquarexy,yscalealt,labelyalt, & charheight,iPlotTitles,vpostitle,hpostitle,fjusttitle,nstepsperpage use settings_render, only:npix,ncontours,icolours,iColourBarStyle,icolour_particles,& inormalise_interpolations,ifastrender,ilabelcont,double_rendering,& projlabelformat,iapplyprojformat,exact_rendering use settings_vecplot, only:npixvec,iplotpartvec use settings_xsecrot, only:nxsec,irotateaxes,xsec_nomulti,irotate, & flythru,use3Dperspective,use3Dopacityrendering,& anglex,angley,anglez,zobserver,& dzscreenfromobserver,rkappafac=>taupartdepth,xsecpos_nomulti, & xseclineX1,xseclineX2,xseclineY1,xseclineY2, & nseq,nframes,getsequencepos,insidesequence,rendersinks use settings_powerspec, only:nfreqspec,freqmin,freqmax,ipowerspecx,ipowerspecy,& idisordered,npdfbins use settings_units, only:units,units_calc,unitzintegration ! !--subroutines called from this routine ! use colourparts use transforms, only:transform,transform_limits,transform_label, & transform_inverse,islogged use interactive_routines use part_utils, only:get_tracked_particle,locate_first_two_of_type,& get_binary,locate_nth_particle_of_type,get_itrackpart use particleplots, only:particleplot,plot_errorbarsx,plot_errorbarsy use powerspectrums, only:powerspectrum use interpolation, only:get_n_interp use interpolations1D, only:interpolate1D use interpolations2D, only:interpolate2D,interpolate2D_xsec,& interpolate2D_pixels use interpolations3D, only:interpolate3D use projections3D, only:interpolate3D_projection use projections3Dgeom, only:interpolate3D_proj_geom,interpolate3D_xsec_geom use interpolate3D_opacity, only:interp3D_proj_opacity use xsections3D, only:interpolate3D_fastxsec,interpolate3D_xsec_vec use render, only:render_pix,set_transparency use pagesetup, only:redraw_axes use disc, only:disccalc,discplot use exactfromfile, only:exact_fromfile use exact, only:iexact_rochelobe,use_sink_data,iPlotExactUnder,exact_set_rocheparam use write_pixmap, only:iwritepixmap,writepixmap,readpixmap use pdfs, only:pdf_calc,pdf_write use plotutils, only:plotline use geometry, only:coord_is_length use geomutils, only:changecoords,changeveccoords use legends, only:ipanelselect use asciiutils, only:string_delete use system_utils, only:get_command_flag use plotlib, only:plot_sci,plot_page,plot_sch,plot_qci,plot_qls,& plot_sls,plot_line,plot_pt1,plotlib_is_pgplot integer, intent(inout) :: ipos,istepsonpage,irender_nomulti integer, intent(in) :: istep,icontour_nomulti,ivecplot integer(kind=int1), dimension(:), intent(in) :: iamtype integer, dimension(maxparttypes), intent(in) :: npartoftype real, dimension(maxparttypes), intent(in) :: masstype real, dimension(:,:), intent(in) :: dat real, intent(in) :: timei,gammai real, dimension(maxhdr), intent(in) :: headervalsi logical, intent(in) :: ipagechange integer, intent(inout) :: iadvance logical, dimension(maxparttypes) :: iusetype integer :: ntoti,iz,iseqpos,itrackpart integer :: i,j,k,icolumn,irow,ix_map,iy_map,iz_map,irender_map,icontour_map integer :: nyplot,nframesloop integer :: irenderpart,icolours_temp integer :: npixyvec,nfreqpts,ipixxsec integer :: icolourprev,linestyleprev integer :: ierr,ipt,nplots,nyplotstart,nyplotend,iaxisy,iaxistemp,icol integer :: ivectemp,iamvecx,iamvecy,itransx,itransy,itemp integer :: iframe,isize,isinktype,isink1,isink2,itrackoffset,itracktype real, parameter :: tol = 1.e-10 ! used to compare real numbers real, parameter :: error_in_log = -666. ! magic number used to flag error with log(0.) real(doub_prec) :: unit_mass,unit_dens,unit_r,unit_u,unit_dz real, dimension(:), allocatable :: xplot,yplot,zplot real, dimension(:), allocatable :: hh,weight real, dimension(:), allocatable :: renderplot,contourplot real, dimension(:,:), allocatable :: vecplot real, dimension(:), allocatable :: rkappa real :: zslicemin,zslicemax,dummy,pmassmin,pmassmax,pmassav(1) real :: pixwidth,pixwidthy,pixwidthvec,pixwidthvecy,dxfreq,densmax character(len=lenlabel+lenunitslabel) :: labelx,labely,labelz,labelrender,labelvecplot,labelcont character(len=lenunitslabel) :: labeltimeunits,labelvecunits character(len=12) :: string logical :: iPlotColourBar,rendering,inormalise,logged,loggedcont logical :: dumxsec,isetrenderlimits,isetvectorlimits,iscoordplot,inorm_label,plot_exact logical :: ichangesize,initx,inity,initz,isameweights,got_h logical, parameter :: isperiodicx = .false. ! feature not implemented logical, parameter :: isperiodicy = .false. ! feature not implemented logical, parameter :: isperiodicz = .false. ! feature not implemented logical, dimension(maxparttypes) :: PlotonRender_tmp 34 format (25(' -')) !--set labels to blank (just in case) labelx = ' ' labely = ' ' labelz = ' ' labelrender = ' ' labelvecplot = ' ' use_type_prev = UseTypeInRenderings(:) ! allocate memory use_type_prev = .false. ! set to false ! !--allocate temporary memory required for plotting ! isize = max(maxpart,2000) !--do not allocate the temporary arrays if the dat array has not been allocated if (lowmemorymode .and. maxcol==0) then isize = 2000 endif if (debugmode) print*,'DEBUG: in plotstep, allocating local memory...' ierr = 0 allocate(xplot(isize),stat=ierr) if (ierr /= 0) stop 'out of memory in plotstep allocating temporary x array' allocate(yplot(isize),stat=ierr) if (ierr /= 0) stop 'out of memory in plotstep allocating temporary y array' allocate(zplot(isize),stat=ierr) if (ierr /= 0) stop 'out of memory in plotstep allocating temporary z array' if (allocated(xplot)) xplot = 0. if (allocated(yplot)) yplot = 0. if (allocated(zplot)) zplot = 0. allocate(hh(maxpart),weight(maxpart),renderplot(maxpart),stat=ierr) if (ierr /= 0) stop 'out of memory in plotstep allocating temporary h,weight arrays' hh = 0. if (debugmode) print*,'DEBUG: in plotstep, allocated local memory successfully' dummy = 0. labeltimeunits = ' ' dumxsec = .false. isetrenderlimits = .false. isetvectorlimits = .false. k = nxsec ! matters for lastplot in page_setup for non-coord plots if (iReScale) labeltimeunits = unitslabel(0) iaxistemp = iaxis !--set the arrays needed for rendering if they are present if (ih > 0 .and. ih <= ndataplots .and. (required(ih) .or. .not.ipartialread)) then hh(:) = dat(:,ih) got_h = .true. else got_h = .false. endif if (ipmass > 0 .and. ipmass <= ndataplots) then if (required(ipmass)) then pmassmin = minval(dat(:,ipmass)) pmassmax = maxval(dat(:,ipmass)) else pmassmin = 0. pmassmax = 0. endif else pmassmin = minval(masstype,mask=(masstype > 0.)) pmassmax = maxval(masstype) pmassav = masstype(1) if (pmassav(1) <= 0.) then do i=ntypes,2,-1 if (UseTypeInRenderings(i) .and. iplotpartoftype(i) .and. masstype(i) > 0.) then pmassav = masstype(i) endif enddo endif endif ! !--set number of particles to use in the interpolation routines ! (by default, only the gas particles) ! ntoti = sum(npartoftype) ninterp = get_n_interp(ntypes,npartoftype,UseTypeInRenderings,iplotpartoftype,size(iamtype),& (use3Dopacityrendering .and. rendersinks)) !--work out the identity of a particle being tracked if (debugmode) print*,'DEBUG: track_string = ',track_string itrackpart = get_tracked_particle(track_string,npartoftype,iamtype,dat,irho) if (itrackpart == 0) then call get_itrackpart(track_string,itracktype,itrackoffset,ierr) write(string,"(i12)") itrackoffset string = adjustl(string) if (itracktype > 0 .and. itracktype <= ntypes) then print "(/,a,/)",' WARNING: tracked '//trim(labeltype(itracktype))//' particle #'//trim(string)//' not found in data' elseif (itrackoffset > 0) then print "(/,a,/)",' WARNING: tracked particle #'//trim(string)//' not found in data' endif else write(string,"(i12)") itrackpart if (itrackpart > ntoti) then print "(/,a,/)",' WARNING: tracked particle #'//trim(adjustl(string))//' not found in data' else print "(/,a,/)",' Tracking particle #'//trim(adjustl(string)) endif endif !--non-SPH particle types cannot be used in contours where (.not.UseTypeInRenderings(:)) UseTypeInContours(:) = .false. end where !--check for consistency that if particles are not plotted, ! they are also not plotted on renderings do i=1,ntypes if (.not.iplotpartoftype(i)) PlotOnRenderings(i) = .false. enddo ! !--check whether or not the particle types used for contouring are ! the same as the particle types used for rendering ! isameweights = .true. do i=1,ntypes if (UseTypeInRenderings(i) .and. & .not.(iplotpartoftype(i).eqv.UseTypeInContours(i))) isameweights = .false. enddo !--set the colour table if it has not been set and particles have been coloured previously if (.not.ihavesetcolours) call colour_set(icolours) ! !--exclude subset of particles if parameter range restrictions are set ! call get_particle_subset(icolourme,dat,ndataplots) ! !--add a loop over frames for animation sequences ! but only generate extra frames if we are inside a sequence ! iseqpos = (ipos-1)/(nacross*ndown) + 1 !print*,' iseqpos = ',iseqpos,ipos iframe = 0 if (nseq > 0 .and. insidesequence(iseqpos)) then if (nacross*ndown==1) then nframesloop = nframes else nframesloop = max(iframesave+1,1) iframe = iframesave !print*,'iframe=',iframesave,'iseqpos = ',iseqpos,insidesequence(iseqpos) endif else nframesloop = 1 endif if (debugmode) print*,'DEBUG: starting frame loop...' !--loop over frames: flexible to allow forwards/backwards in interactive mode over_frames: do while (iframe < nframesloop) if (interactivereplot .and. ipos==ifirststeponpage .and. iframe==0) then iframe = min(nframefirstonpage,nframesloop) else iframe = iframe + 1 endif !print*,'iframe = ',iframe, ipagechange,nstepsperpage !--sanity check on frame number, should never happen... if (iframe==0) then print*,' Internal error in iframe, setting to 1 ' iframe = 1 endif !------------------------------------- ! loop over plots per timestep ! (jump to first on the page if replotting in interactivemode) !------------------------------------- if (interactivereplot .and. ipos==ifirststeponpage .and. iframe==nframefirstonpage) then nyplotstart = nyplotfirstonpage ipanel = 0 else nyplotstart = 1 endif ! if multiple steps per page + multiplot and the panels do not match the page ! try to handle this nicely (currently by just ending the multiplot early) if (nstepsperpage > 1 .and. (nyplots-nyplotstart+1) > nacross*ndown) then nyplotend = nyplotstart + nacross*ndown - 1 else nyplotend = nyplots endif over_plots: do nyplot=nyplotstart,nyplotend if (nyplot > 1 .or. iframe > 1) print 34 !--make sure character height is set correctly call plot_sch(charheight) ! in PGPLOT scaled units iPlotColourBar = .false. ! should be false by default until set to true iaxistemp = iaxis !--set current x, y, render and vector plot from multiplot array if (imulti) then iploty = multiploty(nyplot) iplotx = multiplotx(nyplot) irender = irendermulti(nyplot) ivectorplot = ivecplotmulti(nyplot) icontourplot = icontourmulti(nyplot) iplotcont = .false. !iplotcontmulti(nyplot) x_sec = x_secmulti(nyplot) zslicepos = xsecposmulti(nyplot) if (iusealltypesmulti(nyplot)) then iusetype(:) = iplotpartoftype(:) else iusetype(:) = iplotpartoftypemulti(:,nyplot) endif else if (.not.interactivereplot) irender = irender_nomulti ivectorplot = ivecplot icontourplot = icontour_nomulti iplotcont = .false. !iplotcont_nomulti if (.not.interactivereplot) x_sec = xsec_nomulti if (.not.interactivereplot .and. x_sec) zslicepos = xsecpos_nomulti iusetype(:) = iplotpartoftype(:) endif !--if the contour plot is the same as the rendered plot, ! do not interpolate twice. Instead simply plot the contours ! of the rendered quantity when plotting the render plot. if (irender > 0 .and. irender <= numplot) then if (icontourplot==irender .and. isameweights) then icontourplot = 0 iplotcont = .true. !print "(a)",' contouring same as rendering' elseif (icolours==0) then iplotcont = .true. endif else !--contours not allowed if not rendering ! (because this can be achieved by rendering with colour scheme 0) icontourplot = 0 endif !--flag to indicate that we have actually got the contoured quantity, ! set to true once interpolation has been done. if (.not.interactivereplot .or. irerender) gotcontours = .false. if (icolour_particles) then irenderpart = irender irenderplot = 0 else irenderpart = 0 irenderplot = irender endif if (ivectorplot > 0) iplotpart = iplotpartvec !--if replotting in interactive mode, use the temporarily stored plot limits ! (check iplot values are sensible though, otherwise will seg fault here) if (interactivereplot .and. (nacross*ndown > 1 .or. iploty > ndataplots)) then if (iplotx > 0 .and. iplotx <= numplot) then xmin = xminmulti(iplotx) xmax = xmaxmulti(iplotx) endif if (iploty > 0 .and. iploty <= numplot) then ymin = xminmulti(iploty) ymax = xmaxmulti(iploty) endif if (irender > 0 .and. irender <= numplot) then rendermin = xminmulti(irender) rendermax = xmaxmulti(irender) if (icontourplot > 0 .and. icontourplot <= numplot) then contmin = xminmulti(icontourplot) contmax = xmaxmulti(icontourplot) endif endif endif !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! initialisation for plots of particle data ! copy from main dat array into xplot, yplot ! also set labels end plot limits !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! iscoordplot = (is_coord(iplotx,ndim) .and. is_coord(iploty,ndim)) iz = 0 if (iscoordplot .and. ndim >= 3) then do j=1,ndim if ((iplotx /= iploty).and. & (ix(j) /= iplotx).and.(ix(j) /= iploty)) iz = ix(j) enddo endif iplotz = iz initx = (iplotx > 0 .and. iplotx <= ndataplots) inity = (iploty > 0 .and. iploty <= ndataplots) initz = (iplotz > 0 .and. iplotz <= ndataplots) if (iplotx > 0 .and. iplotx <= numplot) labelx = label(iplotx) if (iploty > 0 .and. iploty <= numplot) labely = label(iploty) if (iplotz > 0 .and. iplotz <= numplot) labelz = label(iplotz) initdataplots: if (initx .or. inity .or. initz) then if (debugmode) print*,'DEBUG: initialising data plots...',initx,inity,iplotx,iploty,ntoti,size(xplot) if (initx) then !--check for errors if (iplotx > size(dat,2) .or. iplotx < 1) then print*,'ERROR: Internal error with out-of-bounds x column = ',iplotx exit over_plots endif ix_map = check_for_shifted_column(iplotx,labelx) xplot(1:ntoti) = dat(1:ntoti,ix_map) iamvecx = iamvec(iplotx) else iamvecx = 0 endif if (inity) then !--check for errors if (iploty > size(dat,2) .or. iploty < 1) then print*,'ERROR: Internal error with out-of-bounds y column = ',iploty exit over_plots endif iy_map = check_for_shifted_column(iploty,labely) yplot(1:ntoti) = dat(1:ntoti,iy_map) iamvecy = iamvec(iploty) else iamvecy = 0 endif if (initz) then iz_map = check_for_shifted_column(iplotz,labelz) zplot(1:ntoti) = dat(1:ntoti,iz_map) else zplot = 0. endif if (debugmode) print*,'DEBUG: iplotz = ',iplotz if (debugmode) print*,'DEBUG: setting itrans...' itransx = 0 itransy = 0 if (iplotx > 0 .and. iplotx <= numplot) itransx = itrans(iplotx) if (iploty > 0 .and. iploty <= numplot) itransy = itrans(iploty) zslicemin = -huge(zslicemax) !-- " " zslicemax = huge(zslicemax) if (.not.interactivereplot) then ! if (iplotx > 0 .and. iplotx <= numplot .and. ipos==ifirststeponpage) then if (iplotx > 0 .and. iplotx <= numplot) then xmin = lim(iplotx,1) xmax = lim(iplotx,2) endif ! if (iploty > 0 .and. iploty <= numplot .and. ipos==ifirststeponpage) then if (iploty > 0 .and. iploty <= numplot) then ymin = lim(iploty,1) ymax = lim(iploty,2) endif angletempx = anglex angletempy = angley angletempz = anglez dzscreentemp = 0. zobservertemp = 0. rkappatemp = 0. if (ndim==3) then if (use3Dperspective) then dzscreentemp = dzscreenfromobserver zobservertemp = zobserver endif if (use3Dopacityrendering) rkappatemp = rkappafac endif else if (ndim==3 .and. use3Dperspective) dzscreentemp = zobservertemp endif ! !--flag for whether or not we have raw particle plot or not ! (not allowed to use transformations on coords otherwise) ! rendering = (iscoordplot .and.(irenderplot > 0 .or. ivectorplot > 0) & .and.(.not.icolour_particles)) ! !--change coordinate system if relevant ! if (icoordsnew /= icoords) then !--do this if one is a coord but not if rendering call changecoords(iplotx,iploty,iplotz,xplot,yplot,zplot,ntoti,ndim,itrackpart,dat) if (iamvecx > 0) call changeveccoords(iplotx,xplot,ntoti,ndim,itrackpart,dat) if (iamvecy > 0) call changeveccoords(iploty,yplot,ntoti,ndim,itrackpart,dat) endif ! !--change coordinate system in the quantity being rendered ! if (irender > 0 .and. rendering) then labelrender = label(irender) irender_map = check_for_shifted_column(irender,labelrender) renderplot(1:ntoti) = dat(1:ntoti,irender_map) if (icoordsnew /= icoords .and. iamvec(irender) > 0) then call changeveccoords(irender,renderplot,ntoti,ndim,itrackpart,dat) endif if (icontourplot > 0) then labelcont = label(icontourplot) if (.not.allocated(contourplot)) allocate(contourplot(size(renderplot))) ! only do this once icontour_map = check_for_shifted_column(icontourplot,labelcont) contourplot(1:ninterp) = dat(1:ninterp,icontour_map) if (icoordsnew /= icoords .and. iamvec(icontourplot) > 0) then call changeveccoords(icontourplot,contourplot,ntoti,ndim,itrackpart,dat) endif endif endif !--apply transformations (log, 1/x etc) if appropriate ! also change labels and limits appropriately if (.not.(rendering)) then if (itransx /= 0) call applytrans(xplot,xmin,xmax,labelx,itransx,'x',iplotx,iaxis,interactivereplot) if (itransy /= 0) call applytrans(yplot,ymin,ymax,labely,itransy,'y',iploty,iaxis,interactivereplot) endif ! !--adjust plot limits if adaptive plot limits set ! (find minimum/maximum only on particle types actually plotted) ! if (itrackpart <= 0 .and. .not.(iscoordplot .and. irotate)) then if (initx) call adapt_limits(iplotx,xplot,xmin,xmax,xminadapti,xmaxadapti,'x',& iamtype,ntoti,npartoftype,iusetype,ipagechange) if (inity) call adapt_limits(iploty,yplot,ymin,ymax,yminadapti,ymaxadapti,'y',& iamtype,ntoti,npartoftype,iusetype,ipagechange) endif !!-reset co-ordinate plot limits if particle tracking if (itrackpart > 0 .and. .not.interactivereplot) then if (initx) call settrackinglimits(itrackpart,iplotx,xplot,xmin,xmax) if (inity) call settrackinglimits(itrackpart,iploty,yplot,ymin,ymax) endif !--override settings based on positions in sequence if (nseq > 0) then call getsequencepos(iseqpos,iframe,iplotx,iploty,irender,ivectorplot, & angletempx,angletempy,angletempz,zobservertemp,dzscreentemp,rkappatemp,& zslicepos,xmin,xmax,ymin,ymax,rendermin,rendermax,vecmax,isetrenderlimits,isetvectorlimits) endif !--for 3D perspective, do not plot particles behind the observer if (ndim==3) then if (use3Dperspective) then dzscreenfromobserver = zobserver zslicemax = zobservertemp endif if (use3Dopacityrendering) then if (allocated(rkappa)) deallocate(rkappa) if (.not.allocated(rkappa)) allocate(rkappa(ninterp)) if (ikappa > 0) then rkappa = dat(1:ninterp,ikappa)*rkappatemp else rkappa = rkappatemp!/taupartdepthtemp endif endif endif endif initdataplots !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! plots with co-ordinates as x and y axis !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (iscoordplot) then if (debugmode) print*,'DEBUG: starting coord plot...' if (.not.interactivereplot .or. irerender) then npixx = npix if (npixx <= 0) npixx = 500 ! default for other uses of npixx if auto pixels are used endif !!--page setup preliminaries if (usesquarexy) then just = 1 ! x and y axis have same scale ! unless 1D xsec through 2D data or non-cartesian if ((irender > ndim .and. ndim==2 .and. x_sec) & .or.(icoordsnew > 1 .and. .not.(coord_is_length(iplotx,icoordsnew) & .and. coord_is_length(iploty,icoordsnew)))) then just = 0 endif else just = 0 endif !--work out if colour bar is going to be plotted ! (leave space in page setup if so) iPlotColourBar = .false. if (irender > ndim .and..not.(ndim==2.and.x_sec)) iPlotColourBar = (iColourBarStyle > 0) if (.not.interactivereplot) then irerender = .false. endif ! !--rotate the particles about the z (and y and x) axes ! only applies to particle plots at the moment ! if (ndim >= 2 .and. (irotate .or. (ndim==3 .and.use3Dperspective)) & .and. icoordsnew==1) then if ((irotate .and. ((angletempx > tiny(0.) .and. abs(angletempx-180.) > tiny(0.)) & .or. (angletempy > tiny(0.) .and. abs(angletempy-180.) > tiny(0.)))) & .or.(ndim==3 .and.use3Dperspective .and. dzscreentemp > tiny(0.))) then if (iaxis >= 0) iaxistemp = -3 endif ivectemp = 0 !--for vector plots with rotation, need to allocate temporary ! arrays to hold the rotated vector components if (ivectorplot > 0) then ichangesize = .false. if (allocated(vecplot)) then if (size(vecplot,2) < ninterp) ichangesize = .true. endif if (.not.allocated(vecplot) .or. ichangesize) then if (allocated(vecplot)) deallocate(vecplot) allocate(vecplot(ndim,ninterp),stat=ierr) if (ierr /= 0) then print "(a)",' ERROR allocating memory for vector plot + rotation ' stop endif endif ivectemp = ivectorplot endif call rotationandperspective(angletempx,angletempy,angletempz,dzscreentemp,zobservertemp, & xplot,yplot,zplot,ntoti,iplotx,iploty,iplotz,dat,ivectemp,vecplot,itrackpart) !--adapt plot limits after rotations have been done if (.not.interactivereplot) then call adapt_limits(iplotx,xplot,xmin,xmax,xminadapti,xmaxadapti,'x',& iamtype,ntoti,npartoftype,iusetype,ipagechange) call adapt_limits(iploty,yplot,ymin,ymax,yminadapti,ymaxadapti,'y',& iamtype,ntoti,npartoftype,iusetype,ipagechange) endif !!-reset co-ordinate plot limits if particle tracking if (itrackpart > 0 .and. .not.interactivereplot) then call settrackinglimits(itrackpart,iplotx,xplot,xmin,xmax) call settrackinglimits(itrackpart,iploty,yplot,ymin,ymax) endif endif !------------------------------------------------------------------ ! rendering setup and interpolation (this is the rendering done ! *before* the cross sections are taken, e.g. to 3D grid) !------------------------------------------------------------------ if ((irenderplot > ndim).and. & ((ndim==3).or.(ndim==2.and..not.x_sec))) then !!--determine number of pixels in rendered image (npix = pixels in x direction) if (npix > 0) then npixx = npix call page_setup(dummy_run=.true.) ! do this here in case limits are auto-adjusted pixwidth = (xmax-xmin)/real(npix) if (just==1) then pixwidthy = pixwidth else pixwidthy = pixwidth*(ymax-ymin)/abs(xmax - xmin) endif else !!--automatically reset the pixel number to match the device call page_setup(dummy_run=.true.) !--npixx and npixy are determined here pixwidth = (xmax-xmin)/real(npixx) if (just==1) then pixwidthy = pixwidth else pixwidthy = (ymax-ymin)/real(npixy) endif endif npixx = max(int((1. - epsilon(0.))*(xmax-xmin)/pixwidth) + 1,1) npixy = max(int((1. - epsilon(0.))*(ymax-ymin)/pixwidthy) + 1,1) npixx = 2*(npixx/2) npixy = 2*(npixy/2) !!--only need z pixels if working with interpolation to 3D grid ! (then number of z pixels is equal to number of cross sections) if ((ndim >= 3).and.(x_sec.and.nxsec > 2)) then zmin = lim(iplotz,1) npixz = nxsec endif if (.not.interactivereplot .or. irerender) then ! set interpolation weights (skips if they are the same) call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings)) if (allocated(datpix)) then if (npixx /= size(datpix,1) .or. npixy /= size(datpix,2)) then deallocate(datpix) allocate (datpix(npixx,npixy)) if (ndim==3 .and. use3Dopacityrendering) then if (allocated(brightness)) deallocate(brightness) allocate(brightness(npixx,npixy)) endif if (icontourplot > ndim) then if (allocated(datpixcont)) deallocate(datpixcont) allocate(datpixcont(npixx,npixy)) endif endif else allocate (datpix(npixx,npixy)) if (ndim==3 .and. use3Dopacityrendering) then if (allocated(brightness)) deallocate(brightness) allocate(brightness(npixx,npixy)) endif if (icontourplot > ndim) then if (allocated(datpixcont)) deallocate(datpixcont) allocate(datpixcont(npixx,npixy)) endif endif select case(ndim) case(2) !!--interpolate to 2D grid !! allocate memory for rendering array if (.not. x_sec) then call interpolate2D(xplot(1:ninterp),yplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin,datpix,npixx,npixy, & pixwidth,pixwidthy,inormalise,exact_rendering,isperiodicx,isperiodicy,iverbose) !--also get contour plot data if (icontourplot > 0 .and. icontourplot <= numplot) then call set_weights(weight,dat,iamtype,UseTypeInContours) call interpolate2D(xplot(1:ninterp),yplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp),contourplot(1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin,datpixcont,npixx,npixy, & pixwidth,pixwidthy,inormalise,exact_rendering,isperiodicx,isperiodicy,iverbose) gotcontours = .true. endif endif case(3) !!--interpolation to 3D grid - then take multiple cross sections/projections !! do this if taking more than 2 cross sections, otherwise use fast xsec if (x_sec.and.nxsec > 2) then !!--allocate memory for 3D rendering array if (allocated(datpix3D)) deallocate(datpix3D) allocate ( datpix3D(npixx,npixy,npixz) ) !!--interpolate from particles to 3D grid call interpolate3D(xplot(1:ninterp),yplot(1:ninterp), & zplot(1:ninterp),hh(1:ninterp),weight(1:ninterp), & renderplot(1:ninterp),icolourme(1:ninterp), & ninterp,xmin,ymin,zmin,datpix3D,npixx,npixy,npixz,& pixwidth,pixwidth,dz, & inormalise,isperiodicx,isperiodicy,isperiodicz) if (icontourplot > 0 .and. icontourplot <= numplot) then !!--allocate memory for 3D contouring array if (allocated(datpixcont3D)) deallocate(datpixcont3D) allocate ( datpixcont3D(npixx,npixy,npixz) ) call set_weights(weight,dat,iamtype,UseTypeInContours) !!--interpolate from particles to 3D grid call interpolate3D(xplot(1:ninterp),yplot(1:ninterp), & zplot(1:ninterp),hh(1:ninterp),weight(1:ninterp), & contourplot(1:ninterp),icolourme(1:ninterp), & ninterp,xmin,ymin,zmin,datpixcont3D,npixx,npixy,npixz,& pixwidth,pixwidth,dz, & inormalise,isperiodicx,isperiodicy,isperiodicz) gotcontours = .true. endif endif end select endif endif ! !--if vector plot determine whether or not to plot the particles as well ! iplotpart = .true. if (ivectorplot > 0) iplotpart = iplotpartvec if (irenderplot > 0) iplotpart = .false. ! !%%%%%%%%%%%%%%% loop over cross-section slices %%%%%%%%%%%%%%%%%%%%%%% ! over_cross_sections: do k=1,nxsec if (k > 1) print 34 if (x_sec) then !!--for multislice cross section (flythru) !! increment the position of the current cross section slice if (flythru) zslicepos = zslicepos + dz !!--for cross sections of particle plots, need range of co-ordinates in which !! particles may lie zslicemin = zslicepos-0.5*dz zslicemax = zslicepos+0.5*dz endif !------------take projections/cross sections through 3D data-----------------! if (irenderplot > 0 .and. ndim==3) then !!--allocate memory for 2D rendered array if (.not.interactivereplot) then if (allocated(datpix)) then if (npixx /= size(datpix,1) .or. npixy /= size(datpix,2)) then deallocate(datpix) if (debugmode) print*,'reallocating datpix...' allocate ( datpix(npixx,npixy) ) endif else if (debugmode) print*,'allocating datpix...' allocate ( datpix(npixx,npixy) ) endif if (icontourplot > ndim) then if (allocated(datpixcont)) then if (npixx /= size(datpixcont,1) .or. npixy /= size(datpixcont,2)) then deallocate(datpixcont) if (debugmode) print*,'reallocating datpixcont...' allocate ( datpixcont(npixx,npixy) ) endif else if (debugmode) print*,'allocating datpixcont...' allocate ( datpixcont(npixx,npixy) ) endif endif endif !------------------------------------------------------------------------ ! if we have rendered to a 3D grid, take cross sections from this array !------------------------------------------------------------------------ if (x_sec .and. nxsec > 2) then ipixxsec = int(0.99999*(zslicepos-zmin)/dz) + 1 if (ipixxsec > npixz) ipixxsec = npixz print*,TRIM(label(iplotz)),' = ',zslicepos, & ' cross section, pixel ',ipixxsec datpix = datpix3D(:,:,ipixxsec) ! slices are in 3rd dimension if (gotcontours) then datpixcont = datpixcont3D(:,:,ipixxsec) endif else !------------------------------------------------------------------- ! or do a fast projection/cross section of 3D data to 2D array !------------------------------------------------------------------- !--only rerender if absolutely necessary if (.not.interactivereplot .or. irerender) then if (x_sec) then if (use3Dopacityrendering) then !!--do surface-rendered cross-section with opacity if (iverbose > 0) print*,trim(label(ix(iplotz))),' = ',zslicepos, & ' : opacity-rendered cross section', xmin,ymin if (ipmass > 0) then if (icontourplot > 0 .and. icontourplot <= numplot) then call set_weights(weight,dat,iamtype,UseTypeInContours) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & dat(1:ninterp,ipmass),ninterp,hh(1:ninterp),weight(1:ninterp),& contourplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpixcont,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,zslicepos,iverbose,exact_rendering) gotcontours = .true. endif call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings)) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & dat(1:ninterp,ipmass),ninterp,hh(1:ninterp),weight(1:ninterp), & renderplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpix,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,zslicepos,iverbose,exact_rendering) else if (icontourplot > 0 .and. icontourplot <= numplot) then call set_weights(weight,dat,iamtype,UseTypeInContours) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & pmassav,1,hh(1:ninterp),weight(1:ninterp),contourplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpixcont,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,zslicepos,iverbose,exact_rendering) gotcontours = .true. endif call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings)) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & pmassav,1,hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpix,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,zslicepos,iverbose,exact_rendering) endif elseif (use3Dperspective) then print*,'ERROR: X_SEC WITH 3D PERSPECTIVE NOT IMPLEMENTED' datpix = 0. else !!--do fast cross-section if (iverbose > 0) print*,trim(label(ix(iplotz))),' = ',zslicepos, & ' : fast cross section', xmin,ymin call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings)) if (icoordsnew /= icoords) then call interpolate3D_xsec_geom( & dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)), & hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp),icolourme(1:ninterp),& ninterp,xmin,ymin,zslicepos,datpix,npixx,npixy,pixwidth, & pixwidthy,inormalise,icoordsnew,iplotx,iploty,iplotz,ix,xorigin) else call interpolate3D_fastxsec( & xplot(1:ninterp),yplot(1:ninterp), & zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),renderplot(1:ninterp),icolourme(1:ninterp), & ninterp,xmin,ymin,zslicepos,datpix,npixx,npixy,pixwidth, & pixwidthy,inormalise,iverbose) endif !!--same but for contour plot if (icontourplot > 0 .and. icontourplot <= numplot) then call set_weights(weight,dat,iamtype,UseTypeInContours) if (icoordsnew /= icoords) then call interpolate3D_xsec_geom( & dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)), & hh(1:ninterp),weight(1:ninterp),contourplot(1:ninterp),icolourme(1:ninterp),& ninterp,xmin,ymin,zslicepos,datpixcont,npixx,npixy,pixwidth, & pixwidthy,inormalise,icoordsnew,iplotx,iploty,iplotz,ix,xorigin) else call interpolate3D_fastxsec( & xplot(1:ninterp),yplot(1:ninterp), & zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),contourplot(1:ninterp),icolourme(1:ninterp), & ninterp,xmin,ymin,zslicepos,datpixcont,npixx,npixy,pixwidth, & pixwidthy,inormalise,iverbose) endif gotcontours = .true. endif endif else if (use3Dopacityrendering) then !!--do fast projection with opacity if (ipmass > 0) then !--contour plot first if (icontourplot > 0 .and. icontourplot <= numplot) then call set_weights(weight,dat,iamtype,UseTypeInContours) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & dat(1:ninterp,ipmass),ninterp,hh(1:ninterp),weight(1:ninterp),& contourplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpixcont,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,huge(zslicepos),iverbose,exact_rendering) gotcontours = .true. endif ! set weights call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings)) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & dat(1:ninterp,ipmass),ninterp,hh(1:ninterp),& weight(1:ninterp),renderplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpix,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,huge(zslicepos),iverbose,exact_rendering) else !--do contour plot first so brightness corresponds to render plot if (icontourplot > 0 .and. icontourplot <= numplot) then call set_weights(weight,dat,iamtype,UseTypeInContours) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & pmassav,1,hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpixcont,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,huge(zslicepos),iverbose,exact_rendering) gotcontours = .true. endif call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings)) call interp3D_proj_opacity( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & pmassav,1,hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp), & dat(1:ninterp,iz),icolourme(1:ninterp), & ninterp,xmin,ymin,datpix,brightness,npixx,npixy,pixwidth,pixwidthy,zobservertemp, & dzscreentemp,rkappa,huge(zslicepos),iverbose,exact_rendering) endif else ! set interpolation weights (skips if they are the same) call set_weights(weight,dat,iamtype,& (iusetype .and. UseTypeInRenderings),irenderplot) !!--do fast projection of z integrated data (e.g. column density) if (icoordsnew /= icoords) then call interpolate3D_proj_geom( & dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)), & hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin,datpix,npixx,npixy,pixwidth, & pixwidthy,inormalise,icoordsnew,iplotx,iploty,iplotz,ix,xorigin) else call interpolate3D_projection( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin,datpix,npixx,npixy,pixwidth, & pixwidthy,inormalise,zobservertemp,dzscreentemp,ifastrender,exact_rendering,iverbose) endif !!--adjust the units of the z-integrated quantity if (iRescale .and. units(ih) > 0. .and. .not.inormalise .and. coord_is_length(iplotz,icoordsnew)) then datpix = datpix*(unitzintegration/units(ih)) endif !!--same but for contour plot if (icontourplot > 0 .and. icontourplot <= numplot) then call set_weights(weight,dat,iamtype,UseTypeInContours,icontourplot) if (icoordsnew /= icoords) then call interpolate3D_proj_geom( & dat(1:ninterp,ix(1)),dat(1:ninterp,ix(2)),dat(1:ninterp,ix(3)), & hh(1:ninterp),weight(1:ninterp),contourplot(1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin,datpixcont,npixx,npixy,pixwidth, & pixwidthy,inormalise,icoordsnew,iplotx,iploty,iplotz,ix,xorigin) else call interpolate3D_projection( & xplot(1:ninterp),yplot(1:ninterp),zplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp),contourplot(1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin,datpixcont,npixx,npixy,pixwidth, & pixwidthy,inormalise,zobservertemp,dzscreentemp,ifastrender,exact_rendering,iverbose) endif gotcontours = .true. !!--adjust the units of the z-integrated quantity if (iRescale .and. units(ih) > 0. .and. .not.inormalise & .and. coord_is_length(iplotz,icoordsnew)) then datpixcont = datpixcont*(unitzintegration/units(ih)) endif endif endif endif endif endif ! whether 3D grid or fast renderings !-------------take cross sections through 2D data------------------! elseif (irenderplot > 0 .and. ndim==2 .and. x_sec) then !------------------------------------------------------------------- ! or do a fast cross section through 2D data to 1D array !------------------------------------------------------------------- !!--interpolate from 2D data to 1D line !! line is specified by giving two points, (x1,y1) and (x2,y2) !--set up 1D grid and allocate memory for datpix1D if (.not.interactivereplot) then xmin = 0. ! distance (r) along cross section xmax = sqrt((xseclineY2-xseclineY1)**2 + (xseclineX2-xseclineX1)**2) endif dxgrid = (xmax-xmin)/REAL(npixx) call set_grid1D(xmin,xmax,dxgrid,npixx) call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings)) call interpolate2D_xsec( & dat(1:ninterp,iplotx),dat(1:ninterp,iploty),& hh(1:ninterp),weight(1:ninterp),renderplot(1:ninterp), & icolourme(1:ninterp),ninterp,xseclineX1,xseclineY1,xseclineX2,xseclineY2, & datpix1D,npixx,inormalise) ! !--find limits of datpix1D for plotting ! do transformations on rendered array where appropriate ! set these as ymin,ymax and set labels of plot ! call transform(datpix1D,itrans(irenderplot)) labely = transform_label(label(irenderplot),itrans(irenderplot)) if (abs(xseclineY2-xseclineY1) > epsilon(0.)) then labelx = 'cross section' ! only if cross-section is oblique (otherwise keep x axis label) endif !!--if adaptive limits, find limits of datpix if (.not.interactivereplot) then ymin = minval(datpix1D) ymax = maxval(datpix1D) xminadapt(irenderplot) = min(ymin,xminadapt(irenderplot)) xmaxadapt(irenderplot) = max(ymax,xmaxadapt(irenderplot)) if (iadapt) then if (iverbose > 1) print*,' adapting y limits' else !!--or use fixed limits and apply transformations ymin = lim(irenderplot,1) ymax = lim(irenderplot,2) call transform_limits(ymin,ymax,itrans(irenderplot)) endif endif endif ! 2 or 3D and rendering !------------------------------------------------------------------ ! apply transformations to, and find limits for the 2D ! pixel array datpix resulting from the interpolation operations ! do this *before* the page setup so that rendermin,max ! can be stored in page_setup for interactive plots !------------------------------------------------------------------ if (irenderplot > 0 .and. irenderplot <= numplot) then if (ndim==3 .or. (ndim==2 .and..not.x_sec)) then !!--determine whether rendered quantity is logged or not logged = islogged(itrans(irenderplot)) if (gotcontours) then loggedcont = islogged(itrans(icontourplot)) else loggedcont = .false. endif !!--do transformations on rendered array (but only the first time!) if (.not.interactivereplot .or. irerender) then if (logged) then !!--if log, then set zero values to some large negative number ! but exclude this value from adaptive limits determination call transform(datpix,itrans(irenderplot),errval=error_in_log) else call transform(datpix,itrans(irenderplot)) endif if (gotcontours) then if (loggedcont) then call transform(datpixcont,itrans(icontourplot),errval=error_in_log) else call transform(datpixcont,itrans(icontourplot)) endif endif endif !!--set label for column density (projection) plots if (ndim==3 .and..not. x_sec .and..not.use3Dopacityrendering) then ! must call set weights here to determine if inormalise is true or false call set_weights(weight,dat,iamtype,(iusetype .and. UseTypeInRenderings),irenderplot,dummy_run=.true.) inorm_label = (inormalise .or. .not.coord_is_length(iz,icoordsnew)) labelrender = integrate_label(labelrender,irender,iz,inorm_label,iRescale,& labelzintegration,projlabelformat,iapplyprojformat) if (gotcontours) then ! must call set weights here to determine if inormalise is true or false call set_weights(weight,dat,iamtype,UseTypeInContours,icontourplot,dummy_run=.true.) inorm_label = (inormalise .or. .not.coord_is_length(iz,icoordsnew)) labelcont = integrate_label(labelcont,icontourplot,iz,inorm_label,& iRescale,labelzintegration,projlabelformat,iapplyprojformat) endif endif !!--apply transformations to the label(s) for the rendered and contoured quantit(y,ies) labelrender = transform_label(labelrender,itrans(irenderplot)) if (gotcontours) labelcont = transform_label(labelcont,itrans(icontourplot)) !!--limits for rendered quantity if (.not.interactivereplot .or. irerender) then !!--find (adaptive) limits of rendered array if (logged) then renderminadapt = minval(datpix,mask=abs(datpix-error_in_log) > tiny(datpix)) ! see above else renderminadapt = minval(datpix) endif rendermaxadapt = maxval(datpix) !--fix case where no limits are set due to NaNs etc. if (renderminadapt > rendermaxadapt) then print "(a)",' WARNING: NaNs in rendered quantity' renderminadapt = 0. rendermaxadapt = 0. endif if (gotcontours) then if (loggedcont) then contminadapt = minval(datpixcont,mask=abs(datpixcont+666.) > tiny(datpixcont)) else contminadapt = minval(datpixcont) endif contmaxadapt = maxval(datpixcont) !--fix case where no limits are set due to NaNs etc. if (contminadapt > contmaxadapt) then print "(a)",' WARNING: NaNs in contoured quantity' contminadapt = 0. contmaxadapt = 1. endif endif if (.not.interactivereplot .and. .not.isetrenderlimits) then if (iadapt) then if (iverbose > 1) print*,'adapting render limits' rendermax = rendermaxadapt rendermin = renderminadapt if (logged) rendermin = max(rendermin,rendermax-4) ! limit to 4 orders of magnitude else !!--or apply transformations to fixed limits rendermin = lim(irenderplot,1) rendermax = lim(irenderplot,2) call transform_limits(rendermin,rendermax,itrans(irenderplot)) endif if (gotcontours) then if (iadapt) then if (iverbose > 1) print*,'adapting contour limits' contmin = contminadapt contmax = contmaxadapt elseif (icontourplot==irenderplot .and. lim2set(icontourplot)) then contmin = lim2(icontourplot,1) contmax = lim2(icontourplot,2) call transform_limits(contmin,contmax,itrans(icontourplot)) else contmin = lim(icontourplot,1) contmax = lim(icontourplot,2) call transform_limits(contmin,contmax,itrans(icontourplot)) endif endif if (iadapt .and. get_command_flag('movie')) then call save_limits(irenderplot,rendermin,rendermax) endif endif endif if (iplotcont .and. .not.gotcontours) then ! ! this is the case where contoured quantity=rendered quantity ! don't need to recalculate the pixel array but limits can be independent ! => do this even during interactive replotting as rendermin,max can be changed ! but contour limits should copy changes unless separate contour limits are set ! contmin = rendermin contmax = rendermax if (lim2set(irenderplot) .and. .not.iadapt) then contmin = lim2(irenderplot,1) contmax = lim2(irenderplot,2) call transform_limits(contmin,contmax,itrans(irenderplot)) endif endif !! do not let max=0 on log plots as this is suspiciously wrong if (logged) then if (iadapt .and. abs(rendermax) < tiny(datpix)) then !!print*,'max=0 on log plot, fixing' rendermax = maxval(datpix) endif endif if (gotcontours .and. loggedcont) then if (iadapt .and. abs(contmax) < tiny(datpixcont)) then contmax = maxval(datpixcont) endif endif endif !------------------------------------------------------------------------- ! similar but where particle colouring is used instead of interpolation !------------------------------------------------------------------------- elseif (irenderpart > 0 .and. iplotpart) then !--apply transformations to render array and set label renderplot(1:ntoti) = dat(1:ntoti,irenderpart) call transform(renderplot(1:ntoti),itrans(irenderpart)) labelrender = label(irenderpart) labelrender = transform_label(labelrender,itrans(irenderpart)) call adapt_limits(irenderpart,renderplot(1:ntoti),rendermin,rendermax, & renderminadapt,rendermaxadapt,trim(labelrender),& iamtype,ntoti,npartoftype,iusetype,ipagechange) !!--limits for rendered quantity if (.not.interactivereplot .and. .not.isetrenderlimits) then !!--find (adaptive) limits of rendered array ! (note: something may be not quite right here with adapt during anim sequences) if (iadapt) then rendermin = renderminadapt rendermax = rendermaxadapt else !!--use fixed limits and apply transformations rendermin = lim(irenderpart,1) rendermax = lim(irenderpart,2) call transform_limits(rendermin,rendermax,itrans(irenderpart)) endif endif ! !--actually colour the particles ! call colour_particles(renderplot(1:ntoti), & rendermin,rendermax,icolourme(1:ntoti),ntoti) endif !------------------------------------------------------------------------- ! similarly, get limits to be used in the vector plot so we can store ! them during page_setup for interactive plots !------------------------------------------------------------------------- if (ivectorplot /= 0 .and. ndim >= 2) then if (iamvec(ivectorplot) /= 0) then !!--choose quantity to be plotted ivecx = iamvec(ivectorplot) + iplotx - 1 ivecy = iamvec(ivectorplot) + iploty - 1 if (.not.interactivereplot .and. .not.isetvectorlimits) then ! not if vecmax changed interactively if (iadapt) then vecmax = -1.0 ! plot limits then set in vectorplot else vecmax = max(lim(ivecx,2),lim(ivecy,2)) endif endif endif endif !-----end of preliminary muff for 2D/3D cross sections/renderings ------------------ !--------------------------------- ! setup page !--------------------------------- call page_setup !--add to log if (x_sec.and.iplotpart .and. iplotz > 0 .and. iverbose > 1) then print "(' cross section: ',a1,' = ',f7.3,' to ',a1,' = ',f7.3)",& label(iplotz),zslicemin,label(iplotz),zslicemax endif !------------------------------ ! now actually plot the data !------------------------------ if (irenderplot > 0) then if ((ndim==3).or.(ndim==2.and. .not.x_sec)) then !--if double rendering, plot first image in greyscale if (gotcontours .and. double_rendering) then icolours_temp = 1 else icolours_temp = icolours endif !--call subroutine to actually render the image if (nstepsperpage /= 1 .and. .not.(ipos==ifirststeponpage)) then !--if there is more than one rendering plotted, make the ! background colour transparent call set_transparency(npixx,npixy,datpix,brightness,rendermin,rendermax) call render_pix(datpix,rendermin,rendermax,trim(labelrender), & npixx,npixy,xmin,ymin,pixwidth,pixwidthy, & icolours_temp,iplotcont,0,ncontours,.false.,& ilabelcont,contmin,contmax,alpha=brightness) else !--usual plot, no opacity call render_pix(datpix,rendermin,rendermax,trim(labelrender), & npixx,npixy,xmin,ymin,pixwidth,pixwidthy, & icolours_temp,iplotcont,0,ncontours,.false.,& ilabelcont,contmin,contmax) endif !--contour/2nd render plot of different quantity on top of 1st rendering if (gotcontours) then if (double_rendering) then call colour_set(icolours) call set_transparency(npixx,npixy,datpixcont,brightness,contmin,contmax) call render_pix(datpixcont,contmin,contmax,trim(labelcont), & npixx,npixy,xmin,ymin,pixwidth,pixwidthy,icolours,.false.,& 0,ncontours,.false.,ilabelcont,alpha=brightness) else call render_pix(datpixcont,contmin,contmax,trim(labelcont), & npixx,npixy,xmin,ymin,pixwidth,pixwidthy,0,.true.,0,ncontours,& .false.,ilabelcont) endif endif PlotOnRender_tmp(:) = PlotOnRenderings(:) isinktype = get_sink_type(ntypes) if (use3Dopacityrendering .and. rendersinks .and. isinktype > 0) then PlotOnRender_tmp(isinktype) = .false. endif !--dump pixmap to file if option set if (iwritepixmap) then !--plot non-gas particle types (e.g. sink particles) on top (and to pixmap) call particleplot(xplot(1:ntoti),yplot(1:ntoti), & zplot(1:ntoti),hh(1:ntoti),ntoti,iplotx,iploty, & icolourme(1:ntoti),iamtype,npartoftype(:),PlotOnRender_tmp(:), & (x_sec.or.use3Dperspective),zslicemin,zslicemax,labelz, & xmin,xmax,ymin,ymax,ifastparticleplot,interactive,datpix,npixx,npixy,rendermax) call writepixmap(datpix,npixx,npixy,xmin,ymin,pixwidth,rendermin,rendermax,labelrender,& unitslabel(irenderplot),((istep-1)*nframesloop+iframe),x_sec,rootname(ifileopen),timei) else !--plot non-gas particle types (e.g. sink particles) on top call particleplot(xplot(1:ntoti),yplot(1:ntoti), & zplot(1:ntoti),hh(1:ntoti),ntoti,iplotx,iploty, & icolourme(1:ntoti),iamtype,npartoftype(:),PlotOnRender_tmp(:), & (x_sec.or.use3Dperspective),zslicemin,zslicemax,labelz, & xmin,xmax,ymin,ymax,ifastparticleplot,interactive) endif elseif (ndim==2 .and. x_sec) then !--------------------------------------------------------------- ! plot 1D cross section through 2D data (contents of datpix) !--------------------------------------------------------------- call plot_line(npixx,xgrid,datpix1D) endif else !----------------------- ! particle plots !----------------------- if (iplotpart) then if (debugmode .and. size(icolourme) >= 10) & print*,'DEBUG: starting particle plot with ',ntoti,' particles ',& zplot(1:10),icolourme(1:10),npartoftype(:),iusetype(:) !--plot all particle types call particleplot(xplot(1:ntoti),yplot(1:ntoti), & zplot(1:ntoti),hh(1:ntoti),ntoti,iplotx,iploty, & icolourme(1:ntoti),iamtype,npartoftype(:),iusetype(:), & (x_sec.or.use3Dperspective),zslicemin,zslicemax,labelz, & xmin,xmax,ymin,ymax,ifastparticleplot,interactive) else !--plot non-gas particle types on top of vector plots (e.g. sinks) call particleplot(xplot(1:ntoti),yplot(1:ntoti), & zplot(1:ntoti),hh(1:ntoti),ntoti,iplotx,iploty, & icolourme(1:ntoti),iamtype,npartoftype(:),PlotOnRenderings(:), & (x_sec.or.use3Dperspective),zslicemin,zslicemax,labelz, & xmin,xmax,ymin,ymax,ifastparticleplot,interactive) endif endif !-------------------------------------------------------------- ! vector maps (can be on top of particle plots and renderings) !-------------------------------------------------------------- if (ivecx > 0 .and. ivecy > 0 .and. ivectorplot > 0) then pixwidthvec = (xmax-xmin)/real(npixvec) if (just==1) then pixwidthvecy = pixwidthvec !(xmax-xmin)/real(npixvec) else pixwidthvecy = pixwidthvec endif npixyvec = int(0.999*(ymax-ymin)/pixwidthvecy) + 1 pixwidth = (xmax-xmin)/real(npixx) ! used in synchrotron plots if (ndim==3 .and. .not.x_sec) then call set_weights(weight,dat,iamtype,(iusetype.and.UseTypeInRenderings),ivecx) else call set_weights(weight,dat,iamtype,(iusetype.and.UseTypeInRenderings)) endif !--set label for the vector plot legend labelvecplot = trim(labelvec(ivectorplot)) labelvecunits = '' if (iRescale) labelvecunits = trim(unitslabel(ivectorplot)) !--set label for projection plots if (ndim==3 .and..not. x_sec) then labelvecplot = integrate_label(labelvecplot,ivecx,iz,inormalise,& .false.,shortlabel(label(iz),unitslabel(iz)),'',0) if (.not.inormalise) labelvecunits = get_unitlabel_coldens(iRescale,& labelzintegration,unitslabel(ivectorplot)) endif call string_delete(labelvecunits,(/'[',']'/)) call vector_plot(ivecx,ivecy,npixvec,npixyvec,pixwidthvec,& pixwidthvecy,vecmax,labelvecplot,labelvecunits,got_h) !--vecmax is returned with the adaptive value if sent in -ve ! store this for use in interactive_multi if (xmaxmulti(ivectorplot) < 0.) xmaxmulti(ivectorplot) = vecmax endif !--------------------------------- ! plot rotated axes !--------------------------------- if (irotate .and. irotateaxes > 0 .and. icoordsnew==1) then call rotatedaxes(irotateaxes,iplotx,iploty,angletempx,angletempy,angletempz, & dzscreentemp,zobservertemp) endif ! !--redraw axes over what has been plotted ! if (irenderplot > 0 .or. plotlib_is_pgplot) then call redraw_axes(iaxistemp,just,yscalealt,itransy) endif ! !--annotate with time / marker legend and title ! call legends_and_title ! !--plot exact solution if relevant (before going interactive) ! if (plot_exact) then if (iexact==iexact_rochelobe .and. use_sink_data .and. ipmass > 0 .and. ndim >= 2) then isinktype = get_sink_type(ntypes) call locate_first_two_of_type(isink1,isink2,isinktype,iamtype,npartoftype,ntoti) call exact_set_rocheparam(dat(isink1,ipmass),dat(isink2,ipmass),& xplot(isink1),yplot(isink1),xplot(isink2),yplot(isink2)) endif call exact_solution(iexact,iplotx,iploty, & itrans(iplotx),itrans(iploty),icoordsnew, & ndim,ndimV,timei,xmin,xmax,gammai, & xplot(1:ntoti),yplot(1:ntoti),icolourme(1:ntoti),iamtype,npartoftype,iusetype, & pmassmin,pmassmax,ntoti,imarktype(1), & units_calc(iplotx),units_calc(iploty),irescale,iaxisy) endif !--the following line sets the number of steps on page to nstepsonpage ! in the case where we reach the last timestep before nstepsonpage is reached ! (makes interactive replotting behave better) if (lastplot) istepsonpage = nstepsperpage ! !--enter interactive mode ! if (interactive) then if (nacross*ndown==1 .and. (nstepsperpage==1 .or. nsteps==1)) then iadvance = nfreq call interactive_part(ntoti,iplotx,iploty,iplotz,irender,icontourplot,ivecx,ivecy, & xplot(1:ntoti),yplot(1:ntoti),zplot(1:ntoti), & hh(1:ntoti),icolourme(1:ntoti),iamtype,iusetype,npartoftype, & xmin,xmax,ymin,ymax,rendermin,rendermax,renderminadapt,rendermaxadapt,contmin,contmax,& contminadapt,contmaxadapt,vecmax, & angletempx,angletempy,angletempz,ndim,xorigin(1:ndim),x_sec,zslicepos,dz, & zobservertemp,dzscreentemp,use3Dopacityrendering,rkappatemp,& (double_rendering .and. gotcontours),irerender,itrackpart,icolours,& iColourBarStyle,labelrender,iadvance,ipos,iendatstep,iframe,nframesloop,interactivereplot) !--turn rotation on if necessary if (abs(angletempx-anglex) > tol) irotate = .true. if (abs(angletempy-angley) > tol) irotate = .true. if (abs(angletempz-anglez) > tol) irotate = .true. if (iadvance==-666 .or. interactivereplot) exit over_frames elseif ((ipanel==nacross*ndown .and. istepsonpage==nstepsperpage) .or. lastplot) then ! !--slightly different interactive mode if multiple plots on page ! iadvance = nfreq nplots = ipanel irerender = .true. call interactive_multi(iadvance,ipos,ifirststeponpage,iendatstep,iframe,nframefirstonpage, & nframesloop,ipanel,iplotxtemp(1:nplots),iplotytemp(1:nplots),irendertemp(1:nplots),& icontourtemp(1:nplots),ivecplottemp(1:nplots),double_rendering,xminmulti(:),xmaxmulti(:),& vptxmin(1:nplots),vptxmax(1:nplots),vptymin(1:nplots),vptymax(1:nplots),barwmulti(1:nplots), & xminadapt(:),xmaxadapt(:),nacross,ndim,xorigin(1:ndim),icolours,iColourBarStyle,interactivereplot) if (iadvance==-666 .or. interactivereplot) exit over_frames endif endif ! !--%%%%%%%%%%%%% end loop over cross-section slices %%%%%%%%%%%%%%%%%%%%%%% ! enddo over_cross_sections !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! not both coordinates - these are just particle plots !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! elseif ((.not.iscoordplot).and.(iploty <= ndataplots .and. iplotx <= ndataplots)) then if (debugmode) print*,'DEBUG: starting particle plot...' ! !--sort out particle colouring ! (at present this is NOT used -can't render if not co-ord plot) ! if (irenderpart > 0 .and. irenderpart <= numplot) then iPlotColourBar = (iColourBarStyle > 0) !--apply transformations to render array and set label labelrender = label(irenderpart) irender_map = check_for_shifted_column(irenderpart,labelrender) renderplot(1:ntoti) = dat(1:ntoti,irender_map) call transform(renderplot(1:ntoti),itrans(irenderpart)) labelrender = transform_label(labelrender,itrans(irenderpart)) !--limits for rendered quantity if (.not.interactivereplot) then !--find (adaptive) limits of rendered array call adapt_limits(irenderpart,renderplot(1:ntoti),rendermin,rendermax, & renderminadapt,rendermaxadapt,trim(labelrender),& iamtype,ntoti,npartoftype,iusetype,ipagechange) if (.not.iadapt) then !!--use fixed limits and apply transformations rendermin = lim(irenderpart,1) rendermax = lim(irenderpart,2) call transform_limits(rendermin,rendermax,itrans(irenderpart)) endif endif !--actually colour the particles call colour_particles(renderplot(1:ntoti), & rendermin,rendermax,icolourme(1:ntoti),ntoti) endif !-------------------------------- ! setup page !-------------------------------- just = 0 call page_setup ! !--plot exact solution (UNDER particle plots) ! if (plot_exact .and. iPlotExactUnder) then call exact_solution(iexact,iplotx,iploty,itrans(iplotx),itrans(iploty), & icoordsnew,ndim,ndimV,timei,xmin,xmax,gammai, & xplot(1:ntoti),yplot(1:ntoti),icolourme(1:ntoti),iamtype,npartoftype,iusetype, & pmassmin,pmassmax,ntoti,imarktype(1), & units_calc(iplotx),units_calc(iploty),irescale,iaxisy) endif !-------------------------------- ! now plot particles !-------------------------------- if (ismooth_particle_plots > 0) then npixx = 1024 npixy = 1024 if (.not.allocated(datpix)) allocate(datpix(npixx,npixy)) if (.not.allocated(brightness)) allocate(brightness(npixx,npixy)) pixwidth = (xmax - xmin)/npixx pixwidthy = (ymax - ymin)/npixy where (hh(1:ntoti) < 0.) icolourme(1:ntoti) = -1000 ! hide particles with negative h !print*,'PIXWIDTH = ',pixwidth,pixwidthy if (irender > 0) then ! here we colour the particles by a certain quantity call interpolate2D_pixels(xplot,yplot,icolourme,ntoti,xmin,ymin,xmax,ymax,& datpix,npixx,npixy,.true.,(ismooth_particle_plots==2),renderplot,brightness) ! scale opacity based on density of points, but only slightly if (ismooth_particle_plots==2) then brightness = 1. - exp(-brightness**0.3) else brightness = 1. endif call render_pix(datpix,rendermin,rendermax,'blah', & npixx,npixy,xmin,ymin,pixwidth,pixwidthy,3,.false.,0,ncontours,& .false.,.false.,alpha=brightness,transparent=.false.) else call interpolate2D_pixels(xplot,yplot,icolourme,ntoti,xmin,ymin,xmax,ymax,& datpix,npixx,npixy,.false.,(ismooth_particle_plots==2)) ! for more than one step per page, progressively sum pixel maps if (nstepsperpage /= 1) then if (allocated(datpixtot)) then if (size(datpixtot) /= size(datpix)) deallocate(datpixtot) endif if (.not.allocated(datpixtot)) then allocate(datpixtot(npixx,npixy)) datpixtot = 0. endif if (istepsonpage==1) datpixtot = 0. datpixtot = datpixtot + datpix datpix = datpixtot endif ! take log of particle density, but avoid log(0) where (datpix > 0.) datpix = log10(datpix) elsewhere datpix = -666. end where densmax = maxval(datpix) if (all(abs(datpix-densmax) < tiny(0.))) densmax = densmax + 6. ! hit lower end of colour bar if all zeros ! plot the resulting pixel map call render_pix(datpix,densmax-6.,densmax,'blah', & npixx,npixy,xmin,ymin,pixwidth,pixwidthy,3,.false.,0,ncontours,& .false.,.false.,transparent=(nstepsperpage /= 1)) endif if (allocated(datpix)) deallocate(datpix) if (allocated(brightness)) deallocate(brightness) else call particleplot(xplot(1:ntoti),yplot(1:ntoti), & zplot(1:ntoti),hh(1:ntoti),ntoti,iplotx,iploty, & icolourme(1:ntoti),iamtype,npartoftype(:),iusetype,.false., & zslicemin,zslicemax,' ',xmin,xmax,ymin,ymax,ifastparticleplot,interactive) endif !-------------------------------- ! plot error bars !-------------------------------- if (iploterrbars) then call plot_qci(icolourprev) ! query line style and colour call plot_sci(linecolourthisstep) ! set colour to current line !--y error bars if (ilocerrbars(iploty) > 0 .and. ilocerrbars(iploty) <= ndataplots) then call plot_errorbarsy(ntoti,xplot,yplot,dat(:,ilocerrbars(iploty)),itransy) endif !--x error bars if (ilocerrbars(iplotx) > 0 .and. ilocerrbars(iplotx) <= ndataplots) then call plot_errorbarsx(ntoti,xplot,yplot,dat(:,ilocerrbars(iplotx)),itransx) endif call plot_sci(icolourprev) ! restore line colour endif ! !--redraw axes over what has been plotted ! if (plotlib_is_pgplot .or. ismooth_particle_plots > 0) call redraw_axes(iaxis,just,yscalealt,itransy) ! !--annotate with time / marker legend and title ! call legends_and_title ! !--plot exact solution (after redrawn axis for residual plots) ! if (plot_exact .and. .not.iPlotExactUnder) then call exact_solution(iexact,iplotx,iploty,itrans(iplotx),itrans(iploty), & icoordsnew,ndim,ndimV,timei,xmin,xmax,gammai, & xplot(1:ntoti),yplot(1:ntoti),icolourme(1:ntoti),iamtype,npartoftype,iusetype, & pmassmin,pmassmax,ntoti,imarktype(1), & units_calc(iplotx),units_calc(iploty),irescale,iaxisy) endif ! !--enter interactive mode !--the following line sets the number of steps on page to nstepsonpage ! in the case where we reach the last timestep before nstepsonpage is reached ! (makes interactive replotting behave better) if (lastplot) istepsonpage = nstepsperpage if (interactive) then if (nacross*ndown==1 .and. (nstepsperpage==1 .or. nsteps==1)) then iadvance = nfreq call interactive_part(ntoti,iplotx,iploty,0,irenderpart,0,0,0, & xplot(1:ntoti),yplot(1:ntoti),zplot(1:ntoti), & hh(1:ntoti),icolourme(1:ntoti),iamtype,iusetype,npartoftype, & xmin,xmax,ymin,ymax,rendermin,rendermax,renderminadapt,rendermaxadapt,& contmin,contmax,contminadapt,contmaxadapt,vecmax, & angletempx,angletempy,angletempz,ndim,xorigin(1:ndim), & dumxsec,dummy,dummy,dummy,dummy,.false.,dummy,.false.,irerender, & itrackpart,icolours,iColourBarStyle,labelrender,iadvance,ipos,iendatstep,iframe,nframesloop,interactivereplot) if (iadvance==-666 .or. interactivereplot) exit over_frames ! this should be unnecessary elseif ((ipanel==nacross*ndown .and. istepsonpage==nstepsperpage) .or. lastplot) then ! !--timestep control only if multiple plots on page ! iadvance = nfreq nplots = ipanel irerender = .true. call interactive_multi(iadvance,ipos,ifirststeponpage,iendatstep,iframe,nframefirstonpage, & nframesloop,ipanel,iplotxtemp(1:nplots),iplotytemp(1:nplots),irendertemp(1:nplots),& icontourtemp(1:nplots),ivecplottemp(1:nplots),.false.,xminmulti(:),xmaxmulti(:),& vptxmin(1:nplots),vptxmax(1:nplots),vptymin(1:nplots),vptymax(1:nplots),barwmulti(1:nplots), & xminadapt(:),xmaxadapt(:),nacross,ndim,xorigin(1:ndim),icolours,iColourBarStyle,interactivereplot) if (iadvance==-666 .or. interactivereplot) exit over_frames endif endif elseif (iploty <= numplot) then! ie iploty = extra !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! additional plots (not plots of particle data - e.g where some additional ! information is read from a file and plotted on the same page as the ! particle plots, or where some additional plot is calculated ! from the particle data, such as errors etc) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (debugmode) print*,'DEBUG: starting extra plot...' !-------------------------------------------------------------- ! plot surface density, Toomre Q parameter ! or Probability Distribution Function ! => these all involve a new "y column" ! but use a particle property as the x axis !-------------------------------------------------------------- if (iploty==isurfdens .or. iploty==itoomre .or. iploty==ipdf) then just = 0 if (iploty==itoomre) then itemp = 2 label(iploty) = 'Q_{Toomre}' labely = trim(label(iploty)) elseif (iploty==isurfdens) then itemp = 1 label(iploty) = '\gS '//get_unitlabel_coldens(iRescale,labelzintegration,unitslabel(irho)) labely = trim(label(iploty)) elseif (iploty==ipdf) then label(iploty) = 'PDF ('//trim(label(iplotx))//')' labely = trim(label(iploty)) endif yplot(:) = 0. if (itrans(iploty) /= 0) then labely = trim(transform_label(label(iploty),itrans(iploty))) endif if ((.not.interactivereplot) .or. irerender) then !--call routines which actually calculate disc properties from the particles if (iploty==isurfdens .or. iploty==itoomre) then if (ispsound > 0 .and. ispsound <= ndataplots) then icol = ispsound ! sound speed is present in data elseif (iutherm > 0 .and. iutherm <= ndataplots) then icol = iutherm ! use thermal energy if spsound not present else icol = 0 endif ! work out the unit of mass, r needed for computing Toomre Q unit_mass = 1.d0 unit_r = 1.d0 unit_u = 1.d0 unit_dz = 1.d0 unit_dens = 1.d0 if (iRescale) then if (ix(1) > 0) unit_r = units(ix(1)) if (icol > 0) unit_u = units(icol) if (irho > 0) unit_dens = units(irho) unit_dz = unitzintegration endif ! ! use mass of first sink particle for Toomre Q calculation ! !isinktype = get_sink_type(ntypes) !call locate_nth_particle_of_type(1,isink1,isinktype,iamtype,npartoftype,ntoti) !mstari = 1.d0 if (ipmass > 0 .and. ipmass <= ndataplots) then !if (isink1 > 0) mstari = dat(isink1,ipmass) if (iRescale) unit_mass = units(ipmass) if (icol > 0) then call disccalc(itemp,ntoti,xplot(1:ntoti),ntoti,dat(1:ntoti,ipmass),& unit_mass,unit_dens,unit_r,unit_dz,xmin,xmax,yminadapti,ymaxadapti,& itrans(iplotx),itrans(iploty),icolourme(1:ntoti),iamtype,& iusetype,npartoftype,gammai,mstari,& unit_u,dat(1:ntoti,icol),icol==ispsound) else call disccalc(itemp,ntoti,xplot(1:ntoti),ntoti,dat(1:ntoti,ipmass),& unit_mass,unit_dens,unit_r,unit_dz,xmin,xmax,yminadapti,ymaxadapti,& itrans(iplotx),itrans(iploty),icolourme(1:ntoti),iamtype,& iusetype,npartoftype,gammai,mstari) endif else if (iRescale .and. irho > 0) unit_mass = units(irho)*unitzintegration**3 if (icol > 0) then call disccalc(itemp,ntoti,xplot(1:ntoti),1,masstype(1),& unit_mass,unit_dens,unit_r,unit_dz,xmin,xmax,yminadapti,ymaxadapti,& itrans(iplotx),itrans(iploty),icolourme(1:ntoti),iamtype,& iusetype,npartoftype,gammai,mstari,& unit_u,dat(1:ntoti,icol),icol==ispsound) else call disccalc(itemp,ntoti,xplot(1:ntoti),1,masstype(1),& unit_mass,unit_dens,unit_r,unit_dz,xmin,xmax,yminadapti,ymaxadapti,& itrans(iplotx),itrans(iploty),icolourme(1:ntoti),iamtype,& iusetype,npartoftype,gammai,mstari) endif endif elseif (iploty==ipdf) then if (npdfbins > 0) then ngrid = npdfbins else ! automatic number of bins determination ngrid = int(0.75*ntoti**(1./3.))+1 endif call set_grid1D(xmin,xmax,1.,ngrid) !--call routine which calculates pdf on the particles !--compute PDF on raw (un-transformed) data xplot(1:ntoti) = dat(1:ntoti,iplotx) call pdf_calc(ntoti,xplot(1:ntoti),xmin,xmax,ngrid,xgrid,datpix1D, & yminadapti,ymaxadapti,(npdfbins > 0),ierr,icolourme(1:ntoti)) ! !--write PDF to file ! if (ierr==0) then call pdf_write(ngrid,xgrid,datpix1D,label(iplotx), & rootname(ifileopen),tagline) endif ! !--apply transformations to PDF data ! if (itrans(iplotx) > 0) then !--reapply the x transform call transform(xplot,itrans(iplotx)) endif if (itrans(iploty) > 0) then call transform(datpix1D,itrans(iploty)) call transform_limits(yminadapti,ymaxadapti,itrans(iploty)) endif endif endif if (iadapt .and. .not.interactivereplot) then if (iverbose > 1) print "(1x,a)",'adapting '//trim(labely)//' limits' ymin = yminadapti ymax = ymaxadapti endif call page_setup call plot_qci(icolourprev) ! query line style and colour call plot_qls(linestyleprev) ! set appropriate colour and style if multiple steps per page if (nstepsperpage /= 1) then call plot_sci(linecolourthisstep) call plot_sls(linestylethisstep) endif if (iploty==itoomre .or. iploty==isurfdens) then call discplot() elseif (iploty==ipdf) then ! !--plot PDF as line segment, with blanking at zero ! call plotline(size(xgrid),xgrid,datpix1D,blank=0.) endif !--restore line size and colour call plot_sci(icolourprev) call plot_sls(linestyleprev) if (plotlib_is_pgplot) call redraw_axes(iaxis,just,yscalealt,itransy) call legends_and_title ! !--plot exact solution (after redrawn axis for residual plots) ! if (plot_exact) then call exact_solution(iexact,iplotx,iploty,itrans(iplotx),itrans(iploty), & icoordsnew,ndim,ndimV,timei,xmin,xmax,gammai, & xplot(1:ntoti),yplot(1:ntoti),icolourme(1:ntoti),iamtype,npartoftype,iusetype, & pmassmin,pmassmax,ntoti,imarktype(1), & units_calc(iplotx),units_calc(iploty),irescale,iaxisy) endif if (lastplot) istepsonpage = nstepsperpage if (interactive .and. ((ipanel==nacross*ndown .and. istepsonpage==nstepsperpage) .or. lastplot)) then iadvance = nfreq nplots = ipanel irerender = .true. call interactive_multi(iadvance,ipos,ifirststeponpage,iendatstep,iframe,nframefirstonpage, & nframesloop,ipanel,iplotxtemp(1:nplots),iplotytemp(1:nplots),irendertemp(1:nplots),& icontourtemp(1:nplots),ivecplottemp(1:nplots),.false.,xminmulti(:),xmaxmulti(:),& vptxmin(1:nplots),vptxmax(1:nplots),vptymin(1:nplots),vptymax(1:nplots),barwmulti(1:nplots), & xminadapt(:),xmaxadapt(:),nacross,ndim,xorigin(1:ndim),icolours,iColourBarStyle,interactivereplot) if (iadvance==-666 .or. interactivereplot) exit over_frames endif cycle over_plots !-------------------------------------------------------------- ! plot Toy star A-C plane solution !-------------------------------------------------------------- elseif (iexact==4 .and. iploty==iacplane) then ! !--A vs C for exact toystar solution ! if (ndim==1) then call exact_toystar_acplane(atstar,ctstar,sigma,gammai) elseif (ndim==2) then call exact_toystar_acplane2D(atstar,ctstar,sigma,gammai) endif !--increment page counter as setpage is not called iplots = iplots + 1 ipanel = ipanel + 1 if (ipanel > nacross*ndown) ipanel = 1 !-------------------------------------------------------------- ! power spectrum plots (uses x and data as yet unspecified) !-------------------------------------------------------------- elseif (iploty==ipowerspec) then labelx = 'frequency' labely = 'power' ! !--3D: use FFT routines ! if (ndim==3) then call set_weights(weight,dat,iamtype,iusetype) yplot = 0. xmin = max(minval(xplot(1:nfreqspec)),1.0) xmax = maxval(xplot(1:nfreqspec)) nfreqpts = nfreqspec else ! !--1D: use slow FT routines or Lomb periodogram ! if (.not.interactivereplot) then xmin = freqmin ! freq min xmax = freqmax ! freq max endif if (.not.interactivereplot .and. itrans(iploty) > 0) then call transform_limits(xmin,xmax,itrans(iploty)) endif ! !--setup frequency grid (evenly spaced in transformed grid) ! nfreqpts = nfreqspec if (nfreqpts >= size(xplot)) then nfreqpts = size(xplot) print*,' WARNING: nfreqpts > array size, restricting to ',nfreqpts else print "(a,i6)",' number of frequency points = ',nfreqpts endif dxfreq = (xmax - xmin)/real(nfreqpts) do i=1,nfreqpts xplot(i) = xmin + (i-1)*dxfreq enddo ! !--transform back to frequency space ! if (itrans(iploty) > 0) & call transform_inverse(xplot(1:nfreqpts),itrans(iploty)) if (.not.idisordered) then! interpolate first !!--allocate memory for 1D grid (size = 2*npart) ngrid = 2*npartoftype(1) !!--set up 1D grid xmingrid = lim(ipowerspecx,1) xmaxgrid = lim(ipowerspecx,2) dxgrid = (xmaxgrid-xmingrid)/ngrid call set_grid1D(xmingrid,xmaxgrid,dxgrid,ngrid) ninterp = ntoti !!--interpolate to 1D grid call set_weights(weight,dat,iamtype,iusetype) call interpolate1D(dat(1:ninterp,ipowerspecx),hh(1:ninterp), & weight(1:ninterp),dat(1:ninterp,ipowerspecy),icolourme(1:ninterp), & ninterp,xmingrid,datpix1D,ngrid,dxgrid,inormalise,iverbose) !!--plot interpolated 1D data to check it !!print*,minval(datpix1D),maxval(datpix1D) !call pgswin(xmin,xmax,minval(datpix1D),maxval(datpix1D),0,1) !call pgbox('BCNST',0.0,0,'1BVCNST',0.0,0) !call pglabel('x',label(ipowerspecy),'1D interpolation') !call pgline(ngrid,xgrid,datpix1D) !read* !call pgpage! change page !!--call power spectrum calculation on the even grid call powerspectrum(ngrid,xgrid,datpix1D,nfreqpts,xplot(1:nfreqpts), & yplot(1:nfreqpts),idisordered) if (allocated(datpix1D)) deallocate(datpix1D) if (allocated(xgrid)) deallocate(xgrid) else !!--or else call power spectrum calculation on the particles themselves call powerspectrum(ntoti,dat(1:ntoti,ipowerspecx), & dat(1:ntoti,ipowerspecy),nfreqpts, & xplot(1:nfreqpts),yplot(1:nfreqpts),idisordered) endif endif if (.not.interactivereplot) then ymin = minval(yplot(1:nfreqspec)) ymax = maxval(yplot(1:nfreqspec)) endif !!--uncomment next few lines to plot wavelengths instead labelx = 'period' zplot(1:nfreqspec) = 1./xplot(1:nfreqspec) xplot(1:nfreqspec) = zplot(1:nfreqspec) if (.not.interactivereplot) then xmin = minval(xplot(1:nfreqspec)) xmax = maxval(xplot(1:nfreqspec)) endif if (itrans(iploty) /= 0) then call transform(xplot(1:nfreqpts),itrans(iploty)) labelx = transform_label(labelx,itrans(iploty)) call transform(yplot(1:nfreqpts),itrans(iploty)) labely = transform_label(labely,itrans(iploty)) if (.not.interactivereplot) then call transform_limits(xmin,xmax,itrans(iploty)) call transform_limits(ymin,ymax,itrans(iploty)) endif endif just = 0 call page_setup call plot_qci(icolourprev) ! query line style and colour call plot_qls(linestyleprev) if (nstepsperpage /= 1) then call plot_sci(linecolourthisstep) ! set appropriate colour and style if multiple steps per page call plot_sls(linestylethisstep) endif call plot_line(nfreqpts,xplot(1:nfreqpts),yplot(1:nfreqpts)) print*,' maximum power at '//trim(labelx)//' = ',xplot(maxloc(yplot(1:nfreqpts))) call plot_sci(icolourprev) call plot_sls(linestyleprev) ! !--redraw axes over what has been plotted ! if (plotlib_is_pgplot) call redraw_axes(iaxis,just,yscalealt,itransy) ! !--annotate with time / marker legend and title ! call legends_and_title elseif (iploty==icolpixmap) then !-------------------------------------------------------------- ! plot the contents of a pixel map read from a file !-------------------------------------------------------------- ! !--irender should already be set, associating the pixmap ! with a column from the SPH data. Then we can use the ! limit settings from the SPH data. Otherwise just ! treat it like a separate column. ! if (irender==0) irender = icolpixmap !--datpix is allocated inside the readpixmap routine if (allocated(datpix)) deallocate(datpix) if (irender==icolpixmap) then labelrender = '|B_\phi|/|B_p|' else labelrender = label(irender) endif call readpixmap(datpix,npixx,npixy,rootname(ifileopen),& shortlabel(labelrender,unitslabel(irender)),istep,x_sec,ierr) if (.not.interactivereplot) then if (ndim >= 1) then xmin = lim(ix(1),1) xmax = lim(ix(1),2) else xmin = 0. xmax = 1. endif if (ndim >= 2) then ymin = lim(ix(2),1) ymax = lim(ix(2),2) else ymin = 0. ymax = 1. endif endif if (ndim >= 1) iplotx = ix(1) if (ndim >= 2) then iploty = ix(2) labely = label(ix(2)) endif pixwidth = (xmax-xmin)/real(npixx) if (itrans(irender) /= 0 .and. allocated(datpix)) then call transform(datpix,itrans(irender),errval=error_in_log) endif labelrender = transform_label(labelrender,itrans(irender)) !--find (adaptive) limits of rendered array if (allocated(datpix)) then renderminadapt = minval(datpix,mask=abs(datpix-error_in_log) > tiny(datpix)) rendermaxadapt = maxval(datpix) endif !--limits for rendered quantity if (.not.interactivereplot) then if (iadapt) then rendermin = renderminadapt rendermax = rendermaxadapt else !!--use fixed limits and apply transformations rendermin = lim(irender,1) rendermax = lim(irender,2) call transform_limits(rendermin,rendermax,itrans(irender)) endif endif just = 1 iPlotColourBar = .true. call page_setup if (ierr==0 .and. allocated(datpix)) then !!--call subroutine to actually render the image call render_pix(datpix,rendermin,rendermax,trim(labelrender), & npixx,npixy,xmin,ymin,pixwidth,pixwidth, & icolours,iplotcont,0,0,.false.,.false.) endif ! !--redraw axes over what has been plotted ! if ((allocated(datpix) .and. ierr==0) .or. plotlib_is_pgplot) then call redraw_axes(iaxis,just,yscalealt,itransy) endif ! !--annotate with time / marker legend and title ! call legends_and_title irender = 0 iploty = icolpixmap iplotx = 0 else !-------------------------------------------------------------- ! plot the contents of an extra two-column ascii file !-------------------------------------------------------------- call exact_fromfile('gwaves1.dat',xplot,yplot,1,2,nfreqpts,ierr) just = 0 labelx = 't [ms]' labely = 'h' if (.not.interactivereplot) then xmin = minval(xplot(1:nfreqpts)) xmax = maxval(xplot(1:nfreqpts)) ymin = minval(yplot(1:nfreqpts)) ymax = maxval(yplot(1:nfreqpts)) !--adjust y axes ymin = (ymin + ymax)/2. - 0.55*(ymax-ymin) ymax = (ymin + ymax)/2. + 0.55*(ymax-ymin) endif call page_setup !--plot extra point corresponding to current time ipt = 0 do i=1,nfreqpts-1 if (xplot(i) <= timei .and. xplot(i+1) > timei) ipt = i enddo if (ipt /= 0) then call plot_pt1(xplot(ipt),yplot(ipt),4) call plot_line(ipt,xplot(1:ipt),yplot(1:ipt)) endif if (plotlib_is_pgplot) call redraw_axes(iaxis,just,yscalealt,itransy) call legends_and_title endif !--the following line sets the number of steps on page to nstepsonpage ! in the case where we reach the last timestep before nstepsonpage is reached ! (makes interactive replotting behave better) if (lastplot) istepsonpage = nstepsperpage if (interactive .and.((ipanel==nacross*ndown .and. istepsonpage==nstepsperpage) & .or. lastplot)) then iadvance = nfreq call interactive_step(iadvance,ipos,iendatstep,xmin,xmax,ymin,ymax,interactivereplot) irerender = .true. if (iadvance==-666) exit over_frames endif !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! if plot not in correct range !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else print*,' error in plotting : iplotx = ',iplotx,' iploty =',iploty, 'numplot =',numplot call plot_page! just skip to next plot endif ! ploty = whatever enddo over_plots ! over plots per timestep (nyplot) enddo over_frames ! over nframes for animation sequences ! !--frame changing for multiple steps on the page (ie. page split into panels) ! iframesave = 0 if (iadvance /= -666 .and..not.interactivereplot) then if (nacross*ndown > 1 .and. insidesequence(iseqpos)) then !--for the last panel on the page, reset the sequence for next time if (ipanel==nacross*ndown) then if (iframe < nframes) then ipos = ipos - nacross*ndown endif iframesave = iframe else iframesave = iframe - 1 endif endif endif !--set required columns for subsequent plots (e.g. if rendered quantity ! is changed interactively using the 'f' or 'F' option) ! ! Here we simply require ALL columns to be read if f/F is used ! since the assumption is that the user wants to flick through different ! quantities. Otherwise could set required just for new column and ! check dependencies ! if (irender /= irender_nomulti .and. irender > 0) then irender_nomulti = irender required(:) = .true. if (ipartialread) ifileopen = 0 ! force the file to be re-read endif !--free all dynamically allocated memory if (.not.interactivereplot) then if (allocated(datpix1D)) deallocate(datpix1D) if (allocated(datpix)) deallocate(datpix) if (allocated(brightness)) deallocate(brightness) if (allocated(datpix3D)) deallocate(datpix3D) if (allocated(xgrid)) deallocate(xgrid) if (allocated(vecplot)) deallocate(vecplot) if (allocated(datpixcont)) deallocate(datpixcont) if (allocated(datpixcont3D)) deallocate(datpixcont3D) endif !if (.not.interactivereplot) then ! restore original labels... label = labelorig !endif !--free temporary arrays if (allocated(xplot)) deallocate(xplot) if (allocated(yplot)) deallocate(yplot) if (allocated(zplot)) deallocate(zplot) if (allocated(hh)) deallocate(hh) if (allocated(weight)) deallocate(weight) if (allocated(rkappa)) deallocate(rkappa) if (allocated(renderplot)) deallocate(renderplot) if (allocated(contourplot)) deallocate(contourplot) return contains !---------------------------------------------- ! interfaces to the page setup routines ! this is called just before a plot is ! actually plotted !---------------------------------------------- subroutine page_setup(dummy_run) use colourbar, only:get_colourbarmargins use pagesetup, only:setpage2 use settings_page, only:nstepsperpage,iUseBackgroundColourForAxes, & vposlegend,iPlotLegend,usecolumnorder,interactive,& xminpagemargin,xmaxpagemargin,yminpagemargin,ymaxpagemargin use settings_limits, only:adjustlimitstodevice use plotlib, only:plot_qvp,plot_sci,plot_page,plotlib_is_pgplot,plot_set_opacity,plot_qcur use limits, only:fix_equal_limits integer :: iplotsave,ipanelsave,ipanelpos,npanels_remaining real :: barwidth, TitleOffset,xminmargin,xmaxmargin,yminmargin,ymaxmargin real :: xminpix,xmaxpix,yminpix,ymaxpix,dxpix logical :: ipanelchange,dum,iprint_axes,lastrow logical, intent(in), optional :: dummy_run character(len=7) :: string !-------------------------------------------- ! whether or not this is a dummy call or not !-------------------------------------------- if (present(dummy_run)) then dum = dummy_run if (debugmode) print*,'DEBUG: entering page setup (dummy)' else dum = .false. if (debugmode) print*,'DEBUG: entering page setup' endif !--------------------- ! increment counters !--------------------- iplotsave = iplots ipanelsave = ipanel iplots = iplots + 1 ipanelchange = .true. !if (nstepsperpage==0 .and. iplots > 1) ipanelchange = .false. ! this is an option to never change panels if (iplots > 1 .and. nyplots==1 .and. nacross*ndown > 1.and..not.ipagechange) ipanelchange = .false. if (ipanelchange) ipanel = ipanel + 1 if (ipanel > nacross*ndown) ipanel = 1 ipanel = max(ipanel,1) ! catch panel=0 if panel is not changing !--set counter for where we are in row, col if (.not.usecolumnorder) then irow = ipanel - ((ipanel-1)/ndown)*ndown icolumn = (ipanel-1)/ndown + 1 ipanelpos = (irow-1)*nacross + icolumn else icolumn = ipanel - ((ipanel-1)/nacross)*nacross irow = (ipanel-1)/nacross + 1 ipanelpos = ipanel endif !--if we are in interactive mode, use the currently buffered plot limits if (interactivereplot .and. (nacross*ndown > 1 .or. (nstepsperpage /= 1 .and. nsteps > 1))) then xmin = xminmulti(iplotx) xmax = xmaxmulti(iplotx) ymin = xminmulti(iploty) ymax = xmaxmulti(iploty) if (ivectorplot > 0 .and. ivectorplot <= numplot) then vecmax = xmaxmulti(ivectorplot) endif endif !nsteps_remaining = (nsteps - istep)/nstepsperpage !nplots_remaining = (nyplots - nyplot)/nstepsperpage npanels_remaining = (nsteps - istep)/nstepsperpage !nplots_remaining*nsteps_remaining ! npanels_remaining = (nsteps - istep)*nyplots/nstepsperpage lastrow = (usecolumnorder .and. npanels_remaining < nacross .and. nacross > 1) lastplot = ((ipos==iendatstep .or. istep==nsteps) & .and. nyplot==nyplotend .and. k==nxsec) lastinpanel = (istepsonpage==nstepsperpage .or. lastplot) plot_exact = (iexact /= 0 .and.nyplot <= nacross*ndown .and. ipanelselect(iPlotExactOnlyOnPanel,ipanel,irow,icolumn)) iaxisy = iaxis if (tile_plots .and. icolumn /= 1) iaxisy = -1 !-------------------------------------------------------------- ! output some muff to the screen !-------------------------------------------------------------- if ((((interactive .and. ((ipanel==nacross*ndown .and. istepsonpage==nstepsperpage) .or. lastplot)) & .or. (iadapt .and. lastinpanel)) .and. .not.dum).and. iverbose >= 0) then if (.not.same_limits(xmin,xmax,xminwas,xmaxwas)) & print "(1x,a,' min, max = ',1pg12.5,2x,1pg12.5)",trim(labelx),xmin,xmax if (.not.same_limits(ymin,ymax,yminwas,ymaxwas)) & print "(1x,a,' min, max = ',1pg12.5,2x,1pg12.5)",trim(labely),ymin,ymax if (irender > 0 .and. .not.(ndim==2 .and. x_sec)) then if (.not.same_limits(rendermin,rendermax,renderminwas,rendermaxwas)) & print "(1x,a,' min, max = ',1pg12.5,2x,1pg12.5)",trim(labelrender),rendermin,rendermax if (gotcontours .and. .not.same_limits(contmin,contmax,contminwas,contmaxwas)) & print "(1x,a,' min, max = ',1pg12.5,2x,1pg12.5)",trim(labelcont),contmin,contmax endif endif !-------------------------------------------------------------- ! set up pgplot page !-------------------------------------------------------------- !--use foreground colour if (.not.dum) call plot_sci(1) !--page margins: zero if no box is drawn ! xminmargin = 0.0 ! xmaxmargin = 0.0 ! yminmargin = 0.0 ! ymaxmargin = 0.0 xminmargin = xminpagemargin xmaxmargin = xmaxpagemargin yminmargin = yminpagemargin ymaxmargin = ymaxpagemargin !--leave space for colour bar if necessary (at end of row only on tiled plots) if ((tile_plots .and. iAllowspaceforcolourbar).or.(.not.tile_plots.and.iPlotColourBar)) then call get_colourbarmargins(iColourBarStyle,xminmargin,xmaxmargin,yminmargin,ymaxmargin,barwidth) else barwidth = 0. endif !--work out whether or not to leave space above plots for titles/legends TitleOffset = -tiny(Titleoffset) if (iPlotTitles .and. nstepsperpage==1 .and. vpostitle > 0.) TitleOffset = vpostitle if (iPlotLegend .and. nstepsperpage==1 .and. vposlegend < 0.) TitleOffset = max(Titleoffset,-vposlegend) inewpage = (ipanel==1 .and. ipanelchange .and. ipagechange) .or. & (nstepsperpage==0 .and. istepsonpage==1 .and. ipanel==1 .and. nyplot==1) if ((inewpage .or. (nstepsperpage > 1 .and. istepsonpage==1 .and. ipanel==1)) .and. .not.dum) then call plot_page !--store ipos and nyplot positions for first on page ! as starting point for interactive replotting nyplotfirstonpage = nyplot ifirststeponpage = ipos nframefirstonpage = iframe endif ! !--do not allow limits to be the same ! if (abs(xmax-xmin) < tiny(xmax)) then if (.not.dum) print "(a)",' WARNING: '//trim(labelx)//'min='//trim(labelx)//'max ' call fix_equal_limits(xmin,xmax) endif if (abs(ymax-ymin) < tiny(ymax)) then if (.not.dum) print "(a)",' WARNING: '//trim(labely)//'min='//trim(labely)//'max ' call fix_equal_limits(ymin,ymax) endif if (irender > 0 .and. abs(rendermax-rendermin) < tiny(rendermax) .or.rendermax /= rendermax) then if (.not.dum) print "(a)",' WARNING: '//trim(labelrender)//'min='//trim(labelrender)//'max ' call fix_equal_limits(rendermin,rendermax) endif if (debugmode) print*,'DEBUG: calling setpage with ',nstepsperpage,' steps per page' if (debugmode) print*,'DEBUG: xmin,xmax,ymin,ymax=',xmin,xmax,ymin,ymax if (nstepsperpage > 0 .or. inewpage) then if (dum) then !--fake the page setup, then return if (.not.(interactivereplot .and. .not.irerender)) then call setpage2(ipanelpos,nacross,ndown,xmin,xmax,ymin,ymax, & trim(labelx),trim(labely),'NOPGBOX',just,iaxistemp, & xminmargin,xmaxmargin,yminmargin,ymaxmargin, & 0.0,TitleOffset,isamexaxis,tile_plots,adjustlimitstodevice, & lastrow,lastplot,yscalealt,labelyalt,itransy) call plot_qvp(3,xminpix,xmaxpix,yminpix,ymaxpix) if (debugmode) print*,'DEBUG: viewport xpix=',xminpix,'->',xmaxpix,' ypix=',yminpix,'->',ymaxpix npixx = max(nint(xmaxpix-xminpix),1) npixy = max(nint(ymaxpix-yminpix),1) if (debugmode) print*,'DEBUG: dx = ',xmax-xmin,' dy = ',ymax-ymin if (debugmode) print*,'DEBUG: dxpix = ',xmaxpix-xminpix,' dypix = ',ymaxpix-yminpix if (debugmode) print*,'DEBUG: nx,ny = ',npixx,npixy if (vectordevice .and. npixx > 1024) then npixx = 1024/nacross dxpix = (xmax-xmin)/npixx npixy = int(0.999*abs((ymax-ymin)/real(dxpix))) + 1 print "(a,i4,a,i4,a)",' auto-selecting resolution of ',npixx,' x ',npixy,' for vector device' print "(a)",' => set the number of pixels manually if you want more (or less) than this.' else if (npix==0 .and. debugmode) & print "(a,i4,a,i4)",' auto-selecting device resolution = ',npixx,' x ',npixy ! !--warn about PGPLOT limitations ! if (plotlib_is_pgplot) then if ((xmaxpix-xminpix) > 1024. .or. (ymaxpix-yminpix) > 1024) then print "(/,75('*'))" print "(a)",'!! WARNING: PGPLOT will truncate image to 1024 pixels on pixel devices.' print "(a)",'!! To fix this, change line 18 of file grimg2.f in the PGPLOT source code:' print "(a)",'!! real BUFFER(1026)' print "(a)",'!! changing 1026 to something much bigger, then recompile PGPLOT.' print "(75('*'),/)" endif endif endif endif !--restore saved attributes iplots = iplotsave ipanel = ipanelsave if (debugmode) print*,'DEBUG: finished dummy page setup' return else !--if we are not changing page, do not reprint the axes iprint_axes = ipagechange .or. inewpage .or. & ((iplots <= nacross*ndown) .and. (nyplot <= nacross*ndown .and. istepsonpage==1)) if (iprint_axes) then if (debugmode) print*,'DEBUG: axes=YES ',ipagechange,inewpage,iplots,nyplot,istepsonpage string = ' ' else if (debugmode) print*,'DEBUG: axes=NO ',ipagechange,inewpage,iplots,nyplot,istepsonpage string = 'NOPGBOX' endif call setpage2(ipanelpos,nacross,ndown,xmin,xmax,ymin,ymax, & trim(labelx),trim(labely),string,just,iaxistemp, & xminmargin,xmaxmargin,yminmargin,ymaxmargin, & 0.0,TitleOffset,isamexaxis,tile_plots,adjustlimitstodevice, & lastrow,lastplot,yscalealt,labelyalt,itransy) endif endif if (debugmode) print*,'DEBUG: setpage ok, querying and saving viewport...' !--query and save viewport co-ordinates set up for this panel call plot_qvp(0,vptxmin(ipanel),vptxmax(ipanel),vptymin(ipanel),vptymax(ipanel)) !-------------------------------------------------------------- ! store current page setup for interactive mode on multiplots !-------------------------------------------------------------- if (tile_plots) then barwmulti(ipanel) = 0. else barwmulti(ipanel) = barwidth endif iplotxtemp(ipanel) = iplotx iplotytemp(ipanel) = iploty irendertemp(ipanel) = irender icontourtemp(ipanel) = icontourplot ivecplottemp(ipanel) = ivectorplot xminmulti(iplotx) = xmin xmaxmulti(iplotx) = xmax xminmulti(iploty) = ymin xmaxmulti(iploty) = ymax if (irender > 0 .and. irender <= size(xmaxmulti)) then xminmulti(irender) = rendermin xmaxmulti(irender) = rendermax if (icontourplot > 0 .and. gotcontours .and. icontourplot <= size(xmaxmulti)) then xminmulti(icontourplot) = contmin xmaxmulti(icontourplot) = contmax endif endif if (ivectorplot > 0 .and. ivectorplot <= numplot) then xmaxmulti(ivectorplot) = vecmax endif ! ! store adaptive plot limits for a) in interactive mode ! on multiple plots per page ! !--adaptive plot limits are allowed to change even during ! interactive replotting !if (.not.interactivereplot) then if (inewpage) then xminadapt = huge(xminadapt) xmaxadapt = -huge(xmaxadapt) endif xminadapt(iplotx) = min(xminadapt(iplotx),xminadapti) xmaxadapt(iplotx) = max(xmaxadapt(iplotx),xmaxadapti) xminadapt(iploty) = min(xminadapt(iploty),yminadapti) xmaxadapt(iploty) = max(xmaxadapt(iploty),ymaxadapti) if (irender > 0) then xminadapt(irender) = min(xminadapt(irender),renderminadapt) xmaxadapt(irender) = max(xmaxadapt(irender),rendermaxadapt) if (icontourplot > 0) then xminadapt(icontourplot) = min(xminadapt(icontourplot),contminadapt) xmaxadapt(icontourplot) = max(xmaxadapt(icontourplot),contmaxadapt) endif endif !endif !--change to background colour index for overlaid text and axes if (iUseBackGroundColourForAxes) then call plot_sci(0) call plot_set_opacity(1.) ! ensure background colour is opaque endif if (debugmode) print*,'DEBUG: finished page setup' end subroutine page_setup !------------------------------------------------------ ! draws legend(s), titles etc ! (must be called after rendering otherwise rendering ! will overwrite plot area) !------------------------------------------------------ subroutine legends_and_title use colourbar, only:plotcolourbar,isfloating use legends, only:legend,legend_markers,legend_scale,ipanelselect use titles, only:pagetitles,steplegend,lensteplegend use filenames, only:nstepsinfile,nfiles,rootname use settings_page, only:iPlotLegend,iPlotStepLegend, & hposlegend,vposlegend,fjustlegend,legendtext,iPlotLegendOnlyOnPanel, & iPlotScale,iscalepanel,dxscale,hposscale,vposscale,scaletext,& alphalegend,iUseBackGroundColourForAxes use shapes, only:nshapes,plot_shapes use pagesetup, only:xlabeloffset use plotlib, only:plot_qci,plot_sci,plot_annotate,plot_set_opacity use labels, only:is_coord,headertags,count_non_blank use asciiutils, only:add_escape_chars use exact, only:iExactLineColour,iExactLineStyle,ExactLegendText,get_nexact integer :: icoloursave character(len=lensteplegend) :: steplegendtext real :: xlabeloffsettemp integer :: ititle,nhdr,k,kk,nexact logical :: usebox !--save colour index call plot_qci(icoloursave) !--use foreground colour by default for legends call plot_sci(1) !-------------------------------------------------------------- ! plot colour bar for rendered plots (use currently set colour) ! do this here so it always appears OVERLAID on the renderings !-------------------------------------------------------------- if (irender > 0) then !--only plot colour bar at the end of first row on tiled plots if (tile_plots .and..not.(ipanel==nacross*ndown .or. lastplot .or. & (OneColourBarPerRow.and.icolumn==nacross) .or. & (OneColourBarPerColumn .and. irow==ndown))) iPlotColourBar = .false. if (iPlotColourBar .and. istepsonpage==1) then xlabeloffsettemp = xlabeloffset + 1.0 if (iaxistemp < 0) xlabeloffsettemp = 0. if (iUseBackGroundColourForAxes .and. isfloating(iColourBarStyle)) call plot_sci(0) !--for tiled plots only on last plot in first row, ! and use full viewport size in the y direction if (tile_plots .and. .not.(OneColourBarPerRow .or. OneColourBarPerColumn)) then if (double_rendering .and. gotcontours) then call plotcolourbar(iColourBarStyle,icolours,contmin,contmax, & trim(labelcont),.false.,xlabeloffsettemp, & minval(vptxmin(1:ipanel)),maxval(vptxmax(1:ipanel)), & minval(vptymin(1:ipanel)),maxval(vptymax(1:ipanel))) else call plotcolourbar(iColourBarStyle,icolours,rendermin,rendermax, & trim(labelrender),.false.,xlabeloffsettemp, & minval(vptxmin(1:ipanel)),maxval(vptxmax(1:ipanel)), & minval(vptymin(1:ipanel)),maxval(vptymax(1:ipanel))) endif elseif (.not.tile_plots .or. (OneColourBarPerRow .and. icolumn==nacross) & .or. (OneColourBarPerColumn .and. irow==ndown)) then !!--plot colour bar if (double_rendering .and. gotcontours) then !--for double rendering, plot the colour bar in the 2nd quantity call plotcolourbar(iColourBarStyle,icolours,contmin,contmax, & trim(labelcont),.false.,xlabeloffsettemp) else call plotcolourbar(iColourBarStyle,icolours,rendermin,rendermax, & trim(labelrender),.false.,xlabeloffsettemp) endif endif endif endif !--plot time on plot if (iPlotLegend .and. nyplot==1 & .and. ipanelselect(iPlotLegendOnlyOnPanel,ipanel,irow,icolumn) & .and. (timei > -0.5*huge(timei) .or. index(legendtext,'%') > 0)) then ! but not if time has not been read from dump !--change to background colour index for legend text if overlaid if (iUseBackGroundColourForAxes .and. vposlegend > 0.) then call plot_sci(0) call plot_set_opacity(alphalegend) endif usebox = (ivectorplot > 0) if (istepsonpage==1) then nhdr = count_non_blank(headertags) call legend(legendtext,timei,nhdr,headervalsi,headertags,labeltimeunits,& hposlegend,vposlegend,fjustlegend,usebox) endif endif !--line/marker style/colour legend for multiple timesteps on same page if (iPlotStepLegend .and. istepsonpage > 0 & .and.((nyplot==1 .and. iPlotLegendOnlyOnPanel==0) & .or. ipanelselect(iPlotLegendOnlyOnPanel,ipanel,irow,icolumn))) then !--change to background colour index for overlaid text and axes if (iUseBackGroundColourForAxes .and. vposlegend > 0.) call plot_sci(0) ! !--use filenames in legendif none set ! if (nstepsperpage >= 1 .and. nsteplegendlines >= nstepsperpage*nacross*ndown) then steplegendtext = steplegend(istepsonpage + (ipanel-1)*nstepsperpage) elseif (istepsonpage <= nsteplegendlines) then steplegendtext = steplegend(istepsonpage) elseif (all(nstepsinfile(1:nfiles) <= 1)) then steplegendtext = add_escape_chars(rootname(istep)) else write(steplegendtext,"(a,i4)") 'step ',istep endif if (debugmode) print "(a,i2,a)",& ' DEBUG: plotting step legend (step ',istepsonpage,': "'//trim(steplegendtext)//'")' if (iploty > ndataplots) then call legend_markers(istepsonpage,linecolourthisstep,imarktype(1),linestylethisstep, & .false.,.true.,trim(steplegendtext),hposlegend,vposlegend,1.0) else call legend_markers(istepsonpage,linecolourthisstep,imarktype(1),linestylethisstep, & iusetype(1),iplotline,trim(steplegendtext),hposlegend,vposlegend,1.0) endif ! ! add exact solution line to the legend ! if (lastinpanel .and. plot_exact) then nexact = get_nexact(iexact) kk = 0 do k=1,nexact if (len_trim(ExactLegendText(k)) > 0) then kk = kk + 1 call legend_markers(istepsonpage+k,iExactLineColour(k),imarktype(1),iExactLineStyle(k), & .false.,.true.,ExactLegendText(k),hposlegend,vposlegend,1.0) endif enddo endif endif !--use foreground colour by default for title call plot_sci(1) !--print title if appropriate if (iPlotTitles .and. istepsonpage==1 .and. ipanel <= ntitles) then if (ntitles > nacross*ndown) then ititle = (ipos - 1)/nstepsperpage + 1 if (ititle > ntitles) ititle = ipanel else ititle = ipanel endif if (len_trim(pagetitles(ititle)) > 0) then !--change to background colour index if title is overlaid if (iUseBackGroundColourForAxes .and. vpostitle < 0.) then call plot_sci(0) call plot_set_opacity(alphalegend) endif call plot_annotate('T',vpostitle,hpostitle,fjusttitle,trim(pagetitles(ititle))) endif endif !--use foreground colour by default for scale call plot_sci(1) !--scale on co-ordinate plots if (iPlotScale .and. (iscalepanel==0 .or. ipanel==iscalepanel) & .and. is_coord(iplotx,ndim) .and. is_coord(iploty,ndim)) then !--change to background colour index if title is overlaid if (iUseBackGroundColourForAxes .and. vposscale > 0.) then call plot_sci(0) call plot_set_opacity(alphalegend) endif call legend_scale(dxscale,hposscale,vposscale,scaletext) endif !--plot shapes if (nshapes > 0 .and. istepsonpage==1) then nhdr = count_non_blank(headertags) call plot_shapes(ipanel,irow,icolumn,itrans(iplotx),itrans(iploty),timei,nhdr,headervalsi,headertags) endif !--restore colour index call plot_sci(icoloursave) call plot_set_opacity(1.0) end subroutine legends_and_title !-------------------------------------------- ! sets up a one dimensional grid of pixels ! and allocates memory for datpix1D !-------------------------------------------- subroutine set_grid1D(xmin1D,xmax1D,dxgrid1D,ngridpts) integer, intent(in) :: ngridpts real, intent(in) :: xmin1D,xmax1D,dxgrid1D integer :: igrid if (allocated(datpix1D)) deallocate(datpix1D) if (allocated(xgrid)) deallocate(xgrid) allocate (datpix1D(ngridpts)) allocate (xgrid(ngridpts)) do igrid = 1,ngridpts xgrid(igrid) = min(xmin1D,xmax1D) + (igrid-0.5)*dxgrid1D enddo end subroutine set_grid1D !------------------------------------------------------------------- ! interface for setting limits when using particle tracking limits !------------------------------------------------------------------- subroutine settrackinglimits(itrackpart,iplot,xploti,xmini,xmaxi) use labels, only:is_coord use settings_limits, only:xminoffset_track,xmaxoffset_track integer, intent(in) :: itrackpart,iplot real, dimension(:), intent(in) :: xploti real, intent(inout) :: xmini,xmaxi !--particle tracking limits only apply to co-ordinate axes if (is_coord(iplot,ndim) .and. itrackpart < size(xploti)) then xmini = xploti(itrackpart) - xminoffset_track(iplot) xmaxi = xploti(itrackpart) + xmaxoffset_track(iplot) call transform_limits(xmini,xmaxi,itrans(iplot)) endif return end subroutine settrackinglimits !------------------------------------------------------------------- ! interface for setting interpolation weights ! (to make calls above neater) !------------------------------------------------------------------- subroutine set_weights(weighti,dati,iamtypei,usetype,icol,dummy_run) use settings_render, only:idensityweightedinterpolation,iauto_densityweighted use interpolation, only:set_interpolation_weights use settings_units, only:unit_interp use settings_xsecrot, only:rendersinks,use3Dopacityrendering use labels, only:get_sink_type,is_density real, dimension(:), intent(inout) :: weighti real, dimension(:,:), intent(in) :: dati integer(kind=int1), dimension(:), intent(in) :: iamtypei logical, dimension(:), intent(in) :: usetype integer, intent(in), optional :: icol logical, intent(in), optional :: dummy_run integer :: isinktype,i_col logical :: idensityweighted,ichangedweights i_col = 0 if (present(icol)) i_col = icol ! do nothing if weights do not need to change if (i_col == icol_prev .and. all(usetype .eqv. use_type_prev)) return isinktype = get_sink_type(ntypes) inormalise = inormalise_interpolations idensityweighted = idensityweightedinterpolation ichangedweights = any(usetype .neqv. use_type_prev) ! decide whether to use density weighted rendering automatically ! based on the column being rendered. i.e. do NOT use density weighting ! if the column is a density, but do if it is some other quantity if (iauto_densityweighted) then if (.not.is_density(i_col)) then if (.not.(idensityweighted .and. inormalise)) ichangedweights = .true. idensityweighted = .true. inormalise = .true. endif icol_prev = i_col endif if (present(dummy_run)) then if (dummy_run) return endif if (ichangedweights) then use_type_prev = usetype call set_interpolation_weights(weighti,dati,iamtypei,usetype,& ninterp,npartoftype,masstype,ntypes,ndataplots,irho,ipmass,ih,ndim,& iRescale,idensityweighted,inormalise,units,unit_interp,required,& (use3Dopacityrendering .and. rendersinks),isinktype) endif end subroutine set_weights !------------------------------------------------------------------- ! interface to vector plotting routines ! so that pixel arrays are allocated appropriately !------------------------------------------------------------------- subroutine vector_plot(ivecx,ivecy,numpixx,numpixy,pixwidthvec,& pixwidthvecy,vmax,label,labelunit,got_h) use settings_vecplot, only:UseBackgndColorVecplot,iplotstreamlines,iplotarrowheads, & iplotsynchrotron,rcrit,zcrit,synchrotronspecindex,uthermcutoff, & ihidearrowswherenoparts,minpartforarrow,iVecplotLegend,iVecLegendOnPanel use interpolations2D, only:interpolate2D_vec use projections3D, only:interpolate3D_proj_vec,interp3D_proj_vec_synctron use interpolate_vec, only:mask_vectors,interpolate_vec_average use render, only:render_vec use fieldlines, only:streamlines,vecplot3D_proj use labels, only:iutherm,is_coord use plotlib, only:plot_qci,plot_qlw,plot_sci,plot_slw,plot_set_opacity use system_utils, only:lenvironment use legends, only:ipanelselect integer, intent(in) :: ivecx,ivecy,numpixx,numpixy real, intent(in) :: pixwidthvec,pixwidthvecy real, intent(inout) :: vmax character(len=*), intent(in) :: label,labelunit logical, intent(in) :: got_h real, dimension(numpixx,numpixy) :: vecpixx, vecpixy real, dimension(max(npixx,numpixx),max(npixy,numpixy)) :: datpixvec integer :: i,j,icoloursav,linewidthprev,ivecz real :: vmag real :: blankval,datmax logical :: usevecplot,use3Dstreamlines,plotlegend !--query colour index and line width call plot_qci(icoloursav) call plot_qlw(linewidthprev) !print*,'plotting vector field ',trim(label) if ((is_coord(ivecx,ndim) .or. ivecx < 0 .or.(ivecx > ndataplots)) .or. & (is_coord(ivecy,ndim) .or. ivecy < 0 .or.(ivecy > ndataplots))) then print*,'error finding location of vector plot in array' else use3Dstreamlines = (ndim==3) .and. .not.x_sec !lenvironment('SPLASH_3DSTREAMLINES') !--plot arrows in either background or foreground colour if (UseBackgndColorVecplot) then call plot_sci(0) call plot_set_opacity(1.) else call plot_sci(1) endif usevecplot = .false. if (irotate) then if (allocated(vecplot)) usevecplot = .true. if (debugmode) print*,'DEBUG: using vecplot' ! this is to indicate (to me) that extra memory is in use endif ! !--interpolate using appropriate routine for number of dimensions ! select case(ndim) case(3) if (x_sec) then ! take vector plot in cross section if (got_h) then if (usevecplot) then ! using rotation call interpolate3D_xsec_vec(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp), & vecplot(1,1:ninterp),vecplot(2,1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin,zslicepos, & vecpixx,vecpixy,numpixx,numpixy,pixwidthvec,pixwidthvecy,inormalise,iverbose) else call interpolate3D_xsec_vec(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp), & dat(1:ninterp,ivecx),dat(1:ninterp,ivecy), & icolourme(1:ninterp),ninterp,xmin,ymin,zslicepos, & vecpixx,vecpixy,numpixx,numpixy,pixwidthvec,pixwidthvecy,inormalise,iverbose) endif else ! don't have smoothing length, use averaging if (usevecplot) then call interpolate_vec_average(xplot(1:ninterp),yplot(1:ninterp), & vecplot(1,1:ninterp),vecplot(2,1:ninterp),icolourme(1:ninterp), & xmin,ymin,pixwidthvec,pixwidthvecy,vecpixx,vecpixy, & ninterp,numpixx,numpixy,zplot(1:ninterp),zslicemin,zslicemax) else call interpolate_vec_average(xplot(1:ninterp),yplot(1:ninterp), & dat(1:ninterp,ivecx),dat(1:ninterp,ivecy),icolourme(1:ninterp), & xmin,ymin,pixwidthvec,pixwidthvecy,vecpixx,vecpixy, & ninterp,numpixx,numpixy,zplot(1:ninterp),zslicemin,zslicemax) endif endif else if (iplotsynchrotron .and. .not.iplotstreamlines .and. .not.iplotarrowheads) then !--get synchrotron polarisation vectors if (iutherm > 0 .and. iutherm <= numplot .and. uthermcutoff > 0.) then if (usevecplot) then call interp3D_proj_vec_synctron(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),vecplot(1,1:ninterp),vecplot(2,1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,datpixvec(1:numpixx,1:numpixy),numpixx,numpixy,pixwidthvec, & rcrit,zcrit,synchrotronspecindex,pixwidthvec,.false., & dat(1:ninterp,iutherm),uthermcutoff) else call interp3D_proj_vec_synctron(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),dat(1:ninterp,ivecx),dat(1:ninterp,ivecy), & icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,datpixvec(1:numpixx,1:numpixy),numpixx,numpixy,pixwidthvec, & rcrit,zcrit,synchrotronspecindex,pixwidthvec,.false., & dat(1:ninterp,iutherm),uthermcutoff) endif else if (usevecplot) then call interp3D_proj_vec_synctron(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),vecplot(1,1:ninterp),vecplot(2,1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,datpixvec(1:numpixx,1:numpixy),numpixx,numpixy,pixwidthvec, & rcrit,zcrit,synchrotronspecindex,pixwidthvec,.false.) elseif (.not.iplotstreamlines) then call interp3D_proj_vec_synctron(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),dat(1:ninterp,ivecx),dat(1:ninterp,ivecy), & icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,datpixvec(1:numpixx,1:numpixy),numpixx,numpixy,pixwidthvec, & rcrit,zcrit,synchrotronspecindex,pixwidthvec,.false.) endif endif elseif (.not.(iplotstreamlines .and. use3Dstreamlines)) then if (got_h) then if (usevecplot) then if (.not.allocated(vecplot)) stop 'internal error: vecplot not allocated' call interpolate3D_proj_vec(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),vecplot(1,1:ninterp),vecplot(2,1:ninterp), & icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,numpixx,numpixy,pixwidthvec,pixwidthvecy,& inormalise,zobservertemp,dzscreentemp,iverbose) else call interpolate3D_proj_vec(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),dat(1:ninterp,ivecx),dat(1:ninterp,ivecy), & icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,numpixx,numpixy,pixwidthvec,pixwidthvecy, & inormalise,zobservertemp,dzscreentemp,iverbose) endif else ! don't have smoothing length, use averaging if (usevecplot) then call interpolate_vec_average(xplot(1:ninterp),yplot(1:ninterp), & vecplot(1,1:ninterp),vecplot(2,1:ninterp),icolourme(1:ninterp), & xmin,ymin,pixwidthvec,pixwidthvecy,vecpixx,vecpixy, & ninterp,numpixx,numpixy) else call interpolate_vec_average(xplot(1:ninterp),yplot(1:ninterp), & dat(1:ninterp,ivecx),dat(1:ninterp,ivecy),icolourme(1:ninterp), & xmin,ymin,pixwidthvec,pixwidthvecy,vecpixx,vecpixy, & ninterp,numpixx,numpixy) endif endif endif !--adjust the units of the z-integrated quantity !if (iRescale .and. units(ih) > 0.) then ! vecpixx = vecpixx*(unitzintegration/units(ih)) ! vecpixy = vecpixy*(unitzintegration/units(ih)) !endif endif case(2) ! !--two dimensions ! if (got_h) then if (usevecplot) then call interpolate2D_vec(xplot(1:ninterp),yplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp),vecplot(1,1:ninterp), & vecplot(2,1:ninterp),icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,numpixx,numpixy,pixwidthvec,pixwidthvecy,inormalise,& exact_rendering,isperiodicx,isperiodicy) else call interpolate2D_vec(xplot(1:ninterp),yplot(1:ninterp), & hh(1:ninterp),weight(1:ninterp),dat(1:ninterp,ivecx), & dat(1:ninterp,ivecy),icolourme(1:ninterp),ninterp,xmin,ymin, & vecpixx,vecpixy,numpixx,numpixy,pixwidthvec,pixwidthvecy,inormalise,& exact_rendering,isperiodicx,isperiodicy) endif else ! don't have smoothing length, use averaging if (usevecplot) then call interpolate_vec_average(xplot(1:ninterp),yplot(1:ninterp), & vecplot(1,1:ninterp),vecplot(2,1:ninterp),icolourme(1:ninterp), & xmin,ymin,pixwidthvec,pixwidthvecy,vecpixx,vecpixy, & ninterp,numpixx,numpixy) else call interpolate_vec_average(xplot(1:ninterp),yplot(1:ninterp), & dat(1:ninterp,ivecx),dat(1:ninterp,ivecy),icolourme(1:ninterp), & xmin,ymin,pixwidthvec,pixwidthvecy,vecpixx,vecpixy, & ninterp,numpixx,numpixy) endif endif case default print "(a,i1,a)",'ERROR: Cannot do vector plotting in ',ndim,' dimensions' return end select ! !--plot it, either as streamlines or arrows ! if (iplotstreamlines) then if (ndim==3) then !--normalise the 3D vector field do j=1,numpixy do i=1,numpixx vmag = sqrt(vecpixx(i,j)**2 + vecpixy(i,j)**2) if (vmag > tiny(vmag)) then vecpixx(i,j) = vecpixx(i,j)/vmag vecpixy(i,j) = vecpixy(i,j)/vmag endif enddo enddo endif if (ndim==3 .and. use3Dstreamlines .and. .not.x_sec) then if (usevecplot) then if (.not.allocated(vecplot)) stop 'vecplot not allocated' call vecplot3D_proj(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp), & vecplot(1,1:ninterp),vecplot(2,1:ninterp),vecplot(3,1:ninterp),vmax, & weight(1:ninterp),icolourme(1:ninterp),ninterp,pixwidthvec,zobservertemp,dzscreentemp) else ivecz = ivecx + (iplotz - ix(1)) call vecplot3D_proj(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp), & dat(1:ninterp,ivecx),dat(1:ninterp,ivecy),dat(1:ninterp,ivecz),vmax, & weight(1:ninterp),icolourme(1:ninterp),ninterp,pixwidthvec,zobservertemp,dzscreentemp) endif else call streamlines(vecpixx,vecpixy,datpixvec(1:numpixx,1:numpixy),numpixx,numpixy,pixwidthvec) if (ihidearrowswherenoparts) then datmax = maxval(datpixvec(1:numpixx,1:numpixy)) blankval = 2.*datmax call mask_vectors(xplot(1:ninterp),yplot(1:ninterp),icolourme(1:ninterp),ninterp, & xmin,xmax,ymin,ymax,datpixvec(1:numpixx,1:numpixy), & datpixvec(1:numpixx,1:numpixy),numpixx,numpixy,minpartforarrow,blankval) !--use blanking for values of zero call render_pix(datpixvec(1:numpixx,1:numpixy), & minval(datpixvec(1:numpixx,1:numpixy)), & datmax, & 'crap',numpixx,numpixy,xmin,ymin,pixwidthvec,pixwidthvecy, & 0,.true.,0,ncontours,.false.,ilabelcont,blank=blankval) else call render_pix(datpixvec(1:numpixx,1:numpixy), & minval(datpixvec(1:numpixx,1:numpixy)), & maxval(datpixvec(1:numpixx,1:numpixy)), & 'crap',numpixx,numpixy,xmin,ymin,pixwidthvec,pixwidthvecy, & 0,.true.,0,ncontours,.false.,ilabelcont) endif endif else if (ihidearrowswherenoparts) then call mask_vectors(xplot(1:ninterp),yplot(1:ninterp),icolourme(1:ninterp),ninterp, & xmin,xmax,ymin,ymax,vecpixx,vecpixy,numpixx,numpixy,minpartforarrow,0.) endif plotlegend = iVecplotLegend .and. ipanelselect(iVecLegendOnPanel,ipanel,irow,icolumn) call render_vec(vecpixx,vecpixy,vmax,numpixx,numpixy,xmin,ymin,& pixwidthvec,pixwidthvecy,trim(label),trim(labelunit),plotlegend) if (iplotsynchrotron .and. .not. iplotarrowheads) then !--get synchrotron polarisation intensity using more pixels if (iutherm > 0 .and. iutherm <= numplot .and. uthermcutoff > 0.) then call interp3D_proj_vec_synctron(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),dat(1:ninterp,ivecx),dat(1:ninterp,ivecy), & icolourme(1:ninterp),ninterp,xmin,ymin, & datpixvec(1:npixx,1:npixy),datpixvec(1:npixx,1:npixy), & ! these are just dummy arguments datpixvec(1:npixx,1:npixy),npixx,npixy,pixwidth, & rcrit,zcrit,synchrotronspecindex,pixwidthvec,.true., & dat(1:ninterp,iutherm),uthermcutoff) else call interp3D_proj_vec_synctron(xplot(1:ninterp), & yplot(1:ninterp),zplot(1:ninterp),hh(1:ninterp), & weight(1:ninterp),dat(1:ninterp,ivecx),dat(1:ninterp,ivecy), & icolourme(1:ninterp),ninterp,xmin,ymin, & datpixvec(1:npixx,1:npixy),datpixvec(1:npixx,1:npixy), & ! these are just dummy arguments datpixvec(1:npixx,1:npixy),npixx,npixy,pixwidth, & rcrit,zcrit,synchrotronspecindex,pixwidthvec,.true.) endif !--adjust the units of the z-integrated quantity !if (iRescale .and. units(ih) > 0. .and..not.inormalise) then ! datpix = datpix*(unitzintegration/units(ih)) !endif !--plot contours of synchrotron intensity call render_pix(datpixvec(1:npixx,1:npixy),minval(datpixvec(1:npixx,1:npixy)), & maxval(datpixvec(1:npixx,1:npixy)),'crap', & npixx,npixy,xmin,ymin,pixwidth,pixwidthy,0,.true.,0,ncontours,.false.,ilabelcont) endif endif endif !--restore colour index and line width call plot_sci(icoloursav) call plot_slw(linewidthprev) end subroutine vector_plot end subroutine plotstep !---------------------------------------------------- ! adapt the (particle plot) limits to include all ! particles which are to be plotted on the page !---------------------------------------------------- subroutine adapt_limits(iplot,xploti,xmini,xmaxi,xminadaptive,xmaxadaptive,labeli,& iamtype,ntoti,npartoftype,iusetype,ipagechange) use params, only:int1,maxparttypes use labels, only:is_coord use limits, only:assert_sensible_limits use settings_limits, only:scalemax,iadapt,iadaptcoords use settings_data, only:debugmode,ndim,iverbose use settings_part, only:iplotline integer, intent(in) :: iplot real, dimension(:), intent(in) :: xploti real, intent(inout) :: xmini,xmaxi,xminadaptive,xmaxadaptive character(len=*), intent(in) :: labeli integer(kind=int1), dimension(:), intent(in) :: iamtype integer, intent(in) :: ntoti integer, dimension(:), intent(in) :: npartoftype logical, dimension(:), intent(in) :: iusetype logical, intent(in) :: ipagechange integer :: index1,index2,itype,i logical :: mixedtypes !--calculate adaptive limits for this quantity xminadaptive = huge(xminadaptive) xmaxadaptive = -huge(xmaxadaptive) mixedtypes = size(iamtype) > 1 if (mixedtypes) then do i=1,ntoti itype = iamtype(i) if (iusetype(itype) .or. (iplotline.and.itype==1)) then xminadaptive = min(xminadaptive,xploti(i)) xmaxadaptive = max(xmaxadaptive,xploti(i))*scalemax endif enddo else index1 = 1 do itype=1,maxparttypes index2 = index1 + npartoftype(itype) - 1 if (iusetype(itype).and.npartoftype(itype) > 0 & .or. (iplotline.and.itype==1)) then xminadaptive = min(xminadaptive,minval(xploti(index1:index2))) xmaxadaptive = max(xmaxadaptive,maxval(xploti(index1:index2))*scalemax) endif index1 = index2 + 1 enddo endif !--avoid infs and NaNs call assert_sensible_limits(xminadaptive,xmaxadaptive) if (debugmode) print*,'DEBUG: ',iplot,': '//trim(labeli)// & 'min,max adaptive = ',xminadaptive,xmaxadaptive !--set these as limits if adaptive limits are on if (.not.interactivereplot) then if (((is_coord(iplot,ndim) .and. iadaptcoords) & .or.(.not.is_coord(iplot,ndim) .and. iadapt)) .and. ipagechange) then if (iverbose > 1) print "(1x,a)",'adapting '//trim(labeli)//' limits' xmini = xminadaptive xmaxi = xmaxadaptive endif endif end subroutine adapt_limits !------------------------------------------------------------------- ! check if limits were the same as previous time printout occurred !------------------------------------------------------------------- logical function same_limits(min,max,minwas,maxwas) real, intent(in) :: min,max real, intent(inout) :: minwas,maxwas same_limits = (abs(min-minwas) < tiny(min) .and. abs(max-maxwas) < tiny(max)) minwas = min maxwas = max end function same_limits !------------------------------------------------------------------- ! interface to log, inverse transformations: ! also adjusts label (depending on ! whether log axes are also set or not). ! (independent) !------------------------------------------------------------------- subroutine applytrans(xploti,xmini,xmaxi,labelxi,itransxi,chaxis,iplotxi,iaxis,intreplot) use transforms, only:transform,transform_label,transform_limits use settings_data, only:numplot integer, intent(in) :: itransxi,iplotxi,iaxis real, dimension(:), intent(inout) :: xploti real, intent(inout) :: xmini,xmaxi character(len=*), intent(inout) :: labelxi character(len=1), intent(in) :: chaxis logical, intent(in) :: intreplot integer :: itranstemp,lstr character(len=20) :: string if (itransxi /= 0) then if (iplotxi > 0 .and. iplotxi <= numplot) call transform(xploti(:),itransxi) if ((chaxis=='x' .and. (iaxis==10 .or. iaxis==30)).or. & (chaxis=='y' .and. (iaxis==20 .or. iaxis==30))) then ! logarithmic axes write(string,*) itransxi string = adjustl(string) itranstemp = 0 lstr = len_trim(string) if (string(lstr:lstr)=='1') then if (lstr > 1) read(string(1:lstr-1),*) itranstemp labelxi = transform_label(labelxi,itranstemp) else labelxi = transform_label(labelxi,itransxi) endif else labelxi = transform_label(labelxi,itransxi) endif if (.not.intreplot) call transform_limits(xmini,xmaxi,itransxi) endif end subroutine applytrans !------------------------------------------------------------------- ! interface for adding rotation and perspective ! (completely independent) !------------------------------------------------------------------- subroutine rotationandperspective(anglexi,angleyi,anglezi,dzscreen,zobs,xploti,yploti,zploti, & ntot,iplotx,iploty,iplotz,dat,ivecstart,vecploti,itrackpart) use labels, only:ix use settings_data, only:ndim,xorigin,debugmode use settings_xsecrot, only:use3Dperspective use rotation, only:rotate2D,rotate3D use plotlib, only:plot_qcur real, intent(in) :: anglexi,angleyi,anglezi,dzscreen,zobs real, dimension(:), intent(inout) :: xploti,yploti,zploti real, dimension(:,:), intent(in) :: dat real, dimension(:,:), intent(out) :: vecploti integer, intent(in) :: ntot,iplotx,iploty,iplotz,ivecstart,itrackpart integer :: j,iposx,iposy,iposz,i real :: angleradx,anglerady,angleradz real, dimension(ndim) :: xcoords,veci ! !--convert angles to radians ! angleradz = anglezi*pi/180. anglerady = angleyi*pi/180. angleradx = anglexi*pi/180. if (plot_qcur()) then ! only print for interactive devices if (ndim==3) then print "(1x,a,2(f6.2,1x),f6.2,a)",'rotation: (z, y, x) = (',anglezi,angleyi,anglexi,')' else print "(1x,a,f6.2)",'rotating particles about z by ',anglezi endif if (ndim==3 .and. use3Dperspective) then print*,' observer height = ',zobs,', screen at ',zobs-dzscreen elseif (ndim==3) then if (abs(zobs) > tiny(zobs) .or. abs(dzscreen) > tiny(dzscreen)) then print "(a)",' INTERNAL ERROR: no 3D perspective but observer set' endif endif if (itrackpart > 0 .and. itrackpart <= ntot) then print*,'rotating about tracked particle ',itrackpart,' x,y,z = ',dat(itrackpart,ix(1:ndim)) elseif (any(abs(xorigin) >= tiny(xorigin))) then print*,'rotating about x,y,z = ',xorigin(1:ndim) endif endif if (debugmode .and. ivecstart > 0) print "(1x,a)",'(also rotating vector components)' ! !--set location of x,y and z ! such that: ! ix(iposx) = iplotx ! ix(iposy) = iploty ! ix(iposz) = iplotz ! iposx = 1 ! this is "just in case" iposy = 2 iposz = 3 do i=1,ndim if (ix(i)==iplotx) then iposx = i elseif (ix(i)==iploty) then iposy = i elseif (ix(i)==iplotz) then iposz = i else print "(a)",' WARNING: internal error in ix setting for rotation: ix = ',ix(:) endif enddo if (debugmode) print*,'DEBUG: in rotation, iplotz = ',iplotz,' iposz = ',iposz, xorigin(:) !$omp parallel default(none) & !$omp shared(dat,xorigin,ndim,angleradx,anglerady,angleradz,zobs,dzscreen) & !$omp shared(xploti,yploti,zploti,iposx,iposy,iposz,iplotz,ntot,ix,itrackpart) & !$omp shared(vecploti,ivecstart) & !$omp private(j,xcoords,veci) !$omp do do j=1,ntot if (itrackpart > 0 .and. itrackpart <= ntot) then xcoords(1:ndim) = dat(j,ix(1:ndim)) - dat(itrackpart,ix(1:ndim)) else xcoords(1:ndim) = dat(j,ix(1:ndim)) - xorigin(1:ndim) endif if (ndim==2) then call rotate2D(xcoords(:),angleradz) elseif (ndim==3) then call rotate3D(xcoords(1:ndim),angleradx,anglerady,angleradz,zobs,dzscreen) endif if (itrackpart > 0 .and. itrackpart <= ntot) then xploti(j) = xcoords(iposx) + dat(itrackpart,ix(iposx)) yploti(j) = xcoords(iposy) + dat(itrackpart,ix(iposy)) if (iplotz > 0) then zploti(j) = xcoords(iposz) + dat(itrackpart,ix(iposz)) endif else xploti(j) = xcoords(iposx) + xorigin(iposx) yploti(j) = xcoords(iposy) + xorigin(iposy) if (iplotz > 0) then zploti(j) = xcoords(iposz) + xorigin(iposz) endif endif ! !--rotate vector components ! if (ivecstart > 0) then veci(1:ndim) = dat(j,ivecstart:ivecstart+ndim-1) if (ndim==2) then call rotate2D(veci(:),angleradz) elseif (ndim==3) then call rotate3D(veci(1:ndim),angleradx,anglerady,angleradz,zobs,dzscreen) endif vecploti(1,j) = veci(iposx) vecploti(2,j) = veci(iposy) if (ndim >= 3) vecploti(3,j) = veci(iposz) endif enddo !$omp enddo !$omp end parallel end subroutine rotationandperspective !------------------------------------------------------------------- ! interface for plotting rotated axes !------------------------------------------------------------------- subroutine rotatedaxes(irotateaxes,iplotx,iploty,anglexi,angleyi,anglezi,dzscreen,zobs) use labels, only:ix use rotation, only:rotate_axes3D,rotate_axes2D use settings_data, only:ndim,xorigin use settings_xsecrot, only:xminrotaxes,xmaxrotaxes,use3Dperspective integer, intent(in) :: irotateaxes,iplotx,iploty real, intent(in) :: anglexi,angleyi,anglezi real, intent(inout) :: dzscreen,zobs real :: angleradx,anglerady,angleradz ! !--convert angles to radians ! angleradz = anglezi*pi/180. anglerady = angleyi*pi/180. angleradx = anglexi*pi/180. if (ndim==3) then if (.not.use3Dperspective .and. dzscreen > tiny(zobs)) then print "(a)",' INTERNAL ERROR: no 3D perspective but observer set' zobs = 0. dzscreen = 0. endif call rotate_axes3D(irotateaxes,iplotx-ix(1)+1,iploty-ix(1)+1, & xminrotaxes(1:ndim),xmaxrotaxes(1:ndim),xorigin(1:ndim), & angleradx,anglerady,angleradz,zobs,dzscreen) elseif (ndim==2) then call rotate_axes2D(irotateaxes,xminrotaxes(1:ndim), & xmaxrotaxes(1:ndim),xorigin(1:ndim),angleradz) endif end subroutine rotatedaxes end module timestep_plotting danieljprice-splash-4d1f09c/src/plotutils.f90000066400000000000000000000077671477365367100212610ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !--------------------------------------------------------------------------- ! module containing application programming interfaces for basic ! plotting functions. The idea is to add more to this module to ! eventually use it to be able to change backends more easily. !--------------------------------------------------------------------------- module plotutils use plotlib, only:plot_line,plot_bins implicit none public :: plotline,plotbins,formatreal private contains ! ! line plotting, with blanking ! subroutine plotline(npts,xline,yline,blank) integer, intent(in) :: npts real, intent(in), dimension(:) :: xline,yline real, intent(in), optional :: blank integer :: i,nseg,istart if (present(blank)) then nseg = 0 istart = 1 !--plot line in segments, leaving blank segments where y=blank do i=1,npts if (abs(yline(i)-blank) < tiny(yline) .or. i==npts) then if (nseg > 0) call plot_line(nseg,xline(istart:istart+nseg),yline(istart:istart+nseg)) istart = i+1 nseg = 0 else nseg = min(nseg + 1,npts-1) endif enddo else call plot_line(npts,xline,yline) endif return end subroutine plotline ! ! binned histogram plotting, with blanking ! subroutine plotbins(nbins,xbins,ybins,blank) integer, intent(in) :: nbins real, intent(in), dimension(:) :: xbins,ybins real, intent(in), optional :: blank integer :: i,nseg,istart if (present(blank)) then nseg = 0 istart = 1 !--plot line in segments, leaving blank segments where y=blank do i=1,nbins if (abs(ybins(i)-blank) < tiny(ybins) .or. i==nbins) then if (nseg > 0) call plot_bins(nseg,xbins(istart:istart+nseg),ybins(istart:istart+nseg),.true.) istart = i+1 nseg = 0 else nseg = min(nseg + 1,nbins-1) endif enddo else call plot_bins(nbins,xbins,ybins,.true.) endif return end subroutine plotbins ! ! formatting of real variables into strings (like PGNUMB) ! subroutine formatreal(val,string,ierror) real, intent(in) :: val character(len=*), intent(out) :: string integer, intent(out), optional :: ierror integer :: ierr,i,idot logical :: nonzero if (abs(val) >= 1.d99) then write(string,"(1pe10.3)",iostat=ierr) val elseif (abs(val) < 1.e-3 .or. abs(val) >= 1.e4) then write(string,"(1pe9.2)",iostat=ierr) val elseif (abs(val) < 0.1) then write(string,"(f8.3)",iostat=ierr) val elseif (abs(val) >= 100.) then write(string,"(f8.0)",iostat=ierr) val else write(string,"(f8.2)",iostat=ierr) val endif string = adjustl(trim(string)) if (present(ierror)) ierror = ierr ! !--strip trailing zeros after the decimal place ! (and the decimal place if it is the last character) ! idot = index(string,'.') if (idot > 0) then nonzero = .false. do i = len_trim(string),idot,-1 if (.not.nonzero .and. string(i:i)=='0') then string(i:i) = ' ' elseif (.not.nonzero .and. string(i:i)=='.') then string(i:i) = ' ' nonzero = .true. else nonzero = .true. endif enddo endif string = trim(string) return end subroutine formatreal end module plotutils danieljprice-splash-4d1f09c/src/powerspectrums.f90000066400000000000000000000133471477365367100223130ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! contains subroutines for taking power spectrums on particle data ! module powerspectrums implicit none real, parameter, private :: pi = 4.*atan(1.) real, parameter, private :: twopi = 2.*pi public :: powerspectrum private contains subroutine powerspectrum(npts,x,dat,nfreqpts,freq,power,idisordered) integer, intent(in) :: npts, nfreqpts real, intent(in), dimension(npts) :: x real, intent(in), dimension(npts) :: dat real, intent(in), dimension(nfreqpts) :: freq real, intent(out), dimension(nfreqpts) :: power logical, intent(in) :: idisordered integer :: ifreq real :: datmean, datvar, omega if (.not.idisordered) then print*,' evaluating fourier transform' do ifreq=1,nfreqpts omega = twopi*freq(ifreq) !--get power at this frequency call power_fourier(npts,x,dat,omega,power(ifreq)) enddo else print*,'evaluating lomb periodogram...' ! !--calculate the mean and variance of the data ! call mean_variance(dat,npts,datmean,datvar) print*,'data mean = ',datmean,' std. dev = ',sqrt(datvar) if (datvar <= 0.) then print*,'error: variance = 0' power = 0. return endif do ifreq=1,nfreqpts omega = twopi*freq(ifreq) call power_lomb(npts,x,dat,datmean,datvar,omega,power(ifreq)) enddo endif end subroutine powerspectrum !------------------------------------------------------- ! subroutine to compute the power spectrum ! of evenly sampled data via a (slow) fourier transform !-------------------------------------------------------- subroutine power_fourier(npts,x,dat,omega,power) integer, intent(in) :: npts real, intent(in), dimension(npts) :: x, dat real, intent(in) :: omega real, intent(out) :: power integer :: i real :: sum1,sum2 power = 0. sum1 = 0. sum2 = 0. do i=1,npts sum1 = sum1 + dat(i)*cos(-omega*x(i)) sum2 = sum2 + dat(i)*sin(-omega*x(i)) enddo power= sqrt(sum1**2 + sum2**2)/REAL(npts) return end subroutine power_fourier !---------------------------------------------------------- ! Subroutine to compute the power spectrum (periodogram) ! of unevenly sampled data via the Lomb (1976) method ! (algorithm described in Press et al, Numerical Recipes, sec 13.8, p569) ! ! Given the data (dat) on a set of points (x), ! returns an array of nfreq frequencies (freq) between freqmin and freqmax ! together with the power at each frequency (power) !---------------------------------------------------------- subroutine power_lomb(npts,x,dat,datmean,datvar,omega,power) integer, intent(in) :: npts real, intent(in), dimension(npts) :: x, dat real, intent(in) :: datmean,datvar,omega real, intent(out) :: power integer :: i real :: ddat real :: tau, tau_numerator, tau_denominator real :: term1_numerator, term1_denominator real :: term2_numerator, term2_denominator real :: omega_dx, cos_term, sin_term ! !--calculate tau for this frequency ! tau_numerator = 0. tau_denominator = 0. do i=1,npts tau_numerator = tau_numerator + sin(2.*omega*x(i)) tau_denominator = tau_denominator + cos(2.*omega*x(i)) enddo tau = atan(tau_numerator/tau_denominator)/(2.*omega) ! !--calculate the terms in the power ! term1_numerator = 0. term1_denominator = 0. term2_numerator = 0. term2_denominator = 0. do i=1,npts ddat = dat(i) - datmean omega_dx = omega*(x(i) - tau) cos_term = cos(omega_dx) sin_term = sin(omega_dx) term1_numerator = term1_numerator + ddat*cos_term term1_denominator = term1_denominator + cos_term**2 term2_numerator = term2_numerator + ddat*sin_term term2_denominator = term2_denominator + sin_term**2 enddo ! !--calculate the power at this frequency ! power = 1./(2.*datvar)*(term1_numerator**2/term1_denominator + & term2_numerator**2/term2_denominator) return end subroutine power_lomb !------------------------------------------------- ! Subroutine to calculate the mean and variance ! of a set of data points ! Mean is trivial but variance uses a special ! formula to reduce round-off error ! see Press et al Numerical Recipes, section 14.2 ! this is similar to their subroutine avevar !------------------------------------------------- subroutine mean_variance(x,npts,xmean,xvariance) integer, intent(in) :: npts real, intent(in), dimension(npts) :: x real, intent(out) :: xmean, xvariance real :: roundoff, delta integer :: i ! !--calculate average ! xmean = 0. do i=1,npts xmean = xmean + x(i) enddo xmean = xmean/real(npts) ! !--calculate variance using the corrected two-pass formula ! ! var = 1/(n-1)*( sum (x-\bar{x}) - 1/n * (sum(x-\bar{x}) )^2 ) ! ! where the last term corrects for the roundoff error ! in the first term ! xvariance = 0. roundoff = 0. do i=1,npts delta = x(i) - xmean roundoff = roundoff + delta xvariance = xvariance + delta*delta enddo xvariance = (xvariance - roundoff**2/npts)/real(npts-1) return end subroutine mean_variance end module powerspectrums danieljprice-splash-4d1f09c/src/prompting.f90000066400000000000000000000476061477365367100212350ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !This is a small f90 module containing a generic subroutine for prompting !integer, real, double and logical variables and strings. !I use them quite often and found the solution below very useful. ! !The general syntax is: ! ! call prompt(PROMPT,VAR,...) ! !Action: writes the string PROMPT on the terminal plus the current ! value of the variable VAR and reads VAR. If default ! is pressed instead of a new value, ! the variable VAR stays untouched. ! !In addition there are a few optional parameter to the routine like !setting defaults or limits etc... ! !In principle three f90 features are used which are not available !in f77: recursion, non-advancing I/O and overloading. ! !A detailed description of the syntax can be found in the header !of the module below. !---------------------------- please cut here ------------------------------------- ! ! f90 Module 'prompting' ! ! Definition of Generic Subroutine: prompt ! ! Syntax: prompt(text, value, [min], [max]) ! text character string ! value integer, real or double ! min, max allowed range of same type as value (optional) ! [DJP] min2, max2 allowed 2nd range of same type as value (optional) ! ! prompt(text, string, [length], [case]) ! text character string ! string character string ! length length of string (optional on return) ! case option ! 1 -> convert string to lower case ! 2 -> convert string to upper case ! lower=1, upper=2 are defined public ! within this module ! ! prompt(text, value, [default]) ! text character string ! value logical ! default logical (optional) ! will always overwrite the current value ! ! Author: Th. S. Ullrich, University Heidelberg ! e-mail: ullrich@ceres1.physi.uni-heidelberg.de ! Last mod: 18 Aug 94 ! ! Changes by D.Price, University of Exeter, dprice@astro.ex.ac.uk: ! 19/10/04 : problem with if (present(min) .and. min < newvalue) ! on some compilers ! ! 31/10/06: D. Price: ! Function print_logical added for displaying logicals: takes in a logical ! variable and returns a string 'on' or 'off' as appropriate. ! ! 20/06/07: D. Price: ! Default part of prompt changed from "=" to the more human "default=" ! Also the character string prompt puts the default value in quotes ! ! 09/05/08: D. Price: ! String prompt accepts "blank" to set empty string, unless optional ! argument noblank is set to .true. ! ! 06/02/09: D. Price, Monash University, daniel.price@monash.edu ! Added optional "mask" argument to print_logical routine ! ! 27/01/10: D. Price: ! Added optional "list" argument to string_prompt routine, now recursive ! ! 24/02/10: D. Price: ! When noblank=.true., string prompt does not accept blank string ! (e.g. where it is the default input) and gives an error message ! ! 23/07/10: D. Price: ! Integer prompt accepts 2nd sub-range [min:max] [min2:max2] ! ! 06/05/11: D. Price: ! Added prompt for integer arrays ! ! 21/08/12: D. Price: ! Real/double prompting interfaces compile and work with -r8 ! ! 08/02/13: D. Price ! Integer prompt enforces default value to be between min and max ! ! 25/06/13: D. Price ! Real and double prompts print values using scientific notation 1.e8 instead of 0.1e9 ! module prompting implicit none private ! ! Options for string prompting routine ! integer, parameter, public :: lower = 1, upper = 2 ! ! Create generic name 'prompt' ! interface prompt module procedure & integer_prompt, real_prompt, string_prompt, double_prompt, logical_prompt, intarr_prompt end interface public :: prompt,print_logical,print_logicals contains ! ! Integer prompting routine ! recursive subroutine integer_prompt(text, value, min, max, min2, max2) character(len=*), intent(in) :: text integer, intent(inout) :: value integer :: newvalue character(len=64) :: string character(len=16) :: chmin, chmax, chmin2, chmax2 integer :: ios, ierr integer, optional, intent(in) :: min, max, min2, max2 logical :: error chmin = '' chmax = '' chmin2 = '' chmax2 = '' error = .false. ! ! Make sure default argument is within range! ! if (present(min)) then if (value < min .and. .not. (present(min2) .or. present(max2))) value = min endif if (present(max)) then if (value > max .and. .not. (present(min2) .or. present(max2))) value = max endif ! ! Pack arguments in strings for compact and nicer prompt ! write(string,*) value if (present(min)) write(chmin,"(g10.0)") min if (present(max)) write(chmax,"(g10.0)") max if (present(min2)) write(chmin2,"(g10.0)") min2 if (present(max2)) write(chmax2,"(g10.0)") max2 ! ! Write prompt string to terminal ! if (present(min).or.present(max)) then if (present(min2).or.present(max2)) then write(*,"(a,1x,'([',a,':',a,',',a,':',a,'],',1x,'default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(chmin)), & trim(adjustl(chmax)),trim(adjustl(chmin2)),& trim(adjustl(chmax2)),trim(adjustl(string)) else write(*,"(a,1x,'([',a,':',a,'],',1x,'default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(chmin)), & trim(adjustl(chmax)), trim(adjustl(string)) endif else write(*,"(a,1x,'(default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(string)) endif ! ! Read new value, quit and keep old value if zero sized string ! read(*,"(a)",iostat=ierr) string if (len(trim(adjustl(string))) == 0) return read(string,"(g10.0)",iostat=ios) newvalue ! ! Check if new string is of right type and within given range ! if (ios /= 0) then print "(a)", "Error, not an integer number" error = .true. else if (present(min)) then if (newvalue < min) then if (present(max2)) then if (newvalue > max2) then print "(a)", "Error, value out of range" error = .true. elseif (newvalue < min2) then print "(a)", "Error, value out of range" error = .true. endif else print "(a)", "Error, value out of range" error = .true. endif endif endif if (present(max)) then if (newvalue > max) then if (present(min2)) then if (newvalue < min2) then print "(a)", "Error, value out of range" error = .true. elseif (newvalue > max2) then print "(a)", "Error, value out of range" error = .true. endif else print "(a)", "Error, value out of range" error = .true. endif endif endif endif ! ! Assign new value if everything is ok, else prompt again ! if (error) then call integer_prompt(text, value, min, max, min2, max2) else value = newvalue endif end subroutine integer_prompt ! ! Real prompting routine ! recursive subroutine real_prompt(text, value, min, max) integer, parameter :: sp = selected_real_kind(p=6) character(len=*), intent(in) :: text real(kind=sp), intent(inout) :: value real(kind=sp) :: newvalue character(len=64) :: string character(len=16) :: chmin, chmax integer :: ios real(kind=sp), optional, intent(in) :: min, max logical :: error chmin = '' chmax = '' error = .false. ! ! Pack arguments in strings for compact and nicer prompt ! if (abs(value) < 0.1 .or. abs(value) >= 1.d4) then write(string,"(es13.4)") value else write(string,"(g13.4)") value endif if (present(min)) write(chmin,"(g13.4)") min if (present(max)) write(chmax,"(g13.4)") max ! ! Write prompt string to terminal ! if (present(min).or.present(max)) then write(*,"(a,1x,'([',a,':',a,'],',1x,'default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(chmin)), & trim(adjustl(chmax)), trim(adjustl(string)) else write(*,"(a,1x,'(default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(string)) endif ! ! Read new value, quit and keep old value if zero sized string ! read(*,"(a)") string if (len(trim(adjustl(string))) == 0) return read(string,*,iostat=ios) newvalue ! ! Check if new string is of right type and within given range ! if (ios /= 0) then print "(a)", "Error, not a real number" error = .true. else if (present(min)) then if (newvalue < min) then print "(a)", "Error, value out of range" error = .true. endif endif if (present(max)) then if (newvalue > max) then print "(a)", "Error, value out of range" error = .true. endif endif endif ! ! Assign new value if everything is ok, else prompt again ! if (error) then call real_prompt(text, value, min, max) else value = newvalue endif end subroutine real_prompt ! ! Double precision prompting routine ! recursive subroutine double_prompt(text, value, min, max) integer, parameter :: db = kind(0.d0) character(len=*), intent(in) :: text real(kind=db), intent(inout) :: value real(kind=db) :: newvalue character(len=64) :: string character(len=16) :: chmin, chmax integer :: ios real(kind=db), optional, intent(in) :: min, max logical :: error chmin = '' chmax = '' error = .false. ! ! Pack arguments in strings for compact and nicer prompt ! if (abs(value) < 0.1d0 .or. abs(value) >= 1.d4) then write(string,"(es13.4)") value else write(string,"(g13.4)") value endif if (present(min)) write(chmin,"(g13.4)") min if (present(max)) write(chmax,"(g13.4)") max ! ! Write prompt string to terminal ! if (present(min).or.present(max)) then write(*,"(a,1x,'([',a,':',a,'],',1x,'default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(chmin)), & trim(adjustl(chmax)), trim(adjustl(string)) else write(*,"(a,1x,'(default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(string)) endif ! ! Read new value, quit and keep old value if zero sized string ! read(*,"(a)") string if (len(trim(adjustl(string))) == 0) return read(string,*,iostat=ios) newvalue ! ! Check if new string is of right type and within given range ! if (ios /= 0) then print "(a)", "Error, not a real number" error = .true. else if (present(min)) then if (newvalue < min) then print "(a)", "Error, value out of range" error = .true. endif endif if (present(max)) then if (newvalue > max) then print "(a)", "Error, value out of range" error = .true. endif endif endif ! ! Assign new value if everything is ok, else prompt again ! if (error) then call double_prompt(text, value, min, max) else value = newvalue endif end subroutine double_prompt ! ! Logical prompting routine ! recursive subroutine logical_prompt(text, lvalue, default) character(len=*), intent(in) :: text logical, intent(inout) :: lvalue logical, optional, intent(in) :: default character(len=32) :: string ! ! If present, set default ! if (present(default)) lvalue = default ! ! Default answer yes/no ! if (lvalue) then string='yes' else string='no' endif ! ! Write prompt string to terminal ! write(*,"(a,1x,'(default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(string)) ! ! Read new value, quit and keep old value if zero sized string ! read(*,"(a)") string if (len(trim(adjustl(string))) == 0) return ! ! Translate answer in .true./.false., if invalid prompt again ! select case (adjustl(string)) case ('y') lvalue = .true. case ('yes') lvalue = .true. case ('on') lvalue = .true. case ('t') lvalue = .true. case ('true') lvalue = .true. case ('n') lvalue = .false. case ('no') lvalue = .false. case ('off') lvalue = .false. case ('f') lvalue = .false. case ('false') lvalue = .false. case default print "(a)", "Error, answer y(es)/t(rue)/on or n(o)/f(alse)/off" call logical_prompt(text, lvalue, default) end select end subroutine logical_prompt ! ! String prompting routine ! recursive subroutine string_prompt(text, string, length, case, noblank, list) character(len=*), intent(in) :: text character(len=*), intent(inout) :: string character(len=128) :: newstring integer, optional, intent(out) :: length integer, optional, intent(in) :: case logical, optional, intent(in) :: noblank integer :: is, ia, i integer, parameter :: aoffset = 32 logical :: allowblank,inlist character(len=*), dimension(:), intent(in), optional :: list ! ! Write prompt string to terminal ! if (present(noblank)) then allowblank = .not.noblank else allowblank = .true. endif if (allowblank .and. len_trim(adjustl(string)) > 0) then write(*,"(a,1x,'(blank=""blank"",default=""',a,'""):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(string)) else write(*,"(a,1x,'(default=""',a,'""):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(string)) endif ! ! Read new value, quit and keep old value if zero sized string ! read(*,"(a)") newstring if (len_trim(newstring) > len(string)) then print "(a)", "Warning: string too long, will be truncated" endif if (allowblank .and. trim(adjustl(newstring))=='blank') then string = ' ' elseif ( len_trim(adjustl(newstring)) /= 0 ) then string = newstring elseif ( .not.allowblank .and. len_trim(adjustl(string))==0 ) then print "(a)", "Error, cannot enter blank string" if (present(list)) then call string_prompt(text,string,noblank=.not.allowblank,list=list) else call string_prompt(text,string,noblank=.not.allowblank) endif endif if (present(length)) length = len_trim(string) ! ! Convert string to upper/lower case if requested ! if (present(case)) then if (case == upper) then do is = 1, len(string) ia = iachar(string(is:is)) if (ia >= iachar('a').and.ia <= iachar('z')) & string(is:is) = achar(ia-aoffset) enddo endif if (case == lower) then do is = 1, len(string) ia = iachar(string(is:is)) if (ia >= iachar('A').and.ia <= iachar('Z')) & string(is:is) = achar(ia+aoffset) enddo endif endif if (present(list)) then inlist = .false. do i=1,size(list) if (trim(adjustl(list(i)))==trim(adjustl(string))) inlist = .true. enddo if (.not.inlist) then print "(a)", "Error, value not in list" call string_prompt(text,string,noblank=.not.allowblank,list=list) endif endif end subroutine string_prompt ! ! Integer array prompting routine (D. Price) ! recursive subroutine intarr_prompt(text, value, nvalues, min, max) character(len=*), intent(in) :: text integer, dimension(:), intent(inout) :: value integer, intent(inout) :: nvalues integer, dimension(size(value)) :: newvalue character(len=64) :: valstring character(len=120) :: string character(len=16) :: chmin, chmax integer :: ios integer, optional, intent(in) :: min, max logical :: error integer :: ival,nvaluesnew chmin = '' chmax = '' error = .false. ! ! Pack arguments in strings for compact and nicer prompt ! string = ' ' do ival=1,nvalues-1 write(valstring,*,iostat=ios) value(ival) string = trim(string)//trim(adjustl(valstring))//',' enddo if (nvalues > 0) then write(valstring,*,iostat=ios) value(nvalues) endif string = trim(string)//trim(adjustl(valstring)) if (present(min)) write(chmin,"(g10.0)") min if (present(max)) write(chmax,"(g10.0)") max ! ! Write prompt string to terminal ! if (present(min).or.present(max)) then write(*,"(a,1x,'([',a,':',a,'],',1x,'default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(chmin)), & trim(adjustl(chmax)), trim(adjustl(string)) else write(*,"(a,1x,'(default=',a,'):',1x)",advance='no') & trim(adjustl(text)), trim(adjustl(string)) endif ! ! Read new value, quit and keep old value if zero sized string ! read(*,"(a)") string if (len(trim(adjustl(string))) == 0) return ! !--register how many new values read ! newvalue = -huge(0) read(string,*,iostat=ios) newvalue(:) nvaluesnew = 0 do ival=1,size(newvalue) if (newvalue(ival) /= -huge(0)) nvaluesnew = nvaluesnew + 1 enddo ! ! Check if new string is of right type and within given range ! if (nvaluesnew <= 0) then print "(a)", "Error, no integer numbers could be read" error = .true. else if (present(min)) then if (any(newvalue(1:nvaluesnew) < min)) then print "(a)", "Error, value(s) out of range (min)" error = .true. endif endif if (present(max)) then if (any(newvalue(1:nvaluesnew) > max)) then print "(a)", "Error, value(s) out of range (max)" error = .true. endif endif endif ! ! Assign new value if everything is ok, else prompt again ! if (error) then call intarr_prompt(text, value, nvalues, min, max) else value = newvalue nvalues = nvaluesnew endif end subroutine intarr_prompt ! ! Routine added by D.Price (31/10/06) ! Takes in a logical variable and returns a string 'on' or 'off' as appropriate ! function print_logical(lvalue,mask) logical, intent(in) :: lvalue logical, intent(in), optional :: mask character(len=3) :: print_logical logical :: maskval maskval = .true. if (present(mask)) maskval = mask if (maskval) then if (lvalue) then print_logical = 'ON' else print_logical = 'OFF' endif else print_logical = '' endif end function print_logical function print_logicals(lvalues,mask) logical, intent(in) :: lvalues(:) logical, intent(in), optional :: mask(:) character(len=4*size(lvalues)) :: print_logicals logical :: maskval integer :: i print_logicals = '' do i=1,size(lvalues) maskval = .true. if (present(mask)) maskval = mask(i) if (maskval) then if (lvalues(i)) then print_logicals = trim(print_logicals)//'ON,' else print_logicals = trim(print_logicals)//'OFF,' endif endif enddo ! delete last comma i = index(print_logicals,',',back=.true.) if (i > 1) print_logicals = print_logicals(1:i-1) end function print_logicals end module prompting danieljprice-splash-4d1f09c/src/promptlist.f90000066400000000000000000000074211477365367100214220ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! Module implementing generic menu where objects can be added ! to/deleted from a list !------------------------------------------------------------------------- module promptlist implicit none interface subroutine print_objlist(nobj) integer, intent(in) :: nobj end subroutine end interface interface subroutine add_obj(istart,iend,nobj) integer, intent(in) :: istart,iend integer, intent(inout) :: nobj end subroutine add_obj end interface interface subroutine delete_obj(iobj,nobj) integer, intent(in) :: iobj,nobj end subroutine delete_obj end interface contains subroutine prompt_list(nobj,maxobj,objname,print_objlist,add_obj,delete_obj) use prompting, only:prompt integer, intent(inout) :: nobj integer, intent(in) :: maxobj character(len=*), intent(in) :: objname procedure(), pointer, intent(in) :: print_objlist,add_obj,delete_obj character(len=1) :: charp logical :: done,first integer :: istart,iend,ipick ipick = nobj + 1 done = .false. first = .true. charp = 'a' objmenu: do while(.not.done) call print_objlist(nobj) iend = maxobj if (nobj > 0 .or. .not.first) then charp='q' print* call prompt(' a)dd '//trim(objname)//', e)dit, d)elete, c)lear all or q)uit/finish?',& charp,list=(/'a','e','d','c','q','s','S','Q'/),noblank=.true.) select case(charp) case('a') istart = nobj iend = nobj + 1 case('e') if (nobj > 0) then ipick = 0 if (nobj > 1) then call prompt(' pick a '//objname//' to edit ',ipick,0,nobj) else ! if there is only one object, no need to ask which one print "(/,a)",' >> editing '//objname//' #1' ipick = 1 endif if (ipick > 0) then istart = ipick - 1 iend = istart + 1 else istart = 0 iend = 1 first = .false. cycle objmenu endif else istart = 0 iend = 1 endif first = .false. case('d') if (nobj > 0) then ipick = 0 call prompt(' pick a '//objname//' to delete ',ipick,0,nobj) call delete_obj(ipick,nobj) else print*,'nothing to delete!' endif first = .false. cycle objmenu case('c') nobj = 0 first = .false. cycle objmenu case('q','Q','s','S') done = .true. case default istart = 0 iend = maxobj end select else istart = 0 iend = 1 endif if (.not.done) call add_obj(istart,iend,nobj) first = .false. enddo objmenu return end subroutine prompt_list end module promptlist danieljprice-splash-4d1f09c/src/read.f90000066400000000000000000000037201477365367100201160ustar00rootroot00000000000000module read_test use readdata, only:select_data_format use getdata, only:get_data, get_labels use initialise, only:defaults_set_initial use iso_c_binding, only:c_float, c_int, c_bool, c_char, c_double use asciiutils, only:fstring use filenames, only:rootname, tagline, nfiles use particle_data, only:dat, maxpart, maxcol, maxstep, npartoftype use settings_data, only:ncolumns, ivegotdata use libutils, only:ctypes_to_fstring implicit none public contains subroutine read_data_wrap(filename,fileformat,& sph_dat,npart,ncol,ierr) character(len=*), intent(in) :: filename, fileformat integer, intent(inout) :: ncol, npart real(8), intent(out) :: sph_dat(:,:) integer, intent(out) :: ierr integer :: i,j print*, tagline ierr = 0 call defaults_set_initial nfiles = 1 rootname(1) = filename print*, "format is ", fileformat call select_data_format(fileformat,ierr) if (ierr == 0) then call get_data(1,.true.,.true.,1) if (ivegotdata .and. maxpart>0) then npart = min(sum(npartoftype(:,1)), size(sph_dat(:,1)) ) ncol = min(ncolumns, size(sph_dat(1,:))) print*, "npart and ncol in fortran are", npart, ncol if (ncol > 0) then do i=1,ncol do j=1,npart print*, "trying to write to sph_dat" print*, "sph_dat(i,j) is", sph_dat(i,j) print*, "dat(i,j,1) is", dat(i,j,1) sph_dat(i,j) = dat(i,j,1) print*,"" end do end do ! print*, "attempting to write to sph_dat" ! print*, "dat(1:1,1:1,1)", dat(1:1,1:1,1) ! print*, "sph_dat(1:1,1:1)", sph_dat(1:1,1:1) ! sph_dat(1:npart,1:ncol) = dat(1:npart,1:ncol,1) endif endif else print*, "Error in selecting the data format" endif end subroutine read_data_wrap end module read_test danieljprice-splash-4d1f09c/src/read_data.F90000066400000000000000000000421061477365367100210500ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------- ! ! Moldule used to consolidate all of the read_data options ! !------------------------------------------------------------- module readdata ! This list is the reason why we really need a standard file format for SPH use readdata_sphNG, only:read_data_sphNG, set_labels_sphNG, file_format_is_sphNG use readdata_ascii, only:read_data_ascii, set_labels_ascii use readdata_ndspmhd, only:read_data_ndspmhd, set_labels_ndspmhd, file_format_is_ndspmhd use readdata_gadget, only:read_data_gadget, set_labels_gadget, file_format_is_gadget use readdata_VINE, only:read_data_VINE, set_labels_VINE use readdata_sro, only:read_data_sro, set_labels_sro use readdata_dragon, only:read_data_dragon, set_labels_dragon use readdata_seren, only:read_data_seren, set_labels_seren use readdata_tipsy, only:read_data_tipsy, set_labels_tipsy, file_format_is_tipsy use readdata_mhutch, only:read_data_mhutch, set_labels_mhutch use readdata_UCLA, only:read_data_UCLA, set_labels_UCLA use readdata_aly, only:read_data_aly, set_labels_aly use readdata_bauswein, only:read_data_bauswein, set_labels_bauswein use readdata_egaburov, only:read_data_egaburov, set_labels_egaburov use readdata_foulkes, only:read_data_foulkes, set_labels_foulkes use readdata_gadget_jsb, only:read_data_gadget_jsb, set_labels_gadget_jsb use readdata_jjm, only:read_data_jjm, set_labels_jjm use readdata_jjmmulti, only:read_data_jjmmulti, set_labels_jjmmulti use readdata_mbate, only:read_data_mbate, set_labels_mbate use readdata_oilonwater, only:read_data_oilonwater, set_labels_oilonwater use readdata_rsph, only:read_data_rsph, set_labels_rsph use readdata_vanaverbeke, only:read_data_vanaverbeke, set_labels_vanaverbeke use readdata_spyros, only:read_data_spyros, set_labels_spyros use readdata_urban, only:read_data_urban, set_labels_urban use readdata_starsmasher, only:read_data_starsmasher, set_labels_starsmasher use readdata_vtk, only:read_data_vtk, set_labels_vtk ! Make hdf5 fortran/c modules available if compiled with hdf5 #ifdef HDF5 use readdata_amuse_hdf5, only:read_data_amuse_hdf5, set_labels_amuse_hdf5 use readdata_cactus_hdf5, only:read_data_cactus_hdf5, set_labels_cactus_hdf5 ! use readdata_falcON_hdf5, only:read_data_falcON_hdf5, set_labels_falcON_hdf5 use readdata_flash_hdf5, only:read_data_flash_hdf5, set_labels_flash_hdf5 use readdata_gadget_hdf5, only:read_data_gadget_hdf5, set_labels_gadget_hdf5 #endif ! Same for FITS files #ifdef FITS use readdata_fits, only:read_data_fits, set_labels_fits #endif ! If the PBOB_DIR is given, then also include this #ifdef PBOB_DIR use readdata_pbob, only:read_data_pbob, set_labels_pbob #endif #ifdef H5PART_DIR use readdata_h5part, only:read_data_h5part, set_labels_h5part #endif ! use readdata_snsph, only:read_data_snsph, set_labels_snsph implicit none public :: select_data_format, guess_format public :: print_available_formats abstract interface subroutine set_labels_subroutine end subroutine end interface abstract interface subroutine read_data_subroutine(rootname,indexstart,iposn,nstepsread) integer, intent(in) :: indexstart,iposn integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname end subroutine end interface procedure(read_data_subroutine), pointer, public :: read_data procedure(set_labels_subroutine), pointer, public :: set_labels private contains !---------------------------------------------------------------------- ! subroutine to select string specified data format !---------------------------------------------------------------------- subroutine select_data_format(string_in,ierr) use asciiutils, only:lcase character(len=*), intent(in) :: string_in integer, intent(out) :: ierr character(len=len(string_in)) :: string ! allow both -ascii and --ascii in flags if (string_in(1:1)=='-') then string = string_in(2:) else string = string_in endif !---------------------------- ! Checks for dependencies !---------------------------- ! Check if SPLASH has been compiled with hdf5, if hdf5 format is requested if ((index(string, 'hdf5') > 0) .or. (index(string, '.h5') > 0)) then #ifndef HDF5 print "(/,a)", ' *** ERROR: hdf5 file format requested, but SPLASH not compiled with HDF5 ***' print "(a)", ' Try make HDF5=yes ' stop #else continue #endif end if ! Check if H5PART is being requested if (string == 'h5part') then #ifndef H5PART_DIR print "(/,a)", ' *** ERROR: H5PART file given, but SPLASH not compiled with the H5PART library. ***' print "(a)", ' Try make H5PART_DIR=/path/to/h5part/ Note: You must also compile with HDF5=yes' stop #else continue #endif end if ! Check if SPLASH has been compiled with the fits library, if fits format is requested if (string == 'fits') then #ifndef FITS print "(/,a)", ' *** ERROR: .fits file given, but SPLASH not compiled with the fits library. ***' print "(a)", ' Try make FITS=yes ' #endif end if ! Check if PBOB is being requested if (string == 'pbob') then #ifndef PBOB_DIR print "(/,a)", ' *** ERROR: .pbob file given, but SPLASH has not been compiled with the PBOB library. ***' print "(a)", ' Try make PBOB_DIR=/path/to/pbob/ ' #else continue #endif end if ierr=0 !---------------------------------------------------- ! Search input string for matching supported formats !---------------------------------------------------- select case(trim(adjustl(lcase(string)))) case('sphng', 'phantom', 'phantomsph') read_data=>read_data_sphNG set_labels=>set_labels_sphNG case('ascii') read_data=>read_data_ascii set_labels=>set_labels_ascii case('ndspmhd') read_data=>read_data_ndspmhd set_labels=>set_labels_ndspmhd case('gadget') read_data=>read_data_gadget set_labels=>set_labels_gadget case('vine') read_data=>read_data_VINE set_labels=>set_labels_VINE case('sro', 'srosph', 'magma') read_data=>read_data_sro set_labels=>set_labels_sro case('dragon') read_data=>read_data_dragon set_labels=>set_labels_dragon case('seren','gandalf') read_data=>read_data_seren set_labels=>set_labels_seren case('tipsy', 'gasoline') read_data=>read_data_tipsy set_labels=>set_labels_tipsy case('mhutch') read_data=>read_data_mhutch set_labels=>set_labels_mhutch case('ucla', 'ascii_ucla', 'ucla_ascii', 'sky') read_data=>read_data_ucla set_labels=>set_labels_ucla case('aly') read_data=>read_data_aly set_labels=>set_labels_aly case('bauswein') read_data=>read_data_bauswein set_labels=>set_labels_bauswein case('egaburov') read_data=>read_data_egaburov set_labels=>set_labels_egaburov case('foulkes', 'steve') read_data=>read_data_foulkes set_labels=>set_labels_foulkes case('gadget_jsb', 'gadget-jsb') read_data=>read_data_gadget_jsb set_labels=>set_labels_gadget_jsb case('jjm') read_data=>read_data_jjm set_labels=>set_labels_jjm case('jjmmulti', 'jjm_multi', 'jjm_multiphase') read_data=>read_data_jjmmulti set_labels=>set_labels_jjmmulti case('mbate') read_data=>read_data_mbate set_labels=>set_labels_mbate case('oilonwater') read_data=>read_data_oilonwater set_labels=>set_labels_oilonwater case('rsph') read_data=>read_data_rsph set_labels=>set_labels_rsph ! case('snsph', 'snsplash') ! read_data=>read_data_snsph ! set_labels=>set_labels_snsph ! case('sphysics') ! read_data=>read_data_sphysics ! set_labels=>set_labels_sphysics case('spyros') read_data=>read_data_spyros set_labels=>set_labels_spyros case('urban') read_data=>read_data_urban set_labels=>set_labels_urban case('gradsph', 'vanaverbeke', 'sigfried') read_data=>read_data_vanaverbeke set_labels=>set_labels_vanaverbeke case('starsmasher', 'star_smasher', 'jamiesph') read_data=> read_data_starsmasher set_labels=>set_labels_starsmasher case('vtk') read_data=> read_data_vtk set_labels=>set_labels_vtk ! Make the hdf5 data formats available if SPLASH has been compiled with HDF5 #ifdef HDF5 case('phantom_hdf5', 'sphng_hdf5', 'phantomsph_hdf5') print "(a)", 'Phantom HDF5 files are currently not supported :( ' stop case('gadget_hdf5','swift') read_data=>read_data_gadget_hdf5 set_labels=>set_labels_gadget_hdf5 case('amuse_hdf5') read_data=>read_data_amuse_hdf5 set_labels=>set_labels_amuse_hdf5 ! case('falcon_hdf5', 'falconhdf5', 'falcon') ! read_data=>read_data_falcON_hdf5 ! set_labels=>set_labels_falcON_hdf5 case('flash_hdf5', 'flashhdf5', 'flash') read_data=>read_data_flash_hdf5 set_labels=>set_labels_flash_hdf5 case('cactus', 'cactus_hdf5') read_data=>read_data_cactus_hdf5 set_labels=>set_labels_cactus_hdf5 #endif ! Make fits routines available if SPLASH has been compiled with FITS #ifdef FITS case('fits') read_data=>read_data_fits set_labels=>set_labels_fits #endif ! Make PBOB available if PBOB_DIR defined #ifdef PBOB_DIR case('pbob') read_data=>read_data_pbob set_labels=>set_labels_pbob #endif ! Make H5PART available of H5PART_DIR defined #ifdef H5PART_DIR case('h5part') read_data=>read_data_h5part set_labels=>set_labels_h5part #endif case default !call guess_format() ierr=1 end select end subroutine select_data_format !---------------------------------------------------------------------- ! subroutine for printing help messages associated with reading data !---------------------------------------------------------------------- subroutine print_available_formats(string) character(len=*), intent(in), optional :: string !print "(/,a)",' To select data formats, use the shortcuts below, or use the -f or --format command line options' !print "(a)" ,' Multiple data formats are not support in a single instance.' if (string == 'short') then print "(/,a,/)",'Example data formats (type --formats for full list):' else print "(/,a,/)",'Supported data formats (auto = automatically identified from file contents):' endif print "(a)" ,' -ascii,-csv : ascii text/csv format (default)' print "(a)" ,' -phantom -sphng : Phantom and sphNG codes (auto)' print "(a)" ,' -vtk : vtk legacy binary format (auto)' print "(a)" ,' -ndspmhd : ndspmhd code (auto)' print "(a)" ,' -gandalf,-seren : Gandalf/Seren code' #ifdef HDF5 print "(a)" ,' -gadget -gadget_hdf5 : Gadget code (auto)' print "(a)" ,' -falcon -falcon_hdf5 : FalcON code' print "(a)" ,' -flash -flash_hdf5 : FLASH code' print "(a)" ,' -cactus -cactus_hdf5 : Cactus code' print "(a,/)",' -amuse -amuse_hdf5 : AMUSE Framework' #else print "(a)" ,' -gadget : Gadget code (auto)' #endif #ifdef FITS print "(a)" ,' -fits : FITS format (auto)' #endif #ifdef PBOB_DIR print "(a)" ,' -pbob : PBOB format' #endif #ifdef H5PART_DIR print "(a)" ,' -h5part : H5PART format' #endif if (string /= 'short') then print "(a)",' -tipsy -gasoline : Gasoline code (auto)' print "(a)",' -vine : VINE SPH code' print "(a)",' -rsph : Regularised SPH' print "(a)",' -starsmasher : Star Smasher code' print "(a)",' -dragon : DRAGON code' print "(a)",' -sro -magma : Stephan Rosswog SPH code' print "(a)",' -gradsph : GRADSPH code' print "(a)"," -mhutch : Mark Hutchison's code" print "(a)"," -mbate : Matthew Bate's code" print "(a)",' -oilonwater : Oil-on-Water binary accretion SPH' print "(a)",' -ucla : UCLA ascii format' print "(a)",' -urban : Andrea Urban ascii format' print "(a)",' -spyros : Spyros Kitsionas format' print "(a)",' -jjm -jjmmulti : Joe Monaghan format' print "(a)",' -bauswein : Andreas Bauswein format' print "(a)",' -egaburov : Evghenii Gaburov format' print "(a)",' -aly : Aly Reheam format' print "(a)",' -foulkes : Foulkes ascii format' print "(a)",' -vanaverbeke : Sigfried Vanaverbeke code' print "(a)",' -gadget_jsb : GADGET Jamie Bolton variant' #ifndef HDF5 print "(a)",' -gadget_hdf5 : Gadget HDF5 [not compiled]' print "(a)",' -falcon -falcon_hdf5 : FalcON code [not compiled]' print "(a)",' -flash -flash_hdf5 : FLASH code [not compiled]' print "(a)",' -cactus -cactus_hdf5 : Cactus code [not compiled]' print "(a)",' -amuse -amuse_hdf5 : AMUSE Framework [not compiled]' #endif #ifndef FITS print "(a)",' -fits : FITS format [not compiled]' #endif end if #ifdef HDF5 print "(/,a)" ,'This build supports HDF5 formats. HDF5 files will be automatically' print "(a)",' recognised if they end with .h5, however you must specify a supported data format.' print "(a)",' add a suffix "_hdf5" to above format if your data files do not end with .h5.' #else print "(/,a)",'This build does not support HDF5. Compile with HDF5=yes to change this.' #endif #ifndef FITS print "(a)",'This build does not support FITS. Compile with FITS=yes to change this.' #endif end subroutine print_available_formats !----------------------------------------------------------------------------------- ! subroutine for guessing the file format if not specified, or full info not given !----------------------------------------------------------------------------------- subroutine guess_format(nfiles,filenames,ierr,informat) use asciiutils, only:get_extensions integer, intent(in) :: nfiles character(len=*), intent(in) :: filenames(:) character(len=*), intent(in), optional :: informat ! This is given if --format is supplied integer, intent(out) :: ierr character(len=12), dimension(5) :: extensions(5) call get_extensions(filenames(1), extensions) ierr = 0 ! ! try to guess the file format from the extension ! if (any(index(extensions, '.h5') > 0) .or. any(index(extensions, '.hdf5') > 0)) then if (present(informat)) then call select_data_format(informat//"_hdf5",ierr) elseif (any((index(extensions, '.pb') > 0))) then call select_data_format("phantom_hdf5", ierr) else call select_data_format('gadget_hdf5',ierr) endif elseif (any((index(extensions, '.fits') > 0))) then call select_data_format('fits',ierr) elseif (any((index(extensions, '.vtk') > 0))) then call select_data_format('vtk',ierr) elseif (any((index(extensions, '.pb') > 0))) then call select_data_format('phantom', ierr) elseif (any((index(extensions, '.pbob') > 0))) then call select_data_format('pbob', ierr) elseif (any((index(extensions, '.csv') > 0))) then call select_data_format('ascii', ierr) else ! ! if cannot guess from extension, then ! try to guess from the filename/header ! call guess_format_from_file_header(filenames(1),ierr) ! ! it is ok to not get a format, just assume ascii ! in this case we just return ierr /= 0 ! endif end subroutine guess_format !------------------------------------------------------------ ! subroutine for guessing the file format from the filename ! and (if filename matches) the first few lines of the file !------------------------------------------------------------ subroutine guess_format_from_file_header(filename,ierr) character(len=*), intent(in) :: filename integer, intent(out) :: ierr ierr = 1 if (file_format_is_sphNG(filename)) then call select_data_format('sphNG',ierr) elseif (file_format_is_gadget(filename)) then call select_data_format('gadget',ierr) elseif (index(filename,'.hdf5') > 0) then call select_data_format('gadget_hdf5',ierr) elseif (file_format_is_ndspmhd(filename)) then call select_data_format('ndspmhd',ierr) elseif (file_format_is_tipsy(filename)) then call select_data_format('tipsy',ierr) endif end subroutine guess_format_from_file_header end module readdata danieljprice-splash-4d1f09c/src/read_data_UCLA.f90000066400000000000000000000150671477365367100217220ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR SKY KING / MARK MORRIS' (UCLA) ASCII DATA FORMAT ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ntot(maxstep) : total number of particles in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_ucla implicit none public :: read_data_ucla, set_labels_ucla private contains subroutine read_data_UCLA(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,time,gamma,maxpart,maxcol,maxstep use params use settings_data, only:ndim,ndimV,ncolumns,ncalc use mem_allocation, only:alloc integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,ierr,nerr,iunit,ncolstep,ncolenv integer :: nprint,npart_max,nstep_max,icol integer :: igatherb,ntot,ninit,ninit1,nstar logical :: iexist real :: tread,pmass,hbav1,dttot,xmacc,xlxacc,xlyacc,xlzacc real, dimension(3) :: xptmass,yptmass,vxptmass,vyptmass character(len=len(rootname)+4) :: dumpfile nstepsread = 0 nstep_max = 0 npart_max = maxpart iunit = 15 ! logical unit number for input dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions (0 means no particle coords) ! ndim = 3 ndimV = 3 ncolstep = 10 ! create one column for particle mass nstar = 3 j = indexstart nstepsread = 0 print "(a)",' reading Sky King/Mark Morris (UCLA) ascii data format ' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the file and read the number of particles ! open(unit=iunit,iostat=ierr,file=dumpfile,status='old',form='formatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return endif ! !--read header lines, try to use it to set time ! read(iunit,*,iostat=ierr) nprint,tread,pmass,xptmass(1),yptmass(1),xptmass(2),yptmass(2),& vxptmass(1),vyptmass(1),vxptmass(2),vyptmass(2), & xptmass(3),yptmass(3),vxptmass(3),vyptmass(3) if (ierr /= 0) print "(a)",' WARNING: error(s) reading first header line' print "(a,i10,a,1pe10.3)",' npart = ',nprint, ' time = ',tread read(iunit,*,iostat=ierr) igatherb,ntot,ninit,ninit1,hbav1,dttot,xmacc,xlxacc,xlyacc,xlzacc if (ierr /= 0) print "(a)",' WARNING: error(s) reading second header line' print "(a)",' header info: ' print "(2(a11,i10))",' igatherb: ',igatherb,' ntot: ',ntot print "(2(a11,i10))",' ninit: ',ninit,' ninit1: ',ninit1 print "(3(a11,1pe10.4))",' hbav1: ',hbav1,' dttot: ',dttot,' xmacc: ',xmacc print "(3(a11,1pe10.4))",' accelx: ',xlxacc,' accely: ',xlyacc,' accelz: ',xlzacc ! !--(re)allocate memory ! nstep_max = max(nstep_max,indexstart,1) if (.not.allocated(dat) .or. (nprint > maxpart) .or. (ncolstep+ncalc) > maxcol) then npart_max = max(npart_max,INT(1.1*(nprint)),maxpart) call alloc(npart_max,nstep_max,max(ncolstep+ncalc,maxcol)) endif ! !--set the necessary parameters ! ncolumns = ncolstep nstepsread = nstepsread + 1 npartoftype(:,j) = 0 npartoftype(1,j) = nprint npartoftype(2,j) = nstar time(j) = tread ! !--now read the timestep data in the dumpfile ! nerr = 0 do i=1,nprint read(iunit,*,iostat=ierr) (dat(i,icol,j),icol = 1,9) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,' ERRORS reading particle data on ',nerr,' lines' close(iunit) !--set particle mass from column dat(1:nprint,10,j) = pmass !--copy star particle properties into main data array do i=nprint+1,nprint+nstar dat(i,1,j) = xptmass(i-nprint) dat(i,2,j) = yptmass(i-nprint) dat(i,3,j) = 0. dat(i,4,j) = vxptmass(i-nprint) dat(i,5,j) = vyptmass(i-nprint) dat(i,6,j) = 0. enddo return end subroutine read_data_UCLA !!------------------------------------------------------------------- !! set labels for each column of data !! !! read these from a file called 'columns' in the current directory !! then take sensible guesses as to which quantities are which !! from the column labels !! !!------------------------------------------------------------------- subroutine set_labels_UCLA use labels, only:label,labeltype,ix,irho,ipmass,ih,ipr,ivx,iamvec,labelvec use params use settings_data, only:ncolumns,ntypes,ndim,ndimV,UseTypeInRenderings use geometry, only:labelcoord integer :: i,ierr,ndimVtemp do i=1,ndim ix(i) = i enddo ivx = 4 irho = 7 ipr = 8 ih = 9 ipmass = 10 label(irho) = 'density' label(ipr) = 'pressure' label(ih) = 'smoothing length' label(ipmass) = 'particle mass' if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = 'v\d'//labelcoord(i,1) enddo endif ! !--set labels for each particle type ! ntypes = 2 labeltype(1) = 'gas' labeltype(2) = 'star' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. !----------------------------------------------------------- return end subroutine set_labels_UCLA end module readdata_ucla danieljprice-splash-4d1f09c/src/read_data_VINE.f90000066400000000000000000000436011477365367100217320ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM THE VINE CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! *** CONVERTS TO SINGLE PRECISION *** ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! COMMAND-LINE FLAGS: ! ! --mhd if set, reads MHD dump files ! --hfac if set, multiplies the ! smoothing lengths read from the file by a factor of 2.8 for ! compatibility with older VINE dump files. ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module vineread implicit none ! ! These are the indices of various values saved in ! the header part of the dump file. ! ! SHOULD BE IDENTICAL TO THOSE DEFINED IN THE VINE io.F FILE... ! integer,parameter::id_iheadlen= 1, id_npart = 2, id_npart_sph = 3 integer,parameter::id_nstep = 4, id_idump = 5, id_makechkpnt= 6 integer,parameter::id_idbg = 7, id_itme = 8, id_ibctype = 9 integer,parameter::id_indts =10, id_iusebin=11, id_ipres =12 integer,parameter::id_ipdv =13, id_ieos =14, id_icool =15 integer,parameter::id_iheat =16, id_ivisc =17, id_ivtime =18 integer,parameter::id_ibals =19, id_ishok =20, id_igrav =21 integer,parameter::id_isoft =22, id_imac =23, id_ihts =24 integer,parameter::id_iexpand =25, id_ncdumps=26, id_maxclumpsize=27 integer,parameter::id_intgrtr =28, id_ishift =29, id_ndim =30 integer,parameter::id_io_fmt =31, id_iunits =32, id_maxbunchsize=33 integer,parameter::id_npoim =34, id_ndt_ana=35, id_maxbuild =36 integer,parameter::id_fullextrap=37,id_revise=38, id_n_dtmax =39 integer,parameter::id_n_ana =40 integer,parameter::id_lastint1=41 !1 after last id for integers integer, parameter::id_t = 1,id_dtmax = 2,id_deltnew = 3 integer, parameter::id_gamma = 4,id_ekin = 5,id_egrav = 6 integer, parameter::id_etherm = 7,id_ascale = 8,id_cosbox = 9 integer, parameter::id_vlength =10,id_alfstar =11,id_betastar =12 integer, parameter::id_tol =13,id_cfl =14,id_dhmax =15 integer, parameter::id_treeacc =16,id_sepmax =17,id_hmin =18 integer, parameter::id_eps =19,id_dtinit =20,id_tstop =21 integer, parameter::id_dt_out =22,id_uconst =23,id_xmas =24 integer, parameter::id_ylen =25,id_umin =26,id_rcore =27 integer, parameter::id_h_0 =28,id_omegam =29,id_gmasslim =30 integer, parameter::id_hmax =31,id_uexpon =32,id_ftol =33 integer, parameter::id_clhfrac =34,id_xmin =35,id_xmax =36 integer, parameter::id_ymin =37,id_ymax =38,id_zmin =39 integer, parameter::id_zmax =40 integer, parameter::id_eosK =41,id_rhozero =42,id_ftolpm =43 integer, parameter::id_tolpm =44,id_tnextout=45,id_alfmax =46 integer, parameter::id_vtol =47,id_vtolpm =48,id_dtmin =49 integer, parameter::id_tlastout=50,id_dt_ana =51,id_bsepmax =52 integer, parameter::id_taucool =53 integer, parameter::id_lastreal1=54 !1 after last id for real numbers end module vineread module readdata_VINE implicit none public :: read_data_VINE, set_labels_VINE private contains subroutine read_data_VINE(rootname,indexstart,ipos,nstepsread) use particle_data, only:npartoftype,dat,time,gamma,maxcol,maxpart,maxstep use params, only:doub_prec use settings_data, only:ndim,ndimV,ncolumns,ncalc use labels, only:ivx, iBfirst,ih,ipmass use mem_allocation, only:alloc use system_utils, only:lenvironment use vineread, only:id_gamma,id_iheadlen,id_ndim,id_npart,id_npart_sph,& id_npoim,id_t integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: iheadlength integer :: i,j,ierr,nparti,ntoti,i1,icol integer :: npart_max,nstep_max,ncolstep,nptmass logical :: iexist,mhdread,useipindx character(len=len(rootname)+10) :: dumpfile integer, parameter :: maxheadlength = 1000 integer, dimension(maxheadlength) :: iheader integer, dimension(:), allocatable :: ipindx,itstepbin !--we are assuming dump is double precision real(doub_prec), dimension(maxheadlength) :: dheader real(doub_prec), dimension(:,:), allocatable :: dattemp, dattempvec real :: dum real :: hfactor nstepsread = 0 npart_max = maxpart !--this is the default header length iheadlength = maxheadlength dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 mhdread = .false. if (lenvironment('VSPLASH_MHD') .or. lenvironment('VINE_MHD')) then mhdread = .true. endif if (lenvironment('VSPLASH_HFAC') .or. lenvironment('VINE_HFAC')) then hfactor = 2.8 else hfactor = 1.0 endif nstep_max = max(indexstart,1) j = indexstart nstepsread = 0 nparti = 0 ncolstep = 0 write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) if (mhdread) then print "(a)",' reading VINE MHD format' else print "(a)",' reading default VINE format (set --mhd for MHD)' endif ! !--open the (unformatted) binary file and read the number of particles ! open(unit=15,iostat=ierr,file=dumpfile,status='old',form='unformatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' else ! !--read timestep header (integers only) ! read(15,iostat=ierr) (iheader(i),i=1,iheadlength) ! !--get number of particles from header and allocate memory ! iheadlength = iheader(id_iheadlen) if (iheadlength > maxheadlength) print "(a)",' ERROR: header length too big!' ntoti = iheader(id_npart ) nparti = iheader(id_npart_sph) nptmass = iheader(id_npoim ) ndim = iheader(id_ndim ) if (ntoti < nparti) then print*,' *** WARNING: ntotal < npart_sph in header, setting n_total=n_sph' ntoti = nparti endif if (nptmass < 0) then print*,' *** WARNING: error in nptmass read from header, nptmass = ',nptmass,' setting to 0' nptmass = 0 endif if (nparti <= 0) then print*,' *** WARNING: error in npart read from header, npart = ',nparti ierr = 2 endif if (ndim <= 0 .or. ndim > 3) then print*,' *** WARNING: error in ndim read from header, ndim = ',ndim ierr = 1 endif ndimV = ndim if (ndim /= 3) print "(a,i1)",' number of dimensions = ',ndim if (mhdread) then ncolstep = 2*ndim + 6 + ndim else ncolstep = 2*ndim + 6 endif ncolumns = ncolstep if ((.not.allocated(dat) .or. ntoti+nptmass > npart_max) .and. ierr==0) then if (.not.allocated(dat)) then npart_max = ntoti + nptmass else npart_max = max(npart_max,INT(1.1*(ntoti+nptmass))) endif call alloc(npart_max,nstep_max,ncolstep+ncalc) endif ! !--rewind file ! rewind(15) endif if (ierr /= 0) then print "(/,a)", ' *** ERROR READING TIMESTEP HEADER: wrong endian? ***' print "(/,a)", ' (see splash userguide for compiler-dependent' print "(a)", ' ways to change endianness on the command line)' print "(/,a,/)", ' (set --mhd if you are trying to read MHD format)' else npart_max = max(npart_max,ntoti) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,j+2*nstepsread,maxcol) endif ! !--allocate a temporary array for double precision variables ! if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(npart_max,ncolstep),stat=ierr) dattemp = 0. if (ierr /= 0) print*,'not enough memory in read_data_VINE (dattemp)' ! !--allocate a temporary array for vectors ! if (allocated(dattempvec)) deallocate(dattempvec) if (mhdread) then allocate(dattempvec(3*ndim+1,npart_max),stat=ierr) else allocate(dattempvec(2*ndim+1,npart_max),stat=ierr) endif dattempvec = 0. if (ierr /= 0) print*,'not enough memory in read_data_VINE (dattempvec)' ! !--allocate a temporary array for particle index ! if (allocated(ipindx)) deallocate(ipindx) allocate(ipindx(npart_max),stat=ierr) !ipindx = 0 if (ierr /= 0) print*,'not enough memory in read_data_VINE (ipindx)' ! !--allocate a temporary array for itstepbin (MHD or point masses only) ! if (mhdread .or. nptmass > 0) then if (allocated(itstepbin)) deallocate(itstepbin) allocate(itstepbin(npart_max),stat=ierr) !itstepbin = 0 if (ierr /= 0) print*,'not enough memory in read_data_VINE (itstepbin)' endif ! !--now read the timestep data in the dumpfile ! write(*,"(a,i5,a)",advance="no") '| step ',j,': ' ivx = ndim + 2 ! location of vx in 'columns' ! starting point for non position and velocity columns icol = ndim + 1 + ndimV + 1 if (mhdread) then if (nptmass > 0) then print "(a)",' WARNING: MHD format but point masses are present' print "(a)",' and reading of point masses is not implemented' print "(a)",' *** Please email a copy of io.F so I can fix this *** ' endif iBfirst = icol+5 read(15,iostat=ierr) & (iheader(i),i=1,iheadlength), & (dheader(i),i=1,iheadlength), & (dattempvec(1:ndim+1,i),i=1,ntoti), & (dattempvec(ivx:ivx+ndimV-1,i),i=1,ntoti), & (dattemp(i,icol), i=1,ntoti), & (dattemp(i,icol+1), i=1,nparti), & (dattemp(i,icol+2), i=1,nparti), & (dattemp(i,icol+3), i=1,nparti), & (dattemp(i,icol+4), i=1,ntoti), & (ipindx(i), i=1,ntoti), & (itstepbin(i),i=1,ntoti), & (dattempvec(ivx+ndimV:ivx+2*ndimV-1,i),i=1,nparti) else if (nptmass > 0) then ! !--read point mass information at the end of the dump file ! read(15,iostat=ierr) & (iheader(i),i=1,iheadlength), & (dheader(i),i=1,iheadlength), & (dattempvec(1:ndim+1,i),i=1,ntoti), & (dattempvec(ivx:ivx+ndimV-1,i),i=1,ntoti), & (dattemp(i,icol), i=1,ntoti), & (dattemp(i,icol+1), i=1,nparti), & (dattemp(i,icol+2), i=1,nparti), & (dattemp(i,icol+3), i=1,nparti), & (dattemp(i,icol+4), i=1,ntoti), & (ipindx(i), i=1,ntoti), & (dum, i=1,nparti), & (itstepbin(i), i=1,ntoti), & (dattempvec(1:ndim+1,i),i=ntoti+1,ntoti+nptmass), & (dattempvec(ivx:ivx+ndimV-1,i),i=ntoti+1,ntoti+nptmass), & ((dum, i1=1,3),i=1,nptmass), & (dattemp(i,icol), i=ntoti+1,ntoti+nptmass) else ! !--no point masses, so shorter read ! read(15,iostat=ierr) & (iheader(i),i=1,iheadlength), & (dheader(i),i=1,iheadlength), & (dattempvec(1:ndim+1,i),i=1,ntoti), & (dattempvec(ivx:ivx+ndimV-1,i),i=1,ntoti), & (dattemp(i,icol), i=1,ntoti), & (dattemp(i,icol+1), i=1,nparti), & (dattemp(i,icol+2), i=1,nparti), & (dattemp(i,icol+3), i=1,nparti), & (dattemp(i,icol+4), i=1,ntoti), & (ipindx(i), i=1,ntoti) endif endif if (ierr < 0) then print "(a)",'*** END OF FILE IN READ DATA ***' elseif (ierr /= 0) then if (mhdread) then print "(a)",'*** ERROR READING DATA: MAYBE NOT AN MHD FILE?? ***' else print "(a)",'*** ERROR READING DATA ***' print "(/,a,/)", ' (set --mhd if you are trying to read MHD format)' endif endif nstepsread = nstepsread + 1 ! !--spit out time ! time(j) = real(dheader(id_t )) gamma(j) = real(dheader(id_gamma)) print "(a,es10.3,3(a,i8))",'t = ',time(j),' n(SPH) = ',ntoti,' n(Nbody) = ',ntoti-nparti,' n(star) = ',nptmass ! !--check sanity of ipindx array: do not sort particles if values not sensible ! useipindx = .true. if (any(ipindx(1:ntoti) <= 0 .or. ipindx(1:ntoti) > ntoti)) then print*,'WARNING: ipindx array has values < 0 or > ntot: particles not sorted' useipindx = .false. endif ! !--convert posm and velocity vectors to columns and double to single precision ! do i=1,2*ndim+1 if (useipindx) then dat(ipindx(1:ntoti),i,j) = real(dattempvec(i,1:ntoti)) else dat(1:ntoti,i,j) = real(dattempvec(i,1:ntoti)) endif enddo if (nptmass > 0) then do i=1,2*ndim+1 dat(ntoti+1:ntoti+nptmass,i,j) = real(dattempvec(i,ntoti+1:ntoti+nptmass)) enddo endif ! !--convert B vectors to columns and double to single precision ! if (mhdread) then i1 = iBfirst - 1 do i=ivx+ndimV,ivx+2*ndimV-1 i1 = i1 + 1 if (useipindx) then dat(ipindx(1:nparti),i1,j) = real(dattempvec(i,1:nparti)) else dat(1:nparti,i1,j) = real(dattempvec(i,1:nparti)) endif enddo endif ! !--now convert scalars ! if (useipindx) then dat(ipindx(1:ntoti),icol:ncolstep,j) = real(dattemp(1:ntoti,icol:ncolstep)) else dat(1:ntoti,icol:ncolstep,j) = real(dattemp(1:ntoti,icol:ncolstep)) endif if (nptmass > 0) then dat(ntoti+1:ntoti+nptmass,icol,j) = real(dattemp(ntoti+1:ntoti+nptmass,icol)) endif call set_labels_VINE if (ih > 0 .and. hfactor > 1.0) then dat(1:ntoti+nptmass,ih,j) = hfactor*dat(1:ntoti+nptmass,ih,j) endif if (nptmass < 10) then do i=1,nptmass if (ndim==2) then print "('| point mass ',i1,': pos = (',es10.2,',',es10.2,'), mass = ',es10.2)", & i,dat(ntoti+i,1:ndim,j),dat(ntoti+i,ipmass,j) else print "('| point mass ',i1,': pos = (',2(es10.2,','),es10.2,'), mass = ',es10.2)", & i,dat(ntoti+i,1:ndim,j),dat(ntoti+i,ipmass,j) endif enddo endif ! !--set particle numbers ! npartoftype(1,j) = nparti npartoftype(2,j) = ntoti - nparti npartoftype(3,j) = nptmass ! !--clean up ! if (allocated(dattemp)) deallocate(dattemp) if (allocated(dattempvec)) deallocate(dattempvec) if (allocated(ipindx)) deallocate(ipindx) if (allocated(itstepbin)) deallocate(itstepbin) endif ! !--reached end of file ! close(15) if (nstepsread > 0) then print*,'>> end of dump file: ntotal = ',sum(npartoftype(:,j)) endif return end subroutine read_data_VINE !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_VINE use labels, only:label,ih,ipmass,ivx,iutherm,irho,ix,iBfirst, & labelvec,iamvec,labeltype use params use settings_data, only:ndim,ndimV,UseTypeInRenderings,ntypes use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_VINE ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_VINE ***' return endif do i=1,ndim ix(i) = i enddo ipmass = ndim+1 ! particle mass ivx = ndim+2 ih = ndim + 1 + ndimV + 1 ! smoothing length iutherm = ih+1 ! thermal energy irho = iutherm+1 ! location of rho in data array label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = 'density' label(iutherm) = 'u' label(ih) = 'h' label(ipmass) = 'particle mass' label(irho+1) = 'alpha' label(irho+2) = 'potential energy' ! !--set labels for vector quantities ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//labelcoord(i,1) enddo if (iBfirst > 0) then iamvec(iBfirst:iBfirst+ndimV-1) = iBfirst labelvec(iBfirst:iBfirst+ndimV-1) = 'B' do i=1,ndimV label(iBfirst+i-1) = trim(labelvec(iBfirst))//'\d'//labelcoord(i,1) enddo endif ! !--set labels for each particle type ! ntypes = 3 labeltype(1) = 'gas' labeltype(2) = 'Nbody' labeltype(3) = 'point mass' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. UseTypeInRenderings(3) = .false. !----------------------------------------------------------- return end subroutine set_labels_VINE end module readdata_VINE danieljprice-splash-4d1f09c/src/read_data_aly.f90000066400000000000000000000214301477365367100217520ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! the data is stored in the global array dat ! ! THIS VERSION FOR ABDEL REHEAM's SPH CODE ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_aly use params, only:maxplot implicit none character(len=16), dimension(maxplot) :: compName public :: read_data_aly, set_labels_aly private contains subroutine read_data_aly(rootname,indexstart,ipos,nstepsread) use particle_data, only:npartoftype,masstype,time,gamma,dat,maxpart,maxstep,maxcol,iamtype use params use filenames, only:nfiles use settings_data, only:ndim,ndimV,ncolumns,ncalc, & buffer_data,iverbose,debugmode,ntypes use mem_allocation, only:alloc use labels, only:ipr,ivx,ih,irho,labeltype integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+4) :: datfile integer :: i,ierr,iunit,j,iblock integer :: npart_max,nstep_max integer, dimension(:), allocatable :: itype character(len=7) :: keyword character(len=70) :: title character(len=1) :: dumchar character(len=16) :: unitsys integer :: istep,jtype,np,ione,kk,idum,nblock real(kind=sing_prec) :: version,timesingle,dum real(kind=doub_prec) :: versiond,timedbl real :: timein,dx,dy logical :: singleprecision iunit = 11 ! file unit number nstepsread = 0 if (rootname(1:1) /= ' ') then datfile = trim(rootname) else print*,' **** no data read **** ' return endif if (iverbose >= 1) print "(1x,a)",'reading Aly format' write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ndim = 2 ndimV = 2 ! !--open data file and read data ! open(unit=iunit,iostat=ierr,file=datfile,status='old',form='unformatted',access='stream') if (ierr /= 0) then print*,' *** Error opening '//trim(datfile)//' ***' return endif ! !--read first header line ! read(iunit,iostat=ierr,end=80) keyword read(iunit,iostat=ierr,end=80) version read(iunit,iostat=ierr,end=80) title read(iunit,iostat=ierr,end=80) istep read(iunit,iostat=ierr,end=80) timesingle timein = timesingle read(iunit,iostat=ierr,end=80) np read(iunit,iostat=ierr,end=80) ione if (ierr /= 0 .or. np <= 0 .or. timesingle < 0.) then ! !--try single precision ! rewind(iunit) read(iunit,iostat=ierr,end=80) keyword read(iunit,iostat=ierr,end=80) versiond version = real(versiond,kind=kind(version)) read(iunit,iostat=ierr,end=80) title read(iunit,iostat=ierr,end=80) istep read(iunit,iostat=ierr,end=80) timedbl timein = real(timedbl) read(iunit,iostat=ierr,end=80) np read(iunit,iostat=ierr,end=80) ione singleprecision = .false. if (ierr /= 0 .or. np < 0 .or. timedbl < 0.) then print "(a)",' *** Error reading first header ***' close(iunit) return endif endif print "(a,f4.2)",' keyword = '//trim(keyword)//' version = ',version !print "(a)",' title = '//trim(title) print "(a,i6,a,es10.3,a,i6)",' step = ',istep,' time = ',timein,' np = ',np ! !--allocate memory for data arrays ! if (buffer_data) then nstep_max = max(nfiles,maxstep,indexstart) else nstep_max = max(1,maxstep,indexstart) endif npart_max = max(int(1.1*np),maxpart) ncolumns = 7 if (.not.allocated(dat) .or. npart_max > maxpart & .or. nstep_max > maxstep .or. ncolumns+ncalc > maxcol) then call alloc(npart_max,nstep_max,ncolumns+ncalc,mixedtypes=.true.) endif i = indexstart nstepsread = 0 time(i) = timein gamma(i) = 5./3. npartoftype(1,i) = np do j=1,np read(iunit,iostat=ierr,end=67) idum,(dat(j,kk,i),kk=1,2),dum enddo read(iunit,iostat=ierr,end=67) nblock read(iunit,iostat=ierr,end=67) (idum,j=1,nblock) ntypes = 4 allocate(itype(np)) read(iunit,iostat=ierr,end=67) (itype(j),j=1,nblock) npartoftype(:,i) = 0 do j=1,np jtype = itype(j) !--map types from code types to splash types select case(jtype) case(1) jtype = 2 ! boundary case(2) jtype = 1 ! water case default ! unknown jtype = 4 end select iamtype(j,i) = int(jtype,kind=kind(iamtype)) npartoftype(jtype,i) = npartoftype(jtype,i) + 1 enddo deallocate(itype) read(iunit,iostat=ierr,end=67) (dumchar,j=1,nblock) read(iunit,iostat=ierr,end=67) (idum,j=1,nblock) call set_labels_aly do iblock=1,1 read(iunit,iostat=ierr,end=67) nblock read(iunit,iostat=ierr,end=67) idum do j=1,nblock read(iunit,iostat=ierr,end=67) compName(j),unitsys,idum,idum,dum !print*,trim(compName(j)) enddo do j=1,np read(iunit,iostat=ierr,end=67) dum,dat(j,ipr,i),dat(j,ivx,i),dat(j,ivx+1,i),dat(j,1,i),dat(j,2,i) if (abs(dum) < tiny(0.)) then npartoftype(iamtype(j,i),i) = npartoftype(iamtype(j,i),i) - 1 ! remove from previous type iamtype(j,i) = 3 npartoftype(3,i) = npartoftype(3,i) + 1 ! add to "box" type endif enddo enddo ! !--fake other properties: density, mass, smoothing length etc. ! masstype(1,i) = 1./npartoftype(1,i) ! !--assume smoothing length to be the max dimension divided by the number of particles^(1/ndim) ! dx = maxval(dat(1:np,1,i)) - minval(dat(1:np,1,i)) dy = maxval(dat(1:np,2,i)) - minval(dat(1:np,2,i)) dat(:,ih,i) = dx/(npartoftype(1,i))**(1./ndim)*(dy/dx) print*,' WARNING: ASSUMING SMOOTHING LENGTH = ',dat(1,ih,i),' AND ARBITRARY PARTICLE MASSES' dat(:,irho,i) = 1. nstepsread = 1 do jtype=1,ntypes write(*,"(' n(',a,') = ',i6)",advance="no") trim(labeltype(jtype)),npartoftype(jtype,i) enddo write(*,*) !read* goto 68 67 continue print "(a)",' > end of file reached <' 68 continue ! !--close data file and return ! close(unit=11) if (debugmode) print*,'DEBUG> Read steps ',indexstart,'->',indexstart + nstepsread - 1, & ' last step ntot = ',sum(npartoftype(:,indexstart+nstepsread-1)) return 80 continue print*,' *** data file empty : no timesteps ***' return end subroutine read_data_aly !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_aly use labels, only:ix,ivx,ih,irho,ipr,& iamvec,labelvec,label,labeltype use params use settings_data, only:ndim,ndimV,UseTypeInRenderings use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_aly ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_aly ***' return endif do i=1,ndim ix(i) = i enddo ivx = ndim + 1 ipr = ndim + ndimV + 1 irho = ipr + 1 ih = irho + 1 label(ipr) = 'pressure' label(irho) = 'density' label(ih) = 'h' label(ix(1:ndim)) = labelcoord(1:ndim,1) ! !--label vector quantities (e.g. velocity) appropriately ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' ! !--set labels for each type of particles ! labeltype(1) = 'water' labeltype(2) = 'boundary' labeltype(3) = 'box' labeltype(4) = 'unknown' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. UseTypeInRenderings(3) = .false. UseTypeInRenderings(4) = .false. !----------------------------------------------------------- end subroutine set_labels_aly end module readdata_aly danieljprice-splash-4d1f09c/src/read_data_amuse_hdf5.f90000066400000000000000000000302141477365367100232050ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR HDF5 OUTPUT FROM THE AMUSE FRAMEWORK ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Columns with the 'required' flag set to false are not read !------------------------------------------------------------------------- ! ! The module below contains interface routines to c functions ! that perform the actual calls to the HDF5 libs ! !------------------------------------------------------------------------- module amusehdf5read use params, only:maxplot,doub_prec use labels, only:lenlabel use, intrinsic :: iso_c_binding, only:c_int,c_double,c_char implicit none real :: hsoft character(len=lenlabel), dimension(maxplot) :: blocklabel logical :: havewarned = .false. integer, parameter :: maxtypes = 6 interface subroutine read_amuse_hdf5_header(filename,npart,ncol,ndim,ndimV,time,ierr) bind(c) import character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(out) :: npart,ncol,ndim,ndimV,ierr real(kind=c_double), intent(out) :: time end subroutine read_amuse_hdf5_header subroutine read_amuse_hdf5_data(filename,maxtypes,npartoftypei,& ncol,isrequired,ierr) bind(c) import implicit none character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(in), value :: maxtypes integer(kind=c_int), dimension(6), intent(in) :: npartoftypei integer(kind=c_int), intent(in), value :: ncol integer(kind=c_int), intent(out) :: ierr integer(kind=c_int), dimension(ncol), intent(in) :: isrequired end subroutine read_amuse_hdf5_data end interface end module amusehdf5read !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- module readdata_amuse_hdf5 implicit none public :: read_data_amuse_hdf5, set_labels_amuse_hdf5 private contains subroutine read_data_amuse_hdf5(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,maxpart,maxcol,maxstep use params, only:doub_prec,maxplot use settings_data, only:ndim,ndimV,ncolumns,ncalc,required,ipartialread, & ntypes,iverbose,debugmode use settings_page, only:legendtext use mem_allocation, only:alloc use labels, only:ih,irho,ipmass use system_utils, only:renvironment,lenvironment,ienvironment,envlist use asciiutils, only:cstring use amusehdf5read, only:havewarned,read_amuse_hdf5_header,read_amuse_hdf5_data integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,j,ierr integer :: nhfac integer :: ncolstep,npart_max,nstep_max,ntoti logical :: iexist,reallocate,debug,goterrors real(doub_prec) :: timetemp real :: hfact,hfactmean,pmassi real, parameter :: pi = 3.1415926536 integer, dimension(maxplot) :: isrequired nstepsread = 0 goterrors = .false. debug = debugmode if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! print "(1x,a)",'reading AMUSE HDF5 format' inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--append .hdf5 on the endif not already present ! datfile=trim(rootname)//'.hdf5' inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 ! !--read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open file and read header information ! if (debug) print*,'DEBUG: reading header...' call read_amuse_hdf5_header(cstring(datfile),ntoti,ncolstep,ndim,ndimV,timetemp,ierr) if (ierr /= 0) then print "(a)", '*** ERROR READING HEADER ***' return endif ncolumns = ncolstep if (iverbose >= 1) print "(2(a,1x,i10))",' npart: ',ntoti,' ncolumns: ',ncolstep ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntoti) else ! if first time, save on memory npart_max = int(ntoti) endif endif if (i >= maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol)) endif ! !--copy header data into allocated arrays ! npartoftype(1,i) = ntoti time(i) = real(timetemp) masstype(:,i) = 0. ! all masses read from file ! !--read particle data ! got_particles: if (ntoti > 0) then isrequired(:) = 0 where (required(1:ncolumns)) isrequired(1:ncolumns) = 1 call read_amuse_hdf5_data(cstring(datfile),ntypes,npartoftype(:,i),ncolumns,isrequired,ierr) nstepsread = 1 endif got_particles ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ! !--set flag to indicate that only part of this file has been read ! if (.not.all(required(1:ncolstep))) ipartialread = .true. ! !--call set labels to identify location of smoothing length ! call set_labels_amuse_hdf5 ! !--for read from multiple files, work out the next file in the sequence ! ! !--for some reason the smoothing length output by GADGET is ! twice the usual SPH smoothing length ! (do this after we have read data from all of the files) ! if (required(ih) .and. size(dat(1,:,:)) >= ih .and. npartoftype(1,i) > 0 .and. ih > 0) then print "(a)",' converting GADGET smoothing length on gas particles to usual SPH definition (x 0.5)' dat(1:npartoftype(1,i),ih,i) = 0.5*dat(1:npartoftype(1,i),ih,i) endif ! !--give a friendly warning about using too few or too many neighbours ! (only works with equal mass particles because otherwise we need the number density estimate) ! if (ih > 0 .and. required(ih) .and. ipmass > 0 .and. required(ipmass) & .and. abs(masstype(1,i)) < tiny(0.) .and. ndim==3 .and. .not.havewarned) then nhfac = 100 if (npartoftype(1,i) > nhfac) then hfactmean = 0. do j=1,nhfac pmassi = dat(j,ipmass,i) if (pmassi > 0.) then pmassi = 1./pmassi else pmassi = 0. endif hfact = dat(j,ih,i)*(dat(j,irho,i)*pmassi)**(1./ndim) hfactmean = hfactmean + hfact enddo hfact = hfactmean/real(nhfac) havewarned = .true. print "(/,1x,a,f5.1,a,/,1x,a,f4.2,a,i1,a,/)", & 'Simulations employ ',4./3.*pi*(2.*hfact)**3,' neighbours,', & 'corresponding to h = ',hfact,'*(m/rho)^(1/',ndim,') in 3D' endif endif ! !--cover the special case where no particles have been read ! if (ntoti <= 0) then npartoftype(1,i) = 1 dat(:,:,i) = 0. endif if (nstepsread > 0) then print "(a,i10,a)",' >> read ',sum(npartoftype(:,istepstart+nstepsread-1)),' particles' endif return end subroutine read_data_amuse_hdf5 subroutine read_amuse_hdf5_data_fromc(icol,npartoftypei,temparr,itype) bind(c) use, intrinsic :: iso_c_binding, only:c_int,c_double use particle_data, only:dat,iamtype use settings_data, only:debugmode use labels, only:label integer(kind=c_int), intent(in) :: icol,npartoftypei,itype real(kind=c_double), intent(in) :: temparr(npartoftypei) integer(kind=c_int) :: i,icolput integer :: nmax icolput = icol if (debugmode) print "(a,i2,a,i2,a,i8)",'DEBUG: reading column ',icol,' type ',itype,' -> '//trim(label(icolput)) ! check column is within array limits if (icolput > size(dat(1,:,1)) .or. icolput==0) then print "(a,i2,a)",' ERROR: column = ',icolput,' out of range in receive_data_fromc' return endif ! ensure no array overflows nmax = min(npartoftypei,size(dat(:,1,1))) ! copy data into main splash array dat(1:nmax,icolput,1) = real(temparr(1:nmax)) ! set particle type if (size(iamtype(:,1)) > 1) then do i=1,nmax iamtype(i,1) = int(itype + 1,kind=kind(iamtype)) enddo endif end subroutine read_amuse_hdf5_data_fromc !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_amuse_hdf5 use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass, & ih,irho,iutherm,iax,make_vector_label use params use settings_data, only:ndim,ndimV,UseTypeInRenderings use geometry, only:labelcoord use system_utils, only:envlist,ienvironment use amusehdf5read, only:blocklabel use asciiutils, only:lcase integer :: icol if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_amuse_hdf5 ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_amuse_hdf5 ***' return endif ix = 0 iutherm = 0 do icol=1,size(blocklabel) select case(trim(lcase(blocklabel(icol)))) case('x') ix(1) = icol case('y') ix(2) = icol case('z') ix(3) = icol case('vx') ivx = icol case('ax') iax = icol case('h_smooth') ih = icol case('mass') ipmass = icol case('density') irho = icol end select label(icol) = trim(blocklabel(icol)) enddo ! set labels of the quantities read in if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) ! set labels for vector quantities call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('a',iax,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! set labels for each particle type labeltype(1) = 'gas' UseTypeInRenderings(:) = .false. UseTypeInRenderings(1) = .true. !----------------------------------------------------------- return end subroutine set_labels_amuse_hdf5 subroutine set_blocklabel(icol,name) bind(c) use, intrinsic :: iso_c_binding, only:c_int, c_char use amusehdf5read, only:blocklabel use asciiutils, only:fstring integer(kind=c_int), intent(in) :: icol character(kind=c_char), intent(in) :: name(256) blocklabel(icol) = trim(fstring(name)) !print*,icol,' name = ',trim(blocklabel(icol)) end subroutine set_blocklabel end module readdata_amuse_hdf5 danieljprice-splash-4d1f09c/src/read_data_amuse_hdf5_utils.c000066400000000000000000000271151477365367100242570ustar00rootroot00000000000000/* * This subroutine performs the calls to the HDF5 library for the * GADGET data read * * Easier to do it this way and link with c than to try to link against * the Fortran interface (in the latter case the modules must * have been compiled with the *exact* compiler used to compile splash * which is a real pain). * */ #include #include #include #include #include "hdf5_helper_utils.h" static int debug = 0; /*int checkfordataset(hid_t file_id, char *datasetname); * int get_rank(hid_t dataspace_id); * int get_rank_by_name(hid_t group_id, char *name); */ int read_amuse_hdf5_dataset(hid_t group_id, char *datasetname, int itype, int maxtypes, int npartoftype[maxtypes], int ncol, int isrequired[ncol], int *j); void set_blocklabel(int *icol, char *name); void read_amuse_hdf5_data_fromc(int *icol, int *npartoftypei, double temparr[*npartoftypei],int *itype); void read_amuse_hdf5_header(char *filename, int *npart, int *ncol, int *ndim, int *ndimV, double *time, int *ierr) { hid_t file_id; hid_t group_id, group_id1, group_id2; hid_t attrib_id; herr_t status; herr_t HDF5_error = -1; *ierr = 0; *ndim = 0; *ndimV = 0; if (debug) printf("DEBUG: opening %s \n",filename); file_id = H5Fopen(filename,H5F_ACC_RDONLY,H5P_DEFAULT); if (file_id == HDF5_error) { printf("ERROR opening %s \n",filename); *ierr = 1; return; } char *maingroup = "particles"; /* * Open the "particles" dataset and read the number of particles attribute * */ if (!checkfordataset(file_id,maingroup)) { printf(" ERROR: \"%s\" dataset not found in AMUSE HDF5 file\n",maingroup); *ierr = 2; return; } #if H5_VERSION_GE(1,8,0) group_id1 = H5Gopen2(file_id,maingroup,H5P_DEFAULT); #else group_id1 = H5Gopen(file_id,maingroup); #endif if (group_id1 == HDF5_error) { printf("ERROR opening %s data set \n",maingroup); *ierr = 2; return; } #if H5_VERSION_GE(1,8,0) group_id = H5Gopen2(group_id1,"0000000001",H5P_DEFAULT); #else group_id = H5Gopen(group_id1,"0000000001"); #endif if (group_id == HDF5_error) { printf("ERROR opening 00000000001 data set \n"); *ierr = 2; return; } int nattrib; int i; char name[256]; nattrib = H5Aget_num_attrs(group_id); if (debug) printf("number of attributes found = %i\n",nattrib); /* * Read through all of the attributes in the header, so we * can still spit out the values even if they are not used by SPLASH */ for(i=0; i < nattrib; i++) { attrib_id = H5Aopen_idx(group_id,i); ssize_t attr_status; attr_status = H5Aget_name(attrib_id, 256, name); hid_t type_id; type_id = H5Aget_type(attrib_id); /*type_class = H5Tget_native_type(type_id,H5T_DIR_ASCEND);*/ if (strcmp(name,"time")==0) { status = H5Aread(attrib_id,H5T_NATIVE_DOUBLE,time); } else if (strcmp(name,"number_of_particles")==0) { status = H5Aread(attrib_id,H5T_NATIVE_INT,npart); } else { if (debug) printf("DEBUG: unknown attribute %s \n",name); } if (status==HDF5_error) { printf(" ERROR reading attribute %s \n",name); } status = H5Aclose(attrib_id); } /* * Now we need to get the number of data columns in the file * (from the number of datasets in the "attributes" group) */ #if H5_VERSION_GE(1,8,0) group_id2 = H5Gopen2(group_id,"attributes",H5P_DEFAULT); #else group_id2 = H5Gopen(group_id,"attributes"); #endif if (group_id2 == HDF5_error) { printf("ERROR opening %s data set \n","attributes"); *ierr = 2; return; } hsize_t ndatasets; status = H5Gget_num_objs(group_id2, &ndatasets); if (debug) printf("DEBUG: number of datasets = %i \n",(int)ndatasets); *ncol = (int)ndatasets; int idim; /* check that coordinates are present in file */ idim = get_rank_by_name(group_id2,"x"); if (idim <= 0) { printf("ERROR: x positions not found\n"); *ierr = 3; } idim = get_rank_by_name(group_id2,"y"); if (idim <= 0) { printf("ERROR: y positions not found\n"); *ierr = 3; } idim = get_rank_by_name(group_id2,"z"); if (idim <= 0) { printf("z positions not found, assuming file is 2D \n"); *ndim = 2; *ndimV = 2; } else { *ndim = 3; *ndimV = 3; } /* finish, close all open datasets and close file */ status = H5Gclose(group_id2); if (status == HDF5_error) { printf("ERROR closing attributes data set \n"); *ierr = 3; return; } status = H5Gclose(group_id); if (status == HDF5_error) { printf("ERROR closing %s data set \n",maingroup); *ierr = 3; return; } status = H5Gclose(group_id1); if (status == HDF5_error) { printf("ERROR closing 0001 data set \n"); *ierr = 3; return; } status = H5Fclose( file_id ); if (status == HDF5_error) { printf("ERROR closing file \n"); *ierr = 7; } if (debug) printf("DEBUG: finished header read \n"); } void read_amuse_hdf5_data(char *filename, int maxtypes, int npartoftype[maxtypes], int ncol, int isrequired[ncol], int *ierr) { hid_t file_id; hid_t group_id, group_id1, group_id2; herr_t status; herr_t HDF5_error = -1; char groupname[12]; char datasetname[256]; int i; if (debug) printf("DEBUG: re-opening %s \n",filename); file_id = H5Fopen(filename,H5F_ACC_RDONLY,H5P_DEFAULT); if (file_id == HDF5_error) { printf("ERROR re-opening %s \n",filename); *ierr = 1; return; } /* open main particles group */ char *maingroup = "particles"; #if H5_VERSION_GE(1,8,0) group_id1 = H5Gopen2(file_id,maingroup,H5P_DEFAULT); #else group_id1 = H5Gopen(file_id,maingroup); #endif if (debug) printf("DEBUG: maxtypes = %i\n",maxtypes); /* read dataset for each particle type present in dump file */ int itype,iobjtype; for (itype=0;itype 0) { /* If npartoftype[N] > 0 in header, look for dataset of the form 000000000N */ sprintf(groupname,"00000000%02i",itype+1); if (debug) printf("DEBUG: opening group %s\n",groupname); #if H5_VERSION_GE(1,8,0) group_id = H5Gopen2(group_id1,groupname,H5P_DEFAULT); #else group_id = H5Gopen(group_id1,groupname); #endif if (group_id == HDF5_error) { printf("ERROR opening %s group \n",groupname); *ierr = 2; } else { #if H5_VERSION_GE(1,8,0) group_id2 = H5Gopen2(group_id,"attributes",H5P_DEFAULT); #else group_id2 = H5Gopen(group_id,"attributes"); #endif if (group_id2 == HDF5_error) { printf("ERROR opening attributes group \n"); *ierr = 2; } else { hsize_t ndatasets; status = H5Gget_num_objs(group_id2, &ndatasets); if (debug) printf("DEBUG: number of datasets = %i \n",(int)ndatasets); int j = 0; /* always read particle positions first */ *ierr = read_amuse_hdf5_dataset(group_id2,"x",itype,maxtypes,npartoftype,ncol,isrequired,&j); j = 1; *ierr = read_amuse_hdf5_dataset(group_id2,"y",itype,maxtypes,npartoftype,ncol,isrequired,&j); j = 2; *ierr = read_amuse_hdf5_dataset(group_id2,"z",itype,maxtypes,npartoftype,ncol,isrequired,&j); /* read remaining datasets in the order they appear in the file */ for(i=0; i < (int)ndatasets; i++) { status = H5Gget_objname_by_idx(group_id2, i, datasetname, 256); iobjtype = H5Gget_objtype_by_idx(group_id2, i); if (strcmp(datasetname,"x")&& strcmp(datasetname,"y")&& strcmp(datasetname,"z")&& (iobjtype == H5G_DATASET)) { *ierr = read_amuse_hdf5_dataset(group_id2,datasetname,itype,maxtypes,npartoftype,ncol,isrequired,&j); } } /* close "attributes" group */ H5Gclose(group_id2); } H5Gclose(group_id); } } } H5Gclose(group_id1); status = H5Fclose( file_id ); if (status == HDF5_error) { printf("ERROR closing file \n"); *ierr = 7; } } int read_amuse_hdf5_dataset(hid_t group_id, char *datasetname, int itype, int maxtypes, int npartoftype[maxtypes], int ncol, int isrequired[ncol], int *j) { hid_t dataset_id, dataspace_id, memspace_id; herr_t status; herr_t HDF5_error = -1; int ierr = 0; char name[256]; if (!checkfordataset(group_id,datasetname)) { ierr = 1; return ierr; } #if H5_VERSION_GE(1,8,0) dataset_id = H5Dopen2(group_id,datasetname,H5P_DEFAULT); #else dataset_id = H5Dopen(group_id,datasetname); #endif dataspace_id = H5Dget_space(dataset_id); int rank = get_rank(dataspace_id); int k, flag; /* do nothing if none of the columns are required */ flag = 0; for (k=0;k> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ntot(maxstep) : total number of particles in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module asciiread use labels, only:lenlabel,label integer :: icoltype character(len=lenlabel), dimension(size(label)) :: label_orig end module asciiread module readdata_ascii implicit none public :: read_data_ascii, set_labels_ascii private contains subroutine read_data_ascii(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,time,gamma,maxpart,maxcol,maxstep,iamtype use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,iverbose,ntypes,debugmode use mem_allocation, only:alloc use asciiutils, only:get_ncolumns,read_column_labels,isdigit,readline_csv use system_utils, only:ienvironment,renvironment use asciiread, only:icoltype,label_orig use labels, only:labeltype,print_types use, intrinsic :: ieee_arithmetic integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,ierr,iunit,ncolstep,ncolenv,nerr,iheader_time,iheader_gamma integer :: nprint,npart_max,nstep_max,nheaderlines,nheaderenv,itype,nlabels integer :: noftype(maxparttypes),iverbose_was logical :: iexist,timeset,gammaset,csv real :: dummyreal real, allocatable :: dattemp(:) character(len=len(rootname)+4) :: dumpfile character(len=4096) :: line character(len=10) :: str,strc integer, parameter :: notset = -66 nstepsread = 0 nstep_max = 0 npart_max = maxpart iunit = 15 ! logical unit number for input dumpfile = trim(rootname) if (iverbose > 1) print "(1x,a)",'reading ascii format' print "(26('>'),1x,a,1x,26('<'))",trim(dumpfile) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions (0 means no particle coords) ! ndim = 0 ndimV = 0 j = indexstart nstepsread = 0 icoltype = 0 ! no particle type defined by default csv = index(dumpfile,'.csv') > 0 ! if filename contains .csv ! !--open the file and read the number of particles ! open(unit=iunit,iostat=ierr,file=dumpfile,status='old',form='formatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return else call get_ncolumns(iunit,ncolstep,nheaderlines,csv=csv) !--override header lines setting nheaderenv = ienvironment('ASPLASH_NHEADERLINES',-1) if (nheaderenv >= 0) then if (iverbose > 0) print*,' setting nheader lines = ',nheaderenv,' from --nheaderlines flag' nheaderlines = nheaderenv endif !--override columns setting with environment variable ncolenv = ienvironment('ASPLASH_NCOLUMNS',-1) if (ncolenv > 0) then if (iverbose > 0) print "(a,i3,a)",' setting ncolumns = ',ncolenv,' from --ncolumns flag' ncolstep = ncolenv endif if (ncolstep <= 1) then !print "(a)",'*** ERROR: could not determine number of columns in file ***' print "(/,a)",' Are you trying to read a non-ascii file? If so, use:' print "(' ',/,a,/,' ')",' splash -f '//trim(dumpfile) print "(a)",' Use splash --formats for list of supported data formats ' return endif !--search through header for column labels if (ncolstep > 1) call read_column_labels(iunit,nheaderlines,ncolstep,nlabels,label_orig,csv,debugmode) rewind(iunit) iverbose_was = iverbose iverbose = 0 ncolumns = ncolstep call set_labels_ascii() ! to see if types are defined iverbose = iverbose_was ! !--allocate memory initially ! nprint = 101 nstep_max = max(nstep_max,indexstart,1) if (.not.allocated(dat) .or. (nprint > npart_max) .or. (ncolstep+ncalc) > maxcol) then npart_max = max(npart_max,INT(1.1*(nprint))) call alloc(npart_max,nstep_max,ncolstep+ncalc,mixedtypes=(icoltype > 0)) endif endif npart_max = max(npart_max,nprint) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,j+1,maxcol,mixedtypes=(icoltype > 0)) endif ! !--can set either set the time and gamma explicitly ! using environment variables (fixed for all files) ! or can specify on which header line the time appears ! timeset = .false. gammaset = .false. dummyreal = renvironment('ASPLASH_TIME',errval=-1.) if (dummyreal > 0.) then time(j) = dummyreal timeset = .true. endif dummyreal = renvironment('ASPLASH_GAMMA',errval=-1.) if (dummyreal > 0.) then gamma(j) = dummyreal gammaset = .true. endif iheader_time = ienvironment('ASPLASH_TIMEHEADER',errval=notset) iheader_gamma = ienvironment('ASPLASH_GAMMAHEADER',errval=notset) ! !--read header lines, try to use it to set time ! !if (nheaderlines > 0 .and. iverbose > 0) print*,'skipping ',nheaderlines,' header lines' do i=1,nheaderlines !--read header lines as character strings ! so that blank lines are counted in nheaderlines read(iunit,"(a)",iostat=ierr) line if (line(1:1)=='#') then read(line(2:),*,iostat=ierr) dummyreal else read(line,*,iostat=ierr) dummyreal endif if (i==iheader_time .and. .not.timeset) then if (ierr==0) then time(j) = dummyreal timeset = .true. print*,'setting time = ',dummyreal,' from header line ',i print*,'(determined from --timeheader setting)' else print "(a,i2,a)",' ** ERROR reading time from header line ',i, & ' (using --timeheader)' endif elseif (i==iheader_gamma .and. .not.gammaset) then if (ierr==0) then gamma(j) = dummyreal gammaset = .true. print*,'setting gamma = ',dummyreal,' from header line ',i print*,'(determined from --gammaheader setting)' else print "(a,i2,a)",' ** ERROR reading gamma from header line ',i, & ' (using --gammaheader)' endif elseif (timeset .and. .not.gammaset .and. ierr==0 .and. iheader_gamma==notset & .and. dummyreal > 1.0 .and. dummyreal < 2.000001) then print*,'setting gamma = ',dummyreal,' from header line ',i gamma(j) = dummyreal gammaset = .true. elseif (ierr==0 .and. .not. timeset .and. iheader_time==notset .and. index(line,'.') /= 0) then time(j) = dummyreal timeset = .true. print*,'setting time = ',dummyreal,' from header line ',i endif enddo ! ! allocate temporary array to read each line ! allocate(dattemp(ncolstep)) ! !--now read the timestep data in the dumpfile ! i = 0 ierr = 0 nerr = 0 noftype(:) = 0 ntypes = 1 overparts: do while (ierr >= 0) i = i + 1 if (i > npart_max) then ! reallocate memory if necessary npart_max = 10*npart_max call alloc(npart_max,nstep_max,ncolstep+ncalc,mixedtypes=(icoltype > 0)) endif dattemp(1:ncolstep) = ieee_value(1., ieee_quiet_nan) ! NaN if not read if (csv) then read(iunit,"(a)",iostat=ierr) line call readline_csv(line,ncolstep,dattemp) else read(iunit,*,iostat=ierr) dattemp(1:ncolstep) endif !print*,ncolstep,nheaderlines,'line ',i,' got',dattemp(1:10) !read* dat(i,1:ncolstep,j) = dattemp(1:ncolstep) if (icoltype > 0 .and. icoltype <= ncolstep .and. ierr==0 .and. (size(iamtype(:,j)) > 1)) then !--set particle type from type column itype = nint(dat(i,icoltype,j)) if (itype > 0 .and. itype < maxparttypes) then iamtype(i,j) = int(itype,kind=1) else iamtype(i,j) = 1 endif itype = iamtype(i,j) noftype(itype) = noftype(itype) + 1 ntypes = max(itype,ntypes) else iamtype(:,:) = 1 endif if (ierr > 0) then nerr = nerr + 1 if (nerr <= 10) print "(a,i8,a)",' ERROR reading data from line ',i+nheaderlines,', skipping' i = i - 1 ! ignore lines with errors endif enddo overparts if (allocated(dattemp)) deallocate(dattemp) nprint = i - 1 nstepsread = nstepsread + 1 if (nerr > 10) then print "(a,i8,a)",' *** WARNING: errors whilst reading file on ',nerr,' lines: skipped these ***' endif if (ierr < 0 .and. (icoltype <=0 .or. icoltype > ncolstep)) then write(str,"(i10)") nprint str = adjustl(str) write(strc,"(i10)") ncolstep strc = adjustl(strc) if (nheaderlines > 0 .and. iverbose > 0) then if (nheaderlines > 10) then print "(a,i3,a)",' npts = '//trim(str)//', ncols = '//trim(strc)//', skipped ',nheaderlines,' header lines' else print "(a,i1,a)",' npts = '//trim(str)//', ncols = '//trim(strc)//', skipped ',nheaderlines,' header lines' endif else print "(a)",' npts = '//trim(str)//', ncols = '//trim(strc) endif endif npartoftype(:,j) = 0 if (icoltype > 0 .and. icoltype <= ncolstep) then npartoftype(1:ntypes,j) = noftype(1:ntypes) call print_types(npartoftype(:,j),labeltype) else npartoftype(1,j) = nprint endif close(iunit) end subroutine read_data_ascii !------------------------------------------------------------------- ! set labels for each column of data ! ! read these from a file called 'columns' in the current directory ! then take sensible guesses as to which quantities are which ! from the column labels ! !------------------------------------------------------------------- subroutine set_labels_ascii use asciiutils, only:lcase,match_taglist,find_repeated_tags,add_escape_chars use labels, only:label,labeltype,ix,irho,ipmass,ih,iutherm, & ipr,ivx,iBfirst,iamvec,labelvec,lenlabel, & make_vector_label use settings_data, only:ncolumns,ndim,ndimV,UseTypeInRenderings,iverbose use geometry, only:labelcoord use system_utils, only:get_environment_or_flag use filenames, only:fileprefix use asciiread, only:icoltype,label_orig integer :: i,ierr,ndimVtemp character(len=120) :: columnfile character(len=lenlabel) :: labeli logical :: iexist,got_time ! !--read column labels from the columns file if it exists ! ! first look for a columns file in the current directory ! either called splash.columns or just 'columns' ! columnfile=trim(fileprefix)//'.columns' inquire(file=trim(columnfile),exist=iexist) if (.not.iexist) then columnfile='columns' inquire(file=trim(columnfile),exist=iexist) endif ! ! if it does not exist see if the environment variable is set ! and the corresponding file exists ! if (.not.iexist) then call get_environment_or_flag('ASPLASH_COLUMNSFILE',columnfile) if (len_trim(columnfile) > 0) then inquire(file=trim(columnfile),exist=iexist) if (iexist) then if (iverbose > 0) print "(a)",' using --columnsfile='//trim(columnfile) else print "(a)",' ERROR: --columnsfile='//trim(columnfile)//' DOES NOT EXIST' columnfile = 'columns' endif else columnfile = 'columns' endif endif open(unit=51,file=trim(columnfile),status='old',iostat=ierr) if (ierr /=0) then ! print*,'HERE ',label(1) if (iverbose > 0 .and. len_trim(label_orig(1))==0) then print "(3(/,a))",' WARNING: column labels not found in file header:',& ' To change the labels, create a file called ''columns'' ',& ' in the current directory with one label per line' endif else overcols: do i=1,ncolumns read(51,"(a)",iostat=ierr) label_orig(i) if (ierr < 0) then if (iverbose > 0) print "(a,i3)",' end of file in columns file: read to column ',i-1 exit overcols elseif (ierr > 0) then if (iverbose > 0) print "(a)",' *** error reading from columns file ***' exit overcols endif enddo overcols close(unit=51) endif ! !--re-copy the labels from their originals ! this is to avoid trying to match tags on labels ! which have already been modified by splash (e.g. vectors) ! do i=1,ncolumns if (len_trim(label_orig(i)) > 0) label(i) = trim(label_orig(i)) enddo ! !--first, look for 'x','y','z' as consecutive labels ! to determine the number of dimensions ! call match_taglist((/'x','y','z'/),label(1:ncolumns),ix(1),ndim) do i=2,ndim ix(i) = ix(1)+i-1 enddo call match_taglist((/'vx','vy','vz'/),lcase(label(1:ncolumns)),ivx,ndimV) call match_taglist((/'bx','by','bz'/),lcase(label(1:ncolumns)),iBfirst,ndimVtemp) if (ndimV==0 .and. ivx==0) call match_taglist((/'ux','uy','uz'/),lcase(label(1:ncolumns)),ivx,ndimV) ! !--make labels safe for plotting ! do i=1,ncolumns if (len_trim(label_orig(i)) > 0) label(i) = trim(add_escape_chars(label_orig(i))) enddo got_time = .false. do i=1,ncolumns ! !--compare all strings in lower case, trimmed and with no preceding spaces ! labeli = trim(adjustl(lcase(label(i)))) if (trim(labeli)=='t' .or. trim(labeli)=='time') got_time = .true. ! !--guess positions of various quantities from the column labels ! if (.not.got_time) then if (ndim <= 0 .and. (trim(labeli)=='x' .or. trim(labeli)=='r' .or. labeli(1:3)=='rad')) then ndim = 1 ix(1) = i endif if (ndim==1 .and. i==ix(1)+1 .and. (labeli(1:1)=='y' .or. labeli(1:1)=='z')) then ndim = 2 ix(2) = i endif if (ndim==2 .and. i==ix(2)+1 .and. labeli(1:1)=='z') then ndim = 3 ix(3) = i endif endif if (labeli(1:3)=='den' .or. index(labeli,'rho') /= 0 .or. labeli(1:3)=='\gr' .or. & (index(labeli,'density') /= 0 .and. irho==0)) then irho = i elseif (labeli(1:5)=='pmass' .or. labeli(1:13)=='particle mass' & .or. trim(labeli)=='mass') then ipmass = i elseif (ipmass==0 .and. trim(labeli)=='m') then ipmass = i !--use first column labelled h as smoothing length elseif (ih==0 .and. (labeli(1:1)=='h' & .or. labeli(1:6)=='smooth')) then ih = i elseif (trim(labeli)=='u'.or.labeli(1:6)=='utherm' & .or.(index(labeli,'internal energy') /= 0 .and. iutherm==0)) then iutherm = i elseif (labeli(1:2)=='pr' .or. trim(labeli)=='p' .or. & (index(labeli,'pressure') /= 0 .and. ipr==0)) then ipr = i elseif (icoltype==0 .and. trim(labeli)=='particle type' .or. trim(labeli)=='itype' & .or. trim(labeli)=='type' .or. trim(labeli)=='particle_type') then icoltype = i elseif (ivx==0 .and. ndim==1 .and. trim(labeli)=='v') then ivx = i endif enddo ! !--try to find vectors by looking for multiple entries starting with 'v' ! if (ndim > 0 .and. ivx==0) call find_repeated_tags('v_',ncolumns,label,ivx,ndimV) if (ndimVtemp > ndimV .and. iverbose > 0) & print "(a)",' WARNING: possible confusion with vector dimensions' ! !--ignore label identifications if no spatial coordinates found ! if (ndim < 1) then ndimV = 0 irho = 0 ipmass = 0 ih = 0 iutherm = 0 ipr = 0 ivx = 0 endif if (iverbose > 0) then if (ndim > 0) print "(a,i1,a,i2,a,i2)",' Assuming ',ndim,' dimensions, coords in cols ',ix(1),' to ',ix(ndim) !if (ndimV > 0) print "(a,i1)",' Assuming vectors have dimension = ',ndimV if (ndim > 0 .and. (irho > 0 .or. ipmass>0 .or. ih > 0)) write(*,"(a)",advance='no') ' Assuming' if (irho > 0) write(*,"(a,i2)",advance='no') ' density in column ',irho if (ipmass > 0) write(*,"(a,i2)",advance='no') ', mass in ',ipmass if (ih > 0) write(*,"(a,i2)",advance='no') ', h in ',ih if (iutherm > 0) write(*,"(/,a,i2)") ' Assuming thermal energy in ',iutherm if (iutherm==0 .and. ipr > 0) write(*,"(/,a)",advance='no') ' Assuming' if (ipr > 0) write(*,"(a,i2)",advance='no') ' pressure in column ',ipr if (ivx > 0) then if (ipr==0 .and. iutherm==0) write(*,*) if (ndimV > 1) then print "(a,i2,a,i2)",' Assuming velocity in cols ',ivx,' to ',ivx+ndimV-1 else print "(a,i2)",' Assuming velocity in column ',ivx endif endif if (icoltype > 0) then if (ipr==0 .and. iutherm==0 .and. ivx==0) write(*,*) write(*,"(a,i2)") ' Assuming particle type in column ',icoltype endif if ((irho > 0 .or. ih > 0 .or. ipmass > 0) & .and. ipr==0 .and. iutherm==0 .and. ivx==0 .and. icoltype==0) write(*,*) if (ndim > 0 .and. (irho==0 .or. ipmass==0 .or. ih==0)) then print "(2(/,a))",' NOTE: Rendering disabled until density, h and mass columns known', & ' (i.e. label relevant columns in file header or columns file)' endif endif call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('B',iBfirst,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--set labels for each particle type ! labeltype(1) = '' UseTypeInRenderings(1) = .true. end subroutine set_labels_ascii end module readdata_ascii danieljprice-splash-4d1f09c/src/read_data_bauswein.f90000066400000000000000000000171621477365367100230110ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2016 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM ANDREAS BAUSWEIN'S CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! *** CONVERTS TO SINGLE PRECISION *** ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! ENVIRONMENT VARIABLES: ! ! BSPLASH_R8 if 'YES' or 'TRUE' then assumes data is double precision ! BSPLASH_NCOL to change the number of columns read from the file, ! e.g. setenv BSPLASH_NCOL=22 ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_bauswein implicit none public :: read_data_bauswein, set_labels_bauswein private contains subroutine read_data_bauswein(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,time,npartoftype,gamma,maxpart,maxcol use params use settings_data, only:ndim,ndimV,ncolumns use mem_allocation, only:alloc use system_utils, only:lenvironment,ienvironment integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,k,ierr integer :: nprint,n1,npart_max,nstep_max integer :: ncol,nread,nerr,ncoltemp logical :: iexist,doubleprec character(len=len(rootname)) :: dumpfile real :: timei,dti real(doub_prec), dimension(maxcol) :: datdb real(doub_prec) :: timedb,dtdb nstepsread = 0 nstep_max = 0 npart_max = maxpart dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 !--number of columns to read from file ncol = 21 doubleprec = .false. !--can override these settings with environment variables if (lenvironment('BSPLASH_R8')) doubleprec = .true. ncoltemp = ienvironment('BSPLASH_NCOL') if (ncoltemp > 0) ncol = ncoltemp ! !--allocate memory initially ! nstep_max = max(nstep_max,indexstart,1) j = indexstart nstepsread = 0 print "(1x,a)",'reading Andreas Bauswein format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the (unformatted) binary file and read the number of particles ! open(unit=15,file=dumpfile,status='old',form='unformatted',iostat=ierr) if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return else ! !--read the number of particles in the header and allocate memory ! if (doubleprec) then read(15,end=55,iostat=ierr) nprint,n1,timedb,dtdb timei = real(timedb) dti = real(dtdb) else read(15,end=55,iostat=ierr) nprint,n1,timei,dti endif print "(a,f10.2,a,i10,a,i10,a,f10.4)",' time: ',timei,' npart: ',nprint,' n1: ',n1,' dt = ',dti !--barf if stupid values read if (nprint <= 0 .or. nprint > 1e10) then print "(a)",' *** ERRORS IN TIMESTEP HEADER: WRONG ENDIAN? ***' close(15) return elseif (ierr /= 0) then print "(a)",'*** WARNING: ERRORS READING HEADER ***' endif if (timei < 0. .or. dti < 0.) print "(a)",'*** ERROR: t < 0: use setenv BSPLASH_R8=TRUE for double precision' ncolumns = ncol if (.not.allocated(dat) .or. nprint > npart_max) then npart_max = max(npart_max,nprint) call alloc(npart_max,nstep_max,ncolumns) endif ! !--now read the timestep data in the dumpfile ! dat(:,:,j) = 0. time(j) = timei if (doubleprec) then nread = 0 nerr = 0 do i=1,nprint nread = nread + 1 read(15,end=44,iostat=ierr) (datdb(k),k=1,ncol) if (ierr /= 0) nerr = nerr + 1 dat(i,4,j) = real(datdb(1)) dat(i,1:3,j) = real(datdb(2:4)) dat(i,5:ncol,j) = real(datdb(5:ncol)) enddo else nread = 0 nerr = 0 do i=1,nprint nread = nread + 1 read(15,end=44,iostat=ierr) dat(i,4,j),dat(i,1:3,j),(dat(i,k,j),k=5,ncol) if (ierr /= 0) nerr = nerr + 1 enddo endif 44 continue if (nerr > 0) print *,'*** WARNING: ERRORS DURING READ ON ',nerr,' LINES' if (nread < nprint) then print "(a)",' WARNING: END OF FILE: read to particle ',nread nprint = nread endif nstepsread = nstepsread + 1 npartoftype(1,j) = nprint gamma(j) = 1.666666666667 j = j + 1 endif 55 continue ! !--reached end of file during header read ! close(15) if (allocated(npartoftype)) then print*,'>> end of dump file: nsteps =',j-1,'ntot = ',sum(npartoftype(:,j-1)) endif return end subroutine read_data_bauswein !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_bauswein use labels, only:label,labelvec,labeltype,iamvec,& ix,ivx,ih,irho,iutherm,ipmass,make_vector_label use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord !use settings_units, only:units,unitslabel integer :: i,ipmom if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_bauswein ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_bauswein ***' return endif do i=1,ndim ix(i) = i enddo ih = 4 ivx = 5 ipmom = 8 iutherm = 11 ipmass = 14 irho = 17 label(ix(1:ndim)) = labelcoord(1:ndim,1) label(ih) = 'h' if (iutherm > 0) label(iutherm) = 'u' label(12) = 'psi_{pot}' label(13) = 'alpha_{pot}' label(ipmass) = 'particle mass' label(15) = '\gr' label(16) = 'P\deff' label(irho) = '\gr*' label(18) = 'tau' label(19) = '\ga_{visc}' label(20) = 'Ye' label(21) = 'temperature' call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('momentum',ipmom,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--set labels for each particle type ! ntypes = 1 labeltype(1) = 'gas' UseTypeInRenderings(1) = .true. !----------------------------------------------------------- return end subroutine set_labels_bauswein end module readdata_bauswein danieljprice-splash-4d1f09c/src/read_data_cactus_hdf5.f90000066400000000000000000000262151477365367100233630ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2017 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR HDF5 OUTPUT FROM THE CACTUS CODE ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Columns with the 'required' flag set to false are not read !------------------------------------------------------------------------- !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- module readdata_cactus_hdf5 implicit none public :: read_data_cactus_hdf5, set_labels_cactus_hdf5 private contains subroutine read_data_cactus_hdf5(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,maxpart,maxcol,maxstep,iamtype use params, only:doub_prec use settings_data, only:ndim,ndimV,ncolumns,ncalc,ipartialread,iverbose,buffer_steps_in_file use settings_page, only:legendtext use mem_allocation, only:alloc use labels, only:ih,irho,ipmass use system_utils, only:renvironment,lenvironment,ienvironment,envlist use asciiutils, only:cstring use cactushdf5read, only:open_cactus_hdf5_file,read_cactus_hdf5_data,close_cactus_hdf5_file,& datfileprev,file_is_open,ntoti_prev,ncol_prev,nstep_prev,compute_extra_columns use dataread_utils, only:count_types integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,istep,ierr,nextra integer :: nunknown,ignoretl integer :: ncolstep,npart_max,nstep_max,nsteps_to_read,ntoti logical :: iexist,reallocate,goterrors,ignore_time_levels real(doub_prec) :: timetemp,dx,vol nstepsread = 0 goterrors = .false. if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! if (iverbose==1 .and. ipos==1) print "(1x,a)",'reading CACTUS HDF5 format' inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--append .h5 on the endif not already present ! datfile=trim(rootname)//'.h5' inquire(file=datfile,exist=iexist) endif ! !--close previous file if filenames do not match ! if (trim(datfile)/=trim(datfileprev) .and. file_is_open) then call close_cactus_hdf5_file(ierr) file_is_open = .false. endif if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 ignore_time_levels = lenvironment('CSPLASH_IGNORE_TIME_LEVELS') ignoretl = 0 if (ignore_time_levels) ignoretl = 1 nextra = 0 ! !--read data from snapshots ! i = istepstart if (.not.file_is_open) write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open file and read header information ! if (file_is_open) then ntoti = ntoti_prev ncolstep = ncol_prev nstep_max = nstep_prev else call open_cactus_hdf5_file(cstring(datfile),ipos,ntoti,ncolstep,nstep_max,ndim,ndimV,timetemp,ignoretl,ierr) if (ierr /= 0) then print "(a)", '*** ERROR READING HEADER ***' call close_cactus_hdf5_file(ierr) return endif file_is_open = .true. datfileprev = datfile ntoti_prev = ntoti ncol_prev = ncolstep nstep_prev = nstep_max endif call compute_extra_columns(ncolstep,nextra) ncolumns = ncolstep + nextra if (iverbose >= 1) print "(3(a,1x,i10))",' npart: ',ntoti,' ncolumns: ',ncolstep,' nsteps: ',nstep_max istep = 1 over_snapshots: do istep=1,nstep_max ! !--now read data ! reallocate = .false. npart_max = maxpart if (buffer_steps_in_file) then nsteps_to_read = nstep_max else nsteps_to_read = max(maxstep,1) endif if (nsteps_to_read > maxstep) reallocate = .true. if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntoti) else ! if first time, save on memory npart_max = int(ntoti) endif endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nsteps_to_read,max(ncolumns+ncalc,maxcol),mixedtypes=.true.) endif ! !--read particle data ! got_particles: if (ntoti > 0) then if (buffer_steps_in_file .or. ipos==istep) then call read_cactus_hdf5_data(cstring(datfile),istep,ntoti,timetemp,dx,ignoretl,ierr) call set_labels_cactus_hdf5 ! set smoothing length and particle mass !print*,' Setting h = ',dx, 'ndim = ',ndim,' in column ',ih,' step ',i if (ih > 0) dat(:,ih,i) = real(dx) vol = dx**ndim if (ipmass > 0 .and. irho > 0) dat(:,ipmass,i) = dat(:,irho,i)*real(vol) ! ! compute extra quantities (tr K, 3^R, etc) ! call compute_extra_columns(ncolstep,nextra,dat(:,:,i)) ! ! get number of cells of each type (normal, ghost) ! call count_types(ntoti,iamtype(:,i),npartoftype(:,i),nunknown) masstype(:,i) = 0. ! all masses read from file time(i) = real(timetemp) i = i + 1 endif nstepsread = nstepsread + 1 endif got_particles ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ! !--set flag to indicate that only part of this file has been read ! ipartialread = .false. ! !--call set labels to identify location of smoothing length ! call set_labels_cactus_hdf5 enddo over_snapshots if (nstepsread > 0) then print "(a,i10,a)",' >> read ',sum(npartoftype(:,istepstart)),' cells' endif !if (ipos==nstep_max) then ! call close_cactus_hdf5_file(ierr) ! file_is_open = .false. !endif end subroutine read_data_cactus_hdf5 subroutine read_cactus_hdf5_data_fromc(icol,ntot,np,temparr) bind(c) use, intrinsic :: iso_c_binding, only:c_int,c_double use particle_data, only:dat use settings_data, only:debugmode use labels, only:label integer(kind=c_int), intent(in) :: icol,ntot,np real(kind=c_double), intent(in) :: temparr(np) integer(kind=c_int) :: icolput integer :: nmax,i1,i2 icolput = icol i1 = ntot-np+1 i2 = ntot if (debugmode) print "(a,i2,a,i8,a,i8)",& 'DEBUG: reading column ',icol,' -> '//trim(label(icolput))//' parts ',i1,' to ',i2 ! check column is within array limits if (icolput > size(dat(1,:,1)) .or. icolput==0) then print "(a,i2,a)",' ERROR: column = ',icolput,' out of range in receive_data_fromc' return endif if (i2 > size(dat(:,1,1))) then print*,' ERROR with index range: ',i1,':',i2,' exceeds size ',size(dat(:,1,1)),' for column ',icol read* return endif ! ensure no array overflows nmax = min(i2,size(dat(:,1,1))) ! copy data into main splash array dat(i1:i2,icolput,1) = real(temparr(1:np)) return end subroutine read_cactus_hdf5_data_fromc subroutine read_cactus_itype_fromc(ntot,np,itype) bind(c) use, intrinsic :: iso_c_binding, only:c_int use particle_data, only:iamtype use params, only:int1 integer(kind=c_int), intent(in) :: ntot,np integer(kind=c_int), intent(in) :: itype(np) integer :: i1,i2,len_type i1 = ntot-np+1 i2 = ntot ! set particle type len_type = size(iamtype(:,1)) if (len_type > 1) then if (i2 > len_type) then print*,'error with itype length',i2,len_type return endif iamtype(i1:i2,1) = int(itype(1:np),kind=int1) endif return end subroutine read_cactus_itype_fromc !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_cactus_hdf5 use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass,iutherm,ih,irho use params use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord use system_utils, only:envlist,ienvironment use cactushdf5read, only:blocklabel use asciiutils, only:lcase integer :: i,icol if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_cactus_hdf5 ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_cactus_hdf5 ***' return endif blocklabel(1:5) = (/'x ','y ','z ','dx','m '/) ix(1) = 1 ix(2) = 2 ix(3) = 3 ih = 4 ipmass = 5 iutherm = 0 irho = 0 do icol=1,size(blocklabel) select case(trim(blocklabel(icol))) case('vel[0]') ivx = icol case('dens','density') if (irho==0) irho = icol case('rho') irho = icol end select label(icol) = trim(blocklabel(icol)) enddo ! set labels of the quantities read in if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) !if (irho > 0) label(irho) = 'density' !if (iutherm > 0) label(iutherm) = 'u' !if (ipmass > 0) label(ipmass) = 'particle mass' !if (ih > 0) label(ih) = 'h' ! set labels for vector quantities if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'_'//labelcoord(i,1) enddo endif ! set labels for each particle type ntypes = 2 labeltype(1) = 'gas' labeltype(2) = 'ghost' UseTypeInRenderings(:) = .true. UseTypeInRenderings(2) = .false. !----------------------------------------------------------- return end subroutine set_labels_cactus_hdf5 end module readdata_cactus_hdf5 danieljprice-splash-4d1f09c/src/read_data_cactus_hdf5_futils.f90000066400000000000000000000153411477365367100247470ustar00rootroot00000000000000!------------------------------------------------------------------------- ! ! Utility routines for the cactus hdf5 data read ! Module contains interface routines to c functions ! that perform the actual calls to the HDF5 libs ! !------------------------------------------------------------------------- module cactushdf5read use params, only:maxplot use labels, only:lenlabel use, intrinsic :: iso_c_binding, only:c_int,c_double,c_char implicit none character(len=lenlabel), dimension(maxplot) :: blocklabel character(len=130) :: datfileprev = ' ' logical :: file_is_open = .false. integer :: ntoti_prev,ncol_prev,nstep_prev interface subroutine open_cactus_hdf5_file(filename,istep,npart,ncol,nstep_max,ndim,ndimV,time,ignoretl,ierr) bind(c) import character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(in), value :: istep,ignoretl integer(kind=c_int), intent(out) :: npart,ncol,nstep_max,ndim,ndimV,ierr real(kind=c_double), intent(out) :: time end subroutine open_cactus_hdf5_file subroutine read_cactus_hdf5_data(filename,istep,npart,time,dx,ignoretl,ierr) bind(c) import character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(in), value :: istep,ignoretl integer(kind=c_int), intent(out) :: npart,ierr real(kind=c_double), intent(out) :: time,dx end subroutine read_cactus_hdf5_data subroutine close_cactus_hdf5_file(ierr) bind(c) import integer(kind=c_int), intent(out) :: ierr end subroutine close_cactus_hdf5_file end interface contains !------------------------------------------------------------------------- ! ! The following routines are callback routines called by the c ! utilities ! !------------------------------------------------------------------------- subroutine set_blocklabel_cactus(icol,name,lenname) bind(c) use, intrinsic :: iso_c_binding, only:c_int, c_char ! use cactushdf5read, only:blocklabel use asciiutils, only:fstring integer(kind=c_int), intent(in) :: icol,lenname character(kind=c_char), intent(in) :: name(lenname) character(len=24) :: temp integer :: ivar temp = fstring(name) ivar = index(temp,'::') if (ivar > 0) temp = temp(ivar+2:) if (icol <= size(blocklabel)) then blocklabel(icol) = trim(temp) else print*,'ERROR - too many columns in file' endif !print*,icol,' name = ',trim(blocklabel(icol)) end subroutine set_blocklabel_cactus subroutine sort_cactus_data(n,iter,iorder) bind(c) use, intrinsic :: iso_c_binding, only:c_int use sort, only:indexxi integer(kind=c_int), intent(in) :: n integer(kind=c_int), intent(in) :: iter(n) integer(kind=c_int), intent(out) :: iorder(n) call indexxi(n,iter,iorder) end subroutine sort_cactus_data !------------------------------------------------------------------------- ! ! The following routines compute useful things, e.g. tr K ! !------------------------------------------------------------------------- subroutine calc_trK(gxxd,gxyd,gxzd,gyyd,gyzd,gzzd,kxxd,kxyd,kxzd,kyyd,kyzd,kzzd,trk) ! ! Subroutine to calculate trace K ( trK = g^{ij} K_{ij} ) ! Takes g_{ij} and K_{ij} at one position and time, returns trK ! use vectorutils,only:matrixinvert3D real, intent(in) :: gxxd,gxyd,gxzd,gyyd,gyzd,gzzd ! spatial down metric components real, intent(in) :: kxxd,kxyd,kxzd,kyyd,kyzd,kzzd ! down extrinsic curvature components real :: gxxu,gxyu,gxzu,gyyu,gyzu,gzzu ! spatial up metric components real, intent(out) :: trk real, dimension(3,3) :: gijd, giju ! 4x4 metric down and up respectively integer :: ierr ! down components gijd(1,1) = gxxd gijd(1,2) = gxyd gijd(1,3) = gxzd gijd(2,1) = gxyd gijd(2,2) = gyyd gijd(2,3) = gyzd gijd(3,1) = gxzd gijd(3,2) = gyzd gijd(3,3) = gzzd call matrixinvert3D(gijd,giju,ierr) ! up (inverse) components gxxu = giju(1,1) gxyu = giju(1,2) gxzu = giju(1,3) gyyu = giju(2,2) gyzu = giju(2,3) gzzu = giju(3,3) trk = (gxxu * kxxd) + (2. * gxyu * kxyd) + (2. * gxzu * kxzd) + & & (gyyu * kyyd) + (2. * gyzu * kyzd) + (gzzu * kzzd) end subroutine calc_trK ! ! find location of metric and extrinsic curvature in columns ! subroutine find_metric(ncols,labelcol,igxx,igxy,igxz,igyy,igyz,igzz,ikxx,ikxy,ikxz,ikyy,ikyz,ikzz,& irho,ialp,ivel0,ivel1,ivel2,gotrho,gotalp) integer, intent(in) :: ncols character(len=*), intent(in) :: labelcol(ncols) integer, intent(out) :: igxx,igxy,igxz,igyy,igyz,igzz integer, intent(out) :: ikxx,ikxy,ikxz,ikyy,ikyz,ikzz integer, intent(out) :: irho,ialp,ivel0,ivel1,ivel2 integer :: i, idens logical, intent(out) :: gotrho, gotalp gotrho = .False.; gotalp = .False. igxx = 0; igxy = 0; igxz = 0; igyy = 0; igyz = 0; igzz = 0 ikxx = 0; ikxy = 0; ikxz = 0; ikyy = 0; ikyz = 0; ikzz = 0 irho = 0; ialp = 0; ivel0 = 0; ivel1 = 0; ivel2 = 0 do i=1,ncols select case(labelcol(i)) case('gxx') igxx = i case('gxy') igxy = i case('gxz') igxz = i case('gyy') igyy = i case('gyz') igyz = i case('gzz') igzz = i case('kxx') ikxx = i case('kxy') ikxy = i case('kxz') ikxz = i case('kyy') ikyy = i case('kyz') ikyz = i case('kzz') ikzz = i case('rho') irho = i gotrho = .True. case('dens') idens = i case('alp') ialp = i gotalp = .True. case('vel[0]') ivel0 = i case('vel[1]') ivel1 = i case('vel[2]') ivel2 = i end select enddo ! if we didn't find 'rho' in cols, use dens instead if (gotrho .eqv. .False.) irho = idens end subroutine find_metric subroutine compute_extra_columns(ncols,nextra,dat) integer, intent(in) :: ncols integer, intent(out) :: nextra real, intent(inout), optional :: dat(:,:) integer :: i,n,itrk integer :: igxx,igxy,igxz,igyy,igyz,igzz integer :: ikxx,ikxy,ikxz,ikyy,ikyz,ikzz integer :: irho,ialp,ivel0,ivel1,ivel2 logical :: gotrho,gotalp nextra = 0 call find_metric(ncols,blocklabel,igxx,igxy,igxz,igyy,igyz,igzz,ikxx,ikxy,ikxz,ikyy,ikyz,ikzz,& irho,ialp,ivel0,ivel1,ivel2,gotrho,gotalp) n = size(dat(:,1)) if (igxx > 0 .and. igxy > 0 .and. igxz > 0 .and. igyy > 0 .and. igyz > 0 .and. igzz > 0 .and. & ikxx > 0 .and. ikxy > 0 .and. ikxz > 0 .and. ikyy > 0 .and. ikyz > 0 .and. ikzz > 0) then itrk = ncols + 1 blocklabel(itrk) = 'tr K' nextra = 1 if (present(dat)) then !print*,' getting trk ',igxx,igxy,igxz,igyy,igyz,igzz,ikxx,ikxy,ikxz,ikyy,ikyz,ikzz,itrk do i=1,n call calc_trK(dat(i,igxx),dat(i,igxy),dat(i,igxz),dat(i,igyy),dat(i,igyz),dat(i,igzz),& dat(i,ikxx),dat(i,ikxy),dat(i,ikxy),dat(i,ikyy),dat(i,ikyz),dat(i,ikzz),dat(i,itrk)) enddo endif endif end subroutine compute_extra_columns end module cactushdf5read danieljprice-splash-4d1f09c/src/read_data_cactus_hdf5_utils.c000066400000000000000000000340011477365367100244170ustar00rootroot00000000000000/* * This subroutine performs the calls to the HDF5 library for the * CACTUS data read * * Easier to do it this way and link with c than to try to link against * the Fortran interface (in the latter case the modules must * have been compiled with the *exact* compiler used to compile splash * which is a real pain). * */ #include #include #include #include #include #define MAX_DATASETS 100000 static int debug = 0; static hid_t file_id; static const herr_t HDF5_error = -1; static int have_indexed = 0; #define LEN_NAME 64 typedef struct { char name[LEN_NAME]; } dataset_t; static dataset_t Dataset[MAX_DATASETS]; static int iter[MAX_DATASETS]; static int iorder[MAX_DATASETS]; int read_cactus_dataset(hid_t file_id,char *name,int *ncol,int *ncells,int *ndim,int *n,double *time,double *deltax,int inheader); int read_cactus_iteration(hid_t file_id,int iter,int *next,int *nsteps,int *ncells,int *ndim,int *ncol,double *time,double *deltax,int inheader,int ignoretl); int read_cactus_grid(hid_t dataset_id,hid_t dataspace_id,int ndim,int mycol,int *n,int nx,int ny,int nz,int nghost[3],double orig[3],double delta[3]); void get_ndim_ncells(hid_t dataspace_id, int *ndim, int *nx,int *ny,int *nz); void set_blocklabel_cactus(int *icol, char *name, int *lenname); void sort_cactus_data(int *n, int iarr[*n], int iorder[*n]); void read_cactus_hdf5_data_fromc(int *icol,int *ntot,int *np,double temparr[*np]); void read_cactus_itype_fromc(int *ntot,int *np,int itype[*np]); void open_cactus_hdf5_file(char *filename, int istep, int *ncells, int *ncol, int *nsteps, int *ndim, int *ndimV, double *time, int ignoretl, int *ierr) { *ierr = 0; *ndim = 0; *ndimV = 0; *ncol = 5; /* x,y,z,h,m */ have_indexed = 0; if (debug) printf("DEBUG: opening %s \n",filename); file_id = H5Fopen(filename,H5F_ACC_RDONLY,H5P_DEFAULT); if (file_id == HDF5_error) { printf("ERROR opening %s \n",filename); *ierr = 1; return; } /* * Open the first iteration and read the number of dimensions, * number of cells and number of variables in file */ int next; double dx; *ierr = read_cactus_iteration(file_id,istep,&next,nsteps,ncells,ndim,ncol,time,&dx,1,ignoretl); *ierr = 0; *ndimV = *ndim; return; } void close_cactus_hdf5_file(int *ierr) { if (debug) printf("DEBUG: closing file \n"); herr_t status = H5Fclose( file_id ); if (status == HDF5_error) { printf("ERROR closing file \n"); *ierr = 1; } return; } void read_cactus_hdf5_data(char *filename,int istep,int *npart,double *time,double *dx,int ignoretl,int *ierr) { int next,ncol,ndim,nstepsread,nsteps; if (file_id == HDF5_error) { printf("ERROR with file_id %s \n",filename); *ierr = 1; return; } ncol = 5; nstepsread = read_cactus_iteration(file_id,istep,&next,&nsteps,npart,&ndim,&ncol,time,dx,0,ignoretl); if (nstepsread <= 0) { *ierr = -1; } } /* * read one iteration from the file, corresponding to all datasets with same iteration numbers */ int read_cactus_iteration(hid_t file_id,int istep,int *next,int *nsteps,int *ncells,int *ndim,int *ncol,double *time,double *deltax,int inheader,int ignore_time_levels) { hsize_t ndatasets[1]; /* get number of datasets in file */ H5Gget_num_objs(file_id, ndatasets); int it,tl,level,cnum; /* loop over all datasets looking for dataset matching the desired iteration number set function value to true (1) if it is present */ int i,nsub,ierr; int mylen = LEN_NAME; char name[LEN_NAME]; char thorn[LEN_NAME],thornprev[LEN_NAME]; int nstepsgot = 0; *ndim = 0; *ncells = 0; int n_datasets = (int)ndatasets[0]; if (n_datasets > MAX_DATASETS) { if (inheader) printf("ERROR: EXCEEDED MAX NUMBER OF DATASETS: INCREASE MAX_DATASETS TO READ ALL\n"); n_datasets = MAX_DATASETS; } if (inheader) { have_indexed = 0; } if (!have_indexed) { printf("Indexing %i datasets in file\n",n_datasets); } i = 0; cnum = 0; *next = 0; *nsteps = 0; strcpy(thornprev,""); int n = 0; int mystep = 0; int iterprev = -1; int tlprev = 0; while (i < n_datasets) { /* get dataset name, either by reading from file or from memory buffer */ if (!have_indexed) { H5Gget_objname_by_idx(file_id, i, name, LEN_NAME); strcpy(Dataset[i].name,name); if (debug) printf("%s\n",name); } else { /* have indexed file */ strcpy(name,Dataset[iorder[i]-1].name); } /* extract iteration number and thorn name */ it = -1; if (sscanf(name, "%s it=%i tl=%i rl=%i c=%i", thorn, &it, &tl, &level, &cnum)>=4) { /* 4 because c= is optional */ if (debug) printf("%s it=%i tl=%i rl=%i cnum=%i \n",thorn,it,tl,level,cnum); if (!ignore_time_levels || tl ==0) { /* count how many unique datasets (columns) there are */ if (strcmp(thorn,thornprev) != 0 || tl != tlprev) { *ncol = *ncol + 1; if (inheader) printf("-> %s tl=%i\n",thorn,tl); /* send dataset name back to phantom */ if (inheader) set_blocklabel_cactus(ncol,thorn,&mylen); nsub = 0; n = 0; if (debug) printf(" GOT ncells = %i\n",*ncells); *ncells = 0; } strncpy(thornprev,thorn,LEN_NAME); tlprev = tl; } else { it = -1; } } else { it = -1; n = 0; if (debug) printf("UNKNOWN dataset %s \n",name); } /* store iteration numbers so we can sort datasets by iteration number */ if (inheader && !have_indexed) iter[i] = it; if (it >= 0) { if (it != iterprev) { mystep++; } if (mystep == istep) { nsub++; ierr = read_cactus_dataset(file_id,name,ncol,ncells,ndim,&n,time,deltax,inheader); } else if (mystep > istep && have_indexed) { break;; } iterprev = it; } else { n = 0; } i++; } have_indexed = 1; if (nsub > 0) { nstepsgot = 1; *nsteps = mystep; /*n_datasets/nsub;*/ } if (inheader) { if (mystep > 1) { sort_cactus_data(&n_datasets,iter,iorder); } else { /* do not sort if only one iteration in file */ for (i=0;i 0) { printf("bbox: x %i %i y %i %i z %i %i\n",bbox[0],bbox[1],bbox[2],bbox[3],bbox[4],bbox[5]); printf("iorigin: %i %i %i\n",iorigin[0],iorigin[1],iorigin[2]); printf("origin: %e %e %e\n",origin[0],origin[1],origin[2]); printf("delta: %e %e %e\n",delta[0],delta[1],delta[2]); printf("Time=%e Delta=%e %e %e nghost=%i %i %i \n",*time,delta[0],delta[1],delta[2], nghost[0],nghost[1],nghost[2]); } if (inheader==0) { /* read dataset */ read_cactus_grid(dataset_id,dataspace_id,*ndim,*ncol,n,nx,ny,nz,nghost,origin,delta); } /* close dataspace and dataset */ status = H5Sclose(dataspace_id); if (status == HDF5_error) { printf("ERROR closing dataspace \n"); } status = H5Dclose(dataset_id); if (status == HDF5_error) { printf("ERROR closing data set \n"); } return (int) status; } /* * utility function to get dimensionality of a dataset */ void get_ndim_ncells(hid_t dataspace_id, int *ndim, int *nx,int *ny,int *nz) { *nx = 1; *ny = 1; *nz = 1; *ndim = H5Sget_simple_extent_ndims(dataspace_id); hsize_t dims[*ndim], maxdims[*ndim]; H5Sget_simple_extent_dims(dataspace_id,dims,maxdims); /* get number of cells */ if (*ndim > 0) *nx = dims[0]; if (*ndim > 1) *ny = dims[1]; if (*ndim > 2) *nz = dims[2]; } int read_cactus_grid(hid_t dataset_id,hid_t dataspace_id,int ndim,int mycol,int *n,int nx,int ny,int nz, int nghost[3],double orig[3],double delta[3]) { hid_t memspace_id; herr_t status; int ierr = 0; int i,j,k; int ncells = nx*ny*nz; /* make a temporary array to put each column as we read it */ hsize_t nsize[3]; nsize[0] = nx; nsize[1] = ny; nsize[2] = nz; memspace_id = H5Screate_simple(ndim,nsize,NULL); double *dat = malloc(ncells * sizeof(double)); status = H5Dread(dataset_id,H5T_NATIVE_DOUBLE,memspace_id,dataspace_id,H5P_DEFAULT,dat); if (status == HDF5_error) { printf("ERROR reading dataset \n"); ierr = 4; } /* map to one dimensional arrays and determine x,y,z for each cell */ double xi,yi,zi; double dx = delta[0]; double dy = delta[1]; double dz = delta[2]; if (debug) { printf("PATCH origin = %f %f %f\n",orig[0],orig[1],orig[2]); printf(" nx=%i x=%f->%f\n",nx,orig[0],(orig[0]+(nx-1)*dx)); printf(" ny=%i y=%f->%f\n",ny,orig[1],(orig[1]+(ny-1)*dy)); printf(" nz=%i z=%f->%f\n",nz,orig[2],(orig[2]+(nz-1)*dz)); } int icol; *n = *n + ncells; if (mycol==6) { double *xx = malloc(ncells * sizeof(double)); double *yy = malloc(ncells * sizeof(double)); double *zz = malloc(ncells * sizeof(double)); int *itype = malloc(ncells * sizeof(int)); if (debug) printf("constructing grid dx=%f, dy=%f, dz=%f\n",dx,dy,dz); /* here we have to reconstruct the x, y and z positions of each cell. The following looks hacked but works. We tested it. */ int ip = 0; for (k=0;k nx-nghost[2]-1)) { isghostz = 1; } else { isghostz = 0; } for (j=0;j ny-nghost[1]-1)) { isghosty = 1; } else { isghosty = 0; } for (i=0;i nz-nghost[0]-1)) { isghostx = 1; } else { isghostx = 0; } if (isghostx || isghosty || isghostz) { itype[ip] = 2; } else { itype[ip] = 1; } ip++; } } } /* send additional data through to Fortran */ icol = 1; read_cactus_hdf5_data_fromc(&icol,n,&ncells,xx); icol = 2; read_cactus_hdf5_data_fromc(&icol,n,&ncells,yy); icol = 3; read_cactus_hdf5_data_fromc(&icol,n,&ncells,zz); /* zone type (regular or ghost) */ read_cactus_itype_fromc(n,&ncells,itype); free(xx); free(yy); free(zz); free(itype); } icol = mycol; read_cactus_hdf5_data_fromc(&icol,n,&ncells,dat); /* deallocate memory */ free(dat); return ierr; } danieljprice-splash-4d1f09c/src/read_data_dragon.f90000066400000000000000000000635471477365367100224560ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2011 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR OUTPUT FROM THE DRAGON CODE ! HANDLES BOTH ASCII AND BINARY FILES ! ! THE FOLLOWING ENVIRONMENT VARIABLES AFFECT THIS FORMAT: ! ! DSPLASH_EXTRACOLS : set to number of extra columns to read (after itype) ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Partial data read implemented means that columns with ! the 'required' flag set to false are not read (read is therefore much faster) !------------------------------------------------------------------------- module unit_constants integer, parameter :: DP = selected_real_kind(p=15) ! double precision ! Length units in metres real(kind=DP),parameter :: r_pc = 3.08568E16_DP ! parsec real(kind=DP),parameter :: r_au = 1.49597870E11_DP ! astronomical unit real(kind=DP),parameter :: r_sun = 6.96E8_DP ! solar radius real(kind=DP),parameter :: r_earth = 6.371E6_DP ! Earth radius ! Mass units in kilograms real(kind=DP),parameter :: m_sun = 1.98892E30_DP ! solar mass real(kind=DP),parameter :: m_jup = 1.8986E27_DP ! Jupiter mass real(kind=DP),parameter :: m_earth = 5.9736E24_DP ! Earth mass ! Time units in seconds real(kind=DP),parameter :: myr = 3.1556952E13_DP ! megayear real(kind=DP),parameter :: yr = 3.1556952E7_DP ! year real(kind=DP),parameter :: day = 8.64E4_DP ! day end module unit_constants module readdata_dragon implicit none public :: read_data_dragon, set_labels_dragon private contains subroutine read_data_dragon(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,iamtype,npartoftype,time,gamma,maxpart,maxcol,maxstep use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,required,ipartialread,ntypes use settings_units, only:unitzintegration, unit_interp use mem_allocation, only:alloc use labels, only:label,labeltype,labelzintegration use system_utils, only:ienvironment integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer, parameter :: iunit = 16 integer :: i,j,icol,ierr,iambinaryfile,itype integer :: ncolstep,npart_max,nstep_max,ntoti,nlastcol,nextracols logical :: iexist,reallocate,doubleprec character(len=11) :: fmt character(len=50) :: string integer :: nei_want,nei_min,nmax integer, dimension(:), allocatable :: iparttype integer, dimension(20) :: idata real, dimension(50) :: rdata real(doub_prec), dimension(50) :: rdatadb real :: timetemp,gammatemp,runit,massunit,sinksoft,sinkrad nstepsread = 0 if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(datfile)//': file not found ***' return endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 ncolstep = ndim + ndimV + 4 ! pos x 3, vel x 3, temp, h, rho, mass nlastcol = ncolstep nextracols = ienvironment('DSPLASH_EXTRACOLS',0) if (nextracols > 0 .and. nextracols <= 99) then print "(a,i2,a)",' ASSUMING ',nextracols,' EXTRA COLUMNS BEYOND ITYPE' ncolstep = ncolstep + nextracols else nextracols = 0 endif ncolumns = ncolstep call set_labels_dragon ! !--read data from snapshots ! j = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! ! !--determine whether file is binary or ascii, open it and read the header ! inquire(file=datfile,form=fmt) !print*,'fmt = ',fmt ! select case(trim(adjustl(fmt))) ! case('UNFORMATTED') ! iambinaryfile = 1 ! open(unit=iunit,file=datfile,status='old',form='unformatted',iostat=ierr) ! write (6,*) "Compiler identified as UNFORMATTED" ! case('FORMATTED') ! iambinaryfile = 0 ! open(unit=iunit,file=datfile,status='old',form='formatted',iostat=ierr) ! write (6,*) "Compiler identified as FORMATTED" ! case default !--if compiler cannot distinguish the two, try binary first, then ascii iambinaryfile = -1 open(unit=iunit,file=datfile,status='old',form='unformatted',iostat=ierr) ! end select if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(datfile)//' ***' return endif ! !--read the file header ! try binary format first, and if unsuccessful try ascii ! doubleprec = .true. if (iambinaryfile==1) then print "(a)",' reading binary dragon format ' call read_dragonheader_binary(iunit,ierr) elseif (iambinaryfile==0) then print "(a)",' reading ascii dragon format ' call read_dragonheader_ascii(iunit,ierr,iambinaryfile) else call read_dragonheader_binary(iunit,ierr) if (ierr==0) then !--if successful binary header read, file is doubleprec binary iambinaryfile = 1 print "(a)",' reading binary dragon format ' print "(a)",' Double precision file' else !--otherwise, close binary file, and assume file is single precision binary doubleprec = .false. close(unit=iunit) iambinaryfile = 1 open(unit=iunit,file=datfile,status='old',form='unformatted',iostat=ierr) call read_dragonheader_binary(iunit,ierr) if (ierr==0) then print "(a)",' reading binary dragon format ' print "(a)",' Single precision file' else print "(a)",' reading ascii dragon format ' iambinaryfile = 0 close(unit=iunit) open(unit=iunit,file=datfile,status='old',form='formatted',iostat=ierr) call read_dragonheader_ascii(iunit,ierr,iambinaryfile) if (ierr/=0) then print "(a)",' ERROR reading ascii file header: wrong endian binary? ' close (iunit) ndim = 0 ncolumns = 0 return endif endif endif endif ! !--get values of quantities from the header ! ntoti = idata(1) nmax = idata(3) nei_want = idata(10) nei_min = idata(12) !--check for errors in integer header (either from corrupt file or wrong endian) if (ntoti <= 0 .or. ntoti > 1.e10 .or. nmax < 0 & .or. nei_want < 0 .or. nei_want > 1e6 .or. nei_min < 0) then if (iambinaryfile==1) then print "(a)",' ERROR reading binary file header: wrong endian? ' else print "(a)",' ERROR reading ascii file header ' endif ndim = 0 ncolumns = 0 close(unit=iunit) return endif if (doubleprec) then timetemp = rdatadb(1) runit = rdatadb(21) massunit = rdatadb(22) gammatemp = rdatadb(26) sinksoft = rdatadb(27) sinkrad = rdatadb(38) else timetemp = rdata(1) runit = rdata(21) massunit = rdata(22) gammatemp = rdata(26) sinksoft = rdata(27) sinkrad = rdata(38) endif !--assume first that the file is single precision, check values are sensible, if not try double ! if (iambinaryfile==1) then ! if (timetemp < 0. .or. runit < 0. .or. massunit < 0. .or. gammatemp < 0. & ! .or. gammatemp > 6.) then ! print "(a)",' double precision file' ! doubleprec = .true. ! rewind(iunit) ! call read_dragonheader_binary(iunit,ierr) ! else ! print "(a)",' single precision file' ! endif ! endif print*,'time : ',timetemp print*,'gamma : ',gammatemp print*,'n_total : ',ntoti if (ierr /= 0) then if (iambinaryfile==1) then print "(a)",' ERROR reading real part of binary file header ' else print "(a)",' ERROR reading real part of ascii file header ' endif ndim = 0 ncolumns = 0 close(unit=iunit) return endif ! !--if successfully read header, increment the nstepsread counter ! nstepsread = nstepsread + 1 ! !-- now work out dimensionless weight unit and z integration unit ! call find_weights(unit_interp,unitzintegration,labelzintegration) ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntoti) else ! if first time, save on memory npart_max = int(ntoti) endif endif if (j >= maxstep .and. j /= 1) then nstep_max = j + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolstep+ncalc,maxcol),mixedtypes=.true.) endif ! !--copy header into header arrays ! npartoftype(:,j) = 0 npartoftype(1,j) = ntoti time(j) = timetemp gamma(j) = gammatemp ! !--read particle data ! if (ntoti > 0) then if (iambinaryfile==1) then call read_dragonbody_binary(iunit,ierr) else call read_dragonbody_ascii(iunit,ierr) endif else ntoti = 0 npartoftype(1,i) = 0 dat(:,:,i) = 0. endif if (allocated(iamtype)) then !--relabel particle types call set_types(iamtype(:,j),ntoti,npartoftype(:,j)) endif if (any(npartoftype(2:,j) /= 0)) then do itype=1,ntypes if (npartoftype(itype,j) > 0) then string = ' ' write(string,"(a)") 'n_'//trim(labeltype(itype)) write(string(18:len(string)),"(a)") ':' print*,trim(string),' ',npartoftype(itype,j) endif enddo endif ! !--set flag to indicate that only part of this file has been read ! if (.not.all(required(1:ncolstep))) ipartialread = .true. ! !--close data file and return ! if (allocated(iparttype)) deallocate(iparttype) close(unit=iunit) return contains !---------------------------------------------------- ! binary header read !---------------------------------------------------- subroutine read_dragonheader_binary(iunitb,ierr) integer, intent(in) :: iunitb integer, intent(out) :: ierr read(iunitb,end=55,iostat=ierr) idata if (doubleprec) then read(iunitb,end=55,iostat=ierr) rdatadb else read(iunitb,end=55,iostat=ierr) rdata endif return 55 continue !print "(a)",' ERROR: end of file in binary header read' ierr = -1 return end subroutine read_dragonheader_binary !---------------------------------------------------- ! ascii header read !---------------------------------------------------- subroutine read_dragonheader_ascii(iunita,ierr,iwarn) integer, intent(in) :: iunita,iwarn integer, intent(out) :: ierr do i=1,size(idata) read(iunita,*,end=55,iostat=ierr) idata(i) enddo do i=1,size(rdata) read(iunita,*,end=55,iostat=ierr) rdata(i) enddo doubleprec = .false. return 55 continue if (iwarn >= 0) print "(a)",' ERROR: end of file in binary header read' ierr = -1 return end subroutine read_dragonheader_ascii !---------------------------------------------------- ! binary body read !---------------------------------------------------- subroutine read_dragonbody_binary(iunitb,ierr) integer, intent(in) :: iunitb integer, intent(out) :: ierr real(doub_prec), dimension(:,:), allocatable :: dummyx real(doub_prec), dimension(:), allocatable :: dummy integer, dimension(:), allocatable :: idumtype integer :: icol if (doubleprec .and. any(required(1:ndim+ndimV))) then allocate(dummyx(3,ntoti),stat=ierr) if (ierr /= 0) then print *,' ERROR allocating memory' goto 56 endif endif !--positions if (any(required(1:ndim))) then if (doubleprec) then read(iunitb,end=55,iostat=ierr) dummyx(1:ndim,1:ntoti) do i=1,ntoti dat(i,1:ndim,j) = real(dummyx(1:ndim,i)) enddo else read(iunitb,end=55,iostat=ierr) (dat(i,1:ndim,j),i=1,ntoti) endif if (ierr /= 0) print*,' WARNING: errors reading positions ' else read(iunitb,end=55,iostat=ierr) if (ierr /= 0) print*,' WARNING: error skipping positions ' endif !--velocities if (any(required(ndim+1:ndim+ndimV))) then if (doubleprec) then read(iunitb,end=55,iostat=ierr) dummyx(1:ndimV,1:ntoti) do i=1,ntoti dat(i,ndim+1:ndim+ndimV,j) = real(dummyx(1:ndimV,i)) enddo else read(iunitb,end=55,iostat=ierr) (dat(i,ndim+1:ndim+ndimV,j),i=1,ntoti) endif if (ierr /= 0) print*,' WARNING: errors reading velocities ' else read(iunitb,end=55,iostat=ierr) if (ierr /= 0) print*,' WARNING: error skipping velocities ' endif if (doubleprec .and. any(required(ndim+ndimV+1:ncolstep))) then allocate(dummy(ntoti),stat=ierr) if (ierr /= 0) then print*,' ERROR allocating memory' goto 56 endif endif !--the rest do icol = ndim+ndimV+1,nlastcol if (required(icol)) then if (doubleprec) then read(iunitb,end=55,iostat=ierr) dummy(1:ntoti) dat(1:ntoti,icol,j) = real(dummy(1:ntoti)) else read(iunitb,end=55,iostat=ierr) dat(1:ntoti,icol,j) endif if (ierr /= 0) print*,' WARNING: errors reading '//trim(label(icol)) else read(iunitb,end=55,iostat=ierr) if (ierr /= 0) print*,' WARNING: error skipping '//trim(label(icol)) endif enddo if (size(iamtype(:,j)) > 1) then allocate(idumtype(ntoti),stat=ierr) if (ierr /= 0) then print*,'error reading type, assuming all gas' iamtype(1:ntoti,j) = 1 else read(iunitb,end=55,iostat=ierr) idumtype(1:ntoti) iamtype(1:ntoti,j) = idumtype(1:ntoti) endif deallocate(idumtype) if (ierr /= 0) print*,' WARNING: error reading itype' endif !--extra columns beyond itype do icol = nlastcol+1,nlastcol+nextracols if (required(icol)) then if (doubleprec) then read(iunitb,end=55,iostat=ierr) dummy(1:ntoti) dat(1:ntoti,icol,j) = real(dummy(1:ntoti)) else read(iunitb,end=55,iostat=ierr) dat(1:ntoti,icol,j) endif if (ierr /= 0) print*,' WARNING: errors reading '//trim(label(icol)) else read(iunitb,end=55,iostat=ierr) if (ierr /= 0) print*,' WARNING: error skipping '//trim(label(icol)) endif enddo if (allocated(dummyx)) deallocate(dummyx) if (allocated(dummy)) deallocate(dummy) return 55 continue print "(a)",' ERROR: end of file in binary read' 56 continue ierr = -1 if (allocated(dummyx)) deallocate(dummyx) if (allocated(dummy)) deallocate(dummy) return end subroutine read_dragonbody_binary !---------------------------------------------------- ! ascii body read !---------------------------------------------------- subroutine read_dragonbody_ascii(iunita,ierr) integer, intent(in) :: iunita integer, intent(out) :: ierr integer :: nerr,idumtype !--positions nerr = 0 do i=1,ntoti read(iunita,*,end=55,iostat=ierr) dat(i,1:ndim,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print*,' WARNING: ',nerr,' errors reading positions ' !--velocities nerr = 0 do i=1,ntoti read(iunita,*,end=55,iostat=ierr) dat(i,ndim+1:ndim+ndimV,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print*,' WARNING: ',nerr,' errors reading velocities ' !--the rest if (any(required(ndim+ndimV+1:nlastcol))) then do icol = ndim+ndimV+1,nlastcol nerr = 0 do i=1,ntoti read(iunita,*,end=55,iostat=ierr) dat(i,icol,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print*,' WARNING: ',nerr,' errors reading '//trim(label(icol)) enddo endif !--particle type if (size(iamtype(:,j)) > 1) then nerr = 0 do i=1,ntoti read(iunita,*,end=55,iostat=ierr) idumtype iamtype(i,j) = idumtype if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print*,' WARNING: ',nerr,' errors reading itype' endif !--the rest if (any(required(nlastcol+1:nlastcol+nextracols))) then do icol = nlastcol+1,nlastcol+nextracols nerr = 0 do i=1,ntoti read(iunita,*,end=55,iostat=ierr) dat(i,icol,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print*,' WARNING: ',nerr,' errors reading '//trim(label(icol)) enddo endif return 55 continue print "(a)",' ERROR: end of file in ascii read' ierr = -1 return end subroutine read_dragonbody_ascii !---------------------------------------------------- ! translate types into order (for old dragon read) !---------------------------------------------------- subroutine set_types(itypei,ntotal,noftype) integer(kind=int1), dimension(:), intent(inout) :: itypei integer, intent(in) :: ntotal integer, dimension(:), intent(out) :: noftype integer :: ngas,nsink,nbnd,ncloud,nsplit,nunknown,nstar !--types ! 1 gas ! -1 sink ! -2 star ! 6 boundary (fixed) ! 9 intercloud (hydro only) ! 4 split particle (obsolete?) ! !--we translate these into ! 1 gas ! 2 boundary ! 3 sink ! 4 intercloud ! 5 split ! 6 unknown / the rest ! 7 star ! ngas = 0 nsink = 0 nbnd = 0 ncloud = 0 nsplit = 0 nunknown = 0 nstar = 0 do i=1,ntotal select case(itypei(i)) case(1) ngas = ngas + 1 itypei(i) = 1 case(-1) nsink = nsink + 1 itypei(i) = 3 case(6) nbnd = nbnd + 1 itypei(i) = 2 case(9) ncloud = ncloud + 1 itypei(i) = 4 case(4) nsplit = nsplit + 1 itypei(i) = 5 case(-2) nstar = nstar + 1 itypei(i) = 6 case default nunknown = nunknown + 1 ! itypei(i) = 6 write (6,*) "Unknown particle type ", itypei(i), "!!" stop end select enddo noftype(1) = ngas noftype(2) = nbnd noftype(3) = nsink noftype(4) = ncloud noftype(5) = nsplit noftype(6) = nstar if (sum(noftype(1:6)) /= ntotal) then print "(a)",' INTERNAL ERROR setting number in each type in dragon read' endif return end subroutine set_types end subroutine read_data_dragon !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_dragon use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass,ih,irho use params use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_dragon ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_dragon ***' return endif do i=1,ndim ix(i) = i enddo ivx = ndim+1 label(ivx+ndimV) = 'temperature' ih = ivx + ndimV + 1 irho = ih + 1 ! location of rho in data array ipmass = irho + 1 ! !--set labels of the quantities read in ! label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = 'density' !label(iutherm) = 'u' label(ipmass) = 'particle mass' label(ih) = 'h' ! !--set labels for vector quantities ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//labelcoord(i,1) enddo !--set labels for each particle type ! ntypes = 6 labeltype(1) = 'gas' labeltype(2) = 'boundary' labeltype(3) = 'sink' labeltype(4) = 'cloud' labeltype(5) = 'split' labeltype(6) = 'star' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .true. UseTypeInRenderings(3) = .false. UseTypeInRenderings(4) = .true. UseTypeInRenderings(5) = .true. UseTypeInRenderings(6) = .false. !----------------------------------------------------------- return end subroutine set_labels_dragon subroutine find_weights(out_unit_interp,out_unitzintegration,out_labelzintegration) use labels, only:ipmass,ih,irho use params use settings_data, only:ndim use unit_constants use system_utils, only:get_environment_or_flag real(doub_prec), intent(out) :: out_unit_interp real, intent(out) :: out_unitzintegration character(len=20), intent(out) :: out_labelzintegration real(doub_prec) :: dm_unit, dh_unit, drho_unit, dr_unit logical :: do_dimweight, do_zintegration character(len=20) :: rho_length_label real(doub_prec) :: rho_length character(len=20) :: r_unit ! length unit character(len=20) :: m_unit ! mass unit character(len=20) :: rho_unit ! density unit character(len=20) :: h_unit ! smoothing length unit call get_environment_or_flag("DRAGON_RUNIT",r_unit) call get_environment_or_flag("DRAGON_MUNIT",m_unit) call get_environment_or_flag("DRAGON_RHOUNIT",rho_unit) call get_environment_or_flag("DRAGON_HUNIT",H_unit) out_unit_interp = 1.0 out_unitzintegration = 1.0 out_labelzintegration = "" do_dimweight = .TRUE. do_zintegration = .TRUE. ! Length unit in S.I. units (m) if (r_unit=="") then print*,'No positions or no position units!' print*,'Set environment variable DRAGON_R_UNIT to:' print*,' pc, au, r_sun, r_earth, km, m, cm or 1 (dimensionless)' do_zintegration = .FALSE. dr_unit = 1._DP elseif (r_unit=="pc") then dr_unit = r_pc elseif (r_unit=="au") then dr_unit = r_au elseif (r_unit=="r_sun") then dr_unit = r_sun elseif (r_unit=="r_earth") then dr_unit = r_earth elseif (r_unit=="km") then dr_unit = 1000.0_DP elseif (r_unit=="m") then dr_unit = 1.0_DP elseif (r_unit=="cm") then dr_unit = 0.01_DP elseif (r_unit=="1") then dr_unit = 1._DP else print*,'Unknown position unit ', r_unit, '!' do_zintegration = .FALSE. dr_unit = 1._DP endif ! Length unit in S.I. units (m) if (h_unit=="") then print*,'No smoothing lengths or no smoothing length units!' print*,'Set environment variable DRAGON_H_UNIT to: ' print*,' pc, au, r_sun, r_earth, km, m, cm or 1 (dimensionless)' do_dimweight = .FALSE. dh_unit = 1._DP elseif (h_unit=="pc") then dh_unit = r_pc elseif (h_unit=="au") then dh_unit = r_au elseif (h_unit=="r_sun") then dh_unit = r_sun elseif (h_unit=="r_earth") then dh_unit = r_earth elseif (h_unit=="km") then dh_unit = 1000.0_DP elseif (h_unit=="m") then dh_unit = 1.0_DP elseif (h_unit=="cm") then dh_unit = 0.01_DP elseif (h_unit=="1") then dh_unit = 1._DP else print*,'Unknown smoothing length unit ', h_unit, '!' do_dimweight = .FALSE. dh_unit = 1._DP endif ! Mass units in S.I. units (kg) if (m_unit=="") then print*,'No masses or no mass units!' print*,'Set environment variable DRAGON_M_UNIT to:' print*,' m_sun, m_jup, m_earth, kg, g or 1 (dimensionless)' do_dimweight = .FALSE. dm_unit = 1._DP elseif (m_unit=="m_sun") then dm_unit = m_sun elseif (m_unit=="m_jup") then dm_unit = m_jup elseif (m_unit=="m_earth") then dm_unit = m_earth elseif (m_unit=="kg") then dm_unit = 1._DP elseif (m_unit=="g") then dm_unit = 1.0E-3_DP elseif (m_unit=="1") then dm_unit = 1._DP else print*,'Unknown mass unit ', m_unit, '!' do_dimweight = .FALSE. dm_unit = 1._DP endif ! Density units in S.I. units (i.e. kg/m^3) if (rho_unit=="") then print*,'No densities or no density units!' print*,'Set environment variable DRAGON_RHO_UNIT to:' if (ndim==3) print*,' m_sun_pc3, kg_m3, g_cm3 or 1 (dimensionless)' if (ndim==2) print*,' m_sun_pc2, kg_m2, g_cm2 or 1 (dimensionless)' if (ndim==1) print*,' 1 (dimensionless)' do_dimweight = .FALSE. do_zintegration = .FALSE. rho_length = 1._DP elseif (rho_unit=="m_sun_pc3") then drho_unit = m_sun / (r_pc**3) rho_length = r_pc rho_length_label = "pc" elseif (rho_unit=="m_sun_pc2") then drho_unit = m_sun / (r_pc**2) rho_length = r_pc rho_length_label = "pc" elseif (rho_unit=="kg_m3") then drho_unit = 1.0_DP rho_length = 1.0_DP rho_length_label = "m" elseif (rho_unit=="kg_m2") then drho_unit = 1.0_DP rho_length = 1.0_DP rho_length_label = "m" elseif (rho_unit=="g_cm3") then drho_unit = 1.0E3_DP rho_length = 0.01_DP rho_length_label = "cm" elseif (rho_unit=="g_cm2") then drho_unit = 10.0_DP rho_length = 0.01_DP rho_length_label = "cm" elseif (rho_unit=="1") then drho_unit = 1._DP rho_length = 1._DP rho_length_label = "" else print*,'Unknown density unit ', rho_unit, '!' do_dimweight = .FALSE. do_zintegration = .FALSE. rho_length = 1._DP endif if (do_dimweight) then out_unit_interp = dm_unit/(drho_unit*dh_unit**ndim) else print*,'Cannot create dimensionless weight' print*,'(unnormalised rendered plots may be incorrect)' endif if (do_zintegration) then out_unitzintegration = dr_unit / rho_length out_labelzintegration = rho_length_label else print*,'Cannot set unitzintegration' print*,'(column density plots may be incorrect)' endif return end subroutine find_weights end module readdata_dragon danieljprice-splash-4d1f09c/src/read_data_egaburov.f90000066400000000000000000000232611477365367100230030ustar00rootroot00000000000000!------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR OUTPUT FROM THE GADGET CODE ! ! NOTE THAT THIS ONLY "OFFICIALLY" WORKS WITH THE PARALLEL CODE AS WE ! REQUIRE KNOWLEDGE OF THE PARTICLE SMOOTHING LENGTHS ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! ENVIRONMENT VARIABLES: ! ! GSPLASH_USE_Z if 'YES' uses redshift in the legend instead of time ! GSPLASH_DARKMATTER_HSOFT if given a value > 0.0 will assign a ! smoothing length to dark matter particles which can then be ! used in the rendering ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Partial data read implemented Nov 2006 means that columns with ! the 'required' flag set to false are not read (read is therefore much faster) !------------------------------------------------------------------------- module readdata_egaburov implicit none public :: read_data_egaburov, set_labels_egaburov private contains subroutine read_data_egaburov(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,time,gamma,maxpart,maxcol,maxstep use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,iformat,required,ipartialread use mem_allocation, only:alloc use labels, only:ih,irho use system_utils, only:renvironment,lenvironment integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,j,ierr integer :: ncolstep,npart_max,nstep_max logical :: iexist,reallocate integer :: proc, nread integer :: myproc, nproc, npx, npy, npz; integer :: global_n, local_n, ndim_data real(sing_prec) :: t_global, dt_global integer :: iteration real(sing_prec) :: cfl_no, gamma_gas integer :: periodic_flag real(sing_prec) :: xmin, ymin, zmin, xmax, ymax, zmax integer :: idx real(sing_prec) :: posx, posy, posz, pvelx, pvely, pvelz real(sing_prec) :: dens, ethm, pres, pmag, vabs real(sing_prec) :: velx, vely, velz, Bx, By, Bz real(sing_prec) :: hsml, wght, Bpsi, divB, v1, v2, v3, v4 !!!!!!!!!!!!!!!!!! nstepsread = 0 npart_max = maxpart if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(datfile)//': file not found ***' stop endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 ! !--read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! open(11,iostat=ierr,file=datfile,status='old', form='unformatted') if (ierr /= 0) then print "(a)", '*** ERROR OPENING FILE ***' stop endif ! !--read header for this timestep ! read(11, iostat=ierr) myproc, nproc, npx, npy, npz, & global_n, local_n, ndim_data, t_global, dt_global, iteration, & cfl_no, gamma_gas, periodic_flag, & xmin, ymin, zmin, xmax, ymax, zmax print *, global_n print *, local_n print *, nproc if (ierr /= 0) then print "(a)", '*** ERROR READING TIMESTEP HEADER ***' stop endif ! t_global = t_global - 0.13 iformat = 0 ncolstep = 30 ncolumns = ncolstep print*,'nproc : ',nproc print*,'npx, npy, npz : ',npx, npy, npz print*,'time : ',t_global print*,'gamma_gas : ',gamma_gas print*,'N_total : ',global_n print*,'N data columns : ',ncolstep ! !--if successfully read header, increment the nstepsread counter ! nstepsread = nstepsread + 1 ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (global_n > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*global_n) else ! if first time, save on memory npart_max = int(global_n) endif endif if (i >= maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolstep+ncalc,maxcol)) endif npartoftype(:,i) = 0 npartoftype(1,i) = global_n !--use this line for code time time(i) = real(t_global) ! !--read particle data ! nread = 0 do proc = 1, nproc do j = 1, local_n read(11, iostat=ierr) & idx, & posx, posy, posz, pvelx, pvely, pvelz, & dens, ethm, pres, pmag, vabs, & velx, vely, velz, Bx, By, Bz, & hsml, wght, Bpsi, divB, & v1, v2, v3, v4 ! if (pres > 10) then ! print *, posx, posy, posz ! endif if (ierr /= 0) then print *, '*** ERROR READING PARTICLE', i, 'PROC:', myproc stop endif dat(j + nread, 1, i) = posx dat(j + nread, 2, i) = posy dat(j + nread, 3, i) = posz dat(j + nread, 4, i) = velx dat(j + nread, 5, i) = vely dat(j + nread, 6, i) = velz dat(j + nread, 7, i) = dens dat(j + nread, 8, i) = pres dat(j + nread, 9, i) = pmag dat(j + nread, 10, i) = vabs dat(j + nread, 11, i) = Bx dat(j + nread, 12, i) = By dat(j + nread, 13, i) = Bz if (pmag > 0) then dat(j + nread, 14, i) = abs(divB/sqrt(pmag*2.0)) else dat(j + nread, 14, i) = 0.0; end if dat(j + nread, 15, i) = Bpsi dat(j + nread, 16, i) = hsml*2 dat(j + nread, 17, i) = wght dat(j + nread, 18, i) = pvelx dat(j + nread, 19, i) = pvely dat(j + nread, 20, i) = pvelz dat(j + nread, 21, i) = abs(divB) dat(j + nread, 22, i) = dens*wght dat(j + nread, 23, i) = pres/dens/(gamma_gas - 1.0) ! uthermal dat(j + nread, 24, i) = sqrt(pmag*2.0) dat(j + nread, 25, i) = pres + pmag dat(j + nread, 26, i) = v1; dat(j + nread, 27, i) = v2; dat(j + nread, 28, i) = v3; dat(j + nread, 29, i) = v4; dat(j + nread, 30, i) = idx; enddo nread = nread + local_n; if (proc < nproc) then read(11, iostat=ierr) myproc, nproc, npx, npy, npz, & global_n, local_n, ndim_data, t_global, dt_global, iteration, & cfl_no, gamma_gas, periodic_flag, & xmin, ymin, zmin, xmax, ymax, zmax if (ierr /= 0) then print *, '*** ERROR READING TIMESTEP HEADER ***, proc=', proc stop endif endif enddo if (nread /= global_n) then print *, 'nread= ', nread print *, 'global_n= ', global_n print "(a)", ' *** SOMETHING WENT WRONG ***' stop endif !!!!!!!!!!!!!!!!!!!!! gamma = gamma_gas irho = 7 ih = 16 ! !--set flag to indicate that only part of this file has been read ! if (.not.all(required(1:ncolstep))) ipartialread = .true. ! !--close data file and return ! close(unit=11) if (nstepsread > 0) then print*,'>> last step ntot =',sum(npartoftype(:,istepstart+nstepsread-1)) endif return end subroutine read_data_egaburov !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_egaburov use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass,ih,irho,ipr,iutherm, idivb, iBfirst use params use settings_data, only:ndim,ndimV,ncolumns,ntypes,UseTypeInRenderings use geometry, only:labelcoord use system_utils, only:renvironment integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_egaburov ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_egaburov ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 irho = 7 iutherm = 23 ipr = 8 ih = 16 iBfirst = 11 ipmass = 22 idivb = 14 label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = 'density' label(iutherm) = 'cs' label(ih) = 'h' label(ipmass) = 'particle mass' label(ipr) = 'pressure' label(9) = 'Pmag' label(10) = 'vabs' label(15) = "\gpsi" label(18) = 'pvelx' label(19) = 'pvely' label(20) = 'pvelz' label(11) = 'Bx' label(12) = 'By' label(13) = 'Bz' label(14) = 'divB' label(24) = '|B|' label(25) = 'Ptot' label(26) = 'scal0' label(27) = 'scal1' label(28) = 'scal2' label(29) = 'scal3' label(30) = 'idx' ! !--set labels for vector quantities ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//labelcoord(i,1) enddo !--mag field if (iBfirst > 0) then iamvec(iBfirst:iBfirst+ndimV-1) = iBfirst labelvec(iBfirst:iBfirst+ndimV-1) = 'B' do i=1,ndimV label(iBfirst+i-1) = trim(labelvec(iBfirst))//'\d'//labelcoord(i,1) enddo endif ! !--set labels for each particle type ! ntypes = 1 labeltype(1) = 'gas' UseTypeInRenderings(1) = .true. return end subroutine set_labels_egaburov end module readdata_egaburov danieljprice-splash-4d1f09c/src/read_data_falcON_hdf5.f90000066400000000000000000000377451477365367100232550ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2015 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR HDF5 OUTPUT FROM W. DEHNEN'S FALCON CODE ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Columns with the 'required' flag set to false are not read !------------------------------------------------------------------------- ! ! The module below contains interface routines to c functions ! that perform the actual calls to the HDF5 libs ! !------------------------------------------------------------------------- module falcONhdf5read use params, only:maxplot,doub_prec use labels, only:lenlabel use, intrinsic :: iso_c_binding, only:c_int,c_double,c_char implicit none character(len=lenlabel), dimension(maxplot) :: blocklabel integer, parameter :: maxtypes = 6 integer :: i_current_step interface ! opens a falcON HDF5 snapshot file subroutine open_falcON_file(filename,ierr) bind(c,name="open_falcON_file") import character(c_char), intent(in) :: filename(*) integer(c_int), intent(out) :: ierr end subroutine open_falcON_file ! queries whether a file is open function falcON_file_is_open() bind(c,name="falcON_file_is_open") import integer(c_int) :: falcON_file_is_open end function falcON_file_is_open ! closes the currently open (if any) falcON HDF5 snapshot file. subroutine close_falcON_file() bind(c,name="close_falcON_file") ! no arguments end subroutine close_falcON_file ! queries if there is another snapshot present the currently open file function num_falcON_snapshots(ierr) bind(c,name="num_falcON_snapshots") import integer(c_int) :: num_falcON_snapshots integer(c_int), intent(out) :: ierr end function num_falcON_snapshots ! set falcON debugging level subroutine set_falcON_debugging_level(level) bind(c,name="set_falcON_debugging_level") import integer(c_int), intent(in) :: level end subroutine set_falcON_debugging_level ! read falcON header subroutine open_falcON_snapshot(ntype,npart,ncol,dimX,dimV,time,hper,ierr) & bind(c,name="open_falcON_snapshot") import integer(c_int), intent(out) :: ntype,ncol,dimX,dimV,ierr integer(c_int), intent(out) :: npart(*) real(c_double), intent(out) :: time,hper(3) end subroutine open_falcON_snapshot ! read falcON data subroutine read_falcON_snapshot(ierr) bind(c,name="read_falcON_snapshot") import integer(c_int), intent(out) :: ierr end subroutine read_falcON_snapshot end interface contains ! map types from falcON to splash integer function itypemap_falcON(itype) integer, intent(in) :: itype select case(itype) case(1) ! sinks itypemap_falcON = 2 case(2) ! gas itypemap_falcON = 1 case(3:4) itypemap_falcON = itype case(5:maxtypes) itypemap_falcON = itype+1 case default itypemap_falcON = 5 ! unknown end select end function itypemap_falcON ! get starting position in particle array integer function ioffset(itype,npartoftype) integer, intent(in) :: itype integer, intent(in) :: npartoftype(:) integer :: i ioffset = 0 do i=1,size(npartoftype) if (i < itype) ioffset = ioffset + npartoftype(i) enddo end function ioffset end module falcONhdf5read !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- module readdata_falcON_hdf5 implicit none public :: read_data_falcON_hdf5, set_labels_falcON_hdf5 private contains subroutine read_data_falcON_hdf5(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,maxpart,maxcol use params, only:doub_prec,maxparttypes !,maxplot use settings_data, only:ndim,ndimV,ncolumns,ncalc,ipartialread, & ntypes,debugmode,iverbose,buffer_steps_in_file use mem_allocation, only:alloc use labels, only:print_types,labeltype use system_utils, only:lenvironment use asciiutils, only:cstring use dataread_utils, only:check_range use falcONhdf5read integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,j,ierr,ierror(8),istep,nsteps_to_read integer :: ncolstep,npart_max,nstep_max,ntoti,ntotall integer :: npartoftypei(maxparttypes) logical :: iexist,reallocate,debug,goterrors real(doub_prec) :: timetemp,hperiodic(3) !integer, dimension(maxplot) :: isrequired nstepsread = 0 goterrors = .false. if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! if (iverbose==1 .and. ipos==1) print "(1x,a)",'reading FalcON hdf5 format' inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--append .h5 on the endif not already present ! datfile=trim(rootname)//'.h5' inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif endif ! ! set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 debug = (debugmode .or. lenvironment('FSPLASH_DEBUG')) ! ! read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! ! open file and read header information ! if (debug) print*,'DEBUG: reading header...' call open_falcON_file(cstring(datfile),ierr) if (ierr /= 0) then print "(a)", '*** ERROR OPENING FALCON FILE ***' return endif if (falcON_file_is_open() /= 1) then print "(a)", '*** ERROR: falcON_file_is_open /= 1 after opening ***' return endif if (debug) call set_falcON_debugging_level(3); nstep_max = num_falcON_snapshots(ierr); if (debug) print*,'got ',nstep_max,' falcON snapshots in file' if (nstep_max <= 0) then print "(a)",'*** ERROR: no falcON snapshots found in file ***' return endif ntotall = 0 if (buffer_steps_in_file) then nsteps_to_read = nstep_max else nsteps_to_read = 1 endif i = istepstart over_snapshots: do istep=1,nstep_max ! ! read falcON header ! if (debug) print*,'DEBUG: opening snapshot ',i npartoftypei(:) = 0 call open_falcON_snapshot(ntypes, npartoftypei, & ncolstep, ndim, ndimV, timetemp, & hperiodic, ierr) ! ! error checking on header info ! ierror(:) = 0 call check_range(ntypes,'ntypes',min=1,err=ierror(1)) call check_range(npartoftypei(1:ntypes),'npartoftype',min=0,err=ierror(2)) call check_range(sum(npartoftypei(1:ntypes)),'ntot',min=1,err=ierror(3)) call check_range(ndim,'ndim',min=1,max=3,err=ierror(4)) call check_range(ndimV,'ndimV',min=ndim,max=3,err=ierror(5)) call check_range(timetemp,'time',min=0.d0,err=ierror(6)) call check_range(ierr,'error during header read',min=0,max=0,err=ierror(7)) if (any(ierror(1:7) > 0)) then print*,'*** ERROR during falcON header read ***' return endif ncolumns = ncolstep ntoti = sum(npartoftypei(1:ntypes)) ntotall = max(ntoti,ntotall) ! ! print header information ! if (iverbose >= 1 .and. buffer_steps_in_file .or. istep==ipos) then !print "(2(a,1x,i10))",' npart: ',ntoti,' ncolumns: ',ncolstep !print "(a,i2)",' ntypes: ',ntypes,' !print*,' npartoftype = ',(npartoftypei(itypemap_falcON(j)),j=1,ntypes) !print*,' ncolstep = ',ncolstep,' ndim = ',ndim,ndimV print*,' time = ',timetemp !,' hper = ',hperiodic(:) endif ! ! now read data ! reallocate = .false. npart_max = maxpart if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntotall) else ! if first time, save on memory npart_max = int(ntoti) endif endif ! ! reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nsteps_to_read,max(ncolumns+ncalc,maxcol)) endif ! ! copy header data into allocated arrays ! if (buffer_steps_in_file .or. istep==ipos) then do j=1,ntypes npartoftype(itypemap_falcON(j),i) = npartoftypei(j) enddo time(i) = real(timetemp) masstype(:,i) = 0. ! all masses read from file endif ! ! read particle data ! got_particles: if (ntoti > 0) then !isrequired(:) = 0 !where (required(1:ncolumns)) isrequired(1:ncolumns) = 1 if (buffer_steps_in_file .or. istep==ipos) then i_current_step = i call read_falcON_snapshot(ierr); if (ierr /= 0) then print "(/,1x,a,/)",' *** ERROR reading falcON snapshot ***' print*,'Press any key to continue (but there is likely something wrong with the file...)' read* endif call print_types(npartoftype(:,i),labeltype) i = i + 1 endif nstepsread = nstepsread + 1 else ! ! cover the special case where no particles have been read ! npartoftype(1,i) = 1 dat(:,:,i) = 0. endif got_particles enddo over_snapshots ! ! now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ! ! set flag to indicate that only part of this file has been read ! ipartialread = .false. !if (.not.all(required(1:ncolstep))) ipartialread = .true. ! ! call set labels to identify location of smoothing length ! call set_labels_falcON_hdf5 !if (nstepsread > 0) then ! print "(a,i10,a)",' >> read ',sum(npartoftype(:,i)),' particles' !endif call close_falcON_file() return end subroutine read_data_falcON_hdf5 subroutine read_falcON_data_into_splash(icol,npartoftypei,temparr,itypec) bind(c,name="read_falcON_data_into_splash") use, intrinsic :: iso_c_binding, only:c_int,c_double use particle_data, only:dat,iamtype,npartoftype use settings_data, only:debugmode use labels, only:label use falcONhdf5read, only:itypemap_falcON,ioffset,i_current_step integer(kind=c_int), intent(in) :: icol,npartoftypei,itypec real(kind=c_double), intent(in) :: temparr(*) integer(kind=c_int) :: icolput integer :: istart,iend,nmax,itype,i itype = itypec + 1 ! convert from c to Fortran indexing icolput = icol + 1 if (debugmode) print "(3(a,i2),a,i8)",'DEBUG: Step ',i_current_step,' column ',icol,& ' type ',itypemap_falcON(itype),' -> '//trim(label(icolput)) ! check column is within array limits if (icolput > size(dat(1,:,1)) .or. icolput==0) then print "(a,i2,a)",' ERROR: column = ',icolput,' out of range in receive_data_fromc' return endif ! ensure no array overflows istart = ioffset(itypemap_falcON(itype),npartoftype(:,i_current_step)) + 1 iend = min(istart + npartoftypei - 1,size(dat(:,1,1))) nmax = iend - istart + 1 ! copy data into main splash array if (debugmode) print*,'DEBUG: COPYING TO ',istart,iend,' total = ',1,nmax ! this should never happen if (i_current_step < 1 .or. i_current_step > size(dat(1,1,:))) then print*,'INTERNAL ERROR in indexing during falcON read' return endif dat(istart:iend,icolput,i_current_step) = real(temparr(1:nmax),kind=kind(dat)) ! set particle type if (size(iamtype(:,1)) > 1) then print*,' SETTING TYPES ',istart,iend do i=istart,iend iamtype(i,i_current_step) = int(itypemap_falcON(itype),kind=kind(iamtype)) enddo endif return end subroutine read_falcON_data_into_splash !------------------------------------------------------------ ! set labels for each column of data !------------------------------------------------------------ subroutine set_labels_falcON_hdf5 use labels, only:label,iamvec,labelvec,ix,ivx,ipmass, & ih,irho,iax,iutherm !ipr,iutherm use settings_data, only:ndim,ndimV,UseTypeInRenderings use geometry, only:labelcoord use falcONhdf5read, only:blocklabel use asciiutils, only:lcase integer :: i,icol if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_falcON_hdf5 ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_falcON_hdf5 ***' return endif ix = 0 iutherm = 0 do icol=1,size(blocklabel) select case(trim(lcase(blocklabel(icol)))) case('x') ix(1) = icol case('y') ix(2) = icol case('z') ix(3) = icol case('vx') ivx = icol case('ax') iax = icol case('h') ih = icol case('mass') ipmass = icol case('srho') irho = icol end select label(icol) = trim(blocklabel(icol)) enddo ! set labels of the quantities read in if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) if (irho > 0) label(irho) = 'density' !if (iutherm > 0) label(iutherm) = 'u' if (ipmass > 0) label(ipmass) = 'particle mass' ! set labels for vector quantities if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'_'//labelcoord(i,1) enddo endif if (iax > 0) then iamvec(iax:iax+ndimV-1) = iax labelvec(iax:iax+ndimV-1) = 'a' do i=1,ndimV label(iax+i-1) = trim(labelvec(iax))//'_'//labelcoord(i,1) enddo endif ! labels for each particle type already set UseTypeInRenderings(:) = .false. UseTypeInRenderings(1) = .true. !----------------------------------------------------------- return end subroutine set_labels_falcON_hdf5 subroutine set_splash_block_label(icol,name) bind(c) use, intrinsic :: iso_c_binding, only:c_int, c_char use falcONhdf5read, only:blocklabel use asciiutils, only:fstring integer(kind=c_int), intent(in) :: icol character(kind=c_char), intent(in) :: name(256) blocklabel(icol+1) = trim(fstring(name)) !print*,icol,' name = ',trim(blocklabel(icol)) end subroutine set_splash_block_label subroutine set_splash_particle_label(itypec,name) bind(c) use, intrinsic :: iso_c_binding, only:c_int, c_char use asciiutils, only:fstring use labels, only:labeltype use falcONhdf5read, only:itypemap_falcON integer(kind=c_int), intent(in) :: itypec character(kind=c_char), intent(in) :: name(256) !print*,' got type = ',itypec,' setting ',itypemap_falcON(itypec+1),'= ',trim(fstring(name)) labeltype(itypemap_falcON(itypec+1)) = trim(fstring(name)) end subroutine set_splash_particle_label end module readdata_falcON_hdf5 danieljprice-splash-4d1f09c/src/read_data_falcON_hdf5_utils.cc000066400000000000000000000612321477365367100244500ustar00rootroot00000000000000// -*- C++ -*- //////////////////////////////////////////////////////////////////////////////// /// /// \file read_falcON_utils.cc /// /// \brief towards reading falcON HDF5 snapshots into splash /// \date 12-Aug-2015 // // Copyright (C) 2015 Walter Dehnen. // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // PART 1: interfaces with C-linkage // this part may be used like a header file // //////////////////////////////////////////////////////////////////////////////// extern "C" { /// maximum number of particles types expected /// (actually falcON currently only supports 3 particle types) static constexpr int max_num_types = 6; // // 1.1 routines to be provided by SPLASH and called from PART 2 below // /// /// transfer data to splash /// /// \param[in] icol column of data /// \param[in] ndat number of data == number of particles of type /// \param[in] data array of ndat data /// \param[in] type index of particle type /// /// \note called by read_falcON_snapshot() void read_falcON_data_into_splash(const int*icol, const int*ndat, const double*data, const int*type); /// /// tell splash about the label of a data column /// /// \param[in] icol column of data /// \param[in] name label for this column /// /// \note called by read_falcON_snapshot() void set_splash_block_label(const int*icol, const char*name); /// /// tell splash about the label of a particle type /// /// \param[in] ityp column of data /// \param[in] name label for this column /// /// \note called by read_falcON_snapshot() void set_splash_particle_label(const int*ityp, const char*name); // // 1.2 routines provided here, but to be called from SPLASH // /// /// set debugging level /// /// \param[in] debug debugging level /// /// \note currently only debug=0,1,2,3 are distinguished. /// 0 means no output in case of an error, /// 1 means diagnostic output in case of error, /// 2 also prints errors from the HDF5 library /// 3 may print extra information (used in debugging this file) void set_falcON_debugging_level(const int*debug); /// /// opens a falcON HDF5 snapshot file /// /// \param[in] filename name of data file /// \param[out] ierr non-zero if file couldn't be opened /// /// \note precondition: none /// \note postcondition: open_falcON_snapshot() can be called /// \note We close any previously opened file (only one snapshot file can be /// open at any time with this implementation), but warn if the /// filename matches with the currently open file, if any. /// \note Use num_falcON_snapshots() for the number of snapshots in the file void open_falcON_file(const char*filename, int*ierr); /// /// queries whether a file is open /// int falcON_file_is_open(); /// /// closes the currently open (if any) falcON HDF5 snapshot file. /// /// \note precondition: none /// \note postcondition: falcON_file_is_open() will return false void close_falcON_file(); /// /// queries if there is another snapshot present the currently open file /// /// \note precondition: falcON_file_is_open() int have_falcON_snapshot(int*ierr); /// /// query the number of snapshots in the currently open file /// /// \note precondition: falcON_file_is_open() /// \note When using have_falcON_snapshot(), it may not be necessary to call /// this function, see main() in PART 3 below for an example. /// \note This function is trivial for falcON HDF5-based snapshot files, /// but non-trivial for NEMO snapshot files, which we may support in /// the future without changing this interface. int num_falcON_snapshots(int*ierr); /// /// opens the next falcON snapshot in the currently open file and /// reads its header /// /// \param[out] ntype number of particle types /// \param[out] npart number of particles per type /// \param[out] ncol number of splash columns /// \param[out] dimX number of spatial dimensions /// \param[out] dimV number of velocity dimensions /// \param[out] time simulation time of snapshot /// \param[out] hper if hper[d]!=0, dimension d is periodic with |x|= 5 // // The HDF5 library may have been compiled with another (older) GNU C++ ABI // than the one used in the rest of the falcON.2 code. Here, we must use the // same C++ ABI as used with the HDF5 C++ library. This is controlled by the // following macro, see also // // https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html // # define _GLIBCXX_USE_CXX11_ABI 0 #endif #if __cplusplus < 201103L # error requiring C++11 #endif #include #include #include #include #include #include #include #include /// /// 2.1 auxiliary functionality /// (symbols from the anonymous namespace have internal linkage /// namespace { /// simple struct with data for each set of particles struct Particles { std::unique_ptr group; ///< HDF5 group std::string name; ///< name: 'sink', 'gas', 'std' std::size_t number; ///< number of particles // (I couldn't figure out to avoid this via aggregate initialisation) Particles(H5::Group*g, std::string const&t, std::size_t n) : group(g), name(t), number(n) {} }; // using name_count_map = std::map; using name_and_count = name_count_map::value_type; // static data int Debug = 0; ///< debug level (0 or not 0) int IndexSnap = 0; ///< index of next snapshot int NumSnap = 0; ///< number of snapshots in file int SplashCol = 0; ///< column for splash data int NumCol = 0; ///< number of splash columns name_count_map Fields; ///< field:dims map of all fields std::vector Part; ///< data for particle sets std::vector Buffer; ///< data buffer for input std::unique_ptr File; ///< file std::string FileName; ///< name of currently open file const hsize_t k[1] = {3}; const H5::ArrayType VectorType ///< HDF5 data type for double[3] {H5::PredType::NATIVE_DOUBLE,1,k}; // closes a splash column inline void close_column(const char*name) { if(SplashCol >= NumCol) throw "number of columns exceeds expected " + std::to_string(NumCol); set_splash_block_label(&SplashCol,name); SplashCol++; } // closes a splash column inline void close_column(std::string const&name) { close_column(name.c_str()); } // closes currently open snapshot inline void close_snapshot() { SplashCol = 0; NumCol = 0; Part.clear(); Fields.clear(); } // select field for this particle type? // NOTE Without selecting, we would potentially read meaningless data. This // will not be necessary in future versions of falcON. inline bool select(std::string const&field, std::string const&ptype) { return (field=="spin" || field=="eabs" || field=="maxA")? (ptype=="sink") : (field=="snum" || field=="uin" || field=="entr" || field=="dlKt" || field=="dlKe" || field=="srho" || field=="alfa" || field=="divv" || field=="dlht" || field=="vsig" || field=="fact" || field=="csnd" || field=="pres" || field=="vort" || field=="dtdv" || field=="qmin" || field=="delE" || field=="coll")? (ptype=="gas") : (field=="krnH" || field=="maxR") ? (ptype=="sink" || ptype=="gas") : true; } // try to read a component of a falcON field into a splash column void read_column(std::string const&field, const hsize_t comp, const hsize_t dims) { bool read = false; // loop particle types for(int type=0; type!=int(Part.size()); ++type) { const auto&part = Part[std::size_t(type)]; if(!select(field,part.name)) continue; H5::DataSet data; try { data = part.group->openDataSet(field); } catch(...) { continue; // field not present: continue with next particle type } // obtain size of data set auto space = data.getSpace(); hsize_t count[2]; auto rank = space.getSimpleExtentDims(count); assert(part.number==count[0]); const int ndat = int(part.number); // read component Buffer.resize(part.number); switch(dims) { case 1: // scalar field assert(rank==1); data.read(Buffer.data(),H5::PredType::NATIVE_DOUBLE,space,space); // reduce smoothing length by factor 2 if(field=="krnH" && part.name=="gas") for(auto&x:Buffer) x*=0.5; if(Debug>2) std::clog<<"reading "<2) std::clog<<"reading "<(std::toupper(field[0])); name+= comp==0? "xx": comp==1? "xy": comp==2? "xz": comp==3? "yy": comp==4? "yz": "zz"; } else name=field; close_column(name); } } // read a field inline void read_field(name_and_count const&field) { for(hsize_t comp=0; comp!=field.second; ++comp) read_column(field.first, comp, field.second); } // try to read a falcON field inline void read_field(std::string const&field) { const auto field_iter = Fields.find(field); if(field_iter==Fields.end()) std::clog<<"WARNING: falcON field '"<openAttribute("falcON"); } catch(...) { if(Debug) std::clog<<"open_falcON_file(): file '"<openAttribute("num_snapshots"); attr.read(H5::PredType::NATIVE_UINT32,&NumSnap); } catch(H5::Exception const&exc) { // should never happen if(Debug) std::clog<<"open_falcON_file('"<= NumSnap) { if(Debug) std::clog<<"open_falcON_snapshot(): no more than " <openGroup(name); // read time and hper auto attr = snap.openAttribute("time"); attr.read(H5::PredType::NATIVE_DOUBLE,time); attr = snap.openAttribute("hper"); attr.read(VectorType,hper); // read npart[] and open particle sets std::array types = {{"sink","gas","std"}}; for(const auto&type:types) { name = "N"; name+= type; unsigned number; try { attr = snap.openAttribute(name); attr.read(H5::PredType::NATIVE_UINT32,&number); } catch(...) { // should never go here number = 0; } if(number) { // open HDF5 group for particles const auto part = snap.openGroup(type); Part.emplace_back(new H5::Group(part),type,number); npart[(*ntyp)++] = int(number); // collect (field:dims) pairs and count columns for(hsize_t fld=0; fld!=part.getNumObjs(); ++fld) { const auto field = part.getObjnameByIdx(fld); const auto have_field = Fields.count(field); if(have_field) { // field 'krnH' generates an extra column for each particle type if(field=="krnH") (*ncol)++; } else { hsize_t count[2]; const auto dims = 1==part.openDataSet(field).getSpace(). getSimpleExtentDims(count)? 1:count[1]; Fields[field] = dims; (*ncol)+= int(dims); } if(Debug>2) std::clog<<"counting columns: type="<" <<(*ncol)< PreferredOrder = {"pos", "key", "vel", "acc", "mass", "pot", "pex", "rung", "krnH", "srho", "uin", "entr", "divv", "dlKt", "dlKe", "alfa"}; try { auto FieldsToRead=Fields; // read some fields in preferred order for(const auto&field:PreferredOrder) if(FieldsToRead.erase(field)) read_field(field); // read remaining fields for(const auto&field:FieldsToRead) read_field(field); } catch(H5::Exception const&exc) { // catch any HDF5 error if(Debug) std::clog<<"read_falcON_snapshot(): HDF5 error: \"" < #include #include // // 3.1 implement interface 1.1 using C++ // namespace { struct data_per_particle_type { std::string name; std::size_t number; std::vector< std::vector > columns; }; std::vector particle_data; std::vector column_labels; } // void set_splash_block_label(const int*icol, const char*name) { column_labels.at(std::size_t(*icol)) = name; } // void set_splash_particle_label(const int*type, const char*name) { particle_data.at(std::size_t(*type)).name = name; } // void read_falcON_data_into_splash(const int*icol, const int*ndat, const double*from, const int*type) { auto&part = particle_data.at(std::size_t(*type)); assert(*ndat > 0); assert(part.number == std::size_t(*ndat)); part.columns.at(std::size_t(*icol)).resize(std::size_t(*ndat)); std::copy(from,from+*ndat,part.columns[std::size_t(*icol)].begin()); } // // 3.2 an executable that dumps a falcON file // int main(int argc, const char**argv) { // obtain program parameters if(argc<2) { std::clog<<"usage: '"<> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Columns with the 'required' flag set to false are not read !------------------------------------------------------------------------- !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- module readdata_fits implicit none public :: read_data_fits, set_labels_fits private contains subroutine read_data_fits(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,maxcol,maxpart,headervals use settings_data, only:ndim,ndimV,ncolumns,ncalc,ipartialread,iverbose,debugmode use mem_allocation, only:alloc use readwrite_fits, only:read_fits_cube,fits_error,write_fits_image,& get_floats_from_fits_header,get_velocity_from_fits_header use imageutils, only:image_denoise use labels, only:headertags use system_utils, only:get_command_option use asciiutils, only:get_value integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,j,k,l,n,ierr,nextra,naxes(4) integer :: ncolstep,npixels,nsteps_to_read,ihdu logical :: iexist,reallocate real(kind=4), dimension(:,:,:), allocatable :: image real(kind=4), dimension(:), allocatable :: vels character(len=80), allocatable :: fitsheader(:) real :: dx,dy,dz,j0,k0,pixelscale logical :: centre_image nstepsread = 0 nsteps_to_read = 1 if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! if (iverbose==1 .and. ipos==1) print "(1x,a)",'reading FITS format' inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--append .fits on the endif not already present ! datfile=trim(rootname)//'.fits' inquire(file=datfile,exist=iexist) endif if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif ! !--set parameters which do not vary between timesteps ! ndim = 2 ndimV = 2 nextra = 0 ihdu = nint(get_command_option('hdu')) ! !--read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open file and read header information ! if (ihdu > 0) then call read_fits_cube(datfile,image,naxes,ierr,hdr=fitsheader,hdu=ihdu) else call read_fits_cube(datfile,image,naxes,ierr,hdr=fitsheader) endif if (ierr /= 0) then print*,'ERROR: '//trim(fits_error(ierr)) if (allocated(image)) deallocate(image) return endif if (naxes(3) > 1) then ndim = 3 ndimV = 3 endif npixels = product(naxes(1:ndim)) if (npixels <= 0) then print "(a)",' ERROR: got npixels = 0 from fits header (extension not supported?)' return endif if (ndim==3) then allocate(vels(naxes(3))) call get_velocity_from_fits_header(naxes(3),vels,fitsheader,ierr) endif ncolstep = ndim + 3 ! x, y, h, I, m if (iverbose >= 1) then if (ndim==3) then print "(' image size: ',i5,' x ',i5,' x ',i5)",naxes(1:ndim) else print "(' image size: ',i5,' x ',i5)",naxes(1:2) endif endif ! !--allocate or reallocate memory for main data array ! ncolumns = ncolstep + nextra nstepsread = 1 reallocate = (npixels > maxpart) if (reallocate .or. .not.(allocated(dat))) then call alloc(npixels,nsteps_to_read,max(ncolumns+ncalc,maxcol),mixedtypes=.false.) endif ! !--now memory has been allocated, set information that splash needs ! call get_floats_from_fits_header(fitsheader,headertags,headervals(:,i)) ipartialread = .false. masstype(1,i) = 0.0 npartoftype(1,i) = npixels pixelscale = get_value('CDELT2',headertags,headervals(:,i),default=1.) if (abs(pixelscale - 1.) > tiny(1.)) pixelscale = pixelscale * 3600. ! arcsec ! ! set x,y and other things needed for splash ! centre_image = .true. j0 = 0.5*naxes(1) k0 = 0.5*naxes(2) dx = 1.*pixelscale dy = 1.*pixelscale dz = 1.*pixelscale if (debugmode) print*,'DEBUG: mapping...' !$omp parallel do private(j,k,l,n) & !$omp shared(dat,naxes,centre_image,dx,dy,dz,j0,k0,image,i,pixelscale,ndim) do l=1,naxes(3) do k=1,naxes(2) do j=1,naxes(1) n = (l-1)*naxes(1)*naxes(2) + (k-1)*naxes(1) + j if (centre_image) then dat(n,1,i) = (j - j0)*dx dat(n,2,i) = (k - k0)*dy else dat(n,1,i) = j*dx dat(n,2,i) = k*dy endif if (ndim >= 3) dat(n,3,i) = l*dz dat(n,ndim+1,i) = 1.*pixelscale ! smoothing length == pixel scale dat(n,ndim+2,i) = image(j,k,l) dat(n,ndim+3,i) = image(j,k,l)*dx*dy*dz ! flux==equivalent of "mass" enddo enddo enddo !$omp end parallel do if (debugmode) print*,'DEBUG: done' ! ! clean up ! deallocate(image) !,old_image) end subroutine read_data_fits !------------------------------------------------------------ ! set labels for each column of data !------------------------------------------------------------ subroutine set_labels_fits use labels, only:label,labeltype,ix,ipmass,ih,irho use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings,iautorender use geometry, only:labelcoord if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_fits ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_fits ***' return endif ix(1) = 1 ix(2) = 2 if (ndim >= 3) ix(3) = 3 ih = ndim+1 irho = ndim+2 ipmass = ndim+3 ! set labels of the quantities read in if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) if (irho > 0) label(irho) = 'intensity' if (ipmass > 0) label(ipmass) = 'flux' if (ih > 0) label(ih) = 'sigma' if (ndim >= 2) iautorender = irho ! automatically select this column for first plot ! set labels for each particle type ntypes = 1 labeltype(1) = 'pixel' UseTypeInRenderings(:) = .true. end subroutine set_labels_fits end module readdata_fits danieljprice-splash-4d1f09c/src/read_data_flash_hdf5.f90000066400000000000000000000216601477365367100231750ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR FLASH HDF5 TRACER PARTICLES ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ntot(maxstep) : total number of particles in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module flash_hdf5read use, intrinsic :: iso_c_binding, only:c_int,c_float,c_char !interface to the c versions interface subroutine read_flash_hdf5_header(filename,time,npart,ncol,ierr) bind(c) import character(kind=c_char,len=1), intent(in) :: filename real(kind=c_float), intent(out) :: time integer(kind=c_int), intent(out) :: npart,ncol,ierr end subroutine read_flash_hdf5_header subroutine read_flash_hdf5_data(filename,npart,ncol,isrequired,ierr) bind(c) import character(kind=c_char,len=1), intent(in) :: filename integer(kind=c_int), intent(in) :: npart,ncol integer(kind=c_int), dimension(ncol), intent(in) :: isrequired integer(kind=c_int), intent(out) :: ierr end subroutine read_flash_hdf5_data end interface contains ! ! function which maps from the order in which columns ! are read from the HDF5 file to the order in which they ! are stored in SPLASH. Differs because there are a couple ! of useless arrays that we do not read/store (ie. first column ! is on/off tag, 5th column is particle ID which we use to order ! the particles) ! integer function icolshuffle(icol) integer, intent(in) :: icol select case(icol) case(1) icolshuffle = 4 case(2,3,4) icolshuffle = icol - 1 case(5) icolshuffle = 0 case default icolshuffle = icol end select end function icolshuffle end module flash_hdf5read !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- module readdata_flash_hdf5 implicit none public :: read_data_flash_hdf5, set_labels_flash_hdf5 private contains subroutine read_data_flash_hdf5(dumpfile,indexstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,maxpart,maxcol use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,required,ipartialread,lowmemorymode use mem_allocation, only:alloc use flash_hdf5read use asciiutils, only:cstring use labels, only:ih,irho use system_utils, only:renvironment integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: dumpfile integer :: i,j,ncolstep,ilastrequired integer :: nprint,npart_max,nstep_max,ierr integer, dimension(0:maxplot) :: isrequired logical :: iexist real(c_float) :: tread real :: hfact,totmass nstepsread = 0 nstep_max = 0 npart_max = maxpart ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions (0 means no particle coords) ! ndim = 3 ndimV = 3 j = indexstart nstepsread = 0 print "(a)",' reading FLASH tracer particles (HDF5) data format ' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) call read_flash_hdf5_header(cstring(dumpfile),tread,nprint,ncolstep,ierr) ncolstep = ncolstep - 1 ! subtract particle ID column print "(a,i10,a,es10.3,a,i2)",' npart = ',nprint,' time = ',tread call set_labels_flash_hdf5 if (ih > 0 .and. required(ih)) required(irho) = .true. ! !--(re)allocate memory ! nstep_max = max(nstep_max,indexstart,1) if (.not.allocated(dat) .or. (nprint > maxpart) .or. (ncolstep+ncalc) > maxcol) then npart_max = max(npart_max,nprint,maxpart) if (lowmemorymode) then ilastrequired = 0 do i=1,ncolstep+ncalc if (required(i)) ilastrequired = i enddo call alloc(npart_max,j,ilastrequired) else call alloc(npart_max,nstep_max,max(ncolstep+ncalc,maxcol)) endif endif ! !--set the necessary parameters ! ncolumns = ncolstep nstepsread = nstepsread + 1 npartoftype(:,j) = 0 npartoftype(1,j) = nprint totmass = renvironment('FSPLASH_TOTMASS',-1.0) if (totmass > 0.) then print "(a,1pe10.3)",' setting total mass for all particles using FSPLASH_TOTMASS=',totmass else print "(a)",' FSPLASH_TOTMASS not set, assuming total mass of all particles is 1.0' totmass = 1.0 endif masstype(1,j) = totmass/real(nprint) time(j) = tread gamma(j) = 5./3. ! !--map "required" array to integers ! also remap to the order read from the c data read ! isrequired(:) = 0 do i=1,ncolstep if (icolshuffle(i) /= 0 .and. required(icolshuffle(i))) then !print*,'required '//trim(label(icolshuffle(i)))//' so must read ',i isrequired(i) = 1 endif enddo if (.not.all(required(1:ncolstep))) then ipartialread = .true. else ipartialread = .false. endif ! !--now read the timestep data in the dumpfile ! (to avoid Fortran calling C with the array, we don't actually ! pass the dat array here - instead we get c to ! "call back" to fill the dat array, below) ! call read_flash_hdf5_data(cstring(dumpfile),nprint,ncolstep+1,isrequired(1:ncolstep+1),ierr) if (required(ih)) then hfact = 1.2 hfact = renvironment('FSPLASH_HFACT',1.2) print "(a,i2,a,f5.2,a)",' creating smoothing length in column ',ih,' using h =',hfact,'(m/rho)^(1/3)' dat(1:nprint,ih,j) = hfact*(masstype(1,j)/dat(1:nprint,irho,j))**(1./3.) endif return end subroutine read_data_flash_hdf5 subroutine read_flash_data_fromc(icol,npart,temparr,id) bind(c) use, intrinsic :: iso_c_binding, only:c_int,c_double use particle_data, only:dat use flash_hdf5read, only:icolshuffle use labels, only:label integer(kind=c_int), intent(in) :: icol,npart real(kind=c_double), dimension(npart), intent(in) :: temparr integer(kind=c_int), dimension(npart), intent(in) :: id integer(kind=c_int) :: i,icolput icolput = icolshuffle(icol) if (icolput > size(dat(1,:,1)) .or. icolput==0) then print "(a,i2,a)",' ERROR: column = ',icolput,' out of range in receive_data_fromc' return endif print "(a,i2,a)",' reading column ',icol,' -> '//trim(label(icolput)) do i=1,npart if (id(i) < 1 .or. id(i) > npart) then print*,' ERROR in particle id = ',id(i) else dat(id(i),icolput,1) = real(temparr(i)) endif enddo return end subroutine read_flash_data_fromc !!------------------------------------------------------------------- !! set labels for each column of data !! !! read these from a file called 'columns' in the current directory !! then take sensible guesses as to which quantities are which !! from the column labels !! !!------------------------------------------------------------------- subroutine set_labels_flash_hdf5 use labels, only:label,labeltype,ix,irho,ipmass,ih,ivx,iamvec,labelvec use params use settings_data, only:ntypes,ndim,ndimV,UseTypeInRenderings,ncolumns use geometry, only:labelcoord integer :: i do i=1,ndim ix(i) = i label(i) = labelcoord(i,1) enddo ih = 5 ivx = 6 ipmass = 0 label(4) = 'density (from grid)' label(ih) = 'smoothing length' irho = 4 if (ncolumns >= 9) then irho = 9 label(9) = 'density (on particles)' else irho = 4 endif if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = 'v\d'//labelcoord(i,1) enddo endif ! !--set labels for each particle type ! ntypes = 1 labeltype(1) = 'tracer' UseTypeInRenderings(1) = .true. end subroutine set_labels_flash_hdf5 end module readdata_flash_hdf5 danieljprice-splash-4d1f09c/src/read_data_flash_hdf5_utils.c000066400000000000000000000247211477365367100242420ustar00rootroot00000000000000/* * This subroutine performs the calls to the HDF5 library for the FLASH * tracer particles data read * * Easier to do it this way and link with c than to try to link against * the Fortran interface (in the latter case the modules must * have been compiled with the *exact* compiler used to compile splash * which is a real pain). * */ #include #include #include #include #include "hdf5_helper_utils.h" void read_flash_data_fromc(int *icol,int *np,double temparr[*np], int id[*np]); void read_flash_hdf5_header(char *filename, float *time, int *npart, int *ncol, int *ierr) { hid_t file_id; hid_t dataset_id; hid_t dataspace_id; herr_t status; herr_t HDF5_error = -1; //printf(" opening %s \n",filename); file_id = H5Fopen(filename,H5F_ACC_RDONLY,H5P_DEFAULT); if (file_id == HDF5_error) { printf("ERROR opening %s \n",filename); *ierr = 1; return; } // READ NPART AND NCOL from file // Also, why is this #if even neccessary....! #if H5_VERSION_GE(1,8,0) dataset_id = H5Dopen2(file_id,"tracer particles",H5P_DEFAULT); #else dataset_id = H5Dopen(file_id,"tracer particles"); #endif if (dataset_id == HDF5_error) { printf("ERROR opening tracer particle data set \n"); *ierr = 2; return; } dataspace_id = H5Dget_space(dataset_id); // get dimensional information from dataspace hsize_t HDFxdims[4], HDFmaxdims[4]; int rank = H5Sget_simple_extent_dims(dataspace_id, HDFxdims, HDFmaxdims); if (rank > 4) { printf("RANK of dataset exceeds array bounds \n"); *ierr = 3; return; } // from the dimensional info, calculate the size of the buffer. *npart = HDFxdims[0]; *ncol = HDFxdims[1]; //printf(" number of particles %i \n",HDFxdims[0]); //printf(" number of columns = %i \n",HDFxdims[1]); status = H5Sclose(dataspace_id); if (status == HDF5_error) { printf("ERROR closing dataspace \n"); *ierr = 4; } status = H5Dclose(dataset_id); if (status == HDF5_error) { printf("ERROR closing dataset \n"); *ierr = 4; } /* * read the time from the file - this is * contained in a pointlessly complicated * compound structure that we have to replicate here * */ #if H5_VERSION_GE(1,8,0) dataset_id = H5Dopen2(file_id,"real scalars",H5P_DEFAULT); #else dataset_id = H5Dopen(file_id,"real scalars"); #endif if (dataset_id == HDF5_error) { printf("ERROR opening real scalars data set for time \n"); *ierr = 5; return; } dataspace_id = H5Dget_space(dataset_id); rank = H5Sget_simple_extent_dims(dataspace_id, HDFxdims, HDFmaxdims); if (rank > 4) { printf("RANK of dataset exceeds array bounds \n"); *ierr = 3; return; } int lenheader = HDFxdims[0]; //printf(" header contains %i items \n",lenheader); typedef struct h_t { char name[80]; double value; } h_t; h_t header[lenheader]; hid_t strtype = H5Tcopy(H5T_C_S1); status = H5Tset_size (strtype, 80); hid_t compound_id = H5Tcreate(H5T_COMPOUND, sizeof(h_t)); H5Tinsert(compound_id,"name",HOFFSET(h_t, name), strtype); H5Tinsert(compound_id,"value",HOFFSET(h_t, value), H5T_NATIVE_DOUBLE); status = H5Dread(dataset_id,compound_id,H5S_ALL,H5S_ALL,H5P_DEFAULT,header); if (status == HDF5_error) { printf("ERROR reading header \n"); *ierr = 6; } *time = header[0].value; status = H5Sclose(dataspace_id); if (status == HDF5_error) { printf("ERROR closing dataspace \n"); *ierr = 4; } status = H5Dclose(dataset_id); if (status == HDF5_error) { printf("ERROR closing dataset \n"); *ierr = 4; } // Additionally check if an SPH_density data set is present if (checkfordataset(file_id,"SPH_density")==1) { printf(" file contains SPH-calculated densities \n"); *ncol += 1; } else { printf(" file does not contain SPH_density data set \n"); } status = H5Fclose( file_id ); if (status == HDF5_error) { printf("ERROR closing file \n"); *ierr = 7; } } void read_flash_hdf5_data(char *filename, int *npart, int *ncol, int *isrequired, int *ierr) { hid_t file_id; hid_t dataset_id, SPHdataset_id; hid_t dataspace_id; hid_t memspace_id; herr_t status; herr_t HDF5_error = -1; //printf(" re-opening %s \n",filename); file_id = H5Fopen(filename,H5F_ACC_RDONLY,H5P_DEFAULT); if (file_id == HDF5_error) { printf("ERROR re-opening %s \n",filename); *ierr = 1; return; } // re-open tracer particle dataspace #if H5_VERSION_GE(1,8,0) dataset_id = H5Dopen2(file_id,"tracer particles",H5P_DEFAULT); #else dataset_id = H5Dopen(file_id,"tracer particles"); #endif if (dataset_id == HDF5_error) { printf("ERROR opening tracer particle data set \n"); *ierr = 2; return; } dataspace_id = H5Dget_space(dataset_id); // Additionally check if an SPH_density data set is present int ncolloop; int gotSPHdata = checkfordataset(file_id,"SPH_density"); if (gotSPHdata==0) { //printf(" file does not contain SPH_density data set \n"); ncolloop = *ncol; } else { //printf(" file contains SPH-calculated densities \n"); ncolloop = *ncol - 1; } // make a temporary space to put each column as we read it hsize_t nparth[1]; nparth[0] = *npart; memspace_id = H5Screate_simple(1,nparth,NULL); // dynamically allocate a temporary double array to store one column double* temp = 0; temp = malloc(*npart*sizeof(double)); // read particle information into one column hsize_t offset[2], count[2]; int i; count[0] = *npart; count[1] = 1; /* * read particle IDs first so we can sort into ID order */ offset[0] = 0; offset[1] = 5; // ID in column 5: should check this but this is for the future status = H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET, offset, NULL, count, NULL); if (status == HDF5_error) { printf("ERROR creating hyperslab \n"); *ierr = 4; } if (!H5Sselect_valid(dataspace_id)) { printf("ERROR selecting hyperslab \n"); *ierr = 5; } // read ID H5Dread(dataset_id,H5T_NATIVE_DOUBLE,memspace_id,dataspace_id,H5P_DEFAULT,temp); int* tempid = 0; tempid = malloc(*npart*sizeof(int)); // convert temp (double) into integer array for (i=0;i<*npart;i++) { tempid[i] = (int)temp[i]; } /* * start loop from 1 because first array is a useless "tag" array that * we don't need to read. * */ for (i=1;i> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ntot(maxstep) : total number of particles in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_foulkes implicit none public :: read_data_foulkes, set_labels_foulkes private contains subroutine read_data_foulkes(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,time,gamma,maxpart,maxcol,maxstep use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,required,ipartialread,xorigin use mem_allocation, only:alloc use system_utils, only:lenvironment use labels, only:ih integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,ierr,nerr,iunit,ncolstep integer :: nprint,npart_max,nstep_max,icol integer :: nmodel,nstar,ncolread logical :: iexist real :: tread,hmax,dtmin,tdg,hfac real, dimension(3) :: xptmass,yptmass,vxptmass,vyptmass character(len=len(rootname)+4) :: dumpfile nstepsread = 0 nstep_max = 0 npart_max = maxpart iunit = 15 ! logical unit number for input dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions (0 means no particle coords) ! ndim = 3 ndimV = 3 nstar = 2 j = indexstart nstepsread = 0 print "(a)",' Steve Foulkes/Carol Haswell/James Murray ascii data format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the file and read the number of particles ! open(unit=iunit,iostat=ierr,file=dumpfile,status='old',form='formatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return endif ! !--read header line, set time ! read(iunit,*,iostat=ierr) nmodel,nprint,hmax,tread,dtmin,tdg if (ierr /= 0) print "(a)",' WARNING: error(s) reading first header line' print "(a,1pe10.3,a,i10,a,i10)",' time = ',tread,' npart =',nprint,' model number = ',nmodel print "(3(a,1pe10.4))",' hmax = ',hmax,' dtmin = ',dtmin,' tdg = ',tdg ! !--determine how many columns we are going to read ! if (lenvironment('FSPLASH_READALL')) then ncolstep = 26 print "(a)",' reading all columns' else ncolstep = 15 print "(a,i2)",' reading only to column 15 (use --readall to read all)' endif ! !--(re)allocate memory ! nstep_max = max(maxstep,nstep_max,indexstart,1) if (.not.allocated(dat) .or. (nprint > maxpart) .or. (ncolstep+ncalc) > maxcol) then npart_max = max(npart_max,nprint+nstar,maxpart) !--allow extra room if reallocating if (allocated(dat)) npart_max = max(npart_max,INT(1.1*(nprint+nstar)),maxpart) call alloc(npart_max,nstep_max,max(ncolstep+ncalc,maxcol)) endif ! !--set the necessary parameters ! ncolumns = ncolstep nstepsread = nstepsread + 1 npartoftype(:,j) = 0 npartoftype(1,j) = nprint npartoftype(2,j) = nstar time(j) = tread gamma(j) = 5./3. ! !--now read the timestep data in the dumpfile ! nerr = 0 ! !--only read required columns ! ncolread = 0 do i=1,ncolstep if (required(i)) ncolread = i enddo if (ncolread /= ncolstep) then ipartialread = .true. print*,' reading only up to column ',ncolread endif do i=1,nprint read(iunit,*,iostat=ierr) (dat(i,icol,j),icol = 1,ncolread) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,' ERRORS reading particle data on ',nerr,' lines' ! !--read point mass information ! read(iunit,*,iostat=ierr) xptmass(1),yptmass(1),xptmass(2),yptmass(2),hfac !--point mass velocities not read, though would put them here if they were vxptmass(1) = 0. vyptmass(1) = 0. vxptmass(2) = 0. vyptmass(2) = 0. if (ierr /= 0) print *,' ERROR reading primary and secondary positions' close(iunit) !--set labels to get ih for setting smoothing length of stars call set_labels_foulkes !--copy star particle properties into main data array do i=nprint+1,nprint+nstar dat(i,1,j) = xptmass(i-nprint) dat(i,2,j) = yptmass(i-nprint) dat(i,3,j) = 0. dat(i,4,j) = vxptmass(i-nprint) dat(i,5,j) = vyptmass(i-nprint) dat(i,6,j) = 0. dat(i,7:ncolstep,j) = 0. if (ih > 0) dat(i,ih,j) = epsilon(0.) ! small but non-zero smoothing length enddo print "(' primary (x,y) = (',1pe10.2,',',1pe10.2,')')",xptmass(1),yptmass(1) print "(' secondary (x,y) = (',1pe10.2,',',1pe10.2,')')",xptmass(2),yptmass(2) print "(a)",' setting origin to primary position... ' xorigin(1) = xptmass(1) xorigin(2) = yptmass(1) xorigin(3) = 0. return end subroutine read_data_foulkes !!------------------------------------------------------------------- !! set labels for each column of data !! !! read these from a file called 'columns' in the current directory !! then take sensible guesses as to which quantities are which !! from the column labels !! !!------------------------------------------------------------------- subroutine set_labels_foulkes use labels, only:label,labeltype,ix,irho,ipmass,ih,ivx,iamvec,labelvec,make_vector_label use params use settings_data, only:ntypes,ndim,ndimV,UseTypeInRenderings use geometry, only:labelcoord integer :: i,ifx do i=1,ndim ix(i) = i enddo ivx = ndim+1 ipmass = ivx+ndimV ifx = ipmass+1 irho = ifx+ndimV label(irho+1) = 'du/dt' label(irho+2) = 'C_{s}' label(irho+3) = 'alpha' ih = irho+4 label(irho+5) = 'kpc' label(irho+6) = 'schb' label(irho+7) = 'dtp' label(irho+8) = 'sigma' label(irho+9) = 'pdr2' label(irho+10) = 'av_sep' label(irho+11) = 'radius' label(irho+12) = 'viscosity flag' label(irho+13) = 'neighbour number' label(irho+14) = 'iwas' label(irho+15) = 'll' if (irho > 0) label(irho) = 'density' if (ih > 0) label(ih) = 'smoothing length' if (ipmass > 0) label(ipmass) = 'particle mass' call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('f',ifx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--set labels for each particle type ! ntypes = 2 labeltype(1) = 'gas' labeltype(2) = 'star' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. end subroutine set_labels_foulkes end module readdata_foulkes danieljprice-splash-4d1f09c/src/read_data_gadget.f90000066400000000000000000001726451477365367100224370ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR OUTPUT FROM THE GADGET CODE ! (works with GADGET v1.0, v2.0 and v3.0) ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! COMMAND-LINE FLAGS: ! ! --format=2 reads the block-labelled GADGET format ! rather than the default format. ! --hsoft ! if given a value > 0.0 will assign a ! smoothing length to dark matter particles which can then be ! used in the rendering ! --extracols=temp,H2 abundance ! if set to a comma separated list of column labels, ! will attempt to read additional columns containing gas particle ! properties beyond the end of file ! --starpartcols=temp,vel ! if set to a comma separated list of column labels, ! will attempt to read additional columns containing star particle ! properties beyond the end of file ! --checkids ! if set then reads and checks ! particle IDs for negative values and flags these as accreted particles ! --hcolumn=10 ! if set to a positive integer, specifies the location ! of the smoothing length in the columns, overriding any default settings. ! --ignore-iflagcool if set to 'YES' or `TRUE', does not assume that ! extra columns are present even if the cooling flag is set in the header. ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Partial data read implemented Nov 2006 means that columns with ! the 'required' flag set to false are not read (read is therefore much faster) !------------------------------------------------------------------------- module readdata_gadget use params, only:maxplot implicit none public :: read_data_gadget, set_labels_gadget, file_format_is_gadget real :: hsoft character(len=4), dimension(maxplot) :: blocklabelgas logical :: havewarned = .false. logical :: auto_detected_block_format = .false. private contains subroutine read_data_gadget(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,maxpart,maxcol,maxstep use params, only:doub_prec,sing_prec,maxparttypes use settings_data, only:ndim,ndimV,ncolumns,ncalc,iformat,required,ipartialread, & ntypes,debugmode,iverbose use mem_allocation, only:alloc use labels, only:ih,irho,ipmass,labeltype,iamvec use system_utils, only:renvironment,lenvironment,ienvironment,envlist integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile,densfile,hfile character(len=4) :: blocklabel character(len=20) :: string integer, dimension(6) :: npartoftypei,Nall integer, dimension(:), allocatable :: iamtemp integer :: i,j,n,itype,icol,ierr,ierrh,ierrrho,nhset,nvec,ifile integer :: index1,index2,indexstart,indexend,nmassesdumped,ntypesused integer :: ncolstep,npart_max,nstep_max,ntoti,nacc,ntotall,idot integer :: iFlagSfr,iFlagFeedback,iFlagCool,nfiles,istart,nhfac integer :: nextracols,nstarcols,i1,i2,i3,i4,lenblock,idumpformat integer, dimension(6) :: i0,i1all,i2all integer, parameter :: iunit = 11, iunitd = 102, iunith = 103 logical :: iexist,reallocate,checkids,goterrors logical, dimension(6) :: ireadtype real(doub_prec) :: timetemp,ztemp real(doub_prec), dimension(6) :: massoftypei real(sing_prec), dimension(:), allocatable :: dattemp1 real(sing_prec), dimension(:,:), allocatable :: dattemp real :: hfact,hfactmean real, parameter :: pi = 4.*atan(1.) nstepsread = 0 goterrors = .false. if (maxparttypes < 6) then print*,' *** ERROR: not enough particle types for GADGET data read ***' print*,' *** you need to edit splash parameters and recompile ***' stop endif if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--look for a file with .0 on the end for multiple-file reads ! datfile=trim(rootname)//'.0' inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 idumpformat = 0 if (auto_detected_block_format) then idumpformat = 2 else idumpformat = ienvironment('GSPLASH_FORMAT') endif checkids = lenvironment('GSPLASH_CHECKIDS') ! !--read data from snapshots ! i = istepstart ! !--i0 is the offset used to read the data into the arrays ! (non-zero for read from multiple files) ! The offset is different for each particle type, somewhat ! complicating the data read -- we shuffle the particles from ! multiple files so that they are in type order. ! i0(:) = 0 ! !--loop over the number of files ! ifile = 0 ntotall = 0 over_files: do while(iexist) write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ifile = ifile + 1 ! !--open data file and read data ! open(iunit,iostat=ierr,file=datfile,status='old',form='unformatted') if (ierr /= 0) then print "(a)", '*** ERROR OPENING FILE ***' return endif !if (any(i0 > 0)) print*,'starting position for each type in data array: ',i0(:) ! !--read header for this timestep ! if (idumpformat==2) then print "(a)",' >> reading block labelled Gadget format <<' read(iunit,iostat=ierr) blocklabel,lenblock !print*,ierr,blocklabel,lenblock if (ierr /= 0 .or. lenblock /= 264) then print "(/,a,/)",'*** ERROR READING HEADER: wrong endian? or wrong format? ***' close(iunit) if (ifile==1) then return else exit over_files endif endif else if (ifile==1) print "(a)",' >> reading default Gadget format <<' endif npartoftypei(:) = 0 Nall(:) = 0 massoftypei(:) = 0. iFlagCool = 0 nfiles = 0 read(iunit,iostat=ierr) npartoftypei(1:6),massoftypei(1:6),timetemp,ztemp, & iFlagSfr,iFlagFeedback,Nall(1:6),iFlagCool,nfiles ntoti = int(sum(npartoftypei(1:6))) ! int here is unnecessary, but avoids compiler warnings if (nfiles > 1) then ntotall = int(sum(Nall(1:6))) else ntotall = ntoti endif if (debugmode) then print*,'DEBUG: ierr = ',ierr print*,'DEBUG: ntoti = ',ntoti,' ntotall = ',ntotall,' nfiles = ',nfiles print*,'DEBUG: npartoftype = ',npartoftypei(1:6),' Nall = ',Nall(1:6) print*,'DEBUG: iFlagSfr = ',iFlagSfr,' iFlagFeedback = ',iFlagFeedback,' iFlagCool = ',iFlagCool print*,'DEBUG: time = ',timetemp,' z = ',ztemp endif if (ierr /= 0 .or. ntoti <= 0 .or. ntotall <= 0 .or. any(npartoftypei < 0) .or. nfiles < 0 & .or. nfiles > 1e6) then print "(/,a)", '*** ERROR READING TIMESTEP HEADER: wrong endian? ***' print "(/,a)", ' (see splash userguide for compiler-dependent' print "(a)", ' ways to change endianness on the command line)' print "(/,a)", ' (set --format=2 if you are using the block-labelled Gadget format)' close(iunit) if (ifile==1) then return else exit over_files endif endif ! !--if we are reading from multiple files, ! check that the sequence starts from the correct file ! if (nfiles > 1) then idot = len_trim(datfile)-1 if (ifile==1 .and. datfile(idot:idot+1) /= '.0') then if (nfiles < 100) then string = "(/,a,i2,a,/,a,/)" else string = "(/,a,i7,a,/,a,/)" endif if (nfiles > 10000) then !--this is the most likely scenario here print "(a)",'*** ERROR reading timestep header: wrong endian? ***' else print string,' ERROR: read is from multiple files (nfiles = ',nfiles,')',& ' but this is not the first file (does not end in .0): skipping...' endif close(iunit) return endif endif if (idumpformat==2) then ncolstep = 1 do while (ierr==0) call read_blockheader(idumpformat,iunit,0,index2,blocklabelgas(ncolstep),& lenblock,nvec,npartoftypei(1)) read(iunit,iostat=ierr) if (ierr==0 .and. index2 > 0) then select case(blocklabelgas(ncolstep)) case('ID ','INFO') ! not a column case default ncolstep = ncolstep + nvec end select endif enddo ncolstep = ncolstep - 1 rewind(iunit) read(iunit,iostat=ierr) read(iunit,iostat=ierr) iformat = 2 nextracols = 0 nstarcols = 0 else iformat = 0 if (iFlagCool==1 .and. .not.(lenvironment('GSPLASH_IGNORE-IFLAGCOOL') & .or. lenvironment('GSPLASH_IGNORE_IFLAGCOOL'))) then iformat = 1 ncolstep = 12 ! 3 x pos, 3 x vel, pmass, utherm, rho, Ne, Nh, h if (ifile==1) print "(a)",' cooling flag on : assuming Ne, Nh dumped before h' else iformat = 0 ncolstep = 10 ! 3 x pos, 3 x vel, pmass, utherm, rho, h endif if (iFlagSfr==1) then if (ifile==1) print "(a)",' star formation flag on: assuming star formation rate dumped ' ncolstep = ncolstep + 1 iformat = iformat + 10 endif call envlist('GSPLASH_EXTRACOLS',nextracols) if (nextracols > 0) then print "(a,i2,a)",' READING ',nextracols,' EXTRA COLUMNS ' ncolstep = ncolstep + nextracols endif call envlist('GSPLASH_STARPARTCOLS',nstarcols) if (nstarcols > 0) then print "(a,i2,a)",' READING ',nstarcols,' STAR PARTICLE COLUMN(S) ' ncolstep = ncolstep + nstarcols endif !call envlist('GSPLASH_EXTRAVECCOLS',nextraveccols) !if (nextraveccols > 0) then ! print "(a,i2,a)",' READING ',nextraveccols,' EXTRA COLUMNS ' ! ncolstep = ncolstep + nextraveccols !endif endif if (ifile==1) then ncolumns = ncolstep ! !--call set labels to get ih, ipmass, irho for use in the read routine ! hsoft = 0. ! to avoid unset variable call set_labels_gadget endif if (ifile==1) then print*,'time : ',timetemp print "(1x,a,f8.2)",'z (redshift) : ',ztemp endif print*,'Npart (by type) : ',npartoftypei(1:6) if (ifile==1) print*,'Mass (by type) : ',massoftypei(1:6) ! print "(10x,'|',6(1x,a12,'|'))", (labeltype(itype),itype=1,ntypes) ! print "(a10,'|',6(i11,2x,'|'))", 'Npart : ',npartoftypei ! print "(a10,'|',6(es11.3,2x,'|'))",'Mass : ',massoftypei print*,'N_gas : ',npartoftypei(1) print*,'N_total : ',ntoti if (ifile==1) print*,'N data columns : ',ncolstep if (nfiles > 1 .and. ifile==1) then print*,'Nall : ',Nall(1:6) endif if (nfiles > 1) then if (ifile==1) print "(a,i4,a)",' reading from ',nfiles,' files' elseif (nfiles < 0) then print*,'*** ERROR: nfiles = ',nfiles,' in file header: aborting' return endif if (ifile==1) then !--Softening lengths for Dark Matter Particles... hsoft = renvironment('GSPLASH_DARKMATTER_HSOFT') ! !--try to read dark matter and star particle smoothing lengths and/or density from a separate ! one column ascii file. If only density, use this to compute smoothing lengths. ! densfile = trim(rootname)//'.dens' hfile = trim(rootname)//'.hsml' hfact = 1.2 ! related to the analytic neighbour number (hfact=1.2 gives 58 neighbours in 3D) open(unit=iunitd,file=densfile,iostat=ierrrho,status='old',form='formatted') open(unit=iunith,file=hfile,iostat=ierrh,status='old',form='formatted') if (idumpformat==2) then if (ih==0 .and. (hsoft > tiny(hsoft) .or. ierrrho==0 .or. ierrh==0)) then ncolumns = ncolumns + 1 blocklabelgas(ncolumns) = 'HSML' ih = ncolumns call set_labels_gadget endif if (irho==0 .and. (hsoft > tiny(hsoft) .or. ierrrho==0 .or. ierrh==0)) then ncolumns = ncolumns + 1 blocklabelgas(ncolumns) = 'RHO ' irho = ncolumns call set_labels_gadget endif endif ! !--if successfully read header, increment the nstepsread counter ! nstepsread = nstepsread + 1 endif ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntotall) else ! if first time, save on memory npart_max = int(ntotall) endif endif if (i >= maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol)) endif ! !--copy npartoftypei into allocated header arrays ! and set the offset position of particle types in the main data arrays ! if (nfiles==1 .or. ifile==1) then i0(1) = 0 do itype=2,ntypes if (nfiles==1) then i0(itype) = sum(npartoftypei(1:itype-1)) ! this is avoid depending on Nall at all for single file read else i0(itype) = sum(Nall(1:itype-1)) endif enddo npartoftype(1:6,i) = npartoftypei(1:6) else i0(1) = npartoftype(1,i) do itype=2,ntypes i0(itype) = sum(Nall(1:itype-1)) + npartoftype(itype,i) enddo npartoftype(1:6,i) = npartoftype(1:6,i) + npartoftypei(1:6) endif if (debugmode) print*,'DEBUG: starting position for each type in data array: ',i0(:) ! !--set time to be used in the legend ! if (ifile==1) then time(i) = real(timetemp) else if (abs(real(timetemp)-time(i)) > tiny(0.)) print*,'ERROR: time different between files in multiple-file read' if (sum(Nall) /= ntotall) then print*,' ERROR: Nall differs between files' goterrors = .true. endif endif ! !--read particle data ! got_particles: if (ntoti > 0) then ! !--read positions of all particles ! (note that errors on position read are fatal) ! call read_blockheader(idumpformat,iunit,ntoti,index2,blocklabel,lenblock,nvec,ntoti) if (iformat==2) then ierr = 0 do while(blocklabel /= 'POS ' .and. ierr == 0) print "(a)",' WARNING: skipping unknown block '//blocklabel//' in data read' read(iunit, iostat=ierr) call read_blockheader(idumpformat,iunit,ntoti,index2,blocklabel,lenblock,nvec,ntoti) enddo endif if (any(required(1:3))) then print*,'positions ',index2 call allocate_temp(dattemp,3,ntoti) read(iunit,iostat=ierr) (dattemp(:,j),j=1,index2) if (nfiles > 1) then ! !--read data into type order if multiple files are present: ! this means the offset position is different for each type ! if (sum(npartoftypei) /= index2) print*,' ERROR: number of positions /= sum of types' n = 0 do itype=1,ntypes do j=i0(itype)+1,i0(itype)+npartoftypei(itype) n = n + 1 dat(j,1:3,i) = dattemp(1:3,n) enddo enddo !read (iunit, iostat=ierr) ((dat(j,1:3,i),j=i0(itype)+1,i0(itype)+npartoftypei(itype)),itype=1,ntypes) else do j=1,index2 dat(j,1:3,i) = dattemp(1:3,j) enddo ! read (iunit, iostat=ierr) (dat(j,1:3,i),j=1,index2) endif if (ierr /= 0) then print "(a)",'error encountered whilst reading positions ' deallocate(dattemp) return endif else read(iunit, iostat=ierr) if (ierr /= 0) then print "(a)",'error skipping positions ' return endif endif ! !--same for velocities ! call read_blockheader(idumpformat,iunit,ntoti,index2,blocklabel,lenblock,nvec,ntoti) if (iformat==2 .and. blocklabel /= 'VEL ') then print "(a)",' WARNING: expecting velocity, got '//blocklabel//' in data read' endif if (any(required(4:6))) then print*,'velocities ',index2 call allocate_temp(dattemp,3,ntoti) !if (.not.allocated(dattemp)) allocate(dattemp(3,ntoti)) read (iunit, iostat=ierr) (dattemp(:,j),j=1,index2) if (nfiles > 1) then !--see above re: type order if (sum(npartoftypei) /= index2) print*,' ERROR: number of velocities /= sum of types' n = 0 do itype=1,ntypes do j=i0(itype)+1,i0(itype)+npartoftypei(itype) n = n + 1 dat(j,4:6,i) = dattemp(1:3,n) enddo enddo !read (iunit, iostat=ierr) ((dat(j,4:6,i),j=i0(itype)+1,i0(itype)+npartoftypei(itype)),itype=1,ntypes) else do j=1,index2 dat(j,4:6,i) = dattemp(1:3,j) enddo !read (iunit, iostat=ierr) (dat(j,4:6,i),j=1,index2) endif if (ierr /= 0) then print "(a)",'error encountered whilst reading velocities' goterrors = .true. endif else read(iunit, iostat=ierr) if (ierr /= 0) then print "(a)",'error skipping velocities ' if (allocated(dattemp)) deallocate(dattemp) return endif endif ! !--skip read of particle ID (only required if we sort the particles ! back into their correct order, which is not implemented at present) ! OR if using particle ID to flag dead particles ! ! For multiple files we only allocate and read the IDs for one file ! if (checkids) then print*,'particle ID ',ntoti if (allocated(iamtemp)) deallocate(iamtemp) allocate(iamtemp(ntoti)) endif call read_blockheader(idumpformat,iunit,ntoti,index2,blocklabel,lenblock,nvec,ntoti) if (iformat==2 .and. blocklabel /= 'ID ') then print "(a)",' WARNING: expecting particle ID, got '//blocklabel//' in data read' endif if (index2 > 0) then if (checkids .and. required(ih)) then !--particle IDs are currently only used to set h -ve for accreted particles ! so do not read if h not required read (iunit,iostat=ierr) iamtemp(1:index2) else read (iunit,iostat=ierr) ! skip this line endif if (ierr /= 0) then print "(a)",'error encountered whilst reading particle ID' goterrors = .true. endif endif ! !--read particle masses ! !--work out total number of masses dumped nmassesdumped = 0 do itype = 1,6 if (abs(massoftypei(itype)) < tiny(massoftypei)) then nmassesdumped = nmassesdumped + npartoftypei(itype) endif enddo if (nmassesdumped==0) then masstype(1:6,i) = real(massoftypei(1:6)) else if (required(ipmass)) then print*,'particle masses ',nmassesdumped !--read this number of entries if (nmassesdumped > 0) then if (allocated(dattemp1)) deallocate(dattemp1) allocate(dattemp1(nmassesdumped)) call read_blockheader(idumpformat,iunit,nmassesdumped,index2,blocklabel,lenblock,nvec,-1) if (iformat==2 .and. blocklabel /= 'MASS') then print "(a)",' WARNING: expecting particle masses, got '//blocklabel//' in data read' endif else index2 = 0 endif if (index2 > 0) then read(iunit,iostat=ierr) dattemp1(1:index2) endif if (ierr /= 0) then print "(a)",'error reading particle masses' goterrors = .true. endif !--now copy to the appropriate sections of the dat array indexstart = 1 !index1 = 1 do itype=1,6 if (npartoftypei(itype) /= 0) then !--work out the appropriate section of the dat array for this particle type index1 = i0(itype) + 1 index2 = i0(itype) + npartoftypei(itype) if (abs(massoftypei(itype)) < tiny(massoftypei)) then ! masses dumped indexend = indexstart + npartoftypei(itype) - 1 if (debugmode) & print*,' read ',npartoftypei(itype),' masses for '//trim(labeltype(itype))// & ' particles',index1,'->',index2,indexstart,'->',indexend dat(index1:index2,ipmass,i) = dattemp1(indexstart:indexend) indexstart = indexend + 1 else ! masses not dumped if (debugmode) print "(a,es10.3,i10,a,i10)",& ' setting masses for '//trim(labeltype(itype))//' particles = ', & real(massoftypei(itype)),index1,'->',index2 dat(index1:index2,ipmass,i) = real(massoftypei(itype)) endif !index1 = index2 + 1 endif enddo if (allocated(dattemp1)) deallocate(dattemp1) elseif (nmassesdumped > 0) then read(iunit,iostat=ierr) if (ierr /= 0) then print "(a)",'error reading particle masses' goterrors = .true. endif endif endif ! !--read other quantities for rest of particles ! print*,'gas properties ',npartoftypei(1) if (ipmass==0) then istart = 7 else istart = 8 endif icol = istart-1 gas_properties: do while (icol < ncolstep) !icol=istart,ncolstep !-nextraveccols !!print*,icol i3 = 0 i4 = 0 ireadtype(:) = .false. if (idumpformat==2) then if (icol+1 <= ih) then call read_blockheader(idumpformat,iunit,npartoftypei(1),index2,& blocklabel,lenblock,nvec,npartoftypei(1)) else call read_blockheader(idumpformat,iunit,0,index2,& blocklabel,lenblock,nvec,npartoftypei(1)) endif if (nvec > 1) iamvec(icol+1:icol+nvec) = icol + 1 icol = icol + nvec ! !--work out from the number of entries what mix of particle types ! the quantity is defined on ! if (index2==ntoti) then i1 = i0(1) + 1 i2 = i1 + ntoti - 1 print "(1x,a,i0,' x ',i0,a)",blocklabel//' (',nvec,index2,': all particles)' ireadtype(:) = .true. elseif (index2==npartoftypei(1)) then i1 = i0(1) + 1 i2 = i1 + index2 - 1 print "(1x,a,i0,' x ',i0,a)",blocklabel//' (',nvec,index2,': gas particles only)' ireadtype(1) = .true. elseif (index2==npartoftypei(2)) then i1 = i0(2) + 1 i2 = i1 + index2 - 1 print "(1x,a,i0,' x ',i0,a)",blocklabel//' (',nvec,index2,': dark matter particles only)' ireadtype(2) = .true. elseif (index2==npartoftypei(1)+npartoftypei(2)) then i1 = i0(1) + 1 i2 = i1 + index2 - 1 print "(1x,a,i0,' x ',i0,a)",blocklabel//' (',nvec,index2,': gas+dark matter particles only)' ireadtype(1:2) = .true. elseif (index2==npartoftypei(5)) then i1 = i0(5) + 1 i2 = i1 + index2 - 1 print "(1x,a,i0,' x ',i0,a)",blocklabel//' (',nvec,index2,': star particles only)' ireadtype(5) = .true. elseif (index2==npartoftypei(1)+npartoftypei(5)) then i1 = i0(1) + 1 i2 = i1 + npartoftypei(1) - 1 i3 = i0(5) + 1 i4 = i3 + npartoftypei(5) - 1 print "(1x,a,i0,' x ',i0,a)",blocklabel//' (',nvec,index2,': gas+star particles only)' ireadtype(1) = .true. ireadtype(5) = .true. else print*,blocklabel//': ERROR in block length/quantity defined on unknown mix of types n = (',index2,')' i1 = i0(1)+1 i2 = i0(1)+index2 !--skip in order to avoid seg fault below... read (iunit,iostat=ierr) cycle gas_properties endif else nvec = 1 icol = icol + nvec if (icol > ncolstep-nstarcols) then i1 = i0(5) + 1 i2 = i1 + npartoftypei(5) - 1 print*,'star particle properties ',icol,i1,i2 ireadtype(5) = .true. else !--default is a quantity defined only on gas particles i1 = i0(1) + 1 i2 = i1 + npartoftypei(1) - 1 ireadtype(1) = .true. endif endif ! !--construct the array offsets required when reading from multiple files ! ntypesused = 0 do itype=1,6 if (ireadtype(itype) .and. npartoftypei(itype) > 0) then ntypesused = ntypesused + 1 i1all(ntypesused) = i0(itype) + 1 i2all(ntypesused) = i0(itype) + npartoftypei(itype) endif enddo if (npartoftypei(1) > 0) then if (required(icol)) then if (i3 > 0) then if (nfiles > 1) then read (iunit,iostat=ierr) (dat(i1all(itype):i2all(itype),icol,i),itype=1,ntypesused) else read (iunit,iostat=ierr) dat(i1:i2,icol,i),dat(i3:i4,icol,i) endif else if (nvec > 1) then if (nfiles > 1) then !read (iunit,iostat=ierr) (((dat(k,j,i),j=icol-nvec+1,icol),k=i1all(itype),i2all(itype)),itype=1,ntypesused) call allocate_temp(dattemp,nvec,ntoti) read (iunit,iostat=ierr) ((dattemp(1:nvec,j),j=i1all(itype),i2all(itype)),itype=1,ntypesused) do itype=1,ntypesused do j=i1all(itype),i2all(itype) dat(j,icol-nvec+1:icol,i) = real(dattemp(1:nvec,j)) enddo enddo else !read (iunit,iostat=ierr) ((dat(k,j,i),j=icol-nvec+1,icol),k=i1,i2) call allocate_temp(dattemp,nvec,i2-i1+1) read (iunit,iostat=ierr) (dattemp(1:nvec,j),j=1,i2-i1+1) do j=i1,i2 dat(j,icol-nvec+1:icol,i) = real(dattemp(1:nvec,j)) enddo endif else if (nfiles > 1) then call allocate_temp1(dattemp1,ntoti) read (iunit,iostat=ierr) ((dattemp1(j),j=i1all(itype),i2all(itype)),itype=1,ntypesused) ! convert to real*8 if compiled in single precision do itype=1,ntypesused dat(i1all(itype):i2all(itype),icol,i) = real(dattemp1(i1all(itype):i2all(itype))) enddo else call allocate_temp1(dattemp1,i2-i1+1) read (iunit,iostat=ierr) dattemp1(1:1+i2-i1) dat(i1:i2,icol,i) = real(dattemp1(1:1+i2-i1)) ! convert to real*8 if compiled in double prec endif endif endif else read (iunit,iostat=ierr) endif if (ierr /= 0) then print "(1x,a,i3)",'ERROR READING PARTICLE DATA from column ',icol goterrors = .true. endif endif enddo gas_properties if (allocated(dattemp1)) deallocate(dattemp1) !if (nextraveccols > 0) then ! print*,'chemical species ',index2 ! read (iunit, iostat=ierr) (dat(j,4:6,i),j=1,index2) ! if (ierr /= 0) then ! print "(a)",'error encountered whilst reading velocities' ! endif !endif ! !--close data file now that we have finished reading data ! close(unit=iunit) ! !--DEAL WITH ACCRETED PARTICLES (in this file only) ! if particle ID is less than zero, treat this as an accreted particle ! (give it a negative smoothing length) ! if (checkids) then nacc = 0 !--only do this if the smoothing length is required in the data read if (required(ih)) then n = 0 !do itype=1,ntypes itype = 1 do j=1,npartoftypei(itype) n = n + 1 if (iamtemp(n) < 0) then !if (itype > 1) print*,' id -ve on non-gas particle ',itype,j dat(i0(itype)+j,ih,i) = -abs(dat(i0(itype)+j,ih,i)) nacc = nacc + 1 endif enddo !enddo if (nacc > 0) then print "(a,i10,a,/,a)",' marking ',nacc,' '//trim(labeltype(1))// & ' particles with negative ID as accreted/dead', & ' (giving them a negative smoothing length so they will be ignored in renderings)' else print "(a)",' no particles with negative ID (i.e. accreted particles) found' endif endif if (allocated(iamtemp)) deallocate(iamtemp) endif endif got_particles ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ! !--set flag to indicate that only part of this file has been read ! if (.not.all(required(1:ncolstep))) ipartialread = .true. ! !--for read from multiple files, work out the next file in the sequence ! iexist = .false. if (nfiles > 1 .and. ifile < nfiles) then !--see if the next file exists idot = index(datfile,'.',back=.true.) if (idot <= 0) then print "(a)",' ERROR: read from multiple files but could not determine next file in sequence' goterrors = .true. else write(string,*) ifile write(datfile,"(a,i1)") trim(datfile(1:idot))//trim(adjustl(string)) iexist = .false. inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' ERROR: read from multiple files '// & 'but could not find '//trim(datfile)//': next in sequence' goterrors = .true. endif endif endif enddo over_files ! !--for some reason the smoothing length output by GADGET is ! twice the usual SPH smoothing length ! (do this after we have read data from all of the files) ! if (required(ih) .and. ih > 0 .and. size(dat(1,:,:)) >= ih .and. npartoftype(1,i) > 0) then print "(a)",' converting GADGET smoothing length on gas particles to usual SPH definition (x 0.5)' dat(1:npartoftype(1,i),ih,i) = 0.5*dat(1:npartoftype(1,i),ih,i) endif if (nfiles > 1. .and. any(npartoftype(1:6,i) /= Nall(1:6))) then print*,'ERROR: sum of Npart across multiple files /= Nall in data read ' print*,'Npart = ',npartoftype(1:6,i) print*,'Nall = ',Nall(1:6) goterrors = .true. endif ! !--look for dark matter smoothing length/density files ! if (ierrh==0 .or. ierrrho==0) then if (ierrh==0) then print "(a)",' READING DARK MATTER SMOOTHING LENGTHS from '//trim(hfile) ierr = 0 index1 = npartoftype(1,i)+1 index2 = npartoftype(1,i)+sum(npartoftype(2:,i)) read(iunith,*,iostat=ierr) (dat(j,ih,i),j=index1,index2) close(unit=iunith) if (ierr < 0) then nhset = 0 do j=index1,index2 if (dat(j,ih,i) > 0.) nhset = nhset + 1 enddo print "(a,i10,a,/)",' *** END-OF-FILE: GOT ',nhset,' SMOOTHING LENGTHS ***' elseif (ierr > 0) then print "(a)", ' *** ERROR reading smoothing lengths from file' goterrors = .true. else print "(a,i10,a)",' SMOOTHING LENGTHS READ OK for ',index2-index1+1,' dark matter / star particles ' endif hsoft = 1.0 ! just so dark matter rendering is allowed in set_labels_gadget routine endif if (ierrrho==0) then print "(a)",' READING DARK MATTER DENSITIES FROM '//trim(densfile) ierr = 0 index1 = npartoftype(1,i)+1 index2 = npartoftype(1,i)+sum(npartoftype(2:,i)) read(iunitd,*,iostat=ierr) (dat(j,irho,i),j=index1,index2) close(iunitd) if (ierr < 0) then nhset = 0 do j=index1,index2 if (dat(j,irho,i) > 0.) nhset = nhset + 1 enddo print "(a,i10,a,/)",' *** END-OF-FILE: GOT ',nhset,' DENSITIES ***' elseif (ierr > 0) then print "(a)", ' *** ERROR reading dark matter densities from file' goterrors = .true. else print "(a,i10,a)",' DENSITY READ OK for ',index2-index1+1,' dark matter / star particles ' endif if (ierrh /= 0 .and. ipmass > 0) then where(dat(:,irho,i) > tiny(dat)) dat(:,ih,i) = hfact*(dat(:,ipmass,i)/dat(:,irho,i))**(1./3.) elsewhere dat(:,ih,i) = 0. end where print "(a,i10,a,f5.2,a)", & ' SMOOTHING LENGTHS SET for ',index2-index1+1,' DM/star particles using h = ',hfact,'*(m/rho)**(1/3)' endif hsoft = 1.0 ! just so dark matter rendering is allowed in set_labels_gadget routine endif else ! !--if a value for the dark matter smoothing length is set ! via the environment variable GSPLASH_DARKMATTER_HSOFT, ! give dark matter particles this smoothing length ! and a density of 1 (so column density plots work) ! if (hsoft > tiny(hsoft)) then if (required(ih)) then print "(a,1pe10.3,a)",' ASSIGNING SMOOTHING LENGTH of h = ',hsoft, & ' to dark matter particles' !print*,'ih = ',ih,' npartoftype = ',npartoftype(1:2,i), shape(dat) if (ih > 0) then dat(npartoftype(1,i)+1:npartoftype(1,i)+npartoftype(2,i),ih,i) = hsoft else print*,' ERROR: smoothing length not found in data arrays' goterrors = .true. endif endif if (required(irho)) then if (irho > 0) then dat(npartoftype(1,i)+1:npartoftype(1,i)+npartoftype(2,i),irho,i) = 1.0 else print*,' ERROR: place for density not found in data arrays' goterrors = .true. endif endif else if (npartoftype(1,i) <= 0 .and. sum(npartoftype(:,i)) > 0) then print "(66('*'),4(/,a),/)",'* NOTE!! For GADGET data using dark matter only, column density ',& '* plots can be produced by setting --hsoft',& '* to give a (fixed) dark matter smoothing length' hsoft = (maxval(dat(:,1,i)) - minval(dat(:,1,i)))/sum(npartoftype(2:,i))**(1./3.) print*,' suggested value for --hsoft= ',hsoft hsoft = 0. print "(7(/,a),/)",'* Alternatively, and for best results, calculate a number density', & '* on dark matter particles, set individual smoothing lengths from', & '* this using h = hfact*(n)**(-1/3), with hfact=1.2 and either ', & '* dump the results back into the HSML array in the original dump ', & '* file (if using the block-labelled format), or create an ascii ',& '* file called '//trim(hfile)//' containing the smoothing length ',& '* values for the dark matter particles.' print "(2(/,a),/,66('*'),/)", '* Also make sure normalised interpolations are OFF when plotting ',& '* dark matter density ' endif endif endif ! !--pause with fatal errors ! if (goterrors .and. .not.(lenvironment('GSPLASH_IGNORE_ERRORS').or.lenvironment('GSPLASH_IGNORE-ERRORS'))) then print "(/,a)",'*** ERRORS detected during data read: data will be corrupted' print "(a,/)",' Please REPORT this and/or fix your file ***' print "(a)",' (set --ignore-errors=yes to skip this message)' if (iverbose >= 1) then print "(a)",' > Press any key to bravely proceed anyway <' read* endif endif ! !--give a friendly warning about using too few or too many neighbours ! (only works with equal mass particles because otherwise we need the number density estimate) ! if (ih > 0 .and. required(ih) .and. ipmass > 0 .and. required(ipmass) & .and. abs(massoftypei(1)) < tiny(0.) .and. ndim==3 .and. .not.havewarned) then nhfac = 100 if (npartoftype(1,i) > nhfac) then hfactmean = 0. do j=1,nhfac hfact = dat(j,ih,i)*(dat(j,irho,i)/(dat(j,ipmass,i)))**(1./ndim) hfactmean = hfactmean + hfact enddo hfact = hfactmean/real(nhfac) havewarned = .true. if (hfact < 1.125 .or. hfact > 1.45) then print "(/,a)",'** FRIENDLY NEIGHBOUR WARNING! **' print "(3x,a,f5.1,a,/,3x,a,f5.2,a,i1,a)", & 'It looks like you are using around ',4./3.*pi*(2.*hfact)**3,' neighbours,', & 'corresponding to h = ',hfact,'*(m/rho)^(1/',ndim,') in 3D:' if (hfact < 1.15) then print "(4(/,3x,a))",'This is a quite a low number of neighbours for the cubic spline and ', & 'may result in increased noise and inaccurate wave propagation speeds', & '(a cubic lattice is also an unstable initial configuration for the ',& ' particles in this regime -- see Morris 1996, Borve et al. 2004).' elseif (hfact > 1.45) then print "(4(/,3x,a))",'Using h >~ 1.5*(m/rho)^(1/3) with the cubic spline results in the', & 'particle pairing instability due to the first neighbour being placed under', & 'the hump in the kernel gradient. Whilst not fatal, it results in a', & 'loss of resolution so is a bit of a waste of cpu time.' print "(4(/,3x,a))",'If you are attempting to perform a "resolution study" by increasing the', & 'neighbour number, this is a *bad idea*, as you are also increasing h.', & '(a better way is to increase the smoothness of the integrals without changing h', & ' by adopting a smoother kernel such as the M5 Quintic that goes to 3h).' endif print "(/,3x,a,/,3x,a,/)", & 'A good default range is h = 1.2-1.3 (m/rho)^1/ndim ', & 'corresponding to around 58-75 neighbours in 3D.' else print "(/,1x,a,f5.1,a,/,1x,a,f5.2,a,i1,a,/)", & 'Simulations employ ',4./3.*pi*(2.*hfact)**3,' neighbours,', & 'corresponding to h = ',hfact,'*(m/rho)^(1/',ndim,') in 3D' endif endif else !print*,'not true' endif ! !--cover the special case where no particles have been read ! if (ntotall <= 0) then npartoftype(1,i) = 1 dat(:,:,i) = 0. endif if (nstepsread > 0) then print*,'>> last step ntot =',sum(npartoftype(:,istepstart+nstepsread-1)) endif return contains !!----------------------------------------------------------------- !! small utility to transparently handle block labelled data read !!----------------------------------------------------------------- subroutine read_blockheader(idumpfmt,lun,nexpected,ndumped,blklabel,lenblk,nvec,ngas) integer, intent(in) :: idumpfmt,lun,nexpected integer, intent(out) :: ndumped character(len=4), intent(out) :: blklabel integer, intent(out) :: lenblk integer, intent(out) :: nvec integer, intent(in) :: ngas blklabel = ' ' if (idumpfmt==2) then read(lun, iostat=ierr) blklabel,lenblk if (ierr /= 0) then ndumped = 0 return endif if (blklabel=='POS ' .OR. blklabel=='VEL ' .OR. blklabel=='ACCE' .OR. blklabel=='BFLD' .OR. & blklabel=='BPOL' .OR. blklabel=='BTOR' .or. (lenblk-8)/12==ngas) then ndumped = (lenblk-8)/12 nvec = 3 else ndumped = (lenblk-8)/4 nvec = 1 endif !print*,blklabel,lenblk,ndumped,nexpected !if (nexpected > 0) then ! if (ndumped /= nexpected) then ! print*,'warning: number of '//blklabel//' dumped (',ndumped,') /= expected (',nexpected,')' ! endif !endif else ndumped = nexpected endif end subroutine read_blockheader end subroutine read_data_gadget !------------------------------------------------------------ ! allocate temporary memory, but avoid reallocating ! memory if size is the same !------------------------------------------------------------ subroutine allocate_temp(dattemp,isize,jsize) use params, only:sing_prec real(kind=sing_prec), allocatable, intent(inout) :: dattemp(:,:) integer, intent(in) :: isize,jsize if (allocated(dattemp)) then if (size(dattemp(:,1)) /= isize .or. size(dattemp(1,:)) /= jsize) then deallocate(dattemp) endif endif if (.not.allocated(dattemp)) then allocate(dattemp(isize,jsize)) endif end subroutine allocate_temp !------------------------------------------------------------ ! allocate temporary memory, but avoid reallocating ! memory if size is the same !------------------------------------------------------------ subroutine allocate_temp1(dattemp1,jsize) use params, only:sing_prec real(kind=sing_prec), allocatable, intent(inout) :: dattemp1(:) integer, intent(in) :: jsize if (allocated(dattemp1)) then if (size(dattemp1(:)) /= jsize) then deallocate(dattemp1) endif endif if (.not.allocated(dattemp1)) then allocate(dattemp1(jsize)) endif end subroutine allocate_temp1 !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_gadget use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass,lenlabel,set_vector_labels, & ih,irho,ipr,iutherm,iBfirst,iBpol,iBtor,idivB,iax,make_vector_label use params use settings_data, only:ndim,ndimV,ncolumns,ntypes,UseTypeInRenderings,iformat use geometry, only:labelcoord use system_utils, only:envlist,ienvironment use asciiutils, only:lcase integer :: i,nextracols,nstarcols,icol,ihset character(len=30), dimension(10) :: labelextra character(len=lenlabel) :: tmplabel if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_gadget ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_gadget ***' return endif if (iformat==2) then icol = 0 do i=1,size(blocklabelgas) icol = icol + 1 select case(trim(blocklabelgas(i))) case('POS') ix(1) = icol ix(2) = icol+1 ix(3) = icol+2 case('VEL') ivx = icol case('ACCE') iax = icol case('BFLD') iBfirst = icol case('BPOL') iBpol = icol case('BTOR') iBtor = icol case('MASS') ipmass = icol case('U') iutherm = icol case('RHO') irho = icol case('NE') label(icol) = 'N_{e}' case('NH') label(icol) = 'N_{H}' case('HSML') ih = icol case('NHP') label(icol) = 'N_{H+}' case('NHE') label(icol) = 'N_{He}' case('NHEP') label(icol) = 'N_{He+}' case('elec') label(icol) = 'N_{e}' case('HI') label(icol) = 'HI' case('HII') label(icol) = 'HII' case('HeI') label(icol) = 'HeI' case('HeII') label(icol) = 'HeII' case('H2I') label(icol) = 'H_{2}I' case('H2II') label(icol) = 'H_{2}II' case('HM') label(icol) = 'HM' case('HD') label(icol) = 'HD' case('DI') label(icol) = 'DI' case('DII') label(icol) = 'DII' case('HeHp') label(icol) = 'He Hp' case('SFR') label(icol) = 'Star Formation Rate' case('AGE') label(icol) = 'Stellar Formation Time' case('DETI') label(icol) = 'Delay Time' case('HSMS') label(icol) = 'Stellar Smoothing Length' case('ACRS') label(icol) = 'Stellar Spreading Length' case('Z') label(icol) = 'Metallicity' case('POT') label(icol) = 'Potential' case('IPOT') label(icol) = 'Integrated Potential' case('PHID') label(icol) = 'DPotential Dt' case('ENDT') label(icol) = 'Rate Of Change Of Entropy' case('STRD') label(icol) = 'Diagonal Stress Tensor' case('STRO') label(icol) = 'Off Diagonal Stress Tensor' case('STRB') label(icol) = 'Bulk Stress Tensor' case('SHCO') label(icol) = 'Shear Coefficient' case('TSTP') label(icol) = 'Time Step' case('BFSM') label(icol) = 'Smoothed Magnetic Field' case('DBDT') label(icol) = 'dB/dt' case('VBLK') label(icol) = 'Bulk Velocity' case('VRMS') label(icol) = 'RMSVelocity' case('VTAN') label(icol) = 'RMSTangential Velocity' case('VRAD') label(icol) = 'RMSRadial Velocity' case('MHIX') label(icol) = 'Main Halo Index' case('TNGB') label(icol) = 'True Number Of Neighbours' case('NGB') label(icol) = 'True Number Of Neighbours' case('DPP') label(icol) = 'Magnetos Reacc Coefficient' case('VDIV') label(icol) = 'Velocity Divergence' case('VROT') label(icol) = 'Velocity Curl' case('VORT') label(icol) = 'Vorticity' case('DIVB') label(icol) = 'div B' idivB = icol case('RDIB') label(icol) = 'h|div B|/|B|' case('ABVC') label(icol) = 'alpha_{visc}' case('ACVC') label(icol) = 'alpha_{cond}' case('AMDC') label(icol) = 'alpha_{resist}' case('VTRB') label(icol) = 'Turb Velociy' case('LTRB') label(icol) = 'Turb Length' case('ADYN') label(icol) = 'Alpha Dynamo' case('EDYN') label(icol) = 'Eta Dynamo' case('PHI') label(icol) = 'DPotential Dt' case('XPHI') label(icol) = 'Cold Gas Fraction (\Phi)' case('GPHI') label(icol) = 'Div B cleaning Function Grad Phi' case('ROTB') label(icol) = 'Rotation B' case('SRTB') label(icol) = 'Smoothed Rotation B' case('EULA') label(icol) = 'Euler Potential A' case('EULB') label(icol) = 'Euler Potential B' case('COOR') label(icol) = 'Cooling Rate' case('CONR') label(icol) = 'Conduction Rate' case('DENN') label(icol) = 'Number density' case('EGYP') label(icol) = 'Energy Reservoir For Feedback' case('EGYC') label(icol) = 'Energy Reservoir For Cold Phase' case('CRC0') label(icol) = 'Cosmic Ray C0' case('CRQ0') label(icol) = 'Cosmic Ray q0' case('CRP0') label(icol) = 'Cosmic Ray P0' case('CRE0') label(icol) = 'Cosmic Ray E0' case('CRn0') label(icol) = 'Cosmic Ray n0' case('CRco') label(icol) = 'Cosmic Ray Thermalization Time' case('CRdi') label(icol) = 'Cosmic Ray Dissipation Time' case('BHMA') label(icol) = 'Black hole mass' case('ACRB') label(icol) = 'Black hole Accretion Length' case('BHMD') label(icol) = 'Black hole Mdot' case('BHPC') label(icol) = 'Black hole NProgs' case('BHMB') label(icol) = 'Black hole Mass bubbles' case('BHMI') label(icol) = 'Black hole Mass initial' case('BHMR') label(icol) = 'Black hole Mass radio' case('VSIG') label(icol) = 'Maximum Signal Velocity' case('MACH') label(icol) = 'Mach Number' case('SHSP') label(icol) = 'Shock Speed' case('SHRH') label(icol) = 'Shock Upstr Density' case('SHPU') label(icol) = 'Shock Upstr Pressure' case('SHPD') label(icol) = 'Shock Downstr Pressure' case('SHVU') label(icol) = 'Shock Upstr Velocity' case('SHVD') label(icol) = 'Shock Downstr Velocity' case('MALF') label(icol) = 'Alfven Mach Number' case('SHAU') label(icol) = 'Shock Upstr Alfven' case('SHAD') label(icol) = 'Shock Downstr Alfven' case('SHOB') label(icol) = 'Shock Obliquity' case('SHCP') label(icol) = 'Shock Compression Ratio' case('SHNR') label(icol) = 'Shock Normal' case('DTEG') label(icol) = 'Dt Energy' case('PSCS') label(icol) = 'Preshock Sound Speed' case('PSDE') label(icol) = 'Preshock Density' case('PSEN') label(icol) = 'Preshock Energy' case('PSXC') label(icol) = 'Preshock XCR' case('DJMP') label(icol) = 'Density Jump' case('EJMP') label(icol) = 'Energy Jump' case('CRDE') label(icol) = 'CR_Dt E' case('TIPS') label(icol) = 'Tidal Tensor PS' case('DIPS') label(icol) = 'Distortion Tensor PS' case('CACO') label(icol) = 'Caustic Counter' case('FLDE') label(icol) = 'Flow Determinant' case('STDE') label(icol) = 'Stream Density' case('SOMA') label(icol) = '2lpt mass' case('ANRA') label(icol) = 'Annihilation Radiation' case('LACA') label(icol) = 'Last Caustic' case('SHOR') label(icol) = 'Sheet Orientation' case('INDE') label(icol) = 'Init Density' case('TEMP') label(icol) = 'Temperature' case('XNUC') label(icol) = 'Nuclear mass fractions' case('P') label(icol) = 'Coordinates' case('RADG') label(icol) = 'photon number density' case('RADA') label(icol) = 'rad acceleration' case('ET') label(icol) = 'Delay Time' case('PTSU') label(icol) = 'PSum' case('DMNB') label(icol) = 'Dark matter number of neighbours' case('NTSC') label(icol) = 'Num Total Scatter' case('SHSM') label(icol) = 'SIDM smoothing length' case('SRHO') label(icol) = 'SIDM density' case('SVEL') label(icol) = 'SVel Disp' case('DMHS') label(icol) = 'SIDM smoothing length' case('DMDE') label(icol) = 'SIDM density' case('DMVD') label(icol) = 'DM Velocity Dispersion' case('Zs') label(icol) = 'Mass of Metals' case('CII') label(icol) = 'Contribution by SNII' case('CIa') label(icol) = 'Contribution by SNIa' case('CAGB') label(icol) = 'Contribution by AGB' case('ZAge') label(icol) = 'Metallicity-averaged time' case('ZAlv') label(icol) = 'long-living-Metallicity-averaged time' case('iM') label(icol) = 'SSPInitial Mass' case('CLDX') label(icol) = 'Cloud Fraction' case('HOTT') label(icol) = 'Hot Phase Temperature' case('TRCK') label(icol) = 'Track Contributes' case('ZsMT') label(icol) = 'smoothed metallicity' case('ZSMT') label(icol) = 'smoothed metallicities (all elements)' case('MHOT') label(icol) = 'Hot mass' case('MCLD') label(icol) = 'Cold mass' case('MMOL') label(icol) = 'Molecular mass' case('EHOT') label(icol) = 'Hot energy' case('MSF') label(icol) = 'Star formation mass' case('MFST') label(icol) = 'Multi Phase Steps' case('NMF') label(icol) = 'Num Times In MF' case('EOUT') label(icol) = 'Energy To Other' case('CLCK') label(icol) = 'Multi Phase Clock' case('Egy0') label(icol) = 'Multi Phase Energy Tot0' case('TDYN') label(icol) = 'Cold Phase TDyn' case('EREC') label(icol) = 'Energy From Other' case('GRAD') label(icol) = 'Div B cleaning grad Psi' case('TCOO') label(icol) = 'Cooling Time' case('EKRC') label(icol) = 'Kinetic Energy From Last Snap' case('TSMP') label(icol) = 't_start MP' case('CRpN') label(icol) = 'LMBCRp Normalization' case('CReN') label(icol) = 'LMBCRp Normalization' case('CRpS') label(icol) = 'LMBCRp Slope' case('CReS') label(icol) = 'LMBCRe Slope' case('CRpC') label(icol) = 'LMBCRp Cut' case('CReC') label(icol) = 'LMBCRe Cut' case('CRpP') label(icol) = 'LMBCRp Pressure' case('CReP') label(icol) = 'LMBCRe Pressure' case('RHOO') label(icol) = 'Density Old' case('SYNE') label(icol) = 'LMBCRe Synchrotron' case('AGSH') label(icol) = 'AGS Softening' case('AGSD') label(icol) = 'AGS Density' case('AGSZ') label(icol) = 'AGS Zeta' case('AGSO') label(icol) = 'AGS Omega' case('AGSC') label(icol) = 'AGS Correction' case('AGSN') label(icol) = 'AGS Neighbours' case('MGPH') label(icol) = 'Modified Gravity Phi' case('MGGP') label(icol) = 'Modified Gravity Grad Phi' case('MGAC') label(icol) = 'Modified Gravity Acceleration' case('GRDU') label(icol) = 'Internal Energy Gradient' case('GRDP') label(icol) = 'Pressure Gradient' case('MGVX') label(icol) = 'Gradient of x-velocity for MFM' case('MGVY') label(icol) = 'Gradient of y-velocity for MFM' case('MGVZ') label(icol) = 'Gradient of z-velocity for MFM' case('MGRH') label(icol) = 'Gradient of density for MFM' case('MGU') label(icol) = 'Gradient of specific internal energy for MFM' case('QP') label(icol) = 'Quantum Pressure' case('QDP') label(icol) = 'Quantum Pressure Gradient' case('RHOS') label(icol) = 'Stellar Density Around Stars' case('SMTS') label(icol) = 'Smoothing Length for Stellar Density' case('NEIS') label(icol) = 'Number Of Neighbours for Stellar Density' case('ID ') icol = icol - 1 case default label(icol) = trim(lcase(blocklabelgas(i))) end select enddo else do i=1,ndim ix(i) = i enddo ivx = 4 ipmass = 7 irho = 9 ! location of rho in data array ipr = 0 iutherm = 8 ! thermal energy if (iformat==1 .or. iformat==11 .and. ncolumns > 10) then label(10) = 'Ne' label(11) = 'Nh' ih = 12 ! smoothing length if (iformat==11) label(13) = 'Star formation rate' else ih = 10 if (iformat==1) label(11) = 'Star formation rate' endif ihset = ienvironment('GSPLASH_HCOLUMN',errval=-1) if (ihset > 0) ih = ihset ! !--deal with extra columns ! if (ncolumns > ih) then call envlist('GSPLASH_EXTRACOLS',nextracols,labelextra) do i=ih+1,ih+nextracols label(i) = trim(labelextra(i-ih)) enddo call envlist('GSPLASH_STARPARTCOLS',nstarcols,labelextra) do i=ih+nextracols+1,ih+nextracols+nstarcols label(i) = trim(labelextra(i-ih-nextracols)) enddo endif endif ! !--set labels of the quantities read in ! if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) if (irho > 0) label(irho) = 'density' if (iutherm > 0) label(iutherm) = 'u' if (ipmass > 0) label(ipmass) = 'particle mass' if (ih > 0) label(ih) = 'h' call set_vector_labels(ncolumns,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('a',iax,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('B',iBfirst,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('B_{pol}',iBpol,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('B_{tor}',iBtor,ndimV,iamvec,labelvec,label,labelcoord(:,1)) !--set labels for each particle type ! ntypes = 6 labeltype(1) = 'gas' labeltype(2) = 'dark matter' labeltype(3) = 'boundary 1' labeltype(4) = 'boundary 2' labeltype(5) = 'star' labeltype(6) = 'sink / black hole' UseTypeInRenderings(1) = .true. ! !--dark matter particles are of non-SPH type (ie. cannot be used in renderings) ! unless they have had a smoothing length defined ! if (hsoft > tiny(hsoft)) then UseTypeInRenderings(2) = .true. else UseTypeInRenderings(2) = .false. endif UseTypeInRenderings(3:6) = .false. end subroutine set_labels_gadget !----------------------------------------------------------- ! ! check if a file is in phantom/sphNG format ! !----------------------------------------------------------- logical function file_format_is_gadget(filename) result(is_gadget) use params, only:doub_prec character(len=*), intent(in) :: filename integer :: iunit,ierr,lenblock real(doub_prec) :: time,z real(doub_prec) :: massoftypei(6) character(len=4) :: blocklabel integer :: noftype(6),Nall(6),iFlagSfr,iFlagFeedback,iFlagcool,nfiles is_gadget = .false. ! ! open file and read the first line ! open(newunit=iunit,iostat=ierr,file=filename,status='old',form='unformatted') if (ierr /= 0) return ! ! attempt to read the first line of the header ! noftype(:) = -1 massoftypei(:) = -1. time = -1. z = -1. iFlagSfr = -1 read(iunit,iostat=ierr) noftype(1:6),massoftypei(1:6),time,z,iFlagSfr,& iFlagFeedback,Nall(1:6),iFlagCool,nfiles !print*,' got ',ierr,noftype(1:6),massoftypei(1:6),time,z,iFlagSfr, & ! iFlagFeedback,Nall(1:6),iFlagCool,nfiles if (ierr==0 .and. all(noftype(1:6) >= 0) .and. all(massoftypei >= 0.) & .and. time >= 0. .and. iFlagSfr >= 0 .and. iFlagCool >= 0 & .and. iFlagFeedback >= 0 .and. all(nall(1:6) >= 0) .and. nfiles >= 0 & .and. nfiles <= 1e6) is_gadget = .true. if (.not.is_gadget) then rewind(iunit) ! try block labelled gadget format read(iunit,iostat=ierr) blocklabel,lenblock if (ierr == 0 .and. lenblock == 264) then auto_detected_block_format = .true. is_gadget = .true. endif endif close(iunit) ! close the file end function file_format_is_gadget end module readdata_gadget danieljprice-splash-4d1f09c/src/read_data_gadget_hdf5.f90000066400000000000000000001042001477365367100233230ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR HDF5 OUTPUT FROM THE GADGET CODE ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! ENVIRONMENT VARIABLES: ! ! GSPLASH_USE_Z if 'YES' uses redshift in the legend instead of time ! GSPLASH_USE_IDS if 'YES' resorts particles according to their ParticleIDs ! GSPLASH_DARKMATTER_HSOFT if given a value > 0.0 will assign a ! smoothing length to dark matter particles which can then be ! used in the rendering ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Partial data read implemented Nov 2006 means that columns with ! the 'required' flag set to false are not read (read is therefore much faster) !------------------------------------------------------------------------- ! ! The module below contains interface routines to c functions ! that perform the actual calls to the HDF5 libs ! !------------------------------------------------------------------------- module readdata_gadget_hdf5 use params, only:maxplot,doub_prec use labels, only:lenlabel use, intrinsic :: iso_c_binding, only:c_int,c_double,c_char implicit none real :: hsoft character(len=lenlabel), dimension(maxplot) :: blocklabelgas integer, dimension(maxplot) :: blocksize logical :: havewarned = .false. integer, parameter :: maxtypes = 6 logical :: useids = .false. logical :: arepo = .false. public :: read_data_gadget_hdf5, set_labels_gadget_hdf5 interface subroutine read_gadget_hdf5_header(filename,maxtypes,maxhdr,npartoftypei,massoftypei,& timeh,zh,headervals,iFlagSfr,iFlagFeedback,Nall,iFlagCool, & igotids,ndim,ndimV,nfiles,ncol,ierr) bind(c) import character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(in), value :: maxtypes,maxhdr integer(kind=c_int), intent(out) :: iFlagSfr,iFlagFeedback,iFlagCool,igotids integer(kind=c_int), dimension(6), intent(out) :: npartoftypei,Nall real(kind=c_double), dimension(6), intent(out) :: massoftypei real(kind=c_double), intent(out) :: timeh,zh real(kind=c_double), dimension(maxhdr), intent(out) :: headervals integer(kind=c_int), intent(out) :: ndim,ndimV,nfiles,ncol,ierr end subroutine read_gadget_hdf5_header subroutine read_gadget_hdf5_data(filename,maxtypes,npartoftypei,& ncol,isrequired,i0,ierr) bind(c) import character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(in), value :: maxtypes integer(kind=c_int), dimension(6), intent(in) :: npartoftypei integer(kind=c_int), intent(in), value :: ncol integer(kind=c_int), intent(out) :: ierr integer(kind=c_int), dimension(ncol), intent(in) :: isrequired integer(kind=c_int), dimension(maxtypes), intent(in) :: i0 end subroutine read_gadget_hdf5_data end interface contains !--------------------------------------------------------------------------- ! ! function to safely convert a string from c format (ie. with a terminating ! ascii null character) back to a normal Fortran string ! !--------------------------------------------------------------------------- function fstring(array) character(kind=c_char), dimension(:), intent(in) :: array character(len=size(array)-1) :: fstring integer :: i fstring = '' do i=1,size(array) if (array(i)==achar(0)) exit fstring(i:i) = array(i) enddo end function fstring !--------------------------------------------------------------------------- ! ! function to reformat the HDF5 label into the splash column label ! by inserting a space whereever a capital letter occurs ! !--------------------------------------------------------------------------- function reformatlabel(label) character(len=*), intent(in) :: label character(len=2*len(label)) :: reformatlabel integer :: is,ia,ib,ip reformatlabel = label ip = 1 do is = 2, len_trim(label) ip = ip + 1 ia = iachar(reformatlabel(ip:ip)) ib = iachar(reformatlabel(ip-1:ip-1)) if ((ia >= iachar('A').and.ia <= iachar('Z')) .and. .not. & (ib >= iachar('A').and.ib <= iachar('Z'))) then reformatlabel = reformatlabel(1:ip-1)//' '//reformatlabel(ip:) ip = ip + 1 endif enddo end function reformatlabel !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- subroutine read_data_gadget_hdf5(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,headervals,maxpart,maxcol,maxstep use params, only:doub_prec,maxparttypes,maxplot,maxhdr use settings_data, only:ndim,ndimV,ncolumns,ncalc,required,ipartialread, & ntypes,debugmode,iverbose use mem_allocation, only:alloc use labels, only:ih,irho,ipmass use system_utils, only:renvironment,lenvironment,ienvironment,envlist use asciiutils, only:cstring integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile,densfile,hfile character(len=20) :: string integer, dimension(maxparttypes) :: npartoftypei,Nall integer :: i,j,itype,ierr,ierrh,ierrrho,nhset,ifile integer :: index1,index2 integer :: ncolstep,npart_max,nstep_max,ntoti,ntotall,idot integer :: iFlagSfr,iFlagFeedback,iFlagCool,igotids,nfiles,nhfac integer, dimension(6) :: i0 integer, parameter :: iunit = 11, iunitd = 102, iunith = 103 logical :: iexist,reallocate,debug,goterrors,compute_h_from_rho_m real(doub_prec) :: timetemp,ztemp,headervalstmp(maxhdr) real(doub_prec), dimension(6) :: massoftypei real :: hfact,hfactmean,pmassi real, parameter :: pi = 4.*atan(1.) integer, dimension(maxplot) :: isrequired nstepsread = 0 goterrors = .false. compute_h_froM_rho_m = .false. if (maxparttypes < 6) then print*,' *** ERROR: not enough particle types for GADGET data read ***' print*,' *** you need to edit splash parameters and recompile ***' stop endif if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! useids = lenvironment('GSPLASH_USEIDS') .or. lenvironment('GSPLASH_CHECKIDS') if (useids) then print "(1x,a)",'reading GADGET HDF5 format: sorted by particle id (--useids)' else print "(1x,a)",'reading GADGET HDF5 format: use --useids to sort by particle id' endif inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--look for a file with .0 on the end for multiple-file reads ! datfile=trim(rootname)//'.0.hdf5' inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif endif ! !--set parameters which do not vary between timesteps ! ndim = 0 ndimV = 0 ! idumpformat = ienvironment('GSPLASH_FORMAT') ! checkids = lenvironment('GSPLASH_CHECKIDS') debug = lenvironment('GSPLASH_DEBUG') .or. debugmode ! !--read data from snapshots ! i = istepstart ! !--i0 is the offset used to read the data into the arrays ! (non-zero for read from multiple files) ! The offset is different for each particle type, somewhat ! complicating the data read -- we shuffle the particles from ! multiple files so that they are in type order. ! i0(:) = 0 ! !--loop over the number of files ! ifile = 0 ntotall = 0 over_files: do while(iexist) write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ifile = ifile + 1 ! !--open file and read header information ! npartoftypei(:) = 0. Nall(:) = 0. massoftypei(:) = 0. if (debug) print*,'DEBUG: reading header...' call read_gadget_hdf5_header(cstring(datfile),maxtypes,maxhdr, & npartoftypei,massoftypei,timetemp,ztemp,headervalstmp,& iFlagSfr,iFlagFeedback,Nall,iFlagCool,igotids,ndim,ndimV,& nfiles,ncolstep,ierr) if (ierr /= 0) then print "(a)", '*** ERROR READING HEADER ***' return endif ! read(iunit,iostat=ierr) npartoftypei(1:6),massoftypei,timetemp,ztemp, & ! iFlagSfr,iFlagFeedback,Nall(1:6),iFlagCool,nfiles ntoti = int(sum(npartoftypei(1:6))) ! int here is unnecessary, but avoids compiler warnings if (nfiles > 1) then ntotall = int(sum(Nall(1:6))) else ntotall = ntoti endif ! !--if we are reading from multiple files, ! check that the sequence starts from the correct file ! if (nfiles > 1) then idot = index(datfile,'.hdf5') idot = index(datfile(1:idot-1),'.',back=.true.) if (ifile==1 .and. datfile(idot:idot+1) /= '.0') then if (nfiles < 100) then string = "(/,a,i2,a,/,a,/)" else string = "(/,a,i7,a,/,a,/)" endif print string,' ERROR: read is from multiple files (nfiles = ',nfiles,')',& ' but this is not the first file (does not end in .0.hdf5): skipping...' close(iunit) return endif endif if (ifile==1) then ncolumns = ncolstep ! !--call set labels to get ih, ipmass, irho for use in the read routine ! hsoft = 0. ! to avoid unset variable call set_labels_gadget_hdf5 endif if (ifile==1) then print*,'time : ',timetemp print "(1x,a,f8.2)",'z (redshift) : ',ztemp endif print "(a,6(1x,i10))",' Npart (by type) : ',npartoftypei(1:6) if (any(massoftypei > 0.)) print "(a,6(1x,es10.3))",' Mass (by type) : ',massoftypei print "(a,6(1x,i10))",' N_gas : ',npartoftypei(1) print "(a,1x,i10)",' N_total : ',ntoti if (ifile==1) print "(a,1x,i10)",' N data columns : ',ncolstep if (nfiles > 1 .and. ifile==1) then print "(a,6(1x,i10))",' Nall : ',Nall(1:6) endif if (nfiles > 1) then if (ifile==1) print "(a,i4,a)",' reading from ',nfiles,' files' elseif (nfiles <= 0) then print*,'*** ERROR: nfiles = ',nfiles,' in file header: aborting' return endif if (ifile==1) then !--Softening lengths for Dark Matter Particles... hsoft = renvironment('GSPLASH_DARKMATTER_HSOFT') ! !--try to read dark matter and star particle smoothing lengths and/or density from a separate ! one column ascii file. If only density, use this to compute smoothing lengths. ! densfile = trim(rootname)//'.dens' hfile = trim(rootname)//'.hsml' hfact = 1.2 ! related to the analytic neighbour number (hfact=1.2 gives 58 neighbours in 3D) open(unit=iunitd,file=densfile,iostat=ierrrho,status='old',form='formatted') open(unit=iunith,file=hfile,iostat=ierrh,status='old',form='formatted') if (ih==0 .and. (hsoft > tiny(hsoft) .or. ierrrho==0 .or. ierrh==0)) then ncolumns = ncolumns + 1 blocklabelgas(ncolumns) = 'SmoothingLength' ih = ncolumns call set_labels_gadget_hdf5 endif if (irho==0 .and. (hsoft > tiny(hsoft) .or. ierrrho==0 .or. ierrh==0)) then ncolumns = ncolumns + 1 blocklabelgas(ncolumns) = 'Density' irho = ncolumns call set_labels_gadget_hdf5 endif ! !--if h is still not there, try to set h from density and masses ! if (ih==0 .and. irho > 0 .and. ipmass > 0) then ncolumns = ncolumns + 1 blocklabelgas(ncolumns) = 'SmoothingLength' ih = ncolumns call set_labels_gadget_hdf5 compute_h_from_rho_m = .true. endif ! !--if successfully read header, increment the nstepsread counter ! nstepsread = nstepsread + 1 endif ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntotall) else ! if first time, save on memory npart_max = int(ntotall) endif endif if (i >= maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then if (igotids==1) then call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol),mixedtypes=.true.) else call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol)) endif endif masstype(1:6,i) = massoftypei(1:6) ! !--copy npartoftypei into allocated header arrays ! and set the offset position of particle types in the main data arrays ! if (nfiles==1 .or. ifile==1) then i0(1) = 0 do itype=2,ntypes if (nfiles==1) then i0(itype) = sum(npartoftypei(1:itype-1)) ! this is avoid depending on Nall at all for single file read else i0(itype) = sum(Nall(1:itype-1)) endif enddo npartoftype(:,i) = npartoftypei else i0(1) = npartoftype(1,i) do itype=2,ntypes i0(itype) = sum(Nall(1:itype-1)) + npartoftype(itype,i) enddo npartoftype(:,i) = npartoftype(:,i) + npartoftypei endif if (debugmode) print*,'DEBUG: starting position for each type in data array: ',i0(:) ! !--set time to be used in the legend ! if (ifile==1) then !--use this line for code time time(i) = real(timetemp) headervals(:,i) = real(headervalstmp(:)) else if (abs(real(timetemp)-time(i)) > tiny(0.)) print*,'ERROR: time different between files in multiple-file read ' if (sum(Nall) /= ntotall) then print*,' ERROR: Nall differs between files' goterrors = .true. endif endif ! !--read particle data ! got_particles: if (ntoti > 0) then isrequired(:) = 0 where (required(1:ncolumns)) isrequired(1:ncolumns) = 1 call read_gadget_hdf5_data(cstring(datfile),maxtypes,npartoftypei,ncolumns,isrequired,i0,ierr) endif got_particles ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ! !--set flag to indicate that only part of this file has been read ! if (.not.all(required(1:ncolstep))) ipartialread = .true. ! !--for read from multiple files, work out the next file in the sequence ! iexist = .false. if (nfiles > 1 .and. ifile < nfiles) then !--see if the next file exists idot = index(datfile,'.hdf5') idot = index(datfile(1:idot-1),'.',back=.true.) if (idot <= 0) then print "(a)",' ERROR: read from multiple files but could not determine next file in sequence' goterrors = .true. else write(string,*) ifile if (ifile < 10) then write(datfile,"(a,i1)") trim(datfile(1:idot))//trim(adjustl(string))//'.hdf5' elseif (ifile < 100) then write(datfile,"(a,i2)") trim(datfile(1:idot))//trim(adjustl(string))//'.hdf5' else write(datfile,"(a,i3)") trim(datfile(1:idot))//trim(adjustl(string))//'.hdf5' endif iexist = .false. inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' ERROR: read from multiple files '// & 'but could not find '//trim(datfile)//': next in sequence' goterrors = .true. endif endif endif enddo over_files if (compute_h_from_rho_m) then dat(1:npartoftype(1,i),ih,i) = (dat(1:npartoftype(1,i),ipmass,i)/dat(1:npartoftype(1,i),irho,i))**(1./3.) print "(a)",' this is an AREPO snapshot: using (m/rho)**(1/3) as smoothing length' elseif (arepo .and. ih > 0) then dat(1:npartoftype(1,i),ih,i) = dat(1:npartoftype(1,i),ih,i)**(1./3.) print "(a)",' this is an AREPO snapshot, using Volume**(1./3.) as smoothing length' elseif (ih > 0 .and. required(ih) .and. size(dat,2) >= ih .and. npartoftype(1,i) > 0) then ! !--for some reason the smoothing length output by GADGET is ! twice the usual SPH smoothing length ! (do this after we have read data from all of the files) ! print "(a)",' converting GADGET h on gas particles to usual SPH definition (x 0.5)' dat(1:npartoftype(1,i),ih,i) = 0.5*dat(1:npartoftype(1,i),ih,i) endif if (nfiles > 1. .and. any(npartoftype(1:6,i) /= Nall(1:6))) then print*,'ERROR: sum of Npart across multiple files /= Nall in data read ' print*,'Npart = ',npartoftype(1:6,i) print*,'Nall = ',Nall(1:6) goterrors = .true. endif ! !--look for dark matter smoothing length/density files ! if (ierrh==0 .or. ierrrho==0) then if (ierrh==0) then print "(a)",' READING DARK MATTER SMOOTHING LENGTHS from '//trim(hfile) ierr = 0 index1 = npartoftype(1,i)+1 index2 = npartoftype(1,i)+sum(npartoftype(2:,i)) read(iunith,*,iostat=ierr) (dat(j,ih,i),j=index1,index2) close(unit=iunith) if (ierr < 0) then nhset = 0 do j=index1,index2 if (dat(j,ih,i) > 0.) nhset = nhset + 1 enddo print "(a,i10,a,/)",' *** END-OF-FILE: GOT ',nhset,' SMOOTHING LENGTHS ***' elseif (ierr > 0) then print "(a)", ' *** ERROR reading smoothing lengths from file' goterrors = .true. else print "(a,i10,a)",' SMOOTHING LENGTHS READ OK for ',index2-index1+1,' dark matter / star particles ' endif hsoft = 1.0 ! just so dark matter rendering is allowed in set_labels_gadget_hdf5 routine endif if (ierrrho==0) then print "(a)",' READING DARK MATTER DENSITIES FROM '//trim(densfile) ierr = 0 index1 = npartoftype(1,i)+1 index2 = npartoftype(1,i)+sum(npartoftype(2:,i)) read(iunitd,*,iostat=ierr) (dat(j,irho,i),j=index1,index2) close(iunitd) if (ierr < 0) then nhset = 0 do j=index1,index2 if (dat(j,irho,i) > 0.) nhset = nhset + 1 enddo print "(a,i10,a,/)",' *** END-OF-FILE: GOT ',nhset,' DENSITIES ***' elseif (ierr > 0) then print "(a)", ' *** ERROR reading dark matter densities from file' goterrors = .true. else print "(a,i10,a)",' DENSITY READ OK for ',index2-index1+1,' dark matter / star particles ' endif if (ierrh /= 0 .and. ipmass > 0) then where(dat(:,irho,i) > tiny(dat)) dat(:,ih,i) = hfact*(dat(:,ipmass,i)/dat(:,irho,i))**(1./3.) elsewhere dat(:,ih,i) = 0. end where print "(a,i10,a,f5.2,a)", & ' SMOOTHING LENGTHS SET for ',index2-index1+1,' DM/star particles using h = ',hfact,'*(m/rho)**(1/3)' endif hsoft = 1.0 ! just so dark matter rendering is allowed in set_labels_gadget_hdf5 routine endif else ! !--if a value for the dark matter smoothing length is set ! via the environment variable GSPLASH_DARKMATTER_HSOFT, ! give dark matter particles this smoothing length ! and a density of 1 (so column density plots work) ! if (hsoft > tiny(hsoft)) then if (required(ih)) then print "(a,1pe10.3,a)",' ASSIGNING SMOOTHING LENGTH of h = ',hsoft, & ' to dark matter particles' !print*,'ih = ',ih,' npartoftype = ',npartoftype(1:2,i), shape(dat) if (ih > 0) then dat(npartoftype(1,i)+1:npartoftype(1,i)+npartoftype(2,i),ih,i) = hsoft else print*,' ERROR: smoothing length not found in data arrays' goterrors = .true. endif endif if (required(irho)) then if (irho > 0) then dat(npartoftype(1,i)+1:npartoftype(1,i)+npartoftype(2,i),irho,i) = 1.0 else print*,' ERROR: place for density not found in data arrays' goterrors = .true. endif endif else if (npartoftype(1,i) <= 0 .and. sum(npartoftype(:,i)) > 0) then print "(66('*'),4(/,a),/)",'* NOTE!! For GADGET data using dark matter only, column density ',& '* plots can be produced by setting the GSPLASH_DARKMATTER_HSOFT ',& '* environment variable to give the dark matter smoothing length', & '* (for a fixed smoothing length)' hsoft = (maxval(dat(:,1,i)) - minval(dat(:,1,i)))/sum(npartoftype(2:,i))**(1./3.) print*,' suggested value for GSPLASH_DARKMATTER_HSOFT = ',hsoft hsoft = 0. print "(7(/,a),/)",'* Alternatively, and for best results, calculate a number density', & '* on dark matter particles, set individual smoothing lengths from', & '* this using h = hfact*(n)**(-1/3), with hfact=1.2 and either ', & '* dump the results back into the HSML array in the original dump ', & '* file (if using the block-labelled format), or create an ascii ',& '* file called '//trim(hfile)//' containing the smoothing length ',& '* values for the dark matter particles.' print "(2(/,a),/,66('*'),/)", '* Also make sure normalised interpolations are OFF when plotting ',& '* dark matter density ' endif endif endif ! !--pause with fatal errors ! if (goterrors .and. .not.lenvironment('GSPLASH_IGNORE_ERRORS')) then print "(/,a)",'*** ERRORS detected during data read: data will be corrupted' print "(a,/)",' Please REPORT this and/or fix your file ***' print "(a)",' (set GSPLASH_IGNORE_ERRORS=yes to skip this message)' if (iverbose >= 1) then print "(a)",' > Press any key to bravely proceed anyway <' read* endif endif ! !--give a friendly warning about using too few or too many neighbours ! (only works with equal mass particles because otherwise we need the number density estimate) ! if (ih > 0 .and. required(ih) .and. ipmass > 0 .and. required(ipmass) & .and. abs(massoftypei(1)) < tiny(0.) .and. ndim==3 .and. .not.havewarned & .and. .not.compute_h_from_rho_m) then nhfac = 100 if (npartoftype(1,i) > nhfac) then hfactmean = 0. do j=1,nhfac pmassi = dat(j,ipmass,i) if (pmassi > 0.) then pmassi = 1./pmassi else pmassi = 0. endif hfact = dat(j,ih,i)*(dat(j,irho,i)*pmassi)**(1./ndim) hfactmean = hfactmean + hfact enddo hfact = hfactmean/real(nhfac) havewarned = .true. ! CHECK that h is not implausibly small due to the multiply-by-0.5 -- if so, reverse this if (hfact < 0.75) then dat(1:npartoftype(1,i),ih,i) = dat(1:npartoftype(1,i),ih,i)*2.0 hfact = hfact*2.0 endif if (hfact < 1.125 .or. hfact > 1.45) then print "(/,a)",'** FRIENDLY NEIGHBOUR WARNING! **' print "(3x,a,f5.1,a,/,3x,a,f4.2,a,i1,a)", & 'It looks like you are using around ',4./3.*pi*(2.*hfact)**3,' neighbours,', & 'corresponding to h = ',hfact,'*(m/rho)^(1/',ndim,') in 3D:' if (hfact < 1.15) then print "(4(/,3x,a))",'This is a quite a low number of neighbours for the cubic spline and ', & 'may result in increased noise and inaccurate wave propagation speeds', & '(a cubic lattice is also an unstable initial configuration for the ',& ' particles in this regime -- see Morris 1996, Borve et al. 2004).' elseif (hfact > 1.45) then print "(4(/,3x,a))",'Using h >~ 1.5*(m/rho)^(1/3) with the cubic spline results in the', & 'particle pairing instability due to the first neighbour being placed under', & 'the hump in the kernel gradient. Whilst not fatal, it results in a', & 'loss of resolution so is a bit of a waste of cpu time.' print "(4(/,3x,a))",'If you are attempting to perform a "resolution study" by increasing the', & 'neighbour number, this is a *bad idea*, as you are also increasing h.', & '(a better way is to increase the smoothness of the integrals without changing h', & ' by adopting a smoother kernel such as the M6 Quintic that goes to 3h).' endif print "(/,3x,a,/,3x,a,/)", & 'A good default is h = 1.2 (m/rho)^1/ndim ', & 'corresponding to around 58 neighbours in 3D.' else print "(/,1x,a,f5.1,a,/,1x,a,f4.2,a,i1,a,/)", & 'Simulations employ ',4./3.*pi*(2.*hfact)**3,' neighbours,', & 'corresponding to h = ',hfact,'*(m/rho)^(1/',ndim,') in 3D' endif endif else !print*,'not true' endif ! !--cover the special case where no particles have been read ! if (ntotall <= 0) then npartoftype(1,i) = 1 dat(:,:,i) = 0. endif if (nstepsread > 0) then print "(a,i10,a)",' >> read ',sum(npartoftype(:,istepstart+nstepsread-1)),' particles' endif end subroutine read_data_gadget_hdf5 subroutine read_gadgethdf5_data_fromc(icol,npartoftypei,temparr,id,itype,i0,name,iblock) bind(c) use, intrinsic :: iso_c_binding, only:c_int,c_double use particle_data, only:dat,iamtype use settings_data, only:debugmode use labels, only:label use system_utils, only:lenvironment integer(kind=c_int), intent(in) :: icol,npartoftypei,itype,i0,iblock real(kind=c_double), dimension(npartoftypei), intent(inout) :: temparr integer(kind=c_int), dimension(npartoftypei), intent(in) :: id character(kind=c_char), dimension(256), intent(in) :: name integer(kind=c_int) :: i,icolput integer :: ncolmax,nmax,nerr,idi character(len=256) :: datasetname logical :: matched datasetname = fstring(name) icolput = icol nmax = size(dat,1) ncolmax = size(dat,2) if (icolput > ncolmax .or. icolput==0) then print "(a,i2,a)",' ERROR: column = ',icolput,' out of range in receive_data_fromc' return endif matched = .true. if (trim(blocklabelgas(iblock)) /= trim(datasetname)) then matched = .false. do i=1,ncolmax if (trim(reformatlabel(datasetname))==trim(label(i))) then if (debugmode) print "(a,i0)",'DEBUG: matched '//trim(datasetname)//' to column ',i icolput = i matched = .true. endif enddo if (.not.matched) then temparr = 0. if (debugmode) print "(a,i0)",'DEBUG: Warning: skipping unmatched dataset '//& trim(datasetname)//' for particle type ',itype endif endif !useids = .not.lenvironment('GSPLASH_FIXID') if (all(id <= 0) .or. size(iamtype,1) <= 1) useids = .false. if (debugmode .and. matched) print "(a,i2,a,i2,a,i8,a,l1)",'DEBUG: reading column ',icol,& ' type ',itype,' -> '//trim(label(icolput))//', offset ',i0,' use IDs=',useids if (useids) then nerr = 0 !print*,' id range is ',minval(id),' to ',maxval(id),' type ',itype+1,' column = ',trim(label(icolput)) do i=1,npartoftypei idi = id(i) if (idi <= 0 .or. idi > nmax) then ! !--correct for particle IDs > 1e9 (used to represent recycled particles?) ! if (idi > 1000000000) then idi = idi - 1000000000 if (idi <= nmax .and. idi > 0) then dat(idi,icolput,1) = real(temparr(i)) iamtype(idi,1) = int(itype + 1,kind=kind(iamtype)) else nerr = nerr + 1 if (debugmode .and. nerr <= 10) print*,i,'fixed id = ',idi endif else nerr = nerr + 1 if (debugmode .and. nerr <= 10) print*,i,' id = ',idi,idi-1000000000 endif else dat(idi,icolput,1) = real(temparr(i)) iamtype(idi,1) = int(itype + 1,kind=kind(iamtype)) endif enddo if (nerr > 0) print*,'ERROR: got particle ids outside array dimensions ',nerr,' times' else if (i0 < 0) then print*,'ERROR: i0 = ',i0,' but should be positive: SOMETHING IS VERY WRONG...' return elseif (i0+npartoftypei > nmax) then print "(a,i8,a)",' ERROR: offset = ',i0,': read will exceed array dimensions in receive_data_fromc' nmax = nmax - i0 else nmax = npartoftypei endif do i=1,nmax dat(i0+i,icolput,1) = real(temparr(i)) enddo if (size(iamtype,1) > 1) then do i=1,nmax iamtype(i0+i,1) = int(itype + 1,kind=kind(iamtype)) enddo endif endif end subroutine read_gadgethdf5_data_fromc !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_gadget_hdf5 use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass, & ih,irho,ipr,iutherm,iBfirst,iax,make_vector_label use params use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings,debugmode use geometry, only:labelcoord use system_utils, only:envlist,ienvironment use asciiutils, only:lcase integer :: i,icol,irank if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_gadget_hdf5 ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_gadget_hdf5 ***' return endif icol = 1 ix = 0 do i=1,size(blocklabelgas) irank = blocksize(i) if (irank > 0 .and. (len_trim(blocklabelgas(i)) > 0)) then if (debugmode) print*,i,trim(blocklabelgas(i)) select case(blocklabelgas(i)) case('Coordinates') ix(1) = icol ix(2) = icol + 1 if (irank >= 3) ix(3) = icol + 2 case('Velocities','Velocity') ivx = icol case('SmoothingLength','SmoothingLengths') ih = icol case('Volume') ih = icol arepo = .true. case('Masses','Mass') ipmass = icol case('InternalEnergy','InternalEnergies') iutherm = icol case('Density','Densities') irho = icol case('MagneticField') iBfirst = icol case('Pressures','Pressure') ipr = icol end select label(icol:icol+irank-1) = reformatlabel(blocklabelgas(i)) if (irank==ndimV) then call make_vector_label(label(icol),icol,ndimV,iamvec,labelvec,label,labelcoord(:,1)) endif icol = icol + irank endif enddo ! !--set labels of the quantities read in ! if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) if (irho > 0) label(irho) = 'density' ! needed to convert to "column density" if (iutherm > 0) label(iutherm) = 'u' ! otherwise \int u dz looks ugly !if (ipmass > 0) label(ipmass) = 'particle mass' !if (ih > 0) label(ih) = 'h' ! !--set labels for vector quantities ! call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('a',iax,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('B',iBfirst,ndimV,iamvec,labelvec,label,labelcoord(:,1)) !--set labels for each particle type ! ntypes = 6 labeltype(1) = 'gas' labeltype(2) = 'dark matter' labeltype(3) = 'boundary 1' labeltype(4) = 'boundary 2' labeltype(5) = 'star' labeltype(6) = 'sink / black hole' UseTypeInRenderings(1) = .true. ! !--dark matter particles are of non-SPH type (ie. cannot be used in renderings) ! unless they have had a smoothing length defined ! if (hsoft > tiny(hsoft)) then UseTypeInRenderings(2) = .true. else UseTypeInRenderings(2) = .false. endif UseTypeInRenderings(3:6) = .false. end subroutine set_labels_gadget_hdf5 subroutine set_blocklabel_gadget(icol,irank,name) bind(c) use, intrinsic :: iso_c_binding, only:c_int, c_char integer(kind=c_int), intent(in) :: icol,irank character(kind=c_char), dimension(256), intent(in) :: name blocklabelgas(icol+1) = fstring(name) blocksize(icol+1) = irank !print*,icol+1,' name = ',trim(blocklabelgas(icol+1)),' x ',irank end subroutine set_blocklabel_gadget subroutine set_header_label_gadget(i,name) bind(c) use, intrinsic :: iso_c_binding, only:c_int, c_char use labels, only:headertags integer(kind=c_int), intent(in) :: i character(kind=c_char), dimension(256), intent(in) :: name headertags(i+1) = fstring(name) end subroutine set_header_label_gadget end module readdata_gadget_hdf5 danieljprice-splash-4d1f09c/src/read_data_gadget_hdf5_utils.c000066400000000000000000000476061477365367100244070ustar00rootroot00000000000000/* * This subroutine performs the calls to the HDF5 library for the * GADGET data read * * Easier to do it this way and link with c than to try to link against * the Fortran interface (in the latter case the modules must * have been compiled with the *exact* compiler used to compile splash * which is a real pain). * */ #include #include #include #include #include "hdf5_helper_utils.h" static int debug = 0; /*int checkfordataset(hid_t file_id, char *datasetname); * int get_rank(hid_t dataspace_id); * int get_rank_by_name(hid_t group_id, char *name); */ int read_gadgethdf5_dataset(hid_t group_id, char *datasetname, int itype, int maxtypes, int npartoftype[maxtypes], int i0[maxtypes], int ncol, int isrequired[ncol], int *id, int *j, int *iblock); void set_blocklabel_gadget(int *icol, int *irank, char *name); void set_header_label_gadget(int *icol, char *name); void read_gadgethdf5_data_fromc(int *icol, int *npartoftypei, double temparr[*npartoftypei], int id[*npartoftypei], int *itype, int *i0, char *name, int *iblock); void get_vel_info(hid_t group_id, char *name, int *ndimV); void get_mass_info(hid_t group_id, char *name, int *rank); void read_gadget_hdf5_header(char *filename, int maxtypes, int maxhdr, int *npartoftype[maxtypes], double *massoftype[maxtypes], double *time, double *redshift, double *headervals[maxhdr], int *iFlagSfr, int *iFlagFeedback, int *Nall[maxtypes], int *iFlagCool, int *igotids, int *ndim, int *ndimV, int *nfiles, int *ncol, int *ierr) { hid_t file_id; hid_t group_id, dataset_id; hid_t attrib_id, dataspace_id; herr_t status; herr_t HDF5_error = -1; *ierr = 0; *igotids = 0; if (debug) printf("DEBUG: opening %s \n", filename); file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id == HDF5_error) { printf("ERROR opening %s \n", filename); *ierr = 1; return; } /* * Open the "Header" dataset and read the header information * */ if (!checkfordataset(file_id, "Header")) { printf(" ERROR: \"Header\" dataset not found in GADGET HDF5 file\n"); *ierr = 2; return; } #if H5_VERSION_GE(1, 8, 0) group_id = H5Gopen2(file_id, "Header", H5P_DEFAULT); #else group_id = H5Gopen(file_id, "Header"); #endif if (group_id == HDF5_error) { printf("ERROR opening Header data set \n"); *ierr = 2; return; } int nattrib; int i; char name[256], maindataset[256]; char namevels[256], namemass[256]; nattrib = H5Aget_num_attrs(group_id); /* * Read through all of the attributes in the header, so we * can still spit out the values even if they are not used by SPLASH */ double BoxSize, HubbleParam, Omega0, OmegaLambda; int iFlagStellarAge, iFlagMetals; for (i = 0; i < nattrib; i++) { attrib_id = H5Aopen_idx(group_id, i); ssize_t attr_status; attr_status = H5Aget_name(attrib_id, 256, name); hid_t type_id; type_id = H5Aget_type(attrib_id); /*type_class = H5Tget_native_type(type_id,H5T_DIR_ASCEND);*/ if (strcmp(name, "Time") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, time); } else if (strcmp(name, "MassTable") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, massoftype); /*printf(" Masses = %i %f \n",maxtypes,massoftype[1]);*/ } else if (strcmp(name, "NumPart_ThisFile") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, npartoftype); } else if (strcmp(name, "NumPart_Total") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, Nall); } else if (strcmp(name, "Redshift") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, redshift); } else if (strcmp(name, "NumFilesPerSnapshot") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, nfiles); } else if (strcmp(name, "Flag_Sfr") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, iFlagSfr); } else if (strcmp(name, "Flag_Cooling") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, iFlagCool); } else if (strcmp(name, "Flag_Feedback") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, iFlagFeedback); } else if (strcmp(name, "BoxSize") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, &BoxSize); } else if (strcmp(name, "HubbleParam") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, &HubbleParam); } else if (strcmp(name, "Omega0") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, &Omega0); } else if (strcmp(name, "OmegaLambda") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, &OmegaLambda); } else if (strcmp(name, "Flag_StellarAge") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, &iFlagStellarAge); } else if (strcmp(name, "Flag_Metals") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_INT, &iFlagMetals); } else if (strcmp(name, "Time_GYR") == 0) { status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, time); } else { if (debug) printf("DEBUG: unknown attribute %s \n", name); } H5T_class_t type_class = H5Tget_class(type_id); if (type_class == H5T_INTEGER || type_class == H5T_FLOAT || type_class == H5T_NATIVE_DOUBLE) // Only read numeric types { // Read attribute and automatically convert to double status = H5Aread(attrib_id, H5T_NATIVE_DOUBLE, &headervals[i]); set_header_label_gadget(&i, name); if (status == HDF5_error) { printf(" ERROR reading attribute %s \n", name); } } else { if (debug) printf("DEBUG: Attribute %s is not numeric and will be skipped.\n", name); } if (status == HDF5_error) { printf(" ERROR reading attribute %s \n", name); } status = H5Aclose(attrib_id); } status = H5Gclose(group_id); if (status == HDF5_error) { printf("ERROR closing Header data set \n"); *ierr = 3; return; } i = -1; int got = 0; while (!got && i < 5) { i++; sprintf(maindataset, "PartType%i", i); got = checkfordataset(file_id, maindataset); if (!got) { if (i == 0) { printf(" WARNING: no gas particles found in GADGET HDF5 file\n"); } else { printf(" WARNING: \"%s\" dataset not found in GADGET HDF5 file\n", maindataset); } } } if (!got) { printf(" ERROR: No PartType dataset found in GADGET HDF5 file\n"); *ierr = 2; return; } if (debug) printf("DEBUG: main dataset= %s \n", maindataset); /* * Now we need to get the number of data columns in the file * (from the number of datasets in the "PartType0" group) */ #if H5_VERSION_GE(1, 8, 0) group_id = H5Gopen2(file_id, maindataset, H5P_DEFAULT); #else group_id = H5Gopen(file_id, maindataset); #endif if (group_id == HDF5_error) { printf("ERROR opening %s data set \n", maindataset); *ierr = 2; return; } hsize_t ndatasets; status = H5Gget_num_objs(group_id, &ndatasets); if (debug) printf("DEBUG: number of datasets = %i \n", (int)ndatasets); *ncol = 0; *ndim = 0; *ndimV = 0; int rank = 0; int j = 0; rank = get_rank_by_name(group_id, "ParticleIDs"); if (rank == 1) *igotids = 1; if (debug) printf("DEBUG: got IDs = %i\n", *igotids); strcpy(name, "Coordinates"); *ndim = get_rank_by_name(group_id, name); set_blocklabel_gadget(&j, ndim, name); *ncol = *ncol + *ndim; if (*ndim > 0) { j++; } else { printf("ERROR: %s dataset not found\n", name); *ierr = 3; return; } get_vel_info(group_id, namevels, ndimV); set_blocklabel_gadget(&j, ndimV, "Velocities"); *ncol = *ncol + *ndimV; if (*ndimV > 0) { j++; } else { printf("ERROR: Velocities not found in file\n"); *ierr = 3; return; } get_mass_info(group_id, namemass, &rank); if (rank == 0) { printf(" WARNING: Particle mass array not found in file\n"); } else { set_blocklabel_gadget(&j, &rank, "Masses"); *ncol = *ncol + rank; if (rank > 0) j++; } if (*ndim == 0 || *ndimV == 0) { printf("ERROR: got ndim = %i, ndimV = %i\n", *ndim, *ndimV); *ierr = 3; return; } int itype; for (i = 0; i < (int)ndatasets; i++) { status = H5Gget_objname_by_idx(group_id, i, name, 256); itype = H5Gget_objtype_by_idx(group_id, i); /*if (debug) printf("DEBUG: checking %s\n",name);*/ /* Should not try to open it if object is not a dataset */ if (itype == H5G_DATASET) { #if H5_VERSION_GE(1, 8, 0) dataset_id = H5Dopen2(group_id, name, H5P_DEFAULT); #else dataset_id = H5Dopen(group_id, name); #endif dataspace_id = H5Dget_space(dataset_id); rank = get_rank(dataspace_id); if (strcmp(name, "ParticleIDs") && strcmp(name, "Coordinates") && strcmp(name, namevels) && strcmp(name, namemass)) { if (debug) printf("DEBUG: storing %s x %i \n", name, rank); /* Send the dataset names back to Fortran * one by one, so they can be filled into * the array as appropriate */ set_blocklabel_gadget(&j, &rank, name); *ncol = *ncol + rank; if (rank > 0) j++; } else { if (debug) printf("DEBUG: ignoring %s \n", name); } status = H5Dclose(dataset_id); } else { if (debug) printf("DEBUG: skipping %s as it is not a dataset\n", name); } } status = H5Gclose(group_id); status = H5Fclose(file_id); if (status == HDF5_error) { printf("ERROR closing file \n"); *ierr = 7; } if (debug) printf("DEBUG: finished header read \n"); } void read_gadget_hdf5_data(char *filename, int maxtypes, int npartoftype[maxtypes], int ncol, int isrequired[ncol], int i0[maxtypes], int *ierr) { hid_t file_id; hid_t group_id; herr_t status; herr_t HDF5_error = -1; char groupname[12]; char datasetname[256], namevels[256], namemass[256]; int i, ndimV, rank; int *id; if (debug) printf("DEBUG: re-opening %s \n", filename); file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id == HDF5_error) { printf("ERROR re-opening %s \n", filename); *ierr = 1; return; } /* read dataset for each particle type present in dump file */ int itype, iobjtype; for (itype = 0; itype < maxtypes; itype++) { if (npartoftype[itype] > 0) { /* If npartoftype[N] > 0 in header, look for dataset of the form PartTypeN */ sprintf(groupname, "PartType%i", itype); if (debug) printf("DEBUG: opening group %s\n", groupname); #if H5_VERSION_GE(1, 8, 0) group_id = H5Gopen2(file_id, groupname, H5P_DEFAULT); #else group_id = H5Gopen(file_id, groupname); #endif if (group_id == HDF5_error) { printf("ERROR opening %s group \n", groupname); *ierr = 2; } else { hsize_t ndatasets; status = H5Gget_num_objs(group_id, &ndatasets); if (debug) printf("DEBUG: number of datasets = %i \n", (int)ndatasets); /* get names of velocity and particle mass datasets */ get_vel_info(group_id, namevels, &ndimV); get_mass_info(group_id, namemass, &rank); /* read particle ID */ int k = 0; int m = 0; id = malloc(npartoftype[itype] * sizeof(int)); *ierr = read_gadgethdf5_dataset(group_id, "ParticleIDs", itype, maxtypes, npartoftype, i0, ncol, isrequired, id, &k, &m); /* set all IDs to zero if not read */ if (*ierr != 0) printf("DEBUG: error from ID read = %i, rank = %i \n", *ierr, k); if (*ierr != 0 || k != 1) { for (k = 0; k < npartoftype[itype]; k++) { id[k] = 0; } }; int j = 0; int iblock = 0; /* read datasets common to all particle types first */ *ierr = read_gadgethdf5_dataset(group_id, "Coordinates", itype, maxtypes, npartoftype, i0, ncol, isrequired, id, &j, &iblock); *ierr = read_gadgethdf5_dataset(group_id, namevels, itype, maxtypes, npartoftype, i0, ncol, isrequired, id, &j, &iblock); *ierr = read_gadgethdf5_dataset(group_id, namemass, itype, maxtypes, npartoftype, i0, ncol, isrequired, id, &j, &iblock); /* read remaining datasets in the order they appear in the file */ for (i = 0; i < (int)ndatasets; i++) { status = H5Gget_objname_by_idx(group_id, i, datasetname, 256); iobjtype = H5Gget_objtype_by_idx(group_id, i); if (strcmp(datasetname, "ParticleIDs") && strcmp(datasetname, "Coordinates") && strcmp(datasetname, namevels) && strcmp(datasetname, namemass) && (iobjtype == H5G_DATASET)) { *ierr = read_gadgethdf5_dataset(group_id, datasetname, itype, maxtypes, npartoftype, i0, ncol, isrequired, id, &j, &iblock); } } free(id); H5Gclose(group_id); } } } status = H5Fclose(file_id); if (status == HDF5_error) { printf("ERROR closing file \n"); *ierr = 7; } } int read_gadgethdf5_dataset(hid_t group_id, char *datasetname, int itype, int maxtypes, int npartoftype[maxtypes], int i0[maxtypes], int ncol, int isrequired[ncol], int *id, int *j, int *iblock) { hid_t dataset_id, dataspace_id, memspace_id; herr_t status; herr_t HDF5_error = -1; int ierr = 0; if (!checkfordataset(group_id, datasetname)) { ierr = 1; return ierr; } #if H5_VERSION_GE(1, 8, 0) dataset_id = H5Dopen2(group_id, datasetname, H5P_DEFAULT); #else dataset_id = H5Dopen(group_id, datasetname); #endif dataspace_id = H5Dget_space(dataset_id); int rank = get_rank(dataspace_id); int k, flag; /* do nothing if none of the columns are required */ flag = 0; for (k = *j; k < *j + rank; k++) { if (isrequired[k]) flag = 1; } if (!flag) { if (debug) printf("DEBUG: skipping %s : not required\n", datasetname); H5Dclose(dataset_id); *j = *j + rank; if (rank > 0) *iblock += 1; return 0; } if (debug) printf("DEBUG: got %s rank %i \n", datasetname, rank); /* make a temporary array to put each column as we read it */ hsize_t nparttmp[1]; nparttmp[0] = npartoftype[itype]; memspace_id = H5Screate_simple(1, nparttmp, NULL); double *temp = 0; temp = malloc(npartoftype[itype] * sizeof(double)); if (rank > 0) *iblock = *iblock + 1; if (rank == 1) { *j = *j + 1; if (!strcmp(datasetname, "ParticleIDs")) { /* read particle IDs from file */ H5Dread(dataset_id, H5T_NATIVE_INT, memspace_id, dataspace_id, H5P_DEFAULT, id); } else { /* read column from file */ H5Dread(dataset_id, H5T_NATIVE_DOUBLE, memspace_id, dataspace_id, H5P_DEFAULT, temp); /* call Fortran back, sending values in temp array to fill into the main splash dat array */ read_gadgethdf5_data_fromc(j,&npartoftype[itype],temp,id,&itype,&i0[itype],datasetname,iblock); } } else { hsize_t offset[2], count[2]; for (k = 1; k <= rank; k++) { *j = *j + 1; count[0] = npartoftype[itype]; count[1] = 1; offset[0] = 0; offset[1] = k - 1; /* rank */ status = H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET, offset, NULL, count, NULL); if (status == HDF5_error) { printf("ERROR creating hyperslab \n"); ierr = 4; } if (!H5Sselect_valid(dataspace_id)) { printf("ERROR selecting hyperslab \n"); ierr = 5; } /* read column from file */ if (isrequired[*j - 1]) { H5Dread(dataset_id, H5T_NATIVE_DOUBLE, memspace_id, dataspace_id, H5P_DEFAULT, temp); /* call Fortran back, sending values in temp array to fill into the main splash dat array */ read_gadgethdf5_data_fromc(j,&npartoftype[itype],temp,id,&itype,&i0[itype],datasetname,iblock); } else { if (debug) printf("DEBUG: skipping %s in COLUMN %i \n", datasetname, *j); } } } free(temp); status = H5Sclose(dataspace_id); if (status == HDF5_error) { printf("ERROR closing dataspace \n"); ierr = 4; } H5Dclose(dataset_id); if (status == HDF5_error) { printf("ERROR closing dataset \n"); ierr = 7; } return ierr; } void get_vel_info(hid_t group_id, char *name, int *ndimV) { strcpy(name, "Velocities"); *ndimV = get_rank_by_name(group_id, name); /* If "Velocities" not found, try "Velocity" */ if (*ndimV <= 0) { strcpy(name, "Velocity"); *ndimV = get_rank_by_name(group_id, name); } return; } /* * utility function to find particle mass dataset and rank */ void get_mass_info(hid_t group_id, char *name, int *rank) { strcpy(name, "Masses"); *rank = get_rank_by_name(group_id, name); /* If "Masses" not found, try "Mass" */ if (*rank <= 0) { strcpy(name, "Mass"); *rank = get_rank_by_name(group_id, name); } return; } danieljprice-splash-4d1f09c/src/read_data_gadget_jsb.f90000066400000000000000000000237771477365367100232760ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2016 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR OUTPUT FROM THE GADGET CODE ! AS MODIFIED BY JAMIE BOLTON ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_gadget_jsb implicit none public :: read_data_gadget_jsb, set_labels_gadget_jsb private contains subroutine read_data_gadget_jsb(rootname,istart,ipos,nstepsread) use particle_data use params use labels use settings_data, only:ndim,ndimV,ncolumns,ncalc use mem_allocation integer, intent(IN) :: istart,ipos integer, intent(OUT) :: nstepsread character(LEN=*), intent(IN) :: rootname character(LEN=LEN(rootname)+10) :: datfile integer, dimension(maxparttypes) :: npartoftypei integer, dimension(:), allocatable :: iamtemp integer :: i,itype,icol,ifile,idashpos,ierr integer :: index1,index2,indexstart,indexend,Nmassesdumped integer :: ncol_max,npart_max,nstep_max,ntoti logical :: iexist,reallocate real(doub_prec) :: timetemp real(doub_prec), dimension(6) :: Massoftype real, dimension(:), allocatable :: dattemp1 real, dimension(:,:), allocatable :: dattemp nstepsread = 0 if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: ',trim(datfile),' file not found ***' return endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 ncol_max = 15 ! 3 x pos, 3 x vel, utherm, rho, Ne, h, pmass ! !--read data from snapshots ! i = istart print "(1x,a)",'reading Jamie Bolton''s modified GADGET format' write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! open(11,ERR=81,file=datfile,status='old',form='unformatted') ! !--read header for this timestep ! read(11,ERR=70,end=80) npartoftypei,Massoftype,timetemp ntoti = int(sum(npartoftypei)) print*,'time : ',timetemp print*,'Npart (by type) : ',npartoftypei print*,'Mass (by type) : ',Massoftype print*,'N_gas : ',npartoftypei(1) print*,'N_total : ',ntoti ! !--if successfully read header, increment the nstepsread counter ! nstepsread = nstepsread + 1 ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (ntoti > maxpart) then reallocate = .true. npart_max = int(1.1*ntoti) endif if (i >= maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncol_max+ncalc,maxcol)) endif ! !--copy header into header arrays ! npartoftype(:,i) = npartoftypei time(i) = real(timetemp) if (ntoti > 0) then if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(3,ntoti)) ! !--read positions of all particles ! print*,'positions ',ntoti read (11, iostat=ierr) dattemp(1:3,1:ntoti) if (ierr /= 0) then print "(a)",'error encountered whilst reading positions ' return else do icol=1,3 dat(1:ntoti,icol,i) = dattemp(icol,1:ntoti) enddo endif ! !--same for velocities ! print*,'velocities ',ntoti read (11, iostat=ierr) dattemp(1:3,1:ntoti) if (ierr /= 0) then print "(a)",'error encountered whilst reading velocities' else do icol=4,6 dat(1:ntoti,icol,i) = dattemp(icol-3,1:ntoti) enddo endif ! !--read particle ID ! print*,'particle ID ',ntoti if (allocated(iamtemp)) deallocate(iamtemp) allocate(iamtemp(npart_max)) read (11, end=66,ERR=73) iamtemp(1:ntoti) deallocate(iamtemp) ! !--read particle masses ! !--work out total number of masses dumped Nmassesdumped = 0 do itype = 1,6 if (abs(Massoftype(itype)) < 1.e-8) then Nmassesdumped = Nmassesdumped + Npartoftype(itype,i) endif enddo print*,'particle masses ',Nmassesdumped !--read this number of entries if (allocated(dattemp1)) deallocate(dattemp1) allocate(dattemp1(Nmassesdumped)) if (Nmassesdumped > 0) then read(11,end=66,err=74) dattemp1(1:Nmassesdumped) endif !--now copy to the appropriate sections of the .dat array indexstart = 1 index1 = 1 do itype=1,6 if (Npartoftype(itype,i) /= 0) then index2 = index1 + Npartoftype(itype,i) -1 if (abs(Massoftype(itype)) < 1.e-8) then ! masses dumped indexend = indexstart + Npartoftype(itype,i) - 1 print*,'read ',Npartoftype(itype,i),' masses for type ', & itype,index1,'->',index2,indexstart,'->',indexend dat(index1:index2,7,i) = dattemp1(indexstart:indexend) else ! masses not dumped print*,'setting masses for type ',itype,' = ', & real(Massoftype(itype)),index1,'->',index2 dat(index1:index2,7,i) = real(Massoftype(itype)) endif index1 = index2 + 1 indexstart = indexend + 1 endif enddo deallocate(dattemp1) ! !--read other quantities for rest of particles ! print*,'gas properties ',npartoftype(1,i) do icol=8,15 !!print*,icol read (11, end=66,ERR=78) dat(1:npartoftype(1,i),icol,i) ! !--for some reason the smoothing length output by GADGET is ! twice the usual SPH smoothing length ! if (icol==15) then dat(1:npartoftype(1,i),icol,i) = 0.5*dat(1:npartoftype(1,i),icol,i) endif enddo else ntoti = 1 npartoftype(1,i) = 1 dat(:,:,i) = 0. endif !!ntot(i-1) = j-1 ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. goto 68 66 continue print*,'*** end of file reached in ',trim(datfile),' ***' ! timestep there but data incomplete goto 68 68 continue ! !--close data file and return ! close(unit=11) ncolumns = ncol_max print*,'ncolumns = ',ncolumns print*,'>> Finished reading: steps =',nstepsread-istart+1, & 'last step ntot =',sum(npartoftype(:,istart+nstepsread-1)) return ! !--errors ! 70 continue print*,' *** Error encountered while reading timestep header ***' print*,' Npartoftype = ',Npartoftype(:,i) print*,' Massoftype = ',Massoftype return 73 continue print*,' *** Error encountered while reading particle ID ***' return 74 continue print*,' *** Error encountered while reading particle masses ***' return 78 continue print*,' *** Error encountered while reading gas particle properties ***' return 80 continue print*,' *** data file empty, no steps read ***' return 81 continue print*,' *** Error: can''t open data file ***' return end subroutine read_data_gadget_jsb !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_gadget_jsb use labels use params use settings_data use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_gadget_jsb ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_gadget_jsb ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ipmass = 7 irho = 9 ! location of rho in data array ipr = 0 iutherm = 8 ! thermal energy ih = 15 ! smoothing length ! !--set labels of the quantities read in ! label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = '\gr' label(iutherm) = 'u' label(10) = 'NHp' label(11) = 'NHep' label(12) = 'NHepp' label(13) = 'NH0' label(14) = 'NHe0' label(ih) = 'h' label(ipmass) = 'particle mass' ! !--set labels for vector quantities ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//labelcoord(i,1) enddo !--set labels for each particle type ! ntypes = 6 labeltype(1) = 'gas' labeltype(2) = 'dark matter' labeltype(3) = 'boundary 1' labeltype(4) = 'boundary 2' labeltype(5) = 'star' labeltype(6) = 'sink / black hole' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2:6) = .false. !----------------------------------------------------------- return end subroutine set_labels_gadget_jsb end module readdata_gadget_jsb danieljprice-splash-4d1f09c/src/read_data_h5part.f90000066400000000000000000000554111477365367100223760ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR DATA FORMATS WRITTEN WITH THE H5PART LIBRARY ! ! Some choices for this format can be set using the following ! command-line flags or environment variables: ! ! --ndim=2 or H5SPLASH_NDIM=2 : number of spatial dimensions (overrides value inferred from data) ! --hfac=1.2 or H5SPLASH_HFAC=1.2 : factor to use in h= hfac*(m/rho)**(1/ndim) if h not present in data ! --hsml=1.0 or H5SPLASH_HSML=1.0 : value for global smoothing length if h not present in data ! --typeid=MatID or H5SPLASH_TYPEID='MatID' : name of dataset containing the particle types ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ntot(maxstep) : total number of particles in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- !--local module to store header information so we can later set the labels module h5partdataread use params use labels, only:lenlabel implicit none character(len=lenlabel), dimension(maxplot) :: datasetnames logical :: warn_labels = .true. end module h5partdataread module readdata_h5part implicit none public :: read_data_h5part, set_labels_h5part private contains subroutine read_data_h5part(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,iamtype,npartoftype,time,gamma,maxpart,maxcol,maxstep use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,debugmode,ntypes,iverbose use mem_allocation, only:alloc use iso_c_binding, only:c_double,c_int64_t use asciiutils, only:lcase use system_utils, only:renvironment,get_environment_or_flag use labels, only:ih,ipmass,irho,ix use h5part use h5partattrib, only:h5pt_readstepattrib,h5pt_getnstepattribs,h5pt_getstepattribinfo, & h5pt_readstepattrib_r8, h5pt_readstepattrib_string use h5partdataread integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,ncolstep,nsteps,ncolsfile,icol,itypeidcol integer(kind=c_int64_t) :: nattrib,iattrib,nelem,idatasettype,k,icolsfile,ierr integer :: nprint,npart_max,nstep_max,maxcolsfile,itype integer, dimension(maxplot) :: iorder integer, dimension(maxparttypes) :: itypemap integer, dimension(:),allocatable :: itypefile logical :: iexist,typeiddefault integer(kind=c_int64_t) :: ifile,istep character(len=len(rootname)+5) :: dumpfile character(len=64) :: attribname character(len=lenlabel) :: datasetname,type_datasetname real(kind=doub_prec),dimension(1) :: dtime real :: hsmooth,hfac,dndim character(len=64) :: xstring nstepsread = 0 nstep_max = 0 npart_max = maxpart dumpfile = trim(rootname) if (iverbose >= 1) print "(1x,a)",'reading h5part format' print "(26('>'),1x,a,1x,26('<'))",trim(dumpfile) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions (0 means no particle coords) ! ndim = 0 ndimV = 0 j = indexstart nstepsread = 0 ! !--open the file and read the number of particles ! if (debugmode) print*,'DEBUG: opening '//trim(dumpfile) !ierr = h5pt_set_verbosity_level(6_8) ifile = h5pt_openr(trim(dumpfile)) if (ifile <= 0) then print "(a)",'*** ERROR opening '//trim(dumpfile)//' ***' return endif if (debugmode) print*,'DEBUG: file opened ok' ! !--get number of steps and particles in the file ! nsteps = int(h5pt_getnsteps(ifile)) if (debugmode) print*,'DEBUG: nsteps = ',nsteps ! !--read environment variable giving the name of the dataset ! containing the particle type ID ! give default value if this is not set ! call get_environment_or_flag('H5SPLASH_TYPEID',type_datasetname) if (len_trim(type_datasetname) <= 0) then typeiddefault = .true. type_datasetname = 'MatID' else typeiddefault = .false. endif ! !--read "header" information from all steps in file: ! get maximum number of particles for all steps in file ! and maximum number of columns (datasets) in file ! npart_max = 0 ncolstep = 0 maxcolsfile = 0 itypeidcol = 0 do istep=1,nsteps if (debugmode) print "(a,i2)",'DEBUG: setting step ',istep ierr = h5pt_setstep(ifile,istep) if (ierr==0) then npart_max = max(npart_max,int(h5pt_getnpoints(ifile))) ncolsfile = int(h5pt_getndatasets(ifile)) icol = 0 if ((istep==nsteps .and. ncolsfile > 0)) then do icolsfile=0,ncolsfile-1 !ierr = h5pt_getdatasetname(ifile,icol,datasetnames(icol+1)) if (debugmode) print*,'DEBUG: getting datasetinfo' ierr = h5pt_getdatasetinfo(ifile,icolsfile,datasetname,idatasettype,nelem) if (ierr /= 0) then print "(a,i3)",' ERROR reading dataset name for column ',icolsfile+1 else ! !--read only columns which contain real or double precision data ! select case(idatasettype) case(H5PART_FLOAT32,H5PART_FLOAT64) icol = icol + 1 datasetnames(icol) = trim(adjustl(datasetname)) !print*,' data set info = ',icol,trim(datasetnames(icol)),idatasettype,nelem case(H5PART_INT32,H5PART_INT64) ! !--try to recognise the dataset giving the particle types ! if (trim(type_datasetname)==trim(datasetname) .or. trim(datasetname)=='Phase') then type_datasetname = trim(datasetname) if (itypeidcol <= 0) itypeidcol = int(icolsfile) + 1 if (iverbose >= 1) print "(a)",' getting particle types from data set '//trim(type_datasetname) else if (iverbose >= 1) print "(a)",' skipping data set '//trim(datasetname)// & ' of type '//h5part_type(int(idatasettype)) endif case default if (iverbose >= 1) print "(a)",' skipping data set '//trim(datasetname)//& ' of type '//h5part_type(int(idatasettype)) end select endif enddo elseif (ncolsfile <= 0) then print*,'ERROR: number of datasets in step ',istep,' = ',ncolsfile endif ncolstep = max(ncolstep,icol) maxcolsfile = max(ncolsfile,maxcolsfile) else print "(a,i3)",' ERROR, could not choose step ',istep return endif enddo nprint = npart_max ! !--warn if no particle type data has been read ! if (itypeidcol <= 0) then if (typeiddefault) then if (iverbose >= 1) print "(a)",' Particle type dataset not found in file: Use --typeid=blah to give dataset name' else print "(a)",' WARNING: Particle type dataset '//trim(type_datasetname)//' (from --typeid) not found in file ' endif endif ! !--call the set_labels_h5part routine to get the initial location of coords, smoothing length etc. given dataset labels ! warn_labels = .false. call set_labels_h5part() warn_labels = .true. ! !--set default ordering of columns ! do i=1,size(iorder) iorder(i) = i enddo ! !--if coordinates are not in the first 3 columns, shift data so that they are ! if (ndim > 0 .and. ix(1) /= 1) then do i=1,ndim iorder(ix(i)) = i enddo !--preserve the order of things after the coordinates icol = ndim do i=ix(1)+1,ncolstep if (.not.any(ix(1:ndim)==i)) then icol = icol + 1 iorder(i) = icol endif enddo !--shuffle things before the coordinates to the end do i=1,ix(1)-1 if (.not.any(ix(1:ndim)==i)) then icol = icol + 1 iorder(i) = icol endif enddo endif if (debugmode) print*,'DEBUG: iorder = ',iorder ! !--if smoothing length has not been set, look for an environment variable ! giving the smoothing length value ! hsmooth = -1. if (ih==0) then hsmooth = renvironment('H5SPLASH_HSML',errval=-1.) if (hsmooth >= 0.) then ncolstep = ncolstep + 1 elseif (ipmass > 0. .and. irho > 0 .and. ndim > 0) then hfac = renvironment('H5SPLASH_HFAC',errval=-1.) if (hfac > 0.) then if (iverbose >= 1) print "(/,a,f6.2,a,/)",' Setting smoothing length using h = ',hfac,& '*(m/rho)**(1/ndim) (from --hfac setting)' else hfac = 1.2 if (iverbose >= 1) then print "(/,a)",' WARNING: Smoothing length not found in data: using h = hfac*(m/rho)**(1/ndim)' print "(a)", ' (hfac = 1.2 by default, set e.g. --hfac=1.5 to change this)' print "(a,/)",' (set constant h with --hsml=1.0 to give a global value)' endif endif ncolstep = ncolstep + 1 else if (iverbose >= 1) print "(/,a,/)",' WARNING: Smoothing length not found in data: Set --hsml to give a global value' endif endif ncolumns = ncolstep ! !--allocate memory for all data in the file ! nstep_max = max(nsteps,indexstart,1,maxstep) npart_max = max(maxpart,npart_max) if (.not.allocated(dat) .or. (nprint > maxpart) .or. (ncolstep+ncalc) > maxcol) then if (itypeidcol > 0) then call alloc(npart_max,nstep_max,ncolstep+ncalc,mixedtypes=.true.) else call alloc(npart_max,nstep_max,ncolstep+ncalc) endif endif ! !--now read the timestep data in the dumpfile (for all steps) ! istep = 0 do j=indexstart,indexstart+nsteps-1 istep = istep + 1 print "(a,i4,a,i10)",' step ',istep,': ntotal = ',nprint ierr = h5pt_setstep(ifile,istep) nprint = int(h5pt_getnpoints(ifile)) ! use int() to avoid compiler warning about type conversion ! !--get the time from the step attributes ! nattrib = h5pt_getnstepattribs(ifile) if (nattrib > 0) then do iattrib=0,nattrib-1 ! yes, it's written in C ierr = h5pt_getstepattribinfo(ifile,iattrib,attribname,nelem) !print*,' step attribute '//trim(attribname),' nelem = ',nelem if (ierr==0) then ! !--match anything that looks vaguely like the time ! if (nelem==1 .and. (index(lcase(attribname),'time') /= 0 & .or. index(lcase(attribname),'t ') /= 0)) then ierr = h5pt_readstepattrib_string(ifile,attribname,xstring) if (ierr==0) then read(xstring,'(f10.0)') time(j) print "(12x,a,es10.3,a)",'time = ',time(j),' (from '//trim(attribname)//')' else print "(a,i2,a)",' ERROR could not read time from step ',istep,' (from '//trim(attribname)//')' endif ! !--match gamma if possible ! elseif (nelem==1 .and. (index(lcase(attribname),'gamma') /= 0 & .or. index(lcase(attribname),'gam ') /= 0)) then ierr = h5pt_readstepattrib_string(ifile,attribname,xstring) if (ierr==0) then gamma(j) = real(dtime(1)) print "(12x,a,es10.3,a)",'gamma = ',gamma(j),' (from '//trim(attribname)//')' else print "(a,i2,a)",' ERROR could not read gamma from step ',istep,' (from '//trim(attribname)//')' endif else print "(a)",' unknown attribute '//trim(attribname) endif else print "(a,i3,a,i2)",' ERROR reading attribute info for step ',istep,', attribute #',iattrib endif enddo endif ! !--now read the data for this step ! icol = 0 do k=0,maxcolsfile-1 ierr = h5pt_getdatasetinfo(ifile,k,datasetname,idatasettype,nelem) select case(idatasettype) case(H5PART_FLOAT32,H5PART_FLOAT64) icol = icol + 1 datasetnames(iorder(icol)) = trim(datasetname) if (debugmode) print "(a,i3,a,i3)",'DEBUG: reading data set ',icol,& ': '//trim(datasetnames(iorder(icol)))//' into column ',iorder(icol) ierr = h5pt_readdata(ifile,datasetnames(iorder(icol)),dat(:,iorder(icol),j)) if (ierr /= 0) print "(a)",' ERROR reading dataset '//trim(datasetnames(iorder(icol))) case default if (debugmode) print "(a)",' skipping data set '//trim(datasetname)//' of type '//lcase(h5part_type(int(idatasettype))) end select enddo ! !--read the particle types for this step from the typeid dataset (specified from the type_datasetname setting) ! npartoftype(:,j) = 0 if (itypeidcol > 0 .and. size(iamtype(:,1)) > 1) then if (debugmode) print "(a)",'DEBUG: reading particle types from '//trim(type_datasetname) ! !--allocate temporary memory ! if (allocated(itypefile)) deallocate(itypefile) allocate(itypefile(nprint),stat=ierr) if (ierr /= 0) stop 'ERROR allocating temporary memory for particle types' ! !--read type array from file ! ierr = h5pt_readdata(ifile,trim(type_datasetname),itypefile(:)) if (ierr /= 0) then print "(a)",' ERROR reading dataset '//trim(type_datasetname) else ! !--work out the number of unique particle types ! and map these into SPLASH particle types (1->maxtypes) ! if (j==1 .and. istep==1) then ntypes = 1 itypemap(1) = minval(itypefile) endif do i=1,nprint !--increase the number of particle types if a particle of new type is found if (.not.any(itypemap(1:ntypes)==itypefile(i))) then ntypes = ntypes + 1 if (ntypes <= size(itypemap)) then itypemap(ntypes) = itypefile(i) npartoftype(ntypes,j) = npartoftype(ntypes,j) + 1 iamtype(i,j) = ntypes endif else do itype=1,ntypes if (itypefile(i)==itypemap(itype)) then npartoftype(itype,j) = npartoftype(itype,j) + 1 iamtype(i,j) = itype endif enddo endif enddo if (nprint < 1e6) then print "(12x,a,10(i5,1x))",'npart (by type) = ',npartoftype(1:ntypes,j) else print "(12x,a,10(i10,1x))",'npart (by type) = ',npartoftype(1:ntypes,j) endif ! !--warn if the number of types exceeds the current limit ! if (ntypes > maxparttypes) & print "(/,2(a,i2),a/)", & ' WARNING: too many particle types in dataset '//trim(type_datasetname)// & ' (got ',ntypes,': maximum is currently ',maxparttypes,')' endif ! !--clean up ! if (allocated(itypefile)) deallocate(itypefile) else !--only one particle type ntypes = 1 npartoftype(1,j) = nprint endif ! !--reset the labels now that the columns have been read in the correct order ! if (j==indexstart) then ! set labels based on the first step read from the file warn_labels = .false. call set_labels_h5part() warn_labels = .true. endif ! !--if smoothing length set via environment variable, fill the extra column with the smoothing length value ! if (ih==0) then if (hsmooth >= 0.) then datasetnames(ncolstep) = 'h' ih = ncolstep dat(:,ih,j) = hsmooth elseif (ipmass > 0 .and. irho > 0 .and. ndim > 0) then ih = ncolstep datasetnames(ncolstep) = 'h' dndim = 1./ndim where (dat(:,irho,j) > tiny(0.)) dat(:,ih,j) = hfac*(dat(:,ipmass,j)/dat(:,irho,j))**dndim elsewhere dat(:,ih,j) = 0. end where endif endif ! read(iunit,*,iostat=ierr) (dat(i,icol,j),icol = 1,ncolstep) nstepsread = nstepsread + 1 enddo ierr = h5pt_close(ifile) return end subroutine read_data_h5part !!------------------------------------------------------------------- !! set labels for each column of data !! !! read these from a file called 'columns' in the current directory !! then take sensible guesses as to which quantities are which !! from the column labels !! !!------------------------------------------------------------------- subroutine set_labels_h5part() use asciiutils, only:lcase use labels, only:label,ix,irho,ipmass,ih,iutherm, & ipr,ivx,iBfirst,iamvec,labelvec,lenlabel !,labeltype !use params, only:maxparttypes use settings_data, only:ndim,ndimV,UseTypeInRenderings,iverbose use geometry, only:labelcoord use system_utils, only:ienvironment use h5partdataread integer :: i,ndimset,ndim_max character(len=lenlabel) :: labeli ndim = 0 ndimV = 0 ndimset = ienvironment('H5SPLASH_NDIM',errval=-1) ndim_max = 3 if (ndimset >= 0) ndim_max = ndimset irho = 0 ih = 0 ipmass = 0 do i=1,size(datasetnames) if (len_trim(datasetnames(i)) > 0) then label(i) = trim(datasetnames(i)) else label(i) = ' ' endif !--now try to recognise the column based on the dataset name ! compare all strings in lower case, trimmed and with no preceding spaces ! labeli = trim(adjustl(lcase(label(i)))) if (index(labeli,'coords') /= 0 .and. index(labeli,'_') /= 0 .or. labeli(1:1)=='x') then if (ndim < ndim_max) then ndim = ndim + 1 ix(ndim) = i label(ix(ndim)) = labelcoord(ndim,1) endif elseif (index(labeli,'vel_') /= 0 .and. (ivx==0 .or. i <= ivx+ndim)) then if (ndimV < 3) ndimV = ndimV + 1 if (index(labeli,'_0') /= 0) ivx = i elseif (index(labeli,'dens') /= 0 .and. irho==0) then irho = i elseif (index(labeli,'mass') /= 0 .and. ipmass==0) then ipmass = i elseif (ih==0 .and. (index(labeli,'smoothing') /= 0 .or. labeli(1:1)=='h')) then ih = i elseif (labeli(1:1)=='u') then iutherm = i !--identify vector quantities based on _0, _1, _2 labelling elseif (index(labeli,'_0') /= 0) then !print*,'labelling ',labeli(1:index(labeli,'_0')-1),' as vector, column ',i iamvec(i) = i labelvec(i) = labeli(1:index(labeli,'_0')-1) elseif (index(labeli,'_1') /= 0 .and. i > 1 .and. ndim >= 2) then if (iamvec(i-1) > 0) then iamvec(i) = i-1 labelvec(i) = labelvec(i-1) endif elseif (index(labeli,'_2') /= 0 .and. i > 2 .and. ndim >= 3) then if (iamvec(i-2) > 0) then iamvec(i) = i-2 labelvec(i) = labelvec(i-2) endif endif enddo if (ndim < 1) ndimV = 0 if (ndimV > ndim) ndimV = ndim if (warn_labels .and. iverbose >= 1) then if (ndimset > 0) then if (ndim /= ndimset) then print "(2(a,i1))",' WARNING: ndim = ',ndimset, & ' from --ndim setting but coords not found in data: using ndim = ',ndim else print "(a,i1,a)",' Assuming number of dimensions = ',ndim,' from --ndim setting' endif else if (ndim > 0) print "(a,i1,a)",' Assuming number of dimensions = ',ndim,' (set --ndim=3 to override)' endif if (ndimV > 0) print "(a,i1)",' Assuming vectors have dimension = ',ndimV if (irho > 0) print "(a,i2)",' Assuming density in column ',irho if (ipmass > 0) print "(a,i2)",' Assuming particle mass in column ',ipmass if (ih > 0) print "(a,i2)",' Assuming smoothing length in column ',ih if (iutherm > 0) print "(a,i2)",' Assuming thermal energy in column ',iutherm if (ipr > 0) print "(a,i2)",' Assuming pressure in column ',ipr if (ivx > 0) then if (ndimV > 1) then print "(a,i2,a,i2)",' Assuming velocity in columns ',ivx,' to ',ivx+ndimV-1 else print "(a,i2)",' Assuming velocity in column ',ivx endif endif if (ndim==0 .or. irho==0 .or. ipmass==0 .or. ih==0) then print "(4(/,a))",' NOTE: Rendering capabilities cannot be enabled', & ' until positions of density, smoothing length and particle', & ' mass are known (for the h5part read this means labelling ', & ' the dataset appropriately)' endif ! !--assign vectors (don't do this on the first call otherwise it will remain assigned to the wrong columns) ! if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' endif if (iBfirst > 0) then iamvec(iBfirst:iBfirst+ndimV-1) = ivx labelvec(iBfirst:iBfirst+ndimV-1) = 'B' endif ! !--set labels for vector quantities ! do i=1,size(datasetnames) if (iamvec(i) /= 0) then label(i) = trim(labelvec(iamvec(i)))//'_'//trim(labelcoord(i-iamvec(i)+1,1)) endif enddo endif ! !--set labels for each particle type ! (for h5part this is done in the read_data_h5part routine) ! !ntypes = 1 !!maxparttypes ! labeltype(1) = 'gas' ! labeltype(2) = 'gas' ! labeltype(3) = 'gas' ! labeltype(4) = 'gas' UseTypeInRenderings(:) = .true. !----------------------------------------------------------- return end subroutine set_labels_h5part end module readdata_h5part danieljprice-splash-4d1f09c/src/read_data_jjm.f90000066400000000000000000000141521477365367100217500ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR JOE'S 2D SPH CODE ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ntot(maxstep) : total number of particles in each timestep ! iam(maxpart,maxstep): integer identification of particle type ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_jjm implicit none public :: read_data_jjm, set_labels_jjm private contains subroutine read_data_jjm(rootname,indexstart,ipos,nstepsread) use particle_data use params use settings_data, only:ndim,ndimV,ncolumns use mem_allocation integer, intent(IN) :: indexstart,ipos integer, intent(OUT) :: nstepsread character(LEN=*), intent(IN) :: rootname integer :: i,j,ifile,ierr integer :: istep,nprint,npart_max,nstep_max,icol logical :: iexist character(LEN=LEN(rootname)+4) :: dumpfile real :: timei,dti,hi nstepsread = 0 nstep_max = 0 npart_max = maxpart ifile = 1 dumpfile = trim(rootname) ! if (index(dumpfile,'.plt')==0) dumpfile = trim(rootname)//'.plt' ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: ',trim(dumpfile),' file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 2 ndimV = 2 ncolumns = 7 ! number of columns in file ! !--allocate memory initially ! nstep_max = max(nstep_max,indexstart,2) j = indexstart nstepsread = 0 print "(1x,a)",'reading Joe Monaghan ascii format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the file and read the number of particles ! open(unit=15,iostat=ierr,file=dumpfile,status='old',form='formatted') if (ierr /= 0) then print*,'*** ERROR OPENING ',trim(dumpfile),' ***' else ! !--read the number of particles in the first step, ! allocate memory and rewind ! read(15,*,end=55,iostat=ierr) istep,nprint,timei,dti print*,'first time = ',timei,nprint if (.not.allocated(dat) .or. (nprint > npart_max)) then npart_max = max(npart_max,INT(1.1*(nprint))) call alloc(npart_max,nstep_max,ncolumns) endif rewind(15) endif if (ierr /= 0) then print*,'*** ERROR READING TIMESTEP HEADER ***' else oversteps: do ! !--loop over the timesteps in this file ! npart_max = max(npart_max,nprint) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,2*j,maxcol) endif ! !--now read the timestep data in the dumpfile ! read(15,*,end=55,iostat=ierr) istep,nprint,hi,time(j),dti do i=1,nprint read(15,*,end=55,iostat=ierr) (dat(i,icol,j),icol = 1,ncolumns) enddo masstype(1,j) = 1. if (ierr /= 0) then print "(a)",'|*** ERROR READING TIMESTEP ***' return else nstepsread = nstepsread + 1 endif npartoftype(:,j) = 0 npartoftype(1,j) = nprint print*,j,' time = ',time(j) gamma(j) = 1.666666666667 j = j + 1 enddo oversteps endif 55 continue ! !--reached end of file ! close(15) print*,'nstepsread = ',nstepsread print*,'>> end of dump file: nsteps =',j-1,'ntot = ',npartoftype(1,j-1),'nptmass=',npartoftype(2,j-1) return end subroutine read_data_jjm !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_jjm use labels use params use settings_data use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_jjm ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_jjm ***' return endif do i=1,ndim ix(i) = i enddo label(ix(1:ndim)) = labelcoord(1:ndim,1) ivx = ndim+1 ipr = ndim+ndimV+2 ih = ndim+ndimV+3 ! smoothing length label(ih) = 'h' irho = ndim+ndimV+1 ! location of rho in data array label(irho) = 'density' if (ipr > 0) label(ipr) = 'pressure' iutherm = 0 ! thermal energy ! label(iutherm) = 'u' ipmass = 0 ! particle mass ! label(ipmass) = 'particle mass' iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = 'v\d'//labelcoord(i,1) enddo ! !--set labels for each particle type ! ntypes = 1 !!maxparttypes labeltype(1) = 'gas' UseTypeInRenderings(1) = .true. !----------------------------------------------------------- return end subroutine set_labels_jjm end module readdata_jjm danieljprice-splash-4d1f09c/src/read_data_jjm_multiphase.f90000066400000000000000000000164521477365367100242100ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR JOE'S 2D SPH CODE ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ntot(maxstep) : total number of particles in each timestep ! iam(maxpart,maxstep): integer identification of particle type ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_jjmmulti implicit none public :: read_data_jjmmulti, set_labels_jjmmulti private contains subroutine read_data_jjmmulti(rootname,indexstart,ipos,nstepsread) use particle_data use params use settings_data, only:ndim,ndimV,ncolumns use mem_allocation integer, intent(IN) :: indexstart,ipos integer, intent(OUT) :: nstepsread character(LEN=*), intent(IN) :: rootname integer :: i,j,ifile,ierr,npart,nweird,nbnd,nmud integer :: istep,nprint,npart_max,nstep_max,icol,ncolstep logical :: iexist character(LEN=LEN(rootname)+4) :: dumpfile real :: timei,dti,hi,pmass,totmass,rhozero nstepsread = 0 nstep_max = 0 npart_max = maxpart ifile = 1 dumpfile = trim(rootname) if (index(dumpfile,'.plt')==0) dumpfile = trim(rootname)//'.plt' ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: ',trim(dumpfile),' file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 2 ndimV = 2 ncolstep = 8 ncolumns = 8 ! number of columns in file ! !--allocate memory initially ! nstep_max = max(nstep_max,indexstart,2) j = indexstart nstepsread = 0 print "(1x,a)",'reading Joe Monaghan''s multiphase code format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the file and read the number of particles ! open(unit=15,iostat=ierr,file=dumpfile,status='old',form='formatted') if (ierr /= 0) then print*,'*** ERROR OPENING ',trim(dumpfile),' ***' else ! !--read the number of particles in the first step, ! allocate memory and rewind ! read(15,*,end=55,iostat=ierr) istep,nprint,hi print*,'first time = ',hi,' npart = ',nprint if (.not.allocated(dat) .or. (nprint > npart_max)) then npart_max = max(npart_max,INT(1.1*(nprint))) call alloc(npart_max,nstep_max,ncolumns,mixedtypes=.true.) endif rewind(15) endif if (ierr /= 0) then print*,'*** ERROR READING TIMESTEP HEADER ***' else oversteps: do ! !--loop over the timesteps in this file ! npart_max = max(npart_max,nprint) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,2*j,maxcol,mixedtypes=.true.) endif ! !--now read the timestep data in the dumpfile ! read(15,*,end=55,iostat=ierr) istep,nprint,hi,timei,dti ! read(15,*) nbnd = 0 npart = 0 nweird = 0 nmud = 0 do i=1,nprint read(15,*,end=55,iostat=ierr) (dat(i,icol,j),icol = 1,ncolstep),iamtype(i,j) select case(iamtype(i,j)) case(0) nbnd = nbnd + 1 iamtype(i,j) = 3 case(1) npart = npart + 1 iamtype(i,j) = 1 case(2) nmud = nmud + 1 iamtype(i,j) = 2 case default nweird = nweird + 1 iamtype(i,j) = 4 end select !print*,i,(dat(i,icol,j),icol = 1,ncolstep),iamtype(i,j) !--make a fake column for mass enddo 600 format(2x,7(e12.5),1(i5)) time(j) = timei if (ierr /= 0) then print*,'got to ',i,' step ',j print "(a)",'|*** ERROR READING TIMESTEP ***' return else nstepsread = nstepsread + 1 endif npartoftype(:,j) = 0 npartoftype(1,j) = npart npartoftype(2,j) = nmud npartoftype(3,j) = nbnd npartoftype(4,j) = nweird print*,'nwater=',npart,' nmud=',nmud,' nbnd=',nbnd if (nweird > 0) print*,' WARNING: ',nweird,' particles of unknown type' print*,j,' time = ',time(j) gamma(j) = 1.666666666667 j = j + 1 enddo oversteps endif 55 continue ! !--reached end of file ! close(15) print*,'nstepsread = ',nstepsread print*,'>> end of dump file: nsteps =',j-1,'nfluid = ',npartoftype(1,j-1),'nbound=',npartoftype(2,j-1) return end subroutine read_data_jjmmulti !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_jjmmulti use labels use params use settings_data use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_jjmmulti ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_jjmmulti ***' return endif do i=1,ndim ix(i) = i enddo label(ix(1:ndim)) = labelcoord(1:ndim,1) ivx = ndim+1 ipr = ndim+ndimV+2 label(ipr) = 'pressure' ih = ndim+ndimV+3 ! smoothing length label(ih) = 'h' irho = ndim+ndimV+1 ! location of rho in data array label(irho) = 'density' iutherm = 0 ! thermal energy ! label(iutherm) = 'u' ipmass = 8 ! particle mass label(ipmass) = 'particle mass' iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = 'v\d'//labelcoord(i,1) enddo ! !--set labels for each particle type ! ntypes = 4 !!maxparttypes labeltype(1) = 'fluid' labeltype(2) = 'mud' labeltype(3) = 'boundary' labeltype(4) = 'unknown' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .true. UseTypeInRenderings(3) = .false. UseTypeInRenderings(4) = .false. !----------------------------------------------------------- return end subroutine set_labels_jjmmulti end module readdata_jjmmulti danieljprice-splash-4d1f09c/src/read_data_mbate.f90000066400000000000000000000326761477365367100222730ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM MATTHEW BATE'S CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! *** CONVERTS TO SINGLE PRECISION *** ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_mbate implicit none public :: read_data_mbate, set_labels_mbate private contains subroutine read_data_mbate(rootname,indexstart,ipos,nstepsread) use particle_data use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,buffer_steps_in_file use settings_units, only:units=>units_default,get_nearest_length_unit,get_nearest_time_unit use labels, only:unitslabel=>unitslabel_default,headertags use mem_allocation integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer, parameter :: maxptmass = 1000 real, parameter :: pi=4.*atan(1.) integer :: i,j,ifile,ierr,ipart integer :: npart_max,nstep_max,ncolstep,npart,nptmassi,nunknown logical :: iexist,doubleprec character(len=len(rootname)+10) :: dumpfile integer :: nprint, n1, n2, nptmass, nstepsalloc integer, dimension(:), allocatable :: isteps, iphase integer, dimension(maxptmass) :: listpm !--use these lines if dump is double precision real(doub_prec), dimension(:,:), allocatable :: dattemp real(doub_prec) :: udisti,umassi,utimei real(doub_prec) :: timei, gammai real(doub_prec) :: rhozero, RK2 real(doub_prec) :: escap,tkin,tgrav,tterm real(doub_prec) :: dtmax,unitx character(len=20) :: unitlabelx !--use these lines for single precision real, dimension(:,:), allocatable :: dattemps real :: timesi, gammasi real :: rhozeros, RK2s real :: escaps,tkins,tgravs,tterms real :: dtmaxs,tcomp nstepsread = 0 nstep_max = 0 npart_max = maxpart ifile = 1 buffer_steps_in_file = .true. dumpfile = trim(rootname) ! !--check if data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 ncolstep = 11 ! number of columns in file ncolumns = ncolstep ! !--allocate memory initially ! nstep_max = max(nstep_max,indexstart,1) j = indexstart nstepsread = 0 print "(1x,a)",'reading Matthew Bate''s/Willy Benz''s old SPH code format (on unit 15)' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the (unformatted) binary file and read the number of particles ! open(unit=15,iostat=ierr,file=dumpfile,status='old',form='unformatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' else ! !--read the number of particles in the first step, ! allocate memory and rewind ! read(15,end=55,iostat=ierr) udisti,umassi,utimei,nprint,n1,n2,timei,gammai,rhozero,RK2 doubleprec = .true. !--try single precision if non-sensible values for time, gamma etc. if (ierr /= 0 .or. timei < 0. .or. timei > 1e30 & .or. gammai < 1. .or. gammai > 10. & .or. rhozero < 0. .or. RK2 < 0. .or. RK2 > 1.e10) then doubleprec = .false. endif nstepsalloc = 1 do while (ierr == 0) npart_max = max(npart_max,nprint) nstepsalloc = nstepsalloc + 1 read(15,iostat=ierr) udisti,umassi,utimei,nprint enddo ierr = 0 if (.not.allocated(dat) .or. nprint > npart_max) then npart_max = max(npart_max,INT(1.1*nprint)) call alloc(npart_max,nstepsalloc,ncolstep+ncalc) endif rewind(15) endif if (ierr /= 0) then print "(a)",'*** ERROR READING TIMESTEP HEADER ***' else ! !--loop over the timesteps in this file ! over_steps_in_file: do !npart_max = max(npart_max,nprint) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then !if (nstepsread > 2) then ! nstepsalloc = j + 2*nstepsread !else ! nstepsalloc = j !endif call alloc(maxpart,nstepsalloc,maxcol) endif ! !--allocate integer arrays required for data read ! if (allocated(isteps)) deallocate(isteps) allocate(isteps(npart_max),stat=ierr) if (ierr /= 0) print*,'not enough memory in read_data_mbate' if (allocated(iphase)) deallocate(iphase) allocate(iphase(npart_max),stat=ierr) if (ierr /= 0) print*,'not enough memory in read_data_mbate' ! !--now read the timestep data in the dumpfile ! write(*,"(a,i5,a)",advance="no") '| step ',j,': ' if (doubleprec) then print "(a)",'double precision dump' ! !--allocate a temporary array for (double precision) variables ! if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(npart_max,ncolstep),stat=ierr) if (ierr /= 0) print*,'not enough memory in read_data_mbate' read(15,end=55,iostat=ierr) udisti, umassi, utimei, & nprint, n1, n2, timei, gammai, rhozero, RK2, & (dattemp(i,7), i=1, nprint),escap, tkin, tgrav, tterm, & (dattemp(i,1), i=1, nprint), (dattemp(i,2), i=1, nprint), & (dattemp(i,3), i=1, nprint), (dattemp(i,4), i=1, nprint), & (dattemp(i,5), i=1, nprint), (dattemp(i,6), i=1, nprint), & (dattemp(i,8), i=1, nprint), (dattemp(i,9), i=1, nprint), & (dattemp(i,10), i=1, nprint), (dattemp(i,11),i=1,nprint), & dtmax, (isteps(i), i=1,nprint), (iphase(i),i=1,nprint), & nptmass, (listpm(i), i=1,nptmass) else ! !--allocate a temporary array for (double precision) variables ! if (allocated(dattemps)) deallocate(dattemps) allocate(dattemps(npart_max,ncolstep),stat=ierr) if (ierr /= 0) print*,'not enough memory in read_data_mbate' print "(a)",'single precision dump' read(15,end=55,iostat=ierr) udisti, umassi, utimei, & nprint, n1, n2, timesi, gammasi, rhozeros, RK2s, & (dattemps(i,7), i=1, nprint),escaps, tkins, tgravs, tterms, & (dattemps(i,1), i=1, nprint), (dattemps(i,2), i=1, nprint), & (dattemps(i,3), i=1, nprint), (dattemps(i,4), i=1, nprint), & (dattemps(i,5), i=1, nprint), (dattemps(i,6), i=1, nprint), & (dattemps(i,8), i=1, nprint), (dattemps(i,9), i=1, nprint), & (dattemps(i,10), i=1, nprint), (dattemps(i,11),i=1,nprint), & dtmaxs, (isteps(i), i=1,nprint), (iphase(i),i=1,nprint), & nptmass, (listpm(i), i=1,nptmass) endif ! !--set transformation factors between code units/real units ! call get_nearest_time_unit(utimei,unitx,unitslabel(0)) units(0) = unitx ! convert to real*4 call get_nearest_length_unit(udisti,unitx,unitlabelx) units(1:3) = unitx unitslabel(1:3) = unitlabelx units(4:6) = udisti/utimei unitslabel(4:6) = ' [cm/s]' units(7) = unitx unitslabel(7) = unitlabelx units(8) = (udisti/utimei)**2 unitslabel(8) = ' [erg/g]' units(9) = umassi unitslabel(9) = ' [g]' units(10) = umassi/udisti**3 unitslabel(10) = ' [g/cm^3]' ! !--convert to single precision and separate pt masses from normal particles ! ipart = 0 do i=1,nprint if (iphase(i)==0) then ipart = ipart + 1 if (doubleprec) then dat(ipart,1:ncolstep,j) = real(dattemp(i,1:ncolstep)) else dat(ipart,1:ncolstep,j) = dattemps(i,1:ncolstep) endif endif enddo npart = ipart ! !--place point masses after normal particles ! nptmassi = 0 do i=1,nprint if (iphase(i) >= 1) then ipart = ipart + 1 nptmassi = nptmassi + 1 if (doubleprec) then dat(ipart,1:ncolstep,j) = real(dattemp(i,1:ncolstep)) else dat(ipart,1:ncolstep,j) = dattemps(i,1:ncolstep) endif endif enddo if (nptmass > 0) print*,' Number of point masses = ',nptmass if (nptmassi /= nptmass) print *,'WARNING: nptmass from iphase =',nptmassi,'not equal to nptmass' ! !--put any others as unknown ! nunknown = 0 do i=1,nprint if (iphase(i) < 0) then ipart = ipart + 1 nunknown = nunknown + 1 if (doubleprec) then dat(ipart,1:ncolstep,j) = real(dattemp(i,1:ncolstep)) else dat(ipart,1:ncolstep,j) = dattemps(i,1:ncolstep) endif endif enddo if (nunknown > 0) print *,nunknown,' particles of unknown type (probably dead)' if (allocated(dattemp)) deallocate(dattemp) if (allocated(dattemps)) deallocate(dattemps) if (allocated(isteps)) deallocate(isteps) if (allocated(iphase)) deallocate(iphase) npartoftype(1,j) = npart npartoftype(2,j) = nptmassi npartoftype(3,j) = nunknown headertags(1:14) = (/'udist','umass','utime','npart',& 'n1 ','n2 ','time ','gamma',& 'rho0 ','RK2 ','escap','tkin ',& 'tgrav','tterm'/) if (doubleprec) then gamma(j) = real(gammai) time(j) = real(timei) headervals(1:14,j) = (/real(udisti),real(umassi),real(utimei),real(nprint),& real(n1),real(n2),real(timei),real(gammai),& real(rhozero),real(RK2),real(escap),real(tkin), & real(tgrav),real(tterm)/) else gamma(j) = gammasi time(j) = timesi headervals(1:14,j) = (/real(udisti),real(umassi),real(utimei),real(nprint),& real(n1),real(n2),real(timesi),real(gammasi),& real(rhozeros),real(RK2s),real(escaps),real(tkins), & real(tgravs),real(tterms)/) endif print*,' time = ',time(j),' gamma = ',gamma(j) if (ierr /= 0) then print "(a)",'*** INCOMPLETE DATA ***' nstepsread = nstepsread + 1 exit over_steps_in_file else nstepsread = nstepsread + 1 endif j = j + 1 enddo over_steps_in_file endif 55 continue ! !--reached end of file ! close(15) if (j-1 > 0) then print*,'>> end of dump file: nsteps =',j-1,'ntot = ', & sum(npartoftype(:,j-1)),'nghost=',npartoftype(2,j-1) endif end subroutine read_data_mbate !------------------------------------------------------------ ! set labels for each column of data !------------------------------------------------------------ subroutine set_labels_mbate use labels use params use settings_data use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_mbate ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_mbate ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ih = 7 ! smoothing length iutherm = 8 ! thermal energy ipmass = 9 ! particle mass irho = 10 ! location of rho in data array if (ncolumns > 10) then label(11) = 'dgrav' endif label(ix(1:ndim)) = labelcoord(1:ndim,1) do i=1,ndimV label(ivx+i-1) = 'v\d'//labelcoord(i,1) enddo label(irho) = 'density' label(iutherm) = 'u' label(ih) = 'h' label(ipmass) = 'particle mass' ! !--set labels for vector quantities ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//labelcoord(i,1) enddo ! !--set labels for each particle type ! ntypes = 3 !!maxparttypes labeltype(1) = 'gas' labeltype(2) = 'sink' labeltype(3) = 'unknown' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. UseTypeInRenderings(3) = .true. end subroutine set_labels_mbate end module readdata_mbate danieljprice-splash-4d1f09c/src/read_data_mhutch.f90000066400000000000000000000420271477365367100224620ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! the data is stored in the global array dat ! ! THIS VERSION FOR SARAH MADDISON+MARK HUTCHISON'S DUSTY-SPH CODE ! -> Now automatically handles single/double precision ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_mhutch implicit none public :: read_data_mhutch, set_labels_mhutch private contains subroutine read_data_mhutch(rootname,indexstart,ipos,nstepsread) use particle_data, only:npartoftype,time,gamma,dat,maxpart,maxstep,maxcol,iamtype use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,iverbose,debugmode use mem_allocation, only:alloc use system_utils, only:lenvironment integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+4) :: datfile integer :: i,icol,ierr,iunit,j,ilast integer :: ihead1,ihead2,ihead3 ! # of items on header lines integer :: ncol_max,ndim_max,npart_max,ndimV_max,nstep_max integer :: ncolstep,np,nstepsinfile integer :: norigin,ncr,istart,iout,nmlmax,index,ratio integer :: fluidsw,itrace integer, dimension(:), allocatable :: head1 integer, dimension(:), allocatable :: head2 real(doub_prec), dimension(:), allocatable :: head3 real(doub_prec) :: timei,dt,sopt0 real(doub_prec) :: gammai real(doub_prec), dimension(:), allocatable :: dattemp integer, dimension(:), allocatable :: iam integer, dimension(:), allocatable :: iwas iunit = 11 ! file unit number ndim_max = 1 ndimV_max = 1 nstepsread = 0 if (rootname(1:1) /= ' ') then datfile = trim(rootname) !print*,'rootname = ',rootname else print*,' **** no data read **** ' return endif if (iverbose >= 1) print "(1x,a)",'reading Maddison/Hutchison format' write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! open(unit=iunit,iostat=ierr,file=datfile,status='old',form='unformatted') if (ierr /= 0) then print*,' *** Error opening '//trim(datfile)//' ***' return endif ! !--read first header line ! read(iunit,iostat=ierr,end=80) ihead1,ihead2,ihead3,ncolstep,np allocate(head1(ihead1)) allocate(head2(ihead2)) allocate(head3(ihead3)) read(iunit,iostat=ierr,end=80) head1(1:ihead1) read(iunit,iostat=ierr,end=80) head2(1:ihead2) read(iunit,iostat=ierr,end=80) head3(1:ihead3) ! Header one variables norigin = head1(1) ncr = head1(2) istart = head1(3) iout = head1(4) nmlmax = head1(5) index = head1(6) ratio = head1(7) itrace = head1(8) ! Header two variables ndim = abs(head2(1)) fluidsw = head2(2) !velsw = head2(3) !dragsw = head2(4) !Bkernsw = head2(5) !Dkernsw = head2(6) !freesw = head2(7) !stopgas = head2(8) !coolsw = head2(9) !interpsw = head2(10) !voidsw = head2(11) !phasesw = head2(12) !gravsw = head2(13) !photosw = head2(14) !eossw = head2(15) !masssw = head2(16) !usenumdens = head2(17) !varhsw = head2(18) !tracesw = head2(19) !timesw = head2(20) !growsw = head2(21) !shocksw = head2(22) !wavesw = head2(23) !plotsw = head2(24) !disc1dsw = head2(25) ! Header three variables dt = head3(1) timei = head3(2) sopt0 = head3(3) gammai = head3(4) deallocate(head1) deallocate(head2) deallocate(head3) ncolstep = ncolstep-2 ! minus 2 because iwas and iam read individually ndimV = 3 ! always have 3 velocity components written to file print "(a,i2,a,f8.4)",' ncolumns: ',ncolstep,' gamma: ',gammai ! !--check for basic errors in first line ! if (ierr /= 0 .or. ncr < 0 .or. istart < 0 & .or. iout < 0 .or. nmlmax < 0 .or. index < 0 .or. ratio < 0) then print "(a)",' *** Error reading header ***' print*,' norigin = ',norigin,' ncr = ',ncr,' istart =',istart,' iout = ',iout print*,' nmlmax = ',nmlmax,' index = ',index,' ratio =',ratio close(iunit) return endif ! !--Check for errors ! if (ierr /= 0 .or. np < 0 .or. np > 1.e9 .or. itrace > np) then print*,'n = ',np,' dt = ',dt,' time = ',timei,' i = ',itrace print*,'*** error reading timestep header ***' close(iunit) return endif ! !--check for errors in 3rd line ! if (ndim > 3 .or. ndimV > 3) then print*,'*** error in header: ndim or ndimV in file > 3' ndim = 3 ndimV = 3 close(iunit) return endif nstepsinfile = 1 ! nmlmax/iout nstep_max = 1 ! max(nstepsinfile,maxstep) nstepsread = 0 npart_max = maxpart ncol_max = ncolstep ! !--read first step ! over_steps: do i = indexstart,indexstart + nstepsinfile - 1 ! !--allocate memory for data arrays ! nstep_max = nstepsinfile !max(nstep_max,nfiles,maxstep,indexstart) npart_max = max(np,maxpart,norigin) if (.not.allocated(dat) .or. np > maxpart & .or. nstep_max > maxstep .or. ncol_max > maxcol) then call alloc(npart_max,nstep_max,ncolstep+ncalc,mixedtypes=.true.) endif ! !--now that memory is allocated, put header quantities -> splash quantities ! time(i) = timei gamma(i) = gammai npartoftype(1,i) = np if (iverbose >= 1) then print "(a,i5,a,f8.4,a,i8,a,f8.4)",' step:',i,' time:',time(i),' npart:',np,' dt:',dt else print "(a,i5,a,f8.4,a,i8,a,i8)",' step:',i,' time:',time(i),' npart:',np endif if (ncolstep /= ncol_max) then print*,'*** Warning number of columns not equal for timesteps' ncolumns = ncolstep if (iverbose >= 1) print*,'ncolumns = ',ncolumns,ncol_max if (ncolumns > ncol_max) ncol_max = ncolumns endif ncolumns = ncolstep nstepsread = nstepsread + 1 ! !--read data for this timestep ! allocate(iwas(np)) read(iunit,iostat=ierr,end=80) iwas(1:np) if ( any(iwas < 1).or.any(iwas > norigin) ) then do j = 1,np iwas(j) = j enddo endif npartoftype(:,i) = 0 allocate(iam(norigin)) iam(:) = 3 read(iunit,iostat=ierr,end=80) iam(iwas(:)) do j=1,norigin select case(iam(j)) case(1) ! GAS npartoftype(1,i) = npartoftype(1,i) + 1 iamtype(j,i) = 1_int1 case(0) ! DUST npartoftype(2,i) = npartoftype(2,i) + 1 iamtype(j,i) = 2_int1 case default ! DELETED PARTICLES npartoftype(3,i) = npartoftype(3,i) + 1 iamtype(j,i) = 3_int1 end select enddo deallocate(iam) if (kind(dat) /= kind(dattemp)) then if (debugmode) print*,' converting kind from ',kind(dattemp),' to ',kind(dat) allocate(dattemp(norigin)) !dattemp(:) = 0D0 !--convert precision !do icol=1,ncolstep-1 ! all columns except h do icol=1,ncolstep ! all columns with h read(iunit,iostat=ierr,end=80) dattemp(iwas(:)) dat(1:norigin,icol,i) = real(dattemp) enddo deallocate(dattemp) else !--read directly into dat array if data types are the same !do icol=1,ncolstep-1 ! all columns except h do icol=1,ncolstep ! all columns with h read(iunit,iostat=ierr,end=80) dat(iwas(:),icol,i) enddo endif deallocate(iwas) enddo over_steps close(unit=11) ilast = indexstart+nstepsinfile - 1 ncolumns = ncol_max call set_labels_mhutch if ( fluidsw < 0 .and. .not.lenvironment('NSPLASH_BARYCENTRIC') ) then call fake_twofluids endif if (npartoftype(2,ilast) > 0) then print*,' ngas = ',npartoftype(1,ilast),' ndust = ',npartoftype(2,ilast) if (npartoftype(3,ilast) > 0) print*,' nunknown = ',npartoftype(3,ilast) endif if (debugmode) print*,'DEBUG> Read steps ',indexstart,'->',indexstart + nstepsread - 1, & ' last step ntot = ',sum(npartoftype(:,indexstart+nstepsread-1)) return 80 continue print*,' *** data file empty : no timesteps ***' return contains !-------------------------------------------- subroutine fake_twofluids use labels, only:idustfrac,irho,ix,ih,ipmass,ivx,ideltav integer :: ndust,jdust integer :: ntoti real :: rhodust,rhogas,rhotot,dustfraci,pmassgas,pmassdust,pmassj real, dimension(ndimV) :: veli,vgas,vdust,deltav !integer :: itemp !integer :: ifx,ify,ifz integer :: ir_grain !integer :: ics !integer :: idhdt !integer :: idepsdt !do i=1,ndim ! ix(i) = i ! x,y,z positions !enddo !!--2D means x-z !if (ndim==2) ix(2) = 3 ! x,z positions if 2D !ivx = 4 ! velocity (vector so it takes 3 rows) !irho = 7 ! density !ipmass = 8 ! mass !iutherm = 9 ! thermal energy !idendt = 10 ! time derivative of thermal energy !itemp = 11 ! temperature !ifx = 12 ! force in x direction !ify = 13 ! force in y direction !ifz = 14 ! force in z direction ir_grain = 15 ! grain size !ics = 16 ! sound speed !ih = 17 ! smoothing length !idhdt = 18 ! time derivative of h !idustfrac = 19 ! dust fraction !idepsdt = 20 ! time derivative of dust fraction if (idustfrac > 0 .and. irho > 0) then do i=indexstart,indexstart+nstepsread-1 ntoti = sum(npartoftype(:,i)) if (.not.allocated(dat) .or. (ntoti + npartoftype(1,i)) > maxpart) then call alloc(ntoti + npartoftype(1,i),maxstep,maxcol,mixedtypes=.true.) endif ndust = 0 !--zero the properties of newly created dust particles dat(ntoti+1:ntoti+npartoftype(1,i),:,i) = 0. do j=1,ntoti if (iamtype(j,i)==1) then ndust = ndust + 1 ! one dust particle for every gas particle rhotot = dat(j,irho,i) dustfraci = dat(j,idustfrac,i) rhogas = rhotot*(1. - dustfraci) rhodust = rhotot*dustfraci !--replace global properties with gas-only stuff dat(j,irho,i) = rhogas !--copy x, smoothing length onto dust particle jdust = ntoti + ndust !--fix dust fraction for viewing purposes !dat(jdust,idustfrac,i) = dustfraci !dat(j,idustfrac,i) = 1.-dustfraci !--fix grain size to be for dust only dat(jdust,ir_grain,i) = dat(j,ir_grain,i) dat(j,ir_grain,i) = 0. !--fill in dust properties if (ndim > 0) dat(jdust,ix(1:ndim),i) = dat(j,ix(1:ndim),i) if (ih > 0) dat(jdust,ih,i) = dat(j,ih,i) if (irho > 0) dat(jdust,irho,i) = rhodust iamtype(ntoti + ndust,i) = 2 !--particle masses if (ipmass > 0) then pmassj = dat(j,ipmass,i) pmassgas = pmassj*(1. - dustfraci) pmassdust = pmassj*dustfraci dat(j,ipmass,i) = pmassgas dat(jdust,ipmass,i) = pmassdust endif !--velocities if (ideltav > 0 .and. ivx > 0 .and. ndimV > 0) then veli(:) = dat(j,ivx:ivx+ndimV-1,i) deltav(:) = dat(j,ideltav:ideltav+ndimV-1,i) if ( rhodust < 1.e-30 ) then vgas(:) = veli(:) !vdust(:) = 0. vdust(:) = 1.e10 ! Dirty way to clean up axis else vgas(:) = veli(:) - rhodust/rhotot*deltav(:) vdust(:) = veli(:) + rhogas/rhotot*deltav(:) endif dat(j ,ivx:ivx+ndimV-1,i) = vgas(:) dat(jdust,ivx:ivx+ndimV-1,i) = vdust(:) endif endif enddo if (iverbose >= 1) then print "(a,i10,a)",' Creating ',ndust,' fictional dust particles...' print "(a)",' (set NSPLASH_BARYCENTRIC=yes to plot barycentric values)' endif npartoftype(2,i) = npartoftype(2,i) + ndust enddo else print "(a)",' ERROR: could not locate dust-to-gas ratio and/or density' endif end subroutine fake_twofluids end subroutine read_data_mhutch !------------------------------------------------------------ ! set labels for each column of data !------------------------------------------------------------ subroutine set_labels_mhutch use labels, only:ix,ivx,ih,irho,iutherm,ipmass, & iamvec,labelvec,label,labeltype, & idustfrac,ideltav use params use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord integer :: i integer :: idendt,itemp integer :: ifx,ify,ifz integer :: ir_grain integer :: ics integer :: idhdt integer :: idepsdt integer :: iddeltavdt integer :: itcour integer :: itstop integer :: itdiff if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_mhutch ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_mhutch ***' return endif do i=1,ndim ix(i) = i ! x,y,z positions enddo !--2D means x-z if (ndim==2) ix(2) = 3 ! x,z positions if 2D ivx = 4 ! velocity (vector so it takes 3 rows) irho = 7 ! density ipmass = 8 ! mass iutherm = 9 ! thermal energy idendt = 10 ! time derivative of thermal energy itemp = 11 ! temperature ifx = 12 ! force in x direction ify = 13 ! force in y direction ifz = 14 ! force in z direction ir_grain = 15 ! grain size ics = 16 ! sound speed ih = 17 ! smoothing length idhdt = 18 ! time derivative of h idustfrac = 19 ! dust fraction idepsdt = 20 ! time derivative of dust fraction ideltav = 21 iddeltavdt = 24 itcour = 27 itstop = 28 itdiff = 29 !!TESTING ! itemp = 10 ! temperature ! ifx = 11 ! force in x direction ! ify = 12 ! force in y direction ! ifz = 13 ! force in z direction ! ir_grain = 14 ! grain size ! ics = 15 ! sound speed ! ih = 16 ! smoothing length ! idhdt = 17 ! time derivative of h ! idustfrac = 18 ! dust fraction ! idepsdt = 19 ! time derivative of dust fraction ! ! ideltav = 20 !!TESTING iamvec(ifx:ifz) = ifx iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' labelvec(ifx:ifz) = 'f' label(1:3) = labelcoord(1:3,1) label(ivx:ivx+ndimV-1) = 'v_'//labelcoord(1:3,1) label(irho) = '\rho' label(ipmass) = 'm_{particle}' label(iutherm) = 'u' label(idendt) = 'du/dt' label(itemp) = 'Temp' label(ifx:ifz) = 'f_'//labelcoord(1:3,1) label(ir_grain) = 's_{grain}' label(ics) = 'cs' label(ih) = 'h' label(idhdt) = 'dh/dt' label(idustfrac) = '\epsilon' label(idepsdt) = 'd\epsilon/dt' label(ideltav) = '\Delta v_x' label(ideltav+1) = '\Delta v_y' label(ideltav+2) = '\Delta v_z' label(iddeltavdt) = 'd\Delta v_x/dt' label(iddeltavdt+1) = 'd\Delta v_y/dt' label(iddeltavdt+2) = 'd\Delta v_z/dt' label(itcour) = 't_{cour}' label(itstop) = 't_{stop}' label(itdiff) = 't_{diff}' ! !--set labels for each type of particles ! ntypes = 3 labeltype(1) = 'gas' labeltype(2) = 'dust' labeltype(3) = 'unknown' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .true. UseTypeInRenderings(3) = .false. end subroutine set_labels_mhutch end module readdata_mhutch danieljprice-splash-4d1f09c/src/read_data_ndspmhd.f90000066400000000000000000000376021477365367100226320ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! the data is stored in the global array dat ! ! THIS VERSION FOR DAN'S SPMHD CODE (BINARY DUMPS) ! -> Now automatically handles single/double precision ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_ndspmhd use params, only:doub_prec,sing_prec implicit none public :: read_data_ndspmhd, set_labels_ndspmhd, file_format_is_ndspmhd private contains subroutine read_data_ndspmhd(rootname,indexstart,ipos,nstepsread) use particle_data, only:npartoftype,time,gamma,headervals,dat,maxpart,maxstep,maxcol,iamtype use filenames, only:nfiles use settings_data, only:ndim,ndimV,ncolumns,ncalc,icoords,iformat, & buffer_data,iverbose,debugmode use mem_allocation, only:alloc use geometry, only:labelcoordsys use system_utils, only:lenvironment use labels, only:labeltype,print_types,headertags integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+4) :: datfile integer :: i,icol,ierr,iunit,ilen,j,ilast integer :: ncol_max,ndim_max,npart_max,ndimV_max,nstep_max integer :: npartin,ntotin,ncolstep,nparti,ntoti integer, dimension(3) :: ibound logical :: reallocate, singleprecision real, dimension(3) :: xmin, xmax integer, parameter :: max_header_vars = 9 real(doub_prec) :: header_dp(max_header_vars) real(sing_prec) :: header_sp(max_header_vars) real :: header(max_header_vars), hfact real(doub_prec), dimension(:), allocatable :: dattempd real(sing_prec), dimension(:), allocatable :: dattemp integer, dimension(:), allocatable :: itype character(len=20) :: geomfile iunit = 11 ! file unit number ndim_max = 1 ndimV_max = 1 nstepsread = 0 if (rootname(1:1) /= ' ') then datfile = trim(rootname) !print*,'rootname = ',rootname else print*,' **** no data read **** ' return endif if (iverbose >= 1) print "(1x,a)",'reading ndspmhd format' write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! open(unit=iunit,iostat=ierr,file=datfile,status='old',form='unformatted') if (ierr /= 0) then print*,' *** Error opening '//trim(datfile)//' ***' return endif ! !--read first header line ! singleprecision = .false. read(iunit,iostat=ierr,end=80) header_dp(1),npartin,ntotin,header_dp(2), & header_dp(3),ndim_max,ndimV_max,ncol_max,iformat ! print*,'time = ',timeind,' hfact = ',hfactind,' ndim=',ndim_max,'ncol=',ncol_max ! print*,'npart = ',npartin,ntotin,geomfile if (ierr /= 0 .or. ndim_max <= 0 .or. ndim_max > 3 & .or. ndimV_max <= 0 .or. ndimV_max > 3 & .or. ncol_max <= 0 .or. ncol_max > 100 & .or. npartin <= 0 .or. npartin > 1e7 .or. ntotin <= 0 .or. ntotin > 1e7 & .or. iformat < 0 .or. iformat > 10) then ! !--try single precision ! rewind(iunit) read(iunit,iostat=ierr,end=80) header_sp(1),npartin,ntotin,header_sp(2), & header_sp(3),ndim_max,ndimV_max,ncol_max,iformat singleprecision = .true. if (ierr /= 0 .or. ndim_max <= 0 .or. ndim_max > 3 & .or. ndimV_max <= 0 .or. ndimV_max > 3 & .or. ncol_max <= 0 .or. ncol_max > 100 & .or. npartin <= 0 .or. npartin > 1e7 .or. ntotin <= 0 .or. ntotin > 1e7 & .or. iformat < 0 .or. iformat > 10) then print "(a)",' *** Error reading first header ***' print*,' time = ',header_sp(1),' hfact = ',header_sp(3),' ndim=',ndim_max,'ncol=',ncol_max close(iunit) return endif endif ! !--allocate memory for data arrays ! if (buffer_data) then nstep_max = max(nfiles,maxstep,indexstart) else nstep_max = max(1,maxstep,indexstart) endif npart_max = max(int(1.5*ntotin),maxpart) if (.not.allocated(dat) .or. ntotin > maxpart & .or. nstep_max > maxstep .or. ncol_max > maxcol) then call alloc(npart_max,nstep_max,ncol_max+ncalc,mixedtypes=.true.) endif ! !--rewind file ! rewind(iunit) i = indexstart nstepsread = 0 reallocate = .false. npart_max = maxpart nstep_max = maxstep geomfile = ' ' ! !--read header line for this timestep ! if (singleprecision) then if (debugmode) print "(a)",'DEBUG: single precision dump' read(iunit,iostat=ierr) header_sp(1),nparti,ntoti,header_sp(2), & header_sp(3),ndim,ndimV,ncolstep,iformat,ibound(1:ndim), & header_sp(4:3+2*ndim),ilen,geomfile(1:ilen) header = real(header_sp) else if (debugmode) print "(a)",'DEBUG: double precision dump' read(iunit,iostat=ierr) header_dp(1),nparti,ntoti,header_dp(2), & header_dp(3),ndim,ndimV,ncolstep,iformat,ibound(1:ndim), & header_dp(4:3+2*ndim),ilen,geomfile(1:ilen) header = real(header_dp) endif if (ierr /= 0) then print*,'*** error reading timestep header ***' close(iunit) return else ! count this as a successfully read timestep, even if data is partial nstepsread = nstepsread + 1 endif time(i) = header(1) gamma(i) = header(2) hfact = header(3) xmin(1:ndim) = header(4:3+ndim) xmax(1:ndim) = header(4+ndim:4+2*ndim-1) headertags(1:7) = (/'time ','npart','ntot ','gamma','hfact','ndim ','ndimV'/) headervals(1:7,i) = (/time(i),real(nparti),real(ntoti),gamma(i),hfact,real(ndim),real(ndimV)/) npartoftype(1,i) = nparti npartoftype(3,i) = ntoti - nparti if (iverbose >= 1) then print "(a14,':',es10.3,a6,':',i8,a8,':',i8)",' time',time(i),'npart',nparti,'ntotal',ntoti print "(a14,':',i8,a8,':',f8.4,a8,':',f8.4)",' ncolumns',ncolstep,'gamma',gamma(i),'hfact',hfact print "(a14,':',i8,a8,':',i8)",'ndim',ndim,'ndimV',ndimV else print "(1x,a,':',es10.3,a8,':',i8,a8,':',i8)",'time',time(i),'npart',nparti,'ntotal',ntoti endif select case(geomfile(1:6)) case('cylrpz') icoords = 2 case('sphrpt') icoords = 3 case default icoords = 1 end select if (icoords /= 1) print "(a14,a)",' geometry: ',trim(geomfile)//' ('//trim(labelcoordsys(icoords))//')' if (iverbose >= 1 .and. any(ibound(1:ndim) /= 0)) then print "(a14,':',a15,' =',3(f8.4))",'boundaries','xmin',xmin(1:ndim) print "(15x,a15,' =',3(f8.4))",'xmax',xmax(1:ndim) endif ! !--check for errors in timestep header ! if (ndim > 3 .or. ndimV > 3) then print*,'*** error in header: ndim or ndimV in file> 3' nstepsread = nstepsread - 1 ndim = ndim_max ndimV = ndimV_max close(iunit) return endif if (ndim > ndim_max) ndim_max = ndim if (ndimV > ndimV_max) ndimV_max = ndimV if (ncolstep /= ncol_max) then print*,'*** Warning number of columns not equal for timesteps' ncolumns = ncolstep if (iverbose >= 1) print*,'ncolumns = ',ncolumns,ncol_max if (ncolumns > ncol_max) ncol_max = ncolumns endif if (ncolstep > maxcol) then reallocate = .true. ncolumns = ncolstep ncol_max = ncolumns else ncolumns = ncolstep endif if (ntoti > maxpart) then !print*, 'ntot greater than array limits!!' reallocate = .true. npart_max = int(1.5*ntoti) endif if (i > maxstep) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate) then call alloc(npart_max,nstep_max,ncol_max+ncalc,mixedtypes=.true.) endif if (ntoti > 0) then if (singleprecision) then allocate(dattemp(ntoti)) else allocate(dattempd(ntoti)) endif do icol=1,ncolstep if (singleprecision) then read (iunit,iostat=ierr) dattemp(1:ntoti) dat(1:ntoti,icol,i) = real(dattemp(1:ntoti)) else read (iunit,iostat=ierr) dattempd(1:ntoti) dat(1:ntoti,icol,i) = real(dattempd(1:ntoti)) endif if (ierr /= 0) print "(a,i2,a)",'*** error reading column ',icol,' ***' enddo if (allocated(dattempd)) deallocate(dattempd) if (allocated(dattemp)) deallocate(dattemp) allocate(itype(ntoti)) read(iunit,iostat=ierr) itype(1:ntoti) if (ierr /= 0) then if (debugmode) print "(a)",'DEBUG: itype not found in dump file' iamtype(1:nparti,i) = 1 iamtype(nparti+1:ntoti,i) = 3 else ! !--assign SPLASH types from ndspmhd types ! npartoftype(:,i) = 0 do j=1,ntoti if (j > nparti) then if (itype(j)==12) then iamtype(j,i) = 4 npartoftype(4,i) = npartoftype(4,i) + 1 else iamtype(j,i) = 3 npartoftype(3,i) = npartoftype(3,i) + 1 endif elseif (itype(j)==2) then iamtype(j,i) = 2 npartoftype(2,i) = npartoftype(2,i) + 1 else iamtype(j,i) = 1 npartoftype(1,i) = npartoftype(1,i) + 1 endif enddo endif if (allocated(itype)) deallocate(itype) else npartoftype(:,i) = 0 npartoftype(1,i) = 1 dat(:,:,i) = 0. endif ! !--close data file and return ! close(unit=11) ilast = i ! !--ONE FLUID DUST: FAKE IT AS IF IT IS TWO FLUIDS ! (copy the particles, then copy gas properties onto first lot, then dust properties onto second lot) ! ncolumns = ncol_max ndim = ndim_max ndimV = ndimV_max call set_labels_ndspmhd !if (iformat==5 .and. .not.lenvironment('NSPLASH_BARYCENTRIC')) then ! call fake_twofluids ! iformat = 1 !endif if (any(npartoftype(2:,ilast) > 0)) call print_types(npartoftype(:,ilast),labeltype) if (debugmode) print*,'DEBUG> Read steps ',indexstart,'->',indexstart + nstepsread - 1, & ' last step ntot = ',sum(npartoftype(:,indexstart+nstepsread-1)) return 80 continue print*,' *** data file empty : no timesteps ***' return end subroutine read_data_ndspmhd !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_ndspmhd use labels, only:ix,ivx,ih,irho,iutherm,ipmass,ipr,iBfirst, & idivB,iJfirst,iamvec,labelvec,label,labeltype, & irhorestframe,idustfrac,ideltav use params use settings_data, only:ndim,ndimV,iformat,ntypes, & UseTypeInRenderings,ncolumns use geometry, only:labelcoord integer :: i,icol if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_ndspmhd ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_ndspmhd ***' return endif do i=1,ndim ix(i) = i enddo ivx = ndim + 1 ih = ndim + ndimV + 1 ! smoothing length irho = ndim + ndimV + 2 ! location of rho in data array iutherm = ndim + ndimV + 3 ! thermal energy ipmass = ndim + ndimV + 4 ! particle mass label(ix(1:ndim)) = labelcoord(1:ndim,1) ! !--label vector quantities (e.g. velocity) appropriately ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' label(irho) = '\gr' label(iutherm) = 'u' label(ih) = 'h ' label(ipmass) = 'particle mass' label(ndim + ndimV+5) = '\ga' label(ndim + ndimV+6) = '\ga\du' icol = ndim+ndimV + 7 if (iformat==2 .or. iformat==4) then ! !--mag field (vector) ! label(icol) = '\ga\dB' iBfirst = icol+1 ! location of Bx iamvec(iBfirst:iBfirst+ndimV-1) = iBfirst labelvec(iBfirst:iBfirst+ndimV-1) = 'B' icol = icol + ndimV ! !--more scalars ! icol = icol + 1 label(icol) = '\psi' icol = icol + 1 ipr = icol ! pressure label(ipr) = 'P' icol = icol + 1 label(icol) = 'div v' icol = icol + 1 idivB = icol label(idivB) = 'div B' ! !--current density (vector) ! iJfirst = icol + 1 iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = 'J' icol = icol + ndimV icol = icol + 1 label(icol) = 'grad h' iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = 'force' icol = icol + ndimV iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = 'A' icol = icol + ndimV else ipr = icol ! pressure label(ipr) = 'P' icol = icol + 1 label(icol) = 'div v' icol = icol + 1 label(icol) = 'grad h' iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = 'force' icol = icol + ndimV iBfirst = 0 if (ncolumns > 20) then iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = 'del^{2} v' icol = icol + ndimV iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = 'grad (div {\bf v})' icol = icol + ndimV endif endif if (iformat==5) then icol = icol + 1 label(icol) = 'Dust fraction' idustfrac = icol iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = '\Deltav' ideltav = icol + 1 icol = icol + ndimV elseif (iformat > 2) then irhorestframe = irho icol = icol + 1 irho = icol label(icol) = 'rho*' !irho = icol icol = icol + 1 label(icol) = 'sqrt g' iamvec(icol+1:icol+ndimV) = icol + 1 labelvec(icol+1:icol+ndimV) = 'pmom' icol = icol + ndimV endif ! !--set labels for each type of particles ! ntypes = 4 labeltype(1) = 'gas' labeltype(2) = 'dust' labeltype(3) = 'ghost' labeltype(4) = 'ghost (dust)' UseTypeInRenderings(:) = .true. !----------------------------------------------------------- return end subroutine set_labels_ndspmhd !----------------------------------------------------------- ! ! check if a file is in ndspmhd format ! !----------------------------------------------------------- logical function file_format_is_ndspmhd(filename) result(is_ndspmhd) character(len=*), intent(in) :: filename integer :: iunit,npartin,ntotin,ndim_max,ndimV_max,ncol_max,iformat,ierr real(kind=doub_prec) :: header_dp(3) is_ndspmhd = .false. ! ! filename must end in .dat ! if (index(filename,'.dat') <= 0) return ! ! open file and read the first line ! open(newunit=iunit,iostat=ierr,file=filename,status='old',form='unformatted') if (ierr /= 0) return ! !--read first header line ! read(iunit,iostat=ierr) header_dp(1),npartin,ntotin,header_dp(2), & header_dp(3),ndim_max,ndimV_max,ncol_max,iformat if (ierr /= 0 .or. ndim_max <= 0 .or. ndim_max > 3 & .or. ndimV_max <= 0 .or. ndimV_max > 3 & .or. ncol_max <= 0 .or. ncol_max > 100 & .or. npartin <= 0 .or. npartin > 1e7 .or. ntotin <= 0 .or. ntotin > 1e7 & .or. iformat < 0 .or. iformat > 10) then is_ndspmhd = .false. else is_ndspmhd = .true. endif close(iunit) ! close the file end function file_format_is_ndspmhd end module readdata_ndspmhd danieljprice-splash-4d1f09c/src/read_data_oilonwater.f90000066400000000000000000000302771477365367100233610ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM MATTHEW BATE'S CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! *** CONVERTS TO SINGLE PRECISION *** ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- !--short module storing units information module oilonwaterread use params implicit none real(doub_prec) :: udisti,umassi,utimei end module oilonwaterread module readdata_oilonwater implicit none public :: read_data_oilonwater, set_labels_oilonwater private contains subroutine read_data_oilonwater(rootname,indexstart,ipos,nstepsread) use particle_data use params use settings_data, only:ndim,ndimV,ncolumns,ncalc use mem_allocation use labels, only:ih,ipmass use oilonwaterread, only:udisti,umassi,utimei integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,k,ifile,ierr,ipart integer :: npart_max,nstep_max,ncolstep,npart,nunknown logical :: iexist,doubleprec character(len=len(rootname)+10) :: dumpfile integer :: nprint, n1, n2, nptmass, nstepsalloc integer :: npartoil, npartwater integer, dimension(:), allocatable :: isteps, iphase !--use these lines if dump is double precision real(doub_prec), dimension(:,:), allocatable :: dattemp real(doub_prec) :: timei, gammai real(doub_prec) :: rhozero, RK2 real(doub_prec) :: escap,tkin,tgrav,tterm real(doub_prec) :: dtmax !--use these lines for single precision real :: timesi, gammasi real :: rhozeros, RK2s real :: escaps,tkins,tgravs,tterms real :: dtmaxs nstepsread = 0 nstep_max = 0 npart_max = maxpart ifile = 1 dumpfile = trim(rootname) ! !--check if data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 ncolstep = 18 ! number of columns in file ncolumns = ncolstep ! !--allocate memory initially ! nstep_max = max(nstep_max,indexstart,1) j = indexstart nstepsread = 0 doubleprec = .false. print "(1x,a)",'reading oil-on-water code format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the (unformatted) binary file and read the number of particles ! open(unit=15,iostat=ierr,file=dumpfile,status='old',form='unformatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' else ! !--read the number of particles in the first step, ! allocate memory and rewind ! read(15,end=55,iostat=ierr) udisti,umassi,utimei,nprint,n1,n2,timei,gammai,rhozero,RK2 print*,'npart = ',nprint if (.not.allocated(dat) .or. nprint > npart_max) then npart_max = max(npart_max,INT(1.1*nprint)) call alloc(npart_max,nstep_max,ncolstep+ncalc,mixedtypes=.true.) endif doubleprec = .true. !--try single precision if non-sensible values for time, gamma etc. if (ierr /= 0 .or. timei < 0. .or. timei > 1e30 & .or. gammai < 1. .or. gammai > 10. & .or. rhozero < 0. .or. RK2 < 0. .or. RK2 > 1.e10) then doubleprec = .false. endif rewind(15) endif call set_labels_oilonwater if (ierr /= 0) then print "(a)",'*** ERROR READING TIMESTEP HEADER ***' else ! !--loop over the timesteps in this file ! over_steps_in_file: do npart_max = max(npart_max,nprint) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then if (nstepsread >= 2) then nstepsalloc = 2*nstepsread else nstepsalloc = j endif call alloc(maxpart,nstepsalloc,maxcol,mixedtypes=.true.) endif ! !--allocate integer arrays required for data read ! if (allocated(isteps)) deallocate(isteps) allocate(isteps(npart_max),stat=ierr) if (ierr /= 0) print*,'not enough memory in read_data_oilonwater' if (allocated(iphase)) deallocate(iphase) allocate(iphase(npart_max),stat=ierr) if (ierr /= 0) print*,'not enough memory in read_data_oilonwater' ! !--now read the timestep data in the dumpfile ! write(*,"(a,i5,a)",advance="no") '| step ',j,': ' if (doubleprec) then print "(a)",'double precision dump' ! !--allocate a temporary array for (double precision) variables ! if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(npart_max,ncolstep),stat=ierr) if (ierr /= 0) print*,'not enough memory in read_data_oilonwater' read(15,end=55,iostat=ierr) udisti, umassi, utimei, & nprint, n1, n2, timei, gammai, rhozero, RK2, & (dattemp(i,ih), i=1, nprint),escap, tkin, tgrav, tterm, & ((dattemp(i,k), i=1, nprint),k=1,ih-1), & ((dattemp(i,k), i=1, nprint),k=ih+1,11), & dtmax, & (isteps(i), i=1,nprint), & ((dattemp(i,k), i=1, nprint),k=12,18), & nptmass, & ((dattemp(i,k), i=nprint+1,nprint+nptmass),k=1,6), & (dattemp(i,ipmass), i=nprint+1,nprint+nptmass), & (dattemp(i,ih), i=nprint+1,nprint+nptmass), & (isteps(i), i=nprint+1,nprint+nptmass), & (iphase(i), i=1,nprint) else print "(a)",'single precision dump' read(15,end=55,iostat=ierr) udisti, umassi, utimei, & nprint, n1, n2, timesi, gammasi, rhozeros, RK2s, & (dat(i,ih,j), i=1, nprint),escaps, tkins, tgravs, tterms, & ((dat(i,k,j), i=1, nprint),k=1,ih-1), & ((dat(i,k,j), i=1, nprint),k=ih+1,11), & dtmaxs, & (isteps(i),i=1, nprint), & ((dat(i,k,j), i=1, nprint),k=12,18), & nptmass, & ((dat(i,k,j), i=nprint+1,nprint+nptmass),k=1,6), & (dat(i,ipmass,j), i=nprint+1,nprint+nptmass), & (dat(i,ih,j), i=nprint+1,nprint+nptmass), & (isteps(i), i=nprint+1,nprint+nptmass), & (iphase(i), i=1,nprint) endif ! !--extract time and gamma ! if (doubleprec) then gamma(j) = real(gammai) time(j) = real(timei) else gamma(j) = gammasi time(j) = timesi endif print*,' time = ',time(j),' gamma = ',gamma(j) npart = nprint+nptmass ! !--convert to single precision if necessary ! if (doubleprec) then dat(1:npart,1:ncolstep,j) = real(dattemp(1:npart,1:ncolstep)) endif ! !--set particle types using iphase ! ipart = 0 npartoil = 0 npartwater = 0 nunknown = 0 do i=1,nprint select case(iphase(i)) case(0) npartoil = npartoil + 1 iamtype(i,j) = 1 case(1) npartwater = npartwater + 1 iamtype(i,j) = 2 case default nunknown = nunknown + 1 iamtype(i,j) = 4 end select enddo ! !--set particle type for point masses ! if (nptmass > 0) then iamtype(nprint+1:nprint+nptmass,j) = 3 endif if (nunknown > 0) print *,nunknown,' particles of unknown type (probably dead)' if (allocated(dattemp)) deallocate(dattemp) if (allocated(isteps)) deallocate(isteps) if (allocated(iphase)) deallocate(iphase) npartoftype(1,j) = npartoil npartoftype(2,j) = npartwater npartoftype(3,j) = nptmass npartoftype(4,j) = nunknown print "(1x,3(a,i10))",' n(oil) = ',npartoil,' n(water) = ',npartwater,' nptmass = ',nptmass if (ierr /= 0) then print "(a)",'*** INCOMPLETE DATA ***' nstepsread = nstepsread + 1 exit over_steps_in_file else nstepsread = nstepsread + 1 endif j = j + 1 enddo over_steps_in_file endif 55 continue ! !--reached end of file ! close(15) if (j-1 > 0) then print*,'>> end of dump file: nsteps =',j-1 endif return end subroutine read_data_oilonwater !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_oilonwater use labels, only:label,unitslabel=>unitslabel_default,& ix,ih,ipmass,irho,iutherm,ivx,labeltype,& labelvec,labelzintegration,iamvec,& make_vector_label use params use physcon, only:solarrcgs,solarmcgs use settings_data use geometry, only:labelcoord use oilonwaterread, only:udisti,umassi,utimei use settings_units, only:units=>units_default,unitzintegration integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_oilonwater ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_oilonwater ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ih = 7 ! smoothing length iutherm = 8 ! thermal energy ipmass = 9 ! particle mass irho = 10 ! location of rho in data array if (ncolumns > 10) then label(11) = 'dgrav' label(12) = 'torque t' label(13) = 'torque g' label(14) = 'torque p' label(15) = 'torque v' label(16) = 'torque c' label(17) = 'hecomp' label(18) = 'potential energy' endif label(ix(1:ndim)) = labelcoord(1:ndim,1) do i=1,ndimV label(ivx+i-1) = 'v\d'//labelcoord(i,1) enddo label(irho) = 'density' label(iutherm) = 'u' label(ih) = 'h' label(ipmass) = 'particle mass' ! !--set labels for vector quantities ! call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--set transformation factors between code units/real units ! units(1:3) = udisti/solarrcgs unitslabel(1:3) = ' [R_{\(2281)}]' units(4:6) = udisti/utimei unitslabel(4:6) = ' [cm/s]' units(ih) = units(1) unitslabel(ih) = unitslabel(1) units(iutherm) = (udisti/utimei)**2 unitslabel(iutherm) = ' [erg/g]' units(ipmass) = umassi/solarmcgs unitslabel(ipmass) = ' [M_{\(2281)}]' units(irho) = umassi/udisti**3 unitslabel(irho) = ' [g/cm^3]' !--unit for z integration - leave this as cm to get g/cm^2 in column density unitzintegration = udisti labelzintegration = ' [cm]' !--time units for legend units(0) = utimei/3.1536e7 unitslabel(0) = ' yrs' ! !--set labels for each particle type ! ntypes = 4 labeltype(1) = 'gas (oil)' labeltype(2) = 'gas (water)' labeltype(3) = 'point mass' labeltype(4) = 'unknown' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .true. UseTypeInRenderings(3) = .false. UseTypeInRenderings(4) = .true. end subroutine set_labels_oilonwater end module readdata_oilonwater danieljprice-splash-4d1f09c/src/read_data_pbob.f90000066400000000000000000000262301477365367100221120ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2015 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR .PBOB FILES BY DAVID BROWN ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! !------------------------------------------------------------------------- ! ! The module below contains interface routines to c functions ! that perform the actual read of the .pbob file information ! !------------------------------------------------------------------------- module pbobread use params, only:maxplot,doub_prec use labels, only:lenlabel use, intrinsic :: iso_c_binding, only:c_int,c_double,c_char implicit none character(len=lenlabel), dimension(maxplot) :: blocklabel integer, parameter :: maxtypes = 6 interface subroutine read_pbob_header(filename,npart,ncol,nsteps,ndim,ndimV,time,ierr) bind(c) import character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(out) :: npart,ncol,nsteps,ndim,ndimV,ierr real(kind=c_double), intent(out) :: time end subroutine read_pbob_header subroutine read_pbob_data(filename,np,time_slice,time_val,ierr) bind(c) import implicit none character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(in), value :: np integer(kind=c_int), intent(in), value :: time_slice real(kind=c_double), intent(out) :: time_val integer(kind=c_int), intent(out) :: ierr end subroutine read_pbob_data end interface end module pbobread !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- module readdata_pbob implicit none public :: read_data_pbob, set_labels_pbob private contains subroutine read_data_pbob(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,maxpart,maxcol,maxstep,iamtype use params, only:doub_prec use settings_data, only:ndim,ndimV,ncolumns,ncalc,ipartialread, & ntypes,debugmode !,iverbose use mem_allocation, only:alloc use labels, only:labeltype,print_types use asciiutils, only:cstring use pbobread, only:read_pbob_header,read_pbob_data integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,j,itype,ierr integer :: ncolstep,npart_max,nstep_max,ntoti logical :: iexist,reallocate,goterrors real(doub_prec) :: timetemp nstepsread = 0 goterrors = .false. if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! print "(1x,a)",'reading PBOB format' inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--append .silo on the endif not already present ! datfile=trim(rootname)//'.pbob' inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif endif ! !--read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open file and read header information ! if (debugmode) print*,'DEBUG: reading header...' call read_pbob_header(cstring(datfile),ntoti,ncolstep,nstep_max,ndim,ndimV,timetemp,ierr) if (ierr /= 0) then print "(a)", '*** ERROR READING HEADER ***' return endif ncolumns = ncolstep !if (iverbose >= 1) print "(a,1x,i10,a,es10.3)",' ndim: ',ndim,' time: ',timetemp !if (iverbose >= 1) print "(2(a,1x,i10))",' npart: ',ntoti,' ncolumns: ',ncolstep ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,nstep_max) if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntoti) else ! if first time, save on memory npart_max = int(ntoti) endif endif if (i >= maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol),mixedtypes=.true.) reallocate = .false. endif ! !--copy header data into allocated arrays ! npartoftype(1,i) = ntoti time(i) = real(timetemp) !print*,' time = ',timetemp masstype(:,i) = 0. ! all masses read from file ! !--read particle data ! got_particles: if (ntoti > 0) then do while(ierr == 0 .and. i <= nstep_max) if (i > maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate) call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol),mixedtypes=.true.) call read_pbob_data(cstring(datfile),ntoti,i,timetemp,ierr) if (ierr == 0) then print "(a,i3,a,es10.3)",' time slice #',i,' time = ',timetemp time(i) = real(timetemp) call set_labels_pbob ! sets ntypes and labeltype if (size(iamtype(:,i)) > 1) then npartoftype(:,i) = 0 do j=1,ntoti itype = iamtype(j,i) if (itype > 0 .and. itype <= ntypes) then npartoftype(itype,i) = npartoftype(itype,i) + 1 else ! catch-all "unknown" type npartoftype(ntypes+1,i) = npartoftype(ntypes+1,i) + 1 endif enddo endif i = i + 1 nstepsread = nstepsread + 1 call print_types(npartoftype(:,i),labeltype) endif enddo endif got_particles ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ipartialread = .false. ! !--cover the special case where no particles have been read ! if (ntoti <= 0) then npartoftype(1,i) = 1 dat(:,:,i) = 0. endif return end subroutine read_data_pbob subroutine read_pbob_data_fromc(icol,istep,np,temparr,itype,tag) bind(c) use, intrinsic :: iso_c_binding, only:c_int,c_double,c_char use particle_data, only:dat,iamtype use settings_data, only:debugmode use labels, only:label use asciiutils, only:fstring use pbobread, only:blocklabel integer(kind=c_int), intent(in),value :: icol,istep,np integer(kind=c_int), intent(in) :: itype(np) real(kind=c_double), intent(in) :: temparr(np) character(kind=c_char), intent(in) :: tag(256) integer(kind=c_int) :: i,icolput integer :: nmax icolput = icol if (debugmode) print "(a,i2,a,i2,a)",'DEBUG: reading column ',icol,' -> '//trim(label(icolput)) ! check column is within array limits if (icolput > size(dat(1,:,1)) .or. icolput==0) then print "(a,i2,a)",' ERROR: column = ',icolput,' out of range in read_pbob_data_fromc' return endif if (istep > size(dat(1,1,:)) .or. istep <= 0) then print "(a,i2,a)",' ERROR: step = ',istep,' out of range in read_pbob_data_fromc' return endif blocklabel(icol) = trim(fstring(tag)) ! ensure no array overflows nmax = min(np,size(dat(:,1,1))) ! copy data into main splash array dat(1:nmax,icolput,istep) = real(temparr(1:nmax)) ! set particle type if (size(iamtype(:,1)) > 1) then do i=1,nmax iamtype(i,istep) = int(itype(i),kind=kind(iamtype)) enddo endif return end subroutine read_pbob_data_fromc !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_pbob use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass, & ih,irho,ipr,iutherm,iax!,iBfirst,idivB use params use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord use system_utils, only:envlist,ienvironment use pbobread, only:blocklabel use asciiutils, only:lcase integer :: i,icol if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_pbob ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_pbob ***' return endif ix = 0 iutherm = 0 do i=1,ndim ix(i) = i enddo do icol=1,size(blocklabel) select case(trim(lcase(blocklabel(icol)))) case('x') ix(1) = icol case('vx') ivx = icol case('ax') iax = icol case('h') ih = icol case('p') ipr = icol case('mass','m') ipmass = icol case('density','rho') irho = icol end select label(icol) = trim(blocklabel(icol)) enddo !! set labels of the quantities read in !if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) ! set labels for vector quantities if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'_'//labelcoord(i,1) enddo endif if (iax > 0) then iamvec(iax:iax+ndimV-1) = iax labelvec(iax:iax+ndimV-1) = 'a' do i=1,ndimV label(iax+i-1) = trim(labelvec(iax))//'_'//labelcoord(i,1) enddo endif ! set labels for each particle type ntypes = 3 labeltype(1) = 'interior' labeltype(2) = 'ghost' labeltype(3) = 'boundary' UseTypeInRenderings(:) = .false. UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .true. UseTypeInRenderings(3) = .false. !----------------------------------------------------------- return end subroutine set_labels_pbob end module readdata_pbob danieljprice-splash-4d1f09c/src/read_data_pbob_utils.c000066400000000000000000000117741477365367100231650ustar00rootroot00000000000000/* * This subroutine performs the calls to the PBOB c routines * */ #include #include #include #include #include #include #include extern PBOB *ReadPBOB(char *file_name); extern PARTICLE *ReadParticle(char *file_name,int time_slice,int start_indx,int N); void set_blocklabel(int *icol, char *name); void read_pbob_data_fromc(int icol, int istep, int np, double temparr[np],int itype[np], char *tag); void read_pbob_header(char *filename, int *npart, int *ncol, int *nsteps, int *ndim, int *ndimV, double *time, int *ierr) { *npart = 0; *ierr = 0; *ncol = 0; *nsteps = 0; *time = 0.; *npart = 0; *ndim = 2; *ndimV = 2; *ncol = 15; /* hard wired */ PBOB *pbob = NULL; if ((pbob=ReadPBOB(filename))==NULL) { *ierr = 1; return; } /*printf(" cluster_size = %i \n",pbob->cluster_size); printf(" length_units = %s \n",pbob->length_units); printf(" mass_units = %s \n",pbob->mass_units); printf(" time_units = %s \n",pbob->time_units); printf(" energy_units = %s \n",pbob->internal_energy_units); */ printf(" short title = %s \n",pbob->short_title); printf(" total_particles = %llu \n",pbob->total_particles); printf(" nn_k = %i \n",pbob->nn_k); printf(" time slices = %i \n",pbob->number_of_time_slices); /* printf(" offset = %i \n",pbob->first_particle_byte_offset); printf(" length = %i \n",pbob->particle_length_bytes); */ printf(" endian = %s \n",pbob->endian_str); printf(" version = %s \n",pbob->pbob_version); *nsteps = pbob->number_of_time_slices; *npart = pbob->total_particles; *time = pbob->time; /* printf(" ascii_header: \n"); printf("%s\n",pbob.ascii_header); */ } void read_pbob_data(char *filename, int npart, int time_slice, double *timeval, int *ierr) { PARTICLE *particle = NULL; *ierr = 0; int start_indx = 0; int N = npart; int i; *timeval = -1.; /*printf(" time_slice = %i\n",time_slice);*/ if ((particle=ReadParticle(filename,time_slice,start_indx,N))==NULL) { *ierr = 2; return; } int species[npart]; for (i=0;i> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_rsph implicit none public :: read_data_rsph, set_labels_rsph private contains subroutine read_data_rsph(rootname,indexstart,ipos,nstepsread) use particle_data, only:npartoftype,time,gamma,dat,maxpart,maxstep,maxcol use params ! use labels use filenames, only:nfiles use settings_data, only:ndim,ndimV,ncolumns,ncalc,ntypes, & buffer_data use mem_allocation, only:alloc use geometry, only:labelcoordsys integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+4) :: datfile integer :: i,icol,ierr,iunit,isizeheader integer :: npart_max,nstep_max integer :: ntoti logical :: singleprecision integer*2, dimension(10) :: sheader integer, dimension(10) :: iheader integer*8, dimension(10):: lheader real, dimension(10) :: rheader real(doub_prec), dimension(10) :: dheader character(len=100) :: headerstring character(len=10), dimension(maxplot) :: cheader real, dimension(:,:), allocatable :: dattemp real(doub_prec), dimension(:,:), allocatable :: dattempd common /chead/ cheader iunit = 11 ! file unit number nstepsread = 0 if (rootname(1:1) /= ' ') then datfile = trim(rootname) !print*,'rootname = ',rootname else print*,' **** no data read **** ' return endif print "(1x,a)",'reading RSPH format' write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! open(unit=iunit,iostat=ierr,file=datfile,status='old',form='unformatted') if (ierr /= 0) then print*,'*** Error opening '//trim(datfile)//' ***' return endif i = indexstart ! !--read first header line ! read(iunit,iostat=ierr,end=80) headerstring print "(1x,a)",'header string="'//trim(headerstring)//'"' ! !--read other header lines (short/normal/long ints, reals, doubles) ! read(iunit,iostat=ierr,end=80) sheader(1:10) if (ierr /= 0) then print*,'WARNING: errors during sheader read' endif print "(1x,a,10(1x,i2))",'sheader = ',sheader(1:10) isizeheader = sheader(1) ndim = sheader(2) ndimV = sheader(3) ntypes = sheader(4) ncolumns = sheader(5) + ndim ! ncolumns in sheader + positions ! !--check for errors in sheader ! if (ndim > 3 .or. ndimV > 3 .or. ndim <= 0 .or. ndimV <= 0 .or. & ncolumns <= 0 ) then print*,'*** ERROR: header corrupted: ndim = ',ndim,' ndimV = ', ndimV ndim = 0 ndimV = 0 ntypes = 0 ncolumns = 0 close(iunit) return elseif (ncolumns > maxplot) then print "(1x,a)",'*** WARNING: too many columns for array limits' ncolumns = maxplot print "(1x,a,i2,a)",' reading only first ',ncolumns,' columns' endif read(iunit,iostat=ierr,end=80) iheader(1:isizeheader) if (ierr /= 0) then print*,'WARNING: errors during iheader read' endif print "(1x,a,20(1x,i6))",'iheader = ',iheader(1:isizeheader) ntoti = sum(iheader(1:ntypes)) read(iunit,iostat=ierr,end=80) lheader(1:isizeheader) if (ierr /= 0) then print*,'WARNING: errors during lheader read' endif print "(1x,a,20(1x,i6))",'lheader = ',lheader(1:isizeheader) read(iunit,iostat=ierr,end=80) rheader(1:isizeheader) if (ierr /= 0) then print*,'WARNING: errors during rheader read' endif print "(1x,a,20(1x,f8.2))",'rheader = ',rheader read(iunit,iostat=ierr,end=80) dheader(1:isizeheader) if (ierr /= 0) then print*,'WARNING: errors during dheader read' endif print "(1x,a,20(1x,1pe8.2))",'dheader = ',dheader(1:isizeheader) do icol=1,ncolumns-ndim read(iunit,iostat=ierr,end=80) cheader(icol)(1:isizeheader) enddo ! print "(a)",(trim(cheader(icol)),icol=1,ncolumns-ndim) ! !--allocate/reallocate memory for data arrays ! if (buffer_data) then nstep_max = max(nfiles,maxstep,indexstart) else nstep_max = max(1,maxstep,indexstart) endif npart_max = max(int(2.0*ntoti),maxpart) if (.not.allocated(dat) .or. ntoti > maxpart & .or. nstep_max > maxstep .or. ncolumns > maxcol) then call alloc(npart_max,nstep_max,ncolumns+ncalc) endif ! !--count this as a successful read ! nstepsread = nstepsread + 1 ! !--copy header data into now-allocated arrays ! npartoftype(1,i) = iheader(1) npartoftype(2,i) = iheader(2) npartoftype(3,i) = iheader(3) ntoti = sum(npartoftype(1:ntypes,i)) ! !--determine whether dump is single or double precision ! singleprecision = .true. if (all(abs(rheader(1:isizeheader)) < tiny(rheader))) then singleprecision = .false. print "(1x,a)",'double precision dump' time(i) = real(dheader(1)) print*,'particles per smoothing length = ',dheader(2) print*,'kernel range = ',dheader(3) gamma(i) = real(dheader(4)) else print "(1x,a)",'single precision dump' time(i) = rheader(1) print*,'particles per smoothing length = ',rheader(2) print*,'kernel range = ',rheader(3) gamma(i) = rheader(4) endif print "(/a14,':',f8.4,a8,':',i8,a8,':',i8)",' time',time(i),'npart',npartoftype(1,i),'ntotal',ntoti print "(a14,':',i8,a8,':',f8.4)",' ncolumns',ncolumns,'gamma',gamma(i) print "(a14,':',i8,a8,':',i8)",'ndim',ndim,'ndimV',ndimV ! !--read data arrays ! if (singleprecision) then if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(ndim,ntoti)) ! !--read positions of all particles ! read(iunit,iostat=ierr) dattemp(1:ndim,1:ntoti) if (ierr /=0 ) then print "(a)",'error reading particle positions' else do icol=1,ndim dat(1:ntoti,icol,i) = dattemp(icol,1:ntoti) enddo endif ! !--read rest of data columns ! do icol=ndim+1,ncolumns read(iunit,iostat=ierr) dat(1:ntoti,icol,i) if (ierr /= 0) print "(a,i2)", 'error reading column ',icol enddo else if (allocated(dattempd)) deallocate(dattempd) allocate(dattempd(ndim,ntoti)) ! !--read positions of all particles ! read(iunit,iostat=ierr) dattempd(1:ndim,1:ntoti) if (ierr /=0 ) then print "(a)",'error reading particle positions' else do icol=1,ndim dat(1:ntoti,icol,i) = real(dattempd(icol,1:ntoti)) enddo endif ! !--read rest of data columns ! do icol=ndim+1,ncolumns read(iunit,iostat=ierr) dattempd(1,1:ntoti) if (ierr /= 0) print "(a,i2)", 'error reading column ',icol !--convert to single precision dat(1:ntoti,icol,i) = real(dattempd(1,1:ntoti)) enddo endif if (allocated(dattemp)) deallocate(dattemp) if (allocated(dattempd)) deallocate(dattempd) ! !--close data file and return ! close(unit=iunit) print "(a)",' finished data read ' return 80 continue print*,' *** data file empty : no timesteps ***' return end subroutine read_data_rsph !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_rsph use labels, only:ix,ivx,ih,irho,iutherm,ipmass,ipr,iBfirst, & iamvec,labelvec,label,labeltype use params use settings_data, only:ndim,ndimV,ncolumns,ntypes, & UseTypeInRenderings use geometry, only:labelcoord integer :: i,j character(len=10), dimension(maxplot) :: cheader common /chead/ cheader if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_rsph ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_rsph ***' return endif do i=1,ndim ix(i) = i enddo do i=ndim+1,ncolumns label(i) = cheader(i-ndim) !--blank characters in c are ascii zero - correct these to spaces do j=1,len(label(i)) if (iachar(label(i)(j:j))==0) label(i)(j:j) = ' ' enddo !--set positions of various quantities depending on labels if (label(i)(1:1)=='m' .or. label(i)(1:4)=='mass') then ipmass = i elseif (label(i)(1:3)=='rho' .or. label(i)(1:4)=='dens') then irho = i elseif (label(i)(1:1)=='h' .or. label(i)(1:6)=='smooth') then ih = i elseif (label(i)(1:2)=='u ' .or. label(i)(1:1)=='e') then iutherm = i elseif (label(i)(1:2)=='pr' .or. trim(label(i))=='P') then ipr = i elseif (label(i)(1:1)=='v') then if (ivx==0 .or. i < ivx) ivx = i elseif (label(i)(1:1)=='B') then if (iBfirst==0 .or. i < iBfirst) iBfirst = i endif enddo label(ix(1:ndim)) = labelcoord(1:ndim,1) ! !--label vector quantities (e.g. velocity) appropriately ! if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx+i-1))//'\d'//labelcoord(i,1) enddo endif if (iBfirst > 0) then iamvec(iBfirst:iBfirst+ndimV-1) = iBfirst labelvec(iBfirst:iBfirst+ndimV-1) = 'B' endif ! !--set labels for each type of particles ! labeltype(1) = 'gas' UseTypeInRenderings(1) = .true. if (ntypes >= 2) then labeltype(2) = 'auxiliary' UseTypeInRenderings(2) = .true. endif if (ntypes >= 3) then labeltype(3) = 'mirror' UseTypeInRenderings(3) = .true. endif !----------------------------------------------------------- return end subroutine set_labels_rsph end module readdata_rsph danieljprice-splash-4d1f09c/src/read_data_seren.f90000066400000000000000000001443421477365367100223110ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR OUTPUT FROM THE SEREN CODE ! HANDLES BOTH ASCII AND BINARY FILES ! ! THE FOLLOWING ENVIRONMENT VARIABLES AFFECT THIS FORMAT: ! ! DSPLASH_EXTRACOLS : set to number of extra columns to read (after itype) ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Partial data read implemented means that columns with ! the 'required' flag set to false are not read (read is therefore much faster) !------------------------------------------------------------------------- module seren_data_store implicit none integer :: seren_maxparttypes ! Number of types we are using character(len=20) :: format_id ! File format (for verification) integer :: nunits ! Number of units integer :: ndata ! Number of data entries integer :: ptot, stot ! Number of particles/sinks integer :: pboundary, picm, pgas ! Number of each type of particle integer :: pcdm, pdust, pion ! Number of each type of particle integer :: PR, NDIMtemp, VDIMtemp, BDIMtemp ! Important parameters integer :: dmdt_range ! DMDT_RANGE character(len=20) :: data_id(1:500) ! Char ids of arrays written character(len=20) :: unit_data(1:500) ! Unit data real :: unit_coeff(1:500) ! Unit multiplier integer :: typedata(1:5,1:500) ! type data header array integer :: itemp, iporig ! Since SPLASH does not have one integer :: iunknown(1:1000) ! For unknown data types character(len=20) :: r_unit ! length unit character(len=20) :: m_unit ! mass unit character(len=20) :: rho_unit ! density unit character(len=20) :: h_unit ! smoothing length unit integer, parameter :: DP = selected_real_kind(p=15) ! double precision integer, parameter :: SP = selected_real_kind(p=6) ! single precision integer, parameter :: ILP = selected_int_kind(r=15) ! Integer long precision ! Length units in metres real(kind=DP),parameter :: r_pc = 3.08568E16_DP ! parsec real(kind=DP),parameter :: r_au = 1.49597870E11_DP ! astronomical unit real(kind=DP),parameter :: r_sun = 6.96E8_DP ! solar radius real(kind=DP),parameter :: r_earth = 6.371E6_DP ! Earth radius ! Mass units in kilograms real(kind=DP),parameter :: m_sun = 1.98892E30_DP ! solar mass real(kind=DP),parameter :: m_jup = 1.8986E27_DP ! Jupiter mass real(kind=DP),parameter :: m_earth = 5.9736E24_DP ! Earth mass ! Time units in seconds real(kind=DP),parameter :: myr = 3.1556952E13_DP ! megayear real(kind=DP),parameter :: yr = 3.1556952E7_DP ! year real(kind=DP),parameter :: day = 8.64E4_DP ! day end module seren_data_store module readdata_seren implicit none public :: read_data_seren, set_labels_seren private contains subroutine read_data_seren(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,iamtype,npartoftype,time,gamma,maxpart,maxcol,maxstep,headervals use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,ipartialread,ntypes use settings_units, only:unitzintegration, unit_interp use mem_allocation, only:alloc use labels, only:labeltype,labelzintegration,headertags,print_types use system_utils, only:ienvironment use seren_data_store use asciiutils, only:make_tags_unique integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer, parameter :: iunit = 16 integer :: i,j,step,ierr,iambinaryfile,itype integer :: npart_max,nstep_max logical :: iexist,reallocate,doubleprec character(len=50) :: string integer :: idata(1:50) integer (kind=ILP) :: ilpdata(1:50) real :: rdata(1:50) real(doub_prec) :: rdata_dp(1:50) real(doub_prec) :: dpdata(1:50) real :: timetemp,gammatemp unit_coeff = 1. ! not yet used m_unit = "" rho_unit = "" h_unit = "" !iRescale = .TRUE. ipartialread = .false. ! we always read full data file seren_maxparttypes = min(maxparttypes,7) nstepsread = 0 if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(datfile)//': file not found ***' return endif ! !--read data from snapshots ! step = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! ! !--determine whether file is binary or ascii, open it and read the header ! ! Try binary first, then ascii open(unit=iunit,file=datfile,status='old',form='unformatted',iostat=ierr) if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(datfile)//' ***' return endif ! !--read the file header ! try binary format first, and if unsuccessful try ascii ! read (unit=iunit,iostat=ierr) format_id if (ierr /= 0 .OR. index(format_id,'BINARYDUMP')==0) then ! Ascii format iambinaryfile = 0 close (unit=iunit) open(unit=iunit,file=datfile,status='old',form='formatted',iostat=ierr) if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(datfile)//' AS ASCII ***' return endif rewind(unit=iunit) read (unit=iunit,fmt=*,iostat=ierr) format_id if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(datfile)//' - UNKNOWN FILE FORMAT '//format_id//' ***' return endif if (trim(adjustl(format_id)) /= "SERENASCIIDUMPV2") then print "(a)",'*** ERROR OPENING '//trim(datfile)//' AS ASCII - WRONG FILE FORMAT ***' return endif elseif (format_id(1:7)=='NBINARY') then ! format is SEREN v3 which does not contain the 4byte Fortran tags close (unit=iunit) !print "(a)",' attempting to read Seren v3 format' open(unit=iunit,file=datfile,status='old',form='unformatted',access='stream',iostat=ierr) if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(datfile)//' - UNKNOWN FILE FORMAT '//format_id//' ***' return endif read (unit=iunit,iostat=ierr) format_id !print "(a)",trim(format_id) iambinaryfile = 2 print "(a)",' reading binary seren v3 format ' else iambinaryfile = 1 print "(a)",' reading binary seren v2 format ' endif if (iambinaryfile >= 1) then read (iunit) PR read (iunit) NDIMtemp read (iunit) VDIMtemp read (iunit) BDIMtemp else print "(a)",' reading ascii seren v2 format ' read (iunit,*) PR read (iunit,*) NDIMtemp read (iunit,*) VDIMtemp read (iunit,*) BDIMtemp endif if (iambinaryfile==0) then ! Don't care about precision doubleprec = .FALSE. elseif (PR == 8 .OR. PR == 2) then ! Double precision file print "(a)",' Double precision file' doubleprec = .TRUE. elseif (PR == 4 .OR. PR == 1) then ! Single precision file print "(a)",' Single precision file' doubleprec = .FALSE. else print "(a)",'*** WARNING OPENING '//trim(datfile)//' - ASSUMING SINGLE PRECISION ***' doubleprec = .FALSE. endif typedata = 0 if (iambinaryfile>=1) then call read_serenheader_binary(iunit) elseif (iambinaryfile==0) then call read_serenheader_ascii(iunit) endif ! !--get values of quantities from the header ! ndim = NDIMtemp ndimv = VDIMtemp ptot = idata(1) stot = idata(2) pboundary = idata(3) picm = idata(4) pgas = idata(5) pcdm = idata(6) pdust = idata(7) pion = idata(8) dmdt_range = idata(30) !print*,' GOT ',idata(:),data(:) !--check for errors in integer header (either from corrupt file or wrong endian) if (ptot+stot <= 0 .or. ptot+stot > 1.e10) then if (iambinaryfile>=1) then print "(a)",' ERROR reading binary file header: wrong endian? ' else print "(a)",' ERROR reading ascii file header ' endif close(unit=iunit) return endif timetemp = real(dpdata(1)) gammatemp = 1. ! Not saved in file print*,'time : ',timetemp print*,'gamma : ',gammatemp print*,'n_total : ',ptot call set_labels_seren ! !--if successfully read header, increment the nstepsread counter ! nstepsread = nstepsread + 1 ! !-- now work out dimensionless weight unit and z integration unit ! call find_weights(unit_interp,unitzintegration,labelzintegration) ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if ((ptot+stot) > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*(ptot+stot)) else ! if first time, save on memory npart_max = int(ptot+stot) endif endif if (step >= maxstep .and. step /= 1) then nstep_max = step + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol),mixedtypes=.true.) endif ! !--copy header into header arrays ! npartoftype(:,step) = 0 ! npartoftype(1,step) = ptot time(step) = timetemp gamma(step) = gammatemp !--identify integer header variables and copy into headervals headertags(1:8) = (/'ptot ','stot ','pboundary ','picm ',& 'pgas ','pcdm ','pdust ','pion '/) headervals(1:8,step) = real(idata(1:8)) !--tag double precision header variables with "dp_data1,dp_data2 etc." do j=1,size(dpdata) headertags(8+j) = 'dp_data' headervals(8+j,step) = dpdata(j) enddo call make_tags_unique(8+size(dpdata),headertags) ! !--read particle data ! if (ptot > 0) then call read_serenbody(iunit,ierr) else ptot = 0 dat(:,:,step) = 0. endif call set_types(iamtype(:,step),ptot+stot,npartoftype(:,step)) if (any(npartoftype(2:,step) /= 0)) call print_types(npartoftype(:,step),labeltype) ! !--close data file and return ! close(unit=iunit) return contains !---------------------------------------------------- ! binary header read !---------------------------------------------------- subroutine read_serenheader_binary(iunitb) integer, intent(in) :: iunitb read (iunitb,end=55) idata read (iunitb,end=55) ilpdata if (doubleprec) then read (iunitb,end=55) rdata_dp else read (iunitb,end=55) rdata endif read (iunitb,end=55) dpdata ndata = idata(21) nunits = idata(20) if (nunits > 0) read (iunitb) unit_data(1:nunits) if (ndata > 0) read (iunitb) data_id(1:ndata) if (ndata > 0) read (iunitb) typedata(1:5,1:ndata) return 55 continue print "(a)",' ERROR: end of file in binary header read' stop !return end subroutine read_serenheader_binary !---------------------------------------------------- ! ascii header read !---------------------------------------------------- subroutine read_serenheader_ascii(iunita) integer, intent(in) :: iunita do i=1,size(idata) read (iunita,*,end=55) idata(i) enddo do i=1,size(ilpdata) read (iunita,*,end=55) ilpdata(i) enddo do i=1,size(rdata) read (iunita,*,end=55) rdata(i) enddo do i=1,size(dpdata) read (iunita,*,end=55) dpdata(i) enddo ndata = idata(21) nunits = idata(20) do i=1,nunits read (iunita,'(A)') unit_data(i) enddo do i=1,ndata read (iunita,'(A)') data_id(i) enddo do i=1,ndata read (iunita,*) typedata(1:5,i) enddo return 55 continue print "(a)",' ERROR: end of file in ascii header read' stop !return end subroutine read_serenheader_ascii !---------------------------------------------------- ! body read !---------------------------------------------------- subroutine read_serenbody(iunit,ierr_out) use seren_data_store use labels, only:ix,ivx,ipmass,ih,irho,iBfirst,iutherm integer, intent(in) :: iunit integer, intent(out) :: ierr_out integer :: ierr, ierr1 integer :: j, k integer, dimension(:), allocatable :: dummy_int integer, dimension(:,:), allocatable :: dummy_int_2D real(kind=SP), dimension(:,:), allocatable :: dummy real(kind=DP), dimension(:,:), allocatable :: dummy_dp real(kind=SP), dimension(:), allocatable :: dummy_scalar real(kind=DP), dimension(:), allocatable :: dummy_dp_scalar integer(kind=ILP), dimension(:), allocatable :: dummy_ilp_int logical, dimension(:), allocatable :: dummy_logical integer(kind=ILP), dimension(:,:), allocatable :: dummy_ilp_int_2D logical, dimension(:,:), allocatable :: dummy_logical_2D logical :: ldummy(1:2) integer :: idummy2(1:2) real(kind=SP), allocatable :: raux(:) real(kind=DP), allocatable :: raux_dp(:) real, allocatable :: sink_dat_array(:,:,:) integer :: s integer :: unknown integer :: pfirst integer :: plast integer :: width integer :: typecode integer :: unit_id integer :: sink_data_length character(len=30) :: sink_format_string character(len=50) :: format_string integer :: nl,ni,nli,npr,ndp,nchar logical, allocatable :: l_data_st(:) integer, allocatable :: i_data_st(:) integer(kind=ILP), allocatable :: ilp_data_st(:) real(kind=SP), allocatable :: sp_data_st(:) real(kind=DP), allocatable :: dp_data_st(:) real(kind=DP), allocatable :: dp_data_st2(:) unknown = 0 if (stot>0) then sink_data_length = 11+NDIMtemp+VDIMtemp+2*dmdt_range allocate(raux(1:sink_data_length)) if (doubleprec) allocate(raux_dp(1:sink_data_length)) allocate(sink_dat_array(1:stot,1:ncolumns,1)) sink_dat_array = 0. write (sink_format_string,'(A,I0,A)') "(", sink_data_length, "E18.10)" endif ierr_out = 0 allocate(dummy_int(1:ptot),stat=ierr) if (ierr /= 0) then print *,' ERROR allocating memory' goto 56 endif if (doubleprec) allocate(dummy_dp_scalar(1:ptot),stat=ierr) if (ierr /= 0) then print *,' ERROR allocating memory' goto 56 endif allocate(dummy_scalar(1:ptot),stat=ierr) if (ierr /= 0) then print *,' ERROR allocating memory' goto 56 endif write (6,'(A,A)',ADVANCE="NO") "Loading: " do i=1,ndata if (i==1) then write (6,'(A)',ADVANCE="NO") trim(data_id(i)) else write (6,'(A,A)',ADVANCE="NO") ", ", trim(data_id(i)) endif select case (trim(data_id(i))) case ("porig") ! Original particle number ! Read through porig numbers pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) dummy_int(pfirst:plast) else do k=pfirst,plast read(iunit,fmt=*,end=55,iostat=ierr1) dummy_int(k) if (ierr1 /= 0) ierr = ierr1 enddo endif if (ierr /= 0) then print*,' WARNING: errors reading through porig ' ierr_out = -1 endif do k=pfirst,plast dat(k,iporig,step) = real(dummy_int(k)) enddo if (ierr /= 0) then print*,' WARNING: errors reading unknown data type ', trim(data_id(i)) ierr_out = -1 endif case ("r") ! Position if (doubleprec) allocate(dummy_dp(1:NDIMtemp,1:ptot),stat=ierr) allocate(dummy(1:NDIMtemp,1:ptot),stat=ierr) pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp(1:NDIMtemp,pfirst:plast) dummy(1:NDIMtemp,pfirst:plast) = real(dummy_dp(1:NDIMtemp,pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy(1:NDIMtemp,pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy(1:NDIMtemp,k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,ix(1):ix(1)+NDIMtemp-1,step) = dummy(1:NDIMtemp,k) enddo if (ierr /= 0) then print*,' WARNING: errors reading positions ' ierr_out = -1 endif deallocate(dummy) if (doubleprec) deallocate(dummy_dp) case ("h") ! Smoothing lengths pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp_scalar(pfirst:plast) dummy_scalar(pfirst:plast) = real(dummy_dp_scalar(pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy_scalar(pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_scalar(k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,ih,step) = dummy_scalar(k) enddo if (ierr /= 0) then print*,' WARNING: errors reading smoothing lengths' ierr_out = -1 endif case ("m") ! Mass pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp_scalar(pfirst:plast) dummy_scalar(pfirst:plast) = real(dummy_dp_scalar(pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy_scalar(pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_scalar(k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,ipmass,step) = dummy_scalar(k) enddo if (ierr /= 0) then print*,' WARNING: errors reading masses' ierr_out = -1 endif case ("v") ! Velocities if (doubleprec) allocate(dummy_dp(1:VDIMtemp,1:ptot),stat=ierr) allocate(dummy(1:VDIMtemp,1:ptot),stat=ierr) pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp(1:VDIMtemp,pfirst:plast) dummy(1:VDIMtemp,pfirst:plast) = real(dummy_dp(1:VDIMtemp,pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy(1:VDIMtemp,pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy(1:VDIMtemp,k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,ivx:ivx+VDIMtemp-1,step) = dummy(1:VDIMtemp,k) enddo if (ierr /= 0) then print*,' WARNING: errors reading velocities ' ierr_out = -1 endif deallocate(dummy) if (doubleprec) deallocate(dummy_dp) case ("rho") ! Densities pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp_scalar(pfirst:plast) dummy_scalar(pfirst:plast) = real(dummy_dp_scalar(pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy_scalar(pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_scalar(k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,irho,step) = dummy_scalar(k) enddo if (ierr /= 0) then print*,' WARNING: errors reading densities' ierr_out = -1 endif case ("temp") ! Temperatures pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp_scalar(pfirst:plast) dummy_scalar(pfirst:plast) = real(dummy_dp_scalar(pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy_scalar(pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_scalar(k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,itemp,step) = dummy_scalar(k) enddo if (ierr /= 0) then print*,' WARNING: errors reading temperatures' ierr_out = -1 endif case ("u") ! Internal energy pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp_scalar(pfirst:plast) dummy_scalar(pfirst:plast) = real(dummy_dp_scalar(pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy_scalar(pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_scalar(k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,iutherm,step) = dummy_scalar(k) enddo if (ierr /= 0) then print*,' WARNING: errors reading internal energy' ierr_out = -1 endif case ("B") ! Magnetic fields if (doubleprec) allocate(dummy_dp(1:BDIMtemp,1:ptot),stat=ierr) allocate(dummy(1:BDIMtemp,1:ptot),stat=ierr) pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp(1:BDIMtemp,pfirst:plast) dummy(1:BDIMtemp,pfirst:plast) = real(dummy_dp(1:BDIMtemp,pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy(1:BDIMtemp,pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy(1:BDIMtemp,k) if (ierr1 /= 0) ierr = ierr1 enddo endif do k=pfirst,plast dat(k,iBfirst:iBfirst+BDIMtemp-1,step) = dummy(1:BDIMtemp,k) enddo if (ierr /= 0) then print*,' WARNING: errors reading magnetic fields' ierr_out = -1 endif deallocate(dummy) if (doubleprec) deallocate(dummy_dp) case ("sink_v1") ! Load sinks in sink data storage, will add them later pfirst = typedata(2,i); plast = typedata(3,i) if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) nl,ni,nli,npr,ndp,nchar else read(iunit,fmt=*,end=55,iostat=ierr) nl,ni,nli,npr,ndp,nchar endif do s=pfirst,plast if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) ldummy read(iunit,end=55,iostat=ierr) idummy2 if (doubleprec) then read(iunit,end=55,iostat=ierr) raux_dp raux = real(raux_dp) else read(iunit,end=55,iostat=ierr) raux endif else read(iunit,'(2L1)',end=55,iostat=ierr) ldummy read(iunit,fmt=*,end=55,iostat=ierr) idummy2 read(iunit,sink_format_string) raux(1:sink_data_length) endif if (ix(1)/=0) sink_dat_array(s,ix(1):ix(NDIMtemp),1) = raux(2:NDIMtemp+1) if (ivx/=0) sink_dat_array(s,ivx:ivx+VDIMtemp-1,1) = raux(NDIMtemp+2:NDIMtemp+VDIMtemp+1) if (ipmass/=0) sink_dat_array(s,ipmass,1) = raux(NDIMtemp+VDIMtemp+2) if (ih/=0) sink_dat_array(s,ih,1) = raux(NDIMtemp+VDIMtemp+3) if (itemp/=0) sink_dat_array(s,itemp,1) = raux(NDIMtemp+VDIMtemp+11) enddo case default !print*,' WARNING: unknown data type ', trim(data_id(i)) ! Assume this is an unknown data type !ierr_out = -4 width = typedata(1,i) pfirst = typedata(2,i); plast = typedata(3,i) typecode = typedata(4,i); unit_id = typedata(5,i) unknown = unknown + 1 if (typecode == 7) then ! Special data structure we don't understand; read and skip if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) nl,ni,nli,npr,ndp,nchar else read(iunit,fmt=*,end=55,iostat=ierr) nl,ni,nli,npr,ndp,nchar endif if (nchar > 0) stop "Fail! character data :(" if (nl > 0) allocate(l_data_st(1:nl)) if (ni > 0) allocate(i_data_st(1:ni)) if (nli > 0) allocate(ilp_data_st(1:nli)) if (npr > 0) then allocate(sp_data_st(1:npr)) if (doubleprec) allocate(dp_data_st(1:npr)) endif if (ndp > 0) allocate(dp_data_st2(1:ndp)) if (iambinaryfile>=1) then do j=pfirst, plast if (nl > 0) read(iunit,end=55,iostat=ierr) l_data_st if (ni > 0) read(iunit,end=55,iostat=ierr) i_data_st if (nli > 0) read(iunit,end=55,iostat=ierr) ilp_data_st if (npr > 0) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dp_data_st else read(iunit,end=55,iostat=ierr) sp_data_st endif endif if (ndp > 0) read(iunit,end=55,iostat=ierr) dp_data_st2 enddo else do j=pfirst, plast if (nl > 0) then write (format_string,'(A,I0,A)') "(",nl,"L1)" read(iunit,end=55,iostat=ierr,fmt=format_string) l_data_st endif if (ni > 0) then read(iunit,end=55,iostat=ierr,fmt=*) i_data_st endif if (nli > 0) then read(iunit,end=55,iostat=ierr,fmt=*) ilp_data_st endif if (npr > 0) then if (doubleprec) then read(iunit,end=55,iostat=ierr,fmt=*) dp_data_st else read(iunit,end=55,iostat=ierr,fmt=*) sp_data_st endif endif if (ndp > 0) then read(iunit,end=55,iostat=ierr,fmt=*) dp_data_st2 endif enddo endif if (ierr /= 0) then print*,' WARNING: errors reading unknown data structure ', trim(data_id(i)) ierr_out = -1 endif if (allocated(i_data_st)) deallocate(i_data_st) if (allocated(ilp_data_st)) deallocate(ilp_data_st) if (allocated(sp_data_st)) deallocate(sp_data_st) if (allocated(dp_data_st)) deallocate(dp_data_st) if (allocated(dp_data_st2)) deallocate(dp_data_st2) elseif (typecode == 6) then ! Character data; read and skip stop "Fail! character data :(" ! I have realised this was a silly idea ! If we work out how this should work, I can put it in elseif (typecode >= 1 .AND. typecode <= 5) then ! 1 = logical, 2 = integer, 3 = long integer, 4 = PR, 5 = DP ! Normal data set; either scalar or vector if (width == 1) then ! Scalar data if (typecode==1) then ! Logical data array allocate(dummy_logical(1:ptot)) dummy_logical = .FALSE. if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) dummy_logical(pfirst:plast) else do k=pfirst,plast read(iunit,'(L1)',end=55,iostat=ierr1) dummy_logical(k) if (ierr1 /= 0) ierr = ierr1 enddo endif where (dummy_logical) dummy_scalar=1.d0 elsewhere dummy_scalar=0.d0 end where deallocate(dummy_logical) elseif (typecode==2) then ! Integer data array dummy_int = 0 if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) dummy_int(pfirst:plast) else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_int(k) if (ierr1 /= 0) ierr = ierr1 enddo endif dummy_scalar(pfirst:plast) = real(dummy_int(pfirst:plast)) elseif (typecode==3) then ! Long integer data array allocate(dummy_ilp_int(1:ptot)) dummy_ilp_int = 0 if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) dummy_ilp_int(pfirst:plast) else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_ilp_int(k) if (ierr1 /= 0) ierr = ierr1 enddo endif dummy_scalar(pfirst:plast) = real(dummy_ilp_int(pfirst:plast)) deallocate(dummy_ilp_int) elseif (typecode==4) then ! PR data array if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp_scalar(pfirst:plast) dummy_scalar(pfirst:plast) = real(dummy_dp_scalar(pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy_scalar(pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_scalar(k) if (ierr1 /= 0) ierr = ierr1 enddo endif elseif (typecode==5) then ! DP data array if (iambinaryfile>=1) then if (.NOT.doubleprec) allocate(dummy_dp_scalar(pfirst:plast)) read(iunit,end=55,iostat=ierr) dummy_dp_scalar(pfirst:plast) dummy_scalar(pfirst:plast) = real(dummy_dp_scalar(pfirst:plast)) if (.NOT.doubleprec) deallocate(dummy_dp_scalar) else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_scalar(k) if (ierr1 /= 0) ierr = ierr1 enddo endif endif do k=pfirst,plast dat(k,iunknown(unknown),step) = dummy_scalar(k) enddo if (ierr /= 0) then print*,' WARNING: errors reading unknown data type ', trim(data_id(i)) ierr_out = -1 endif else ! Vector data allocate(dummy(1:width,1:ptot),stat=ierr) if (typecode == 1) then ! Logical data array allocate(dummy_logical_2D(1:width,1:ptot)) dummy_logical_2D = .FALSE. if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) dummy_logical_2D(1:width,pfirst:plast) else write (format_string,'(A,I0,A)') "(",width,"L1)" do k=pfirst,plast read(iunit,fmt=format_string,end=55,iostat=ierr1) dummy_logical_2D(1:width,k) if (ierr1 /= 0) ierr = ierr1 enddo endif where (dummy_logical_2D) dummy=1.d0 elsewhere dummy=0.d0 end where deallocate(dummy_logical_2D) elseif (typecode == 2) then ! Integer data array allocate(dummy_int_2D(1:width,1:ptot)) dummy_int_2D = 0 if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) dummy_int_2D(1:width,pfirst:plast) else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_int_2D(1:width,k) if (ierr1 /= 0) ierr = ierr1 enddo endif dummy(1:width,pfirst:plast) = real(dummy_int_2D(1:width,pfirst:plast)) deallocate(dummy_int_2D) elseif (typecode == 3) then ! Long integer data array allocate(dummy_ilp_int_2D(1:width,1:ptot)) dummy_ilp_int_2D = 0 if (iambinaryfile>=1) then read(iunit,end=55,iostat=ierr) dummy_ilp_int_2D(1:width,pfirst:plast) else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy_ilp_int_2D(1:width,k) if (ierr1 /= 0) ierr = ierr1 enddo endif dummy(1:width,pfirst:plast) = real(dummy_ilp_int_2D(1:width,pfirst:plast)) deallocate(dummy_ilp_int_2D) elseif (typecode == 4) then ! PR data array if (doubleprec) allocate(dummy_dp(1:width,1:ptot),stat=ierr) if (iambinaryfile>=1) then if (doubleprec) then read(iunit,end=55,iostat=ierr) dummy_dp(1:width,pfirst:plast) dummy(1:width,pfirst:plast) = real(dummy_dp(1:width,pfirst:plast)) else read(iunit,end=55,iostat=ierr) dummy(1:width,pfirst:plast) endif else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy(1:width,k) if (ierr1 /= 0) ierr = ierr1 enddo endif if (doubleprec) deallocate(dummy_dp) elseif (typecode == 5) then ! DP data array if (iambinaryfile>=1) then allocate(dummy_dp(1:width,1:ptot),stat=ierr) read(iunit,end=55,iostat=ierr) dummy_dp(1:width,pfirst:plast) dummy(1:width,pfirst:plast) = real(dummy_dp(1:width,pfirst:plast)) deallocate(dummy_dp) else do k=pfirst,plast read(iunit,*,end=55,iostat=ierr1) dummy(1:width,k) if (ierr1 /= 0) ierr = ierr1 enddo endif endif do k=pfirst,plast dat(k,iunknown(unknown):iunknown(unknown)+width-1,step) = dummy(1:width,k) enddo if (ierr /= 0) then print*,' WARNING: errors reading unknown data type ', trim(data_id(i)) ierr_out = -1 endif deallocate(dummy) endif endif end select enddo write (6,*) if (stot>0) then ! Load sink stuff into end of dat array dat(ptot+1:ptot+stot,1:ncolumns,step) = sink_dat_array(1:stot,1:ncolumns,1) endif return 55 continue if (iambinaryfile>=1) print "(a)",' ERROR: end of file in binary read' if (iambinaryfile==0) print "(a)",' ERROR: end of file in ascii read' ierr_out = -3 return 56 continue ierr_out = -2 return end subroutine !---------------------------------------------------- ! translate types into order (for old dragon read) !---------------------------------------------------- subroutine set_types(itypei,ntotal,noftype) integer(kind=int1), dimension(:), intent(inout) :: itypei integer, intent(in) :: ntotal integer, dimension(:), intent(out) :: noftype integer :: noftype_temp(1:7) noftype = 0 noftype_temp(1) = pgas noftype_temp(2) = pboundary noftype_temp(3) = stot noftype_temp(4) = picm noftype_temp(5) = pcdm noftype_temp(6) = pdust noftype_temp(7) = pion if (sum(noftype_temp(1:7)) /= ntotal) then print "(a)",' INTERNAL ERROR setting number in each type in dragon read' endif do i=1,7 if (i > seren_maxparttypes .AND. noftype_temp(i) > 0) then print*,' *** ERROR: not enough particle types for SEREN data read ***' print*,' *** you need to edit splash parameters and recompile ***' stop endif enddo noftype(1:seren_maxparttypes) = noftype_temp(1:seren_maxparttypes) if (pboundary>0) itypei(1:pboundary) = 2 if (picm>0) itypei(pboundary+1:pboundary+picm) = 4 if (pgas>0) itypei(pboundary+picm+1:pboundary+picm+pgas) = 1 if (pcdm>0) itypei(pboundary+picm+pgas+1:pboundary+picm+pgas+pcdm) = 5 if (pdust>0) itypei(pboundary+picm+pgas+pcdm+1:pboundary+picm+pgas+pcdm+pdust) = 6 if (pion>0) itypei(pboundary+picm+pgas+pcdm+pdust+1:ptot) = 7 if (stot>0) itypei(ptot+1:ptot+stot) = 3 return end subroutine set_types end subroutine read_data_seren !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_seren use labels, only:label,iamvec,labelvec,labeltype,unitslabel=>unitslabel_default,& &ix,ivx,ipmass,ih,irho,iBfirst,iutherm,lenlabel,lenunitslabel,make_vector_label use params use settings_data, only:ndim,ndimV,ncolumns,ntypes,UseTypeInRenderings use geometry, only:labelcoord use settings_units, only:units=>units_default use seren_data_store integer :: i, j, width, unit_no integer :: nunknown ! Number of unknown data types character(len=lenunitslabel) :: unit_base, unit_string character(len=lenlabel) :: type_names(1:7) logical :: type_use_render(1:7) if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_seren ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_seren ***' return endif ! Calculate number of columns to read iporig = 0 ncolumns = 0 nunknown = 0 do i=1,ndata unit_no = typedata(5,i) !write (6,*) "i = ", i, "; data_id(i) = ", data_id(i) unit_base = "" unit_string = "" if (unit_no < 0 .OR. unit_no > nunits) then print*,'*** ERROR: unit_no = ',unit_no,' in set_labels_seren ***' elseif (unit_no /= 0) then unit_base = trim(adjustl(unit_data(unit_no))) unit_string = unit_base call translate_unit_names(unit_string) unit_string = ' ['//trim(adjustl(unit_string))//']' endif !write (6,*) "unit_base, unit_string = ", unit_base, unit_string select case (trim(data_id(i))) case ("porig") ! Original particle number iporig = -1 ! We always want this last case ("r") ! Position do j=1,NDIMtemp ix(j) = ncolumns + j units(ix(j)) = unit_coeff(ix(j)) unitslabel(ix(j)) = unit_string enddo ! unitzintegration = units(ix(1)) ! labelzintegration = ' ['//trim(adjustl(unit_string))//']' label(ix(1:ndim)) = labelcoord(1:ndim,1) ncolumns = ncolumns + NDIMtemp r_unit = trim(adjustl(unit_base)) case ("h") ! Smoothing lengths ih = ncolumns + 1 units(ih) = unit_coeff(ih) unitslabel(ih) = unit_string label(ih) = 'h' ncolumns = ncolumns + 1 h_unit = trim(adjustl(unit_base)) case ("m") ! Mass ipmass = ncolumns + 1 units(ipmass) = unit_coeff(ipmass) unitslabel(ipmass) = unit_string label(ipmass) = 'particle mass' ncolumns = ncolumns + 1 m_unit = trim(adjustl(unit_base)) case ("v") ! Velocities ivx = ncolumns + 1 call make_vector_label('v',ivx,VDIMtemp,iamvec,labelvec,label,labelcoord(:,1)) do j=1,VDIMtemp units(ivx+j-1) = unit_coeff(ivx+j-1) unitslabel(ivx+j-1) = unit_string enddo ncolumns = ncolumns + VDIMtemp case ("rho") ! Densities irho = ncolumns + 1 units(irho) = unit_coeff(irho) unitslabel(irho) = unit_string label(irho) = 'density' ncolumns = ncolumns + 1 rho_unit = trim(adjustl(unit_base)) case ("temp") ! Temperatures itemp = ncolumns + 1 ! NOT A PROPER SPLASH i_quantity units(itemp) = unit_coeff(itemp) unitslabel(itemp) = unit_string label(ncolumns + 1) = 'temperature' ncolumns = ncolumns + 1 case ("u") ! Internal energy iutherm = ncolumns + 1 units(iutherm) = unit_coeff(iutherm) unitslabel(iutherm) = unit_string label(ncolumns + 1) = 'internal energy' ncolumns = ncolumns + 1 case ("B") ! Magnetic fields iBfirst = ncolumns + 1 call make_vector_label('B',iBfirst,BDIMtemp,iamvec,labelvec,label,labelcoord(:,1)) do j=1,BDIMtemp units(iBfirst+j-1) = unit_coeff(iBfirst+j-1) unitslabel(iBfirst+j-1) = unit_string enddo ncolumns = ncolumns + BDIMtemp case ("sink_v0") ! Do nothing yet, sinks are stored separately case ("sink_v1") ! Do nothing yet, sinks are stored separately case default print*,' WARNING reading file: unknown data type ', trim(data_id(i)) if (typedata(4,i) == 7) cycle ! Special data module we don't understand; ignore if (typedata(4,i) == 6) cycle ! Not a lot we can do with character data here! width = typedata(1,i) nunknown = nunknown + 1 iunknown(nunknown) = ncolumns + 1 ! NOT A PROPER SPLASH i_quantity if (width == 1) then label(iunknown(nunknown)) = trim(data_id(i)) units(iunknown(nunknown)) = unit_coeff(iunknown(nunknown)) unitslabel(iunknown(nunknown)) = unit_string elseif (width <= NDIMtemp) then do j=1,width label(iunknown(nunknown)+j-1) = trim(data_id(i))//'\d'//labelcoord(j,1) units(iunknown(nunknown)+j-1) = unit_coeff(iunknown(nunknown)) unitslabel(iunknown(nunknown)+j-1) = unit_string enddo else do j=1,width write(label(iunknown(nunknown)+j-1),'(A,A,I0)') trim(data_id(i)),'\d',j units(iunknown(nunknown)+j-1) = unit_coeff(iunknown(nunknown)) unitslabel(iunknown(nunknown)+j-1) = unit_string enddo endif ncolumns = ncolumns + width ! Add width of data to ncolumns end select enddo if (iporig == -1) then ! If there is porig, add as last column iporig = ncolumns + 1 ! NOT A PROPER SPLASH i_quantity label(ncolumns + 1) = 'particle id' ncolumns = ncolumns + 1 endif !--set labels for each particle type ! ntypes = seren_maxparttypes type_names = (/'gas ','boundary','sink ','icm ','cdm ','dust ','ion '/) type_use_render = (/.TRUE.,.TRUE.,.FALSE.,.TRUE.,.TRUE.,.TRUE.,.TRUE./) labeltype(1:ntypes) = type_names(1:ntypes) UseTypeInRenderings(1:ntypes) = type_use_render(1:ntypes) end subroutine set_labels_seren subroutine find_weights(out_unit_interp,out_unitzintegration,out_labelzintegration) use labels, only:lenunitslabel use params use seren_data_store real(doub_prec), intent(out) :: out_unit_interp real, intent(out) :: out_unitzintegration character(len=lenunitslabel), intent(out) :: out_labelzintegration real(doub_prec) :: dm_unit, dh_unit, drho_unit, dr_unit logical :: do_dimweight, do_zintegration character(len=lenunitslabel) :: rho_length_label real(doub_prec) :: rho_length out_unit_interp = 1.0 out_unitzintegration = 1.0 out_labelzintegration = "" do_dimweight = .TRUE. do_zintegration = .TRUE. if (m_unit=="") then print*,'No masses or no mass units!' print*,'Cannot create dimensionless weight (unnormalised rendered plots may be incorrect)' do_dimweight = .FALSE. endif if (h_unit=="") then print*,'No smoothing lengths or no smoothing length units!' print*,'Cannot create dimensionless weight (unnormalised rendered plots may be incorrect)' do_dimweight = .FALSE. endif if (rho_unit=="") then print*,'No densities or no density units!' print*,'Cannot create dimensionless weight (unnormalised rendered plots may be incorrect)' do_dimweight = .FALSE. print*,'Cannot set unitzintegration (column density plots may be incorrect)' do_zintegration = .FALSE. endif if (r_unit=="") then print*,'No positions or no position units!' print*,'Cannot set unitzintegration (column density plots may be incorrect)' do_zintegration = .FALSE. endif ! Length unit in S.I. units (m) if (r_unit=="pc") then dr_unit = r_pc elseif (r_unit=="au") then dr_unit = r_au elseif (r_unit=="r_sun") then dr_unit = r_sun elseif (r_unit=="r_earth") then dr_unit = r_earth elseif (r_unit=="km") then dr_unit = 1000.0_DP elseif (r_unit=="m") then dr_unit = 1.0_DP elseif (r_unit=="cm") then dr_unit = 0.01_DP else print*,'Unknown position unit ', r_unit, '!' print*,'Cannot set unitzintegration (column density plots may be incorrect)' do_zintegration = .FALSE. dr_unit = 1.0_DP endif ! Length unit in S.I. units (m) if (h_unit=="pc") then dh_unit = r_pc elseif (h_unit=="au") then dh_unit = r_au elseif (h_unit=="r_sun") then dh_unit = r_sun elseif (h_unit=="r_earth") then dh_unit = r_earth elseif (h_unit=="km") then dh_unit = 1000.0_DP elseif (h_unit=="m") then dh_unit = 1.0_DP elseif (h_unit=="cm") then dh_unit = 0.01_DP else print*,'Unknown smoothing length unit ', h_unit, '!' print*,'Cannot create dimensionless weight (unnormalised rendered plots may be incorrect)' do_dimweight = .FALSE. dh_unit = 1.0_DP endif ! Mass units in S.I. units (kg) if (m_unit=="m_sun") then dm_unit = m_sun elseif (m_unit=="m_jup") then dm_unit = m_jup elseif (m_unit=="m_earth") then dm_unit = m_earth elseif (m_unit=="kg") then dm_unit = 1._DP elseif (m_unit=="g") then dm_unit = 1.0E-3_DP else print*,'Unknown mass unit ', m_unit, '!' print*,'Cannot create dimensionless weight (unnormalised rendered plots may be incorrect)' do_dimweight = .FALSE. dm_unit = 1._DP endif ! Density units in S.I. units (i.e. kg/m^3) if (rho_unit=="m_sun_pc3") then drho_unit = m_sun / (r_pc**3) rho_length = r_pc rho_length_label = "pc" elseif (rho_unit=="m_sun_pc2") then drho_unit = m_sun / (r_pc**2) rho_length = r_pc rho_length_label = "pc" elseif (rho_unit=="kg_m3") then drho_unit = 1.0_DP rho_length = 1.0_DP rho_length_label = "m" elseif (rho_unit=="kg_m2") then drho_unit = 1.0_DP rho_length = 1.0_DP rho_length_label = "m" elseif (rho_unit=="g_cm3") then drho_unit = 1.0E3_DP rho_length = 0.01_DP rho_length_label = "cm" elseif (rho_unit=="g_cm2") then drho_unit = 10.0_DP rho_length = 0.01_DP rho_length_label = "cm" else print*,'Unknown density unit ', rho_unit, '!' print*,'Cannot create dimensionless weight (unnormalised rendered plots may be incorrect)' do_dimweight = .FALSE. print*,'Cannot set unitzintegration (column density plots may be incorrect)' do_zintegration = .FALSE. rho_length = 1.0_DP endif if (do_dimweight) then out_unit_interp = dm_unit/(drho_unit*dh_unit**NDIMtemp) endif if (do_zintegration) then out_unitzintegration = dr_unit / rho_length out_labelzintegration = rho_length_label endif return end subroutine find_weights subroutine translate_unit_names(unit_name) character(len=*), intent(inout) :: unit_name select case (trim(unit_name)) case ("r_sun") unit_name = "r_{Sun}" case ("au") unit_name = "AU" case ("r_earth") unit_name = "r_{Earth}" case ("m_sun") unit_name = "M_{\(2281)}" case ("m_jup") unit_name = "M_{Jupiter}" case ("m_earth") unit_name = "M_{Earth}" case ("myr") unit_name = "Myrs" case ("km_s") unit_name = "km s^{-1}" case ("au_yr") unit_name = "AU / yr" case ("m_s") unit_name = "m s^{-1}" case ("cm_s") unit_name = "cm s^{-1}" case ("km_s2") unit_name = "km s^{-2}" case ("au_yr2") unit_name = "AU yr^{-2}" case ("m_s2") unit_name = "m s^{-2}" case ("cm_s2") unit_name = "cm s^{-2}" case ("m_sun_pc3") unit_name = "M_{\(2281)} pc^{-3}" case ("kg_m_3") unit_name = "kg m^{-3}" case ("g_cm_3") unit_name = "g cm^{-3}" case ("m_sun_pc2") unit_name = "M_{\(2281)} pc^{-2}" case ("kg_m_2") unit_name = "kg m^{-2}" case ("g_cm_2") unit_name = "g cm^{-2}" case ("g_cms2") unit_name = "g cm^{-2}" case ("10^40erg") unit_name = "\x 10^{40} ergs" case ("m_sunkm_s") unit_name = "M_{\(2281)} km s^{-1}" case ("m_sunau_yr") unit_name = "M_{\(2281)} AU yr^{-1}" case ("kgm_s") unit_name = "kg m s^{-1}" case ("gcm_s") unit_name = "g cm s^{-1}" case ("m_sunkm2_s") unit_name = "M_{\(2281)} km^{2} s^{-1}" case ("m_sunau2_yr") unit_name = "M_{\(2281)} AU^{2} yr^{-1}" case ("kgm2_s") unit_name = "kg m^{2} s^{-1}" case ("gcm2_s") unit_name = "g cm^{2} s^{-1}" case ("rad_s") unit_name = "radians s^{-1}" case ("m_sun_myr") unit_name = "M_{\(2281)} Myr^{-1}" case ("m_sun_yr") unit_name = "M_{\(2281)} yr^{-1}" case ("kg_s") unit_name = "kg s^{-1}" case ("g_s") unit_name = "g s^{-1}" case ("L_sun") unit_name = "L_{\(2281)}" case ("J_s") unit_name = "J s^{-1}" case ("ergs_s") unit_name = "ergs s^{-1}" case ("m2_kg") unit_name = "m^{2} kg^{-1}" case ("cm2_g") unit_name = "cm^{2} g^{-1}" case ("tesla") unit_name = "Tesla" case ("gauss") unit_name = "Gauss" case ("C_s_m2") unit_name = "C s^{-1} m^{-2}" case ("J_kg") unit_name = "J kg^{-1}" case ("erg_g") unit_name = "ergs g^{-1}" case default unit_name = unit_name ! this could be improved end select return end subroutine translate_unit_names end module readdata_seren danieljprice-splash-4d1f09c/src/read_data_silo.f90000066400000000000000000000262521477365367100221420ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2015 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR SILO FILES ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxpart,maxplot,maxstep) : main data array ! ! npartoftype(maxstep): number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! (used in calc_quantities for calculating the pressure) ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Columns with the 'required' flag set to false are not read !------------------------------------------------------------------------- ! ! The module below contains interface routines to c functions ! that perform the actual calls to the SILO libs ! !------------------------------------------------------------------------- module siloread use params, only:maxplot,doub_prec use labels, only:lenlabel use, intrinsic :: iso_c_binding, only:c_int,c_double,c_char implicit none character(len=lenlabel), dimension(maxplot) :: blocklabel logical :: havewarned = .false. integer, parameter :: maxtypes = 6 interface subroutine read_silo_header(filename,npart,ncol,ndim,ndimV,time,ierr) bind(c) import character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(out) :: npart,ncol,ndim,ndimV,ierr real(kind=c_double), intent(out) :: time end subroutine read_silo_header subroutine read_silo_data(filename,maxtypes,npartoftypei,& ncol,isrequired,ierr) bind(c) import implicit none character(kind=c_char), dimension(*), intent(in) :: filename integer(kind=c_int), intent(in), value :: maxtypes integer(kind=c_int), dimension(6), intent(in) :: npartoftypei integer(kind=c_int), intent(in), value :: ncol integer(kind=c_int), intent(out) :: ierr integer(kind=c_int), dimension(ncol), intent(in) :: isrequired end subroutine read_silo_data end interface end module siloread !------------------------------------------------------------------------- ! ! The routine that reads the data into splash's internal arrays ! !------------------------------------------------------------------------- subroutine read_data_silo(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,time,gamma,maxpart,maxcol,maxstep use params, only:doub_prec,maxparttypes,maxplot use settings_data, only:ndim,ndimV,ncolumns,ncalc,iformat,required,ipartialread, & ntypes,debugmode,iverbose use settings_page, only:legendtext use mem_allocation, only:alloc use labels, only:ih,irho,ipmass,labeltype use system_utils, only:renvironment,lenvironment,ienvironment,envlist use asciiutils, only:cstring use siloread, only:blocklabel,havewarned,read_silo_header, & read_silo_data,maxtypes implicit none integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile,densfile,hfile character(len=20) :: string integer :: i,j,itype,ierr integer :: index1,index2,nhfac integer :: ncolstep,npart_max,nstep_max,ntoti,ntotall,idot integer, parameter :: iunit = 11 logical :: iexist,reallocate,usez,debug,goterrors real(doub_prec) :: timetemp,ztemp real :: hfact,hfactmean,pmassi real, parameter :: pi = 3.1415926536 integer, dimension(maxplot) :: isrequired nstepsread = 0 goterrors = .false. if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! print "(1x,a)",'reading SILO format' inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--append .silo on the endif not already present ! datfile=trim(rootname)//'.silo' inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 ! !--read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open file and read header information ! if (debug) print*,'DEBUG: reading header...' call read_silo_header(cstring(datfile),ntoti,ncolstep,ndim,ndimV,timetemp,ierr) if (ierr /= 0) then print "(a)", '*** ERROR READING HEADER ***' return endif ncolumns = ncolstep if (iverbose >= 1) print "(a,1x,i10,a,es10.3)",' ndim: ',ndim,' time: ',timetemp if (iverbose >= 1) print "(2(a,1x,i10))",' npart: ',ntoti,' ncolumns: ',ncolstep ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (ntoti > maxpart) then reallocate = .true. if (maxpart > 0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntotall) else ! if first time, save on memory npart_max = int(ntoti) endif endif if (i >= maxstep .and. i /= 1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolumns+ncalc,maxcol)) endif ! !--copy header data into allocated arrays ! ntypes = 1 npartoftype(1,i) = ntoti time(i) = real(timetemp) masstype(:,i) = 0. ! all masses read from file ! !--read particle data ! got_particles: if (ntoti > 0) then isrequired(:) = 0 where (required(1:ncolumns)) isrequired(1:ncolumns) = 1 call read_silo_data(cstring(datfile),ntypes,npartoftype(:,i),ncolumns,isrequired,ierr) nstepsread = 1 endif got_particles ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ! !--set flag to indicate that only part of this file has been read ! if (.not.all(required(1:ncolstep))) ipartialread = .true. ! !--call set labels to identify location of smoothing length ! call set_labels_silo ! !--cover the special case where no particles have been read ! if (ntoti <= 0) then npartoftype(1,i) = 1 dat(:,:,i) = 0. endif if (nstepsread > 0) then print "(a,i10,a)",' >> read ',sum(npartoftype(:,istepstart+nstepsread-1)),' particles' endif return end subroutine read_data_silo subroutine read_silo_data_fromc(icol,npartoftypei,temparr,itype) bind(c) use, intrinsic :: iso_c_binding, only:c_int,c_double use particle_data, only:dat,iamtype use settings_data, only:debugmode use labels, only:label implicit none integer(kind=c_int), intent(in) :: icol,npartoftypei,itype real(kind=c_double), intent(in) :: temparr(npartoftypei) integer(kind=c_int) :: i,icolput integer :: nmax,nerr,idi logical :: useids icolput = icol if (debugmode) print "(a,i2,a,i2,a,i8)",'DEBUG: reading column ',icol,' type ',itype,' -> '//trim(label(icolput)) ! check column is within array limits if (icolput > size(dat(1,:,1)) .or. icolput==0) then print "(a,i2,a)",' ERROR: column = ',icolput,' out of range in receive_data_fromc' return endif ! ensure no array overflows nmax = min(npartoftypei,size(dat(:,1,1))) ! copy data into main splash array dat(1:nmax,icolput,1) = real(temparr(1:nmax)) ! set particle type if (size(iamtype(:,1)) > 1) then do i=1,nmax iamtype(i,1) = itype + 1 enddo endif return end subroutine read_silo_data_fromc !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_silo use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass, & ih,irho,ipr,iutherm,iBfirst,idivB,iax use params use settings_data, only:ndim,ndimV,ncolumns,ntypes,UseTypeInRenderings,iformat use geometry, only:labelcoord use system_utils, only:envlist,ienvironment use siloread, only:blocklabel use asciiutils, only:lcase implicit none integer :: i,j,icol,irank if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_silo ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_silo ***' return endif ix = 0 iutherm = 0 do icol=1,size(blocklabel) select case(trim(lcase(blocklabel(icol)))) case('x') ix(1) = icol case('y') ix(2) = icol case('z') ix(3) = icol case('vx') ivx = icol case('ax') iax = icol case('h') ih = icol case('mass') ipmass = icol case('density') irho = icol end select label(icol) = trim(blocklabel(icol)) enddo ! set labels of the quantities read in if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) !if (irho > 0) label(irho) = 'density' !if (iutherm > 0) label(iutherm) = 'u' !if (ipmass > 0) label(ipmass) = 'particle mass' !if (ih > 0) label(ih) = 'h' ! set labels for vector quantities if (ivx > 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'_'//labelcoord(i,1) enddo endif if (iax > 0) then iamvec(iax:iax+ndimV-1) = iax labelvec(iax:iax+ndimV-1) = 'a' do i=1,ndimV label(iax+i-1) = trim(labelvec(iax))//'_'//labelcoord(i,1) enddo endif ! set labels for each particle type labeltype(1) = 'gas' UseTypeInRenderings(:) = .false. UseTypeInRenderings(1) = .true. !----------------------------------------------------------- return end subroutine set_labels_silo subroutine set_blocklabel(icol,name) bind(c) use, intrinsic :: iso_c_binding, only:c_int, c_char use siloread, only:blocklabel use asciiutils, only:fstring implicit none integer(kind=c_int), intent(in) :: icol character(kind=c_char), intent(in) :: name(256) blocklabel(icol) = trim(fstring(name)) !print*,icol,' name = ',trim(blocklabel(icol)) end subroutine set_blocklabel danieljprice-splash-4d1f09c/src/read_data_silo_utils.c000066400000000000000000000153621477365367100232060ustar00rootroot00000000000000/* * This subroutine performs the calls to the SILO library for the * SILO data read * * We have to do it this way as the SILO read interface for Fortran * is incomplete * */ #include #include #include #include static int debug = 0; void set_blocklabel(int *icol, char *name); void read_silo_data_fromc(int *icol, int *npartoftypei, double temparr[*npartoftypei],int *itype); void read_silo_header(const char *filename, int *npart, int *ncol, int *ndim, int *ndimV, double *time, int *ierr) { *npart = 0; *ierr = 0; *ncol = 0; *time = 0.; *npart = 0; DBfile *silofile = DBOpen(filename, DB_UNKNOWN, DB_READ); if (!silofile) { *ierr = 1; return; } if (!DBVersionGEFileVersion(silofile)) { const char *siloversion = DBFileVersion(silofile); printf(" WARNING! File was created with newer version (v%s) of silo library\n",siloversion); } if (!DBInqFileHasObjects(silofile)) { printf(" ERROR: silo file %s does not appear to contain any objects\n",filename); *ierr = 2; return; } DBtoc *toc = DBGetToc(silofile); if (debug) { printf(" DEBUG: File contains:\n %i curves\n %i multimesh\n %i nmultimeshadj\n %i multivar\n", \ toc->ncurve,toc->nmultimesh,toc->nmultimeshadj,toc->nmultivar); printf(" %i multimat\n %i multimatspecies\n %i csgmesh\n %i csgvar\n", \ toc->nmultimat,toc->nmultimatspecies,toc->ncsgmesh,toc->ncsgvar); printf(" %i defvars\n %i qmesh\n %i qvar\n %i ucdmesh\n %i ucdvar\n", \ toc->ndefvars,toc->nqmesh,toc->nqvar,toc->nucdmesh,toc->nucdvar); printf(" %i ptmesh\n %i ptvar\n %i mat\n %i matspecies\n %i var\n %i obj\n", \ toc->nptmesh,toc->nptvar,toc->nmat,toc->nmatspecies,toc->nvar,toc->nobj); printf(" %i dir\n %i array\n %i mrgtree\n %i groupelmap\n %i mrgvar\n", \ toc->ndir,toc->narray,toc->nmrgtree,toc->ngroupelmap,toc->nmrgvar); } int nptmesh = toc->nptmesh; if (nptmesh <= 0) { printf(" ERROR: silo file %s does not appear to contain any point meshes\n",filename); *ierr = 3; return; } int i; for (i=0;i 0) { printf(" WARNING: IGNORNING ptmesh #%i (%s)\n",i+1,toc->ptmesh_names[i]); } } /* open the first point mesh and get info */ DBpointmesh *my_ptmesh = DBGetPointmesh(silofile,toc->ptmesh_names[0]); if (!my_ptmesh) { printf(" ERROR reading point mesh %s\n",toc->ptmesh_names[0]); *ierr = 4; return; } else { printf(" Reading point mesh %s\n",toc->ptmesh_names[0]); *time = my_ptmesh->dtime; *npart = my_ptmesh->nels; *ndim = my_ptmesh->ndims; *ndimV = *ndim; if (debug) { printf(" Got labels = %s %s %s \n",\ my_ptmesh->labels[0],my_ptmesh->labels[1],my_ptmesh->labels[2]); printf(" Got title = %s \n",my_ptmesh->title); printf(" Got units = %s %s %s \n",\ my_ptmesh->units[0],my_ptmesh->units[1],my_ptmesh->units[2]); printf(" max_extents = %f %f %f\n",\ my_ptmesh->max_extents[0],my_ptmesh->max_extents[1],my_ptmesh->max_extents[2]); } DBFreePointmesh(my_ptmesh); } /* Read the other point variables */ int nptvar = toc->nptvar; if (nptvar <= 0) { printf(" WARNING: silo file %s does not appear to contain any point variables\n",filename); } *ncol = *ndim + nptvar; if (*ncol <= 0) { *ierr = 4; printf(" ERROR: ncol <= 0 from silo header\n"); return; } DBClose(silofile); } void read_silo_data(char *filename, int maxtypes, int npartoftype[maxtypes], int ncol, int isrequired[ncol], int *ierr) { DBfile *silofile = DBOpen(filename, DB_UNKNOWN, DB_READ); if (!silofile) { *ierr = 1; return; } DBtoc *toc = DBGetToc(silofile); DBpointmesh *my_ptmesh = DBGetPointmesh(silofile,toc->ptmesh_names[0]); if (!my_ptmesh) { printf(" ERROR reading point mesh %s\n",toc->ptmesh_names[0]); DBClose(silofile); *ierr = 4; return; } else { if (debug) printf(" DEBUG: Reading data from point mesh %s\n",toc->ptmesh_names[0]); int ndim = my_ptmesh->ndims; /*int nels = my_ptmesh->nels;*/ int i; int np = npartoftype[0]; int idim; int particle_type = 1; /* read in float */ float *x = 0; x = malloc(np*sizeof(float)); /* must send double to splash */ double *tmp_dbl = 0; tmp_dbl = malloc(np*sizeof(double)); /* read each coordinate in turn */ int icol = 0; for (idim=0;idimcoords[idim]; for (i=0;inptvar; for (i=0;iptvar_names[i]); DBmeshvar *my_ptvar = DBGetPointvar(silofile,toc->ptvar_names[i]); if (debug) { printf(" Associated with mesh %s\n",my_ptvar->meshname); printf(" label = %s\n",my_ptvar->label); printf(" Nels,nvals,nspace,ndims = %i %i %i %i\n",\ my_ptvar->nels,my_ptvar->nvals,my_ptvar->nspace,my_ptvar->ndims); } icol = icol + 1; x = my_ptvar->vals[0]; for (i=0;iname); /*DBFreeMeshvar(my_ptvar);*/ } free(x); free(tmp_dbl); DBFreePointmesh(my_ptmesh); } DBClose(silofile); } danieljprice-splash-4d1f09c/src/read_data_snsph.f90000066400000000000000000000121101477365367100223130ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2016 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM THE SNSPH CODE ! USING THE SELF-DESCRIBING FORMAT ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_snsph implicit none public :: read_data_snsph, set_labels_snsph private contains subroutine read_data_snsph(rootname,indexstart,ipos,nstepsread) use particle_data use params use settings_data, only:ndim,ndimV,ncolumns,ncalc use mem_allocation integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: j,ierr,ntoti,getcol integer :: npart_max,nstep_max,ncolstep real :: timei, gammai logical :: iexist character(len=len(rootname)+10) :: dumpfile nstepsread = 0 npart_max = maxpart dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: ',trim(dumpfile),' file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 ! !--allocate memory initially ! nstep_max = max(indexstart,1) j = indexstart nstepsread = 0 print "(1x,a)",'reading SNSPH format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--read number of columns and number of particles ! ncolstep = getcol() call getdata(dumpfile,len_trim(dumpfile),npart_max,timei,gammai) ! !--get number of particles from header and allocate memory ! ntoti = npart_max ncolumns = ncolstep if (.not.allocated(dat) .or. ntoti > npart_max) then npart_max = max(npart_max,INT(1.1*ntoti)) call alloc(npart_max,nstep_max,ncolstep+ncalc) endif npart_max = max(npart_max,ntoti) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,j+2*nstepsread,maxcol) endif ! !--now read the timestep data in the dumpfile ! time(j) = timei print "(a,i5,a,f10.3,a,i8)",'| step ',j,': t = ',time(j),' ntotal = ',ntoti nstepsread = nstepsread + 1 ! !--set particle numbers ! npartoftype(:,j) = 0 npartoftype(1,j) = ntoti ! !--now read data ! call readsdf(dumpfile,len_trim(dumpfile),dat(:,:,j),maxpart,maxcol,ierr) if (nstepsread > 0 .and. j > 0) then print*,'>> end of dump file: ntotal = ',sum(npartoftype(:,j)) endif return end subroutine read_data_snsph !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_snsph use labels use params use settings_data use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_snsph ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_snsph ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ih = 10 ! smoothing length iutherm = 8 ! thermal energy ipmass = 7 ! particle mass irho = 9 ! location of rho in data array label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = 'density' label(iutherm) = 'temperature' label(ih) = 'h' label(ipmass) = 'particle mass' ! !--set labels for vector quantities ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//labelcoord(i,1) enddo ! !--set labels for each particle type ! ntypes = 1 labeltype(1) = 'gas' !----------------------------------------------------------- return end subroutine set_labels_snsph end module readdata_snsph danieljprice-splash-4d1f09c/src/read_data_snsph_utils.c000066400000000000000000000051271477365367100233710ustar00rootroot00000000000000#include #include #include #include #include #include #include typedef struct { double x, y, z; float vx, vy, vz; float mass; float u; float rho; float h; } body; void readsdf_(char *filename, int *len, float *dat, int *maxpart, int *maxcol, int *ierr) { int xconf, yconf, zconf, vxconf, vyconf, vzconf, mconf, uconf, rhoconf, hconf; int gnobj, nobj, i; body *p; SDF *sdfp; char fname[128]; strncpy(fname, filename, *len); fname[*len] = '\0'; if ( (sdfp = SDFopen(NULL, fname)) == NULL ) { fprintf(stderr, "%s: %s", fname, SDFerrstring); exit(2); } SDFread(sdfp, (void **)(&p), &gnobj, &nobj, sizeof(body), "x", offsetof(body, x), &xconf, "y", offsetof(body, y), &yconf, "z", offsetof(body, z), &zconf, "vx", offsetof(body, vx), &vxconf, "vy", offsetof(body, vy), &vyconf, "vz", offsetof(body, vz), &vzconf, "mass", offsetof(body, mass), &mconf, "u", offsetof(body, u), &uconf, "rho", offsetof(body, rho), &rhoconf, "h", offsetof(body, h), &hconf, NULL); SDFclose(sdfp); if (!xconf || !yconf || !zconf || !vxconf || !vyconf || !vzconf || !mconf || !uconf || !rhoconf || !hconf) { fprintf(stderr, "No %s%s%s%s%s%s%s%s%s%s in %s\n", (xconf==0)? "x " : "", (yconf==0)? "y " : "", (zconf==0)? "z " : "", (vxconf==0)? "vx " : "", (vyconf==0)? "vy " : "", (vzconf==0)? "vz " : "", (mconf==0)? "m " : "", (uconf==0)? "u " : "", (rhoconf==0)? "rho " : "", (hconf==0)? "h " : "", fname); exit(3); } printf("nobj = %d\n", nobj); for(i = 0; i < nobj; ++i) { dat[i] = p[i].x; dat[(*maxpart)+i] = p[i].y; dat[2* (*maxpart)+i] = p[i].z; dat[3* (*maxpart)+i] = p[i].vx; dat[4* (*maxpart)+i] = p[i].vy; dat[5* (*maxpart)+i] = p[i].vz; dat[6* (*maxpart)+i] = p[i].mass; dat[7* (*maxpart)+i] = p[i].u; dat[8* (*maxpart)+i] = p[i].rho; dat[9* (*maxpart)+i] = p[i].h; } Free(p); *ierr = xconf || yconf || zconf || vxconf || vyconf || vzconf || mconf || uconf || rhoconf || hconf; } int getcol_() { return 10; } void getdata_(char *filename, int *len, int *nobj, float *tpos, float *gamma) { SDF *sdfp; char fname[128]; strncpy(fname, filename, *len); fname[*len] = '\0'; if ( (sdfp = SDFopen(NULL, fname)) == NULL ) { fprintf(stderr, "%s: %s", fname, SDFerrstring); exit(2); } SDFgetintOrDie(sdfp, "npart", nobj); SDFgetfloatOrDie(sdfp, "tpos", tpos); SDFgetfloatOrDie(sdfp, "gamma", gamma); SDFclose(sdfp); } danieljprice-splash-4d1f09c/src/read_data_sphNG.f90000066400000000000000000003301001477365367100222010ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM ! THE NEXT GENERATION SPH CODE (sphNG) ! ! (also my Phantom SPH code which uses a similar format) ! ! *** CONVERTS TO SINGLE PRECISION *** ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! COMMAND LINE FLAGS: ! ! --cm if set, then centre of mass is reset to origin ! --omega=3.142 if non-zero subtracts corotating velocities with omega as set ! --omegat=3.142 if non-zero subtracts corotating positions and velocities with omega as set ! --timeunits='yrs' sets default time units, either 's','min','hrs','yrs' or 'tfreefall' ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' ! ! Partial data read implemented Nov 2006 means that columns with ! the 'required' flag set to false are not read (read is therefore much faster) !------------------------------------------------------------------------- module sphNGread use params implicit none real(doub_prec) :: udist,umass,utime,umagfd real :: tfreefall,dtmax integer :: istartmhd,istartrt,nmhd,idivvcol,idivvxcol,icurlvxcol,icurlvycol,icurlvzcol,iHIIcol,iHeIIcol,iHeIIIcol integer :: nhydroreal4,istart_extra_real4 integer :: itempcol = 0 integer :: ncolstepfirst = 0 integer :: nhydroarrays,nmhdarrays,ndustarrays,ndustlarge logical :: phantomdump,smalldump,mhddump,rtdump,usingvecp,igotmass,h2chem,rt_in_header logical :: usingeulr,cleaning logical :: batcode,tagged,debug integer, parameter :: maxarrsizes = 10 integer, parameter :: maxinblock = 128 ! max allowed in each block integer, parameter :: lentag = 16 character(len=lentag) :: tagarr(maxplot) integer, parameter :: itypemap_sink_phantom = 3 integer, parameter :: itypemap_dust_phantom = 2 integer, parameter :: itypemap_unknown_phantom = maxparttypes real, allocatable :: grainsize(:) !------------------------------------------ ! generic interface to utilities for tagged ! dump format !------------------------------------------ interface extract module procedure extract_int, extract_real4, extract_real8, & extract_intarr, extract_real4arr, extract_real8arr end interface extract contains !------------------------------------------------------------------- ! function mapping iphase setting in sphNG to splash particle types !------------------------------------------------------------------- elemental integer function itypemap_sphNG(iphase) integer*1, intent(in) :: iphase select case(int(iphase)) case(0) itypemap_sphNG = 1 ! gas case(11:) itypemap_sphNG = 2 ! dust case(1:9) itypemap_sphNG = 4 ! nptmass case(10) itypemap_sphNG = 5 ! star case default itypemap_sphNG = 6 ! unknown end select end function itypemap_sphNG !--------------------------------------------------------------------- ! function mapping iphase setting in Phantom to splash particle types !--------------------------------------------------------------------- elemental integer function itypemap_phantom(iphase) integer*1, intent(in) :: iphase select case(int(iphase)) case(1:2) itypemap_phantom = iphase case(3:itypemap_unknown_phantom-1) ! put sinks as type 3, everything else shifted by one itypemap_phantom = iphase + 1 case(-3) ! sink particles, either from external_binary or read from dump itypemap_phantom = itypemap_sink_phantom case default itypemap_phantom = itypemap_unknown_phantom end select end function itypemap_phantom !------------------------------------------ ! extraction of single integer variables !------------------------------------------ subroutine extract_int(tag,ival,intarr,tags,ntags,ierr,verbose) character(len=*), intent(in) :: tag integer, intent(out) :: ival integer, intent(in) :: ntags,intarr(:) character(len=lentag), intent(in) :: tags(:) integer, intent(out) :: ierr logical, intent(in), optional :: verbose logical :: matched integer :: i ierr = 1 matched = .false. ival = 0 ! default if not found over_tags: do i=1,min(ntags,size(tags)) if (trim(tags(i))==trim(adjustl(tag))) then if (size(intarr) >= i) then ival = intarr(i) matched = .true. endif exit over_tags ! only match first occurrence endif enddo over_tags if (matched) ierr = 0 if (ierr /= 0 .and. .not.present(verbose)) & print "(a)",' WARNING: could not find '//trim(adjustl(tag))//' in header' end subroutine extract_int !------------------------------------------ ! extraction of single real*8 variables !------------------------------------------ subroutine extract_real8(tag,rval,r8arr,tags,ntags,ierr) character(len=*), intent(in) :: tag real*8, intent(out) :: rval real*8, intent(in) :: r8arr(:) character(len=lentag), intent(in) :: tags(:) integer, intent(in) :: ntags integer, intent(out) :: ierr logical :: matched integer :: i ierr = 1 matched = .false. rval = 0.d0 ! default if not found over_tags: do i=1,min(ntags,size(tags)) if (trim(tags(i))==trim(adjustl(tag))) then if (size(r8arr) >= i) then rval = r8arr(i) matched = .true. endif exit over_tags ! only match first occurrence endif enddo over_tags if (matched) ierr = 0 if (ierr /= 0) print "(a)",' WARNING: could not find '//trim(adjustl(tag))//' in header' end subroutine extract_real8 !------------------------------------------ ! extraction of single real*4 variables !------------------------------------------ subroutine extract_real4(tag,rval,r4arr,tags,ntags,ierr) character(len=*), intent(in) :: tag real*4, intent(out) :: rval real*4, intent(in) :: r4arr(:) character(len=lentag), intent(in) :: tags(:) integer, intent(in) :: ntags integer, intent(out) :: ierr logical :: matched integer :: i ierr = 1 matched = .false. rval = 0. ! default if not found over_tags: do i=1,min(ntags,size(tags)) if (trim(tags(i))==trim(adjustl(tag))) then if (size(r4arr) >= i) then rval = r4arr(i) matched = .true. endif exit over_tags ! only match first occurrence endif enddo over_tags if (matched) ierr = 0 if (ierr /= 0) print "(a)",' WARNING: could not find '//trim(adjustl(tag))//' in header' end subroutine extract_real4 !------------------------------------------ ! extraction of integer arrays !------------------------------------------ subroutine extract_intarr(tag,ival,intarr,tags,ntags,ierr) character(len=*), intent(in) :: tag integer, intent(out) :: ival(:) integer, intent(in) :: ntags,intarr(:) character(len=lentag), intent(in) :: tags(:) integer, intent(out) :: ierr integer :: i,nmatched ierr = 1 nmatched = 0 ival(:) = 0 ! default if not found over_tags: do i=1,min(ntags,size(tags)) if (trim(tags(i))==trim(adjustl(tag))) then if (size(intarr) >= i .and. size(ival) > nmatched) then nmatched = nmatched + 1 ival(nmatched) = intarr(i) endif endif enddo over_tags if (nmatched==size(ival)) ierr = 0 if (ierr /= 0) print "(a)",' WARNING: could not find '//trim(adjustl(tag))//' in header' end subroutine extract_intarr !------------------------------------------ ! extraction of real*8 arrays !------------------------------------------ subroutine extract_real8arr(tag,rval,r8arr,tags,ntags,ierr) character(len=*), intent(in) :: tag real*8, intent(out) :: rval(:) real*8, intent(in) :: r8arr(:) character(len=lentag), intent(in) :: tags(:) integer, intent(in) :: ntags integer, intent(out) :: ierr integer :: i,nmatched ierr = 1 nmatched = 0 rval = 0.d0 ! default if not found over_tags: do i=1,min(ntags,size(tags)) if (trim(tags(i))==trim(adjustl(tag))) then if (size(r8arr) >= i .and. size(rval) > nmatched) then nmatched = nmatched + 1 rval(nmatched) = r8arr(i) endif endif enddo over_tags if (nmatched==size(rval)) ierr = 0 if (ierr /= 0) print "(a)",' WARNING: could not find '//trim(adjustl(tag))//' in header' end subroutine extract_real8arr !------------------------------------------ ! extraction of real*4 arrays !------------------------------------------ subroutine extract_real4arr(tag,rval,r4arr,tags,ntags,ierr) character(len=*), intent(in) :: tag real*4, intent(out) :: rval(:) real*4, intent(in) :: r4arr(:) character(len=lentag), intent(in) :: tags(:) integer, intent(in) :: ntags integer, intent(out) :: ierr integer :: i,nmatched ierr = 1 nmatched = 0 rval = 0. ! default if not found over_tags: do i=1,min(ntags,size(tags)) if (trim(tags(i))==trim(adjustl(tag))) then if (size(r4arr) >= i .and. size(rval) > nmatched) then nmatched = nmatched + 1 rval(nmatched) = r4arr(i) endif endif enddo over_tags if (nmatched==size(rval)) ierr = 0 if (ierr /= 0) print "(a)",' WARNING: could not find '//trim(adjustl(tag))//' in header' end subroutine extract_real4arr !---------------------------------------------------------------------- ! Extract various options from the fileident string !---------------------------------------------------------------------- subroutine get_options_from_fileident(fileident,smalldump,tagged,phantomdump,& usingvecp,usingeulr,cleaning,h2chem,rt_in_header,batcode) character(len=*), intent(in) :: fileident logical, intent(out) :: smalldump,tagged,phantomdump,batcode logical, intent(out) :: usingvecp,usingeulr,cleaning,h2chem,rt_in_header smalldump = .false. phantomdump = .false. usingvecp = .false. usingeulr = .false. cleaning = .false. h2chem = .false. rt_in_header = .false. batcode = .false. tagged = .false. if (fileident(1:1)=='S') then smalldump = .true. endif if (fileident(2:2)=='T') then tagged = .true. endif if (index(fileident,'Phantom') /= 0) then phantomdump = .true. else phantomdump = .false. endif if (index(fileident,'vecp') /= 0) then usingvecp = .true. endif if (index(fileident,'eulr') /= 0) then usingeulr = .true. endif if (index(fileident,'clean') /= 0) then cleaning = .true. endif if (index(fileident,'H2chem') /= 0) then h2chem = .true. endif if (index(fileident,'RT=on') /= 0) then rt_in_header = .true. endif if (index(fileident,'This is a test') /= 0) then batcode = .true. endif end subroutine get_options_from_fileident !---------------------------------------------------------------------- ! Set position of header items manually for older (untagged) formats !---------------------------------------------------------------------- subroutine fake_header_tags(nreals,realarr,tagsreal) integer, intent(in) :: nreals real, intent(in) :: realarr(nreals) character(len=*), intent(out) :: tagsreal(:) integer, parameter :: ilocbinary = 24 integer :: ipos ! !--set the tags manually for older formats ! (but only the ones we care about) ! if (phantomdump) then tagsreal(1) = 'time' tagsreal(3) = 'gamma' tagsreal(4) = 'rhozero' tagsreal(6) = 'hfact' tagsreal(7) = 'tolh' tagsreal(15:19) = 'massoftype' if (nreals >= ilocbinary + 14) then if (nreals >= ilocbinary + 15) then ipos = ilocbinary else print*,'*** WARNING: obsolete header format for external binary information ***' ipos = ilocbinary + 1 endif if (debug) print*,'DEBUG: reading binary information from header ',ilocbinary if (any(realarr(ilocbinary:ilocbinary+14) /= 0.)) then tagsreal(ipos:ipos+2) = (/'x1','y1','z1'/) if (nreals >= ilocbinary+15) then tagsreal(ipos+3:ipos+9) = (/'m1','h1','x2','y2','z2','m2','h2'/) ipos = ipos + 10 else tagsreal(ipos+3:ipos+7) = (/'h1','x2','y2','z2','h2'/) ipos = ipos + 8 endif tagsreal(ipos:ipos+5) = (/'vx1','vy1','vz1','vx2','vy2','vz2'/) endif endif elseif (batcode) then tagsreal(1) = 'time' tagsreal(3) = 'gamma' tagsreal(4) = 'radL1' tagsreal(5) = 'PhiL1' tagsreal(15) = 'Er' else tagsreal(1) = 'gt' tagsreal(2) = 'dtmax' tagsreal(3) = 'gamma' tagsreal(4) = 'rhozero' tagsreal(5) = 'RK2' if (smalldump) then ! sphNG small dump if (nreals==15) then tagsreal(15) = 'pmassinitial' else tagsreal(23) = 'pmassinitial' endif endif endif end subroutine fake_header_tags subroutine set_grain_sizes(ntags,tags,vals,udist) integer, intent(in) :: ntags character(len=*), intent(in) :: tags(ntags) real, intent(inout) :: vals(ntags) real(doub_prec), intent(in) :: udist integer :: i,nd ! convert grain sizes to cm nd = 0 do i=1,ntags if (index(tags(i),'grainsize') > 0) then nd = nd + 1 vals(i) = vals(i)*udist endif enddo if (allocated(grainsize)) deallocate(grainsize) allocate(grainsize(nd)) nd = 0 do i=1,ntags if (index(tags(i),'grainsize') > 0) then nd = nd + 1 grainsize(nd) = vals(i) endif enddo end subroutine set_grain_sizes !---------------------------------------------------------------------- ! print information about dust grain sizes found in header !---------------------------------------------------------------------- subroutine print_dustgrid_info(ntags,tags,vals,mgas) use asciiutils, only:match_tag use labels, only:get_label_grain_size integer, intent(in) :: ntags character(len=*), intent(in) :: tags(ntags) real, intent(in) :: vals(ntags),mgas integer :: i,nd nd = 0 if (match_tag(tags,'grainsize1') > 0) then print "(/,a)",' Dust grid:' do i=1,ntags if (index(tags(i),'grainsize') > 0 .and. vals(i) > 0.) then nd = nd + 1 print "(i3,a)",nd,': '//get_label_grain_size(vals(i)) endif enddo if (nd > 0) print "(a)" endif ! nd = 0 ! print *,' mgas = ',mgas/(2d33/umass) ! do i=1,ntags ! if (index(tags(i),'mdust_in') > 0) then ! nd = nd + 1 ! if (vals(i) > 0.) print "(i3,a,1pg10.3,a,1pg10.3)",nd,': mass = ',vals(i)/(2d33/umass),& ! ' Msun; d/g = ',vals(i)/mgas ! endif ! enddo end subroutine print_dustgrid_info !---------------------------------------------------------------------- ! Routine to read the header of sphNG dump files and extract relevant ! information !---------------------------------------------------------------------- subroutine read_header(iunit,iverbose,debug,doubleprec,& npart,npartoftypei,n1,ntypes,nblocks,& narrsizes,realarr,tagsreal,nreals,ierr) use settings_data, only:ndusttypes integer, intent(in) :: iunit,iverbose logical, intent(in) :: debug,doubleprec integer, intent(out) :: npart,npartoftypei(:),n1,ntypes,nblocks,narrsizes,nreals,ierr real, intent(out) :: realarr(maxinblock) character(len=lentag), intent(out) :: tagsreal(maxinblock) character(len=lentag) :: tags(maxinblock) integer :: intarr(maxinblock) real(doub_prec) :: real8arr(maxinblock) real(sing_prec) :: real4arr(maxinblock) integer :: i,ierr1,ierr2,ierrs(4) integer :: nints,ninttypes,nreal4s,nreal8s integer :: n2,nreassign,naccrete,nkill integer, allocatable :: npartoftype_tmp(:) ! initialise empty tag array tags(:) = '' intarr(:) = 0 nblocks = 1 ! number of MPI blocks npartoftypei(:) = 0 read(iunit,iostat=ierr) nints if (ierr /=0) then print "(a)",'error reading nints' return else if (tagged) then if (nints > maxinblock) then if (iverbose > 0) print*,'WARNING: number of ints in header exceeds splash array limit, ignoring some' nints = maxinblock endif read(iunit,iostat=ierr1) tags(1:nints) read(iunit,iostat=ierr2) intarr(1:nints) if (ierr1 /= 0 .or. ierr2 /= 0) then print "(a)",'error reading integer header' ierr = 1 return endif if (debug) print*,'DEBUG: got tags = ',tags(1:nints) call extract('nblocks',nblocks,intarr,tags,nints,ierr) if (ierr /= 0) return call extract('nparttot',npart,intarr,tags,nints,ierr) if (ierr /= 0) return if (phantomdump) then call extract('ntypes',ntypes,intarr,tags,nints,ierr) if (ierr /= 0) return allocate(npartoftype_tmp(ntypes)) call extract('npartoftype',npartoftype_tmp(1:ntypes),intarr,tags,nints,ierr) if (ntypes > maxparttypes) then if (iverbose > 0 .and. any(npartoftype_tmp(maxparttypes+1:) > 0)) & print "(a,i2)",' WARNING: number of particle types exceeds array limits: ignoring types > ',maxparttypes ntypes = maxparttypes endif npartoftypei(1:ntypes) = npartoftype_tmp(1:ntypes) if (ierr /= 0) return endif if (phantomdump .and. nints < 7) ntypes = nints - 1 if (iverbose >= 2 .or. debug) print *,'npart = ',npart,' MPI blocks = ',nblocks if (phantomdump) then n1 = npartoftypei(1) else call extract('n1',n1,intarr,tags,nints,ierr) endif else if (nints < 3) then if (.not.phantomdump) print "(a)",'WARNING: npart,n1,n2 NOT IN HEADER??' read(iunit,iostat=ierr) npart npartoftypei(1) = npart elseif (phantomdump) then if (nints < 7) then ntypes = nints - 1 read(iunit,iostat=ierr) npart,npartoftypei(1:ntypes) else ntypes = 5 read(iunit,iostat=ierr) npart,npartoftypei(1:5),nblocks endif if (debug) then print*,'DEBUG: ntypes = ',ntypes,' npartoftype = ',npartoftypei(:) endif n1 = npartoftypei(1) n2 = 0 elseif (nints >= 7) then read(iunit,iostat=ierr) npart,n1,n2,nreassign,naccrete,nkill,nblocks else print "(a)",'warning: nblocks not read from file (assuming non-MPI dump)' read(iunit,iostat=ierr) npart,n1,n2 endif if (ierr /=0) then print "(a)",'error reading npart,n1,n2 and/or number of MPI blocks' return elseif (nblocks > 2000) then print *,'npart = ',npart,' MPI blocks = ',nblocks nblocks = 1 print*,' corrupt number of MPI blocks, assuming 1 ' else if (iverbose >= 1) print *,'npart = ',npart,' MPI blocks = ',nblocks endif endif endif !--int*1, int*2, int*4, int*8 ierr1 = 0 ierr2 = 0 do i=1,4 read(iunit,iostat=ierr) ninttypes if (ninttypes > 0) then if (tagged) read(iunit,iostat=ierr1) read(iunit,iostat=ierr2) endif if (ierr /= 0 .or. ierr1 /= 0 .or. ierr2 /= 0) then print "(a)",'error skipping int types' return endif enddo !--default reals read(iunit,iostat=ierr) nreals if (ierr /=0) then print "(a)",'error reading default reals' return else if (nreals > maxinblock) then print*,'WARNING: number of reals in header exceeds splash array limit, ignoring some' nreals = maxinblock endif if (tagged) read(iunit,iostat=ierr) tagsreal(1:nreals) if (doubleprec) then read(iunit,iostat=ierr) real8arr(1:nreals) realarr(1:nreals) = real(real8arr(1:nreals)) else read(iunit,iostat=ierr) real4arr(1:nreals) realarr(1:nreals) = real(real4arr(1:nreals)) endif if (.not.tagged) call fake_header_tags(nreals,realarr,tagsreal) endif ! !--append integers to realarr so they can be used in ! legends and calculated quantities ! if (nreals+nints <= maxinblock) then tagsreal(nreals+1:nreals+nints) = tags(1:nints) realarr(nreals+1:nreals+nints) = real(intarr(1:nints)) nreals = nreals + nints endif !--real*4, real*8 read(iunit,iostat=ierr) nreal4s if (nreal4s > 0) then if (tagged) read(iunit,iostat=ierr1) read(iunit,iostat=ierr2) endif if (ierr /= 0 .or. ierr1 /= 0 .or. ierr2 /= 0) then print "(a)",'error skipping real*4''s in header' return endif read(iunit,iostat=ierr) nreal8s if (ierr /= 0 .or. nreal8s < 0) then print "(a)",'error reading nreal8s' return endif ! print "(a,i3)",' ndoubles = ',nreal8s if (iverbose >= 2 .or. debug) print "(4(a,i3),a)",' header contains ',nints,' ints, ',& nreals,' reals,',nreal4s,' real4s, ',nreal8s,' doubles' if (tagged) then if (nreal8s > maxinblock) then print*,'WARNING: number of real8''s in header exceeds splash array limit, ignoring some' nreal8s = maxinblock endif read(iunit,iostat=ierr) tags(1:nreal8s) read(iunit,iostat=ierr) real8arr(1:nreal8s) call extract('udist',udist,real8arr,tags,nreal8s,ierrs(1)) call extract('umass',umass,real8arr,tags,nreal8s,ierrs(2)) call extract('utime',utime,real8arr,tags,nreal8s,ierrs(3)) call extract('umagfd',umagfd,real8arr,tags,nreal8s,ierrs(4)) ! extract the number of dustfrac arrays in the file ndusttypes = extract_ndusttypes(tags,tagsreal,intarr,nints) ! !--append real*8s to realarr so they can be used in ! legends and calculated quantities ! if (nreals+nreal8s <= maxinblock) then tagsreal(nreals+1:nreals+nreal8s) = tags(1:nreal8s) realarr(nreals+1:nreals+nreal8s) = real(real8arr(1:nreal8s)) nreals = nreals + nreal8s endif else if (nreal8s >= 4) then read(iunit,iostat=ierr) udist,umass,utime,umagfd elseif (nreal8s >= 3) then read(iunit,iostat=ierr) udist,umass,utime umagfd = 1.0 else print "(a)",'*** WARNING: units not found in file' udist = 1.0 umass = 1.0 utime = 1.0 umagfd = 1.0 endif endif if (ierr /= 0) then print "(a)",'*** error reading units' endif ! !--Total number of array blocks in the file ! read(iunit,iostat=ierr) narrsizes if (ierr /= 0) return if (debug) print*,' nblocks(total)=',narrsizes narrsizes = narrsizes/nblocks if (ierr /= 0) then print "(a)",'*** error reading number of array sizes ***' close(iunit) return elseif (narrsizes > maxarrsizes) then narrsizes = maxarrsizes print "(a,i2)",'WARNING: too many array sizes: reading only ',narrsizes endif if (narrsizes >= 4 .and. nreal8s < 4) then print "(a)",' WARNING: could not read magnetic units from dump file' endif if (debug) print*,' number of array sizes = ',narrsizes if (allocated(npartoftype_tmp)) deallocate(npartoftype_tmp) end subroutine read_header !---------------------------------------------------------------------- ! Read the header to each array block !---------------------------------------------------------------------- subroutine read_block_header(iunit,iblock,iarr,iverbose,debug,& isize,nint,nint1,nint2,nint4,nint8,nreal,nreal4,nreal8,& ntotblock,npart,ntotal,nptmasstot,ncolstep,ierr) integer, intent(in) :: iunit,iblock,iarr,iverbose logical, intent(in) :: debug integer*8, intent(out) :: isize(:) integer, intent(out) :: nint,nint1,nint2,nint4,nint8,nreal,nreal4,nreal8,ierr integer, intent(inout) :: ntotblock,npart,ntotal,nptmasstot,ncolstep read(iunit,iostat=ierr) isize(iarr),nint,nint1,nint2,nint4,nint8,nreal,nreal4,nreal8 if (iarr==1) then ntotblock = isize(iarr) if (npart <= 0) npart = ntotblock ntotal = ntotal + ntotblock elseif (iarr==2) then nptmasstot = nptmasstot + isize(iarr) endif if (debug) print*,'DEBUG: array size ',iarr,' size = ',isize(iarr) if (isize(iarr) > 0 .and. iblock==1) then if (iverbose >= 2 .or. debug) print "(1x,a,i1,a,i12,a,5(i2,1x),a,3(i2,1x))", & 'block ',iarr,' dim = ',isize(iarr),' nint =',nint,nint1,nint2,nint4,nint8,& 'nreal =',nreal,nreal4,nreal8 endif !--we are going to read all real arrays but need to convert them all to default real if (iarr /= 2 .and. isize(iarr)==isize(1) .and. iblock==1) then ncolstep = ncolstep + nreal + nreal4 + nreal8 endif end subroutine read_block_header !---------------------------------------------------------------------- ! Extract and print relevant variables from the header block !---------------------------------------------------------------------- subroutine extract_variables_from_header(tags,realarr,nreals,iverbose,debug,& gotbinary,nblocks,nptmasstot,npartoftypei,ntypes,& time,gamma,hfact,npart,ntotal,npartoftype,massoftype,dat,ix,ih,ipmass,ivx) character(len=lentag), intent(in) :: tags(maxinblock) real, intent(in) :: realarr(maxinblock) integer, intent(in) :: nreals,iverbose,nblocks,nptmasstot,npartoftypei(:),ntypes integer, intent(in) :: ix(3),ih,ipmass,ivx real, intent(out) :: time,gamma,hfact,massoftype(:) real, intent(inout) :: dat(:,:) integer, intent(out) :: npartoftype(:) integer, intent(inout) :: npart,ntotal logical, intent(in) :: debug logical, intent(out) :: gotbinary real :: rhozero,tff,radL1,PhiL1,Er,RK2 !,dtmax real :: massoftypei(ntypes) integer :: i,ierrs(10) integer :: itype real, parameter :: pi=4.*atan(1.) if (phantomdump) then call extract('time',time,realarr,tags,nreals,ierrs(1)) else call extract('gt',time,realarr,tags,nreals,ierrs(1)) endif call extract('gamma',gamma,realarr,tags,nreals,ierrs(2)) call extract('rhozero',rhozero,realarr,tags,nreals,ierrs(3)) !--extract required information from the first block header if (rhozero > 0.) then tfreefall = sqrt((3. * pi) / (32. * rhozero)) tff = time/tfreefall else tfreefall = 0. tff = 0. endif if (phantomdump) then call extract('massoftype',massoftypei(1:ntypes),realarr,tags,nreals,ierrs(4)) npartoftype(:) = 0 do i=1,ntypes !--map from phantom types to splash types itype = itypemap_phantom(int(i,kind=1)) if (debug) print*,'DEBUG: npart of type ',itype,' += ',npartoftypei(i) npartoftype(itype) = npartoftype(itype) + npartoftypei(i) massoftype(itype) = massoftypei(i) enddo npartoftype(itypemap_sink_phantom) = nptmasstot ! sink particles if (debug) print*,'DEBUG: npart of type sink ',itypemap_sink_phantom,' = ',nptmasstot ! !--if Phantom calculation uses the binary potential ! then read this as two point mass particles ! if (any(tags(1:nreals)=='x1')) then gotbinary = .true. npartoftype(itypemap_sink_phantom) = npartoftype(itypemap_sink_phantom) + 2 ntotal = ntotal + 2 call extract('x1',dat(npart+1,ix(1)),realarr,tags,nreals,ierrs(1)) call extract('y1',dat(npart+1,ix(2)),realarr,tags,nreals,ierrs(2)) call extract('z1',dat(npart+1,ix(3)),realarr,tags,nreals,ierrs(3)) if (ipmass > 0) call extract('m1',dat(npart+1,ipmass),realarr,tags,nreals,ierrs(4)) call extract('h1',dat(npart+1,ih),realarr,tags,nreals,ierrs(4)) if (debug) print *,npart+1,npart+2 if (iverbose >= 1) print *,'binary position: primary: ',dat(npart+1,ix(1):ix(3)) call extract('x2',dat(npart+2,ix(1)),realarr,tags,nreals,ierrs(1)) call extract('y2',dat(npart+2,ix(2)),realarr,tags,nreals,ierrs(2)) call extract('z2',dat(npart+2,ix(3)),realarr,tags,nreals,ierrs(3)) if (ipmass > 0) call extract('m2',dat(npart+2,ipmass),realarr,tags,nreals,ierrs(4)) call extract('h2',dat(npart+2,ih),realarr,tags,nreals,ierrs(5)) if (iverbose >= 1 .and. ipmass > 0 .and. ih > 0) then print *,' secondary: ',dat(npart+2,ix(1):ix(3)) print *,' m1: ',dat(npart+1,ipmass),' m2:',dat(npart+2,ipmass),& ' h1: ',dat(npart+2,ipmass),' h2:',dat(npart+2,ih) endif if (ivx > 0) then call extract('vx1',dat(npart+1,ivx),realarr,tags,nreals,ierrs(1)) call extract('vy1',dat(npart+1,ivx+1),realarr,tags,nreals,ierrs(2)) call extract('vz1',dat(npart+1,ivx+2),realarr,tags,nreals,ierrs(3)) call extract('vx2',dat(npart+2,ivx),realarr,tags,nreals,ierrs(4)) call extract('vy2',dat(npart+2,ivx+1),realarr,tags,nreals,ierrs(5)) call extract('vz2',dat(npart+2,ivx+2),realarr,tags,nreals,ierrs(6)) endif npart = npart + 2 endif else npartoftype(:) = 0 npartoftype(1) = npart npartoftype(2) = max(ntotal - npart,0) endif hfact = 1.2 if (phantomdump) then call extract('hfact',hfact,realarr,tags,nreals,ierrs(1)) call extract('dtmax',dtmax,realarr,tags,nreals,ierrs(2)) if (iverbose > 0) then print "(a,es12.4,a,f6.3,a,f5.2)", & ' time = ',time,' gamma = ',gamma,' hfact = ',hfact endif elseif (batcode) then call extract('radL1',radL1,realarr,tags,nreals,ierrs(1)) call extract('PhiL1',PhiL1,realarr,tags,nreals,ierrs(2)) call extract('Er',Er,realarr,tags,nreals,ierrs(3)) if (iverbose > 0) then print "(a,es12.4,a,f9.5,a,f8.4,/,a,es12.4,a,es9.2,a,es10.2)", & ' time: ',time, ' gamma: ',gamma, ' tsph: ',realarr(2), & ' radL1: ',radL1,' PhiL1: ',PhiL1,' Er: ',Er endif else call extract('RK2',RK2,realarr,tags,nreals,ierrs(1)) call extract('dtmax',dtmax,realarr,tags,nreals,ierrs(2)) if (iverbose > 0) then print "(a,es12.4,a,f9.5,a,f8.4,/,a,es12.4,a,es9.2,a,es10.2)", & ' time: ',time, ' gamma: ',gamma, ' RK2: ',RK2, & ' t/t_ff: ',tff,' rhozero: ',rhozero,' dtmax: ',dtmax endif endif end subroutine extract_variables_from_header !--------------------------------------------------------------- ! old subroutine for guessing labels in non-tagged sphNG format !--------------------------------------------------------------- subroutine guess_labels(ncolumns,iamvec,label,labelvec,istartmhd, & istart_extra_real4,nmhd,nhydroreal4,ndimV,irho,iBfirst,ivx,& iutherm,idivB,iJfirst,iradenergy,icv,udist,utime,units,& unitslabel) use geometry, only:labelcoord use labels, only:make_vector_label integer, intent(in) :: ncolumns,istartmhd,istart_extra_real4 integer, intent(in) :: nmhd,nhydroreal4,ndimV,irho integer, intent(out) :: iBfirst,ivx,iutherm,idivB,iJfirst,iradenergy,icv integer, intent(inout) :: iamvec(:) character(len=*), intent(inout) :: label(:),labelvec(:),unitslabel(:) real(doub_prec), intent(in) :: udist,utime real, intent(inout) :: units(:) real(doub_prec) :: uergg !--the following only for mhd small dumps or full dumps if (ncolumns >= 7) then if (mhddump) then iBfirst = irho+1 if (.not.smalldump) then ivx = iBfirst+ndimV iutherm = ivx+ndimV if (phantomdump) then !--phantom MHD full dumps if (nmhd >= 4) then call make_vector_label('A',istartmhd,ndimV,iamvec,labelvec,label,labelcoord(:,1)) if (nmhd >= 7) then label(istartmhd+3) = 'Euler beta_{x}' label(istartmhd+4) = 'Euler beta_{x}' label(istartmhd+5) = 'Euler beta_{y}' idivB = istartmhd+2*ndimV else idivB = istartmhd+ndimV endif elseif (nmhd >= 3) then label(istartmhd) = 'Euler alpha' label(istartmhd+1) = 'Euler beta' idivB = istartmhd + 2 elseif (nmhd >= 2) then label(istartmhd) = 'Psi' idivB = istartmhd + 1 elseif (nmhd >= 1) then idivB = istartmhd endif iJfirst = 0 if (ncolumns >= idivB+1) then label(idivB+1) = 'alpha_{B}' endif else !--sphNG MHD full dumps label(iutherm+1) = 'grad h' label(iutherm+2) = 'grad soft' label(iutherm+3) = 'alpha' if (nmhd >= 7 .and. usingvecp) then call make_vector_label('A',istartmhd,ndimV,iamvec,labelvec,label,labelcoord(:,1)) idivB = istartmhd+ndimV elseif (nmhd >= 6 .and. usingeulr) then label(istartmhd) = 'Euler alpha' label(istartmhd+1) = 'Euler beta' idivB = istartmhd + 2 elseif (nmhd >= 6) then label(istartmhd) = 'psi' idivB = istartmhd + 1 if (nmhd >= 8) then label(istartmhd+2+ndimV+1) = '\eta_{real}' label(istartmhd+2+ndimV+2) = '\eta_{art}' units(istartmhd+2+ndimV+1:istartmhd+2+ndimV+2) = udist*udist/utime unitslabel(istartmhd+2+ndimV+1:istartmhd+2+ndimV+2) = ' [cm^2/s]' endif if (nmhd >= 14) then call make_vector_label('fsym',istartmhd+2+ndimV+3,ndimV,& iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('faniso',istartmhd+2+ndimV+6,ndimV,& iamvec,labelvec,label,labelcoord(:,1)) endif elseif (nmhd >= 1) then idivB = istartmhd endif iJfirst = idivB + 1 if (ncolumns >= iJfirst+ndimV) then label(iJfirst+ndimV) = 'alpha_{B}' endif endif else ! mhd small dump if (nhydroreal4 >= 3) iutherm = iBfirst+ndimV endif elseif (.not.smalldump) then ! pure hydro full dump ivx = irho+1 iutherm = ivx + ndimV if (phantomdump) then if (istart_extra_real4 > 0 .and. istart_extra_real4 < 100) then label(istart_extra_real4) = 'alpha' label(istart_extra_real4+1) = 'alphau' endif else if (istart_extra_real4 > 0 .and. istart_extra_real4 < 100) then label(istart_extra_real4) = 'grad h' label(istart_extra_real4+1) = 'grad soft' label(istart_extra_real4+2) = 'alpha' endif endif endif if (phantomdump .and. h2chem) then if (smalldump) then label(nhydroarrays+nmhdarrays+1) = 'H_2 ratio' elseif (.not.smalldump .and. iutherm > 0) then label(iutherm+1) = 'H_2 ratio' label(iutherm+2) = 'HI abundance' label(iutherm+3) = 'proton abundance' label(iutherm+4) = 'e^- abundance' label(iutherm+5) = 'CO abundance' endif endif if (istartrt > 0 .and. istartrt <= ncolumns .and. rtdump) then ! radiative transfer dump iradenergy = istartrt label(iradenergy) = 'radiation energy' uergg = (udist/utime)**2 units(iradenergy) = uergg if (smalldump) then icv = istartrt+1 else label(istartrt+1) = 'opacity' units(istartrt+1) = udist**2/umass icv = istartrt+2 label(istartrt+3) = 'lambda' units(istartrt+3) = 1.0 label(istartrt+4) = 'eddington factor' units(istartrt+4) = 1.0 endif if (icv > 0) then label(icv) = 'u/T' units(icv) = uergg endif else iradenergy = 0 icv = 0 endif endif end subroutine guess_labels integer function assign_column(tag,iarr,ipos,ikind,imaxcolumnread,idustarr,ncolstep) result(icolumn) use labels, only:ih,irho,ix,ipmass character(len=lentag), intent(in) :: tag integer, intent(in) :: iarr,ipos,ikind,ncolstep integer, intent(inout) :: imaxcolumnread integer, intent(inout) :: idustarr if (tagged .and. len_trim(tag) > 0) then ! ! use the tags to put certain arrays in an assigned place ! no matter what type is used for the variable in the file ! and no matter what order they appear in the dump file ! select case(trim(tag)) case('x') icolumn = ix(1) case('y') icolumn = ix(2) case('z') icolumn = ix(3) case('m') icolumn = ipmass case('h') icolumn = ih case('rho') icolumn = irho case('dustfracsum') idustarr = idustarr + 1 icolumn = nhydroarrays + idustarr case('dustfrac') if (ndustarrays > 0) then idustarr = idustarr + 1 icolumn = nhydroarrays + idustarr else icolumn = max(nhydroarrays + ndustarrays + nmhdarrays + 1,imaxcolumnread + 1) endif case('Bx') icolumn = nhydroarrays + ndustarrays + 1 case('By') icolumn = nhydroarrays + ndustarrays + 2 case('Bz') icolumn = nhydroarrays + ndustarrays + 3 case default icolumn = max(nhydroarrays + ndustarrays + nmhdarrays + 1,imaxcolumnread + 1) if (icolumn > ncolstep) then ! check for dustfrac not being present if (idustarr == 0 .and. ndustarrays > 0) icolumn = nhydroarrays + 1 endif if (iarr==1) then if (ikind==4) then ! real*4 array istart_extra_real4 = min(istart_extra_real4,icolumn) if (debug) print*,' istart_extra_real4 = ',istart_extra_real4 endif endif end select else ! ! this is old code handling the non-tagged format where ! particular arrays are assumed to be in particular places ! if (ikind==6) then ! default reals if (iarr==1.and.((phantomdump.and.ipos==4) & .or.(.not.phantomdump.and.ipos==6))) then ! read x,y,z,m,h and then place arrays after always-present ones ! (for phantom read x,y,z only) icolumn = nhydroarrays+nmhdarrays + 1 elseif (.not.phantomdump .and. (iarr==4 .and. ipos <= 3)) then icolumn = nhydroarrays + ipos else icolumn = imaxcolumnread + 1 endif elseif (ikind==4) then ! real*4s if (phantomdump) then if (iarr==1 .and. ipos==1) then icolumn = ih ! h is always first real4 in phantom dumps !!--density depends on h being read !required(ih) = .true. elseif (iarr==4 .and. ipos <= 3) then icolumn = nhydroarrays + ipos else icolumn = max(nhydroarrays+nmhdarrays + 1,imaxcolumnread + 1) if (iarr==1) then istart_extra_real4 = min(istart_extra_real4,icolumn) if (debug) print*,' istart_extra_real4 = ',istart_extra_real4 endif endif else if (iarr==1 .and. ipos==1) then icolumn = irho ! density elseif (iarr==1 .and. smalldump .and. ipos==2) then icolumn = ih ! h which is real4 in small dumps !--this was a bug for sphNG files... !elseif (iarr==4 .and. i <= 3) then ! icolumn = nhydroarrays + ipos else icolumn = max(nhydroarrays+nmhdarrays + 1,imaxcolumnread + 1) if (iarr==1) then istart_extra_real4 = min(istart_extra_real4,icolumn) if (debug) print*,' istart_extra_real4 = ',istart_extra_real4 endif endif endif else ! used for untagged format with real*8's icolumn = imaxcolumnread + 1 endif endif if (icolumn < 1 .or. icolumn > ncolstep) then print*,' ERROR in column assignment for '//trim(tag) icolumn = ncolstep ! screw up last entry, but don't seg fault endif imaxcolumnread = max(imaxcolumnread,icolumn) end function assign_column !--------------------------------------------------------------- ! function to extract the number of dust arrays !--------------------------------------------------------------- integer function extract_ndusttypes(tags,tagsreal,intarr,nints) result(ndusttypes) character(len=lentag), intent(in) :: tags(maxinblock),tagsreal(maxinblock) integer, intent(in) :: intarr(:),nints integer :: i,idust,ierr,ndustsmall logical :: igotndusttypes ! Look for ndusttypes in the header igotndusttypes = .false. do i = 1,maxinblock if (trim(tags(i))=='ndusttypes') igotndusttypes = .true. enddo ! Retreive/guess the value of ndusttypes if (igotndusttypes) then call extract('ndusttypes',idust,intarr,tags,nints,ierr) else call extract('ndustsmall',ndustsmall,intarr,tags,nints,ierr,verbose=.false.) call extract('ndustlarge',ndustlarge,intarr,tags,nints,ierr,verbose=.false.) idust = ndustsmall+ndustlarge ! For older files where ndusttypes is not output to the header if (ierr /= 0) then idust = 0 do i = 1,maxinblock if (tagsreal(i)=='grainsize') idust = idust + 1 enddo if (idust > 0) then write(*,"(a)") ' Warning! Could not find ndusttypes in header' write(*,"(a,I4)") ' ...counting grainsize arrays...ndusttypes =',idust endif endif endif ndusttypes = idust end function extract_ndusttypes subroutine get_rho_from_h(i1,i2,ih,ipmass,irho,required,npartoftype,massoftype,hfact,dat,iphase,nkilled) integer, intent(in) :: i1,i2,ih,ipmass,irho logical, intent(in) :: required(0:) integer, intent(inout) :: npartoftype(:) real, intent(in) :: massoftype(:),hfact real, intent(inout) :: dat(:,:) integer(kind=int1), intent(inout) :: iphase(:) integer, intent(inout) :: nkilled integer :: itype,k real :: pmassi,hi,rhoi ! !--dead particles have -ve smoothing lengths in phantom ! so use abs(h) for these particles and hide them ! if (any(npartoftype(2:) > 0)) then if (.not.required(ih)) print*,'ERROR: need to read h, but required=F' !--need masses for each type if not all gas if (debug) print*,'DEBUG: phantom: setting h for multiple types ',i1,i2 if (debug) print*,'DEBUG: massoftype = ',massoftype(:) do k=i1,i2 itype = itypemap_phantom(iphase(k)) pmassi = massoftype(itype) hi = dat(k,ih) if (ipmass > 0) pmassi = dat(k,ipmass) if (hi > 0.) then if (required(irho)) dat(k,irho) = pmassi*(hfact/hi)**3 elseif (hi < 0.) then !print*,' accreted: ',k,' type was ',itype,iphase(k) npartoftype(itype) = npartoftype(itype) - 1 npartoftype(itypemap_unknown_phantom) = npartoftype(itypemap_unknown_phantom) + 1 if (required(irho)) dat(k,irho) = pmassi*(hfact/abs(hi))**3 iphase(k) = -1 else ! dead particles npartoftype(itype) = npartoftype(itype) - 1 npartoftype(itypemap_unknown_phantom) = npartoftype(itypemap_unknown_phantom) + 1 nkilled = nkilled + 1 if (required(irho)) dat(k,irho) = 0. iphase(k) = -2 endif enddo else if (.not.required(ih)) print*,'ERROR: need to read h, but required=F' if (debug) print*,'debug: phantom: setting rho for all types' pmassi = massoftype(1) !--assume all particles are gas particles do k=i1,i2 hi = dat(k,ih) if (ipmass > 0) pmassi = dat(k,ipmass) if (hi > 0.) then rhoi = pmassi*(hfact/hi)**3 elseif (hi < 0.) then rhoi = pmassi*(hfact/abs(hi))**3 npartoftype(1) = npartoftype(1) - 1 npartoftype(itypemap_unknown_phantom) = npartoftype(itypemap_unknown_phantom) + 1 iphase(k) = -1 else ! if h = 0. rhoi = 0. npartoftype(1) = npartoftype(1) - 1 npartoftype(itypemap_unknown_phantom) = npartoftype(itypemap_unknown_phantom) + 1 iphase(k) = -2 endif if (required(irho)) dat(k,irho) = rhoi enddo endif end subroutine get_rho_from_h !---------------------------------------------------------------------- ! Set a negative smoothing length for merged sinks, so that ! they can be ignored when plotting !---------------------------------------------------------------------- subroutine set_sink_merged(i1,i2,ih,ipmass,dat) integer, intent(in) :: i1,i2,ih,ipmass real, intent(inout) :: dat(:,:) integer :: i if (ih > 0 .and. ipmass > 0) then do i=i1,i2 if (dat(i,ipmass) < 0.) dat(i,ih) = -1. enddo endif end subroutine set_sink_merged !---------------------------------------------------------------------- ! Set density on sink particles based on the mass and radius ! this is useful for opacity rendering, but also provides useful ! information rather than just having zero density on sinks !---------------------------------------------------------------------- subroutine set_sink_density(i1,i2,ih,ipmass,irho,dat) integer, intent(in) :: i1,i2,ih,ipmass,irho real, intent(inout) :: dat(:,:) integer :: i if (ih > 0 .and. ipmass > 0 .and. irho > 0) then do i=i1,i2 if (dat(i,ih) > 0.) dat(i,irho) = dat(i,ipmass)/dat(i,ih)**3 enddo endif end subroutine set_sink_density !---------------------------------------------------------------------- ! Map sink particle data to splash columns !---------------------------------------------------------------------- integer function map_sink_property_to_column(k,ilocvx,ncolmax) result(iloc) use labels, only:ix,ipmass,ih,ivx integer, intent(in) :: k,ilocvx,ncolmax select case(k) case(1:3) iloc = ix(k) case(4) iloc = ipmass case(5) iloc = ih case default if (k >= ilocvx .and. k < ilocvx+3 .and. ivx > 0) then iloc = ivx + k-ilocvx ! put velocity into correct arrays else iloc = 0 endif end select if (iloc > ncolmax) iloc = 0 ! error occurred end function map_sink_property_to_column !------------------------------------------------------------ ! sanity check of the particle type accounting !------------------------------------------------------------ subroutine check_iphase_matches_npartoftype(i1,i2,iphase,npartoftypei,phantomdump) use labels, only:labeltype use params, only:int1 integer, intent(in) :: i1,i2 integer(kind=int1), intent(in) :: iphase(i1:i2) integer, intent(inout) :: npartoftypei(:) logical, intent(in) :: phantomdump integer :: npartoftype_new(size(npartoftypei)) integer :: k,itype npartoftype_new(:) = 0 do k=i1,i2 if (phantomdump) then itype = itypemap_phantom(iphase(k)) else itype = itypemap_sphNG(iphase(k)) endif npartoftype_new(itype) = npartoftype_new(itype) + 1 enddo do k=1,size(npartoftypei) if (npartoftype_new(k) /= npartoftypei(k)) then print*,' WARNING: got ',npartoftype_new(k),& trim(labeltype(k))//' particles, expecting ',npartoftypei(k) npartoftypei(k) = npartoftype_new(k) endif enddo end subroutine check_iphase_matches_npartoftype !------------------------------------------------------------ ! allocate and reallocate the iphase array as needed !------------------------------------------------------------ subroutine allocate_iphase(iphase,nmax,phantomdump,gotbinary,nlocbinary) integer*1, allocatable, intent(inout) :: iphase(:) integer, intent(in) :: nmax,nlocbinary logical, intent(in) :: phantomdump,gotbinary integer*1, allocatable :: iphase_old(:) integer :: ncopy if (allocated(iphase)) then iphase_old = iphase ! allocates memory for iphase_old as well deallocate(iphase) endif allocate(iphase(nmax)) if (phantomdump) then iphase(:) = 1 else iphase(:) = 0 endif if (gotbinary) then iphase(nlocbinary) = -3 iphase(nlocbinary+1) = -3 endif if (allocated(iphase_old)) then ncopy = min(size(iphase_old),size(iphase)) iphase(1:ncopy) = iphase_old(1:ncopy) deallocate(iphase_old) endif end subroutine allocate_iphase end module sphNGread !---------------------------------------------------------------------- ! Module for read_data_sphNG and set_labels_sphNG routines !---------------------------------------------------------------------- module readdata_sphNG implicit none public :: read_data_sphNG, set_labels_sphNG, file_format_is_sphNG private contains !---------------------------------------------------------------------- ! Main read_data_sphNG routine for splash !---------------------------------------------------------------------- subroutine read_data_sphNG(rootname,indexstart,iposn,nstepsread) use particle_data, only:dat,gamma,time,headervals,& iamtype,npartoftype,maxpart,maxstep,maxcol,masstype !use params, only:int1,int8 use settings_data, only:ndim,ndimV,ncolumns,ncalc,required,ipartialread,& lowmemorymode,ntypes,iverbose,ndusttypes use mem_allocation, only:alloc use system_utils, only:lenvironment,renvironment use labels, only:ipmass,irho,ih,ix,ivx,labeltype,print_types,headertags,& iutherm,itemp,ikappa,irhorestframe,labelreq,nreq use calcquantities, only:calc_quantities use asciiutils, only:make_tags_unique,match_tag use sphNGread use lightcurve_utils, only:get_temp_from_u,ionisation_fraction,get_opacity use read_kepler, only:check_for_composition_file,read_kepler_composition use byteswap, only:bs integer, intent(in) :: indexstart,iposn integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,k,ierr,iunit integer :: intg1,int2,int3,ilocvx,iversion integer :: i1,iarr,i2,iptmass1,iptmass2 integer :: npart_max,nstep_max,ncolstep,icolumn,idustarr,nptmasstot integer :: narrsizes integer :: nskip,ntotal,npart,n1,ngas,nreals integer :: iblock,nblocks,ntotblock,ncolcopy integer :: ipos,nptmass,nptmassi,ndust,nstar,nunknown,ilastrequired integer :: imaxcolumnread,nhydroarraysinfile,nhdr,nkilled integer :: itype,iphaseminthistype,iphasemaxthistype,nthistype,iloc,idenscol integer :: icentre,icomp_col_start,ncomp integer, dimension(maxparttypes) :: npartoftypei real, dimension(maxparttypes) :: massoftypei logical :: iexist, doubleprec,imadepmasscolumn,gotbinary,gotiphase character(len=len(rootname)+10) :: dumpfile,compfile character(len=100) :: fileident integer*8, dimension(maxarrsizes) :: isize integer, dimension(maxarrsizes) :: nint,nint1,nint2,nint4,nint8,nreal,nreal4,nreal8 integer*1, dimension(:), allocatable :: iphase,level integer, dimension(:), allocatable :: listpm real(doub_prec), dimension(:), allocatable :: dattemp real*4, dimension(:), allocatable :: dattempsingle,massfac real(doub_prec) :: r8,unit_dens,unit_ergg real(sing_prec) :: r4 real, dimension(:,:), allocatable :: dattemp2 real, dimension(maxinblock) :: dummyreal real :: hfact,omega real(doub_prec) :: Xfrac,Yfrac real :: xHIi,xHIIi,xHeIi,xHeIIi,xHeIIIi,nei logical :: skip_corrupted_block_3,get_temperature,get_kappa,get_kappa_tot logical :: get_ionfrac,need_to_allocate_iphase,got_tag character(len=lentag) :: tagsreal(maxinblock), tagtmp integer, parameter :: splash_max_iversion = 1 real, parameter :: Xfrac_default=0.69843,Yfrac_default=0.28731 nstepsread = 0 nstep_max = 0 npart_max = maxpart npart = 0 iunit = 15 ipmass = 4 idivvcol = 0 idivvxcol = 0 icurlvxcol = 0 icurlvycol = 0 icurlvzcol = 0 iHIIcol = 0 iHeIIcol = 0 iHeIIIcol = 0 nhydroreal4 = 0 umass = 1.d0 utime = 1.d0 udist = 1.d0 umagfd = 1.d0 istartmhd = 0 istartrt = 0 istart_extra_real4 = 100 nmhd = 0 igotmass = .false. tfreefall = 1.d0 gotbinary = .false. gotiphase = .false. skip_corrupted_block_3 = .false. dumpfile = trim(rootname) ! !--check if data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 j = indexstart nstepsread = 0 doubleprec = .true. get_temperature = lenvironment("SPLASH_GET_TEMP") get_kappa_tot = lenvironment("SPLASH_GET_KAPPATOT") get_kappa = lenvironment("SPLASH_GET_KAPPA") .or. get_kappa_tot get_ionfrac = lenvironment("SPLASH_GET_ION") if ((get_temperature .or. get_kappa) .and. itempcol > 0 .and. required(itempcol)) then required(irho) = .true. required(irhorestframe) = .true. required(iutherm) = .true. endif if (get_ionfrac .or. get_kappa) then required(irho) = .true. required(itemp) = .true. Xfrac = renvironment("SPLASH_XFRAC",Xfrac_default) Yfrac = renvironment("SPLASH_YFRAC",Yfrac_default) if ( Xfrac < 0. .or. Xfrac > 1.) then Xfrac = Xfrac_default print "(1x,a,f5.3)",'ERROR: Input Xfrac is not between 0 and 1, using default value of ',Xfrac endif if ( Yfrac < 0. .or. Yfrac > 1.) then Yfrac = Yfrac_default print "(1x,a,f5.3)",'ERROR: Input Yfrac is not between 0 and 1, using default value of ',Yfrac endif if ( Xfrac + Yfrac > 1.) then print "(1x,a,f5.3,a,f5.3,a,f5.3)",'ERROR: Xfrac + Yfrac = ',Xfrac+Yfrac,' exceeds 1. Using default values of Xfrac = ',& Xfrac_default,' and Yfrac = ',Yfrac_default Xfrac = Xfrac_default Yfrac = Yfrac_default endif endif ilastrequired = 0 do i=1,size(required)-1 if (required(i)) ilastrequired = i enddo if (iverbose >= 1) print "(1x,a)",'reading sphNG format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) debug = lenvironment('SSPLASH_DEBUG') if (debug) iverbose = 1 ! !--open the (unformatted) binary file ! open(unit=iunit,iostat=ierr,file=dumpfile,status='old',form='unformatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return else ! !--read header key to work out precision ! doubleprec = .true. read(iunit,iostat=ierr) intg1,r8,int2,iversion,int3 if (intg1 /= 690706 .and. intg1 /= 060769) then if (bs(intg1)==690706 .or. bs(intg1)==060769) then print "(a)",'*** ERROR: file is wrong endian, try:' print "(/,4x,a,/,/,6x,a,/)",'export GFORTRAN_CONVERT_UNIT=big_endian','or, with ifort:' print "(4x,a)",'export F_UFMTENDIAN=big' close(iunit) return else print "(a)",'*** ERROR READING HEADER: corrupt file/zero size/wrong endian?' close(iunit) return endif endif if (int2 /= 780806 .and. int2 /= 060878) then if (iverbose >= 2) print "(a)",' single precision dump' rewind(iunit) read(iunit,iostat=ierr) intg1,r4,int2,iversion,int3 if (int2 /= 780806 .and. int2 /= 060878) then print "(a)",'ERROR determining single/double precision in file header' endif doubleprec = .false. elseif (int3 /= 690706) then print*,' got ',intg1,r4,int2,iversion,int3 print "(a)",'*** WARNING: default int appears to be int*8: not implemented' else if (debug) print "(a)",' double precision dump' ! no need to print this endif if (iversion==690706) then ! handle old-format files (without version number) gracefully iversion = 0 endif endif if (iversion > splash_max_iversion) then print "(/a,i2,/,a,i2)",& ' *** WARNING: this copy of splash can only read version ',splash_max_iversion, & ' but the file format version is ',iversion if (.not.lenvironment('SSPLASH_IGNORE_IVERSION')) then print "(2(/,a))",' ** press any key to bravely proceed anyway ** ', & ' (set SSPLASH_IGNORE_IVERSION=yes to silence this warning)' read* endif endif ! !--read file ID ! read(iunit,iostat=ierr) fileident if (ierr /=0) then print "(a)",'*** ERROR READING FILE ID ***' close(iunit) return else if (iverbose >= 0) print "(1x,a)",trim(fileident) endif mhddump = .false. rtdump = .false. call get_options_from_fileident(fileident,smalldump,tagged,phantomdump,& usingvecp,usingeulr,cleaning,h2chem,rt_in_header,batcode) if (tagged .and. iversion < 1) print "(a)",'ERROR: got tagged format but iversion is ',iversion ! !--read variables from header ! call read_header(iunit,iverbose,debug,doubleprec, & npart,npartoftypei,n1,ntypes,nblocks,narrsizes,dummyreal,tagsreal,nreals,ierr) if (ierr /= 0) then print "(a)",' *** ERROR READING HEADER ***' close(iunit) return endif ! !--Attempt to read all MPI blocks ! ntotal = 0 ntotblock = 0 nptmasstot = 0 i2 = 0 iptmass2 = 0 igotmass = .true. imadepmasscolumn = .false. massoftypei(:) = 0. nkilled = 0 over_MPIblocks: do iblock=1,nblocks ! !--read array header from this block ! if (iblock==1) ncolstep = 0 do iarr=1,narrsizes call read_block_header(iunit,iblock,iarr,iverbose,debug, & isize,nint(iarr),nint1(iarr),nint2(iarr),nint4(iarr),nint8(iarr),& nreal(iarr),nreal4(iarr),nreal8(iarr),& ntotblock,npart,ntotal,nptmasstot,ncolstep,ierr) if (ierr /= 0) then print "(a)",' *** ERROR READING ARRAY SIZES ***' close(iunit) return endif enddo if (debug) print*,'DEBUG: ncolstep=',ncolstep,' from file header, also nptmasstot = ',nptmasstot ! !--this is a bug fix for a corrupt version of wdump outputting bad ! small dump files ! if (smalldump .and. nreal(1)==5 .and. iblock==1 .and. lenvironment('SSPLASH_FIX_CORRUPT')) then print*,'FIXING CORRUPT HEADER ON SMALL DUMPS: assuming nreal=3 not 5' nreal(1) = 3 ncolstep = ncolstep - 2 endif npart_max = maxval(isize(1:narrsizes)) npart_max = max(npart_max,npart+nptmasstot,ntotal) ! !--work out from array header how many columns we are going to read ! in order to allocate memory ! if (iblock==1) then igotmass = .true. if (smalldump .or. phantomdump) then if (phantomdump) then if (tagged) then call extract('massoftype',massoftypei(1:ntypes),dummyreal,tagsreal,nreals,ierr) else ! old phantom dumps had only 5 types call extract('massoftype',massoftypei(1:5),dummyreal,tagsreal,nreals,ierr) endif else call extract('pmassinitial',massoftypei(1),dummyreal,tagsreal,nreals,ierr) if (ierr /= 0) then print "(a)",' error extracting particle mass from small dump file' massoftypei(1) = 0. igotmass = .false. endif endif if (debug) print*,'DEBUG: got massoftype(gas) = ',massoftypei(1) if (any(massoftypei(1:ntypes) > tiny(0.)) .and. .not.lowmemorymode) then ncolstep = ncolstep + 1 ! make an extra column to contain particle mass imadepmasscolumn = .true. elseif (lowmemorymode) then igotmass = .false. else igotmass = .false. endif if (all(abs(massoftypei(1:ntypes)) < tiny(0.)) .and. nreal(1) < 4) then print "(a)",' error: particle masses not present in small dump file' igotmass = .false. endif endif if (debug) print*,'DEBUG: gotmass = ',igotmass, ' ncolstep = ',ncolstep ! !-- to handle both small and full dumps, we need to place the quantities dumped ! in both small and full dumps at the start of the dat array ! quantities only in the full dump then come after ! also means that hydro/MHD are "semi-compatible" in the sense that x,y,z,m,h ! and rho are in the same place for both types of dump ! ix(1) = 1 ix(2) = 2 ix(3) = 3 if (igotmass) then ipmass = 4 ih = 5 irho = 6 nhydroarrays = 6 ! x,y,z,m,h,rho else ipmass = 0 ih = 4 irho = 5 nhydroarrays = 5 ! x,y,z,h,rho endif nhydroarraysinfile = nreal(1) + nreal4(1) + nreal8(1) nhydroreal4 = nreal4(1) if (imadepmasscolumn) nhydroarraysinfile = nhydroarraysinfile + 1 if (nhydroarraysinfile < nhydroarrays .and. .not.phantomdump) then print "(a)",' ERROR: one of x,y,z,m,h or rho missing in small dump read' nhydroarrays = nreal(1)+nreal4(1)+nreal8(1) elseif (phantomdump .and. (nreal(1) < 3 .or. nreal4(1) < 1)) then print "(a)",' ERROR: x,y,z or h missing in phantom read' endif ndustarrays = ndusttypes if (debug) print*,' DEBUG: ndustarrays = ',ndustarrays if (narrsizes >= 4) then nmhdarrays = 3 ! Bx,By,Bz nmhd = nreal(4) + nreal4(4) + nreal8(4) - nmhdarrays ! how many "extra" mhd arrays if (debug) print*,'DEBUG: ',nmhd,' extra MHD arrays' else nmhdarrays = 0 endif !--radiative transfer dump? if (narrsizes >= 3 .and. isize(3)==isize(1)) rtdump = .true. !--mhd dump? if (narrsizes >= 4) mhddump = .true. if (.not.(mhddump.or.smalldump)) then ivx = nhydroarrays+ndustarrays+1 elseif (mhddump .and. .not.smalldump) then ivx = nhydroarrays+ndustarrays+nmhdarrays+1 else ivx = 0 endif !--need to force read of velocities e.g. for corotating frame subtraction if (any(required(ivx:ivx+ndimV-1))) required(ivx:ivx+ndimV-1) = .true. !--force read of h and rho if dustfrac is required if (ndustarrays > 0 .and. any(required(nhydroarrays+1:nhydroarrays+ndustarrays))) then if (debug) print*,' dustfrac in columns ',nhydroarrays+1,nhydroarrays+ndustarrays,' required = ',required(nhydroarrays+1) required(irho) = .true. required(ih) = .true. endif !--always read mass and h if density is needed, as rho is constructed from m and h if (required(irho)) then required(ipmass) = .true. required(ih) = .true. endif !--for phantom dumps, also make a column for density ! and divv, if a .divv file exists if (phantomdump) then ncolstep = ncolstep + 1 ! make extra columns in the same place every time if (maxcol==0) then ncolstepfirst = ncolstep ! save number of columns elseif (ncolstep < ncolstepfirst) then ncolstep = ncolstepfirst ! used saved number of columns endif inquire(file=trim(dumpfile)//'.divv',exist=iexist) if (iexist) then idivvxcol = ncolstep + 1 icurlvxcol = ncolstep + 2 icurlvycol = ncolstep + 3 icurlvzcol = ncolstep + 4 ncolstep = ncolstep + 4 endif if (get_temperature) then !add a column for the temperature ncolstep = ncolstep+1 itempcol = ncolstep endif if (get_kappa) then ncolstep = ncolstep+1 ikappa = ncolstep endif if (get_ionfrac) then iHIIcol = ncolstep + 1 iHeIIcol = ncolstep + 2 iHeIIIcol = ncolstep + 3 ncolstep = ncolstep + 3 endif call check_for_composition_file(trim(dumpfile),& npart,ncolstep,icomp_col_start,ncomp,tagarr,compfile) endif endif ! !--allocate memory now that we know the number of columns ! if (iblock==1) then ncolumns = ncolstep + ncalc if (ncolumns > maxplot) then print*,'ERROR with ncolumns = ',ncolumns,' in data read' return endif ilastrequired = 0 do i=1,ncolumns if (required(i)) ilastrequired = i enddo endif need_to_allocate_iphase = (npart_max > maxpart) .or. .not.allocated(iphase) if (npart_max > maxpart .or. j > maxstep .or. ncolumns > maxcol) then if (lowmemorymode) then call alloc(max(npart_max+2,maxpart),j,ilastrequired) else call alloc(max(npart_max+2,maxpart),j,ncolumns,mixedtypes=.true.) endif endif ! !--now that memory has been allocated, copy info from the header into ! the relevant arrays ! if (iblock==1) then call extract_variables_from_header(tagsreal,dummyreal,nreals,iverbose,debug, & gotbinary,nblocks,nptmasstot,npartoftypei,ntypes,& time(j),gamma(j),hfact,npart,ntotal,npartoftype(:,j),masstype(:,j), & dat(:,:,j),ix,ih,ipmass,ivx) nhdr = min(nreals,maxhdr) headervals(1:nhdr,j) = dummyreal(1:nhdr) headertags(1:nhdr) = tagsreal(1:nhdr) call set_grain_sizes(nhdr,headertags,headervals(:,j),udist) ! get grain sizes in cm call make_tags_unique(nhdr,headertags) if (iverbose > 0) call print_dustgrid_info(nhdr,headertags,headervals(:,j),masstype(1,j)*npartoftype(1,j)) nstepsread = nstepsread + 1 ! !--stop reading file here if no columns required ! if (ilastrequired==0) exit over_MPIblocks endif ! !--allocate memory for iphase array now that gotbinary is known ! if (need_to_allocate_iphase) call allocate_iphase(iphase,max(npart_max+2,maxpart),phantomdump,gotbinary,npart_max+1) ! !--Arrays ! imaxcolumnread = 0 icolumn = 0 idustarr = 0 istartmhd = 0 istartrt = 0 i1 = i2 + 1 i2 = i1 + isize(1) - 1 if (debug) then print "(1x,a10,i4,3(a,i12))",'MPI block ',iblock,': particles: ',i1,' to ',i2,' of ',npart elseif (nblocks > 1) then if (iblock==1) write(*,"(a,i1,a)",ADVANCE="no") ' reading MPI blocks: .' write(*,"('.')",ADVANCE="no") endif iptmass1 = iptmass2 + 1 iptmass2 = iptmass1 + isize(2) - 1 nptmass = nptmasstot if (nptmass > 0 .and. debug) print "(15x,3(a,i12))",' pt. masses: ',iptmass1,' to ',iptmass2,' of ',nptmass do iarr=1,narrsizes if (nreal(iarr) + nreal4(iarr) + nreal8(iarr) > 0) then if (iarr==4) then istartmhd = imaxcolumnread + 1 if (debug) print*,' istartmhd = ',istartmhd elseif (iarr==3 .and. rtdump) then istartrt = max(nhydroarrays+nmhdarrays+1,imaxcolumnread + 1) if (debug) print*,' istartrt = ',istartrt endif endif !--read iphase from array block 1 got_tag = .false. if (iarr==1) then !--skip default int nskip = nint(iarr) do i=1,nskip if (tagged) read(iunit,end=33,iostat=ierr) ! skip tags read(iunit,end=33,iostat=ierr) enddo if (nint1(iarr) < 1) then if (.not.phantomdump .or. any(npartoftypei(2:) > 0)) then if (iverbose > 0) print "(a)",' WARNING: can''t locate iphase in dump' elseif (phantomdump) then if (iverbose > 0) print "(a)",' WARNING: can''t locate iphase in dump' endif gotiphase = .false. !--skip remaining integer arrays nskip = nint1(iarr) + nint2(iarr) + nint4(iarr) + nint8(iarr) else if (tagged) read(iunit,end=33,iostat=ierr) tagtmp select case(tagtmp) case('iphase','itype') gotiphase = .true. read(iunit,end=33,iostat=ierr) iphase(i1:i2) !--skip remaining integer arrays nskip = nint1(iarr) - 1 + nint2(iarr) + nint4(iarr) + nint8(iarr) case default got_tag = .true. ! needed because we already read the tag !--skip all integer arrays nskip = nint1(iarr) + nint2(iarr) + nint4(iarr) + nint8(iarr) end select endif elseif (smalldump .and. iarr==2 .and. isize(iarr) > 0 .and. .not.phantomdump) then !--read listpm from array block 2 for small dumps (needed here to extract sink masses) if (allocated(listpm)) deallocate(listpm) allocate(listpm(isize(iarr))) if (nint(iarr) < 1) then print "(a)",'ERROR: can''t locate listpm in dump' nskip = nint(iarr) + nint1(iarr) + nint2(iarr) + nint4(iarr) + nint8(iarr) else if (tagged) read(iunit,end=33,iostat=ierr) ! skip tags read(iunit,end=33,iostat=ierr) listpm(1:isize(iarr)) nskip = nint(iarr) - 1 + nint1(iarr) + nint2(iarr) + nint4(iarr) + nint8(iarr) endif else !--otherwise skip all integer arrays (not needed for plotting) nskip = nint(iarr) + nint1(iarr) + nint2(iarr) + nint4(iarr) + nint8(iarr) endif if (iarr==3 .and. lenvironment('SSPLASH_BEN_HACKED')) then nskip = nskip - 1 print*,' FIXING HACKED DUMP FILE' endif !print*,'skipping ',nskip do i=1,nskip if (tagged .and. .not.got_tag) read(iunit,end=33,iostat=ierr) tagtmp ! read tag, unless already read got_tag = .false. ! must reset this flag otherwise get corrupted read ! ! read the Adaptive Particle Refinement level array ! in order to correctly set particle masses, if present ! select case(tagtmp) case('apr_level') allocate(level(isize(iarr)),massfac(isize(iarr))) read(iunit,end=33,iostat=ierr) level ! m = m/2**(level-1) massfac(1:isize(iarr)) = 1./2**(level(1:isize(iarr))-1) if (iblock==1) print "(a,i2)",' :: '//trim(tagtmp)//' max level = ',maxval(level) deallocate(level) case default read(iunit,end=33,iostat=ierr) end select enddo ! !--real arrays ! if (iarr==2) then !--read sink particles from phantom dumps if (phantomdump .and. iarr==2 .and. isize(iarr) > 0) then if (nreal(iarr) < 5) then print "(a)",'ERROR: not enough arrays written for sink particles in phantom dump' nskip = nreal(iarr) else if (debug) print*,'DEBUG: denoting ',npart,'->',npart+isize(iarr),' as sink particles' iphase(npart+1:npart+isize(iarr)) = -3 ilocvx = nreal(iarr)-2 ! velocity is always last 3 numbers for phantom sinks if (doubleprec) then !--convert default real to single precision where necessary if (debug) print*,'DEBUG: reading sink data, converting from double precision ',isize(iarr) if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(isize(iarr)),stat=ierr) if (ierr /= 0) then print "(a)",'ERROR in memory allocation' return endif tagtmp = '' do k=1,nreal(iarr) if (tagged) read(iunit,end=33,iostat=ierr) tagtmp if (debug) print*,'DEBUG: reading sink array ',k,isize(iarr),' tag = ',trim(tagtmp) read(iunit,end=33,iostat=ierr) dattemp(1:isize(iarr)) if (ierr /= 0) print*,' ERROR during read of sink particle data, array ',k iloc = map_sink_property_to_column(k,ilocvx,size(dat(1,:,j))) if (iloc > 0) then do i=1,isize(iarr) dat(npart+i,iloc,j) = real(dattemp(i)) enddo elseif (trim(tagtmp)=='hsoft' .and. ih > 0) then do i=1,isize(iarr) if (abs(dat(npart+i,ih,j)) < tiny(0.)) then dat(npart+i,ih,j) = real(dattemp(i)) if (i == 1) print*,'zero accretion radius: taking sink particle radius from softening length' endif enddo else if (debug) print*,'DEBUG: skipping sink particle array ',k endif enddo else if (debug) print*,'DEBUG: reading sink data, converting from single precision ',isize(iarr) if (allocated(dattempsingle)) deallocate(dattempsingle) allocate(dattempsingle(isize(iarr)),stat=ierr) if (ierr /= 0) then print "(a)",'ERROR in memory allocation' return endif do k=1,nreal(iarr) if (tagged) read(iunit,end=33,iostat=ierr) tagtmp if (debug) print*,'DEBUG: reading sink array ',k,isize(iarr),' tag = ',trim(tagtmp) read(iunit,end=33,iostat=ierr) dattempsingle(1:isize(iarr)) if (ierr /= 0) print*,' ERROR during read of sink particle data, array ',k iloc = map_sink_property_to_column(k,ilocvx,size(dat(1,:,j))) if (iloc > 0) then do i=1,isize(iarr) dat(npart+i,iloc,j) = real(dattempsingle(i)) enddo elseif (trim(tagtmp)=='hsoft' .and. ih > 0) then do i=1,isize(iarr) if (abs(dat(npart+i,ih,j)) < tiny(0.)) then dat(npart+i,ih,j) = real(dattempsingle(i)) if (i == 1) print*,'zero accretion radius: taking sink particle radius from softening length' endif enddo else if (debug) print*,'DEBUG: skipping sink particle array ',k endif enddo endif ! PSEUDO-remove accreted sinks call set_sink_merged(npart+1,int(npart+isize(iarr)),ih,ipmass,dat(:,:,j)) ! DEFINE density on sink particles (needed for opacity rendering) if (required(irho)) call set_sink_density(npart+1,int(npart+isize(iarr)),ih,ipmass,irho,dat(:,:,j)) npart = npart + isize(iarr) endif elseif (smalldump .and. iarr==2 .and. allocated(listpm)) then !--for sphNG, read sink particle masses from block 2 for small dumps if (nreal(iarr) < 1) then if (isize(iarr) > 0) print "(a)",'ERROR: sink masses not present in small dump' nskip = nreal(iarr) + nreal4(iarr) + nreal8(iarr) else if (doubleprec) then !--convert default real to single precision where necessary if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(isize(iarr)),stat=ierr) if (ierr /=0) print "(a)",'ERROR in memory allocation' if (tagged) read(iunit,end=33,iostat=ierr) ! skip tags read(iunit,end=33,iostat=ierr) dattemp(1:isize(iarr)) if (nptmass /= isize(iarr)) print "(a)",'ERROR: nptmass /= block size' if (ipmass > 0) then do i=1,isize(iarr) dat(listpm(iptmass1+i-1),ipmass,j) = real(dattemp(i)) enddo else print*,'WARNING: sink particle masses not read because no mass array allocated' endif else !--convert default real to double precision where necessary if (allocated(dattempsingle)) deallocate(dattempsingle) allocate(dattempsingle(isize(iarr)),stat=ierr) if (ierr /=0) print "(a)",'ERROR in memory allocation' if (tagged) read(iunit,end=33,iostat=ierr) ! skip tags read(iunit,end=33,iostat=ierr) dattempsingle(1:isize(iarr)) if (nptmass /= isize(iarr)) print "(a)",'ERROR: nptmass /= block size' if (ipmass > 0) then do i=1,isize(iarr) dat(listpm(iptmass1+i-1),ipmass,j) = real(dattempsingle(i)) enddo else print*,'WARNING: sink particle masses not read because no mass array allocated' endif endif nskip = nreal(iarr) - 1 + nreal4(iarr) + nreal8(iarr) endif else !--for other blocks, skip real arrays if size different nskip = nreal(iarr) + nreal4(iarr) + nreal8(iarr) endif do i=1,nskip if (tagged) read(iunit,end=33,iostat=ierr) ! skip tags read(iunit,end=33,iostat=ierr) enddo ! deallocate dattempsingle if (allocated(dattempsingle)) deallocate(dattempsingle) elseif (isize(iarr)==isize(1)) then ! !--read all real arrays defined on all the particles (same size arrays as block 1) ! if ((doubleprec.and.nreal(iarr) > 0).or.nreal8(iarr) > 0) then if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(isize(iarr)),stat=ierr) if (ierr /=0) print "(a)",'ERROR in memory allocation (read_data_sphNG: dattemp)' elseif (nreal(iarr) > 0 .or. nreal8(iarr) > 0) then if (allocated(dattempsingle)) deallocate(dattempsingle) allocate(dattempsingle(isize(iarr)),stat=ierr) if (ierr /=0) print "(a)",'ERROR in memory allocation (read_data_sphNG: dattempsingle)' endif ! default reals may need converting do i=1,nreal(iarr) tagtmp = '' if (tagged) read(iunit,end=33,iostat=ierr) tagtmp icolumn = assign_column(tagtmp,iarr,i,6,imaxcolumnread,idustarr,ncolstep) if (tagged) tagarr(icolumn) = tagtmp ! force data read if label matches one of the required columns if (.not.required(icolumn)) then if (match_tag(labelreq(1:nreq),tagtmp) > 0) then print "(1x,a,i2)",'-> found '//trim(tagtmp)//' in column ',icolumn required(icolumn) = .true. endif endif if (debug) print*,' reading real to col:',icolumn,' tag = ',trim(tagtmp), ' required = ',required(icolumn) if (required(icolumn)) then if (doubleprec) then read(iunit,end=33,iostat=ierr) dattemp(1:isize(iarr)) dat(i1:i2,icolumn,j) = real(dattemp(1:isize(iarr))) else read(iunit,end=33,iostat=ierr) dattempsingle(1:isize(iarr)) dat(i1:i2,icolumn,j) = real(dattempsingle(1:isize(iarr))) endif else read(iunit,end=33,iostat=ierr) endif enddo ! ! set masses for equal mass particles (not dumped in small dump or in phantom) ! if (((smalldump.and.nreal(1) < ipmass).or.phantomdump).and. iarr==1) then if (any(abs(masstype(:,j)) > tiny(masstype))) then icolumn = ipmass if (required(ipmass) .and. ipmass > 0) then if (phantomdump) then dat(i1:i2,ipmass,j) = masstype(itypemap_phantom(iphase(i1:i2)),j) if (allocated(massfac)) then dat(i1:i2,ipmass,j) = dat(i1:i2,ipmass,j)*massfac(1:isize(iarr)) deallocate(massfac) endif else where (iphase(i1:i2)==0) dat(i1:i2,icolumn,j) = masstype(1,j) endif endif !--dust mass for phantom particles if (phantomdump .and. npartoftypei(itypemap_dust_phantom) > 0 .and. ipmass > 0) then print*,'dust particle mass = ',masstype(itypemap_dust_phantom,j),& ' ratio m_dust/m_gas = ',masstype(itypemap_dust_phantom,j)/masstype(1,j) endif if (debug) print*,'mass ',icolumn elseif (phantomdump .and. npartoftypei(1) > 0) then print*,' ERROR: particle mass zero in Phantom dump file!' endif endif ! ! real4 arrays (may need converting if splash is compiled in double precision) ! if (nreal4(iarr) > 0 .and. kind(dat)==doub_prec) then if (allocated(dattempsingle)) deallocate(dattempsingle) allocate(dattempsingle(isize(iarr)),stat=ierr) if (ierr /=0) print "(a)",'ERROR in memory allocation (read_data_sphNG: dattempsingle)' endif if (debug) print*,'DEBUG: SIZE of dattempsingle',size(dattempsingle) ! real4s may need converting imaxcolumnread = max(imaxcolumnread,icolumn) if ((nreal(iarr)+nreal4(iarr)) > 6) imaxcolumnread = max(imaxcolumnread,6) do i=1,nreal4(iarr) tagtmp = '' if (tagged) read(iunit,end=33,iostat=ierr) tagtmp icolumn = assign_column(tagtmp,iarr,i,4,imaxcolumnread,idustarr,ncolstep) if (debug) print*,'reading real4 to col:',icolumn,' tag = ',trim(tagtmp),' required = ',required(icolumn) if (tagged) tagarr(icolumn) = tagtmp if (phantomdump .and. icolumn==ih) required(ih) = .true. ! h always required for density if (required(icolumn)) then if (allocated(dattempsingle)) then read(iunit,end=33,iostat=ierr) dattempsingle(1:isize(iarr)) dat(i1:i2,icolumn,j) = real(dattempsingle(1:isize(iarr))) else read(iunit,end=33,iostat=ierr) dat(i1:i2,icolumn,j) endif else read(iunit,end=33,iostat=ierr) endif !--construct density for phantom dumps based on h, hfact and particle mass if (phantomdump .and. icolumn==ih) then icolumn = irho ! density call get_rho_from_h(i1,i2,ih,ipmass,irho,required,npartoftype(:,j),& masstype(:,j),hfact,dat(:,:,j),iphase,nkilled) endif enddo ! real 8's need converting do i=1,nreal8(iarr) tagtmp = '' if (tagged) read(iunit,end=33,iostat=ierr) tagtmp icolumn = assign_column(tagtmp,iarr,i,8,imaxcolumnread,idustarr,ncolstep) if (debug) print*,'reading real8 to col:',icolumn,' tag = ',trim(tagtmp),' required = ',required(icolumn) if (tagged) tagarr(icolumn) = tagtmp if (required(icolumn)) then read(iunit,end=33,iostat=ierr) dattemp(1:isize(iarr)) dat(i1:i2,icolumn,j) = real(dattemp(1:isize(iarr))) else read(iunit,end=33,iostat=ierr) endif enddo endif enddo ! over array sizes enddo over_MPIblocks ! !--reached end of file (during data read) ! goto 34 33 continue print "(/,1x,a,/)",'*** WARNING: END OF FILE DURING READ ***' print*,'Press any key to continue (but there is likely something wrong with the file...)' read* 34 continue call set_labels_sphNG ! !--emit warning if we find particles with h = 0 ! if (nkilled > 0) print*,'WARNING: got ',nkilled,' dead (not accreted) particles, should not happen' ! !--read .divv file for phantom dumps ! if (phantomdump .and. idivvxcol /= 0 .and. any(required(idivvxcol:icurlvzcol))) then print "(a)",' reading divv from '//trim(dumpfile)//'.divv' open(unit=66,file=trim(dumpfile)//'.divv',form='unformatted',status='old',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(dumpfile)//'.divv' else read(66,iostat=ierr) dat(1:ntotal,idivvxcol,j) if (ierr /= 0) print "(a)",' WARNING: ERRORS reading divv from file' if (any(required(icurlvxcol:icurlvzcol))) then read(66,iostat=ierr) dat(1:ntotal,icurlvxcol,j) read(66,iostat=ierr) dat(1:ntotal,icurlvycol,j) read(66,iostat=ierr) dat(1:ntotal,icurlvzcol,j) endif if (ierr /= 0) print "(a)",' WARNING: ERRORS reading curlv from file' close(66) endif endif if (icomp_col_start > 0 .and. any(required(icomp_col_start:icomp_col_start+ncomp))) then call read_kepler_composition(compfile,ntotal,dat(:,:,j),icomp_col_start,ncomp) endif ! !--calculate the temperature from density and internal energy (using physical units) ! unit_dens = umass/(udist**3) ! !--use primitive density for relativistic code ! idenscol = irho if (irhorestframe > 0) idenscol = irhorestframe if (get_temperature .and. itempcol > 0 .and. required(itempcol)) then unit_ergg = (udist/utime)**2 dat(1:ntotal,itempcol,j) = get_temp_from_u(dat(1:ntotal,idenscol,j)*unit_dens,dat(1:ntotal,iutherm,j)*unit_ergg) !irho = density endif if (get_kappa .and. ikappa > 0 .and. required(ikappa) .and. itemp > 0) then write(*,"(1x,a,3(f5.2,1x))",advance='no') 'X,Y,Z = ',Xfrac,Yfrac,1.-Xfrac-Yfrac if (get_kappa_tot) then write(*,*) ' (opacity uses electron scattering, Kramers and H-)' else write(*,*) ' (electron scattering opacity only)' endif dat(1:ntotal,ikappa,j) = get_opacity(dat(1:ntotal,idenscol,j)*unit_dens,& dat(1:ntotal,itemp,j)*1.d0,Xfrac,Yfrac,get_kappa_tot) endif if (get_ionfrac .and. iHIIcol > 0 .and. iHeIIcol > 0 .and. iHeIIIcol > 0& .and. any(required(iHIIcol:iHeIIIcol))) then do i=1,ntotal call ionisation_fraction(real(dat(i,idenscol,j)*unit_dens),dat(i,itemp,j),& real(Xfrac),real(Yfrac),xHIi,xHIIi,xHeIi,xHeIIi,xHeIIIi,nei) dat(i,iHIIcol,j)=xHIIi dat(i,iHeIIcol,j)=xHeIIi dat(i,iHeIIIcol,j)=xHeIIIi enddo endif ! !--reset centre of mass to zero if environment variable "SSPLASH_RESET_CM" is set, ! or reset centre to densest clump if environment variable "SSPLASH_RESET_DENSE" is set ! the latter will override the former ! (updated from n1 to npart since order is not preserved when dumping data; JHW) icentre = 0 if (lenvironment('SSPLASH_RESET_CM')) icentre = 1 if (lenvironment('SSPLASH_RESET_DENSE')) icentre = 2 if (allocated(dat) .and. npart > 0 .and. npart <= size(dat(:,1,1)) .and. icentre > 0 .and. allocated(iphase)) then call reset_centre_of_mass(dat(1:npart,1:3,j),dat(1:npart,4,j),dat(1:npart,5,j),iphase(1:npart),npart,icentre) endif ! !--reset corotating frame velocities if environment variable "SSPLASH_OMEGA" is set ! if (allocated(dat) .and. n1 > 0 .and. all(required(1:2))) then omega = renvironment('SSPLASH_OMEGAT') if (abs(omega) > tiny(omega) .and. ndim >= 2) then call reset_corotating_positions(n1,dat(1:n1,1:2,j),omega,time(j)) endif if (.not. smalldump) then if (abs(omega) < tiny(omega)) omega = renvironment('SSPLASH_OMEGA') if (abs(omega) > tiny(omega) .and. ivx > 0) then if (.not.all(required(1:2)) .or. .not.all(required(ivx:ivx+1))) then print*,' ERROR subtracting corotating frame with partial data read' else call reset_corotating_velocities(n1,dat(1:n1,1:2,j),dat(1:n1,ivx:ivx+1,j),omega) endif endif endif endif !--set flag to indicate that only part of this file has been read if (.not.all(required(1:ncolstep))) ipartialread = .true. nptmassi = 0 nunknown = 0 ngas = 0 ndust = 0 nstar = 0 !--can only do this loop if we have read the iphase array iphasealloc: if (allocated(iphase)) then ! !--sanity check the iphase array ! if (gotiphase) call check_iphase_matches_npartoftype(1,npart,iphase,npartoftype(:,j),phantomdump) ! !--translate iphase into particle types (mixed type storage) ! if (size(iamtype(:,j)) > 1) then if (phantomdump) then ! !--phantom: translate iphase to splash types ! do i=1,npart itype = itypemap_phantom(iphase(i)) iamtype(i,j) = itype if (ih > 0 .and. required(ih)) then if (dat(i,ih,j) <= 0. .and. itype /= itypemap_sink_phantom) iamtype(i,j) = itypemap_unknown_phantom endif enddo else ! !--sphNG: translate iphase to splash types ! do i=1,npart itype = itypemap_sphNG(iphase(i)) iamtype(i,j) = itype select case(itype) case(1) ngas = ngas + 1 case(2) ndust = ndust + 1 case(4) nptmassi = nptmassi + 1 case(5) nstar = nstar + 1 case default nunknown = nunknown + 1 end select enddo do i=npart+1,ntotal iamtype(i,j) = 2 enddo endif !print*,'mixed types: ngas = ',ngas,nptmassi,nunknown elseif (any(iphase(1:ntotal) /= 0)) then if (phantomdump) then print*,'ERROR: low memory mode will not work correctly with phantom + multiple types' print*,'press any key to ignore this and continue anyway (at your own risk...)' read* endif ! !--place point masses after normal particles ! if not storing the iamtype array ! print "(a)",' sorting particles by type...' nunknown = 0 do i=1,npart if (iphase(i) /= 0) nunknown = nunknown + 1 enddo ncolcopy = min(ncolstep,maxcol) allocate(dattemp2(nunknown,ncolcopy)) iphaseminthistype = 0 ! to avoid compiler warnings iphasemaxthistype = 0 do itype=1,3 nthistype = 0 ipos = 0 select case(itype) case(1) ! ptmass iphaseminthistype = 1 iphasemaxthistype = 9 case(2) ! star iphaseminthistype = 10 iphasemaxthistype = huge(iphasemaxthistype) case(3) ! unknown iphaseminthistype = -huge(iphaseminthistype) iphasemaxthistype = -1 end select do i=1,ntotal ipos = ipos + 1 if (iphase(i) >= iphaseminthistype .and. iphase(i) <= iphasemaxthistype) then nthistype = nthistype + 1 !--save point mass information in temporary array if (nptmassi > size(dattemp2(:,1))) stop 'error: ptmass array bounds exceeded in data read' dattemp2(nthistype,1:ncolcopy) = dat(i,1:ncolcopy,j) ! print*,i,' removed', dat(i,1:3,j) ipos = ipos - 1 endif !--shuffle dat array if (ipos /= i .and. i < ntotal) then ! print*,'copying ',i+1,'->',ipos+1 dat(ipos+1,1:ncolcopy,j) = dat(i+1,1:ncolcopy,j) !--must also shuffle iphase (to be correct for other types) iphase(ipos+1) = iphase(i+1) endif enddo !--append this type to end of dat array do i=1,nthistype ipos = ipos + 1 ! print*,ipos,' appended', dattemp2(i,1:3) dat(ipos,1:ncolcopy,j) = dattemp2(i,1:ncolcopy) !--we make iphase = 1 for point masses (could save iphase and copy across but no reason to) iphase(ipos) = iphaseminthistype enddo select case(itype) case(1) nptmassi = nthistype if (nptmassi /= nptmass) print *,'WARNING: nptmass from iphase =',nptmassi,'not equal to nptmass =',nptmass case(2) nstar = nthistype case(3) nunknown = nthistype end select enddo endif endif iphasealloc if (allocated(dattemp)) deallocate(dattemp) if (allocated(dattempsingle)) deallocate(dattempsingle) if (allocated(dattemp2)) deallocate(dattemp2) if (allocated(iphase)) deallocate(iphase) if (allocated(listpm)) deallocate(listpm) call set_labels_sphNG if (.not.phantomdump) then if (ngas /= npart - nptmassi - ndust - nstar - nunknown) & print*,'WARNING!!! ngas =',ngas,'but should be',npart-nptmassi-ndust-nstar-nunknown if (ndust /= npart - nptmassi - ngas - nstar - nunknown) & print*,'WARNING!!! ndust =',ndust,'but should be',npart-nptmassi-ngas-nstar-nunknown npartoftype(:,j) = 0 npartoftype(1,j) = ngas ! npart - nptmassi - ndust - nstar - nunknown npartoftype(2,j) = ndust ! npart - nptmassi - ngas - nstar - nunknown npartoftype(3,j) = ntotal - npart npartoftype(4,j) = nptmassi npartoftype(5,j) = nstar npartoftype(6,j) = nunknown else if (debug) print*,' DEBUG: nunknown = ',nunknown npartoftype(1,j) = npartoftype(1,j) - nunknown npartoftype(itypemap_unknown_phantom,j) = npartoftype(itypemap_unknown_phantom,j) + nunknown endif if (iverbose > 0) call print_types(npartoftype(:,j),labeltype) close(15) if (debug) print*,' finished data read, npart = ',npart, ntotal, npartoftype(1:ntypes,j) return contains ! !--reset centre of mass to zero ! subroutine reset_centre_of_mass(xyz,pmass,h,iphase,np,icentre) implicit none integer, intent(in) :: np,icentre real, dimension(np,3), intent(inout) :: xyz real, dimension(np), intent(in) :: h,pmass integer(kind=int1), dimension(np), intent(in) :: iphase real :: masstot,pmassi,minh real, dimension(3) :: xcm integer :: i,ctr ! !--get centre of mass ! xcm(:) = 0. masstot = 0. minh = huge(minh) do i=1,np if (iphase(i) >= 0) then pmassi = pmass(i) masstot = masstot + pmass(i) where (required(1:3)) xcm(:) = xcm(:) + pmassi*xyz(i,:) minh = min(h(i),minh) endif enddo ! !--if requested, find the location of the densest clump if (icentre==2) then xcm(:) = 0. masstot = 0. ctr = 0 do i=1,np if (iphase(i) >= 0 .and. h(i) < minh*1.05) then ctr = ctr + 1 pmassi = pmass(i) masstot = masstot + pmass(i) where (required(1:3)) xcm(:) = xcm(:) + pmassi*xyz(i,:) endif enddo endif xcm(:) = xcm(:)/masstot if (icentre==1) then print*,' RESETTING CENTRE OF MASS (',pack(xcm,required(1:3)),') TO ZERO ' elseif (icentre==2) then print*,' RESETTING CENTRE OF DENSEST CLUMP (',pack(xcm,required(1:3)),') TO ZERO using ',ctr,' particles' endif if (required(1)) xyz(1:np,1) = xyz(1:np,1) - xcm(1) if (required(2)) xyz(1:np,2) = xyz(1:np,2) - xcm(2) if (required(3)) xyz(1:np,3) = xyz(1:np,3) - xcm(3) return end subroutine reset_centre_of_mass subroutine reset_corotating_velocities(np,xy,velxy,omeg) integer, intent(in) :: np real, dimension(np,2), intent(in) :: xy real, dimension(np,2), intent(inout) :: velxy real, intent(in) :: omeg integer :: ip print*,'SUBTRACTING COROTATING VELOCITIES, OMEGA = ',omeg do ip=1,np velxy(ip,1) = velxy(ip,1) + xy(ip,2)*omeg enddo do ip=1,np velxy(ip,2) = velxy(ip,2) - xy(ip,1)*omeg enddo return end subroutine reset_corotating_velocities subroutine reset_corotating_positions(np,xy,omeg,t) integer, intent(in) :: np real, dimension(np,2), intent(inout) :: xy real, intent(in) :: omeg,t real :: phii,phinew,r integer :: ip print*,'SUBTRACTING COROTATING POSITIONS, OMEGA = ',omeg,' t = ',t !$omp parallel default(none) & !$omp shared(xy,np) & !$omp firstprivate(omeg,t) & !$omp private(ip,r,phii,phinew) !$omp do do ip=1,np r = sqrt(xy(ip,1)**2 + xy(ip,2)**2) phii = atan2(xy(ip,2),xy(ip,1)) phinew = phii + omeg*t xy(ip,1) = r*cos(phinew) xy(ip,2) = r*sin(phinew) enddo !$omp enddo !$omp end parallel return end subroutine reset_corotating_positions end subroutine read_data_sphNG !------------------------------------------------------------ ! set labels for each column of data !------------------------------------------------------------ subroutine set_labels_sphNG use labels, only:label,unitslabel=>unitslabel_default,& labelzintegration=>labelzintegration_default,labeltype,labelvec,iamvec, & ix,ipmass,irho,ih,iutherm,ipr,ivx,iBfirst,idivB,iJfirst,icv,iradenergy,& idustfrac,ideltav,idustfracsum,ideltavsum,igrainsize,igraindens,iradFx, & ivrel,make_vector_label,get_label_grain_size,itemp,ikappa,ipmomx,irhorestframe use params use settings_data, only:ndim,ndimV,ntypes,ncolumns,UseTypeInRenderings,debugmode use geometry, only:labelcoord use settings_units, only:units=>units_default,unitzintegration=>unitzintegration_default,& get_nearest_length_unit,get_nearest_time_unit,& get_nearest_mass_unit,get_nearest_velocity_unit use sphNGread use asciiutils, only:lcase,make_tags_unique,match_tag use system_utils, only:lenvironment,get_environment_or_flag integer :: i,j,idustlast real(doub_prec) :: unitx,unitvel,unitmass character(len=20) :: string,unitlabelx,unitlabelv character(len=20) :: deltav_string if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_sphNG ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_sphNG ***' return endif !--all formats read the following columns do i=1,ndim ix(i) = i enddo if (igotmass) then ipmass = 4 ! particle mass ih = 5 ! smoothing length else ipmass = 0 ih = 4 ! smoothing length endif irho = ih + 1 ! density iutherm = 0 idustfrac = 0 ! !--translate array tags into column labels, where necessary ! if (tagged) then do i=1,ncolumns label(i) = tagarr(i) select case(trim(tagarr(i))) case('m') ipmass = i case('h') ih = i case('rho') irho = i case('vx') ivx = i case('pressure') ipr = i case('u') iutherm = i case('divv') idivvcol = i units(i) = 1./utime unitslabel(i) = ' [1/s]' case('divvx') idivvxcol = i units(i) = 1./utime unitslabel(i) = ' [1/s]' case('poten') units(i) = umass*(udist/utime)**2 unitslabel(i) = ' [erg]' case('dt') units(i) = utime unitslabel(i) = ' [s]' case('curlvx') icurlvxcol = i case('curlvy') icurlvycol = i case('curlvz') icurlvzcol = i case('Bx') iBfirst = i case('divB') idivB = i case('curlBx') iJfirst = i case('psi') label(i) = '\psi' units(i) = umagfd*udist/utime unitslabel(i) = ' [G cm/s]' case('psi/c_h') units(i) = umagfd unitslabel(i) = ' [G]' case('dustfracsum') idustfracsum = i case('deltavsumx') ideltavsum = i case('deltavx') ideltav = i case('alpha') label(i) = '\alpha' case('alphaB') label(i) = '\alpha_B' case('EulerAlpha') label(i) = 'Euler \alpha' case('EulerBeta') label(i) = 'Euler \beta' case('EtaReal') label(i) = '\eta_{real}' case('EtaArtificial') label(i) = '\eta_{art}' case('Erad','xi') iradenergy = i label(i) = '\xi' unitslabel(i) = ' [erg/g]' units(i) = (udist/utime)**2 case('opacity') label(i) = 'opacity' unitslabel(i) = ' [cm^2/g]' units(i) = udist**2/umass case('kappa') unitslabel(i) = ' [cm^2/g]' units(i) = udist**2/umass ikappa = i case('radFx') iradFx = i case('radP') label(i) = 'radiation pressure' unitslabel(i) = ' [g / (cm s^2)]' units(i) = umass/(udist*utime**2) case('EddingtonFactor','edd') label(i) = 'Eddington Factor' case('Cv','cv') label(i) = 'C_v' icv = i units(i) = (udist/utime)**2 unitslabel(i) = ' [erg/(g K)]' case('h2ratio') label(i) = 'H_2 ratio' case('abH1q','abHIq') label(i) = 'HI abundance' case('abhpq') label(i) = 'proton abundance' case('abeq') label(i) = 'e^- abundance' case('abco') label(i) = 'CO abundance' case('eta_{OR}') units(i:i+2) = udist**2/utime unitslabel(i:i+2) = ' [cm^2/s]' case('grainsize') igrainsize = i case('graindens') igraindens = i case('temperature') itemp = i case('vrel') ivrel = i case('px') ipmomx = i case('dens prim') irhorestframe = i case default if (debugmode) print "(a,i2)",' DEBUG: Unknown label '''//trim(tagarr(i))//''' in column ',i label(i) = tagarr(i) end select enddo else if (smalldump .and. nhydroreal4 >= 3) iutherm = irho+1 call guess_labels(ncolumns,iamvec,label,labelvec,istartmhd,istart_extra_real4,& nmhd,nhydroreal4,ndimV,irho,iBfirst,ivx,iutherm,idivB,iJfirst,& iradenergy,icv,udist,utime,units,unitslabel) endif if (itemp==0 .or. itempcol > 0) itemp=itempcol ! if temperature not found in file, use computed one label(ix(1:ndim)) = labelcoord(1:ndim,1) if (irho > 0) label(irho) = 'density' if (iutherm > 0) label(iutherm) = 'u' if (ih > 0) label(ih) = 'h ' if (ipmass > 0) label(ipmass) = 'particle mass' if (idivB > 0) label(idivB) = 'div B' if (idivvxcol > 0) label(idivvxcol) = 'div vx' if (idivvcol > 0) label(idivvcol) = 'div v' if (itemp > 0) then label(itemp) = 'temperature' unitslabel(itemp) = ' [K]' endif if (itempcol > 0) then if (itempcol /= itemp) label(itempcol) = 'temperature (from u)' unitslabel(itempcol) = ' [K]' endif if (ikappa > 0) label(ikappa) = 'kappa' if (iHIIcol > 0) label(iHIIcol) = 'HII fraction' if (iHeIIcol > 0) label(iHeIIcol) = 'HeII fraction' if (iHeIIIcol > 0) label(iHeIIIcol) = 'HeIII fraction' if (icurlvxcol > 0 .and. icurlvycol > 0 .and. icurlvzcol > 0) then call make_vector_label('curl v',icurlvxcol,ndimV,iamvec,labelvec,label,labelcoord(:,1)) endif if (ideltavsum > 0) then ! Modify the deltavsum labels to have vector subscripts do j=1,ndimV label(ideltavsum+j-1) = 'deltavsum'//'_'//labelcoord(j,1) enddo ! Make N deltav labels with vector subscripts do i = ideltavsum+ndimV,ideltav,ndimV write(deltav_string,'(I10)') (i-ideltavsum)/ndimV write(deltav_string,'(A)') 'deltav'//trim(adjustl(deltav_string)) do j=1,ndimV label(i+j-1) = trim(deltav_string)//'_'//labelcoord(j,1) enddo enddo endif ! !--set labels for vector quantities ! call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('B',iBfirst,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('J',iJfirst,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('p',ipmomx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('grad E',iradFx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--ensure labels are unique by appending numbers where necessary ! call make_tags_unique(ncolumns,label) ! !--identify dust fraction in the case where there is only one species ! idustfrac = match_tag(label,'dustfrac') ! !--set units for plot data ! call get_nearest_length_unit(udist,unitx,unitlabelx) call get_nearest_velocity_unit(udist/utime,unitvel,unitlabelv) if (ndim >= 3) then units(1:3) = unitx unitslabel(1:3) = unitlabelx endif if (ipmass > 0) then call get_nearest_mass_unit(umass,unitmass,unitslabel(ipmass)) units(ipmass) = unitmass endif units(ih) = unitx unitslabel(ih) = unitlabelx if (ivx > 0) then units(ivx:ivx+ndimV-1) = unitvel unitslabel(ivx:ivx+ndimV-1) = unitlabelv endif if (iradFx > 0) then units(iradFx:iradFx+ndimV-1) = umass/(udist*utime)**2 unitslabel(iradFx:iradFx+ndimV-1) = ' [erg/cm^4]' endif if (ipmomx > 0) then units(ipmomx:ipmomx+ndimV-1) = unitvel unitslabel(ipmomx:ipmomx+ndimV-1) = unitlabelv endif if (ideltavsum > 0) then units(ideltavsum:ideltav+ndimV-1) = unitvel unitslabel(ideltavsum:ideltav+ndimV-1) = unitlabelv endif if (ideltav > 0) then units(ideltav:ideltav+ndimV-1) = unitvel unitslabel(ideltav:ideltav+ndimV-1) = unitlabelv endif if (iutherm > 0) then units(iutherm) = (udist/utime)**2 unitslabel(iutherm) = ' [erg/g]' endif if (ipr > 0) then units(ipr) = umass/(udist*utime**2) unitslabel(ipr) = ' [g / (cm s^2)]' endif units(irho) = umass/udist**3 unitslabel(irho) = ' [g/cm^3]' if (iBfirst > 0) then units(iBfirst:iBfirst+ndimV-1) = umagfd unitslabel(iBfirst:iBfirst+ndimV-1) = ' [G]' endif if (igrainsize > 0) then units(igrainsize) = udist unitslabel(igrainsize) = ' [cm]' endif if (igraindens > 0) then units(igraindens) = umass/udist**3 unitslabel(igraindens) = ' [g/cm^3]' endif if (ivrel > 0) then units(ivrel) = udist/utime/100 unitslabel(ivrel) = ' [m/s]' endif if (idivB > 0) then units(idivB:idivB+3) = umagfd/unitx unitslabel(idivB:idivB+3) = ' [G/'//trim(unitlabelx(3:)) endif !--use the following two lines for time in years call get_environment_or_flag('SSPLASH_TIMEUNITS',string) select case(trim(lcase(adjustl(string)))) case('s','seconds') units(0) = utime unitslabel(0) = trim(string) case('min','minutes','mins') units(0) = utime/60.d0 unitslabel(0) = trim(string) case('h','hr','hrs','hours','hour') units(0) = utime/3600.d0 unitslabel(0) = trim(string) case('y','yr','yrs','years','year') units(0) = utime/3.1536d7 unitslabel(0) = trim(string) case('d','day','days') units(0) = utime/(3600.d0*24.d0) unitslabel(0) = trim(string) case('tff','freefall','tfreefall') !--or use these two lines for time in free-fall times units(0) = 1./tfreefall unitslabel(0) = ' ' case default if (dtmax > 0. .and. (abs(utime-1d0) > 0.d0)) then ! use interval between dumps call get_nearest_time_unit(utime*dtmax,unitx,unitslabel(0)) unitx = unitx/dtmax else call get_nearest_time_unit(utime,unitx,unitslabel(0)) endif units(0) = unitx ! convert to real*4 end select unitzintegration = udist labelzintegration = ' [cm]' ! !--set labels for each particle type ! if (phantomdump) then ! phantom ntypes = itypemap_unknown_phantom labeltype(1) = 'gas' labeltype(2) = 'dust (old)' labeltype(3) = 'sink' labeltype(4) = 'ghost' labeltype(5) = 'star' labeltype(6) = 'dark matter' labeltype(7) = 'bulge' if (ndustlarge > 0) then ! try to label dust particles as 1cm dust, 10cm dust etc. idustlast = min(8+ndustlarge-1,size(labeltype)-1) if (allocated(grainsize)) then do i=1,ndustlarge j = 8 + i - 1 if (j < size(labeltype)) then if (grainsize(i) > 0.) then labeltype(j) = trim(get_label_grain_size(grainsize(i)))//' dust' else labeltype(j) = 'dust' endif endif enddo else labeltype(8:idustlast) = 'dust' endif endif labeltype(itypemap_unknown_phantom) = 'unknown/dead' UseTypeInRenderings(:) = .true. UseTypeInRenderings(3) = .false. if (lenvironment('SSPLASH_PLOT_DUST')) then UseTypeInRenderings(2) = .false. endif if (lenvironment('SSPLASH_PLOT_STARS')) then UseTypeInRenderings(5) = .false. endif if (lenvironment('SSPLASH_PLOT_DM')) then UseTypeInRenderings(6) = .false. endif else ntypes = 6 labeltype(1) = 'gas' labeltype(2) = 'dust' labeltype(3) = 'ghost' labeltype(4) = 'sink' labeltype(5) = 'star' labeltype(6) = 'unknown/dead' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. UseTypeInRenderings(3) = .true. UseTypeInRenderings(4) = .false. UseTypeInRenderings(5) = .true. UseTypeInRenderings(6) = .true. ! only applies if turned on endif end subroutine set_labels_sphNG !----------------------------------------------------------- ! ! check if a file is in phantom/sphNG format ! !----------------------------------------------------------- logical function file_format_is_sphNG(filename) result(is_sphNG) use byteswap, only:bs character(len=*), intent(in) :: filename integer :: iunit,intg1,ierr is_sphNG = .false. ! ! open file and read the first line ! open(newunit=iunit,iostat=ierr,file=filename,status='old',form='unformatted') if (ierr /= 0) return ! ! check the magic integer to determine phantom/sphNG format ! read(iunit,iostat=ierr) intg1 if (intg1==690706 .or. intg1==060769) is_sphNG = .true. ! ! check for sphNG but in the other endian ! if (bs(intg1)==690706 .or. bs(intg1)==060769) is_sphNG = .true. close(iunit) ! close the file end function file_format_is_sphNG end module readdata_sphNG danieljprice-splash-4d1f09c/src/read_data_sphysics.f90000066400000000000000000000216561477365367100230440ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! the data is stored in the global array dat ! ! THIS VERSION FOR THE DUAL SPHYSICS CODE ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- !--local module to store header information so we can later set the labels module sphysicsdata use params use labels, only:lenlabel implicit none end module sphysicsdata module readdata_sphysics implicit none public :: read_data_sphysics, set_labels_sphysics private contains subroutine read_data_sphysics(rootname,indexstart,ipos,nstepsread) use particle_data, only:npartoftype,masstype,time,gamma,dat,maxpart,maxstep,maxcol,iamtype use params use filenames, only:nfiles use settings_data, only:ndim,ndimV,ncolumns,ncalc, & buffer_data,iverbose,debugmode,ntypes use mem_allocation, only:alloc use labels, only:ipr,ivx,ih,irho,labeltype integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+4) :: datfile integer :: i,ierr,iunit,j,iblock integer :: npart_max,nstep_max integer, dimension(:), allocatable :: itype character(len=20) :: geomfile character(len=7) :: keyword character(len=70) :: title character(len=1) :: dumchar character(len=16) :: unitsys integer :: istep,jtype,np,ione,kk,idum,nblock real(kind=sing_prec) :: version,timesingle,dum real(kind=doub_prec) :: versiond,timedbl,dumd real :: timein,dx,dy logical :: singleprecision iunit = 11 ! file unit number nstepsread = 0 if (rootname(1:1) /= ' ') then datfile = trim(rootname) else print*,' **** no data read **** ' return endif if (iverbose >= 1) print "(1x,a)",'reading Dual SPHysics format' write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ndim = 2 ndimV = 2 ! !--open data file and read data ! open(unit=iunit,iostat=ierr,file=datfile,status='old',form='unformatted',access='stream') if (ierr /= 0) then print*,' *** Error opening '//trim(datfile)//' ***' return endif ! !--read first header line ! read(iunit,iostat=ierr,end=80) keyword read(iunit,iostat=ierr,end=80) version read(iunit,iostat=ierr,end=80) title read(iunit,iostat=ierr,end=80) istep read(iunit,iostat=ierr,end=80) timesingle timein = timesingle read(iunit,iostat=ierr,end=80) np read(iunit,iostat=ierr,end=80) ione if (ierr /= 0 .or. np <= 0 .or. timesingle < 0.) then ! !--try single precision ! rewind(iunit) read(iunit,iostat=ierr,end=80) keyword read(iunit,iostat=ierr,end=80) versiond version = versiond read(iunit,iostat=ierr,end=80) title read(iunit,iostat=ierr,end=80) istep read(iunit,iostat=ierr,end=80) timedbl timein = timedbl read(iunit,iostat=ierr,end=80) np read(iunit,iostat=ierr,end=80) ione singleprecision = .false. if (ierr /= 0 .or. np < 0 .or. timedbl < 0.) then print "(a)",' *** Error reading first header ***' close(iunit) return endif endif print "(a,f4.2)",' keyword = '//trim(keyword)//' version = ',version !print "(a)",' title = '//trim(title) print "(a,i6,a,es10.3,a,i6)",' step = ',istep,' time = ',timein,' np = ',np ! !--allocate memory for data arrays ! if (buffer_data) then nstep_max = max(nfiles,maxstep,indexstart) else nstep_max = max(1,maxstep,indexstart) endif npart_max = max(int(1.1*np),maxpart) ncolumns = 7 if (.not.allocated(dat) .or. npart_max > maxpart & .or. nstep_max > maxstep .or. ncolumns+ncalc > maxcol) then call alloc(npart_max,nstep_max,ncolumns+ncalc,mixedtypes=.true.) endif i = indexstart nstepsread = 0 time(i) = timein gamma(i) = 5./3. npartoftype(1,i) = np do j=1,np read(iunit,iostat=ierr,end=67) idum,(dat(j,kk,i),kk=1,2),dum enddo read(iunit,iostat=ierr,end=67) nblock read(iunit,iostat=ierr,end=67) (idum,j=1,nblock) ntypes = 4 allocate(itype(np)) read(iunit,iostat=ierr,end=67) (itype(j),j=1,nblock) npartoftype(:,i) = 0 do j=1,np jtype = itype(j) !--map types from code types to splash types select case(jtype) case(1) jtype = 2 ! boundary case(2) jtype = 1 ! water case default ! unknown jtype = 4 end select iamtype(j,i) = jtype npartoftype(jtype,i) = npartoftype(jtype,i) + 1 enddo deallocate(itype) read(iunit,iostat=ierr,end=67) (dumchar,j=1,nblock) read(iunit,iostat=ierr,end=67) (idum,j=1,nblock) call set_labels_sphysics do iblock=1,1 read(iunit,iostat=ierr,end=67) nblock read(iunit,iostat=ierr,end=67) idum do j=1,nblock read(iunit,iostat=ierr,end=67) compName(j),unitsys,idum,idum,dum !print*,trim(compName(j)) enddo do j=1,np read(iunit,iostat=ierr,end=67) dum,dat(j,ipr,i),dat(j,ivx,i),dat(j,ivx+1,i),dat(j,1,i),dat(j,2,i) if (abs(dum) < tiny(0.)) then npartoftype(iamtype(j,i),i) = npartoftype(iamtype(j,i),i) - 1 ! remove from previous type iamtype(j,i) = 3 npartoftype(3,i) = npartoftype(3,i) + 1 ! add to "box" type endif enddo enddo ! !--fake other properties: density, mass, smoothing length etc. ! masstype(1,i) = 1./npartoftype(1,i) ! !--assume smoothing length to be the max dimension divided by the number of particles^(1/ndim) ! dx = maxval(dat(1:np,1,i)) - minval(dat(1:np,1,i)) dy = maxval(dat(1:np,2,i)) - minval(dat(1:np,2,i)) dat(:,ih,i) = dx/(npartoftype(1,i))**(1./ndim)*(dy/dx) print*,' WARNING: ASSUMING SMOOTHING LENGTH = ',dat(1,ih,i),' AND ARBITRARY PARTICLE MASSES' dat(:,irho,i) = 1. nstepsread = 1 do jtype=1,ntypes write(*,"(' n(',a,') = ',i6)",advance="no") trim(labeltype(jtype)),npartoftype(jtype,i) enddo write(*,*) !read* goto 68 67 continue print "(a)",' > end of file reached <' 68 continue ! !--close data file and return ! close(unit=11) if (debugmode) print*,'DEBUG> Read steps ',indexstart,'->',indexstart + nstepsread - 1, & ' last step ntot = ',sum(npartoftype(:,indexstart+nstepsread-1)) return 80 continue print*,' *** data file empty : no timesteps ***' return end subroutine read_data_sphysics !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_sphysics use labels, only:ix,ivx,ih,irho,ipr,& iamvec,labelvec,label,labeltype use params use settings_data, only:ndim,ndimV,UseTypeInRenderings use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_sphysics ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_sphysics ***' return endif do i=1,ndim ix(i) = i enddo ivx = ndim + 1 ipr = ndim + ndimV + 1 irho = ipr + 1 ih = irho + 1 label(ipr) = 'pressure' label(irho) = 'density' label(ih) = 'h' label(ix(1:ndim)) = labelcoord(1:ndim,1) ! !--label vector quantities (e.g. velocity) appropriately ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' ! !--set labels for each type of particles ! labeltype(1) = 'water' labeltype(2) = 'boundary' labeltype(3) = 'box' labeltype(4) = 'unknown' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. UseTypeInRenderings(3) = .false. UseTypeInRenderings(4) = .false. !----------------------------------------------------------- return end subroutine set_labels_sphysics end module readdata_sphysics danieljprice-splash-4d1f09c/src/read_data_spyros.f90000066400000000000000000000152071477365367100225310ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM THE VINE CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! *** CONVERTS TO SINGLE PRECISION *** ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_spyros implicit none public :: read_data_spyros, set_labels_spyros private contains subroutine read_data_spyros(rootname,indexstart,ipos,nstepsread) use particle_data use params use settings_data, only:ndim,ndimV,ncolumns,ncalc use mem_allocation integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: j,ierr,ntoti,irec integer :: npart_max,nstep_max,ncolstep logical :: iexist character(len=len(rootname)+10) :: dumpfile !--we are assuming dump is double precision real(doub_prec) :: variable1,variable2 real(doub_prec), dimension(:), allocatable :: dattemp nstepsread = 0 npart_max = maxpart dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 ! !--allocate memory initially ! nstep_max = max(indexstart,1) j = indexstart nstepsread = 0 print "(1x,a)",'reading Spyros Kitsonias'' format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the (unformatted) binary file and read the number of particles ! open(unit=15,iostat=ierr,file=dumpfile,status='old',form='unformatted',& access='direct',recl=4000000) if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' else ! !--read timestep header (integers only) ! read(15,iostat=ierr) variable1,variable2 if (ierr < 0) then print "(a)",'*** END OF FILE IN TIMESTEP HEADER ***' return elseif (ierr /= 0) then print "(a)",'*** ERROR READING TIMESTEP HEADER ***' return endif ! !--get number of particles from header and allocate memory ! ntoti = int(variable1) ncolstep = int(variable2) ncolumns = ncolstep if (.not.allocated(dat) .or. ntoti > npart_max) then npart_max = max(npart_max,INT(1.1*ntoti)) call alloc(npart_max,nstep_max,ncolstep+ncalc) endif ! !--rewind file ! rewind(15) endif npart_max = max(npart_max,ntoti) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,j+2*nstepsread,maxcol) endif ! !--allocate a temporary array for double precision variables ! if (allocated(dattemp)) deallocate(dattemp) allocate(dattemp(npart_max),stat=ierr) dattemp = 0. if (ierr /= 0) print*,'not enough memory in read_data_spyros' ! !--now read the timestep data in the dumpfile ! print "(a,i5,a,f8.3,a,i8)",'| step ',j,': t = ',time(j),' ntotal = ',ntoti nstepsread = nstepsread + 1 ! !--set particle numbers ! npartoftype(:,j) = 0 npartoftype(1,j) = ntoti ! !--read all records ! overcolumns: do irec=1,ncolstep read(15,rec=irec,iostat=ierr) variable1,variable2,dattemp(1:ntoti) if (ierr < 0) then print "(a)",'*** END OF FILE IN READ DATA (CHECK PRECISION) ***' exit overcolumns elseif (ierr /= 0) then print "(a)",'*** ERROR READING DATA ***' exit overcolumns endif ! !--time and gamma ! if (irec==2) time(j) = real(variable1) if (irec==5) gamma(j) = real(variable2) ! !--convert to single precision ! dat(1:ntoti,irec,j) = real(dattemp(1:ntoti)) enddo overcolumns ! !--clean up ! if (allocated(dattemp)) deallocate(dattemp) ! !--close file ! close(15) if (nstepsread > 0) then print*,'>> end of dump file: ntotal = ',sum(npartoftype(:,j)) endif return end subroutine read_data_spyros !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_spyros use labels use params use settings_data use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_spyros ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_spyros ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ih = 10 ! smoothing length iutherm = 9 ! thermal energy ipmass = 8 ! particle mass irho = 7 ! location of rho in data array label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = 'density' label(iutherm) = 'temperature' label(ih) = 'h' label(ipmass) = 'particle mass' ! !--set labels for vector quantities ! iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//labelcoord(i,1) enddo ! !--set labels for each particle type ! ntypes = 1 labeltype(1) = 'gas' UseTypeInRenderings(1) = .true. !----------------------------------------------------------- return end subroutine set_labels_spyros end module readdata_spyros danieljprice-splash-4d1f09c/src/read_data_sro.f90000066400000000000000000000622121477365367100217730ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2012 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM STEPHAN ROSSWOG'S CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! *** CONVERTS TO SINGLE PRECISION *** ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! ENVIRONMENT VARIABLES: ! ! --format or RSPLASH_FORMAT can be 'MHD' or 'HYDRO' ! --com or RSPLASH_RESET_COM if 'YES' then centre of mass is reset for n2=0 (ie single objects) ! --corotating or RSPLASH_COROTATING if 'YES' then velocities are transformed to corotating frame ! --hfact or RSPLASH_HFACT can be changed to give correct hfact value for particle masses ! on minidumps: e.g. --hfact=1.2 ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_sro implicit none public :: read_data_sro, set_labels_sro private contains subroutine read_data_sro(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,time,npartoftype,gamma,maxpart,maxcol,maxstep use params use settings_data, only:ndim,ndimV,ncolumns,iformat use mem_allocation, only:alloc use system_utils, only:lenvironment,get_environment_or_flag integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer, parameter :: max_spec = 7 ! number of species in abundance file real :: hfact, dhfact3,hfacttemp integer :: i,j,k,ierr,ierr1 integer :: nprint,nptmass,npart_max,nstep_max integer :: n1,n2,idump,ncol logical :: iexist,magfield,minidump,doubleprec,iabunfileopen character(len=len(rootname)) :: dumpfile character(len=13) :: abunfile character(len=10) :: string real :: timei,tkin,tgrav,tterm,escap,rstar,mstar,Etot_burn_cgs real(doub_prec) :: timedb,tkindb,tgravdb,ttermdb real(doub_prec) :: escapdb,rstardb,mstardb,Etot_burn_cgsdb real(doub_prec), dimension(:,:), allocatable :: datdb nstepsread = 0 nstep_max = 0 npart_max = maxpart iabunfileopen = .false. hfact = 1.5 dhfact3 = 1./hfact**3 dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--use minidump format if minidump ! minidump = .false. if (index(dumpfile,'minidump') /= 0) minidump = .true. ! !--get hfact for minidumps ! if (minidump) then call get_environment_or_flag('RSPLASH_HFACT',string) read(string,*,iostat=ierr) hfacttemp if (hfacttemp > 0.5 .and. hfacttemp < 10.0 .and. ierr==0) then hfact = hfacttemp print *,'setting hfact =',hfact,' from --hfact flag' else print "(1x,a)",'error reading hfact from --hfact command line flag' endif endif ! !--try to guess full dump format from file names ! magfield = .true. ! if (.not.minidump) then ! if (index(dumpfile,'SMBH') > 0) magfield = .false. ! if (index(dumpfile,'nsbh') > 0) magfield = .false. ! if (index(dumpfile,'NSBH') > 0) magfield = .false. ! if (index(dumpfile,'WD') > 0) magfield = .false. ! endif ! !--override this with environment variable ! call get_environment_or_flag('RSPLASH_FORMAT',string) select case(trim(adjustl(string))) case('MHD','mhd','ns','NS') magfield = .true. case('WD','hydro','HYDRO','ns_bh_v2') magfield = .false. end select if (magfield) then print "(1x,a)",'reading MAGMA code format (set --format=hydro for hydro format)' else print "(1x,a)",'reading Stephan Rosswog (hydro) code format (set --format=mhd for MAGMA)' endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 if (magfield) then if (minidump) then ncol = 11 iformat = 1 else ncol = 27 iformat = 2 endif else if (minidump) then ncol = 7 ! number of columns in file iformat = 3 else ncol = 16 iformat = 4 endif endif n1 = 0 n2 = 0 ! !--allocate memory initially ! nstep_max = max(nstep_max,indexstart,1) j = indexstart nstepsread = 0 write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the (unformatted) binary file and read the number of particles ! open(unit=15,iostat=ierr,file=dumpfile,status='old',form='unformatted') if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return else ! !--read the number of particles in the first step, ! allocate memory and rewind ! doubleprec = .true. if (minidump) then !--try double precision first read(15,end=55,iostat=ierr) timedb,nprint,nptmass !--change to single precision if stupid answers if (nprint <= 0.or.nprint > 1e10 & .or.nptmass < 0.or.nptmass > 1e6) then doubleprec = .false. rewind(15) read(15,end=55,iostat=ierr) timei,nprint,nptmass if (magfield) then print "(a)",' single precision MHD minidump' else print "(a)",' single precision hydro minidump' endif else if (magfield) then print "(a)",' double precision MHD minidump' else print "(a)",' double precision hydro minidump' endif timei = real(timedb) endif else !--try double precision first read(15,end=55,iostat=ierr) nprint,rstardb,mstardb,n1,n2, & nptmass,timedb !--change to single precision if stupid answers if (n1 < 0.or.n1 > 1e10.or.n2 < 0.or.n2 > 1e10 & .or.nptmass < 0.or.nptmass > 1.e6) then doubleprec = .false. rewind(15) read(15,end=55,iostat=ierr) nprint,rstar,mstar,n1,n2, & nptmass,timei if (magfield) then print "(a)",' single precision full MHD dump' else print "(a)",' single precision full hydro dump' endif else if (magfield) then print "(a)",' double precision full MHD dump' else print "(a)",' double precision full hydro dump' endif timei = real(timedb) endif endif print "(a,f10.2,a,i9,a,i6)",' time: ',timei,' npart: ',nprint,' nptmass: ',nptmass !--barf if stupid answers in single and double precision if (nptmass < 0.or.nptmass > 1.e6 .or. nprint < 0 & .or. nprint > 1e10 .or. (nprint==0 .and. nptmass==0)) then print "(a)",' *** ERRORS IN TIMESTEP HEADER: NO DATA READ ***' close(15) return endif ncolumns = ncol ! !--check if abundance files are present and read from them ! if (.not.magfield) then !--extract dump number from filename (last 5 characters) read(dumpfile(len_trim(dumpfile)-4:len_trim(dumpfile)),*,iostat=ierr1) idump if (ierr1 /= 0) then print "(a)",' error extracting dump number from filename' else write(abunfile,"(a,'.',i5.5)") 'abun_a7',idump inquire(file=abunfile,exist=iexist) if (.not.iexist) then print "(a)",' abundance file '//trim(abunfile)//' NOT FOUND' else open(unit=41,file=abunfile,status='old',form='unformatted',iostat=ierr1) if (ierr1 /= 0) then print "(a)",'*** ERROR OPENING '//trim(abunfile) else ncolumns = ncol + max_spec + 2 iabunfileopen = .true. endif endif endif endif if (.not.allocated(dat) .or. (nprint+nptmass) > npart_max) then npart_max = max(npart_max,INT(1.1*(nprint+nptmass))) call alloc(npart_max,nstep_max,ncolumns) endif rewind(15) endif if (ierr /= 0) then print "(a)",'*** ERROR READING TIMESTEP HEADER ***' else ! !--loop over the timesteps in this file ! npart_max = max(npart_max,nprint) ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,j+1,maxcol) endif ! !--now read the timestep data in the dumpfile ! if (magfield) then if (minidump) then dat(:,:,j) = 0. if (doubleprec) then allocate(datdb(maxpart,ncol),stat=ierr) if (ierr /= 0) then print*,"(a)",'*** error allocating memory for double conversion ***' return else datdb = 0. endif read(15,end=55,iostat=ierr) timedb,nprint,nptmass, & ((datdb(i,k),i=1,nprint),k=1,6), & ((datdb(i,k),i=1,nprint),k=8,ncol), & (datdb(i,7), i=nprint+1, nprint+nptmass), & ((datdb(i,k), i=nprint+1, nprint+nptmass),k=1,3) if (ierr /= 0) print "(a)",'*** WARNING: ERRORS DURING READ ***' dat(:,1:ncol,j) = real(datdb(:,1:ncol)) time(j) = real(timedb) else read(15,end=55,iostat=ierr) time(j),nprint,nptmass, & ((dat(i,k,j),i=1,nprint),k=1,6), & ((dat(i,k,j),i=1,nprint),k=8,ncol), & (dat(i,7,j), i=nprint+1, nprint+nptmass), & ((dat(i,k,j), i=nprint+1, nprint+nptmass),k=1,3) endif ! !--because masses are not dumped, we need to reconstruct them ! from density and h (only strictly true for grad h code) ! dat(1:nprint,7,j) = dat(1:nprint,4,j)**3*dat(1:nprint,5,j)*dhfact3 print "(a,f5.2,a)", & ' WARNING: setting particle masses assuming h = ',hfact,'*(m/rho)^(1/3)' else dat(:,:,j) = 0. ! because ptmasses don't have all quantities ! !--read full dump ! if (doubleprec) then allocate(datdb(maxpart,27),stat=ierr) if (ierr /= 0) then print*,"(a)",'*** error allocating memory for double conversion ***' return else datdb = 0. endif read(15,iostat=ierr) nprint,rstardb,mstardb,n1,n2, & nptmass,timedb,(datdb(i,7),i=1,nprint), & escapdb,tkindb,tgravdb,ttermdb, & ((datdb(i,k),i=1,nprint),k=1,6), & ((datdb(i,k),i=1,nprint),k=8,ncol), & (datdb(i,9), i=nprint+1, nprint+nptmass), & ((datdb(i,k), i=nprint+1, nprint+nptmass),k=1,6), & ((datdb(i,k), i=nprint+1, nprint+nptmass),k=21,23) if (ierr < 0) print "(a)",'*** WARNING: END OF FILE DURING READ ***' if (ierr > 0) print "(a)",'*** WARNING: ERRORS DURING READ ***' dat(:,1:ncol,j) = real(datdb(:,1:ncol)) time(j) = real(timedb) else read(15,iostat=ierr) nprint,rstar,mstar,n1,n2, & nptmass,time(j),(dat(i,7,j),i=1,nprint), & escap,tkin,tgrav,tterm, & ((dat(i,k,j),i=1,nprint),k=1,6), & ((dat(i,k,j),i=1,nprint),k=8,ncol), & (dat(i,9,j), i=nprint+1, nprint+nptmass), & ((dat(i,k,j), i=nprint+1, nprint+nptmass),k=1,6), & ((dat(i,k,j), i=nprint+1, nprint+nptmass),k=21,23) if (ierr < 0) print "(a)",'*** WARNING: END OF FILE DURING READ ***' if (ierr > 0) print "(a)",'*** WARNING: ERRORS DURING READ ***' endif endif else ! !--hydro minidumps ! if (minidump) then if (doubleprec) then allocate(datdb(maxpart,7),stat=ierr) if (ierr /= 0) then print*,"(a)",'*** error allocating memory for double conversion ***' return else datdb = 0. endif read(15,end=55,iostat=ierr) timedb,nprint,nptmass, & ((datdb(i,k), i=1, nprint),k=1,6), & (datdb(i,7), i=nprint+1, nprint+nptmass), & ((datdb(i,k), i=nprint+1, nprint+nptmass),k=1,3) if (ierr < 0) print "(a)",'*** WARNING: END OF FILE DURING READ ***' if (ierr > 0) print "(a)",'*** WARNING: ERRORS DURING READ ***' dat(:,1:ncol,j) = real(datdb(:,1:ncol)) time(j) = real(timedb) else read(15,end=55,iostat=ierr) time(j),nprint,nptmass, & ((dat(i,k,j), i=1, nprint),k=1,6), & (dat(i,7,j), i=nprint+1, nprint+nptmass), & ((dat(i,k,j), i=nprint+1, nprint+nptmass),k=1,3) endif ! !--because masses are not dumped, we need to reconstruct them ! from density and h (only strictly true for grad h code) ! dat(1:nprint,7,j) = dat(1:nprint,4,j)**3*dat(1:nprint,5,j)*dhfact3 print "(a,f5.2,a)", & ' WARNING: setting particle masses assuming h = ',hfact,'*(m/rho)^(1/3)' else ! !--hydro full dumps ! dat(:,:,j) = 0. ! because ptmasses don't have all quantities if (doubleprec) then allocate(datdb(maxpart,ncol),stat=ierr) if (ierr /= 0) then print*,"(a)",'*** error allocating memory for double conversion ***' return else datdb = 0. endif read(15,iostat=ierr) nprint,rstardb,mstardb,n1,n2, & nptmass,timedb,(datdb(i,7),i=1,nprint), & escapdb,tkindb,tgravdb,ttermdb, & ((datdb(i,k),i=1,nprint),k=1,6), & ((datdb(i,k),i=1,nprint),k=8,ncol), & (datdb(i,9), i=nprint+1, nprint+nptmass), & ((datdb(i,k), i=nprint+1, nprint+nptmass),k=1,6), & ((datdb(i,k), i=nprint+1, nprint+nptmass),k=13,15) if (ierr < 0) print "(a)",'*** WARNING: END OF FILE DURING READ ***' if (ierr > 0) print "(a)",'*** WARNING: ERRORS DURING READ ***' dat(:,1:ncol,j) = real(datdb(:,1:ncol)) time(j) = real(timedb) else read(15,iostat=ierr) nprint,rstar,mstar,n1,n2, & nptmass,time(j),(dat(i,7,j),i=1,nprint), & escap,tkin,tgrav,tterm, & ((dat(i,k,j),i=1,nprint),k=1,6), & ((dat(i,k,j),i=1,nprint),k=8,ncol), & (dat(i,9,j), i=nprint+1, nprint+nptmass), & ((dat(i,k,j), i=nprint+1, nprint+nptmass),k=1,6), & ((dat(i,k,j), i=nprint+1, nprint+nptmass),k=13,15) if (ierr < 0) print "(a)",'*** WARNING: END OF FILE DURING READ ***' if (ierr > 0) print "(a)",'*** WARNING: ERRORS DURING READ ***' endif endif endif if (ierr /= 0 ) then print "(a)",'|*** ERROR READING TIMESTEP ***' ! return ! else ! nstepsread = nstepsread + 1 endif nstepsread = nstepsread + 1 npartoftype(1,j) = nprint npartoftype(2,j) = nptmass !! print*,j,' time = ',time(j) gamma(j) = 1.666666666667 ! !--read abundances from abundance file ! if (iabunfileopen) then print "(a)",' ... reading abundances from '//trim(abunfile)//' ...' read(41,iostat=ierr1) nprint if (ierr1 /= 0) then print "(a)",' *** ERROR READING ABUNDANCE FILE ***' elseif (nprint /= npartoftype(1,j)) then print "(a)",' *** ERROR: npart in abundance file differs from full dump ***' else rewind(41) if (doubleprec) then read(41,iostat=ierr1) nprint,((datdb(i,k),k=1,max_spec+2),i=1,nprint),Etot_burn_cgsdb dat(:,ncol+1:ncolumns,j) = real(datdb(:,1:max_spec+2)) print*,' Etot_burn (cgs) = ',Etot_burn_cgsdb else read(41,iostat=ierr1) nprint,((dat(i,k,j),k=1,max_spec+2),i=1,nprint),Etot_burn_cgs print*,' Etot_burn (cgs) = ',Etot_burn_cgs endif if (ierr1 < 0) then print "(a)",' *** END OF FILE REACHED IN ABUNDANCE FILE ***' elseif (ierr1 > 0) then print "(a)",' *** ERRORS DURING ABUNDANCE FILE READ ***' elseif (nprint /= npartoftype(1,j)) then print "(a)",' *** ERROR: npart in abundance file differs from full dump ***' endif endif close(unit=41) endif j = j + 1 if (allocated(datdb)) deallocate(datdb) endif 55 continue ! !--reached end of file ! close(15) ! !--reset centre of mass to zero ! if (allocated(dat) .and. n2==0 .and. lenvironment('RSPLASH_RESET_CM')) then if (minidump) then call reset_centre_of_mass(dat(1:nprint,1:3,j-1),dat(1:nprint,7,j-1),nprint) else ! full dumps ipmass = 9 call reset_centre_of_mass(dat(1:nprint,1:3,j-1),dat(1:nprint,9,j-1),nprint) endif endif ! !--transform velocities to corotating frame ! if (.not.minidump .and. allocated(dat) .and. lenvironment('RSPLASH_COROTATING')) then print*,'TRANSFORMING VELOCITIES TO CORORATING FRAME' call set_corotating_vels(dat(1:nprint,9,j-1),dat(1:nprint,4:5,j-1),n1,nprint) endif if (allocated(npartoftype)) then print*,'>> end of dump file: nsteps =',j-1,'ntot = ', & sum(npartoftype(:,j-1)),'nptmass=',npartoftype(2,j-1) endif return contains ! !--reset centre of mass to zero ! subroutine reset_centre_of_mass(xyz,pmass,npart) integer, intent(in) :: npart real, dimension(npart,3), intent(inout) :: xyz real, dimension(npart) :: pmass real :: masstot,xcm,ycm,zcm ! !--get centre of mass ! masstot = SUM(pmass(1:npart)) xcm = SUM(pmass(1:npart)*xyz(1:npart,1))/masstot ycm = SUM(pmass(1:npart)*xyz(1:npart,2))/masstot zcm = SUM(pmass(1:npart)*xyz(1:npart,3))/masstot print*,' centre of mass is at ',xcm,ycm,zcm print*,' resetting to zero...' xyz(1:npart,1) = xyz(1:npart,1) - xcm xyz(1:npart,2) = xyz(1:npart,2) - ycm xyz(1:npart,3) = xyz(1:npart,3) - zcm return end subroutine reset_centre_of_mass ! !--adjust velocities to corotating frame ! subroutine set_corotating_vels(pmass,vxy,n1,npart) integer, intent(in) :: n1,npart real, dimension(npart,2), intent(inout) :: vxy !, xy real, dimension(npart) :: pmass real :: mass1,mass2 !,xcm1,ycm1,xcm2,ycm2 real :: vxcm1,vycm1,vxcm2,vycm2 ! !--get centre of mass of star 1 and star 2 ! mass1 = SUM(pmass(1:n1)) ! xcm1 = SUM(pmass(1:n1)*xy(1:n1,1))/mass1 ! ycm1 = SUM(pmass(1:n1)*xy(1:n1,2))/mass1 mass2 = SUM(pmass(n1+1:npart)) ! xcm2 = SUM(pmass(n1+1:npart)*xy(n1+1:npart,1))/mass2 ! ycm2 = SUM(pmass(n1+1:npart)*xy(n1+1:npart,2))/mass2 ! !--work out centre of mass velocities for each star ! vxcm1 = SUM(pmass(1:n1)*vxy(1:n1,1))/mass1 vycm1 = SUM(pmass(1:n1)*vxy(1:n1,2))/mass1 vxcm2 = SUM(pmass(n1+1:npart)*vxy(n1+1:npart,1))/mass2 vycm2 = SUM(pmass(n1+1:npart)*vxy(n1+1:npart,2))/mass2 ! !--subtract centre of mass velocities appropriately ! vxy(1:n1,1) = vxy(1:n1,1) - vxcm1 vxy(1:n1,2) = vxy(1:n1,2) - vycm1 vxy(n1+1:npart,1) = vxy(n1+1:npart,1) - vxcm2 vxy(n1+1:npart,2) = vxy(n1+1:npart,2) - vycm2 end subroutine set_corotating_vels end subroutine read_data_sro !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_sro use filenames, only:rootname use labels, only:label,unitslabel=>unitslabel_default,labelvec,labeltype,iamvec,& ix,ivx,ih,irho,iutherm,ipmass,iBfirst,idivB,make_vector_label use settings_data, only:ndim,ndimV,ncolumns,ntypes,UseTypeInRenderings,iformat use geometry, only:labelcoord use settings_units, only:units=>units_default integer :: i logical :: minidump real :: udistcm,udistkm,utime,umass,uvelkms minidump = .false. if (index(rootname(1),'minidump') /= 0) minidump = .true. if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_sro ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_sro ***' return endif do i=1,ndim ix(i) = i enddo if (minidump) then ivx = 0 ih = 4 ! smoothing length irho = 5 ! location of rho in data array iutherm = 0 ! thermal energy ipmass = 7 ! particle mass label(6) = 'T' if (ncolumns > 7) then iBfirst = 8 idivB = 11 endif if (ncolumns > 11) then label(12) = 'grad h' label(13) = 'grad soft' label(14) = 'dsoft' endif ! !--set transformation factors between code units/real units ! udistkm = 1.5 ! km udistcm = 1.5e5 utime = 5.0415e-6 umass = 1.99e33 units(1:3) = udistkm unitslabel(1:3) = ' [km]' units(ih) = udistkm unitslabel(ih) = ' [km]' units(ipmass) = umass unitslabel(ipmass) = ' [g]' units(irho) = umass/udistcm**3 unitslabel(irho) = ' [g/cm^3]' if (iBfirst > 0) then units(iBfirst:iBfirst+ndimV-1) = 8.0988e14 unitslabel(iBfirst:iBfirst+ndimV-1) = ' [G]' units(idivB) = units(iBfirst)/udistcm unitslabel(idivB) = ' [G/cm]' endif else !--full dump ivx = ndim+1 ih = 7 iutherm = 8 ipmass = 9 irho = 10 label(11) = 'temperature [ MeV ]' label(12) = 'electron fraction (y_{e})' if (iformat==2) then ! MHD full dump iBfirst = 13 label(16) = 'psi' idivB = 17 call make_vector_label('force',18,ndimV,iamvec,labelvec,label,labelcoord(:,1)) label(21) = 'Euler alpha' label(22) = 'Euler beta' label(23) = 'Bevol\dz' label(24) = 'grad h' label(25) = 'grad soft' label(26) = 'av ' label(27) = 'avB' ! !--set transformation factors between code units/real units ! udistkm = 1.5 ! km udistcm = 1.5e5 utime = 5.0415e-6 umass = 1.99e33 units(iBfirst:iBfirst+ndimV-1) = 8.0988e14 unitslabel(iBfirst:iBfirst+ndimV-1) = ' [G]' units(idivB) = units(iBfirst)/udistcm unitslabel(idivB) = ' [G/cm]' units(1:3) = udistkm unitslabel(1:3) = ' [km]' units(4:6) = 1.0 unitslabel(4:6) = '/c' units(7) = udistkm unitslabel(7) = ' [km]' units(8) = (udistcm/utime)**2 unitslabel(8) = ' [erg/g]' units(9) = umass unitslabel(9) = ' [g]' units(10) = umass/udistcm**3 unitslabel(10) = ' [g/cm^3]' else call make_vector_label('force',13,ndimV,iamvec,labelvec,label,labelcoord(:,1)) label(16) = 'dgrav' if (ncolumns > 16) then label(11) = 'temperature [ 10^6 K ]' do i=17,ncolumns write(label(i),"('species ',i2)") i-16 enddo if (ncolumns >= 25) then label(17) = 'He' label(18) = 'C' label(19) = 'O' label(20) = 'Ne' label(21) = 'Mg' label(22) = 'Si' label(23) = 'Fe' label(24) = 'mean A' label(25) = 'mean Z' endif endif udistcm = 1.0e9 utime = 2.7443 umass = 1.99e33 uvelkms = (udistcm/utime)/1e5 units(1:3) = 1.0 !!udistcm unitslabel(1:3) = ' [10^9 cm]' units(4:6) = uvelkms unitslabel(4:6) = ' [km/s]' units(ih) = units(1) unitslabel(ih) = unitslabel(1) units(8) = (udistcm/utime)**2 unitslabel(8) = ' [erg/g]' units(9) = umass unitslabel(9) = ' [g]' units(10) = umass/udistcm**3 unitslabel(10) = ' [g/cm^3]' endif endif units(0) = utime*1000. unitslabel(0) = ' ms' call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) call make_vector_label('B',iBfirst,ndimV,iamvec,labelvec,label,labelcoord(:,1)) if (iBfirst /= 0) label(idivB) = 'div B' label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = '\gr' if (iutherm > 0) label(iutherm) = 'u' label(ih) = 'h ' label(ipmass) = 'particle mass' ! !--set labels for each particle type ! ntypes = 2 !!maxparttypes labeltype(1) = 'gas' labeltype(2) = 'point mass' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. end subroutine set_labels_sro end module readdata_sro danieljprice-splash-4d1f09c/src/read_data_starsmasher.f90000066400000000000000000000216041477365367100235240ustar00rootroot00000000000000!------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR OUTPUT FROM THE STARSMASHER CODE ! !------------------------------------------------------------------------- module readdata_starsmasher implicit none public :: read_data_starsmasher, set_labels_starsmasher private integer :: frame = -1 ! default value of -1 contains subroutine read_data_starsmasher(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,iamtype,npartoftype,time,gamma,headervals,& maxpart,maxcol,maxstep use params use settings_data, only:ndim,ndimV,ncolumns,ncalc,iformat,required,ipartialread use mem_allocation, only:alloc use labels, only:ih,irho,headertags use system_utils, only:renvironment,lenvironment use prompting, only:prompt integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,j,ierr integer :: ncolstep,npart_max,nstep_max,ntoti logical :: iexist,reallocate real(doub_prec) :: timetemp,dummy integer :: ntot, nnopt, nout, nit, nav, ngr, nrelax real(doub_prec) :: hmin, hmax, sep0, tf, dtout, alpha, beta, eta2, trelax, dt, omega2 real(doub_prec) :: dx, dy, dz, dm, dh, drho, dvx, dvy, dvz, dudot real(doub_prec) :: duth, dmmu real(doub_prec) :: theta real(doub_prec) :: gram, sec, cm, kelvin, erg, boltz parameter(gram=1.d0,sec=1.d0,cm=1.d0,kelvin=1.d0) parameter(erg=gram*cm**2/sec**2) parameter(boltz=1.380658d-16*erg/kelvin) real(doub_prec) :: munit, runit, gravconst parameter(munit=1.9891d33,runit=6.9599d10) parameter(gravconst = 6.67390d-08) nstepsread = 0 npart_max = maxpart if (len_trim(rootname).gt.0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! inquire(file=datfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(datfile)//': file not found ***' return endif ! !--set parameters which do not vary between timesteps ! ndim = 3 ndimV = 3 ! !--read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open data file and read data ! open(11,iostat=ierr,file=datfile,status='old',form='unformatted') if (ierr /= 0) then print "(a)", '*** ERROR OPENING FILE ***' return endif ! !--read header for this timestep ! read(11, iostat = ierr) & ntot, nnopt, hmin, hmax, sep0, tf, dtout, nout, nit, timetemp, & nav, alpha, beta, eta2, ngr, nrelax, trelax, dt, omega2 if (omega2 > 0.d0 .and. frame == -1) then ! frame can equal -1 only the first time through, so this question ! will get asked (at most) only once print *, 'Period of rotating frame=',8*atan(1.d0)/omega2**0.5d0 frame = 0 call prompt('Do you want movie in the inertial frame? (1=yes)',frame,0,1) endif if (frame.eq.-1) frame=0 if (ierr /= 0) then print "(a)", '*** ERROR READING TIMESTEP HEADER ***' return endif iformat = 0 ncolstep = 13 ! 3 x pos, 3 x vel, pmass, rho, utherm, mean_mu, h, du/dt, temperature ncolumns = ncolstep irho = 8 ih = ncolstep ntoti = ntot !int(sum(npartoftypei(1:6))) print*,'time : ',timetemp print*,'N_total : ',ntoti print*,'N data columns : ',ncolstep ! !--if successfully read header, increment the nstepsread counter ! nstepsread = nstepsread + 1 ! !--now read data ! reallocate = .false. npart_max = maxpart nstep_max = max(maxstep,1) if (ntoti.gt.maxpart) then reallocate = .true. if (maxpart.gt.0) then ! if we are reallocating, try not to do it again npart_max = int(1.1*ntoti) else ! if first time, save on memory npart_max = int(ntoti) endif endif if (i.ge.maxstep .and. i.ne.1) then nstep_max = i + max(10,INT(0.1*nstep_max)) reallocate = .true. endif ! !--reallocate memory for main data array ! if (reallocate .or. .not.(allocated(dat))) then call alloc(npart_max,nstep_max,max(ncolstep+ncalc,maxcol),mixedtypes=.true.) endif ! !--copy header into header arrays ! npartoftype(:,i) = 0 ! !--set time to be used in the legend ! time(i) = real(timetemp) ! !--store other quantities from the file header ! headertags(1:18) = (/'ntot ','nnopt ','hmin ','hmax ',& 'sep0 ','tf ','dtout ','nout ',& 'nit ','nav ','alpha ','beta ',& 'eta2 ','ngr ','nrelax','trelax',& 'dt ','omega2'/) headervals(1:18,i) = (/real(ntot),real(nnopt),real(hmin),real(hmax),& real(sep0),real(tf),real(dtout),real(nout),& real(nit),real(nav),real(alpha),real(beta), & real(eta2),real(ngr),real(nrelax),real(trelax),& real(dt),real(omega2)/) ! !--read particle data ! if (ntoti.gt.0) then ! !--read particles' data ! do j=1,ntot read(11, iostat = ierr) & dx, dy, dz, & ! positions dm, & ! mass dh, drho, & ! h & rho dvx, dvy, dvz, & ! velocities dummy, dummy, dummy, & ! vxdot, vydot, vzdot duth, & ! uthermal dudot, & ! udot dummy, & ! dummy, dummy, dummy, & ! gx, gy, gz, gpot dmmu, & ! mean_mu dummy, dummy!, dummy, dummy ! aa, bb, cc, divv if(frame.eq.1) then theta=omega2**0.5d0*timetemp ! rotation is counterclockwise: dat(j,1,i)=dx*cos(theta)-dy*sin(theta) dat(j,2,i)=dx*sin(theta)+dy*cos(theta) dat(j,4,i)=dvx*cos(theta)-dvy*sin(theta) dat(j,5,i)=dvx*sin(theta)+dvy*cos(theta) else dat(j,1,i) = dx dat(j,2,i) = dy dat(j,4,i) = dvx dat(j,5,i) = dvy endif dat(j,3,i) = dz dat(j,6,i) = dvz dat(j,7,i) = dm dat(j,8,i) = drho dat(j,9,i) = duth dat(j,10,i) = dmmu dat(j,11,i) = dh dat(j,12,i) = dudot dat(j,13,i) = duth*gravconst*munit/runit/(1.5d0*boltz/dmmu) if (abs(duth) > tiny(duth)) then iamtype(j,i) = 1 npartoftype(1,i) = npartoftype(1,i)+1 else iamtype(j,i) = 2 npartoftype(2,i) = npartoftype(2,i)+1 endif end do ! pos = 1,2,3 ! vel = 4,5,6 ! mass = 7 ! rho, u, mean_mu, h = 8, 9, 10, 11 else ntoti = 1 npartoftype(1,i) = 1 dat(:,:,i) = 0. endif ! !--now memory has been allocated, set arrays which are constant for all time ! gamma = 5./3. ! !--set flag to indicate that only part of this file has been read ! if (.not.all(required(1:ncolstep))) ipartialread = .true. ! !--close data file and return ! close(unit=11) if (nstepsread.gt.0) then print*,'>> last step ntot =',sum(npartoftype(:,istepstart+nstepsread-1)) endif return end subroutine read_data_starsmasher !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_starsmasher use labels, only:label,iamvec,labelvec,labeltype,ix,ivx,ipmass,ih,& irho,ipr,iutherm,make_vector_label use params use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord use system_utils, only:renvironment integer :: i if (ndim.le.0 .or. ndim.gt.3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels ***' return endif if (ndimV.le.0 .or. ndimV.gt.3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ipmass = 7 irho = 8 ! location of rho in data array ipr = 0 iutherm = 9 ! thermal energy ih = 11 label(ix(1:ndim)) = labelcoord(1:ndim,1) label(irho) = 'density' label(iutherm) = 'specific internal energy u' label(ih) = 'h' label(10) = 'mean_mu' label(ipmass) = 'particle mass' label(12) = 'du/dt' label(13) = 'temperature' ! !--set labels for vector quantities ! call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--set labels for each particle type ! ntypes = 2 labeltype(1) = 'gas' labeltype(2) = 'compact object' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. end subroutine set_labels_starsmasher end module readdata_starsmasher danieljprice-splash-4d1f09c/src/read_data_tipsy.F90000066400000000000000000000376471477365367100223160ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING TIPSY FILES ! ! => HANDLES BOTH BINARY AND ASCII TIPSY FORMATS ! (DETECTS WHICH ONE AUTOMATICALLY) ! ! BINARY FORMAT READING REQUIRES F2003 STREAM I/O ! WHICH MAY NOT BE IMPLEMENTED ON OLDER COMPILERS ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_tipsy use settings_data, only:debugmode use byteswap, only:bs implicit none public :: read_data_tipsy, set_labels_tipsy, file_format_is_tipsy private contains subroutine read_data_tipsy(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,time,npartoftype,gamma,maxpart use params use settings_data, only:ndim,ndimV,ncolumns use mem_allocation, only:alloc use labels, only:label,ih,ipmass,irho,ivx integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer, parameter :: iunit = 16 integer :: j,ierr integer :: nprint,ngas,ndark,nptmass,npart_max,nstep_max integer :: ncol,nread,iambinaryfile logical :: iexist,do_byteswap character(len=len(rootname)) :: dumpfile character(len=11) :: fmt real :: timei, hfact nstepsread = 0 nstep_max = 0 npart_max = maxpart dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif nstep_max = max(nstep_max,indexstart,1) j = indexstart nstepsread = 0 write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--determine whether file is binary or ascii and open it ! inquire(file=dumpfile,form=fmt) select case(trim(adjustl(fmt))) case('UNFORMATTED') iambinaryfile = 1 open(unit=iunit,file=dumpfile,status='old',form='unformatted',access='stream',iostat=ierr) case('FORMATTED') iambinaryfile = 0 open(unit=iunit,file=dumpfile,status='old',form='formatted',iostat=ierr) case default !--if compiler cannot distinguish the two, try ascii first, then binary iambinaryfile = -1 open(unit=iunit,file=dumpfile,status='old',form='formatted',iostat=ierr) end select if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return endif ! !--read the file header ! try ascii format first, and if unsuccessful try binary ! if (iambinaryfile==1) then write(*,"(a)",advance='no') ' reading binary tipsy format:' call read_tipsyheader_binary(iunit,do_byteswap,ierr) else if (iambinaryfile==0) print "(a)",' reading ascii tipsy format ' call read_tipsyheader_ascii(iunit,ierr,iambinaryfile) if (iambinaryfile < 0) then if (ierr==0) then !--if successful ascii header read, file is ascii iambinaryfile = 0 print "(a)",' reading ascii tipsy format ' else !--otherwise, close ascii file, and assume file is binary close(unit=iunit) iambinaryfile = 1 open(unit=iunit,file=dumpfile,status='old',form='unformatted',& access='stream',iostat=ierr) write(*,"(a)",advance='no') ' reading binary tipsy format:' call read_tipsyheader_binary(iunit,do_byteswap,ierr) endif endif endif if (ierr /= 0) then print* ndim = 0 ncolumns = 0 close(unit=iunit) return endif print "(a,f10.2,1(a,i1))",' time: ',timei,' ndim: ',ndim print "(4(a,i10))",' ntot: ',nprint,' ngas: ',ngas,' ndark: ',ndark,' nstar: ',nptmass ndimV = ndim ncol = 2*ndim + 4 ncolumns = ncol ! !--allocate memory ! if (.not.allocated(dat) .or. nprint > npart_max) then npart_max = max(npart_max,nprint) call alloc(npart_max,nstep_max,ncolumns) endif ! !--now read the timestep data in the dumpfile ! dat(:,:,j) = 0. time(j) = timei nread = 0 call set_labels_tipsy if (iambinaryfile==1) then call read_tipsybody_binary(iunit,do_byteswap,ierr,nread) else call read_tipsybody_ascii(iunit,ierr,nread) endif close(unit=iunit) if (nread < ncol) then print "(a,i2)",' WARNING: END OF FILE: READ TO COLUMN ',nread ncolumns = nread endif ! !--often tipsy dumps contain only a (fixed) gravitational softening length ! for sph particles. In this case we need to create a sensible smoothing length ! (and warn about the evils of using fixed softening lengths for sph particles) ! if (ngas >= 0 .and. nread >= irho .and. all(abs(dat(1:ngas,ih,j)-dat(1,ih,j)) <= tiny(dat))) then hfact=1.2 print "(a)",' WARNING: fixed softening lengths detected: simulation may contain artificial fragmentation!' print "(a,f5.2,a,i1,a)",' : creating SPH smoothing lengths using h = ',hfact,'*(m/rho)**(1/',ndim,')' dat(1:ngas,ih,j) = hfact*(dat(1:ngas,ipmass,j)/(dat(1:ngas,irho,j) + tiny(dat)))**(1./ndim) endif nstepsread = nstepsread + 1 npartoftype(1,j) = ngas npartoftype(2,j) = ndark npartoftype(3,j) = nptmass gamma(j) = 1.666666666667 j = j + 1 if (allocated(npartoftype)) then print*,'>> end of dump file: nsteps =',j-1,'ntot = ',sum(npartoftype(:,j-1)) endif return contains !---------------------------------------------------- ! ascii header read !---------------------------------------------------- subroutine read_tipsyheader_ascii(iunit,ierr,iwarn) integer, intent(in) :: iunit,iwarn integer, intent(out) :: ierr read(iunit,*,end=55,iostat=ierr) nprint,ngas,nptmass read(iunit,*,end=55,iostat=ierr) ndim read(iunit,*,end=55,iostat=ierr) timei ndark = nprint - ngas - nptmass !--errors in header read if (nprint <= 0 .or. nprint > 1e10 .or. ndim <= 0 .or. ndim > 3 .or. ndark < 0) then if (iwarn >= 0) print "(a)",' ERROR reading ascii file header ' ierr = 2 return endif return 55 continue if (iwarn >= 0) print "(a)",' ERROR: end of file in ascii header read ' ierr = -1 return end subroutine read_tipsyheader_ascii !---------------------------------------------------- ! binary header read !---------------------------------------------------- subroutine read_tipsyheader_binary(iunitb,do_byteswap,ierr) integer, intent(in) :: iunitb logical, intent(out) :: do_byteswap integer, intent(out) :: ierr real(doub_prec) :: timedb integer :: ipad ierr = 0 do_byteswap = .false. read(iunitb,iostat=ierr,end=55) timedb,nprint,ndim,ngas,ndark,nptmass,ipad if (debugmode) print*,'header = ',timedb,nprint,ndim,ngas,ndark,nptmass !--check for wrong endianness and byte-swap if necessary if (ierr /= 0 .or. timedb < 0. .or. bad_header(ndim,nprint,ngas,ndark,nptmass)) then timedb = bs(timedb); ndim = bs(ndim); nprint = bs(nprint); ngas = bs(ngas) ndark = bs(ndark); nptmass = bs(nptmass) if (ierr /= 0 .or. timedb < 0. .or. & bad_header(ndim,nprint,ngas,ndark,nptmass)) then print "(a)",' ERROR reading binary file header' ierr = 2 else do_byteswap = .true. write(*,"(a)",advance='no') ' big endian: ' endif endif timei = real(timedb) if (ndim==0) ndim = 3 return 55 continue print "(a)",' ERROR: end of file in binary header read' ierr = -1 end subroutine read_tipsyheader_binary !---------------------------------------------------- ! ascii body read !---------------------------------------------------- subroutine read_tipsybody_ascii(iunit,ierr,nread) integer, intent(in) :: iunit integer, intent(out) :: ierr, nread integer :: i,ic,icol,nerr !--pmass,x,y,z,vx,vy,vz do ic=1,2*ndim+1 nerr = 0 nread = nread + 1 if (ic==1) then ! pmass icol = ndim + 1 elseif (ic >= 2 .and. ic <= ndim+1) then ! x, y, z icol = ic - 1 else ! everything after icol = ic endif !print "(1x,a)",trim(label(icol)) nerr = 0 do i=1,nprint read(iunit,*,end=44,iostat=ierr) dat(i,icol,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,'*** WARNING: ERRORS READING '//trim(label(icol))//' ON ',nerr,' LINES' enddo !--h dark matter if (ndark > 0) then nerr = 0 do i=ngas+1,ngas+ndark-1 read(iunit,*,end=44,iostat=ierr) dat(i,ih,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,'*** WARNING: ERRORS READING DARK MATTER H ON ',nerr,' LINES' endif !--h star particles if (nptmass > 0) then nerr = 0 do i=ngas+ndark+1,ngas+ndark+nptmass read(iunit,*,end=44,iostat=ierr) dat(i,ih,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,'*** WARNING: ERRORS READING PTMASS H ON ',nerr,' LINES' endif !--density, temperature, sph smoothing length do icol=2*ndim+2,ncol nread = nread + 1 !print "(1x,a)",trim(label(icol)) do i=1,ngas read(iunit,*,end=44,iostat=ierr) dat(i,icol,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,'*** WARNING: ERRORS READING '//trim(label(icol))//' ON ',nerr,' LINES' enddo ierr = 0 return 44 continue ierr = -1 end subroutine read_tipsybody_ascii !---------------------------------------------------- ! binary body read !---------------------------------------------------- subroutine read_tipsybody_binary(iunitb,do_byteswap,ierr,nread) use settings_data, only:debugmode integer, intent(in) :: iunitb logical, intent(in) :: do_byteswap integer, intent(out) :: ierr,nread integer :: i,nerr real(kind=4) :: pmass,xyz(3),vxyz(3),rho,temp,h,dummy !--gas particles nerr = 0 if (debugmode) print*,'DEBUG: reading ',ngas,' gas particles' do i=1,ngas !--pmass,x,y,z,vx,vy,vz,rho,temp,h read(iunitb,end=44,iostat=ierr) pmass,xyz(1:ndim),vxyz(1:ndim),& rho,temp,h,dummy,dummy if (do_byteswap) then pmass = bs(pmass); xyz = bs(xyz); vxyz = bs(vxyz); rho = bs(rho) temp = bs(temp); h = bs(h) endif dat(i,ipmass,j) = pmass dat(i,1:ndim,j) = xyz(1:ndim) dat(i,ivx:ivx+ndim-1,j) = vxyz(1:ndim) dat(i,irho,j) = rho dat(i,irho+1,j) = temp dat(i,ih,j) = h if (ierr /= 0) nerr = nerr + 1 enddo nread = ncolumns if (nerr > 0) print *,'*** WARNING: ERRORS READING GAS PARTICLES ON ',nerr,' LINES' !--dark matter if (ndark > 0) then nerr = 0 do i=ngas+1,ngas+ndark !--only read as far as velocities, then eps as smoothing length read(iunitb,end=44,iostat=ierr) pmass,xyz,vxyz,h,dummy if (do_byteswap) then pmass = bs(pmass); xyz = bs(xyz); vxyz = bs(vxyz); h = bs(h) endif dat(i,ipmass,j) = pmass dat(i,1:ndim,j) = xyz(1:ndim) dat(i,ivx:ivx+ndim-1,j) = vxyz(1:ndim) dat(i,ih,j) = h if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,'*** WARNING: ERRORS READING DARK MATTER PARTICLES ON ',nerr,' LINES' endif !--star particles if (nptmass > 0) then nerr = 0 do i=ngas+ndark+1,ngas+ndark+nptmass !--only read as far as velocities, then eps as smoothing length read(iunitb,end=44,iostat=ierr) pmass,xyz(1:ndim),vxyz(1:ndim),& dummy,dummy,h,dummy if (do_byteswap) then pmass = bs(pmass); xyz = bs(xyz); vxyz = bs(vxyz); h = bs(h) endif dat(i,ipmass,j) = pmass dat(i,1:ndim,j) = xyz(1:ndim) dat(i,ivx:ivx+ndim-1,j) = vxyz(1:ndim) dat(i,ih,j) = h if (ierr /= 0) nerr = nerr + 1 enddo if (nerr > 0) print *,'*** WARNING: ERRORS READING STAR PARTICLES ON ',nerr,' LINES' endif ierr = 0 return 44 continue ierr = -1 end subroutine read_tipsybody_binary end subroutine read_data_tipsy !-------------------------------------------------------- ! function to check if values read from ! the tipsy header are sensible !-------------------------------------------------------- logical function bad_header(ndim,nprint,ngas,ndark,nptmass) integer, intent(in) :: ndim,nprint,ngas,ndark,nptmass bad_header = (ndim < 0 .or. ndim > 3 & .or. nprint <= 0 .or. ngas < 0 .or. ndark < 0 .or. nptmass < 0 & .or. nprint > 1e10 .or. ngas > 1.e10 & .or. ndark > 1.e10 .or. nptmass > 1.e8 ) end function bad_header !----------------------------------------------------------- ! ! check if a file is in phantom/sphNG format ! !----------------------------------------------------------- logical function file_format_is_tipsy(filename) result(is_tipsy) character(len=*), intent(in) :: filename integer :: iunit,nprint,ndim,ngas,ndark,nptmass,ierr real(kind=8) :: timedb is_tipsy = .false. ! ! open file and read the first line ! open(newunit=iunit,iostat=ierr,file=filename,status='old',form='unformatted',access='stream') if (ierr /= 0) return ! ! check the first line to determine tipsy format ! read(iunit,iostat=ierr) timedb,nprint,ndim,ngas,ndark,nptmass if (.not.(ierr /= 0 .or. timedb < 0. .or. & bad_header(ndim,nprint,ngas,ndark,nptmass))) then is_tipsy = .true. elseif (.not. ierr /= 0) then ! try byte-swapping timedb = bs(timedb); ndim = bs(ndim); nprint = bs(nprint); ngas = bs(ngas) ndark = bs(ndark); nptmass = bs(nptmass) if (.not. (timedb < 0. .or. bad_header(ndim,nprint,ngas,ndark,nptmass))) then is_tipsy = .true. endif endif close(iunit) ! close the file end function file_format_is_tipsy !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_tipsy use labels, only:label,labelvec,labeltype,iamvec,& ix,ivx,ih,irho,ipmass,make_vector_label use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_tipsy ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_tipsy ***' return endif do i=1,ndim ix(i) = i enddo ipmass = ndim + 1 ivx = ndim + 2 irho = ivx + ndim !iutherm = irho + 1 label(irho+1) = 'temperature' ih = irho + 2 label(ix(1:ndim)) = labelcoord(1:ndim,1) label(ih) = 'h' !if (iutherm > 0) label(iutherm) = 'temperature' label(ipmass) = 'particle mass' label(irho) = 'density' call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--set labels for each particle type ! ntypes = 3 labeltype(1) = 'gas' labeltype(2) = 'dark matter' labeltype(3) = 'star' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. UseTypeInRenderings(3) = .false. end subroutine set_labels_tipsy end module readdata_tipsy danieljprice-splash-4d1f09c/src/read_data_urban.f90000066400000000000000000000221171477365367100222770ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT FROM ANDREA URBAN'S CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_urban implicit none public :: read_data_urban, set_labels_urban private contains subroutine read_data_urban(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,maxpart,maxcol,maxstep,time,gamma use params use settings_data, only:ndim,ndimV,ncolumns,ncalc use mem_allocation, only:alloc !use system_utils, only:lenvironment,ienvironment use asciiutils, only:get_ncolumns integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,ierr,lab,icol,ilen integer :: nprint,npart_max,nstep_max integer :: ncol,nerr,nheaderlines logical :: iexist,timeset,gammaset real :: dummyreal character(len=len(rootname)+5) :: dumpfile integer, parameter :: iunit = 15 nstepsread = 0 nstep_max = 0 npart_max = maxpart dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 !--number of columns to read from file ! this is determined automatically !ncol = 13 j = indexstart nstepsread = 0 print "(a)",' reading Andrea Urban ascii file format' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the file and read the number of particles ! open(unit=iunit,file=dumpfile,status='old',form='formatted',iostat=ierr) if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return else call get_ncolumns(iunit,ncol,nheaderlines) ncol = max(ncol - 1,0) if (ncol <= 0) then print "(a,/)",' *** no data read from file ***' return endif ! !--allocate memory initially ! nprint = 10001 nstep_max = max(nstep_max,indexstart,1) if (.not.allocated(dat) .or. (nprint > npart_max) .or. (ncol+ncalc) > maxcol) then npart_max = max(npart_max,nprint) call alloc(npart_max,nstep_max,ncol+ncalc) endif endif npart_max = max(npart_max,nprint) ncolumns = ncol ! !--allocate/reallocate memory if j > maxstep ! if (j > maxstep) then call alloc(maxpart,j+1,maxcol) endif ! !--read header lines, try to use it to set time ! timeset = .false. gammaset = .false. if (nheaderlines > 0) then print*,'skipping ',nheaderlines,' header lines' do i=1,nheaderlines read(iunit,*,iostat=ierr) dummyreal if (timeset .and. .not.gammaset .and. ierr==0 & .and. dummyreal > 0.999999 .and. dummyreal < 2.000001) then print*,'setting gamma = ',dummyreal,' from header line ',i gamma(j) = dummyreal gammaset = .true. endif if (ierr==0 .and. .not. timeset) then time(j) = dummyreal timeset = .true. print*,'setting time = ',dummyreal,' from header line ',i endif enddo endif ! !--now read the timestep data in the dumpfile ! dat(:,:,j) = 0. ! time(j) = -1.0 ! time not read ! !--now read the timestep data in the dumpfile ! i = 0 ierr = 0 nerr = 0 overparts: do while (ierr >= 0) i = i + 1 if (i > npart_max) then ! reallocate memory if necessary npart_max = 10*npart_max call alloc(npart_max,nstep_max,ncol+ncalc) endif read(iunit,*,iostat=ierr) (dat(i,icol,j),icol = 1,10),lab,(dat(i,icol,j),icol=11,ncol) if (ierr > 0) then nerr = nerr + 1 if (nerr <= 10) print "(a,i8,a)",' ERROR reading data from line ',i+nheaderlines,', skipping' i = i - 1 ! ignore lines with errors endif enddo overparts close(iunit) nprint = i - 1 nstepsread = nstepsread + 1 if (nerr > 10) then print "(a,i8,a)",' *** WARNING: errors whilst reading file on ',nerr,' lines: skipped these ***' endif if (ierr < 0) then print*,'end of file: npart = ',nprint endif npartoftype(:,j) = 0 npartoftype(1,j) = nprint ! !--now open the sink particle file and read it ! !--find the last underscore in the file name ilen = index(rootname,'_',back=.true.) if (ilen <= 0) ilen = len_trim(rootname) + 1 dumpfile = rootname(1:ilen-1)//'_S' inquire(file=trim(dumpfile),exist=iexist) if (iexist) then open(unit=iunit+1,file=trim(dumpfile),form='formatted',status='old',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR: could not open sink particle file '//trim(dumpfile) else i = npartoftype(1,j) ierr = 0 nerr = 0 oversinks: do while (ierr >= 0) i = i + 1 if (i > npart_max) then ! reallocate memory if necessary npart_max = npart_max + 1000 call alloc(npart_max,nstep_max,ncol+ncalc) endif read(iunit+1,*,iostat=ierr) (dat(i,icol,j),icol = 1,10) if (ierr > 0) then nerr = nerr + 1 if (nerr <= 10) print "(a,i8,a)",' ERROR reading sink data from line ',i+nheaderlines,', skipping' i = i - 1 ! ignore lines with errors endif enddo oversinks endif npartoftype(2,j) = i - 1 - npartoftype(1,j) print "(a,i8,a)",' read ',npartoftype(2,j),' sink particles from '//trim(dumpfile) close(iunit+1) else print "(a)",' sink particle file ('//trim(dumpfile)//') not present' endif ! !--look for a _t file for the time (interim measure) ! dumpfile = rootname(1:ilen-1)//'_t' inquire(file=trim(dumpfile),exist=iexist) if (iexist) then open(unit=iunit+2,file=trim(dumpfile),form='formatted',status='old',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR: could not open time file '//trim(dumpfile) else read(iunit+2,*,iostat=ierr) time(j) if (ierr /= 0) then print "(a)",' ERROR reading time from file '//trim(dumpfile) else print*,' got time = ',time(j),' from file '//trim(dumpfile) endif endif close(iunit+2) endif return end subroutine read_data_urban !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_urban use labels, only:label,labelvec,labeltype,iamvec,& ix,ivx,ih,irho,iutherm,ipmass,make_vector_label use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord !use settings_units, only:units,unitslabel integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_urban ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_urban ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ipmass = 7 ih = 8 irho = 9 iutherm = 10 label(ix(1:ndim)) = labelcoord(1:ndim,1) label(ipmass) = 'particle mass' label(ih) = 'h' label(irho) = 'density' if (iutherm > 0) label(iutherm) = 'u' label(11) = 't_{dust}' label(12) = 'N_{col}' label(13) = 'N_{loc}' call make_vector_label('v',ivx,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! !--set labels for each particle type ! ntypes = 2 labeltype(1) = 'gas' labeltype(2) = 'sink' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .false. !----------------------------------------------------------- return end subroutine set_labels_urban end module readdata_urban danieljprice-splash-4d1f09c/src/read_data_vanaverbeke.f90000066400000000000000000000204141477365367100234570ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING UNFORMATTED OUTPUT ! FROM SIGFRIED VANAVERBEKE'S CODE ! (ie. STRAIGHT FROM THE DATA DUMP) ! ! SOME CHOICES FOR THIS FORMAT CAN BE SET USING THE FOLLOWING ! ENVIRONMENT VARIABLES: ! ! VSPLASH_SINGLEPREC if 'YES' or 'TRUE' then assumes data is single precision ! VSPLASH_NCOL to change the number of columns read from the file, ! e.g. setenv VSPLASH_NCOL=13 ! ! the data is stored in the global array dat ! ! >> this subroutine must return values for the following: << ! ! ncolumns : number of data columns ! ndim, ndimV : number of spatial, velocity dimensions ! nstepsread : number of steps read from this file ! ! maxplot,maxpart,maxstep : dimensions of main data array ! dat(maxplot,maxpart,maxstep) : main data array ! ! npartoftype(1:6,maxstep) : number of particles of each type in each timestep ! ! time(maxstep) : time at each step ! gamma(maxstep) : gamma at each step ! ! most of these values are stored in global arrays ! in the module 'particle_data' !------------------------------------------------------------------------- module readdata_vanaverbeke implicit none public :: read_data_vanaverbeke, set_labels_vanaverbeke private contains subroutine read_data_vanaverbeke(rootname,indexstart,ipos,nstepsread) use particle_data, only:dat,time,npartoftype,gamma,maxpart use params use settings_data, only:ndim,ndimV,ncolumns use mem_allocation, only:alloc use system_utils, only:lenvironment,ienvironment integer, intent(in) :: indexstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname integer :: i,j,k,ierr integer :: nprint,ntotal,npart_max,nstep_max integer :: ncol,nread,nerr,ncoltemp,nsink,nsinkcol,nacc logical :: iexist,doubleprec integer, parameter :: iunit = 15 character(len=len(rootname)) :: dumpfile real :: timei,gammai real(doub_prec), dimension(maxplot) :: datdb real(doub_prec) :: timedb,gammadb nstepsread = 0 nstep_max = 0 npart_max = maxpart dumpfile = trim(rootname) ! !--check if first data file exists ! inquire(file=dumpfile,exist=iexist) if (.not.iexist) then print "(a)",' *** error: '//trim(dumpfile)//': file not found ***' return endif ! !--fix number of spatial dimensions ! ndim = 3 ndimV = 3 !--number of columns to read from file ncol = 10 nsinkcol = 7 doubleprec = .true. !--can override these settings with environment variables if (lenvironment('VSPLASH_SINGLEPREC')) doubleprec = .false. ncoltemp = ienvironment('VSPLASH_NCOL') if (ncoltemp > 0) ncol = ncoltemp ! !--allocate memory initially ! nstep_max = max(nstep_max,indexstart,1) j = indexstart nstepsread = 0 print "(a)",' reading Vanaverbeke format...' write(*,"(26('>'),1x,a,1x,26('<'))") trim(dumpfile) ! !--open the (unformatted) binary file and read the number of particles ! open(unit=iunit,file=dumpfile,status='old',form='unformatted',iostat=ierr) if (ierr /= 0) then print "(a)",'*** ERROR OPENING '//trim(dumpfile)//' ***' return else timei = 0. read(iunit,iostat=ierr) nprint,nacc,nsink print "(3(a,i10))",'npart:',nprint,' naccreted:',nacc,' nsinks:',nsink if (doubleprec) then read(iunit,iostat=ierr) timedb,gammadb timei = real(timedb) gammai = real(gammadb) else read(iunit,iostat=ierr) timei,gammai endif print "(2(a,1pe12.3))",'time:',timei,' gamma:',gammai !--barf if stupid values read if (nprint < 0 .or. nacc < 0 .or. nsink < 0 .or. nsink > 1e7) then print "(a)",' *** ERROR IN TIMESTEP HEADER: WRONG ENDIAN? (or old header format)?' close(iunit) return elseif (ierr /= 0) then print "(a)",'*** ERROR READING TIMESTEP HEADER: WRONG ENDIAN? ***' close(iunit) return endif if (timei < 0. .or. gammai < 1.0 .or. gammai > 2.0) then print*,'*** ERROR IN HEADER: strange time and/or gamma read: wrong precision?' endif ncolumns = ncol ntotal = nprint + nsink if (.not.allocated(dat) .or. ntotal > npart_max) then npart_max = max(npart_max,ntotal) call alloc(npart_max,nstep_max,ncolumns) endif ! !--now read the timestep data in the dumpfile ! dat(:,:,j) = 0. time(j) = timei gamma(j) = gammai if (doubleprec) then nerr = 0 nread = 0 do i=1,nprint nread = nread + 1 read(iunit,end=44,iostat=ierr) (datdb(k),k=1,ncol) if (ierr /= 0) then nerr = nerr + 1 else dat(i,1:ncol,j) = real(datdb(1:ncol)) endif enddo do i=nprint+1,nprint+nsink nread = nread + 1 read(iunit,end=44,iostat=ierr) (datdb(k),k=1,nsinkcol) if (ierr /= 0) then nerr = nerr + 1 else dat(i,1:nsinkcol,j) = real(datdb(1:nsinkcol)) endif enddo else nerr = 0 nread = 0 do i=1,nprint nread = nread + 1 read(iunit,end=44,iostat=ierr) dat(i,1:ncol,j) if (ierr /= 0) nerr = nerr + 1 enddo do i=nprint+1,nprint+nsink nread = nread + 1 read(iunit,end=44,iostat=ierr) dat(i,1:nsinkcol,j) if (ierr /= 0) nerr = nerr + 1 enddo endif goto 45 44 continue print "(a,i10)",' WARNING: END-OF-FILE AT LINE ',nread 45 continue if (nerr > 0) print *,'*** WARNING: ERRORS DURING READ ON ',nerr,' LINES' nstepsread = nstepsread + 1 npartoftype(1,j) = nprint - nacc npartoftype(2,j) = nacc npartoftype(3,j) = nsink j = j + 1 endif close(iunit) if (allocated(npartoftype)) then print*,'>> end of dump file: nsteps =',j-1,'ntot = ',sum(npartoftype(:,j-1)) endif return end subroutine read_data_vanaverbeke !!------------------------------------------------------------ !! set labels for each column of data !!------------------------------------------------------------ subroutine set_labels_vanaverbeke use labels, only:label,labelvec,labeltype,iamvec,& ix,ivx,ih,irho,iutherm,ipmass,ispsound use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings use geometry, only:labelcoord !use settings_units, only:units,unitslabel integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_vanaverbeke ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_vanaverbeke ***' return endif do i=1,ndim ix(i) = i enddo ivx = 4 ipmass = 7 ih = ipmass + 1 iutherm = ih + 1 irho = iutherm + 1 ispsound = 0 label(ix(1:ndim)) = labelcoord(1:ndim,1) label(ih) = 'h' if (irho > 0) label(irho) = '\gr' if (ipmass > 0) label(ipmass) = 'particle mass' if (iutherm > 0) label(iutherm) = 'u' if (ispsound > 0) label(ispsound) = 'c_s' if (ivx /= 0) then iamvec(ivx:ivx+ndimV-1) = ivx labelvec(ivx:ivx+ndimV-1) = 'v' do i=1,ndimV label(ivx+i-1) = trim(labelvec(ivx))//'\d'//trim(labelcoord(i,1)) enddo endif ! !--set labels for each particle type ! ntypes = 3 labeltype(1) = 'gas' labeltype(2) = 'accreted/dead' labeltype(3) = 'sink' UseTypeInRenderings(1) = .true. UseTypeInRenderings(2) = .true. UseTypeInRenderings(3) = .false. !----------------------------------------------------------- return end subroutine set_labels_vanaverbeke end module readdata_vanaverbeke danieljprice-splash-4d1f09c/src/read_data_vtk.f90000066400000000000000000000306371477365367100220020ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2023- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------- ! this subroutine reads from the data file(s) ! change this to change the format of data input ! ! THIS VERSION IS FOR READING VTK FILES ! !------------------------------------------------------------------------- module readdata_vtk use params, only:maxplot implicit none public :: read_data_vtk, set_labels_vtk character(len=32) :: tagarr(maxplot) private contains subroutine read_data_vtk(rootname,istepstart,ipos,nstepsread) use particle_data, only:dat,npartoftype,masstype,maxcol,maxpart,headervals use settings_data, only:ndim,ndimV,ncolumns,ncalc,ipartialread,iverbose use mem_allocation, only:alloc use labels, only:ih,irho,ipmass,headertags use system_utils, only:get_command_option use asciiutils, only:get_value,numfromfile integer, intent(in) :: istepstart,ipos integer, intent(out) :: nstepsread character(len=*), intent(in) :: rootname character(len=len(rootname)+10) :: datfile integer :: i,ierr integer :: ncolstep,npart,nsteps_to_read logical :: iexist,reallocate,is_binary real, allocatable :: pmass(:) real :: hfac nstepsread = 0 nsteps_to_read = 1 if (len_trim(rootname) > 0) then datfile = trim(rootname) else print*,' **** no data read **** ' return endif ! !--check if first data file exists ! if (iverbose==1 .and. ipos==1) print "(1x,a)",'reading vtk format' inquire(file=datfile,exist=iexist) if (.not.iexist) then ! !--append .vtk on the endif not already present ! datfile=trim(rootname)//'.vtk' inquire(file=datfile,exist=iexist) endif if (.not.iexist) then print "(a)",' *** error: '//trim(rootname)//': file not found ***' return endif ! !--read data from snapshots ! i = istepstart write(*,"(23('-'),1x,a,1x,23('-'))") trim(datfile) ! !--open file and read header information ! call read_vtk_header(trim(datfile),ndim,ndimV,ncolstep,npart,is_binary,ierr) if (ierr > 0) then print*,'ERROR reading vtk file: ierr=',ierr return else print "(1x,a,i0,a,i0)",'npart = ',npart,' ncolumns = ',ncolstep endif ! !--allocate or reallocate memory for main data array ! ncolumns = ncolstep nstepsread = 1 reallocate = (npart > maxpart) if (reallocate .or. .not.(allocated(dat))) then call alloc(npart,nsteps_to_read,max(ncolumns+ncalc,maxcol),mixedtypes=.false.) endif ! !--now memory has been allocated, read main data arrays ! ipartialread = .false. call read_vtk_legacy_binary(trim(datfile),npart,ncolstep,ierr,dat(:,:,i)) call set_labels_vtk ! set header variables from useful information from the file headertags(1) = 'npart' headervals(1,i) = real(npart) headertags(2) = 'nfile' headervals(2,i) = real(numfromfile(datfile)) ! !--set particle mass and number of particles of type 1 ! if (npart >= 1) then ! !--reconstruct particle mass from h and rho ! if (ih > 0 .and. irho > 0 .and. ipmass==0) then allocate(pmass(npart)) hfac = 1.0 pmass = dat(1:npart,irho,i)*(dat(1:npart,ih,i)/hfac)**ndim if (any(abs(pmass - pmass(1)) > 1e-6)) print*,' WARNING: unequal particle masses not supported' !print*,pmass(1:10) masstype(1,i) = pmass(1) deallocate(pmass) else masstype(1,i) = 1./npart endif npartoftype(1,i) = npart endif end subroutine read_data_vtk !---------------------------------------------------- ! read header information !---------------------------------------------------- subroutine read_vtk_header(filename,ndim,ndimV,ncolstep,npart,is_binary,ierr) character(len=*) :: filename integer, intent(out) :: ndim,ndimV,ncolstep,npart,ierr logical, intent(out) :: is_binary character(len=256) :: version,header character(len=6) :: fileformat character(len=30) :: dataset,datatype integer :: iu ierr = 0 npart = 0 ndim = 3 ndimV = 3 ncolstep = 0 tagarr(:) = '' open(newunit=iu,file=filename,status='old',action='read',form='formatted',iostat=ierr) if (ierr /= 0) then print*,' ERROR opening '//trim(filename) return endif ! read version information from first line read(iu,"(a)",iostat=ierr) version if (ierr /= 0) then print*,' ERROR reading vtk version from first line' endif ! read data description from second line read(iu,"(a)",iostat=ierr) header if (ierr /= 0) then print*,' ERROR reading vtk header from second line' else print "(a)",trim(version)//': '//trim(header) endif ! read file format from third line is_binary = .false. read(iu,"(a)",iostat=ierr) fileformat if (ierr /= 0) then print*,' ERROR reading vtk file format from third line' else if (trim(fileformat)=='BINARY' .or. trim(fileformat)=='binary') then is_binary = .true. else print "(2x,a)",trim(fileformat) endif endif ! read dataset type read(iu,*,iostat=ierr) dataset,datatype if (ierr /= 0) then print*,trim(dataset),trim(datatype) print*,' ERROR reading vtk dataset type ',ierr else if (trim(datatype) /= 'UNSTRUCTURED_GRID') then print "(a)",' ERROR: got '//trim(datatype)//' but splash reader only supports UNSTRUCTURED_GRID' ierr = 1 return endif endif close(iu) if (is_binary) then call read_vtk_legacy_binary(filename,npart,ncolstep,ierr) else print "(a)",' ERROR: got fileformat='//trim(fileformat)//' but splash reader only supports BINARY' endif end subroutine read_vtk_header !---------------------------------------------------- ! read vtk legacy binary format !---------------------------------------------------- subroutine read_vtk_legacy_binary(filename,npart,ncolstep,ierr,dat) use settings_data, only:debugmode use byteswap, only:bs use labels, only:iamvec character(len=*), intent(in) :: filename integer, intent(out) :: npart,ncolstep,ierr real, intent(out), optional :: dat(:,:) character(len=32) :: dataset,datatype,tmp character(len=256) :: line character(len=1) :: newline real(kind=4), allocatable :: xyz(:,:),rval(:,:) real(kind=8), allocatable :: r8val(:,:) integer :: iu,nline,n,i,nvec,nfields,npts,ispace ! open the file with stream access and use get_next_line to parse the ascii lines open(newunit=iu,file=filename,status='old',action='read',form='unformatted',iostat=ierr,access='stream') nline = 0 ncolstep = 0 iamvec(:) = 0 do while(ierr == 0) call get_next_line(iu,line,n,nline,ierr) ! Process the line as needed, e.g., print it select case (line(1:6)) case('POINTS') read(line(1:n),*,iostat=ierr) dataset,npart,datatype !print*,trim(dataset),npart,trim(datatype) allocate(xyz(3,npart),rval(1,npart)) read(iu,iostat=ierr) xyz,newline if (present(dat)) then dat(1:npart,1:3) = bs(transpose(xyz)) ! byteswap from big endian -> little endif deallocate(xyz,rval) ncolstep = ncolstep + 3 case('FIELD ') nvec = 0 read(line(1:n),*,iostat=ierr) tmp,tmp,nfields !print*,' number of fields = ',nfields do i=1,nfields ! get the next line call get_next_line(iu,line,n,nline,ierr) if (ierr /= 0 .or. n < 1) exit ! extract the tag and number of vectors and points ispace = index(line,' ') ! position of first space tagarr(ncolstep+1) = line(1:ispace-1) ! tag is everything up to first space read(line(ispace:n),*,iostat=ierr) nvec,npts,datatype !print*,'LINE:',line(1:n)! !print*,'GOT: ',tagarr(ncolstep+1),': nvec=',nvec,'npts=',npts,trim(datatype) select case(trim(datatype)) case('float') ! read/convert floats to working precision allocate(rval(nvec,npts)) read(iu,iostat=ierr) rval,newline if (debugmode) print*,bs(rval(1,1:min(npts,10))) if (npts==npart) then if (present(dat)) dat(1:npart,ncolstep+1:ncolstep+nvec) = bs(transpose(rval)) ! byteswap from big endian -> little if (nvec > 1) iamvec(ncolstep+1:ncolstep+nvec) = ncolstep ncolstep = ncolstep + nvec else if (present(dat)) print*,'WARNING: skipping float '//trim(tagarr(ncolstep+1))//' as npts /= npart' endif deallocate(rval) case('double') ! read/convert doubles to working precision allocate(r8val(nvec,npts)) read(iu,iostat=ierr) r8val,newline if (debugmode) print*,bs(r8val(1,1:min(npts,10))) if (npts==npart) then if (present(dat)) dat(1:npart,ncolstep+1:ncolstep+nvec) = bs(transpose(r8val)) ! byteswap from big endian -> little if (nvec > 1) iamvec(ncolstep+1:ncolstep+nvec) = ncolstep ncolstep = ncolstep + nvec else if (present(dat)) print*,'WARNING: skipping double '//trim(tagarr(ncolstep+1))//' as npts /= npart' endif deallocate(r8val) case('int') ! just silently skip integers allocate(rval(nvec,npts)) read(iu,iostat=ierr) rval,newline deallocate(rval) case default if (present(dat)) print*,'Warning: unknown data type '//trim(datatype)//' assuming 4-bytes and skipping' allocate(rval(nvec,npts)) read(iu,iostat=ierr) rval,newline deallocate(rval) end select enddo end select enddo end subroutine read_vtk_legacy_binary !------------------------------------------------------ ! read a line of ascii text from an unformatted stream !------------------------------------------------------ subroutine get_next_line(iu,line,n,nline,ierr) use settings_data, only:debugmode integer, intent(in) :: iu character(len=*), intent(out) :: line integer, intent(inout) :: nline integer, intent(out) :: n,ierr n = 1 line = '' do while(n < len(line)) read(iu, iostat=ierr) line(n:n) if (ierr /= 0) exit if (line(n:n) == char(10)) exit n = n + 1 end do n = n - 1 ! n is the line length if (ierr == 0) then nline = nline + 1 if (debugmode) print "(a,i2,a)",' DEBUG: ',nline,' : '//trim(line(1:n)) endif end subroutine get_next_line !------------------------------------------------------------ ! set labels for each column of data !------------------------------------------------------------ subroutine set_labels_vtk use labels, only:label,labeltype,ix,ipmass,ih,irho,labelvec,iamvec,& set_vector_labels,label_synonym use settings_data, only:ndim,ndimV,ntypes,UseTypeInRenderings,ncolumns use geometry, only:labelcoord integer :: i if (ndim <= 0 .or. ndim > 3) then print*,'*** ERROR: ndim = ',ndim,' in set_labels_fits ***' return endif if (ndimV <= 0 .or. ndimV > 3) then print*,'*** ERROR: ndimV = ',ndimV,' in set_labels_fits ***' return endif ix(1) = 1 ix(2) = 2 if (ndim >= 3) ix(3) = 3 !ipmass = ndim+3 do i=4,ncolumns label(i) = trim(tagarr(i)) if (label_synonym(label(i))=='density') irho = i if (label_synonym(label(i))=='h') ih = i enddo call set_vector_labels(ncolumns,ndimV,iamvec,labelvec,label,labelcoord(:,1)) ! set labels of the quantities read in if (ix(1) > 0) label(ix(1:ndim)) = labelcoord(1:ndim,1) if (irho > 0) label(irho) = 'density' if (ipmass > 0) label(ipmass) = 'particle mass' if (ih > 0) label(ih) = 'h' ! set labels for each particle type ntypes = 1 labeltype(1) = 'gas' UseTypeInRenderings(:) = .true. end subroutine set_labels_vtk end module readdata_vtk danieljprice-splash-4d1f09c/src/read_kepler.f90000066400000000000000000000100231477365367100214520ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is for reading the composition file for each particle ! that was read from KEPLER models. ! it also performs a check to see if composition file exists or not ! !----------------------------------------------------------------- module read_kepler implicit none public :: check_for_composition_file,read_kepler_composition private contains ! This function returns the prefix of the filename function get_prefix(filename) result(prefix) character(len=*), intent(in) :: filename character(len=len(filename)) :: prefix integer :: iu iu = index(filename,'_',back=.true.) if (iu > 1) then prefix = filename(1:iu-1) else prefix = filename endif end function get_prefix subroutine check_for_composition_file(dumpfile,ntotal,ncolstep,icomp_col_start,ncomp,labels,filename) use asciiutils, only:get_ncolumns,get_nrows,read_column_labels,basename use settings_data, only:debugmode character(len=*), intent(in) :: dumpfile integer, intent(in) :: ntotal integer, intent(inout) :: ncolstep character(len=*), intent(inout) :: labels(:) integer, intent(out) :: ncomp,icomp_col_start character(len=*), intent(out) :: filename integer :: iu,nrows,nheaderlines,nlabels,ierr character(len=len(dumpfile)) :: prefix logical :: iexist ncomp = 0 icomp_col_start = 0 ! first see if file_00000.cols exists filename = trim(dumpfile)//'.cols' inquire(file=filename,exist=iexist) if (debugmode) print*,' DEBUG: looking for '//trim(filename)//' exist = ',iexist ! first see if a global file.comp file exists if (.not.iexist) then prefix = get_prefix(dumpfile) filename = trim(prefix)//'.comp' inquire(file=filename,exist=iexist) if (debugmode) print*,' DEBUG: looking for '//trim(filename)//' exist = ',iexist endif ! look for a file in the current directory, not the same directory as the data if (.not.iexist) then filename = basename(filename) inquire(file=filename,exist=iexist) if (debugmode) print*,' DEBUG: looking for '//trim(filename)//' exist = ',iexist endif !if (debugmode) print*,'DEBUG: looking for '//trim(filename)//' exist = ',iexist if (.not.iexist) return ! see if Kepler composition file exists open(newunit=iu,file=filename,iostat=ierr,status='old') if (ierr /= 0) then print "(1x,a)", 'ERROR opening '//trim(filename) endif if (ierr == 0) then call get_ncolumns(iu,ncomp,nheaderlines) call get_nrows(iu,nheaderlines,nrows) ! check nrows equals number of particles if (nrows /= ntotal) then print "(1x,a,i0,a,i0,a)",'ERROR: reading '//trim(filename)//' nrows (',nrows,') /= nparticles (',ntotal,')' return endif if (ncomp > 0) then icomp_col_start = ncolstep + 1 ncolstep = ncolstep + ncomp call read_column_labels(iu,nheaderlines,ncomp,nlabels,& labels(icomp_col_start:icomp_col_start+ncomp-1)) print "(a,i0,a)", '> got ',ncomp,' extra columns from '//trim(filename) endif endif close(iu) end subroutine check_for_composition_file subroutine read_kepler_composition(filename,ntotal,dat,icomp_col_start,ncomp) use asciiutils, only:get_ncolumns real, intent(inout) :: dat(:,:) character(len=*), intent(in) :: filename integer, intent(in) :: ncomp,icomp_col_start integer, intent(inout) :: ntotal integer :: iu,ierr,i,ncols,nhdr open(newunit=iu,file=trim(filename),form='formatted',status='old',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename) elseif (icomp_col_start+ncomp-1 <= size(dat(1,:))) then ! get number of columns call get_ncolumns(iu,ncols,nhdr) ! skip header lines do i=1,nhdr read(iu,*,iostat=ierr) enddo ! read data from file do i=1,ntotal read(iu,*,iostat=ierr) dat(i,icomp_col_start:icomp_col_start+ncomp-1) if (ierr /= 0) print*,' ERROR reading '//trim(filename)//' on line ',i+nhdr enddo else print "(a)",' ERROR: wrong number of columns in '//trim(filename)//'.comp' endif end subroutine read_kepler_composition end module read_kepler danieljprice-splash-4d1f09c/src/render.f90000066400000000000000000000241641477365367100204670ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2021 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !------------------------------------------------------------------------ ! Module containing "interface" routines between the calculated ! pixel arrays and the plot library routines which do the actual rendering !------------------------------------------------------------------------ module render use colourbar, only:plotcolourbar implicit none public :: render_pix, render_vec, set_transparency private contains !------------------------------------------------------------------------ ! this subroutine takes a 2D grid of data and renders it via the ! plotting library. Rendering is either: ! - contours (icolouropt = 0) ! - greyscale (icolouropt = 1) ! - colour (icolouropt>1) ! contouring plots nc contours between datmin and datmax. !------------------------------------------------------------------------ subroutine render_pix(datpix,datmin,datmax,label,npixx,npixy, & xmin,ymin,dx,dy,icolouropt,iplotcont,iColourBarStyle,ncontours,log, & ilabelcont,contmin,contmax,blank,transparent,alpha) use plotutils, only:formatreal use plotlib, only:plot_imag,plot_conb,plot_cons,plot_qch,plot_sch,& plot_qch,plot_sch,plot_conl,plot_gray,plot_imag_transparent,& plot_imag_alpha use contours_module, only:read_contours,contours_list,contourtitles integer, intent(in) :: npixx,npixy,ncontours,icolouropt real, intent(in) :: xmin,ymin,datmin,datmax,dx,dy real, dimension(npixx,npixy), intent(in) :: datpix logical, intent(in) :: iplotcont,log,ilabelcont integer, intent(in) :: iColourBarStyle character(len=*), intent(in) :: label real, intent(in), optional :: contmin,contmax,blank logical, intent(in), optional :: transparent real, dimension(npixx,npixy), intent(in), optional :: alpha integer :: i,ierr,nc real :: trans(6),levels(ncontours),dcont,charheight,cmin,cmax character(len=12) :: string logical :: iuse_transparent,ifixed_contours ! !--set up grid for rendering ! trans(1) = xmin - 0.5*dx ! this is for the pgimag call trans(2) = dx ! see help for pgimag/pggray/pgcont trans(3) = 0.0 trans(4) = ymin - 0.5*dy trans(5) = 0.0 trans(6) = dy iuse_transparent = .false. if (present(transparent)) iuse_transparent = transparent !print*,'rendering...',npixx,'x',npixy,'=',size(datpix),' pixels' if (abs(icolouropt)==1) then ! greyscale if (iColourBarStyle > 0) call plotcolourbar(iColourBarstyle,icolouropt,datmin,datmax,trim(label),log,0.) if (icolouropt==1) then call plot_gray(datpix,npixx,npixy,1,npixx,1,npixy,datmin,datmax,trans) else !--allow inverse greyscale call plot_imag(datpix,npixx,npixy,1,npixx,1,npixy,datmin,datmax,trans) endif elseif (abs(icolouropt) > 0) then ! colour ! !--plot colour bar ! if (iColourBarStyle > 0) call plotcolourbar(iColourBarstyle,icolouropt,datmin,datmax,trim(label),log,0.) ! !--plot pixel map ! if (iuse_transparent) then call plot_imag_transparent(datpix,npixx,npixy,1,npixx,1,npixy,datmin,datmax,trans) else if (present(alpha)) then call plot_imag_alpha(datpix,alpha,npixx,npixy,1,npixx,1,npixy,datmin,datmax,trans) else call plot_imag(datpix,npixx,npixy,1,npixx,1,npixy,datmin,datmax,trans) endif endif endif ! !--contours ! if (iplotcont) then nc = ncontours if (present(contmin)) then cmin = contmin else cmin = datmin endif if (present(contmax)) then cmax = contmax else cmax = datmax endif ! !--set contour levels: first attempt to read these ! from a file. If file does not exist or errors during read ! then we construct the default levels as usual. ! call read_contours(nc,ierr) if (ierr==0 .and. nc > 0) then ifixed_contours = .true. else nc = ncontours ifixed_contours = .false. endif if (ifixed_contours) then do i=1,min(nc,ncontours) print*,"contour @ ", contours_list(i), ": ", trim(contourtitles(i)) levels(i) = contours_list(i) enddo dcont = 0. elseif (nc <= 0) then print*,'ERROR: cannot plot contours with ',nc,' levels' return elseif (nc==1) then levels(1) = cmin dcont = 0. else dcont = (cmax-cmin)/real(nc-1) ! even contour levels do i=1,nc levels(i) = cmin + real(i-1)*dcont enddo endif ! !--plot contours (use pgcont if pgcons causes trouble) ! with blanking if blank is input ! if (present(blank)) then if (.not.ifixed_contours) then print 10,nc,' contours (with blanking)',levels(1),levels(nc),dcont print 20,levels(1:nc) endif !print*,' blanking = ',blank,'min,max = ',datmin,datmax call plot_conb(datpix,npixx,npixy,1,npixx,1,npixy,levels,nc,trans,blank) else if (.not.ifixed_contours) then print 10,nc,' contours',levels(1),levels(nc),dcont print 20,levels(1:nc) endif call plot_cons(datpix,npixx,npixy,1,npixx,1,npixy,levels,nc,trans) endif 10 format(1x,'plotting ',i4,a,' between ',es10.2,' and ',es10.2,', every ',es10.2,':') 20 format(10(6(1x,es9.2),/)) ! !--labelling of contour levels ! if (ilabelcont) then call plot_qch(charheight) ! query character height call plot_sch(0.75*charheight) ! shrink character height do i=1,nc if (ifixed_contours) then string=trim(adjustl(contourtitles(i))) else call formatreal(levels(i),string) endif call plot_conl(datpix,npixx,npixy,1,npixx,1,npixy,levels(i),trans,trim(string),npixx/2,30) enddo call plot_sch(charheight) ! restore character height endif ! !--this line prints the label inside the contour plot ! (now obsolete-- this functionality can be achieved using plot titles) ! call pgmtxt('T',-2.0,0.05,0.0,trim(label)) endif end subroutine render_pix !-------------------------------------------------------------------------- ! this subroutine takes a 2D grid of vector data (ie. x and y components) ! and plots an arrow map of it !-------------------------------------------------------------------------- subroutine render_vec(vecpixx,vecpixy,vecmax,npixx,npixy, & xmin,ymin,dx,dy,label,unitslabel,plotlegend) use legends, only:legend_vec use settings_vecplot, only:hposlegendvec,vposlegendvec,& iplotarrowheads,iallarrowssamelength use plotlib, only:plot_sah,plot_qch,plot_sch,plot_vect integer, intent(in) :: npixx,npixy real, intent(in) :: xmin,ymin,dx,dy real, intent(inout) :: vecmax real, dimension(npixx,npixy), intent(in) :: vecpixx,vecpixy real, dimension(npixx,npixy) :: dvmag character(len=*), intent(in) :: label,unitslabel logical, intent(in) :: plotlegend real :: trans(6),scale real :: charheight !set up grid for rendering trans(1) = xmin - 0.5*dx ! this is for the pgimag call trans(2) = dx ! see help for pgimag/pggray/pgcont trans(3) = 0.0 trans(4) = ymin - 0.5*dy trans(5) = 0.0 trans(6) = dy print*,'vector plot..',npixx,'x',npixy,'=',size(vecpixx),' pixels' !!print*,'max(x component) = ',maxval(vecpixx),'max(y component) = ',maxval(vecpixy) if (iplotarrowheads) then call plot_sah(2,45.0,0.7) ! arrow style else call plot_sah(2,0.0,1.0) endif call plot_qch(charheight) call plot_sch(0.3*charheight) ! size of arrow head if (iallarrowssamelength) then !!if (vecmax <= 0.0) vecmax = 1.0 ! adaptive limits scale=0.9*dx !!/vecmax print*,trim(label),' showing direction only: max = ',vecmax where (abs(vecpixx) > tiny(vecpixx) .and. abs(vecpixy) > tiny(vecpixy)) dvmag(:,:) = 1./sqrt(vecpixx**2 + vecpixy**2) elsewhere dvmag(:,:) = 0. end where call plot_vect(vecpixx(:,:)*dvmag(:,:),vecpixy(:,:)*dvmag(:,:),npixx,npixy, & 1,npixx,1,npixy,scale,0,trans,0.0) else if (vecmax <= 0.0) then ! adaptive limits scale = 0.0 vecmax = max(maxval(vecpixx(:,:)),maxval(vecpixy(:,:))) if (vecmax > 0.) scale = dx/vecmax else scale=dx/vecmax endif print*,trim(label),' max = ',vecmax call plot_vect(vecpixx(:,:),vecpixy(:,:),npixx,npixy, & 1,npixx,1,npixy,scale,0,trans,0.0) if (plotlegend) then call legend_vec(label,unitslabel,vecmax,dx,hposlegendvec,vposlegendvec,charheight) endif endif call plot_sch(charheight) end subroutine render_vec !-------------------------------------------------------------------------- ! set opacity for double-rendering, i.e.: ! - data values below colour bar minimum are transparent ! - data values above 25% of colour bar range are opaque ! - linear scaling in between !-------------------------------------------------------------------------- subroutine set_transparency(nx,ny,datpix,brightness,dmin,dmax) integer, intent(in) :: nx,ny real, intent(in) :: datpix(nx,ny) real, intent(out), allocatable :: brightness(:,:) real, intent(in) :: dmin,dmax if (.not.allocated(brightness)) allocate(brightness(nx,ny)) if (abs(dmax-dmin) < tiny(0.)) then brightness = 1. ! avoid divide by zero if max=min else brightness = max(min(4.*(datpix-dmin)/(dmax-dmin),1.0),0.) endif end subroutine set_transparency end module render danieljprice-splash-4d1f09c/src/rotate.f90000066400000000000000000000205721477365367100205050ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! This module contains all the routines for rotating the particles ! and plotting the rotated axes ! module rotation implicit none public :: rotate2D,rotate3D,rotate_particles ! !--2D rotation (about z axis) ! contains subroutine rotate2D(xcoords,anglez) real, intent(inout) :: xcoords(2) real, intent(in) :: anglez real :: x, y, r, phi x = xcoords(1) y = xcoords(2) ! !--rotate about z ! r = sqrt(x**2 + y**2) phi = atan2(y,x) phi = phi - anglez x = r*cos(phi) y = r*sin(phi) xcoords(1) = x xcoords(2) = y return end subroutine rotate2D ! !--3D rotation (about x, y and z axes) ! This is done in the order z-y-x ! subroutine rotate3D(xcoords,anglex,angley,anglez,zobs,dz1) real, intent(inout) :: xcoords(3) real, intent(in) :: anglex, angley, anglez, zobs, dz1 real :: x, y, z, r, phi, zfrac x = xcoords(1) y = xcoords(2) z = xcoords(3) ! !--rotate about z ! if (abs(anglez) > tiny(anglez)) then r = sqrt(x**2 + y**2) phi = atan2(y,x) phi = phi - anglez x = r*cos(phi) y = r*sin(phi) endif ! !--rotate about y ! if (abs(angley) > tiny(angley)) then r = sqrt(z**2 + x**2) phi = atan2(z,x) phi = phi - angley z = r*sin(phi) x = r*cos(phi) endif ! !--rotate about x ! if (abs(anglex) > tiny(anglex)) then r = sqrt(y**2 + z**2) phi = atan2(z,y) phi = phi - anglex y = r*cos(phi) z = r*sin(phi) endif ! !--change perspective according to z depth ! (for straight rotation == parallel projections use dz1= 0 on input) ! zobs is the z position of the observer. ! if (abs(dz1) > tiny(dz1)) then zfrac = abs(dz1/(z-zobs)) else zfrac = 1.0 endif xcoords(1) = x*zfrac xcoords(2) = y*zfrac xcoords(3) = z return end subroutine rotate3D ! !--plots rotated plot axes ! subroutine rotate_axes2D(ioption,xmin,xmax,xorigin,anglez) use plotlib, only:plot_arro,plot_sfs,plot_poly integer, intent(in) :: ioption real, intent(in), dimension(2) :: xmin,xmax,xorigin real, intent(in) :: anglez integer :: i,idim real, dimension(2) :: xpttemp real, dimension(2,4) :: xpt ! ! plot various options for the 3D axes ! select case(ioption) case(1) !--rotated axes print*,'plotting rotated (2D) axes...' do idim=1,2 !--plot to max of each axis xpt(:,2) = 0. xpt(idim,2) = xmax(idim) do i=1,2 xpttemp(:) = xpt(:,i) - xorigin(:) call rotate2D(xpttemp(:),anglez) xpt(:,i) = xpttemp(:) + xorigin(:) enddo !--plot each axis as an arrow call plot_arro(xpt(1,1),xpt(2,1),xpt(1,2),xpt(2,2)) enddo case default print*,'plotting rotated (2D) box...' !--front face (pts 1->4) xpt(:,1) = xmin(:) ! xmin, ymin xpt(1,2) = xmin(1) ! xmin xpt(2,2) = xmax(2) ! ymax xpt(1,3) = xmax(1) ! xmax xpt(2,3) = xmax(2) ! ymax xpt(1,4) = xmax(1) ! xmax xpt(2,4) = xmin(2) ! ymin ! !--now rotate each of these coordinates ! do i=1,4 xpttemp(:) = xpt(:,i) - xorigin(:) call rotate2D(xpttemp(:),anglez) xpt(:,i) = xpttemp(:) + xorigin(:) enddo ! !--now plot box appropriately using points ! call plot_sfs(2) call plot_poly(4,xpt(1,1:4),xpt(2,1:4)) end select return end subroutine rotate_axes2D subroutine rotate_axes3D(ioption,iplotx,iploty,xmin,xmax,xorigin, & anglex,angley,anglez,zobs,dz1) use plotlib, only:plot_poly,plot_sfs,plot_arro,plot_line integer, intent(in) :: ioption,iplotx,iploty real, intent(in), dimension(3) :: xmin,xmax,xorigin real, intent(in) :: anglex, angley, anglez, zobs, dz1 integer :: i,idim,iline integer, parameter :: nlines = 10 real, dimension(3,8) :: xpt real, dimension(3) :: xpttemp real, dimension(2) :: xline,yline real :: dx ! ! plot various options for the 3D axes ! select case(ioption) case(1) !--rotated axes print*,'plotting rotated 3D axes...' xpt = 0. !--origin xpt(1:3,1) = 0. do idim=1,3 !--plot to max of each axis xpt(:,2) = 0. xpt(idim,2) = xmax(idim) do i=1,2 xpttemp(:) = xpt(:,i) - xorigin(:) call rotate3D(xpttemp(:),anglex,angley,anglez,zobs,dz1) xpt(:,i) = xpttemp(:) + xorigin(:) enddo !--plot each axis as an arrow call plot_arro(xpt(iplotx,1),xpt(iploty,1),xpt(iplotx,2),xpt(iploty,2)) !! call pgline(2,xpt(iplotx,1:2),xpt(iploty,1:2)) enddo case(2) !--rotated box print*,'plotting rotated 3D box...',iplotx,iploty !--front face (pts 1->4) xpt(:,1) = xmin(:) ! xmin, ymin xpt(1,2) = xmin(1) ! xmin xpt(2,2) = xmax(2) ! ymax xpt(1,3) = xmax(1) ! xmax xpt(2,3) = xmax(2) ! ymax xpt(1,4) = xmax(1) ! xmax xpt(2,4) = xmin(2) ! ymin xpt(3,1:4) = xmin(3) ! zmin !--back face (pts 5->8) do i=1,4 xpt(1:2,i+4) = xpt(1:2,i) enddo xpt(3,5:8) = xmax(3) ! !--now rotate each of these coordinates ! do i=1,8 xpttemp(:) = xpt(:,i) - xorigin(:) call rotate3D(xpttemp(:),anglex,angley,anglez,zobs,dz1) xpt(:,i) = xpttemp(:) + xorigin(:) enddo ! !--now draw lines appropriately through points ! call plot_sfs(2) !--front face call plot_poly(4,xpt(iplotx,1:4),xpt(iploty,1:4)) !--back face call plot_poly(4,xpt(iplotx,5:8),xpt(iploty,5:8)) !--connecting lines ( 1->5, 2->6, 3->7, 4->8 ) do i=1,4 xline(1) = xpt(iplotx,i) yline(1) = xpt(iploty,i) xline(2) = xpt(iplotx,i+4) yline(2) = xpt(iploty,i+4) call plot_line(2,xline,yline) enddo case(3) !--gridded x-y plane print*,'plotting rotated x-y plane...' !--lines of constant x dx = (xmax(1) - xmin(1))/real(nlines-1) do iline=1,nlines !--all pts at z = 0 xpt(3,:) = 0. !--start from xmin, plot line from ymin to ymax xpt(1,1:2) = xmin(1) + (iline-1)*dx xpt(2,1) = xmin(2) xpt(2,2) = xmax(2) do i=1,2 xpttemp(:) = xpt(:,i) - xorigin(:) call rotate3D(xpttemp(:),anglex,angley,anglez,zobs,dz1) xpt(:,i) = xpttemp(:) + xorigin(:) enddo call plot_line(2,xpt(iplotx,1:2),xpt(iploty,1:2)) enddo !--lines of constant y dx = (xmax(2) - xmin(2))/real(nlines-1) do iline=1,nlines !--all pts at z = 0 xpt(3,:) = 0. !--start from ymin, plot line from xmin to xmax xpt(2,1:2) = xmin(2) + (iline-1)*dx xpt(1,1) = xmin(1) xpt(1,2) = xmax(1) do i=1,2 xpttemp(:) = xpt(:,i) - xorigin(:) call rotate3D(xpttemp(:),anglex,angley,anglez,zobs,dz1) xpt(:,i) = xpttemp(:) + xorigin(:) enddo call plot_line(2,xpt(iplotx,1:2),xpt(iploty,1:2)) enddo case default !--do nothing end select end subroutine rotate_axes3D subroutine rotate_particles(n,x,y,z,anglex,angley,anglez,v) integer, intent(in) :: n real, intent(inout) :: x(n),y(n),z(n) real, intent(in) :: anglex,angley,anglez real, intent(inout), optional :: v(3,n) real :: ax,ay,az,xi(3) real, parameter :: pi = 4.*atan(1.) integer :: i if (abs(anglez)>0. .or. abs(angley)>0. .or. abs(anglex)>0.) then print*, 'Rotating particles around (z,y,x) by',anglez,angley,anglex ax = anglex*pi/180.0 ! convert degrees to radians to pass into rotate ay = angley*pi/180.0 az = anglez*pi/180.0 do i=1,n xi = (/x(i),y(i),z(i)/) call rotate3D(xi,ax,ay,az,0.,0.) x(i) = xi(1) y(i) = xi(2) z(i) = xi(3) if (present(v)) call rotate3D(v(:,i),ax,ay,az,0.,0.) enddo endif end subroutine rotate_particles end module rotation danieljprice-splash-4d1f09c/src/set_options_from_dataread.f90000066400000000000000000000112551477365367100244230ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2020 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module set_options_from_dataread implicit none contains subroutine set_options_dataread() use exact, only:read_exactparams use settings_part, only:iplotpartoftype,PlotonRenderings use particle_data, only:npartoftype use settings_data, only:ndim,ncolumns,ncalc,ntypes,iexact,iverbose,UseTypeInRenderings,& idefaults_file_read,iCalcQuantities,DataIsBuffered use filenames, only:rootname,nsteps,nstepsinfile,ifileopen,fileprefix use labels, only:labeltype,irho,ih,get_sink_type use asciiutils, only:ucase use settings_render, only:icolour_particles use settings_xsecrot, only:xsec_nomulti use calcquantities, only:print_example_quantities,calc_quantities use limits, only:set_limits integer :: itype,nplot,ierr,idash logical :: iexist ! !--check for errors in data read / print warnings ! if (ndim > 0 .and. ncolumns > 0 .and. nsteps > 0 .and. .not.idefaults_file_read) then if (sum(npartoftype(:,1)) > 0 .and. npartoftype(1,1)==0 .and. .not.any(iplotpartoftype(2:))) then if (iverbose >= 1) print "(/,a)",' WARNING! DATA APPEARS TO CONTAIN NO '//trim(ucase(labeltype(1)))//' PARTICLES' itype = 0 nplot = 0 do while (nplot==0 .and. itype < ntypes) itype = itype + 1 if (npartoftype(itype,1) > 0) then iplotpartoftype(itype) = .true. if (UseTypeInRenderings(itype)) nplot = nplot + npartoftype(itype,1) if (iverbose >= 1) print "(a)",' (plotting of '//trim(labeltype(itype))//' particles turned ON)' endif enddo print* endif ! Set particle colouring if it can't render if (irho==0 .or. ih==0) then icolour_particles = .true. endif endif ! !--turn sink particles ON by default ! if (ndim > 0 .and. .not.idefaults_file_read) then ! only on first data read itype = get_sink_type(ntypes) if (itype > 0) then if (npartoftype(itype,1) > 0 .and. .not.UseTypeInRenderings(itype)) then iplotpartoftype(itype) = .true. PlotOnRenderings(itype) = .true. endif endif endif !--for fits cubes, turn on cross section by default if 3D if (ndim >= 3 .and. .not.idefaults_file_read .and. ifileopen > 0) then ! only on first data read if (index(rootname(ifileopen),'.fits') > 0) then print "(a)",' turning cross section ON for fits cube' xsec_nomulti = .true. endif endif ! !--read exact solution parameters from files if present ! if (iexact /= 0) then if (ifileopen > 0) then call read_exactparams(iexact,rootname(ifileopen),ierr) endif elseif (.not.idefaults_file_read .and. ifileopen > 0) then ! ! set the exact solution option ON by default if ! certain files are present ! idash = index(rootname(ifileopen),'_',back=.true.) if (idash==0) idash = len_trim(rootname(ifileopen))+1 inquire(file=trim(rootname(ifileopen))//'.func',exist=iexist) if (iexist) iexact = 1 inquire(file=trim(fileprefix)//'.exactfiles',exist=iexist) if (iexist) iexact = 2 inquire(file=trim(rootname(ifileopen)(1:idash-1))//'.profile',exist=iexist) if (iexist) then iexact = 2 call print_example_quantities(.true.,ncalc) iCalcQuantities = .true. if (DataIsBuffered) then call calc_quantities(1,nsteps) call set_limits(1,nsteps,ncolumns+1,ncolumns+ncalc) else if (ifileopen > 0) then call calc_quantities(1,nstepsinfile(ifileopen)) call set_limits(1,nstepsinfile(ifileopen),ncolumns+1,ncolumns+ncalc) endif endif endif inquire(file=trim(rootname(ifileopen))//'.spirals',exist=iexist) if (iexist) iexact = 17 call read_exactparams(iexact,rootname(ifileopen),ierr) endif end subroutine set_options_dataread end module set_options_from_dataread danieljprice-splash-4d1f09c/src/setpage.f90000066400000000000000000000360331477365367100206360ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module pagesetup implicit none public :: redraw_axes, setpage2 real, parameter, public :: xlabeloffset = 2.5, ylabeloffset = 4.5 private contains ! !--this subroutine determines the setup of the plotting page ! sorts out labelling of axes, positioning of windows etc ! can be used as a replacement for PGENV and PGLABEL ! ! divides up a single page into subpanels ! ! ! option to tile graphs appropriately on a page: ! divides up a single panel into subpanels, with a margin at the edge ! should replace the call to pgenv and pglabel ! ! for tiled plots the page setup looks like this: ! ! | | | | ! --+---+---+---+-- ! | 1 | 2 | 3 | ! --+---+---+---+-- ! | 4 | 5 | 6 | ! --+---+---+---+-- ! | | | | ! ! (ie. with margins in x and y) ! note that we divide up a single panel, so pgbeg should be called with nx=1,ny=1 ! ! arguments: ! iplot : current plot number ! nx : number of panels in x direction ! ny : number of panels in y direction ! xmin, : xmax, ymin, ymax : plot limits (if tiled should be same for all plots) ! labelx : x axis label (if tiled should be same for all plots) ! labely : y axis label (if tiled should be same for all plots) ! title : current plot title (can differ between plots) ! just : just=1 gives equal aspect ratios (same as in pgenv) ! axis : axes options (same as in pgenv with a few extra) ! vmarginleft,right,bottom,top : initial margin sizes (% of page (if tiled) or panel (if not)) ! (default should be zero for these) ! tile : assumes all plots can be tiled ! ! This version by Daniel Price, July 2006 ! subroutine setpage2(iplotin,nx,ny,xmin,xmax,ymin,ymax,labelx,labely,title,just,axis, & vmarginleftin,vmarginrightin,vmarginbottomin,vmargintopin, & colourbarwidth,titleoffset,isamexaxis,tile,adjustlimits,lastrow,lastplot,& yscale,labelyalt,itransy) use plotlib,only:plot_svp,plot_swin,plot_box,plot_qvsz,plot_annotate, & plot_page,plot_qcs,plot_wnad,plot_set_exactpixelboundaries, & plot_qvp use asciiutils, only:string_delete integer, intent(in) :: iplotin,nx,ny,just,axis,itransy real, intent(inout) :: xmin, xmax, ymin, ymax real, intent(in) :: colourbarwidth, titleoffset real, intent(in) :: vmarginleftin,vmarginrightin,vmargintopin,vmarginbottomin real, intent(in) :: yscale character(len=*), intent(in) :: labelx,labely,title,labelyalt logical, intent(in) :: isamexaxis,tile,adjustlimits,lastrow,lastplot integer iplot,ix,iy real vptsizeeffx,vptsizeeffy,panelsizex,panelsizey real vmargintop,vmarginbottom,vmarginleft,vmarginright real vptxmin,vptxmax,vptymin,vptymax real aspectratio,devaspectratio,x1,x2,y1,y2 real xch,ych,dx,dy,xcen,ycen character(len=10) :: xopts, yopts logical, parameter :: useexactpixelboundaries = .true. logical :: plot_alt_y_axis if (axis==4) then plot_alt_y_axis = .true. else plot_alt_y_axis = .false. endif ! ! new page if iplot > number of plots on page ! if (iplotin > nx*ny) then if (mod(iplotin,nx*ny)==1) call plot_page iplot = iplotin - (nx*ny)*((iplotin-1)/(nx*ny)) elseif (iplotin <= 0) then return else iplot = iplotin endif ! ! check for errors in input ! if (nx <= 0 .or. ny <= 0) return ! ! for tiled plots, adjust effective viewport size if just=1 and graphs are not square ! if (tile .and. just==1) then if (abs(ymax-ymin) < tiny(ymin)) then print*,'setpage: error tiling plots: ymax=ymin' return endif ! ! query the current aspect ratio of the device and set aspect ratio appropriately ! call plot_qvsz(3,x1,x2,y1,y2) devaspectratio = (x2-x1)/(y2-y1) if (.not.adjustlimits) then aspectratio = abs(((xmax-xmin)*nx)/((ymax-ymin)*ny))/devaspectratio else aspectratio = 1.0 endif else aspectratio = 1.0 endif ! ! set positions of x and y labels in units of character height from edge ! ! xlabeloffset = 3.0 ! ylabeloffset = 4.5 ! ! query the character height as fraction of viewport ! call plot_qcs(0,xch,ych) ! ! set margin size in units of viewport dimensions ! allow enough room for the plot labels if they are drawn ! nb: pgplot sets the character height as some fraction of the smallest ! dimension ! ! for tiled plots, these margins apply to the whole page ! otherwise, these are applied to each panel individually ! vmargintop = vmargintopin vmarginright = vmarginrightin if (axis >= 0) then !--if we are drawing an axis ! leave a minimum of half a character ! spacing (or 0.7 for antialiasing) ! so that axis numbers are not chopped ! in half at the edges of the viewport vmargintop = max(vmargintop,0.7*ych) vmarginright = max(vmarginright,0.7*xch) !--leave space for labels if (axis /= 3) then vmarginleft = vmarginleftin + (ylabeloffset+1.5)*xch vmarginbottom = vmarginbottomin + (xlabeloffset+1.0)*ych else vmarginleft = vmarginleftin + 2.0*xch vmarginbottom = vmarginbottomin + 1.5*ych endif if (plot_alt_y_axis) vmarginright = vmarginleft if (.not.tile) then if (ny > 1 .and. .not.isamexaxis) then vmarginbottom = vmarginbottom + 0.5*ych elseif (ny > 1) then vmarginbottom = vmarginbottom + 0.25*ych endif endif else vmarginleft = vmarginleftin vmarginbottom = vmarginbottomin endif ! !--set size of each panel ! ix = iplot - ((iplot-1)/nx)*nx iy = (iplot-1)/nx + 1 if (tile) then !--also leave room for title if necessary if (titleoffset >= 0.) then vmargintop = vmargintop + (titleoffset+1.)*ych endif ! ! effective viewport size = size - margins (only used for tiled ! vptsizeeffx = 1.0 - vmarginright - vmarginleft vptsizeeffy = 1.0 - vmargintop - vmarginbottom ! reduce x or y size if just=1 to get right aspect ratio if (.not.adjustlimits) then if (aspectratio <= 1.0 .and. just==1) then if (aspectratio*vptsizeeffy < vptsizeeffx) then vptsizeeffx = aspectratio*vptsizeeffy ! but this could still be bigger than the margins allow... else vptsizeeffy = vptsizeeffx/aspectratio endif elseif (aspectratio > 1.0 .and. just==1) then if (vptsizeeffx/aspectratio < vptsizeeffy) then vptsizeeffy = vptsizeeffx/aspectratio ! but this could still be bigger than the margins allow... else vptsizeeffx = vptsizeeffy*aspectratio endif endif endif panelsizex = vptsizeeffx/nx panelsizey = vptsizeeffy/ny ! print*,ix,iy,nx,ny ! print*,panelsizex,panelsizey,vptsizeeffx,vptsizeeffy ! print*,'margins = ',vmarginleft,vmarginright vptxmin = vmarginleft + (ix-1)*panelsizex vptxmax = vptxmin + panelsizex vptymax = (1.0 - vmargintop) - (iy-1)*panelsizey vptymin = vptymax - panelsizey else !--use full page for non-tiled plots, then set margins inside each panel panelsizex = 1.0/nx panelsizey = 1.0/ny vptxmin = (ix-1)*panelsizex + vmarginleft vptxmax = ix*panelsizex - vmarginright vptymax = 1.0 - (iy-1)*panelsizey - vmargintop vptymin = 1.0 - iy*panelsizey + vmarginbottom !--also leave room for title if necessary if (titleoffset >= 0.) then vptymax = vptymax - (titleoffset+1.)*ych endif !--also leave room for colour bar if necessary if (colourbarwidth > 0.) then vptxmax = vptxmax - (colourbarwidth + 1.6)*xch endif endif ! print*,vptxmin,vptxmax,vptymin,vptymax ! ! set viewport ! call plot_svp(vptxmin,vptxmax,vptymin,vptymax) ! ! set axes ! if (just==1) then if (adjustlimits) then !--query viewport aspect ratio call plot_qvp(3,x1,x2,y1,y2) devaspectratio = abs((x2-x1)/(y2-y1)) !--adjust limits to match viewport aspect ratio dx = (xmax - xmin)/nx dy = (ymax - ymin)/ny if (devaspectratio*dy/dx >= 1.) then xcen = 0.5*(xmin + xmax) xmin = xcen - 0.5*devaspectratio*dy*ny xmax = xcen + 0.5*devaspectratio*dy*ny !print*,' auto-adjusting xmin = ',xmin,' xmax = ',xmax else ycen = 0.5*(ymin + ymax) ymin = ycen - 0.5*dx*nx/devaspectratio ymax = ycen + 0.5*dx*nx/devaspectratio !print*,' auto-adjusting ymin = ',ymin,' ymax = ',ymax endif endif call plot_wnad(xmin,xmax,ymin,ymax) else call plot_swin(xmin,xmax,ymin,ymax) endif ! ! adjust viewport to lie exactly on pixel boundaries ! if (useexactpixelboundaries) call plot_set_exactpixelboundaries() ! ! option to return before actually doing anything ! if (trim(title)=='NOPGBOX') return ! ! set options for call to pgbox (draws axes) and label axes where appropriate ! (options are exactly as in pgenv apart from axis=-3,-4 which i have added) ! yopts = '*' select case(axis) case(-4) xopts = 'BCT' case(-3) xopts = 'BCST' case(-2) xopts = ' ' case(-1) xopts = 'BC' case(0,4) xopts = 'BCST' case(1) xopts = 'ABCST' case(2) xopts = 'ABCGST' case(3) xopts = 'BCST' case(5) xopts = 'BCT' case(10) xopts = 'BCSTL' yopts = 'BCST' case(20) xopts = 'BCST' yopts = 'BCSTL' case(30) xopts = 'BCSTL' yopts = 'BCSTL' case default print*,'setpage: illegal axis argument.' xopts = 'BCNST' end select if (yopts=='*') yopts = xopts if (plot_alt_y_axis) call string_delete(yopts,'C') ! ! label plot ! if (tile) then ! ! decide whether to number and label the y axis ! if (ix==nx .and. axis >= 0) then ! !--apply label to right hand side axis if used ! if (plot_alt_y_axis) then call plot_second_y_axis(yopts,just,axis,itransy,yscale,ylabeloffset,labelyalt) endif endif if (ix==1 .and. axis >= 0) then ! !--label "normal" y axis ! if (axis==3) then yopts = 'N'//trim(yopts) else yopts = 'VN'//trim(yopts) call plot_annotate('L',ylabeloffset,0.5,0.5,labely) endif elseif (axis >= 0) then !yopts = trim(yopts)//'N' endif ! ! decide whether to number and label the x axis ! if ((iy==ny .or. lastplot .or. lastrow) .and. axis >= 0) then xopts = 'N'//trim(xopts) if (axis /= 3) call plot_annotate('B',xlabeloffset,0.5,0.5,labelx) endif ! ! plot the title if inside the plot boundaries ! if (titleoffset < 0.) call plot_annotate('t',-titleoffset,0.96,1.0,title) elseif (axis >= 0) then ! !--label x axis only if on last row ! or if x axis quantities are different ! if (((ny*nx-iplot) < nx).or.(.not.isamexaxis).or.lastplot) then if (axis /= 3) call plot_annotate('B',xlabeloffset,0.5,0.5,labelx) endif !--always plot numbers xopts = 'N'//trim(xopts) ! !--apply label to right hand side axis if used ! if (plot_alt_y_axis) then call plot_second_y_axis(yopts,just,axis,itransy,yscale,ylabeloffset,labelyalt) endif ! !--always label y axis ! if (axis==3) then yopts = 'N'//trim(yopts) else yopts = 'VN'//trim(yopts) call plot_annotate('L',ylabeloffset,0.5,0.5,labely) endif ! !--always plot title ! call plot_annotate('T',-titleoffset,0.5,0.5,title) endif call plot_box(xopts,0.0,0,yopts,0.0,0) end subroutine ! !--this subroutine is a cut down version of the above, which ONLY redraws the axes ! (so that axes can be redrawn on *top* of what has been plotted). ! ! inputs: ! axis : axes options (same as in PGENV, with axis=-4,-3,+3 added) ! subroutine redraw_axes(iaxis,just,yscale,itransy) use plotlib, only:plot_box integer, intent(in) :: iaxis,just,itransy character(len=10) :: xopts, yopts real, intent(in) :: yscale ! !--set plot axes (options are exactly as in PGENV, with axis=-4,-3,+3 added) ! yopts = '*' select case(iaxis) case(-4) xopts = 'BCT' case(-3) xopts = 'BCST' case(-2) xopts = ' ' case(-1) xopts = 'BC' case(0) xopts = 'BCST' case(1) xopts = 'ABCST' case(2) xopts = 'ABCGST' case(3) xopts = 'BCST' case(4) xopts = 'BCST' yopts = 'BST' case(5) xopts = 'BCT' case(10) xopts = 'BCSTL' yopts = 'BCST' case(20) xopts = 'BCST' yopts = 'BCSTL' case(30) xopts = 'BCSTL' yopts = 'BCSTL' case default print*,'redraw_axes: illegal AXIS argument.' xopts = 'BCST' end select if (yopts=='*') yopts = xopts if (iaxis==4) call plot_second_y_axis(yopts,just,iaxis,itransy,yscale) call plot_box(xopts,0.0,0,yopts,0.0,0) end subroutine redraw_axes subroutine plot_second_y_axis(yopts,just,iaxis,itransy,yscale,ylabeloffset,labely) use plotlib, only:plot_box,plot_annotate,plot_qwin,plot_swin,plot_wnad use asciiutils, only:string_delete use transforms, only:transform,transform_inverse,transform_label character(len=*), intent(in) :: yopts real, intent(in) :: yscale real, intent(in), optional :: ylabeloffset character(len=*), intent(in), optional :: labely integer, intent(in) :: just,iaxis,itransy character(len=10) :: yoptsi character(len=120) :: labelyalt real :: xmin,xmax,ymin,ymax,yminalt,ymaxalt yoptsi = yopts call string_delete(yoptsi,'B') call string_delete(yoptsi,'N') !--save plot window settings call plot_qwin(xmin,xmax,ymin,ymax) !--scaling of y axis: multiplication in un-transformed space yminalt = ymin ymaxalt = ymax if (itransy > 0) call transform_inverse(yminalt,ymaxalt,itransy) yminalt = yminalt*yscale ymaxalt = ymaxalt*yscale if (itransy > 0) call transform(yminalt,ymaxalt,itransy) !--set plot window to new scaled y axis call plot_swin(xmin,xmax,yminalt,ymaxalt) !--draw axes and label on right hand side of box if (iaxis==3) then call plot_box(' ',0.0,0,'1MC'//trim(yoptsi),0.0,0) else call plot_box(' ',0.0,0,'1VMC'//trim(yoptsi),0.0,0) endif if (present(labely) .and. present(ylabeloffset)) then labelyalt = labely if (itransy > 0) labelyalt = transform_label(labely,itransy) call plot_annotate('R',ylabeloffset,0.5,0.5,labelyalt) endif !--reset plot window if (just==1) then call plot_wnad(xmin,xmax,ymin,ymax) else call plot_swin(xmin,xmax,ymin,ymax) endif end subroutine plot_second_y_axis end module pagesetup danieljprice-splash-4d1f09c/src/shapes.f90000066400000000000000000001003701477365367100204650ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! module which handles plotting of arbitrary shapes ! written by Daniel Price 2008 ! as part of the SPLASH SPH visualisation package !----------------------------------------------------------------- module shapes implicit none integer, parameter, private :: maxshapes = 32 integer, parameter, private :: maxshapetype = 8 integer :: nshapes integer, parameter, private :: lentext = 120 type shapedef integer :: itype integer :: icolour integer :: linestyle integer :: linewidth integer :: ifillstyle integer :: iunits integer :: iplotonpanel real :: xpos real :: ypos real :: xlen,ylen real :: angle,fjust real :: opacity character(len=lentext) :: text end type type(shapedef), dimension(maxshapes), public :: shape character(len=9), dimension(maxshapetype), & parameter, public :: labelshapetype = & (/'square ', & 'rectangle', & 'arrow ', & 'circle ', & 'line ', & 'text ', & 'f(x) ', & 'marker '/) namelist /shapeopts/ nshapes,shape integer, parameter, public :: & ishape_square = 1, & ishape_rectangle = 2, & ishape_arrow = 3, & ishape_circle = 4, & ishape_line = 5, & ishape_text = 6, & ishape_function = 7, & ishape_marker = 8 integer, parameter, private :: maxunits = 2 character(len=20), dimension(maxunits), & parameter, private :: labelunits = & (/'units of plot ', & 'viewport coordinates'/) ! 'inches ', & ! 'millimeters ', & ! 'pixels '/) procedure(check_shapes), pointer, private :: checkshapes => null() procedure(add_shape), pointer, private :: addshape => null() procedure(delete_shape), pointer, private :: delshape => null() real, parameter, private :: pi = 4.*atan(1.) contains !----------------------------------------------------------------- ! shape default settings !----------------------------------------------------------------- subroutine defaults_set_shapes nshapes = 0 shape(:)%itype = 0 shape(:)%icolour = 1 shape(:)%linestyle = 1 shape(:)%linewidth = 1 shape(:)%ifillstyle = 2 shape(:)%iunits = 1 shape(:)%iplotonpanel = 0 shape(:)%xpos = 0.5 shape(:)%ypos = 0.5 shape(:)%xlen = 1. shape(:)%ylen = 1. shape(:)%angle = 0. shape(:)%text = ' ' shape(:)%fjust = 0. shape(:)%opacity = 1. end subroutine defaults_set_shapes !----------------------------------------------------------------- ! shape submenu !----------------------------------------------------------------- subroutine submenu_shapes() use promptlist, only:prompt_list checkshapes => check_shapes addshape => add_shape delshape => delete_shape call prompt_list(nshapes,maxshapes,'shape',checkshapes,addshape,delshape) end subroutine submenu_shapes !----------------------------------- ! print the current list of shapes !----------------------------------- subroutine check_shapes(nshape) integer, intent(in) :: nshape integer :: ishape print "(/,a)", ' Current list of plot annotations:' if (nshape > 0) then do ishape=1,nshape call print_shapeinfo(ishape,shape(ishape)%itype,shape(ishape)) enddo else print "(a)",' (none)' endif end subroutine check_shapes !---------------------------------------- ! pretty-print information about a shape !---------------------------------------- subroutine print_shapeinfo(inum,itype,shapein) integer, intent(in) :: inum,itype type(shapedef), intent(in), optional :: shapein character(len=20), parameter :: fmtstring = "('Shape ',i2,': ',a)" select case(itype) case(ishape_square) print "(10x,a)",' --' write(*,fmtstring,advance='no') inum,' | | '//labelshapetype(itype) if (present(shapein)) then print "(5x,es10.2,' x ',es10.2)",shapein%xlen,shapein%ylen else print* endif print "(10x,a)",' --' case(ishape_rectangle) print "(10x,a)",' -----' write(*,fmtstring,advance='no') inum,' | | '//labelshapetype(itype) if (present(shapein)) then print "(5x,es10.2,' x ',es10.2)",shapein%xlen,shapein%ylen else print* endif print "(10x,a)",' -----' case(ishape_arrow) print "(10x,a)" write(*,fmtstring,advance='no') inum,' ------> '//labelshapetype(itype) if (present(shapein)) then print "(2x,'(x,y) = (',es10.2,es10.2,') to (x,y) = (',es10.2,es10.2,')')",& shapein%xpos,shapein%ypos,shapein%xlen,shapein%ylen else print* endif print "(10x,a)" case(ishape_circle) print "(10x,a)",' ___ ' print "(10x,a)",' / \ ' write(*,fmtstring,advance='no') inum,' ( ) '//labelshapetype(itype) if (present(shapein)) then print "(6x,'radius = ',es10.2)",& shapein%xlen else print* endif print "(10x,a)",' \___/ ' case(ishape_line) print "(10x,a)" write(*,fmtstring,advance='no') inum,' -------- '//labelshapetype(itype) if (present(shapein)) then print "(6x,'length = ',es10.2)",shapein%xlen else print* endif print "(10x,a)" case(ishape_text) print "(10x,a)", ' ' write(*,fmtstring,advance='no') inum,' TEXT ' if (present(shapein)) then print "('""',a,'""')",trim(shapein%text) else print* endif print "(10x,a)", ' ' case(ishape_function) print "(10x,a)",' _ / ' write(*,fmtstring,advance='no') inum,' / \ / '//trim(labelshapetype(itype)) if (present(shapein)) then print "(' = ',a)",trim(shapein%text) else print* endif print "(10x,a)",'/ \_/ ' case(ishape_marker) write(*,fmtstring,advance='no') inum,' (x) '//labelshapetype(itype) print "(a)" case default print "(a)" write(*,fmtstring,advance='no') inum,' '//labelshapetype(itype) print "(a)" end select end subroutine print_shapeinfo !------------------------------------------ ! utility routine to add new shape object !------------------------------------------ subroutine add_shape(istart,iend,nshape) use params, only:maxplot use prompting, only:prompt use exactfunction, only:check_function use plotlib, only:plotlib_maxlinestyle,plotlib_maxlinecolour,plotlib_maxfillstyle,plotlib_supports_alpha integer, intent(in) :: istart,iend integer, intent(inout) :: nshape integer :: i,ishape,itype,indexi,iunits,ierr,itry character(len=10) :: poslabel character(len=80) :: string itype = 1 ishape = istart + 1 if (ishape > maxshapes) then print "(/,a,i2,a)",' *** Error, maximum number of shapes (',maxshapes,') reached, cannot add any more.' print "(a)", ' *** If you hit this limit, *please email me* so I can change the default limits!' print "(a)", ' *** (and then edit shapes.f90, changing the parameter "maxshapes" to something higher...)' return endif ! !--fill prompt string with list of shapes ! indexi = 1 do i=1,maxshapetype if (i < 10) then write(string(indexi:),"(1x,i1,') ',a)") i,trim(labelshapetype(i)) else write(string(indexi:),"(1x,i2,') ',a)") i,trim(labelshapetype(i)) endif indexi = len_trim(string) + 1 enddo print "(/,a)",trim(string) !print "(i2,a)",(i,') '//trim(labelshapetype(i)),i=1,maxshapetype) over_shapes: do while(ishape <= iend .and. i <= maxshapes) if (istart==0 .or. shape(ishape)%itype <= 0 .or. shape(ishape)%itype > maxshapetype) then call prompt('choose an object type (0=none) ',shape(ishape)%itype,0,maxshapetype) endif itype = shape(ishape)%itype if (itype==0) then call delete_shape(ishape,nshape) exit over_shapes else call print_shapeinfo(ishape,itype) if (itype==ishape_function) then shape(ishape)%iunits = 1 else !--choose units do i=1,maxunits print "(i1,')',1x,a)",i,trim(labelunits(i)) enddo call prompt('enter units to use for plotting shape',shape(ishape)%iunits,0,maxunits) endif iunits = shape(ishape)%iunits select case(itype) case(ishape_square) ! square call prompt('enter length of side (in '//trim(labelunits(iunits))//')',shape(ishape)%xlen,0.) shape(ishape)%ylen = shape(ishape)%xlen poslabel = ' centre' case(ishape_rectangle) ! rectangle call prompt('enter x position of left edge (in '//trim(labelunits(iunits))//')',shape(ishape)%xpos) call prompt('enter x position of right edge (in '//trim(labelunits(iunits))//')',shape(ishape)%xlen) call prompt('enter y position of bottom edge (in '//trim(labelunits(iunits))//')',shape(ishape)%ypos) call prompt('enter y position of top edge (in '//trim(labelunits(iunits))//')',shape(ishape)%ylen) poslabel = '' case(ishape_arrow) ! arrow call prompt('enter starting x position (in '//trim(labelunits(iunits))//') ',shape(ishape)%xpos) call prompt('enter starting y position (in '//trim(labelunits(iunits))//') ',shape(ishape)%ypos) call prompt('enter finishing x position (in '//trim(labelunits(iunits))//') ',shape(ishape)%xlen) call prompt('enter finishing y position (in '//trim(labelunits(iunits))//') ',shape(ishape)%ylen) call prompt('enter (optional) text string ',shape(ishape)%text) if (len_trim(shape(ishape)%text) > 0) then call prompt('enter justification factor (0.0=left 1.0=right)',shape(ishape)%fjust) endif poslabel = '' case(ishape_circle) ! circle call prompt('enter radius (in '//trim(labelunits(iunits))//')',shape(ishape)%xlen,0.) poslabel = ' centre' case(ishape_line) ! line call prompt('enter line length (in '//trim(labelunits(iunits))//')',shape(ishape)%xlen,0.) call prompt('enter angle of line in degrees (0.0 = horizontal) ',shape(ishape)%angle) poslabel = ' starting' case(ishape_text) ! text call prompt('enter text string ',shape(ishape)%text) call prompt('enter angle for text in degrees (0 = horizontal) ',shape(ishape)%angle) call prompt('enter justification factor (0.0=left 1.0=right)',shape(ishape)%fjust) poslabel = ' starting' case(ishape_function) ! arbitrary function ierr = 1 itry = 1 do while(ierr /= 0 .and. itry <= 3) if (itry > 1) print "(a,i1,a)",'attempt ',itry,' of 3:' print "(a,6(/,11x,a),/)",' Examples: sin(2*pi*x)','sqrt(0.5*x)','x^2', & 'exp(-2*x**2)','log10(x/2)','exp(p),p=sin(pi*x)','cos(z/d),z=acos(d),d=x^2' call prompt('enter function f(x) to plot ',shape(ishape)%text) call check_function(shape(ishape)%text,ierr) if (ierr /= 0 .and. len(shape(ishape)%text)==len_trim(shape(ishape)%text)) then print "(a,i3,a)",' (errors are probably because string is too long, max length = ',len(shape(ishape)%text),')' endif itry = itry + 1 enddo if (ierr /= 0) then print "(a)",' *** too many tries, aborting ***' ishape = ishape - 1 cycle over_shapes endif poslabel = ' starting' case(ishape_marker) print "(/,' Marker options (for all from -8->31, see plot library userguide):',12(/,i2,') ',a))", & 0,'square',1,'.',2,'+',3,'*',4,'o',5,'x',12,'5-pointed star',17,'bold circle',-8,'large bold circle' call prompt('Enter marker type ',shape(ishape)%ifillstyle) poslabel = '' end select if (itype /= ishape_function .and. itype /= ishape_rectangle .and. itype /= ishape_arrow) then call prompt('enter'//trim(poslabel)//' x position (in '//trim(labelunits(iunits))//') ',shape(ishape)%xpos) call prompt('enter'//trim(poslabel)//' y position (in '//trim(labelunits(iunits))//') ',shape(ishape)%ypos) elseif (itype==7) then call prompt('enter xmin for line segment (0=ignore)',shape(ishape)%xpos) call prompt('enter xmax for line segment (0=ignore)',shape(ishape)%xlen) endif if (itype==ishape_square .or. itype==ishape_rectangle .or. itype==ishape_circle) then call prompt('enter fill style (1=solid,2=outline,3=hatch,4=crosshatch) for '// & trim(labelshapetype(itype)),shape(ishape)%ifillstyle,0,plotlib_maxfillstyle) endif if (itype /= ishape_text .and. itype /= ishape_marker) then call prompt('enter line style (1=solid,2=dash,3=dotdash,4=dot,5=dashdot) for '// & trim(labelshapetype(itype)),shape(ishape)%linestyle,0,plotlib_maxlinestyle) endif if (itype==ishape_text .or. itype==ishape_marker) then call prompt('enter character height for '//trim(labelshapetype(itype)),shape(ishape)%xlen,0.,10.) else call prompt('enter line width for '//trim(labelshapetype(itype)),shape(ishape)%linewidth,0) endif call prompt('enter '//trim(labelshapetype(itype))//' colour (0=background, 1=foreground, 2-16=plot lib colour indices)', & shape(ishape)%icolour,0,plotlib_maxlinecolour) if (plotlib_supports_alpha) then call prompt('enter '//trim(labelshapetype(itype))//' opacity (0.0-1.0)', & shape(ishape)%opacity,0.,1.) endif print "(/,' 0 : plot on every panel ',/,"// & "' -1 : plot on first row only ',/,"// & "' -2 : plot on first column only ',/,"// & "' n : plot on nth panel only ')" !--make sure the current setting falls within the allowed bounds if (shape(ishape)%iplotonpanel < -2 .or. & shape(ishape)%iplotonpanel > maxplot) shape(:)%iplotonpanel = 0 call prompt('Enter selection ',shape(ishape)%iplotonpanel,-2,maxplot) if (ishape > nshape) nshape = ishape ishape = ishape + 1 endif enddo over_shapes end subroutine add_shape !------------------------------------------ ! utility routine to delete a shape object !------------------------------------------ subroutine delete_shape(ishape,nshape) integer, intent(in) :: ishape integer, intent(inout) :: nshape integer :: i if (ishape > 0 .and. nshape > 0 .and. ishape <= maxshapes) then do i=ishape+1,nshape shape(i-1) = shape(i) enddo print "(a)",'> deleted shape: '//trim(labelshapetype(shape(ishape)%itype)) !--restore defaults shape(nshape)%itype = 0 shape(nshape)%icolour = 1 shape(nshape)%linestyle = 1 shape(nshape)%linewidth = 1 shape(nshape)%ifillstyle = 2 shape(nshape)%iunits = 1 shape(nshape)%iplotonpanel = 0 shape(nshape)%xpos = 0.5 shape(nshape)%ypos = 0.5 shape(nshape)%xlen = 1. shape(nshape)%ylen = 1. shape(nshape)%angle = 0. shape(nshape)%text = ' ' shape(nshape)%fjust = 0. nshape = nshape - 1 endif end subroutine delete_shape !------------------------------------------------------------ ! actual routine that implements plotting of various shapes !------------------------------------------------------------ subroutine plot_shapes(ipanel,irow,icolumn,itransx,itransy,time,nvar,allvars,tags) use exactfunction, only:exact_function use transforms, only:transform_inverse,transform use asciiutils, only:string_replace use plotlib, only:plot_qci,plot_qls,plot_qlw,plot_qfs,plot_qwin,plot_sci,plot_sfs,plot_slw, & plot_sci,plot_rect,plot_sls,plot_line,plot_arro,plot_circ,plot_ptxt,plot_numb,& plotlib_supports_alpha,plot_set_opacity,plot_pt1,plot_sch,plot_qch,plot_qcs use parsetext, only:parse_text,rn use params, only:ltag integer, intent(in) :: ipanel,irow,icolumn,itransx,itransy real, intent(in) :: time integer, intent(in) :: nvar real, intent(in), dimension(nvar) :: allvars character(len=*), dimension(nvar), intent(in) :: tags integer :: icolourprev,linestyleprev,linewidthprev,ifillstyle integer :: i,j,ierr,iplotonthispanel integer, parameter :: maxfuncpts = 1000 real :: xmin,xmax,ymin,ymax,dxplot,dyplot,charheightprev,ysign real :: xpos,ypos,xlen,ylen,anglerad,dx,xmini,xmaxi,xch,ych real, dimension(2) :: xline,yline real, dimension(maxfuncpts) :: xfunc,yfunc character(len=lentext) :: text real(kind=rn), dimension(nvar+1) :: vals character(len=ltag), dimension(nvar+1) :: vars ! !--store current settings ! call plot_qci(icolourprev) call plot_qls(linestyleprev) call plot_qlw(linewidthprev) call plot_qfs(ifillstyle) call plot_qch(charheightprev) ! !--convert hpos and vpos to x, y to plot arrow ! call plot_qwin(xmin,xmax,ymin,ymax) dxplot = xmax - xmin dyplot = ymax - ymin ! !--query window size in a variety of other units ! do i=1,nshapes iplotonthispanel = shape(i)%iplotonpanel if (iplotonthispanel==0 & .or.(iplotonthispanel > 0 .and. ipanel==iplotonthispanel) & .or.(iplotonthispanel==-1 .and. irow==1) & .or.(iplotonthispanel==-2 .and. icolumn==1)) then call plot_sci(shape(i)%icolour) call plot_sls(shape(i)%linestyle) if (shape(i)%itype==ishape_text .or. shape(i)%itype==ishape_marker) then call plot_sch(shape(i)%xlen) endif call plot_slw(shape(i)%linewidth) call plot_sfs(shape(i)%ifillstyle) if (plotlib_supports_alpha) call plot_set_opacity(shape(i)%opacity) anglerad = shape(i)%angle*(pi/180.) call convert_units(shape(i),xpos,ypos,xlen,ylen, & xmin,ymin,dxplot,dyplot,itransx,itransy) !call print_shapeinfo(i,shape(i)%itype,shape(i)) !print "(a)",'> plotting shape: '//trim(labelshapetype(shape(i)%itype)) select case(shape(i)%itype) case(ishape_square,ishape_rectangle) ! square, rectangle if (xlen > dxplot .or. ylen > dyplot) then print "(2x,a)",'Error: shape size exceeds plot dimensions: not plotted' else if (shape(i)%itype==1) then call plot_rect(xpos-0.5*xlen,xpos+0.5*xlen,ypos-0.5*ylen,ypos + 0.5*ylen) else call plot_rect(xpos,xlen,ypos,ylen) endif endif case(ishape_arrow) ! arrow !print "(1x,2(a,es10.2,es10.2))",trim(shape(i)%text),xpos,ypos,'->',xlen,ylen call plot_arro(xpos,ypos,xlen,ylen) !--plot text label under the arrow, if present call plot_qcs(4,xch,ych) text = trim(shape(i)%text) if (len_trim(text) > 0) then ysign = max(sign(1.,ylen-ypos),-0.15) call plot_ptxt(xpos,ypos-ysign*ych,shape(i)%angle,shape(i)%fjust,trim(text)) endif case(ishape_circle) ! circle if (xlen > dxplot .or. xlen > dyplot) then print "(2x,a)",'Error: circle radius exceeds plot dimensions: circle not plotted' else call plot_circ(xpos,ypos,xlen) if (shape(i)%ifillstyle > 2) then call plot_sfs(2) ! also plot outline if fill style is hatched call plot_circ(xpos,ypos,xlen) endif endif case(ishape_line) ! line xline(1) = xpos yline(1) = ypos xline(2) = xpos + xlen*cos(anglerad) yline(2) = ypos + xlen*sin(anglerad) call plot_line(2,xline,yline) case(ishape_text) ! text text = trim(shape(i)%text) !--handle special characters in text strings (e.g. replace %t with time) if (index(text,'%') /= 0) then vars = (/'t'/) vals(1) = real(time,kind=rn) if (nvar > 0) then vars(2:1+nvar) = tags(1:nvar) vals(2:1+nvar) = allvars(1:nvar) endif call parse_text(text,vars,vals) endif !--plot text string call plot_ptxt(xpos,ypos,shape(i)%angle,shape(i)%fjust,trim(text)) case(ishape_function) ! arbitrary function !--set x to be evenly spaced in transformed (plot) coordinates xmini = xmin xmaxi = xmax if (abs(shape(i)%xpos) > 0.) xmini = shape(i)%xpos if (abs(shape(i)%xlen) > 0.) xmaxi = shape(i)%xlen dx = (xmaxi-xmini)/real(maxfuncpts - 1) do j=1,maxfuncpts xfunc(j) = xmini + (j-1)*dx enddo !--transform x array back to untransformed space to evaluate f(x) if (itransx > 0) call transform_inverse(xfunc,itransx) call exact_function(shape(i)%text,xfunc,yfunc,0.,ierr) if (ierr==0) then !--reset x values do j=1,maxfuncpts xfunc(j) = xmini + (j-1)*dx enddo !--transform y if necessary if (itransy > 0) call transform(yfunc,itransy) !--plot the line call plot_line(maxfuncpts,xfunc,yfunc) endif case(ishape_marker) ! marker call plot_pt1(xpos,ypos,shape(i)%ifillstyle) end select endif enddo call plot_sci(icolourprev) call plot_sls(linestyleprev) call plot_slw(linewidthprev) call plot_sfs(ifillstyle) call plot_sch(charheightprev) if (plotlib_supports_alpha) call plot_set_opacity(1.0) end subroutine plot_shapes !------------------------------------------------------------ ! query function asking whether or not a point falls within ! a shape object !------------------------------------------------------------ integer function inshape(xpt,ypt,itransx,itransy,xmin,xmax,ymin,ymax) use plotlib, only:plot_qwin,plot_qtxt,plot_qcs real, intent(in) :: xpt,ypt,xmin,ymin,xmax,ymax integer, intent(in) :: itransx,itransy integer :: i real :: xpos,ypos,xlen,ylen,ysign,xch,ych real :: dxplot,dyplot real, dimension(4) :: xbox,ybox dxplot = xmax - xmin dyplot = ymax - ymin inshape = 0 do i=1,nshapes call convert_units(shape(i),xpos,ypos,xlen,ylen, & xmin,ymin,dxplot,dyplot,itransx,itransy) select case(shape(i)%itype) case(ishape_square,ishape_rectangle) ! square, rectangle case(ishape_arrow) ! arrow if (near_pt(xpos,ypos,xpt,ypt,dxplot,dyplot) .or. & near_pt(xlen,ylen,xpt,ypt,dxplot,dyplot)) then inshape = i endif call plot_qtxt(xpos,ypos,shape(i)%angle,shape(i)%fjust,trim(shape(i)%text),xbox,ybox) call plot_qcs(4,xch,ych) ysign = max(sign(1.,ylen-ypos),0.) call plot_qtxt(xpos,ypos-ysign*ych,shape(i)%angle,shape(i)%fjust,trim(shape(i)%text),xbox,ybox) if (xpt > minval(xbox) .and. xpt <= maxval(xbox) & .and. ypt > minval(ybox) .and. ypt <= maxval(ybox)) then inshape = i endif case(ishape_circle) ! circle case(ishape_line) ! line case(ishape_text) ! text call plot_qtxt(xpos,ypos,shape(i)%angle,shape(i)%fjust,trim(shape(i)%text),xbox,ybox) if (xpt > minval(xbox) .and. xpt <= maxval(xbox) & .and. ypt > minval(ybox) .and. ypt <= maxval(ybox)) then inshape = i endif end select enddo end function inshape !-------------------------------------------- ! work out whether a mouse click is "close" ! to a plotted point !-------------------------------------------- logical function near_pt(x1,y1,xc,yc,dx,dy) real, intent(in) :: x1,y1,xc,yc,dx,dy real :: xtol,ytol xtol = dx/128. ! as in 1/128th of the page width ytol = dy/128. ! as in 1/128th of the page height near_pt = ((x1-xc)**2 < xtol*xtol) .and. & ((y1-yc)**2 < ytol*ytol) end function near_pt !--------------------------------------- ! routine to edit shapes interactively !--------------------------------------- subroutine edit_shape(i,xpt,ypt,itransx,itransy,first) use plotlib, only:plot_qwin,plot_qtxt,plot_qcs integer, intent(in) :: i,itransx,itransy real, intent(in) :: xpt,ypt logical, intent(in) :: first real :: xmin,xmax,ymin,ymax,dxplot,dyplot,xlen,ylen real :: xpos,ypos,xbox(4),ybox(4),xch,ych,ysign call plot_qwin(xmin,xmax,ymin,ymax) dxplot = xmax - xmin dyplot = ymax - ymin call convert_units(shape(i),xpos,ypos,xlen,ylen, & xmin,ymin,dxplot,dyplot,itransx,itransy) select case(shape(i)%itype) case(ishape_text) call edit_textbox(xpos,ypos,shape(i)%angle,shape(i)%fjust,shape(i)%text) case(ishape_arrow) call plot_qtxt(xpos,ypos,shape(i)%angle,shape(i)%fjust,trim(shape(i)%text),xbox,ybox) call plot_qcs(4,xch,ych) ysign = max(sign(1.,ylen-ypos),0.0) if (near_pt(xlen,ylen,xpt,ypt,dxplot,dyplot)) then ! if click on head of arrow, move the tail call edit_arrow(xlen,ylen,shape(i)%xpos,shape(i)%ypos) elseif (xpt > minval(xbox) .and. xpt <= maxval(xbox) & .and. ypt-0.5*ysign*ych > minval(ybox) .and. ypt-0.5*ysign*ych <= maxval(ybox)) then ! if click on text box, edit text call edit_textbox(xpos,ypos,shape(i)%angle,shape(i)%fjust,shape(i)%text) else ! if click on tail of arrow, move the head call edit_arrow(xpos,ypos,shape(i)%xlen,shape(i)%ylen) if (first) call edit_textbox(xpos,ypos,shape(i)%angle,shape(i)%fjust,shape(i)%text) endif end select end subroutine edit_shape !-------------------------------------------------------- ! utility routine to add a new text shape interactively !-------------------------------------------------------- subroutine add_shape_interactive(xpt,ypt,itransx,itransy,ipanel,ierr,shape_type) use plotlib, only:plot_qwin,plot_qch real, intent(in) :: xpt,ypt integer, intent(in) :: itransx,itransy,ipanel integer, intent(out) :: ierr integer, intent(in), optional :: shape_type integer :: i,itype real :: xmin,xmax,ymin,ymax,xposi,yposi,charheight itype = ishape_text ! text shape by default if (present(shape_type)) itype = shape_type ierr = 0 nshapes = nshapes + 1 if (nshapes > maxshapes) then print*,' *** cannot add shape: array limits reached, delete some shapes first ***' nshapes = maxshapes ierr = 1 return endif i = nshapes shape(i)%itype = itype print*,' adding shape '//trim(labelshapetype(shape(i)%itype)) shape(i)%icolour = 1 shape(i)%linestyle = 1 shape(i)%linewidth = 1 shape(i)%ifillstyle = 2 shape(i)%iplotonpanel = ipanel ! !--position shapes relative to viewport ! shape(i)%iunits = 2 call plot_qwin(xmin,xmax,ymin,ymax) xposi = (xpt - xmin)/(xmax-xmin) yposi = (ypt - ymin)/(ymax-ymin) shape(i)%xpos = xposi shape(i)%ypos = yposi call plot_qch(charheight) shape(i)%xlen = charheight shape(i)%ylen = 1. shape(i)%angle = 0. shape(i)%text = 'click to edit' shape(i)%fjust = 0. if (itype==ishape_arrow) shape(i)%fjust = 0.5 call edit_shape(i,xposi,yposi,itransx,itransy,first=.true.) end subroutine add_shape_interactive !------------------------------------------------------------ ! utility routine to add a new text shape non-interactively !----------------------------------------------------------- subroutine add_text(xpos,ypos,string) use plotlib, only:plot_qch real, intent(in) :: xpos,ypos character(len=*), intent(in) :: string integer :: i,ierr real :: charheight ierr = 0 ! do nothing if string is blank if (len_trim(string) <= 0) return call delete_text(string) ! delete if already exists nshapes = nshapes + 1 if (nshapes > maxshapes) then print*,' *** cannot add shape: array limits reached, delete some shapes first ***' nshapes = maxshapes ierr = 1 return endif i = nshapes shape(i)%itype = 6 !print*,' adding shape '//trim(labelshapetype(shape(i)%itype)) shape(i)%icolour = 1 shape(i)%linestyle = 1 shape(i)%linewidth = 1 shape(i)%ifillstyle = 2 shape(i)%iplotonpanel = 1 shape(i)%iunits = 2 shape(i)%xpos = xpos shape(i)%ypos = ypos call plot_qch(charheight) shape(i)%xlen = charheight shape(i)%ylen = 1. shape(i)%angle = 0. shape(i)%text = string shape(i)%fjust = 0. end subroutine add_text !------------------------------------------------------------ ! delete matching text shape !----------------------------------------------------------- subroutine delete_text(string) character(len=*), intent(in) :: string integer :: i,nshapesold nshapesold = nshapes do i=1,nshapesold if (shape(i)%itype == 6 .and. shape(i)%text == trim(string)) then call delete_shape(i,nshapes) endif enddo end subroutine delete_text !----------------------------------------------------------------- ! utility routine to convert between units used in shape plotting !----------------------------------------------------------------- subroutine convert_units(shape,xpos,ypos,xlen,ylen,xmin,ymin,dxplot,dyplot,itransx,itransy) use transforms, only:transform type(shapedef), intent(in) :: shape real, intent(out) :: xpos,ypos,xlen,ylen real, intent(in) :: xmin,ymin,dxplot,dyplot integer, intent(in) :: itransx,itransy xpos = shape%xpos ypos = shape%ypos xlen = shape%xlen ylen = shape%ylen select case(shape%iunits) case(2) ! translate from viewport coordinates into plot coordinates xpos = xmin + xpos*dxplot ypos = ymin + ypos*dyplot if (shape%itype == ishape_circle) then xlen = xlen*dxplot ylen = ylen*dyplot else xlen = xmin + xlen*dxplot ylen = ymin + ylen*dyplot endif case(1) if (itransx > 0) then call transform(xpos,itransx) call transform(xlen,itransx) endif if (itransy > 0) then call transform(ypos,itransy) call transform(ylen,itransy) endif ! do nothing here case default ! should never happen print "(a)",' INTERNAL ERROR: unknown units whilst plotting shape' end select end subroutine convert_units !-------------------------------------------------------- ! utility routine to edit a text object interactively !-------------------------------------------------------- subroutine edit_textbox(xpt,ypt,angle,fjust,string) use plotlib, only:plot_stbg,plot_ptxt,plot_curs real, intent(in) :: xpt,ypt,angle,fjust character(len=1) :: mychar real :: xpt2,ypt2 character(len=*), intent(inout) :: string character(len=len(string)) :: oldstring integer :: i,ierr print*,'editing text box, esc or ctrl-c to quit' call plot_stbg(0) mychar = ' ' oldstring = string i = max(len_trim(string)+1,1) call plot_ptxt(xpt,ypt,angle,fjust,string(1:i)//'_') xpt2 = xpt ypt2 = ypt ierr = plot_curs(xpt2,ypt2,mychar) do while (mychar /= achar(13) & ! carriage return .and. mychar /= achar(27) & ! ctrl-c .and. mychar /= achar(3)) ! esc if (mychar==achar(8)) then ! backspace i = max(i - 1,1) string(i:i) = '_' call plot_ptxt(xpt,ypt,angle,fjust,string(1:i)) string(i:i) = ' ' else if (trim(string)=='click to edit') then !print*,'erasing string' string = ' ' i = 1 endif string(i:i) = mychar call plot_ptxt(xpt,ypt,angle,fjust,string(1:i)) i = min(i + 1,len(string)) if (i==len(string)) print*,' reached end of string' endif ierr = plot_curs(xpt2,ypt2,mychar) enddo !--if ctrl-c or esc, restore original string if (mychar==achar(3) .or. mychar==achar(27)) then string = oldstring print*,'cancelled' else print*,'done: text = "'//trim(string)//'"' endif call plot_stbg(-1) end subroutine edit_textbox !-------------------------------------------------------- ! utility routine to edit a text object interactively !-------------------------------------------------------- subroutine edit_arrow(xpt,ypt,x2,y2) use plotlib, only:plot_band,plot_qwin real, intent(in) :: xpt,ypt real, intent(out) :: x2,y2 character(len=1) :: char2 integer :: ierr real :: xmin,xmax,ymin,ymax ! get point in plot units ierr = plot_band(1,1,xpt,ypt,x2,y2,char2) ! transform point to viewport coordinates call plot_qwin(xmin,xmax,ymin,ymax) x2 = (x2 - xmin)/(xmax-xmin) y2 = (y2 - ymin)/(ymax-ymin) end subroutine edit_arrow end module shapes danieljprice-splash-4d1f09c/src/sort.f90000066400000000000000000000131141477365367100201700ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2017 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module sort implicit none public :: indexx, indexxi private contains subroutine indexx(n, arr, indx) !************************************************************ ! * ! This is INDEXX using the quicksort algorithm. * ! * !************************************************************ integer, parameter :: m=7, nstack=500 integer, intent(in) :: n real, dimension(n), intent(in) :: arr integer, dimension(n), intent(out) :: indx integer :: i,j,k,l,ir,jstack,indxt,itemp integer, dimension(nstack) :: istack real :: a do j = 1, n indx(j) = j enddo jstack = 0 l = 1 ir = n 1 if (ir - l < m) then do j = l + 1, ir indxt = indx(j) a = arr(indxt) do i = j - 1, 1, -1 if (arr(indx(i)) <= a) goto 2 indx(i + 1) = indx(i) enddo i = 0 2 indx(i + 1) = indxt enddo if (jstack==0) return ir = istack(jstack) l = istack(jstack - 1) jstack = jstack - 2 else k = (l + ir)/2 itemp = indx(k) indx(k) = indx(l + 1) indx(l + 1) = itemp if (arr(indx(l + 1)) > arr(indx(ir))) then itemp = indx(l + 1) indx(l + 1) = indx(ir) indx(ir) = itemp endif if (arr(indx(l)) > arr(indx(ir))) then itemp = indx(l) indx(l) = indx(ir) indx(ir) = itemp endif if (arr(indx(l + 1)) > arr(indx(l))) then itemp = indx(l + 1) indx(l + 1) = indx(l) indx(l) = itemp endif i = l + 1 j = ir indxt = indx(l) a = arr(indxt) 3 continue i = i + 1 if (arr(indx(i)) < a) goto 3 4 continue j = j - 1 if (arr(indx(j)) > a) goto 4 if (j < i) goto 5 itemp = indx(i) indx(i) = indx(j) indx(j) = itemp goto 3 5 indx(l) = indx(j) indx(j) = indxt jstack = jstack + 2 if (jstack > nstack) then print*,'fatal error!!! stacksize exceeded in sort' print*,'(need to set parameter nstack higher in subroutine indexx ' print*,' this is in the file sort.f90)' stop endif if (ir - i + 1 >= j - l) then istack(jstack) = ir istack(jstack - 1) = i ir = j - 1 else istack(jstack) = j - 1 istack(jstack - 1) = l l = i endif endif goto 1 end subroutine indexx !---------------------------------- ! integer version of above routine !---------------------------------- subroutine indexxi(n, arr, indx) !************************************************************ ! * ! This is INDEXX using the quicksort algorithm. * ! * !************************************************************ integer, parameter :: m=7, nstack=500 integer, intent(in) :: n integer, dimension(n), intent(in) :: arr integer, dimension(n), intent(out) :: indx integer :: i,j,k,l,ir,jstack,indxt,itemp integer, dimension(nstack) :: istack integer :: a do j = 1, n indx(j) = j enddo jstack = 0 l = 1 ir = n 1 if (ir - l < m) then do j = l + 1, ir indxt = indx(j) a = arr(indxt) do i = j - 1, 1, -1 if (arr(indx(i)) <= a) goto 2 indx(i + 1) = indx(i) enddo i = 0 2 indx(i + 1) = indxt enddo if (jstack==0) return ir = istack(jstack) l = istack(jstack - 1) jstack = jstack - 2 else k = (l + ir)/2 itemp = indx(k) indx(k) = indx(l + 1) indx(l + 1) = itemp if (arr(indx(l + 1)) > arr(indx(ir))) then itemp = indx(l + 1) indx(l + 1) = indx(ir) indx(ir) = itemp endif if (arr(indx(l)) > arr(indx(ir))) then itemp = indx(l) indx(l) = indx(ir) indx(ir) = itemp endif if (arr(indx(l + 1)) > arr(indx(l))) then itemp = indx(l + 1) indx(l + 1) = indx(l) indx(l) = itemp endif i = l + 1 j = ir indxt = indx(l) a = arr(indxt) 3 continue i = i + 1 if (arr(indx(i)) < a) goto 3 4 continue j = j - 1 if (arr(indx(j)) > a) goto 4 if (j < i) goto 5 itemp = indx(i) indx(i) = indx(j) indx(j) = itemp goto 3 5 indx(l) = indx(j) indx(j) = indxt jstack = jstack + 2 if (jstack > nstack) then print*,'fatal error!!! stacksize exceeded in sort' print*,'(need to set parameter nstack higher in subroutine indexx ' print*,' this is in the file sort.f90)' stop endif if (ir - i + 1 >= j - l) then istack(jstack) = ir istack(jstack - 1) = i ir = j - 1 else istack(jstack) = j - 1 istack(jstack - 1) = l l = i endif endif goto 1 end subroutine indexxi end module sort danieljprice-splash-4d1f09c/src/sph_moments.f90000066400000000000000000000135021477365367100215360ustar00rootroot00000000000000!--------------------------------------------------------------------------------- ! ! sphmoments - a utility for computing kernel-smoothed moment maps ! of observational data cubes ! ! Copyright (C) 2023 Daniel Price ! daniel.price@monash.edu ! ! -------------------------------------------------------------------------- ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! ! ------------------------------------------------------------------------- ! Version history/ Changelog: ! 0.9.7 : (06/11/23) ! fix velocity array read if comments in the fits header; ! bug fix with moment calculation if velocity array in reverse order ! 0.9.1 : (09/10/23) ! fix homebrew install ! 0.9.0 : (09/10/23) ! velocity array read correctly from fits header ! 0.8.0 : (09/10/23) ! write correct x and y units to output files; ! copy and flatten fits header from original cube ! 0.7.0 : (06/10/23) ! basic working version implemented ! ! ------------------------------------------------------------------------- ! ! Written by DJP initially as part of the exoALMA project ! !--------------------------------------------------------------------------------- program sph_moments use readwrite_fits, only:read_fits_cube,write_fits_image,get_from_header,flatten_header use iso_fortran_env, only:stderr=>error_unit, stdout=>output_unit use system_utils, only:get_command_option,count_matching_args,ienvlist use moments, only:get_moments use kernels, only:select_kernel,kernelname !$ use omp_lib, only:omp_get_num_threads implicit none character(len=256) :: file1,fileout,fileout_m(5),tagline integer :: ierr,jext,nfiles,naxes(4),k,iarglist(2),nm,ns,ikernel real, allocatable :: cube(:,:,:),moment(:,:,:),zvals(:) character(len=80), allocatable :: fitsheader(:) character(len=12) :: string real :: dv,hfac logical :: iexist integer :: moment_type(5) nfiles = count_matching_args('.fits',iarglist) tagline = 'sph_moments v0.9.7: a SPLASH imaging utility (c) 2023 Daniel Price' if (nfiles < 1) then print "(a)",trim(tagline) print "(/,a)",'Usage: sph_moments [options] infile.fits [outfile.fits]' print "(/,a)",'Options: --moments=0,1,9 [which moments to take, default=0,1,2,8,9]' print "(a)", ' --kernel=0 [which smoothing kernel to use: 0=cubic spline 2=quartic 3=quintic]' print "(a)", ' --hfac=3. [ratio of smoothing length to channel spacing in spectral dimension]' print "(a)", ' --sample=10 [factor by which to oversample line profiles, not very important]' stop endif ! ! read filenames from the command line ! call get_command_argument(iarglist(1),file1) if (nfiles >= 2) then call get_command_argument(iarglist(2),fileout) else fileout = 'moment.fits' ! if no .fits extension found in original file jext = index(file1,'.fits') fileout = file1(1:jext-1)//'_moment.fits' ! default if no output filename given endif ! ! get options from the command line ! ns = nint(get_command_option('sample')) hfac = get_command_option('hfac',default=3.) ikernel = nint(get_command_option('kernel',default=0.)) call select_kernel(ikernel) ! ! list of moments to compute ! moment_type = ienvlist('moments',size(moment_type),errval=-1) nm = 0 do k=1,size(moment_type) if (k > 1) then if (moment_type(k)==moment_type(k-1)) exit endif if (moment_type(k) >= 0 .and. moment_type(k) <= 9) then nm = nm + 1 endif enddo ! default behaviour if no moments specified is to compute all if (nm==0) then nm = 5 moment_type = (/0,1,2,8,9/) endif ! check output files do not already exist iexist = .false. do k=1,nm fileout_m(k) = fileout jext = index(fileout_m(k),'.fits') write(string,"(i0)") moment_type(k) fileout_m(k) = fileout_m(k)(1:jext-1)//trim(string)//'.fits' inquire(file=fileout_m(k),exist=iexist) if (iexist) then write(stderr,*) 'ERROR: '//trim(fileout_m(k))//' already exists: please move or rename and try again' endif enddo if (iexist) stop ! read original file write(stdout,*) '>> reading '//trim(file1) call read_fits_cube(file1,cube,naxes,ierr,hdr=fitsheader,velocity=zvals) if (ierr /= 0) stop 'error reading file' ! eliminate NaNs where (isnan(cube)) cube = 0. end where if (naxes(3) <= 1) stop 'this is a 2D image but require 3D fits cube for moment generation' ! ! find moments using either all channels or range of channels ! write(stdout,"(1x,a,f5.2)") '>> computing moments using '//trim(kernelname(ikernel))//' kernel with h/dz = ',hfac ! warn about running in serial !$omp parallel !$ if (omp_get_num_threads()<=1) write(stderr,"(/,1x,a)") & !$ 'WARNING: running in serial: type "export OMP_NUM_THREADS=8" to use 8 threads' !$omp end parallel call get_moments(cube,zvals,hfac,moment_type(1:nm),moment) ! ! write results to a fits file ! call flatten_header(fitsheader) do k=1,nm call write_fits_image(fileout_m(k),moment(:,:,k),naxes(1:2),ierr,hdr=fitsheader) enddo deallocate(cube,moment,zvals) end program sph_moments danieljprice-splash-4d1f09c/src/splash.f90000066400000000000000000001714321477365367100205030ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2025 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! ! The plotting API for SPLASH 2.0 was written by James Wetter ! wetter.j@gmail.com ! ! Work on the unified binary for SPLASH 3.0 was by Josh Calcino ! josh.calcino@gmail.com ! !----------------------------------------------------------------- program splash !--------------------------------------------------------------------------------- ! ! SPLASH - a plotting utility for SPH data in 1, 2 and 3 dimensions ! Copyright (C) 2005-2025 Daniel Price ! daniel.price@monash.edu ! ! -------------------------------------------------------------------------- ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! ! ------------------------------------------------------------------------- ! Version history/ Changelog: ! 3.11.2 : (04/04/25) ! automated plotting of star profiles from phantom relax.profile file if present; ! better automated unit guessing when comparing to exact solution from file; ! can plot two shock tube exact solutions with different gammas on top of each other; ! improved behaviour with nstepsperpage = 0; ! bug fix with labels + limits in double rendering when using auto choice of density weighted rendering; ! plotting library api updated to giza v1.5; fix hardwiring of decimal labels on y axis; ! bug fix with multiplot and multiple steps per page not printing axes correctly; ! bug fix reading sink particle data in GADGET HDF5 format; ! bug fix with vector labelling in GADGET HDF5 read ! bug fix reading density from phantom small dumps if not rendering; ! 3.11.1 : (06/12/24) ! bug fix with type recognition in sphNG data read, better wrong endian error ! message (thanks to Matthew Bate); recognise sphNG format correctly even ! if the dump is big endian; use kappa in opacity rendering if ! present in the dump file (thanks to Mike Lau) ! 3.11.0 : (25/11/24) ! opacity rendering done in parallel; ! compute bad pixel fraction in splash calc lightcurve; ! option to write fits cube in splash calc lightcurve (thanks to Fitz Hu); ! --kappatot option computes opacities using formula from Matsumoto & Metzger (2022); ! read grad(E) as a vector in phantom snapshots (thanks to Mike Lau); ! add SYSTEM=ifx for new intel compiler (thanks to Lionel Siess); ! splash calc tdiffuse option for photon diffusion time along each axis; ! improved label recognition and read all header quantities in GIZMO HDF5 data read; ! plot cross-sections by default if plotting fits data cube; ! bug fix reading phantom snapshots with APR; ! better docs on making movies (thanks to Alison Young); ! bug fix in vtk data read; ! bug fix in follow-the-label column recognition in non-cartesian coordinates (thanks to Lionel Siess) ! 3.10.3 : (04/03/24) ! bug fix reading type information from phantom dumps introduced in 3.10.2 ! 3.10.2 : (01/03/24) ! reads phantom dumps with adaptive particle refinement; ! improved splash to phantom conversion; ! better documentation of splash calc lightcurve (thanks to Chunliang Mu); ! saving dust density limits now applies to all dust species; ! 3.10.1 : (4/12/23) ! bug fix with accreted particles appearing in smoothed particle plots; ! automated Trad/Tgas in extra quantities from phantom dumps with radiation ! 3.10.0 : (30/11/23) ! --sort flag to sort filenames for comparison plots; ! --movie flag to automatically make movie from sequence of files; ! giza backend now supports direct output of mp4 movies ! 3.9.0 : (06/11/23) ! follow-the-label column choice, where if a label is selected for plotting ! from the first file, it will automagically shift to find the matching label ! in subsequent files, even if the column containing the quantity has changed; ! implemented vtk reader capable of reading snapshots from Shamrock code; ! apply transparency to smoothed particle plot only if adaptive smoothing used; ! plot colour bar by default when particle colouring by quantity is used; ! can read velocity array from fits header for position-position-velocity cubes; ! bug fix with first page being white with smoothed particle plots on black background; ! bug fix finding .comp file if underscore in the directory name ! 3.8.5 : (23/10/23) ! implemented smoothed particle plots with multiple steps per page; ! allow for .cols and .comp file in current directory even if the filepath is not the current dir; ! sphmoments utility added; added routine to extract velocity dimension from fits files; ! bug fix with repeated string replacements giving endless backslashes in labels; ! bug fix reading long filenames in denoise ! 3.8.4 : (18/08/23) ! various bugs fixed in GADGET data reader; auto-recognise GADGET block format; ! improved conservation checks in splash to grid (thanks to Avi Chen); ! better handling of AREPO data; bug fix with timestep not advancing; ! no longer ask about particle types in multiplot if only one type present ! 3.8.3 : (05/07/23) ! flip option (f/F in interactive mode) now persists across ! timesteps and works in snapshots other than the first; ! bugs fixed in Tipsy data read (thanks to Alex Pettitt); ! auto-recognition of Tipsy binary formats implemented; ! show units labels in calculated quantities list ! 3.8.2 : (12/05/23) ! phantom data read looks for .comp file containing additional composition data; ! also looks for .cols file containing any extra columns with one row per particle; ! recognise opacity if extra quantity called "kappa" calculated ! 3.8.1 : (01/05/23) ! seg faults in auto-magic exact solution mapping fixed; longer line limit in determining ! number of columns in ascii/exact solution files; ! automatically handle log in exact solution labels (e.g. logR, logT) ! 3.8.0 : (26/04/23) ! plots multiple renderings with transparent background if more than one timestep per page selected; ! auto-magically map exact solution columns onto splash columns; ! added --exact=file1,file2 to switch on plotting of exact solution from file(s); ! added --track=maxdens and --origin=maxdens to track/recentre on maximum density; ! pressing backspace over legends deletes them; ! use density weighted and normalised rendering by default in projection plots of vector fields ! 3.7.2 : (21/02/23) ! bug fix recognising labels like v_{phi} on command line, can now use -r vphi ! 3.7.1 : (09/02/23) ! libexact build failure fixed ! 3.7.0 : (09/02/23) ! splash calc extinction computes column density to all sink particles in the simulation; ! bug fix with rendering vector components (e.g. vr) in non-cartesian coordinate systems; ! bug fix with both quantities appearing in black and white when double rendering ! 3.6.0 : (31/10/22) ! skip particles with zero weight in interpolation, large speedup in some cases (thanks to T. Bending); ! splash calc plus and splash calc minus for adding/subtracting snapshots; ! added --origin=6245 flag to centre the origin on particle 6245; ! added --hdu=1 flag to read from a particular hdu in a fits file; ! use wcs coordinates / arcseconds for fits images if present in header; ! option --dense to reset to densest clump in phantom/sphNG data read (thanks to J. Wurster) ! 3.5.1 : (20/06/22) ! bug fix with autolog limits; build failures in libexact and libread fixed and now tested; ! recognise labels on command line e.g. -r density; ! limits option for centred cube (thanks to J. Wurster) ! 3.5.0 : (17/06/22) ! bug fix with blank lines in splash.titles; bug fix with large line lengths in csv files; ! allow blank labels in csv headers; bug fix with display of column labels from ascii/csv files; ! log colour bar by default when using -r flag if more than 3 orders of magnitude range ! 3.4.0 : (24/03/22) ! density weighted interpolation now applied automatically to projection ! plots of quantities that are not densities; ! added flags --codeunits or --code to enforce code units from command line; ! successfully parse csv files where some of the fields are character strings ! 3.3.5 : (01/03/22) ! bug fix with disappearing sinks in phantom MPI dumps ! 3.3.4 : (21/01/22) ! improved visual appearance of normalised renderings with free boundaries; ! automatically read planet-wake parameters from phantom file headers; ! added --wake=1,3 flag to plot wake from sink particle 3 around star 1; ! bug fix with disappearing sinks in phantom MPI dumps; fixed seg fault in fits reader ! 3.3.3 : (19/11/21) ! "splash to csv" exports to comma separated variable (.csv) format; ! automatically apply -ev flag for filenames ending in .ev, .mdot or .out; ! improved label recognition from ascii file headers; ! additional divergent colour schemes (thanks to Sahl Rowther); ! deal with merged sink particles from phantom (thanks to James Wurster); ! bug fix with units resetting to 1; skip blank and comment lines in splash.filenames ! 3.3.2 : (20/07/21) ! bug fix with -dev flag; silenced unnecessary dust warnings in sphNG read; ! change-of-limits animation sequence works for vector plots; ! automatic recognition of ndspmhd format; ! 3.3.1 : (19/07/21) ! f/F in interactive mode flips y axis on 2D plots to next column; ! gradual transparency in double rendering rather than sharp cutoff; ! removed S from main menu as now redundant; allow longer paths with -dev flag; ! added --xmin,--xmax,--ymin,--ymax flags for manual margin adjustment; ! bug fix with relativistic corrections in splash calc lightcurve ! 3.3.0 : (20/05/21) ! bug fix with surface density plot with physical units on; ! splash calc lightcurve computes spectra from local blackbody emission if T and kappa given; ! lightcurve now performs frequency-dependent ray tracing; ! added "--anglex","--angley","--anglez" flags; ! can add labelled arrows by typing ^ in interactive mode, also delete/edit; ! capital M, 0 or ncols+1 from main menu gives multiplot; ! added -multi flag for multiplot from command line ! 3.2.1 : (26/04/21) ! added --xsec=1.0 and --kappa=1.0 flags to specify cross section position ! and opacity, respectively; specifying --xsec automatically switches from projection ! to cross section; specifying --kappa turns on opacity rendering; ! bug fix in splash calc tracks; can use --track=1,2,3 to specify list of particles ! 3.2.0 : (20/04/21) ! disable ALL prompts if any command line flags set; ! all environment variables can now be given as command line flags using lower case string ! after last underscore e.g. SPLASH_CENTRE_ON_SINK=1 becomes --sink=1 on command line; ! useful options include --corotate, --sink=1, --debug and more; ! splash to grid recognises flags including --periodic, --npix=100,100,100 and --convert=1,4; ! added -gandalf and -f gandalf as shortcut for seren data read; ! assume default xw device and disable device prompt if any command line flags set; ! s/S options now do the same thing ! 3.1.1 : (31/03/21) ! automatically plot y vs x given a two-column data file; ! planet wake coordinate system added; bug fix with SPLASH_COROTATE; bug fix reading ! phantom dumps when number of particles of each type does not match itype array; ! bug fixes in grid2pdf ! 3.1.0 : (16/02/21) ! splash calc lightcurve implemented; sink particles ON by default; ! changing units rescales plot limits correctly; ! further improvements to ray tracing / opacity rendering with physical opacity; ! can change units temporarily without writing .units file; ! auto-select closest velocity and mass unit and better default time unit ! in phantom/sphNG read; error message if Inf or NaN read from .units file; ! bug fix with units prompt; floating colour bars are white not black; ! automatically write copyright in Hollywood mode; auto-render fits files; ! read softening length from phantom sinks if accretion radius is zero; ! 3.0.2 : (20/01/21) ! opacity rendering uses physical value of kappa, can also ! use opacity defined on particles; can track multiple particles with ! 'splash calc tracks' by specifying ids in splash.tracks file; ! support for SWIFT code in gadget_hdf5; auto-recognise format for .csv files; ! improved starsmasher data read; improved physical unit selection; ! exact solution lines can be plotted in background colour; ! bug fix for dead particles in phantom dumps; seg fault in fits reader fixed; ! seg fault in gadget data read fixed; bug fix in x-menu options ! 3.0.0 : (26/08/20) ! Unified splash binary with -f flag to specify format; ! automated format recognition for phantom, gadget (and hdf5 variants) and fits; ! cleaner d) menu; splash is compiled in double precision by default; ! rotation settings used in splash to grid to rotate particles; ! bug fix in mbatesph data read; pysplash utility for reading SPH ! data formats into python; libsplash.so, libexact.so and libread.so libraries ! 2.10.1 : (24/06/20) ! exact solution can appear in legend; can also plot under data; ! fits reader and denoise utility can read/write spectral cubes; text shapes can ! print header variables using %(var); can shift cross section by precise amounts ! in interactive mode using number followed by u/d; fits reader includes header ! quantities; reduced verbosity for non-interactive plots; use of fake dust particles ! is now via menu option, not environment variable; max particle types = 24; ! userguide in readthedocs format; bug fix with save limits with particle tracking; ! support for .pfm pixelmap format as output; physical units are ON by default; ! prompts only for particle types present in data ! 2.10.0 : (14/02/20) ! much improved splash to grid - bug fixes with pixel number and roundoff error; ! use Petkova (2018) method for sub-pixel rendering to 3D grid and 3D projections; ! added bytestream output formats for splash to grid and splash to ascii; ! can press number and -/+ to zoom out/in by that factor in interactive mode; ! use SPLASH_COROTATE=1,3 to corotate with arbitrary pair of sink particles; ! SPLASH_COROTATE also gives velocity field in corotating frame; ! splash to ascii can write particular columns by setting SPLASH_CONVERT=1,4; ! plasma beta correct in both code and physical units; ! working fits reader and splash-denoise utility ! 2.9.1 : (08/11/19) ! cleaner menu options for units and calculated quantities; ! surface rendering allowed with 3D perspective turned off; ! automatic labelling of grain sizes in density and column density plots; ! adaptive limits on log colour bars show 3 dex range by default; ! auto-adjust limits to device aspect ratio works with multiple panels; ! bug fixes with r-z rendering; Toomre Q prompts for mass ! 2.9.0 : (05/04/19) ! general header quantities are read and available in function parser; ! more robust label detection and parsing during ascii data read; ! splash to grid works in non-cartesian geometries; added flared and ! log-flared coordinate systems; Doppler shift colour bar; can customise ! line style and colour when plotting multiple exact solutions; seg faults fixed; ! better plot tiling decisions; disappearing arrows bug fix; Rafikov disc- ! planet exact solution added; atan2 implemented in function parser; ! various multigrain phantom read fixes (incl. seg faults); exact rendering ! implemented in 2D; libsplash implemented for use as Python splash backend ! 2.8.0 : (06/04/18) ! 360/4pi video mode added; automatically read labels from ascii file headers; ! nearest sensible unit (e.g. au or pc) used by default; cactus hdf5 data read; ! kernel-smoothed particle plots of arbitrary quantities; ! Viridis, Ocean and Inferno colour schemes; can customise line colours; ! Bondi flow exact solution; option for ticks but no labels; ! correct units in surface density plots; colour bar on top or left; ! support for multi-grain dust in Phantom; bug fix with NaNs in ascii files ! 2.7.0 : (03/05/17) ! Hollywood mode added (ctrl-m in interactive mode); better handling of dust/gas ! phantom data; added rotated cartesian geometry; rendering implemented in r-phi ! coordinates; added Fortran 2008 intrinsics to function parser; better rectangle ! plotting; better falcON data read; Ogilvie-Lubow exact solution for planet-disc ! interaction; tipsy read now works when splash compiled in double precision; ! splash to gridascii2 implemented; bugs with r-phi rendering fixed ! 2.6.0 : (22/10/15) ! SILO, falcON and .pbob data reads implemented; bug fixes in gadget-hdf5 reader; ! can recognise particle types in ascii read; more robust sphNG read; ! dust fraction recognised in phantom data read; Toomre Q works in physical units; ! bug fix with disappearing units labels; bug fix in shock tube exact solution; ! added splash calc delta; splash to ascii keeps precision; better power spectra ! 2.5.1 : (29/01/15) ! error bar style options; support for 5K displays; can plot vectors ! and render with colours if h not read; range restrictions apply during splash to grid; ! improved line-style legend; now up to 6 line styles; fixes to amuse-hdf5 read; ! phantom read handles star/dm particles; various bugs fixed ! 2.5.0 : (22/08/14) ! instant multiplots by giving multiple columns as y axis; ! ability to plot multiple exact solution files on same plot; ! compiles in parallel by default; support for tagged sphNG/Phantom format; ! AMUSE hdf5 format reader added; various bug fixes ! 2.4.1 : (01/04/14) ! Roche-lobe plotting vastly improved; newunit= issue fixed; ! bug fix with reading sink velocities from Phantom; other minor bug fixes. ! 2.4.0 : (21/02/14) ! time formatting in legend can include general functions like %(t + 1000); ! option to include sinks in opacity rendering; ! supports one-fluid dust visualisation; ! C-shock exact solution; better polytrope solution ! 2.3.1 : (11/11/13) ! SPLASH_COROTATE option to plot in frame corotating with sinks; ! bug fixes with handling of dead/accreted/boundary particles in sphNG/phantom; ! various other bugs fixed. ! 2.3.0 : (09/08/13) ! can customise time formatting in legend; improvements to legends; ! less verboseness; splash can read and plot pixel maps produced with -o ascii; ! 3D vector field plotting improved; bug fix with gfortran 4.8 ! 2.2.2 : (10/05/13) ! particle tracking by type implemented; ! can interpolate specific columns in splash to grid; ! SPLASH_CENTRE_ON_SINK option generic to all data reads; ! Aly Reheam format added; option for 2nd y axis on plots; ! bug fix with X11 linking on Ubuntu; can read gadget ICs files ! 2.2.1 : (21/02/13) ! minor bug with axes plotting fixed; ! Wendland kernels added; bugs with exact solution plotting fixed; ! bug fix with tracking of dark matter particles ! 2.2.0 : (16/11/12) ! option to use different kernels for interpolation; ! floating/inset colour bars added; ! splash to gadget conversion implemented; ! splash to grid works in 2D; ! improved interfaces to shapes and animation sequences; ! automatically turns on dark matter particle plotting if no gas; ! interactive mode help displayed automatically ! 2.1.1 : (31/08/12) ! irregular/circular particle selection using shift-left/middle click; ! improved h5part and GADGET HDF5 data reads; ! splash can be compiled in double precision; ! bug fixes with calculated quantities + change of coordinate systems; ! improved vector plot legend; option for box+numbers but no labels added ! 2.1.0 : (16/05/12) ! 3D vector field visualisation added; ! GADGET HDF5 read implemented; ! page sizes can be specified in pixels; ! limits can auto-adapt to device aspect ratio; ! more general exact solution from file option; ! tiling works with one colour bar per row; ! splash calc handles different particle types ! 2.0.0 : (29/08/11) ! new giza backend - antialiased lines; real fonts; pdf, eps and svg drivers; ! fewer build dependencies (only cairo, X11); ! support for semi-transparent text; ! Double rendering (with transparent background) implemented. ! 1.15.0 : (29/08/11) ! Multiplot with different particle types implemented; calculated quantities ! list is now pre-filled automatically; preliminary support for r-phi and r-z ! rendering; outlined solid markers implemented; better handling of multiple types; ! manual contour levels can be specified in splash.contours; parallel splash to grid; ! better support for non-square pixels; clipping of numbers at edge of viewport fixed ! 1.14.1 : (17/03/11) ! SEREN data read added; dragon read updated; build follows Gnu conventions ! on DEST and DESTDIR (needed for macports build); can have up to 12 particle types; ! exact solutions re-ordered; dusty wave exact solution added ! 1.14.0 : (06/12/10) ! Can flip between rendered quantities in interactive mode using 'f/F'; ! SPLASH_DEFAULTS variable can be set for system-wide defaults; ! can plot arbitrary functions of x,t as exact solution; asplash better ! handles blank lines in header and can specify time, gamma location with ! env. variables; added data read for the H5PART format; GADGET read ! across multiple files implemented; VINE read works with particle injection; ! error bars can be plotted for both x and y axis simultaneously; ! default rotation angles are set if 3D perspective turned on; ! new directory layout and more helpful error messages during build; ! PGPLOT linking is easier to get right. ! 1.13.1 : (26/02/10) ! bugs with new calc_quantities module fixed; generic library interface ! implemented so backend can be changed easily; bug fix with auto pixel selection; ! simpler foreground/background colour setting; added subgrid interpolation warning ! 1.13.0 : (25/02/10) ! function parser incorporated; calculated quantities can now be specified ! at runtime, arbitrary function plotting implemented as an exact ! solution; command-line SPH->grid conversion ("splash to grid") ! implemented; ctrl-t in interactive mode adds arbitrary text box; ! better line style/colour changing; bug fix with tiling and y-axis labels; ! various other bug fixes. ! 1.12.2 : (15/07/09) ! Variable marker sizes added, can plot particles as circles with ! size proportional to h; dark matter rendering with block-labelled ! GADGET format fixed; VINE read handles star particles; TIPSY read ! with ifort10.0.0 works; snsph read added; splash to phantom added; ! does not override labels for coords, vectors by default; bug fixes ! with contouring options; stability bug fixes with older compilers; ! more robust memory handling; bug fix with automatic pixel selection ! causing seg fault. ! 1.12.1 : (20/04/09) ! Can edit/delete text shapes interactively, also the colour bar label; can customise ! the label on projection plots; contour levels better defined; SPLASH_HMIN_CODEUNITS added; ! option for numeric labelling of contours; contour limits can be set separately ! to render limits for same quantity; minor bug fixes. ! 1.12.0 : (22/12/08) ! Command-line plotting implemented; ln transform added; bug fixes in GADGET read; ! Backspace over annotation (legends,titles,axes,colour bar) in interactive mode ! removes it; "splash calc" command line utility calculates time sequences of ! global quantities from a sequence of dump files; bug fix causing seg fault. ! 1.11.1 : (13/10/08) ! automatic number of pixels and exact pixel boundaries implemented; ! mass does not have to be read from dump file; frame changes are per-page ! not per-dump file for animation sequences; lower stacksize footprint; ! bug fix with circles of interaction; bug fixes with block-labelled GADGET read; ! Steve Foulkes data read added. ! 1.11.0 : (15/08/08) ! ability to use subset of particles in restricted parameter range(s); ! probability density function plot option; plot-hugging colour bars added; ! ability to annotate plot with a range of shapes; v,V,w and H implemented ! in interactive mode for >1 panel; various bug fixes (including one with vphi). ! 1.10.2 : (08/05/08) ! disc surface density / toomre q parameter plotting added; flash colour ! schemes added; splash to binary convert option; can change order in ! which particle types are plotted; splash.columns file overrides ! column label settings; vanaverbeke format read; various bug fixes. ! 1.10.1 : (11/03/08) ! "splash to" command line option converts binary dumps to ascii format; ! vector plots + rotation now implemented; block labelled GADGET format read; ! ring-spreading exact solution added. ! 1.10.0 : (28/11/07) ! horizontal colour bars implemented; -p, -o command line options; ! can have mixed types in data reads; TIPSY and DRAGON data reads; ! density weighted rendering; normalisation applies to column ! density plots; improved particle tracking; save as option; various bug fixes ! 1.9.2 : (12/09/07) ! improvements to ascii read including asplash -e option; ! smarter foreground/background colour changing for titles; ! min=max problem fixed (caught by splash not pgplot); ! fixed vector arrow length option; other minor changes and bug fixes ! 1.9.1 : (11/07/07) ! environment variables + improvements to gadget data read; better ! prompting; 3 new colour schemes; improved legend/title options; ! other minor changes ! 1.9.0 : (21/05/07) ! animation sequences implemented; origin settings now affect radius ! calculation and are relative to tracked particle; automatic line ! width choice for postscript devices; w key adapts vector arrows; ! vastly improved userguide ! 1.8.1 : (28/03/07) ! option to hide vector arrows where there are no particles added; ! smoother 3D plotting at low pixel numbers; ! smoother vector plots; bug fixes with a); issues with ! round-off error with z integration of vectors fixed. ! 1.8.0 : (14/03/07) ! hidden particles not used in rendering; units for z integration added; ! a) & g) implemented in interactive mode for multiple-plots-per-page; ! improved cross section using x in interactive mode ! 1.7.2 : (19/02/07) ! Menu shortcuts implemented; bug fix/ more sensible transformation ! of angular vector components in different co-ordinate systems; ! improvements to interactive zoom and origin recentreing; ! improved colour-by-type option; restrictions on page size removed; ! minor bug fixes ! 1.7.1 : (04/01/07) ! command line options for defaults and limits files added; ! minor bug fixes ! 1.7.0 : (13/12/06) ! renamed SPLASH instead of SUPERSPHPLOT; much faster data read ! for gadget and sphNG reads (only required columns read); ! physical units can be saved to file; new menu formats; various ! other bug fixes ! 1.6.2 : (24/10/06) ! fast particle plotting and streamline plotting implemented; ! more bug fixes with interactive mode on multiplots; various other bug fixes ! 1.6.1 : (24/8/06) ! bug fixes to 1.6.0, further improvements to interactive mode on multiplots ! 1.6.0 : (10/8/06) ! Interactive mode on multiple plots per page; highly optimised interpolation ! + parallel version; new Makefile; various bug fixes ! 1.5.4 : (06/7/06) ! Handles multiple SPH/non-SPH particle types; axes redrawn after rendering; ! minor bug fixes ! 1.5.3 : (27/6/06) ! minor bug fixes/improvements to multiple plots per page; colour bar labelling ! tiled plots; legend; Accelerated rendering option for projections. ! 1.5.2 : (11/5/06) ! "S)" option for saving limits and defaults; MUCH faster interactive ! replotting (no unnecessary re-rendering); a few other minor things ! 1.5.1 : (26/4/06) ! docs updated for v1.5, other minor changes ! 1.5.0 : (17/3/06) ! 3D perspective added; 3D opacity rendering; improved rotation, ! colour schemes; adjustable vector arrows (+legend); improved timestepping ! behaviour; speed enhancements; physical unit rescaling ! 1.0.5 : (28/9/05) ! error calculation for exact solutions; legend for plot markers; ! exact_densityprofiles added; more colour schemes; ! unit rescaling improved; other minor changes + bug fixes ! 1.0.4 : (17/8/05) ! better colour schemes; interactive colour scheme changing; ! various minor changes and bug fixes ! 1.0.3 : (5/7/05) ! rescale data option; better page setup; improved zooming; ! interactive particle tracking; various minor changes and bug fixes ! 1.0.2 : ! much improved ascii data read; better line plotting; zoom on ! powerspectrum plots + various bug fixes ! 1.0.1 : ! bug fixes relating to colour bars on multiplots ! 1.0.0 : ! first official release; version given to many people at IPAM ! meeting and put on web ! ! ------------------------------------------------------------------------- ! ! Modules/subroutines as follows (in alphabetical order): ! ! allocate : allocates memory for main arrays ! calc_quantities : calculates additional quantities from particle data ! colours : colour schemes for rendering ! colourparts : colours particles ! defaults : writes/reads default options to/from file ! exact : module handling exact solution settings ! exact_fromfile : reads an exact solution tabulated in a file ! exact_mhdshock : some tabulated solutions for mhd shocks ! exact_polytrope : exact solution for a polytrope ! exact_rhoh : exact relation between density and smoothing length ! exact_sedov : exact solution for sedov blast wave ! exact_shock : exact solution for hydrodynamic shocks ! exact_wave : exact solution for a propagating sine wave ! exact_toystar1D : exact solution for the 1D toy star problem ! exact_toystar2D : exact solution for the 2D toy star problem ! fieldlines : module handling streamline plotting ! get_data : wrapper for main data read ! geometry : module handling different coordinate systems ! globaldata : various modules containing "global" variables ! interactive : drives interactive mode ! interpolate1D : interpolation of 1D SPH data to grid using kernel ! interpolate2D : interpolation of 2D SPH data to grid ! interpolate3D_xsec : 3D cross section interpolations ! interpolate3D_projection : 3D interpolation integrated through domain ! legends : plots (time) legend on plot ! limits : sets initial plot limits and writes to/reads from limits file ! menu : main menu ! options_data : sets options relating to current data ! options_limits : sets options relating to plot limits ! options_page : sets options relating to page setup ! options_particleplots : sets options relating to particle plots ! options_powerspec : sets options for power spectrum plotting ! options_render : sets options for render plots ! options_vector : sets options for vector plots ! options_xsecrotate : sets options for cross sections and rotation ! particleplot : subroutines for particle plotting ! plotstep : main subroutines which drive plotting of a single timestep ! powerspectrums : calculates power spectrum of 1D data (2 methods) ! read_data_dansph : reads data from my format of data files ! read_data_mbate : reads data from matthew bate's format of data files ! render : takes array of pixels and plots render map/contours etc ! rotate : subroutines controlling rotation of particles ! setpage : sets up the PGPLOT page (replaces call to PGENV/PGLAB) ! splash : main program, drives menu loop ! timestepping : controls stepping through timesteps ! titles : reads a list of titles to be used to label each timestep ! transform : applies various transformations to data (log10, 1/x, etc) ! ! File format is specified in the subroutine read_data ! ! See the svn logs for a full ChangeLog ! ! Plots can be of two types: co-ordinate plots or not ! ! 1) Co-ordinate plots have co-ordinates as x and y axis ! these plots can be rendered with any scalar or vector array. ! ! The rendering routines interpolate from the particles to either ! a 2D or 3D grid. In 3D you can either render to a 3D grid and take ! cross sections, or render to a 2D grid using a table of the integrated ! SPH kernel. This 2D rendering results in a map of the quantity ! integrated through the third co-ordinate. ! Rendering to a full 3D grid can be quite slow - it is used only ! if many cross sections are taken all at once from the same data. ! ! 2) other plots have a variety of options, with lines joining the particles ! and various exact solutions. Plot limits can be fixed or adaptive. ! ! multiplot enables you to set up multiple plots per page, mixing from any type. ! !---------------------------------------------------------------------------------- use filenames, only:rootname,nfiles,maxfile,defaultsfile,limitsfile, & fileprefix,set_filenames use getdata, only:get_data use geomutils, only:set_coordlabels use defaults, only:defaults_set,defaults_read,defaults_set_360 use initialise,only:defaults_set_initial use limits, only:read_limits,lim,set_limits use kernels, only:ikernel,select_kernel_by_name,select_kernel use mainmenu, only:menu,allowrendering,set_extracols use mem_allocation, only:deallocate_all use projections3D, only:setup_integratedkernel use settings_data, only:buffer_data,lowmemorymode,debugmode,ndim,ncolumns,iexact,& ncalc,nextra,numplot,ndataplots,device,ivegotdata,iautorender,& track_string,iRescale,enforce_code_units,UseTypeinRenderings use system_commands, only:get_number_arguments,get_argument use system_utils, only:lenvironment,renvironment,envlist, & get_environment_or_flag,get_command_option,get_command_flag use asciiutils, only:read_asciifile,basename,match_column,& sort_filenames_for_comparison,split,extension use write_pixmap, only:isoutputformat,iwritepixmap,pixmapformat,isinputformat,ireadpixmap,readpixformat use convert, only:convert_all use write_sphdata, only:issphformat use readwrite_griddata, only:isgridformat,print_gridformats use analysis, only:isanalysis use timestepping, only:timestep_loop use settings_page, only:interactive,nomenu,xminpagemargin,xmaxpagemargin,yminpagemargin,ymaxpagemargin use settings_part, only:initialise_coord_transforms use settings_render, only:icolours,rgbfile,npix use settings_xsecrot, only:xsec_nomulti,xsecpos_nomulti,taupartdepth,use3Dopacityrendering,& irotate,anglex,angley,anglez use colours, only:rgbtable,ncoltable,icustom use readdata, only:select_data_format,guess_format,print_available_formats use set_options_from_dataread, only:set_options_dataread use exact, only:ispiral,nfiles_exact=>nfiles,filename_exact use multiplot, only:itrans use labels, only:lenlabel,label,unitslabel,shortlabel,irho use interactive_routines, only:set_movie_mode implicit none integer :: i,ierr,nargs,ipickx,ipicky,irender,icontour,ivecplot,il logical :: ihavereadfilenames,evsplash,doconvert,useall,iexist,use_360,got_format,do_multiplot logical :: using_default_options,got_exact character(len=120) :: string,exactfile character(len=12) :: convertformat character(len=lenlabel) :: stringx,stringy,stringr,stringc,stringv character(len=*), parameter :: version = 'v3.11.2 [4th April 2025]' ! ! initialise some basic code variables ! call defaults_set_initial ! ! make default format ascii ! call select_data_format('ascii',ierr) ! ! default names for defaults file and limits file ! fileprefix = 'splash' call set_filenames(trim(fileprefix)) evsplash = .false. lowmemorymode = lenvironment('SPLASH_LOW_MEM') .or. lenvironment('SPLASH_LOWMEM') debugmode = lenvironment('SPLASH_DEBUG') ! ! read all arguments off command line ! call get_number_arguments(nargs) ! ! extract command line arguments and filenames ! i = 0 nfiles = 0 iwritepixmap = .false. ireadpixmap = .false. doconvert = .false. useall = .false. nomenu = .false. got_format = .false. got_exact = .false. ipickx = 0 ipicky = 0 irender = 0 icontour = 0 ivecplot = 0 use_360 = .false. do_multiplot = .false. device = '' stringx = '' stringy = '' stringr = '' stringc = '' stringv = '' do while (i < nargs) i = i + 1 call get_argument(i,string) if (string(1:1)=='-') then select case(trim(string(2:))) case('x') i = i + 1 call get_argument(i,stringx) if (len_trim(stringx)==0) call print_usage(quit=.true.) nomenu = .true. case('y') i = i + 1 call get_argument(i,stringy) if (len_trim(stringy)==0) call print_usage(quit=.true.) nomenu = .true. case('multi','-multiplot','-multi') do_multiplot = .true. nomenu = .true. case('render','r','ren') i = i + 1 call get_argument(i,stringr) if (len_trim(stringr)==0) call print_usage(quit=.true.) nomenu = .true. case('contour','c','cont','con') i = i + 1 call get_argument(i,stringc) if (len_trim(stringc)==0) call print_usage(quit=.true.) case('vec','vecplot') i = i + 1 call get_argument(i,stringv) if (len_trim(stringv)==0) call print_usage(quit=.true.) nomenu = .true. case('dev','device') i = i + 1 call get_argument(i,device) case('movie','-movie') device = '/mp4' case('l') i = i + 1 call get_argument(i,limitsfile) case('d') i = i + 1 call get_argument(i,defaultsfile) case('p') i = i + 1 call get_argument(i,string) if (len_trim(string) > 0) then fileprefix = trim(string) call set_filenames(trim(fileprefix)) endif case('o','writepix','wpix') i = i + 1 call get_argument(i,string) if (isoutputformat(string)) then iwritepixmap = .true. pixmapformat = trim(string) else stop endif case('readpix','rpix') i = i + 1 call get_argument(i,string) if (isinputformat(string)) then ireadpixmap = .true. readpixformat = trim(string) else stop endif case('e','ev') evsplash = .true. fileprefix = 'evsplash' call set_filenames(trim(fileprefix)) got_format = .true. case('360','4pi','fourpi') use_360 = .true. ipickx = 2 ipicky = 3 nomenu = .true. case('exact') i = i + 1 call get_argument(i,string) if (len_trim(string) > 0) then exactfile = string got_exact = .true. else stop 'error in -exact flag' endif case('lowmem','lm') lowmemorymode = .true. case('nolowmem','nlm') lowmemorymode = .false. case('-buffer','b','buffer') buffer_data = .true. case('f','-format') i = i + 1 call get_argument(i,string) call select_data_format(string,ierr) if (ierr/=0) then if (len_trim(string) > 0) then print "(a)",' *** file format '''//trim(string)//''' not found ***' endif call print_available_formats stop endif got_format = .true. case('-formats') call print_available_formats stop case('-help') call print_usage print "(/,a,/)",'Userguide: https://splash-viz.readthedocs.io' stop case default if (.not. got_format) call select_data_format(string(2:),ierr) if (ierr /= 0 .and. string(2:2) /= '-') then call print_usage print "(a)",'unknown command line argument '''//trim(string)//'''' stop endif end select elseif (trim(string)=='to' .or. trim(string)=='allto') then ! !--for converting SPH formats ! if (trim(string)=='allto') useall = .true. i = i + 1 call get_argument(i,string) if (isgridformat(string)) then doconvert = .true. convertformat = trim(string) elseif (issphformat(string)) then doconvert = .true. convertformat = trim(string) else call print_gridformats('all') stop endif elseif (trim(string)=='calc') then ! !--for performing analysis on a sequence of dump files ! i = i + 1 call get_argument(i,string) if (isanalysis(string)) then doconvert = .true. convertformat = trim(string) else stop endif elseif (len_trim(string) > 0) then nfiles = nfiles + 1 if (nfiles <= maxfile) then rootname(nfiles) = trim(string) endif endif enddo ! ! select -ev mode automatically if filename ends in .ev, .mdot or .out ! if (nfiles > 0) then il = len_trim(rootname(1)) if (extension(rootname(1))=='.ev' .or. & extension(rootname(1))=='.mdot' .or. & extension(rootname(1))=='.out') then evsplash = .true. fileprefix = 'evsplash' call set_filenames(trim(fileprefix)) endif endif ! ! print header ! call print_header ! ! set default options (used if defaults file does not exist) ! call defaults_set(evsplash) if (use_360) call defaults_set_360() ! ! read default options from file if it exists ! call defaults_read(defaultsfile) ! ! look for a system-wide defaults file if the environment ! variable SPLASH_DEFAULTS is set, no local file is present ! and no alternative prefix has been set. ! using_default_options = .true. inquire(file=defaultsfile,exist=iexist) if (iexist) then using_default_options = .false. elseif (trim(fileprefix)=='splash') then call get_environment_or_flag('SPLASH_DEFAULTS',string) if (len_trim(string) /= 0) then i = index(string,'.defaults') if (i > 0) then defaultsfile = trim(string) else defaultsfile = trim(string)//'.defaults' endif print "(a)",' Using SPLASH_DEFAULTS='//trim(defaultsfile) call defaults_read(defaultsfile) call set_filenames(trim(fileprefix)) using_default_options = .false. endif endif ! ! set options based on command line flags that OVERRIDE settings in the defaults file ! if (get_command_flag('kappa')) then ! e.g. --kappa=10.0 taupartdepth = get_command_option('kappa',default=taupartdepth) use3Dopacityrendering = .true. endif if (get_command_flag('xsec')) then ! e.g. --xsec=1.0 xsecpos_nomulti = get_command_option('xsec',default=xsecpos_nomulti) xsec_nomulti = .true. ! set cross section to true if --xsec was set endif if (get_command_flag('anglex')) then ! e.g. --anglex=1.0 anglex = get_command_option('anglex',default=anglex) irotate = .true. endif if (get_command_flag('angley')) then ! e.g. --angley=1.0 angley = get_command_option('angley',default=angley) irotate = .true. endif if (get_command_flag('anglez')) then ! e.g. --anglez=1.0 anglez = get_command_option('anglez',default=anglez) irotate = .true. endif if (get_command_flag('npix')) then ! e.g. --npix=128 npix = get_command_option('npix',default=real(npix)) endif if (get_command_flag('track')) then ! e.g. --track=508264 call get_environment_or_flag('SPLASH_TRACK',track_string) endif if (get_command_flag('wake')) then iexact = 17 ispiral = 1 endif if (.not.got_exact .and. get_command_flag('exact')) then ! e.g. --exact=myfile.dat iexact = 2 call envlist('exact',nfiles_exact,filename_exact) if (len_trim(filename_exact(1))==0) then print "(a)",'error command line argument --exact=file requires filename' stop endif elseif (got_exact) then iexact = 2 ! override setting in defaults file call split(exactfile,',',filename_exact,nfiles_exact) endif if (get_command_flag('codeunits') .or. get_command_flag('code')) then iRescale = .false. enforce_code_units = .true. endif xminpagemargin = renvironment('SPLASH_MARGIN_XMIN',errval=0.) xmaxpagemargin = renvironment('SPLASH_MARGIN_XMAX',errval=0.) yminpagemargin = renvironment('SPLASH_MARGIN_YMIN',errval=0.) ymaxpagemargin = renvironment('SPLASH_MARGIN_YMAX',errval=0.) ! ! check that we have got filenames ! if (nfiles > 0) then if (nfiles > maxfile) then print*,' WARNING: number of files >= array size: setting nfiles = ',maxfile nfiles = maxfile endif endif if (nfiles >= 1 .and. rootname(1)(1:1) /= ' ') then ihavereadfilenames = .true. if (nfiles > 1) print*,nfiles,' filenames read from command line' else ihavereadfilenames = .false. !print "(a)",' no filenames read from command line' call read_asciifile(trim(fileprefix)//'.filenames',nfiles,rootname,skip=.true.) !print*,nfiles,' filenames read from '//trim(fileprefix)//'.filenames file' if (nfiles > 0) then ihavereadfilenames = .true. else call get_argument(0,string) print "(/,a/,/,5x,a)",' Usage: ',trim(basename(string))//' snap_0* (or use '& //trim(fileprefix)//'.filenames to list files)' print "(5x,a,/)",trim(basename(string))//' --help (for all command line options)' stop endif endif if (lowmemorymode) print "(a)",' << running in low memory mode >>' ! ! Guess format if not already set ! if (.not. got_format .and. ihavereadfilenames) then call guess_format(nfiles,rootname,ierr) endif if (ihavereadfilenames .and. get_command_flag('sort')) then call sort_filenames_for_comparison(nfiles,rootname) endif if (ikernel==0) then !--if no kernel has been set call get_environment_or_flag('SPLASH_KERNEL',string) if (len_trim(string) > 0) then call select_kernel_by_name(string) else call select_kernel(0) endif else call select_kernel(ikernel) endif ! set geometry defaults call initialise_coord_transforms if (doconvert) then ! ! batch convert all dump files into the output format ! call convert_all(convertformat,ihavereadfilenames,useall) else ! ! read data from file ! if (buffer_data) then call get_data(-1,ihavereadfilenames) else call get_data(1,ihavereadfilenames,firsttime=.true.) endif ! ! override some options based on specifics of the data ! (e.g. switch on sink particles if there is no gas) ! call set_options_dataread() ! ! translate from string to column id ! if (nomenu) then ipickx = match_column(shortlabel(label(1:numplot),unitslabel(1:numplot),lc=.true.),stringx) ipicky = match_column(shortlabel(label(1:numplot),unitslabel(1:numplot),lc=.true.),stringy) irender = match_column(shortlabel(label(1:numplot),unitslabel(1:numplot),lc=.true.),stringr) icontour = match_column(shortlabel(label(1:numplot),unitslabel(1:numplot),lc=.true.),stringc) ivecplot = match_column(shortlabel(label(1:numplot),unitslabel(1:numplot),lc=.true.),stringv) endif ! ! for some data reads we can automatically plot a particular column ! if (irender == 0 .and. iautorender > 0) then irender = iautorender nomenu = .true. elseif (ncolumns==2) then nomenu = .true. if (ipicky==0) ipicky = 2 if (ipickx==0) ipickx = 1 endif ! set default device to /xw if command line flags set if (nomenu .and. len_trim(device)==0) device = '/xw' ! read tabulated colour table, if necessary if (abs(icolours)==icustom) then call read_asciifile(rgbfile,ncoltable,rgbtable,ierr) if (ierr /= 0 .or. ncoltable <= 0) then print "(a)",'ERROR: could not read colours from '//trim(rgbfile) else print "(a,i3,a)",'read ',ncoltable,' colours from '//trim(rgbfile) endif endif ! ! setup kernel table for fast column density plots in 3D ! call setup_integratedkernel ! ! read plot limits from file (overrides get_data limits settings) ! if (ivegotdata) call read_limits(trim(limitsfile),ierr) ! ! if device is mp4 auto-render column density in Hollywood mode if nothing is set ! if (device == '/mp4' .and. irender == 0) then irender = irho nomenu = .true. if (using_default_options) call set_movie_mode(.false.) endif ! ! use log colour bar by default if more than 3 orders of magnitude range ! (and no limits file and using default options) ! if (ivegotdata .and. ierr /= 0 .and. irender > 0 .and. using_default_options) then ! get masked limits to avoid dead particles giving 0 as lower bound call set_limits(1,1,irender,irender,UseTypeinRenderings) if (all(lim(irender,:) > 0.)) then if (log10(lim(irender,2)/lim(irender,1)) > 3) itrans(irender) = 1 endif endif if (nomenu) then ! ! initialise the things we would need if we called menu directly ! call set_extracols(ncolumns,ncalc,nextra,numplot,ndataplots) call set_coordlabels(numplot) interactive = .false. ! ! check command line plot invocation ! if (do_multiplot) then if (ipicky > 0) print "(a)",' WARNING: ignoring -y option with -multi flag' ipicky = numplot+1 endif if (ipicky > 0 .and. ipicky <= numplot+1) then if (ipicky <= numplot .and. (ipickx==0 .or. ipickx > numplot)) then print "(a)",' ERROR: x plot not set or out of bounds (use -x col)' stop endif if (irender > 0) then if (.not.allowrendering(ipicky,ipickx,xsec_nomulti)) then print "(a)",' ERROR: cannot render with x, y choice (must be coords)' stop endif if (icontour > numplot .or. icontour < 0) then print "(a)",' ERROR: contour plot choice out of bounds' stop endif elseif (icontour > 0) then print "(a)",' ERROR: -cont also requires -render setting' stop elseif (use_360) then print "(a)",' ERROR -360 also requires -render setting (e.g. -r 6)' stop endif else if (irender > 0 .and. ndim >= 2) then ipicky = 2 ipickx = 1 if (.not.allowrendering(ipicky,ipickx)) then print "(a)",' ERROR: cannot render' stop endif if (icontour > numplot .or. icontour < 0) then print "(a)",' ERROR: contour plot choice out of bounds' stop endif else print "(a)",' ERROR: y plot not set or out of bounds (use -y col)' stop endif endif if (irender > numplot .or. irender < 0) then print "(/,a)",' ERROR: render plot choice out of bounds' stop endif call timestep_loop(ipicky,ipickx,irender,icontour,ivecplot) ! ! if we invoked an interactive device, enter the menu as usual, otherwise finish ! if (interactive) call menu else ! ! enter main menu ! call menu endif endif ! ! deallocate all memory (not strictly necessary) ! call deallocate_all contains !------------------------------------------------------ ! this subroutine prints the splash screen on startup !------------------------------------------------------ subroutine print_header print 10 10 format( & " _ _ _ _ _ ",/, & " _(_) ___ _ __ | | __ _ ___| |__ (_) _ (_)",/, & " _ (_) _ / __| '_ \| |/ _` / __| '_ \ _ (_) ",/, & " (_) _ (_) \__ \ |_) | | (_| \__ \ | | | _ (_) _ ",/, & " (_) _ |___/ .__/|_|\__,_|___/_| |_| (_) _ (_) ",/, & " (_) (_)|_| (_) (_) (_)(_) (_)(_) (_)(_) ") print 20 20 format(/, & ' ( B | y ) ( D | a | n | i | e | l ) ( P | r | i | c | e )',/) print "(a)",' ( '//trim(version)//' Copyright (C) 2005-2025 )' print 30 30 format(/, & ' * SPLASH comes with ABSOLUTELY NO WARRANTY. This is ',/, & ' free software; can redistribute w/conditions (see LICENCE) *',/,/, & ' https://splash-viz.readthedocs.io',/,/, & ' Please cite Price (2007), PASA 24, 159 if you use SPLASH in print',/) end subroutine print_header subroutine print_usage(quit) use filenames, only:tagline logical, intent(in), optional :: quit logical :: ltemp print "(a)",trim(tagline) print "(a,/)",trim(version) print "(a,/)",'Usage: splash file1 file2 file3...' print "(a,/,a,/)",'Usage with flags: splash [-f format] [-p fileprefix] [-ev] ', & ' [-x col] [-y col] [-r col] [-cont col] file1 file2 ...' print "(a,/)",'Command line options:' print "(a)",' -f format : input file format to be read (default is ascii, --formats for full list)' print "(a)",' -p fileprefix : change prefix to ALL settings files read/written by splash ' !print "(a)",' -d defaultsfile : change name of defaults file read/written by splash' !print "(a)",' -l limitsfile : change name of limits file read/written by splash' print "(a)",' -e, -ev : use default options best suited for line plotting (.ev files)' print "(a)",' -360 : set default options suited to 360 video' print "(a)",' -b, --buffer : buffer all data files into memory' !print "(a)",' -lm, -lowmem : use low memory mode [applies only to sphNG data read at present]' print "(a)",' -o pixformat : dump pixel map in specified format (use just -o for list of formats)' print "(/,a,/)",'Command line plotting mode:' print "(a)",' -x column : x axis' print "(a)",' -y column : y axis' print "(a)",' -r[ender] column : column to render (will use 1 and 2 as x,y if -x,-y not specified)' print "(a)",' -vec[tor] column : vector quantity to plot with arrows' print "(a)",' -c[ontour] column : contoured quantity' print "(a)",' -multi : multiplot' print "(a)",' -dev device : specify plotting device on command line (e.g. -dev /xw)' print "(a)",' --movie : shortcut for -dev /mp4 to make a movie from plot sequence' print "(a)",' --xsec=1.0 : specify location of cross section slice' print "(a)",' --kappa=1.0 : specify opacity, and turn on opacity rendering' print "(a)",' --anglex=30 : rotate around x axis (similarly --angley, --anglez)' print "(a)",' --code : enforce code units (also --codeunits)' print "(a)",' --sink=1 : centre on sink particle number 1' print "(a)",' --origin=666 : set coordinate system origin to particle number 666' print "(a)",' --origin=maxdens : set coordinate system origin to particle at maximum density' print "(a)",' --track=666 : track particle number 666' print "(a)",' --track=maxdens : track particle at maximum density' print "(a)",' --exact=file1,f2 : read and plot exact solution from ascii files file1 and f2' print "(a)",' --sort : sort filenames for comparison (e.g. snap_000 snap1_000 snap2_000)' call print_available_formats('short') print "(a)" ltemp = issphformat('none') call print_gridformats('short') print "(a)" ltemp = isanalysis('none') if (present(quit)) then if (quit) stop endif end subroutine print_usage end program splash danieljprice-splash-4d1f09c/src/system_f2003.f90000066400000000000000000000040061477365367100213370ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- ! ! this module contains wrappers for all of the ! system and compiler dependent routines ! ! these are called from the main program by their generic names, ! and in here the actual call to the system is performed ! ! THIS ONE IS FOR FORTRAN 2003 COMPILERS ! module system_commands use iso_c_binding, only:c_int,c_char implicit none interface function setenv(name, value, overwrite) bind(c,name='setenv') import :: c_int,c_char integer(c_int) :: setenv character(kind=c_char), intent(in) :: name(*), value(*) integer(c_int), value :: overwrite end function end interface contains subroutine get_number_arguments(nargs) integer, intent(out) :: nargs nargs = COMMAND_ARGUMENT_COUNT() end subroutine get_number_arguments subroutine get_argument(iarg,argstring) integer, intent(in) :: iarg character(len=*), intent(out) :: argstring call GET_COMMAND_ARGUMENT(iarg,argstring) end subroutine get_argument subroutine get_environment(variable,value) character(len=*), intent(in) :: variable character(len=*), intent(out) :: value call GET_ENVIRONMENT_VARIABLE(variable,value) end subroutine get_environment end module system_commands danieljprice-splash-4d1f09c/src/system_utils.f90000066400000000000000000000273261477365367100217570ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2021 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! this module contains certain useful utilities which ! depend on system commands (in the system_commands module) ! module system_utils use asciiutils, only:lcase,cstring implicit none public :: ienvironment,lenvironment,renvironment,lenvstring,ienvstring public :: envlist,ienvlist,lenvlist,renvlist,get_command_option,count_matching_args public :: get_command_flag,get_user,get_copyright,get_environment_or_flag public :: set_environment_variable private contains ! !--this routine returns a variable ! from EITHER a command line flag --foo=bar ! OR from an environment variable MY_FOO=bar ! ! The flag takes priority over the environment variable ! subroutine get_environment_or_flag(variable,string) character(len=*), intent(in) :: variable character(len=*), intent(out) :: string integer :: ierr,iloc ! try as command flag, excluding everything before the last ! underscore, e.g. MY_GOOD_FOO becomes --foo iloc = index(variable,'_',back=.true. ) call get_option(variable(iloc+1:),string,ierr) ! then try as environment variable, including underscores ! e.g. MY_GOOD_FOO=bar if (ierr /= 0) call get_environment_variable(variable,string) !print*,' GOT ',trim(variable),' = ',trim(string) end subroutine get_environment_or_flag ! !--this routine sets an environment variable by calling ! the intrinsic C routine setenv ! subroutine set_environment_variable(variable,string,stat) use system_commands, only:setenv character(len=*), intent(in) :: variable,string integer, optional, intent(out) :: stat integer :: ierr ierr = setenv(cstring(variable),cstring(string),1) if (present(stat)) stat = ierr end subroutine set_environment_variable ! !--this routine returns an integer variable ! from an environment variable setting ! ! if the errval argument is present then this is the ! value assigned when an error has occurred ! (default is zero) ! integer function ienvironment(variable,errval) character(len=*), intent(in) :: variable character(len=30) :: string integer, intent(in), optional :: errval call get_environment_or_flag(variable,string) if (present(errval)) then ienvironment = ienvstring(string,errval) else ienvironment = ienvstring(string) endif end function ienvironment ! !--this routine returns a floating point (real) variable ! from an environment variable setting ! ! if the errval argument is present then this is the ! value assigned when an error has occurred ! (default is zero) ! real function renvironment(variable,errval) character(len=*), intent(in) :: variable character(len=30) :: string real, intent(in), optional :: errval integer :: ierr call get_environment_or_flag(variable,string) if (len_trim(string) > 0) then read(string,*,iostat=ierr) renvironment else ierr = 1 endif if (ierr /= 0) then if (present(errval)) then renvironment = errval else renvironment = 0. endif endif end function renvironment ! !--this routine returns a logical variable ! from an environment variable setting ! logical function lenvironment(variable) character(len=*), intent(in) :: variable character(len=30) :: string call get_environment_or_flag(variable,string) lenvironment = lenvstring(string) end function lenvironment ! !--utility routine to determine whether a string ! should be interpreted as true or false ! logical function lenvstring(string) character(len=*), intent(in) :: string if (string(1:1)=='y'.or.string(1:1)=='Y' & .or.string(1:1)=='t'.or.string(1:1)=='T' & .or.trim(string)=='on'.or.trim(string)=='ON' & .or.trim(string)=='1') then lenvstring = .true. else lenvstring = .false. endif end function lenvstring ! !--utility routine to extract integer value from string ! integer function ienvstring(string,errval) character(len=*), intent(in) :: string integer, intent(in), optional :: errval character(len=5) :: fmtstring integer :: ierr if (len_trim(string) > 0) then !--use a formatted read - this is to avoid a compiler bug ! should in general be more robust anyway write(fmtstring,"(a,i2,a)",iostat=ierr) '(i',len_trim(string),')' read(string,fmtstring,iostat=ierr) ienvstring else ierr = 1 endif if (ierr /= 0) then if (present(errval)) then ienvstring = errval else ienvstring = 0 endif endif end function ienvstring ! !--utility routine to extract real value from string ! real function renvstring(string,errval) character(len=*), intent(in) :: string real, intent(in), optional :: errval character(len=5) :: fmtstring integer :: ierr if (len_trim(string) > 0) then read(string,*,iostat=ierr) renvstring else ierr = 1 endif if (ierr /= 0) then if (present(errval)) then renvstring = errval else renvstring = 0. endif endif end function renvstring ! !--this routine returns an arbitrary number of ! comma separated strings ! subroutine envlist(variable,nlist,list) character(len=*), intent(in) :: variable integer, intent(out) :: nlist character(len=*), dimension(:), intent(out), optional :: list character(len=120) :: string character(len=10) :: dummy integer :: i1,i2,ierr logical :: notlistfull !--set list to blank strings if argument is present if (present(list)) then list = ' ' endif !--get envlist from the environment call get_environment_or_flag(variable,string) !--split the string on commas i1 = 1 i2 = index(string,',')-1 if (i2==-1) i2 = len_trim(string) nlist = 0 ierr = 0 notlistfull = .true. !--for each comma separated string, add a list member do while(i2 >= i1 .and. notlistfull .and. ierr==0) nlist = nlist + 1 !print*,'i1,i2,stringfrag= ',i1,i2,trim(string(i1:)) if (present(list)) then read(string(i1:i2),"(a)",iostat=ierr) list(nlist) notlistfull = (nlist < size(list)) else read(string(i1:i2),"(a)",iostat=ierr) dummy ! to get ierr at end of string notlistfull = .true. endif i1 = i2 + 2 i2 = index(string(i1:),',') if (i2==0) then i2 = len_trim(string) else i2 = i2 + i1 - 2 endif enddo end subroutine envlist ! !--return comma separated list of integers ! function ienvlist(variable,nlist,errval) character(len=*), intent(in) :: variable integer, intent(in) :: nlist integer, intent(in), optional :: errval character(len=30), dimension(nlist) :: list integer :: ienvlist(nlist),i,ngot ngot = nlist call envlist(variable,ngot,list) do i=1,nlist if (present(errval)) then ienvlist(i) = ienvstring(list(i),errval=errval) else ienvlist(i) = ienvstring(list(i)) endif enddo end function ienvlist ! !--return comma separated list of logicals ! function lenvlist(variable,nlist) character(len=*), intent(in) :: variable integer, intent(in) :: nlist character(len=30), dimension(nlist) :: list logical :: lenvlist(nlist) integer :: i,ngot ngot = nlist call envlist(variable,ngot,list) do i=1,nlist lenvlist(i) = lenvstring(list(i)) enddo end function lenvlist ! !--return comma separated list of reals ! function renvlist(variable,nlist,errval) character(len=*), intent(in) :: variable integer, intent(in) :: nlist real, intent(in), optional :: errval character(len=30), dimension(nlist) :: list real :: renvlist(nlist) integer :: i,ngot ngot = nlist call envlist(variable,ngot,list) do i=1,nlist if (present(errval)) then renvlist(i) = renvstring(list(i),errval=errval) else renvlist(i) = renvstring(list(i)) endif enddo end function renvlist ! !--find logical-valued option from command line arguments ! as in --arg (true if present, false if not) ! subroutine get_option(variable,value,err) character(len=*), intent(in) :: variable character(len=*), intent(out) :: value character(len=80) :: string integer, intent(out) :: err integer :: nargs,iarg,ieq err = 1 nargs = command_argument_count() do iarg=1,nargs call get_command_argument(iarg,string) if (string(1:2)=='--' .and. index(lcase(string),lcase(variable)) > 0) then err = 0 ieq = index(string,'=',back=.true.) if (ieq > 0) then value = string(ieq+1:) else value = 'True' ! raw flag --foo, equivalent to --foo=True endif endif enddo end subroutine get_option ! !--find real-valued option from command line arguments ! as in --arg=blah ! real function get_command_option(variable,default) result(val) character(len=*), intent(in) :: variable real, intent(in), optional :: default character(len=80) :: string integer :: ierr,nargs,ieq,iarg val = 0. if (present(default)) val = default nargs = command_argument_count() do iarg=1,nargs call get_command_argument(iarg,string) ieq = index(string,'=') if (string(1:1)=='-' .and. index(string,variable) > 0 .and. ieq > 0) then read(string(ieq+1:),*,iostat=ierr) val endif enddo end function get_command_option ! !--find logical-valued option from command line arguments ! as in --arg (true if present, false if not) ! logical function get_command_flag(variable) result(val) character(len=*), intent(in) :: variable character(len=80) :: string integer :: nargs,iarg val = .false. nargs = command_argument_count() do iarg=1,nargs call get_command_argument(iarg,string) if (string(1:1)=='-' .and. index(string,variable) > 0) val = .true. enddo end function get_command_flag ! !--count the number of arguments matching a certain substring ! e.g. with particular filename extension ! integer function count_matching_args(string,id) result(n) character(len=*), intent(in) :: string integer, intent(out), optional :: id(:) character(len=1024) :: myarg integer :: iarg,nargs n = 0 nargs = command_argument_count() do iarg=1,nargs call get_command_argument(iarg,myarg) if (index(myarg,string) > 0) then n = n + 1 if (present(id)) then if (size(id) >= n) id(n) = iarg endif endif enddo end function count_matching_args ! !--get the name of the logged in user ! subroutine get_user(string) character(len=*), intent(out) :: string character(len=*), parameter :: tempfile = '/tmp/splash.username' logical :: iexist integer :: ierr,iu string = '' inquire(file='/proc/cpuinfo',exist=iexist) ! exists only in Linux if (.not.iexist) then call system('id -F $USER > '//trim(tempfile)) ! Mac else call system('getent passwd "$USER" | cut -d: -f5 | cut -d, -f1 > '//trim(tempfile)) ! Linux endif inquire(file=tempfile,exist=iexist) if (iexist) then open(newunit=iu,file=tempfile,action='read',status='old',iostat=ierr) read(iu,"(a)",iostat=ierr) string close(iu,status='delete',iostat=ierr) endif end subroutine get_user ! !--get copyright string involving logged in user and current year ! function get_copyright() result(string) character(len=30) :: string character(len=8) :: year call get_user(string) call date_and_time(date=year) string = '(c) '//year(1:4)//' '//trim(string) end function get_copyright end module system_utils danieljprice-splash-4d1f09c/src/timestepping.f90000066400000000000000000000331701477365367100217150ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module timestepping implicit none public :: timestep_loop private contains ! ! This subroutine drives the main plotting loop ! subroutine timestep_loop(ipicky,ipickx,irender,icontourplot,ivecplot) use filenames, only:nsteps,ifileopen use particle_data, only:iamtype,npartoftype,masstype,time,gamma,headervals,& dat,time_was_read use settings_data, only:istartatstep,iendatstep,nfreq,DataIsBuffered, & iUsesteplist,isteplist,ncolumns,ipartialread use settings_page, only:interactive,nstepsperpage,iColourEachStep,iChangeStyles,nomenu use timestep_plotting, only:initialise_plotting,plotstep use plotlib, only:plot_close integer, intent(in) :: ipicky,ipickx,irender,icontourplot,ivecplot integer :: ipos, istep, ilocindat, iadvance, istepsonpage, istepprev, irender_tmp logical :: ipagechange call initialise_plotting(ipicky,ipickx,irender,icontourplot,ivecplot) !---------------------------------------------------------------------------- ! loop over timesteps (flexible to allow going forwards/backwards in ! interactive mode) ! ! bookkeeping is as follows: ! ipos : current step number or position in steplist array ! ilocindat : current or requested location in the dat array ! (usually 1, but can be > 1 if more than one step per file ! or data is buffered to memory) ! (requested location is sent to get_nextstep which skips files ! or steps appropriately and sets actual location) ! istep : current step number ! (as if all steps were in memory in sequential order) ! istepsonpage : number of steps which have been plotted on current page ! this is used because steps are coloured/marked differently ! from this routine (call to colour_timestep) ! !---------------------------------------------------------------------------- ipos = istartatstep iadvance = nfreq ! amount to increment timestep by (changed in interactive) istepsonpage = 0 istep = istartatstep istepprev = 0 !--if the current file has only been partially read, ! make sure we read the file again now that we may have different plotting options if (ipartialread) ifileopen = 0 irender_tmp = irender over_timesteps: do while (ipos <= iendatstep) ipos = max(ipos,1) !--can't go further back than ipos=1 if (iUseStepList) then istep = isteplist(ipos) if (istep > nsteps) then print*,'ERROR: step > nsteps in step list, setting step = last' istep = nsteps elseif (istep <= 0) then !--this should never happen stop 'internal error: corrupted step list: please send bug report' endif else istep = ipos if (istep >= nsteps) then istep = nsteps iendatstep = istep ipos = min(ipos,iendatstep) endif endif ! !--make sure we have data for this timestep ! if (DataIsBuffered) then !--if data is in memory, we just go to the position in dat if (istep > nsteps) then print*,'error: step # > nsteps, setting step = last' istep = nsteps endif ilocindat = istep else !--otherwise read file containing this step into memory and get position in dat array ! (note that nsteps can change in get_nextstep, so may need to re-evaluate ! whether we are on the last step or not, and adjust iendatstep to last step) ! call get_nextstep(istep,ilocindat) if (.not.iUseStepList .and. istep >= nsteps) then !--reset step position to last useable timestep (ie. nsteps) istep = nsteps iendatstep = istep !--use interactive halt at last step (ie. set position = last position) if (interactive) then ipos = min(ipos,iendatstep) !--if istep has changed, may need to re-read step ! (get_nextstep does nothing if istep is the same) call get_nextstep(istep,ilocindat) endif endif !--this is a general "catch all" when step cannot be located if (ilocindat <= 0) then print*,'ERROR: could not locate timestep' exit over_timesteps endif endif ! !--write timestepping log ! if (iadvance /= 0) then if (.not.time_was_read(time(ilocindat))) then print "(5('-'),' t = (not read), dump #',i5,1x,18('-'))", istep elseif (time(ilocindat) < 1.e-2 .or. time(ilocindat) > 1.e2) then print "(5('-'),' t = ',es9.2,', dump #',i5,1x,18('-'))", time(ilocindat),istep else print "(5('-'),' t = ',f8.2,', dump #',i5,1x,18('-'))", time(ilocindat),istep endif endif istepsonpage = istepsonpage + 1 ! if ((nstepsperpage > 1 .and. istepsonpage > 1 .and. istepsonpage <= nstepsperpage).or.nstepsperpage==0) then if ((nstepsperpage > 1 .and. istepsonpage <= nstepsperpage) .or. nstepsperpage==0) then ipagechange = .false. else istepsonpage = 1 ipagechange = .true. endif !--colour the timestep if appropriate if ((nstepsperpage /= 1) .and. (iColourEachStep .or. iChangeStyles)) then call colour_timestep(istepsonpage,iColourEachStep,iChangeStyles) else !--otherwise set default colours for each particle type ! (do not call if repeating same step so interactive colours stick for same step) if (istep /= istepprev) call colourparts_default(npartoftype(:,ilocindat),iamtype(:,ilocindat)) istepprev = istep endif ! print*,'ipos = ',ipos,' istep = ',istep,' iposindat = ',ilocindat call plotstep(ipos,istep,istepsonpage,irender_tmp,icontourplot,ivecplot,& iamtype(:,ilocindat),npartoftype(:,ilocindat),masstype(:,ilocindat),& dat(:,:,ilocindat),time(ilocindat),gamma(ilocindat),& headervals(:,ilocindat),ipagechange,iadvance) ! !--increment timestep -- iadvance can be changed interactively ! if (iadvance==-666) exit over_timesteps ! this is the interactive quit signal ipos = ipos + iadvance ! if ipos goes over iendatstep, this ends the loop enddo over_timesteps if (.not.interactive) then if (nomenu) then !--gracefully exit print "(/,a,/)",'Finished plotting: Many thankyous for your kind custom.' else ! prepare to return to main menu print*,'press return to finish' read* !--if somehow the data has become corrupted (e.g. last file full of rubbish) ! read in the first dump again if (ncolumns <= 0) then print*,'data is corrupted: re-reading first data file' call get_nextstep(1,ilocindat) endif endif endif call plot_close end subroutine timestep_loop !------------------------------------------------------------------- ! works out whether or not we need to read another dump into memory !------------------------------------------------------------------- recursive subroutine get_nextstep(istep,ilocindat) use filenames, only:nstepsinfile,nfiles,ifileopen,iposopen,nsteps use getdata, only:get_data use settings_data, only:buffer_steps_in_file integer, intent(in) :: istep integer, intent(out) :: ilocindat integer :: ifile,nstepstotal,nstepsprev,iposinfile ! !--request is for step istep ! need to determine which file step i is in, ! whether or not it is already in memory (and read it if not) ! and finally determine position of requested step in dat array ! ifile = 0 nstepstotal = 0 nstepsprev = 0 iposinfile = 1 ! this should always be overwritten anyway do while (nstepstotal < istep .and. ifile < nfiles) ifile = ifile + 1 nstepsprev = nstepstotal nstepstotal = nstepstotal + nstepsinfile(ifile) enddo if (nstepstotal >= istep) then !--set position in dat array depending on how many steps are in the file iposinfile = istep - nstepsprev else !--this is where we cannot locate the timestep in the data (not enough steps) ! ie. ifile > nfiles print*,'reached last useable timestep' ilocindat = 0 return endif !print*,'step ',istep,' in file ',ifile,' nsteps = ',nsteps !print*,'position in file = ',iposinfile if (istep > nsteps) then ilocindat = 0 return endif ilocindat = iposinfile ! !--if data is not stored in memory, read next step from file ! At the moment assumes number of steps in each file are the same ! !--neither or these two error conditions should occur if (ifile > nfiles) then print*,'*** get_nextstep: error: ifile > nfiles' elseif (ifile < 1) then print*,'*** get_nextstep: error: request for file < 1' elseif (ifile /= ifileopen) then ! !--read next data file and determine position in file ! call get_data(ifile,.true.) ! !--because nstepsinfile is predicted for files which have ! not been opened, we may have the situation where ! iposinfile does not point to a real timestep (ie. iposinfile > nstepsinfile). ! In this case we query the step again with our better knowledge of nstepsinfile. ! if (iposinfile > nstepsinfile(ifile)) then print*,'not enough steps in file... trying next file' call get_nextstep(istep,ilocindat) endif elseif (.not.buffer_steps_in_file .and. nstepsinfile(ifile) > 1) then if (iposinfile <= nstepsinfile(ifile) .and. iposinfile /= iposopen) then ! if all steps have not been read from the file, read just the next one call get_data(ifile,.true.,iposinfile=iposinfile) ilocindat = 1 else ilocindat = 1 endif endif end subroutine get_nextstep !------------------------------------------------------------- ! colours all the particles a given colour for this timestep ! and/or changes the marker type for type 1 particles !------------------------------------------------------------- subroutine colour_timestep(istep,iChangeColours,iChangeStyles) use particle_data, only:icolourme use settings_part, only:linecolourthisstep,linestylethisstep,imarktype use settings_page, only:maxlinestyle,modlinestyle,maxcolour,modcolour,linepalette use plotlib, only:plotlib_maxlinestyle,plotlib_maxlinecolour integer, intent(in) :: istep logical, intent(in) :: iChangeColours, iChangeStyles integer :: icolour,imarkernumber if (iChangeColours) then if (allocated(icolourme)) then icolour = istep + 1 icolour = (icolour-2)/modcolour + 1 if (icolour > plotlib_maxlinecolour) then print "(a,i2,a)",'warning: step colour > ',plotlib_maxlinecolour,': re-using colours' icolour = mod(icolour-1,plotlib_maxlinecolour) + 1 endif icolour = mod(icolour-1,min(maxcolour,plotlib_maxlinecolour)) + 1 icolourme = icolour if (linepalette < 0) then ! for custom line colours do not use foreground/background colours - allow these to be changed icolour = icolour + 1 icolourme = icolour linecolourthisstep = icolour else linecolourthisstep = icolour endif else print "(a)",'***error: array not allocated in colour_timestep***' endif endif if (iChangeStyles) then !--modlinestyle should not be greater than max line styles in plotting library linestylethisstep = mod((istep-1)/modlinestyle,min(maxlinestyle,plotlib_maxlinestyle)) + 1 imarkernumber = istep select case(imarkernumber) case(1) imarktype(1) = 4 case(2) imarktype(1) = 17 case(3) imarktype(1) = 2 case(4) imarktype(1) = 3 case(5:16) imarktype(1) = imarkernumber case(17:) imarktype(1) = imarkernumber + 1 end select endif end subroutine colour_timestep !--------------------------------------------------------------------------------------- ! colours all the particles using the default colour for their type !--------------------------------------------------------------------------------------- subroutine colourparts_default(npartoftype,iamtype) use params, only:int1 use settings_data, only:ntypes use particle_data, only:icolourme use settings_part, only:idefaultcolourtype integer, dimension(:), intent(in) :: npartoftype integer(kind=int1), dimension(:), intent(in) :: iamtype integer :: i,index1,index2,itype if (size(iamtype) > 1) then do i=1,sum(npartoftype(1:ntypes)) itype = iamtype(i) if (itype > 0 .and. itype <= ntypes) then if (idefaultcolourtype(itype) >= 0) then icolourme(i) = idefaultcolourtype(itype) endif endif enddo else index1 = 1 do itype=1,ntypes index2 = index1 + npartoftype(itype) - 1 if (idefaultcolourtype(itype) >= 0) then icolourme(index1:index2) = idefaultcolourtype(itype) endif index1 = index2 + 1 enddo endif end subroutine colourparts_default end module timestepping danieljprice-splash-4d1f09c/src/timing.f90000066400000000000000000000102501477365367100204660ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------- ! ! This module contains utilities for code timings ! !---------------------------------------------------------------- module timing implicit none integer, private :: istarttime(6) real, private :: starttime data starttime/-1./ public :: wall_time,print_time private contains !-------------------------------------------------------------------- !+ ! sets initial time !+ !-------------------------------------------------------------------- subroutine initialise_timing integer :: iday,imonth,iyear,ihour,imin,isec,imsec,ivalues(8) character(len=8) :: date character(len=5) :: zone character(len=10) :: time call date_and_time(date,time,zone,ivalues) iyear = ivalues(1) imonth = ivalues(2) iday = ivalues(3) ihour = ivalues(5) imin = ivalues(6) isec = ivalues(7) imsec = ivalues(8) istarttime(1) = iyear istarttime(2) = imonth istarttime(3) = iday istarttime(4) = ihour istarttime(5) = imin istarttime(6) = isec !istarttime(7) = imsec starttime = iday*86400. + ihour*3600. + imin*60. + isec + imsec*0.001 return end subroutine initialise_timing !-------------------------------------------------------------------- !+ ! Get time used since begining !+ !-------------------------------------------------------------------- subroutine wall_time(t) real, intent(out) :: t integer :: i,iday,imonth,ihour,imin,isec,imsec,ivalues(8) character(len=8) :: date character(len=5) :: zone character(len=10) :: time !--do self-initialisation the first time it is called if (starttime < 0.) call initialise_timing call date_and_time(date,time,zone,ivalues) iday = ivalues(3) ihour = ivalues(5) imin = ivalues(6) isec = ivalues(7) imsec = ivalues(8) if (ivalues(2) < istarttime(2)) then ivalues(2) = ivalues(2) + 12 endif do i = istarttime(2), ivalues(2) - 1 imonth = mod(i,12) if (imonth==4 .or. imonth==6 .or. imonth==9 .or. imonth==11) then iday = iday + 30 elseif (imonth==2) then iday = iday + 28 else iday = iday + 31 endif enddo t = iday*86400. + ihour*3600. + imin*60. + isec + imsec*0.001 - starttime return end subroutine wall_time !-------------------------------------------------------------------- ! ! print a time, nicely formatted into hours, mins, seconds ! !-------------------------------------------------------------------- subroutine print_time(time,string,iunit) real, intent(in) :: time character(len=*), intent(in), optional :: string integer, intent(in), optional :: iunit character(len=64) :: newstring integer :: nhr,nmin,lunit real :: trem trem = time nhr = int(trem/3600.) if (nhr > 0) trem = trem - nhr*3600. nmin = int(trem/60.) if (nmin > 0) trem = trem - nmin*60. if (present(string)) then newstring = trim(string(1:min(len(newstring),len_trim(string)))) else newstring = 'completed in' endif if (present(iunit)) then lunit = iunit else lunit = 6 endif if (nhr > 0) then write(lunit,"(1x,a,1x,i3,a,i2,a,f6.2,a)") & trim(newstring),nhr,' hr, ',nmin,' min, ',trem,' s' elseif (nmin > 0) then write(lunit,"(1x,a,1x,i2,a,f6.2,a)") & trim(newstring),nmin,' min, ',trem,' s' else write(lunit,"(1x,a,1x,f6.2,a)") trim(newstring),trem,' s' endif return end subroutine print_time end module timing danieljprice-splash-4d1f09c/src/titles.f90000066400000000000000000000053321477365367100205100ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- module titles implicit none integer, parameter, private :: maxtitles = 50 integer, parameter, private :: maxsteplegend = 100 integer, parameter, public :: lensteplegend = 60 integer, parameter, public :: lenpagetitles = 60 character(len=lenpagetitles), dimension(maxtitles), public :: pagetitles character(len=lensteplegend), dimension(maxsteplegend), public :: steplegend public :: read_titles, read_steplegend private contains ! !--reads a list of titles (one per line), to be used to label each plot on page ! subroutine read_titles(ntitles) use asciiutils, only:read_asciifile use filenames, only:fileprefix integer, intent(out) :: ntitles character(len=50) :: titlefile logical :: iexist titlefile = trim(fileprefix)//'.titles' !--also allow obsolete title filename inquire(file=titlefile,exist=iexist) if (.not.iexist) then inquire(file='titlelist',exist=iexist) if (iexist) titlefile='titlelist' endif ntitles = 0 call read_asciifile(titlefile,ntitles,pagetitles) if (ntitles > 0) print "(a)",'read plot titles from file '//trim(titlefile) return end subroutine read_titles ! !--reads a list of labels (one per line) to be used in the timestep legend ! (ie. for multiple timesteps on same page) ! subroutine read_steplegend(nsteptitles) use asciiutils, only:read_asciifile use filenames, only:fileprefix integer, intent(out) :: nsteptitles character(len=50) :: legendfile logical :: iexist legendfile = trim(fileprefix)//'.legend' !--also allow obsolete legend filename inquire(file=legendfile,exist=iexist) if (.not.iexist) then inquire(file='legend',exist=iexist) if (iexist) legendfile='legend' endif nsteptitles = 0 call read_asciifile(legendfile,nsteptitles,steplegend) if (nsteptitles > 0) print "(a)"//'read legend text from file '''//trim(legendfile)//'''' return end subroutine read_steplegend end module titles danieljprice-splash-4d1f09c/src/transform.f90000066400000000000000000000476541477365367100212340ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2009 Daniel Price. All rights reserved. ! Contact: daniel.price@sci.monash.edu.au ! !----------------------------------------------------------------- !------------------------------------------------------------------------ ! ! module containing subroutines for applying transformations to data ! prior to plotting. ! ! the transformations are: ! ! 1) log10(x) ! 2) |x| ! 3) 1/x ! 4) sqrt(x) ! 5) x^2 ! 6) ln(x) ! ! * combinations of transformations are done when the ! input number is > 10 (e.g. 321 means 1/x, then abs, then log10) ! ! subroutines contained within this module are the following: ! ! transform : applies transformation to a one dimensional array ! transform2 : applies the transformation to a two dimensional array ! transform_limits : transforms the plot limits appropriately ! transform_label : changes the plot label appropriately ! ! Written for use in supersphplot/splash by ! Daniel Price, Institute of Astronomy, Cambridge, UK 2002-2004 ! University of Exeter, UK 2004- ! dprice@astro.ex.ac.uk ! !------------------------------------------------------------------------ module transforms implicit none integer, parameter, public :: ntrans = 6 ! this is the number of different transformations real, parameter, private :: zerolog = 1.e-12 ! this is minimum set if xmin = 0 and log public :: transform,transform_inverse,trans public :: transform_limits,transform_limits_inverse,transform_label public :: convert_to_ln_fac public :: islogged private interface transform module procedure transform,transform_limits,transform2,transforma end interface transform !--function interface interface trans module procedure transformarray end interface trans interface transform_inverse module procedure transform_inverse,transform_limits_inverse,transforma_inverse end interface transform_inverse contains !------------------------------------------------------------------------ ! ! subroutine returns log, 1/x of a given array ! ! * can specify up to 9 individual operations to perform ! * combinations of transformations are done when the ! input number is > 10 (e.g. 321 means 1/x, then abs, then log10) ! !------------------------------------------------------------------------ subroutine transform(array,itrans,errval) integer, intent(in) :: itrans real, dimension(:), intent(inout) :: array real, intent(in), optional :: errval real, dimension(size(array)) :: arraytemp real :: errvali character(len=20) :: string integer :: i ! !--errval is the value to be set for errors ! (default is zero if not present) ! if (present(errval)) then errvali = errval else errvali = 0. endif ! !--extract the digits from the input number ! if (itrans > 0) then write(string,*) itrans ! !--do a transformation for each digit ! arraytemp = array do i=1,len_trim(string) ! !--perform transformation appropriate to this digit ! select case(string(i:i)) case('1') where (arraytemp > 0. .and. arraytemp /= errvali) arraytemp = log10(arraytemp) elsewhere arraytemp = errvali end where case('2') where (arraytemp /= errvali) arraytemp = abs(arraytemp) end where case('3') where (arraytemp /= 0. .and. arraytemp /= errvali) arraytemp = 1./arraytemp elsewhere arraytemp = errvali end where case('4') where (arraytemp > 0. .and. arraytemp /= errvali) arraytemp = sqrt(arraytemp) elsewhere arraytemp = errvali end where case('5') where (arraytemp /= errvali) arraytemp = arraytemp**2 end where case('6') where (arraytemp > 0. .and. arraytemp /= errvali) arraytemp = log(arraytemp) elsewhere arraytemp = errvali end where end select enddo array = arraytemp elseif (itrans < 0) then ! ! perform the inverse transform if itrans is negative ! call transform_inverse(array,abs(itrans),errvali) endif end subroutine transform !------------------------------------------------------------------------ ! ! interface to above for a single real number ! !------------------------------------------------------------------------ subroutine transforma(aa,itrans,errval) integer, intent(in) :: itrans real, intent(inout) :: aa real, intent(in), optional :: errval real, dimension(1) :: array array(1) = aa if (present(errval)) then call transform(array,itrans,errval=errval) else call transform(array,itrans) endif aa = array(1) end subroutine transforma !------------------------------------------------------------------------ ! ! function interface: returns array valued function ! !------------------------------------------------------------------------ function transformarray(array,itrans,errval) integer, intent(in) :: itrans real, intent(in), dimension(:) :: array real, dimension(size(array)) :: transformarray real, intent(in), optional :: errval transformarray = array if (present(errval)) then call transform(transformarray,itrans,errval=errval) else call transform(transformarray,itrans) endif end function transformarray !------------------------------------------------------------------------ ! ! inverse transform ! !------------------------------------------------------------------------ subroutine transform_inverse(array,itrans,errval) integer, intent(in) :: itrans real, dimension(:), intent(inout) :: array real, intent(in), optional :: errval real, dimension(size(array)) :: arraytemp real :: errvali character(len=20) :: string integer :: i ! !--errval is the value to be set for errors ! (default is zero if not present) ! if (present(errval)) then errvali = errval else errvali = 0. endif ! !--extract the digits from the input number ! if (itrans > 0) then write(string,*) itrans ! !--do a transformation for each digit ! arraytemp = array do i=len_trim(string),1,-1 ! !--perform transformation appropriate to this digit ! select case(string(i:i)) case('1') where (arraytemp /= errvali) arraytemp = 10**arraytemp end where case('3') where (arraytemp /= 0. .and. arraytemp /= errvali) arraytemp = 1./arraytemp elsewhere arraytemp = errvali end where case('4') where (arraytemp /= errvali) arraytemp = arraytemp**2 end where case('5') where (arraytemp > 0. .and. arraytemp /= errvali) arraytemp = sqrt(arraytemp) elsewhere arraytemp = errvali end where case('6') where (arraytemp /= errvali) arraytemp = exp(arraytemp) end where end select enddo array = arraytemp elseif (itrans < 0) then ! ! perform the forward transform if itrans is negative ! call transform(array,abs(itrans),errvali) endif end subroutine transform_inverse !------------------------------------------------------------------------ ! ! interface to above for a single real number ! !------------------------------------------------------------------------ subroutine transforma_inverse(aa,itrans,errval) integer, intent(in) :: itrans real, intent(inout) :: aa real, intent(in), optional :: errval real, dimension(1) :: array array(1) = aa if (present(errval)) then call transform_inverse(array,itrans,errval=errval) else call transform_inverse(array,itrans) endif aa = array(1) end subroutine transforma_inverse !------------------------------------------------------------------------ ! ! same as transform but for a two dimensional array ! applies the transformation to the same array as was input ! !------------------------------------------------------------------------ subroutine transform2(array,itrans,errval) integer, intent(in) :: itrans real, dimension(:,:), intent(inout) :: array real, intent(in), optional :: errval real, dimension(size(array(:,1)),size(array(1,:))) :: arraytemp real :: errvali character(len=20) :: string integer :: i ! !--errval is the value to be set for errors ! (default is zero if not present) ! if (present(errval)) then errvali = errval else errvali = 0. endif ! !--extract the digits from the input number ! if (itrans > 0) then write(string,*) itrans ! !--do a transformation for each digit ! arraytemp = array do i=1,len_trim(string) ! !--perform transformation appropriate to this digit ! select case(string(i:i)) case('1') where (arraytemp > 0. .and. arraytemp /= errvali) arraytemp = log10(arraytemp) elsewhere arraytemp = errvali end where case('2') where (arraytemp /= errvali) arraytemp = abs(arraytemp) end where case('3') where (arraytemp /= 0. .and. arraytemp /= errvali) arraytemp = 1./arraytemp elsewhere arraytemp = errvali end where case('4') where (arraytemp > 0. .and. arraytemp /= errvali) arraytemp = sqrt(arraytemp) elsewhere arraytemp = errvali end where case('5') where (arraytemp /= errvali) arraytemp = arraytemp**2 end where case('6') where (arraytemp > 0. .and. arraytemp /= errvali) arraytemp = log(arraytemp) elsewhere arraytemp = errvali end where end select enddo array = arraytemp !elseif (itrans < 0) then ! ! perform the inverse transform if itrans is negative ! !call transform2_inverse(array,abs(itrans),errval) endif end subroutine transform2 !------------------------------------------------------------------------ ! ! same as transform but for the plot limits ! (min can become max and vice versa) ! !------------------------------------------------------------------------ subroutine transform_limits(xmin,xmax,itrans) integer, intent(in) :: itrans real, intent(inout) :: xmin,xmax real :: xmintemp,xmaxtemp character(len=20) :: string integer :: i ! !--extract the digits from the input number ! if (itrans > 0) then write(string,*) itrans ! !--do a transformation for each digit ! xmintemp = xmin xmaxtemp = xmax do i=1,len_trim(string) ! !--perform transformation appropriate to this digit ! select case(string(i:i)) case('1') if (xmintemp > 0) then xmintemp = log10(xmintemp) elseif (xmintemp==0) then print*,' log10(xmin = 0): min set to ',zerolog xmintemp = log10(zerolog) endif if (xmaxtemp > 0) then xmaxtemp = log10(xmaxtemp) elseif (xmaxtemp==0) then print*,' log10(xmax = 0): max set to ',zerolog xmaxtemp = log10(zerolog) endif case('2') if ((xmintemp < 0. .and. xmaxtemp > 0.) & .or.(xmaxtemp < 0. .and. xmintemp > 0.)) then ! !--minimum is zero if limits have opposite signs ! xmaxtemp = max(abs(xmintemp),abs(xmaxtemp)) xmintemp = 0. else ! !--or just take magnitude ! xmintemp = abs(xmintemp) xmaxtemp = abs(xmaxtemp) endif case('3') if (xmintemp /= 0) then xmintemp = 1./xmintemp else xmintemp = 0. endif if (xmaxtemp /= 0) then xmaxtemp = 1./xmaxtemp else xmaxtemp = 0. endif case('4') if (xmintemp >= 0) then xmintemp = sqrt(xmintemp) else xmintemp = 0. endif if (xmaxtemp >= 0) then xmaxtemp = sqrt(xmaxtemp) else xmaxtemp = 0. endif case('5') xmintemp = xmintemp**2 xmaxtemp = xmaxtemp**2 case('6') if (xmintemp > 0) then xmintemp = log(xmintemp) elseif (xmintemp==0) then print*,' ln(xmin = 0): min set to ',zerolog xmintemp = log(zerolog) endif if (xmaxtemp > 0) then xmaxtemp = log(xmaxtemp) elseif (xmaxtemp==0) then print*,' ln(xmax = 0): max set to ',zerolog xmaxtemp = log(zerolog) endif end select enddo xmin = min(xmintemp,xmaxtemp) xmax = max(xmintemp,xmaxtemp) elseif (itrans < 0) then ! ! perform the inverse transform if itrans is negative ! call transform_limits_inverse(xmin,xmax,itrans) endif end subroutine transform_limits !------------------------------------------------------------------------ ! ! inverse transform for the plot limits ! (so that we can change the transformed limits and set the ! untransformed limits accordingly) ! !------------------------------------------------------------------------ subroutine transform_limits_inverse(xmin,xmax,itrans) integer, intent(in) :: itrans real, intent(inout) :: xmin,xmax real :: xmintemp,xmaxtemp,xtemp character(len=20) :: string integer :: i ! !--extract the digits from the input number ! if (itrans > 0) then write(string,*) itrans ! !--do a transformation for each digit ! xmintemp = xmin xmaxtemp = xmax do i=len_trim(string),1,-1 ! do digits in reverse ! !--perform transformation appropriate to this digit ! select case(string(i:i)) case('1') xmintemp = 10**xmintemp xmaxtemp = 10**xmaxtemp case('2') ! !--if minimum is zero give limits opposite signs ! (but same magnitude), otherwise do nothing ! if (xmintemp==0.) then xtemp = max(abs(xmintemp),abs(xmaxtemp)) xmintemp = -xtemp xmaxtemp = xtemp endif case('3') if (xmintemp /= 0) then xmintemp = 1./xmintemp else xmintemp = 0. endif if (xmaxtemp /= 0) then xmaxtemp = 1./xmaxtemp else xmaxtemp = 0. endif case('4') xmintemp = xmintemp**2 xmaxtemp = xmaxtemp**2 case('5') if (xmintemp > 0) then xmintemp = sqrt(xmintemp) else xmintemp = 0. endif if (xmaxtemp > 0) then xmaxtemp = sqrt(xmaxtemp) else xmaxtemp = 0. endif case('6') xmintemp = exp(xmintemp) xmaxtemp = exp(xmaxtemp) end select enddo xmin = min(xmintemp,xmaxtemp) xmax = max(xmintemp,xmaxtemp) elseif (itrans < 0) then ! ! perform the forward transform if itrans is negative ! call transform_limits(xmin,xmax,itrans) endif end subroutine transform_limits_inverse !------------------------------------------------------------------------ ! ! function to adjust the label of a plot if log, 1/x etc ! ! Note: *cannot* put print or write statements into this function ! as it is used in the middle of write or print statements ! this means that finding the digits is a bit trickier ! !------------------------------------------------------------------------ function transform_label(label,itrans) integer, intent(in) :: itrans character(len=*), intent(in) :: label integer :: itransmulti,i,ndigits integer, dimension(5) :: digit character(len=len(label)+20) :: transform_label character(len=len(label)+20) :: temp_label ! !--extract the digits from the input number ! if (itrans > 0) then call get_digits(itrans,digit,ndigits) temp_label = label ! !--do a transformation for each digit ! do i=1,ndigits itransmulti = digit(i) ! !--perform transformation appropriate to this digit ! select case(itransmulti) case(1) temp_label = 'log '//trim(temp_label) case(2) temp_label = '|'//trim(temp_label)//'|' case(3) temp_label = '1/'//trim(temp_label) case(4) temp_label = 'sqrt('//trim(temp_label)//')' case(5) temp_label = trim(temp_label)//'^2' case(6) temp_label = 'ln '//trim(temp_label) case default temp_label = trim(temp_label) end select enddo transform_label = temp_label else transform_label = label endif end function transform_label !------------------------------------------------------------------------ ! get_digits: for an integer i returns number of digits it contains ! and a list of these *without* using write statements ! ! i : integer to split into digits ! nmax : dimensions of digits array ! digits(nmax) : array of digits ! ndigits : number of digits in i !------------------------------------------------------------------------ subroutine get_digits(i,digits,ndigits) integer, intent(in) :: i integer, intent(out) :: ndigits integer, intent(out), dimension(:) :: digits integer :: j,isubtract,idigit ndigits = 0 isubtract = 0 do j=size(digits),0,-1 if (i >= 10**j) then ndigits = ndigits + 1 idigit = (i - isubtract)/10**j digits(ndigits) = idigit isubtract = isubtract + digits(ndigits)*10**j endif enddo end subroutine get_digits !------------------------------------------------------------------------ ! function returning the correction factor by which to multiply ! to convert the log in the transform to a natural log !------------------------------------------------------------------------ real function convert_to_ln_fac(itrans) integer, intent(in) :: itrans character(len=20) :: string integer :: i real :: xtemp ! !--default conversion factor is unity ! xtemp = 1.0 ! !--extract the digits from the input number ! if (itrans > 0) then write(string,*) itrans do i=len_trim(string),1,-1 ! do digits in reverse ! !--perform transformation appropriate to this digit ! select case(string(i:i)) ! !--correction factor is ln(10.) but can be ! 1./ln(10.), sqrt(1./ln(10.), etc. depending ! on other transformations ! case('1') xtemp = log(10.)*xtemp case('2') xtemp = abs(xtemp) case('3') xtemp = 1./xtemp case('4') xtemp = sqrt(xtemp) case('5') xtemp = xtemp**2 !case('6') ! xtemp = xtemp end select enddo endif convert_to_ln_fac = xtemp end function convert_to_ln_fac !--------------------------------------- ! query function to return whether the ! transformation involves a log or not !--------------------------------------- logical function islogged(itrans) integer, intent(in) :: itrans character(len=20) :: string write(string,"(i8)") itrans islogged = (index(string,'1') /= 0 .or. index(string,'6') /= 0) end function islogged end module transforms danieljprice-splash-4d1f09c/src/units.f90000066400000000000000000000476201477365367100203540ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2018 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !-------------------------------------------------------------------- ! module containing subroutines to do with setting of physical units !-------------------------------------------------------------------- module settings_units use params use labels, only:unitslabel,unitslabel_default,lenlabel,& labelzintegration,labelzintegration_default implicit none real, dimension(0:maxplot), public :: units,units_default,units_old,units_calc real, public :: unitzintegration,unitzintegration_default real(doub_prec), public :: unit_interp public :: set_units,read_unitsfile,write_unitsfile,defaults_set_units public :: get_nearest_length_unit,get_nearest_time_unit public :: get_nearest_mass_unit,get_nearest_velocity_unit integer, parameter :: nx = 9 real(doub_prec), parameter :: unit_length(nx) = & (/1.d0, & 1.d2, & 2.01168d4, & 1.d5, & 6.96d10, & 1.496d13,& 3.086d18,& 3.086d21,& 3.086d24/) character(len=*), parameter :: unit_labels_length(nx) = & (/' [cm] ',& ' [m] ',& ' [furlong]',& ' [km] ',& ' [R_{Sun}]',& ' [au] ',& ' [pc] ',& ' [kpc] ',& ' [Mpc] '/) integer, parameter :: nt = 7 real(doub_prec), parameter :: unit_time(nt) = & (/1.d-3, & 1.d0, & 3.6d3, & 8.64d4, & 3.15568926d7, & 3.15568926d13,& 3.15568926d16/) character(len=*), parameter :: unit_labels_time(nt) = & (/' ms ',& ' s ',& ' hrs ',& ' days',& ' yrs ',& ' Myr ',& ' Gyr '/) integer, parameter :: nv = 3 real(doub_prec), parameter :: unit_vel(nv) = & (/1.d0, & 1.d2, & 1.d5/) character(len=*), parameter :: unit_labels_vel(nv) = & (/' [cm/s] ',& ' [m/s] ',& ' [km/s] '/) integer, parameter :: nm = 6 real(doub_prec), parameter :: unit_mass(nm) = & (/1.d0, & 1.d3, & 8.958d23, & ! Ceres mass 5.979d27, & ! Earth mass 1.898d30, & ! Jupiter mass 1.989d33/) ! Solar mass character(len=*), parameter :: unit_labels_mass(nm) = & (/' [g] ',& ' [kg] ',& ' [M_{Ceres}] ',& ' [M_{Earth}] ',& ' [M_{Jup}] ',& ' [M_{Sun}] '/) private contains !--------------------------------------------------------------- ! ! initialise the units arrays to some harmless default values ! !--------------------------------------------------------------- subroutine defaults_set_units units(:) = 1.0 units_default(:) = 1.0 unitzintegration = 1.0 unitzintegration_default = 1.0 unit_interp = 1.0d0 unitslabel(:) = ' ' unitslabel_default(:) = ' ' labelzintegration = ' ' labelzintegration_default = ' ' end subroutine defaults_set_units !------------------------------------------- ! ! find the nearest 'sensible' length unit ! !------------------------------------------- subroutine get_nearest_length_unit(udist,unit,unitlabel) real(doub_prec), intent(in) :: udist real(doub_prec), intent(out) :: unit character(len=*), intent(out) :: unitlabel call get_nearest_unit(nx,unit_length,unit_labels_length,udist,unit,unitlabel) end subroutine get_nearest_length_unit !------------------------------------------- ! ! find the nearest 'sensible' time unit ! !------------------------------------------- subroutine get_nearest_time_unit(utime,unit,unitlabel) real(doub_prec), intent(in) :: utime real(doub_prec), intent(out) :: unit character(len=*), intent(out) :: unitlabel call get_nearest_unit(nt,unit_time,unit_labels_time,utime,unit,unitlabel) end subroutine get_nearest_time_unit !------------------------------------------- ! ! find the nearest 'sensible' velocity unit ! !------------------------------------------- subroutine get_nearest_velocity_unit(uvel,unit,unitlabel) real(doub_prec), intent(in) :: uvel real(doub_prec), intent(out) :: unit character(len=*), intent(out) :: unitlabel call get_nearest_unit(nv,unit_vel,unit_labels_vel,uvel,unit,unitlabel) end subroutine get_nearest_velocity_unit !------------------------------------------- ! ! find the nearest 'sensible' mass unit ! !------------------------------------------- subroutine get_nearest_mass_unit(umass,unit,unitlabel) real(doub_prec), intent(in) :: umass real(doub_prec), intent(out) :: unit character(len=*), intent(out) :: unitlabel call get_nearest_unit(nm,unit_mass,unit_labels_mass,umass,unit,unitlabel) end subroutine get_nearest_mass_unit !------------------------------------------------------- ! ! find the nearest unit from a list of possible units ! !------------------------------------------------------- subroutine get_nearest_unit(nu,units,unit_labels,unit_in,unit_out,unitlabel_out) integer, intent(in) :: nu real(doub_prec), intent(in) :: units(nu),unit_in character(len=*), intent(in) :: unit_labels(nu) real(doub_prec), intent(out) :: unit_out character(len=*), intent(out) :: unitlabel_out real(doub_prec) :: err,erri integer :: i err = huge(err) do i = 1,nu ! find nearest unit in log space erri = abs(log10(unit_in)-log10(units(i))) if (erri < err) then unit_out = unit_in/units(i) unitlabel_out = unit_labels(i) err = erri endif enddo end subroutine get_nearest_unit !------------------------------------------------------- ! ! set units ! !------------------------------------------------------- subroutine set_units(ncolumns,numplot,UnitsHaveChanged) use prompting, only:prompt use labels, only:label,ix,ih,ivx,ipmass,idivB,iamvec,labelvec,headertags,strip_units use settings_data, only:ndim,ndimV,ivegotdata use particle_data, only:headervals,maxstep use asciiutils, only:get_value integer, intent(in) :: ncolumns,numplot logical, intent(out) :: UnitsHaveChanged integer :: icol,ibs,ibc real(doub_prec) :: unitsprev real(doub_prec) :: udist,utime,umass logical :: applytoall,got_label character(len=lenlabel) :: mylabel icol = 1 ! try to extract code units from the file headers, these only exist in some data reads utime = 0.d0 udist = 0.d0 umass = 0.d0 if (maxstep > 0 .and. ivegotdata) then utime = get_value('utime',headertags,headervals(:,1)) udist = get_value('udist',headertags,headervals(:,1)) umass = get_value('umass',headertags,headervals(:,1)) endif do while(icol >= 0) icol = -1 call prompt('enter column to change units (-2=reset all,-1=quit,0=time)',icol,-2,numplot) if (icol >= 0) then unitsprev = units(icol) if (icol > ncolumns) then print "(a)",' WARNING: calculated quantities are automatically calculated in physical units ' print "(a)",' this means that units set here will be re-scalings of these physical values' endif got_label = .true. if (icol==0 .and. utime > 0.) then ! give hints for possible time units, if utime is read from data file call choose_unit_from_list(units(icol),unitslabel(icol),& nt,unit_labels_time,unit_time,utime,'time') elseif (any(ix==icol) .or. icol==ih .and. udist > 0.) then ! give hints for possible length units, if udist is read from data file call choose_unit_from_list(units(icol),unitslabel(icol),& nx,unit_labels_length,unit_length,udist,'length') elseif (ivx==icol .and. udist > 0. .and. utime > 0.) then ! give hints for velocity units, if both udist and utime read from data file call choose_unit_from_list(units(icol),unitslabel(icol),& nv,unit_labels_vel,unit_vel,udist/utime,'velocity') elseif (ipmass==icol .and. umass > 0.) then ! give hints for mass units, if umass read from data file call choose_unit_from_list(units(icol),unitslabel(icol),& nm,unit_labels_mass,unit_mass,umass,'mass') elseif (icol > 0) then mylabel = strip_units(label(icol),unitslabel(icol)) call prompt('enter '//trim(mylabel)//' units (new=old*units)',units(icol)) got_label = .false. else ! icol = 0 call prompt('enter time units (new=old*units)',units(icol)) got_label = .false. endif if (abs(units(icol)) > tiny(units)) then ! sanity check the units if (abs(units(icol) - unitsprev) > tiny(units)) UnitsHaveChanged = .true. !--prompt for the units label if (.not.got_label) then ! skip if label set in choose_unit_from_list !--suggest a label amendment if none already set if (len_trim(unitslabel(icol))==0) & call suggest_units_label(units(icol), unitslabel(icol)) call prompt('enter label amendment ',unitslabel(icol)) endif else UnitsHaveChanged = .true. units(icol) = 1.0 unitslabel(icol) = ' ' endif if (UnitsHaveChanged .and. icol > 0) then ! !--prompt to apply same units to coordinates and h for consistency ! if (any(ix(1:ndim)==icol) .or. (icol==ih .and. ih > 0)) then applytoall = .true. !--try to make prompts apply to whichever situation we have if (ndim==1) then if (icol==ix(1) .and. ih > 0) then call prompt(' Apply these units to h?',applytoall) else call prompt(' Apply these units to '//trim(label(ix(1)))//'?',applytoall) endif elseif (any(ix(1:ndim)==icol) .and. ih > 0) then call prompt(' Apply these units to all coordinates and h?',applytoall) else call prompt(' Apply these units to all coordinates?',applytoall) endif if (applytoall) then units(ix(1:ndim)) = units(icol) unitslabel(ix(1:ndim)) = unitslabel(icol) if (ih > 0) then if (idivb > 0) then ! amend units of div B and curl B ibs = index(unitslabel(idivB),'/') ibc = index(unitslabel(icol),'[') units(idivB:idivB+3) = units(idivB:idivB+3)*units(ih)/units(icol) unitslabel(idivB:idivB+3) = unitslabel(idivB)(1:ibs)//unitslabel(icol)(ibc+1:) endif units(ih) = units(icol) unitslabel(ih) = unitslabel(icol) endif endif ! !--set units for z integration in 3D ! so for example can have x,y,z in kpc but column density in g/cm^2 ! if (abs(unitzintegration-1.0) <= tiny(unitzintegration)) then unitzintegration = units(icol) labelzintegration = unitslabel(icol) endif if (ndim==3) then call prompt(' Enter unit for ''z'' in 3D column integrated plots ',unitzintegration) call prompt(' Enter label for z integration unit (e.g. [cm])',labelzintegration) endif endif ! !--also sensible to apply same units to all components of a vector ! if (ndimV > 1 .and. iamvec(icol) > 0) then applytoall = .true. call prompt(' Apply these units to all components of '//trim(labelvec(icol))//'?',applytoall) if (applytoall) then where (iamvec(1:ncolumns)==iamvec(icol)) units(1:ncolumns) = units(icol) unitslabel(1:ncolumns) = unitslabel(icol) end where endif endif endif elseif (icol==-2) then UnitsHaveChanged = .true. print "(/a)",' resetting all units to unity...' units = 1.0 unitslabel = ' ' unitzintegration = 1.0 labelzintegration = ' ' endif print* enddo end subroutine set_units !------------------------------------------------------- ! ! select unit from a sensible list of presets ! !------------------------------------------------------- subroutine choose_unit_from_list(unit,unitlabel,n,unit_labels,unit_vals,unit_code,tag) use prompting, only:prompt integer, intent(in) :: n real, intent(inout) :: unit character(len=*), intent(inout) :: unitlabel real(doub_prec), intent(in) :: unit_code,unit_vals(n) character(len=*), intent(in) :: unit_labels(n),tag integer :: i,iselect real :: unitsprev iselect = n+1 ! get default value of iselect if one of the units is already chosen do i=1,n if (abs(unit-unit_code/unit_vals(i)) < tiny(0.)) iselect = i enddo do i=1,n print "(i2,')',a,' ( x ',1pg11.4,')')",i,unit_labels(i),unit_code/unit_vals(i) enddo print "(i2,') custom')",n+1 call prompt('Enter choice of '//trim(tag)//' unit ',iselect,1,n+1) if (iselect==n+1) then unitsprev = unit call prompt('Enter custom unit (new=old*unit)',unit) if (unit_code > 0.d0) call suggest_label(unitsprev,unit,unit_code, & unit_vals,unit_labels,unitlabel) call prompt('enter label amendment ',unitlabel) else unit = real(unit_code/unit_vals(iselect)) unitlabel = unit_labels(iselect) print "(a,1pg11.4)", ' => '//trim(tag)//' unit is now '//trim(unitlabel)//& ', i.e. '//trim(tag)//' = '//trim(tag)//'_code * ',unit endif end subroutine choose_unit_from_list !------------------------------------------------------- ! ! suggest the units label based on matching list ! of known scalings ! !------------------------------------------------------- subroutine suggest_label(unitsprev,unit,ucode,unit_suggest,unit_label_suggest,unitlabel) real, intent(in) :: unitsprev,unit real(doub_prec), intent(in) :: ucode,unit_suggest(:) character(len=*), intent(in) :: unit_label_suggest(:) character(len=*), intent(inout) :: unitlabel integer :: i ! do nothing if unit has not changed if (abs(unit - unitsprev) < epsilon(0.)) return ! suggest corresponding label to the unit chosen from list do i=1,size(unit_suggest) if (abs(unit/(ucode/unit_suggest(i)) - 1.) < 0.01) unitlabel = unit_label_suggest(i) enddo !print*,' suggested unit label = ',unitlabel end subroutine suggest_label !------------------------------------------------------- ! ! suggest sensible units label for an arbitrary scaling ! !------------------------------------------------------- subroutine suggest_units_label(unit,label) real, intent(in) :: unit character(len=*), intent(out) :: label real(doub_prec) :: dunits dunits = 1./unit if (dunits > 100 .or. dunits < 1.e-1) then write(label,"(1pe8.1)") dunits else write(label,"(f5.1)") dunits endif label = ' [ x '//trim(adjustl(label))//' ]' end subroutine suggest_units_label !------------------------------------------------------- ! ! save units for all columns to a file ! !------------------------------------------------------- subroutine write_unitsfile(unitsfile,ncolumns) character(len=*), intent(in) :: unitsfile integer, intent(in) :: ncolumns integer :: i,ierr print "(1x,a)",'saving units to '//trim(unitsfile) open(unit=77,file=unitsfile,status='replace',form='formatted',iostat=ierr) if (ierr /=0) then print "(1x,a)",'ERROR: cannot write units file' else write(77,*,iostat=ierr) units(0),';',trim(unitslabel(0)),' ;',unitzintegration,';',trim(labelzintegration) do i=1,ncolumns write(77,*,iostat=ierr) units(i),';',trim(unitslabel(i)) if (ierr /= 0) then print "(1x,a)",'ERROR whilst writing units file' close(unit=77) return endif enddo endif close(unit=77) return end subroutine write_unitsfile !------------------------------------------------------- ! ! read units for all columns from a file ! !------------------------------------------------------- subroutine read_unitsfile(unitsfile,ncolumns,ierr,iverbose) use settings_data, only:ndim character(len=*), intent(in) :: unitsfile integer, intent(in) :: ncolumns integer, intent(out) :: ierr integer, intent(in), optional :: iverbose character(len=2*len(unitslabel)+40) :: line integer :: i,itemp,isemicolon,isemicolon2,isemicolon3,isverbose logical :: ierrzunits,iexist if (present(iverbose)) then isverbose= iverbose else isverbose = 1 endif ierr = 0 ierrzunits = .false. inquire(file=unitsfile,exist=iexist) if (.not.iexist) then if (isverbose > 1) print "(1x,a)",trim(unitsfile)//' not found' ierr = 1 return endif open(unit=78,file=unitsfile,status='old',form='formatted',err=997) if (isverbose > 0) print "(a)",' read '//trim(unitsfile) do i=0,maxplot ! read all units possibly present in file ! ! read a line from the file ! read(78,"(a)",err=998,end=999) line ! ! now get units from the first part of the line ! read(line,*,iostat=itemp) units(i) if (itemp /= 0) print*,'ERROR reading units for column ',i if (units(i) > huge(units)) print "(/,a,i2)",' ERROR: UNITS ARE INFINITE FOR COLUMN ',i if (isnan(units(i))) print "(/,a,i2)",' ERROR: UNITS ARE NaN FOR COLUMN ',i ! ! units label is what comes after the semicolon ! isemicolon = index(line,';') if (i==0) then !--time line also contains unit of z integration isemicolon2 = index(line(isemicolon+1:),';') if (isemicolon2 > 0) then isemicolon2 = isemicolon + isemicolon2 unitslabel(i) = trim(line(isemicolon+1:isemicolon2-1)) isemicolon3 = isemicolon2 + index(line(isemicolon2+1:),';') read(line(isemicolon2+1:isemicolon3-1),*,iostat=itemp) unitzintegration if (itemp /= 0) then print*,'error reading unit for z integration' ierrzunits = .true. else labelzintegration = trim(line(isemicolon3+1:)) endif else ierrzunits = .true. print*,'error: could not read z integration unit from units file' if (isemicolon > 0) then unitslabel(i) = trim(line(isemicolon+1:)) else print*,'error reading units label for column ',i endif endif else if (isemicolon > 0) then unitslabel(i) = trim(line(isemicolon+1:)) else print*,'error reading units label for column ',i endif endif ! print*,i,'units = ',units(i),'label = ',unitslabel(i) enddo if (ierrzunits .and. ndim==3) then unitzintegration = units(3) labelzintegration = unitslabel(3) endif close(unit=78) return 997 continue if (isverbose > 0) print*,trim(unitsfile),' not found' ierr = 1 return 998 continue print*,'*** error reading units from '//trim(unitsfile) ierr = 2 if (ierrzunits .and. ndim==3) then unitzintegration = units(3) labelzintegration = unitslabel(3) endif close(unit=78) return 999 continue !--only give error if we really do not have enough columns ! (on first call nextra is not set) if (i <= ncolumns) then print "(1x,a,i2)",'end of file in '//trim(unitsfile)//': units read to column ',i ierr = -1 endif if (ierrzunits .and. ndim==3) then unitzintegration = units(3) labelzintegration = unitslabel(3) endif close(unit=78) return end subroutine read_unitsfile end module settings_units danieljprice-splash-4d1f09c/src/utils_vectors.f90000066400000000000000000000102361477365367100221100ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2021- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- module vectorutils implicit none public :: minmaxave,cross_product3D,curl3D_epsijk,det public :: matrixinvert3D,rotatevec interface cross_product3D module procedure cross_product3D_r4, cross_product3D_r8 end interface private contains !------------------------------------------------------------------- ! simple routine to take min, max and average of a quantity !------------------------------------------------------------------- subroutine minmaxave(x,xmin,xmax,xav,npts) integer :: i integer, intent(in) :: npts real, intent(in) :: x(npts) real, intent(out) :: xmin,xmax,xav xav = 0. xmin = huge(xmin) xmax = -xmin do i=1,npts xav = xav + x(i) xmin = min(xmin,x(i)) xmax = max(xmax,x(i)) enddo xav = xav/real(npts) return end subroutine minmaxave pure subroutine cross_product3D_r4(veca,vecb,vecc) real(4), intent(in) :: veca(3),vecb(3) real(4), intent(out) :: vecc(3) vecc(1) = veca(2)*vecb(3) - veca(3)*vecb(2) vecc(2) = veca(3)*vecb(1) - veca(1)*vecb(3) vecc(3) = veca(1)*vecb(2) - veca(2)*vecb(1) end subroutine cross_product3D_r4 pure subroutine cross_product3D_r8(veca,vecb,vecc) real(8), intent(in) :: veca(3),vecb(3) real(8), intent(out) :: vecc(3) vecc(1) = veca(2)*vecb(3) - veca(3)*vecb(2) vecc(2) = veca(3)*vecb(1) - veca(1)*vecb(3) vecc(3) = veca(1)*vecb(2) - veca(2)*vecb(1) end subroutine cross_product3D_r8 pure subroutine curl3D_epsijk(gradAvec,curlA) real, intent(in) :: gradAvec(3,3) real, intent(out) :: curlA(3) curlA(1) = gradAvec(2,3) - gradAvec(3,2) curlA(2) = gradAvec(3,1) - gradAvec(1,3) curlA(3) = gradAvec(1,2) - gradAvec(2,1) end subroutine curl3D_epsijk !---------------------------------------------------------------- !+ ! Internal subroutine that inverts a 3x3 matrix !+ !---------------------------------------------------------------- pure subroutine matrixinvert3D(A,Ainv,ierr) real, intent(in) :: A(3,3) real, intent(out) :: Ainv(3,3) integer, intent(out) :: ierr real :: x0(3),x1(3),x2(3),result(3) real :: det, ddet ierr = 0 x0 = A(1,:) x1 = A(2,:) x2 = A(3,:) call cross_product3D(x1,x2,result) det = dot_product(x0,result) if (abs(det) > tiny(det)) then ddet = 1./det else ddet = 0. Ainv = 0. ierr = 1 return endif Ainv(:,1) = result(:)*ddet call cross_product3D(x2,x0,result) Ainv(:,2) = result(:)*ddet call cross_product3D(x0,x1,result) Ainv(:,3) = result(:)*ddet return end subroutine matrixinvert3D real function det(A) real, intent(in) :: A(3,3) real :: x0(3),x1(3),x2(3),result(3) x0 = A(1,:) x1 = A(2,:) x2 = A(3,:) call cross_product3D(x1,x2,result) det = dot_product(x0,result) return end function det !------------------------------------------------------------------------ ! ! rotate a vector (u) around an axis defined by another vector (v) ! by an angle (theta) using the Rodrigues rotation formula ! !------------------------------------------------------------------------ pure subroutine rotatevec(u,v,theta) real, dimension(3), intent(inout) :: u real, dimension(3), intent(in) :: v real, intent(in) :: theta real, dimension(3) :: k,w !--normalise v k = v/sqrt(dot_product(v,v)) !--Rodrigues rotation formula call cross_product3D(k,u,w) u = u*cos(theta) + w*sin(theta) + k*dot_product(k,u)*(1-cos(theta)) end subroutine rotatevec end module vectorutils danieljprice-splash-4d1f09c/src/write_data_gadget.f90000066400000000000000000000150051477365367100226400ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2014 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! Module implementing "splash to gadget" operation, writing ! a binary dump file suitable for input to the GADGET code !----------------------------------------------------------------- module write_data_gadget implicit none character(len=10), parameter, public :: formatname='gadget' public :: write_sphdata_gadget private contains subroutine write_sphdata_gadget(time,dat,iamtype,ntotal,ntypes,npartoftype, & masstype,ncolumns,filename) use labels, only:ih,ivx,ix,iutherm,irho,ipmass use settings_data, only:ndim use limits, only:lim use params, only:int1 integer, intent(in) :: ntotal,ntypes,ncolumns integer, intent(in), dimension(:) :: npartoftype real, intent(in) :: time real, intent(in), dimension(ntotal,ncolumns) :: dat integer(kind=int1), intent(in), dimension(:) :: iamtype real, intent(in), dimension(:) :: masstype character(len=*), intent(in) :: filename integer, parameter :: idump = 83 character(len=len(filename)+10) :: outfile integer, dimension(6) :: nall,ncrap,noftype real(kind=8), dimension(6) :: massoftype real(kind=8) :: boxsize,dtime real(kind=8), parameter :: dumz = 0.d0 real(kind=4), dimension(15) :: unused integer, parameter :: iflagsfr = 0, iflagfeedback = 0, iflagcool = 0 integer, parameter :: nfiles = 1 integer :: ierr,i,j,nmasses,ngas,itype integer, dimension(:), allocatable :: iorder ! !--define output file name ! outfile=trim(filename)//'.gadget' ! !--check if we have enough data to write a GADGET dump ! if (ndim < 3) then print "(a)",' ERROR: ndim < 3 but must be 3 for GADGET data -- cannot write PHANTOM dump, skipping...' return endif if (any(ix(:) <= 0)) then print "(a)",' ERROR: position labels not set -- cannot write GADGET dump, skipping...' return endif if (ivx <= 0) then print "(a)",' ERROR: velocity not found in data -- cannot write GADGET dump, skipping...' return endif if (iutherm <= 0) then print "(a)",' ERROR: thermal energy not found in data -- cannot write GADGET dump, skipping...' return endif if (irho <= 0) then print "(a)",' ERROR: density not found in data -- cannot write GADGET dump, skipping...' return endif if (ih <= 0) then print "(a)",' ERROR: smoothing length not found in data -- cannot write GADGET dump, skipping...' return endif ! !--open dumpfile ! write(*,"(/,/,'--------> TIME = ',f10.4,"// & "': writing GADGET snapshot file ',a,' <--------',/)") time,trim(outfile) print "(a)", ' WARNING: conversion to GADGET format is LIMITED in scope...' print "(a)", ' Currently converts only basic hydro quantities (x,v,m,u,rho,h) ' print "(a)", ' and header quantities may be guessed/fudged ...your mileage may vary' print "(a,/)",' (if you use this functionality and want it improved, just let me know)' print "(a,i2)",' writing to unit ',idump open(unit=idump,file=outfile,status='replace',form='unformatted',iostat=ierr) if (ierr /= 0) then write(*,*) 'error: can''t create new dumpfile ',trim(outfile) return endif massoftype(:) = 0. nall(:) = 0 noftype(:) = 0 massoftype(1:ntypes) = masstype(1:ntypes) nall(1:ntypes) = npartoftype(1:ntypes) noftype(1:ntypes) = npartoftype(1:ntypes) ncrap(:) = 0 boxsize = abs(lim(ix(1),2) - lim(ix(1),1)) unused(:) = 0 dtime = time write(idump,err=100) noftype(1:6),massoftype(1:6),dtime,dumz, & iflagsfr,iflagfeedback,nall(1:6),iflagcool,nfiles,boxsize, & dumz,dumz,dumz,iflagsfr,iflagsfr,ncrap(1:6),iflagsfr,unused(:) ! !--work out how many particle masses to write ! nmasses = 0 do j=1,6 if (massoftype(j) <= 0.) then nmasses = nmasses + noftype(j) endif enddo print*,'nmasses = ',nmasses ngas = npartoftype(1) print*,'ngas = ',ngas if (ntotal > ngas .and. (size(iamtype) > 1)) then !--must print the particles ordered by type allocate(iorder(ntotal),stat=ierr) j = 0 do itype=1,min(ntypes,6) if (npartoftype(itype) > 0) then do i=1,ntotal if (iamtype(i)==itype) then j = j + 1 iorder(j) = i endif enddo endif enddo if (j < ntotal) then print*,' ERROR: too many particle types in conversion to gadget format' do i=j+1,ntotal iorder(i) = i enddo endif write(idump,err=100) ((dat(iorder(i),ix(j)),j=1,3),i=1,ntotal) write(idump,err=100) ((dat(iorder(i),j),j=ivx,ivx+2),i=1,ntotal) write(idump,err=100) (iorder(i),i=1,ntotal) ! particle id write(idump,err=100) (dat(iorder(i),ipmass), i=1,nmasses) write(idump,err=100) (dat(iorder(i),iutherm),i=1,ngas) write(idump,err=100) (dat(iorder(i),irho), i=1,ngas) write(idump,err=100) (2.*dat(iorder(i),ih), i=1,ngas) deallocate(iorder) else write(idump,err=100) ((dat(i,ix(j)),j=1,3),i=1,ntotal) write(idump,err=100) ((dat(i,j),j=ivx,ivx+2),i=1,ntotal) write(idump,err=100) (i,i=1,ntotal) ! particle id write(idump,err=100) (dat(i,ipmass), i=1,nmasses) write(idump,err=100) (dat(i,iutherm),i=1,ngas) write(idump,err=100) (dat(i,irho), i=1,ngas) write(idump,err=100) (2.*dat(i,ih), i=1,ngas) endif print*,'finished writing file -- OK' close(unit=idump) return 100 continue write(*,*) 'error whilst writing dumpfile '//trim(outfile) close(unit=idump) end subroutine write_sphdata_gadget end module write_data_gadget danieljprice-splash-4d1f09c/src/write_data_phantom.f90000066400000000000000000000343641477365367100230640ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! Module implementing "splash to phantom" operation, writing ! a binary dump file suitable for input to the PHANTOM code !----------------------------------------------------------------- module write_data_phantom use iso_c_binding, only:c_float,c_double implicit none integer, parameter :: int8 = selected_int_kind(10) integer, parameter :: sing_prec = c_float integer, parameter :: doub_prec = c_double character(len=10), parameter, public :: formatname='phantom' integer, parameter :: lentag = 16 public :: write_sphdata_phantom private contains !-------------------------------------------------------------------- !+ ! write header tag for tagged format !+ !-------------------------------------------------------------------- function tag(string) character(len=lentag) :: tag character(len=*), intent(in) :: string tag = adjustl(string) end function tag !-------------------------------------------------------------------- !+ ! write header tag for tagged format !+ !-------------------------------------------------------------------- function convert_tag_to_phantom(string) result(mytag) character(len=lentag) :: mytag character(len=*), intent(in) :: string mytag = adjustl(string) select case(trim(mytag)) case('Potential') mytag = 'poten' end select end function convert_tag_to_phantom !-------------------------------------------------------------------- !+ ! write output data file that is readable by phantom !+ !-------------------------------------------------------------------- subroutine write_sphdata_phantom(time,gamma,dat,ndim,ntotal,ntypes,npartoftype, & masstype,ncolumns,udist,umass,utime,umagfd,labeltype,& label_dat,ix,ih,ivx,iBfirst,ipmass,irho,iutherm,filename,hsoft_sink) integer, intent(in) :: ndim,ntotal,ntypes,ncolumns integer, intent(in) :: npartoftype(:) real, intent(in) :: time !! real8 vs real4 error real, intent(in) :: gamma real, intent(in) :: dat(ntotal,ncolumns) real, intent(in) :: masstype(:) real(doub_prec), intent(in) :: udist,umass,utime,umagfd character(len=*), intent(in) :: labeltype(ntypes),label_dat(ncolumns) integer, intent(in) :: ix(3),ivx,ih,iBfirst,ipmass,irho,iutherm character(len=*), intent(in) :: filename real, intent(in) :: hsoft_sink integer, parameter :: i_int = 1, & i_int1 = 2, & i_int2 = 3, & i_int4 = 4, & i_int8 = 5, & i_real = 6, & i_real4 = 7, & i_real8 = 8 integer, parameter :: idump = 83 character(len=len(filename)+10) :: outfile integer, parameter :: intval1=690706,intval2=780806 integer, parameter :: int1o=690706 !,int2o=780806 integer, parameter :: idimhead = 22 integer(kind=int8) :: nparttot,npartoftypetot(ntypes),number8 integer :: nums(8),idot integer :: narraylengths,nblocks,nblockarrays,ntypesi integer :: i,j,ierr,i1,index1,number,nptmass,iversion,np,maxrhead real :: rheader(idimhead) character(len=lentag) :: rheader_tags(idimhead) real :: r1,hfact,macc,spinx,spiny,spinz character(len=2), parameter :: vlabel(3) = (/'vx','vy','vz'/) character(len=2), parameter :: Blabel(3) = (/'Bx','By','Bz'/) logical :: mhd logical, allocatable :: mask(:) ! ! sink particle locations in dat array ! integer, allocatable :: ilocsink(:) ! !--define output file name ! idot = index(filename,'.')-1 if (idot <= 0) idot = len_trim(filename) outfile=filename(1:idot)//'.tmp' narraylengths = 2 nblocks = 1 ! not parallel dump hfact = 1.2 ! must be specified in phantom dumps nptmass = 0 ! work this out later ! !--check if we have enough data to write a PHANTOM dump ! allocate(mask(ncolumns)) mask = .false. if (ndim < 3) then print "(a)",' ERROR: ndim < 3 but must be 3 for PHANTOM data -- cannot write PHANTOM dump, skipping...' return endif if (any(ix(:) <= 0)) then print "(a)",' ERROR: position labels not set -- cannot write PHANTOM dump, skipping...' return endif if (ivx <= 0) then print "(a)",' ERROR: velocity not found in data -- cannot write PHANTOM dump, skipping...' return endif if (ih <= 0) then print "(a)",' ERROR: smoothing length not found in data -- cannot write PHANTOM dump, skipping...' return endif mhd = .false. if (iBfirst > 0) then mhd = .true. narraylengths = 4 mask(iBfirst:iBfirst+ndim-1) = .true. endif ! do not write known quantities twice mask(ix) = .true. mask(ivx:ivx+ndim-1) = .true. mask(ih) = .true. if (iutherm > 0) mask(iutherm) = .true. if (ipmass > 0) mask(ipmass) = .true. if (irho > 0) mask(irho) = .true. ! !--figure out whether we have sink particles ! call extract_sink_particles_from_data(ntypes,npartoftype,labeltype,np,& npartoftypetot,nptmass,ntypesi,ilocsink) nparttot = np !--fill rheader and check that we have equal mass particles rheader_tags = ' ' rheader(:) = 0. rheader(1) = time rheader(2) = gamma rheader(3) = hfact rheader_tags(1) = 'time' rheader_tags(2) = 'gamma' rheader_tags(3) = 'hfact' if (ipmass > 0) then index1 = 1 do i=1,ntypesi rheader(3+i) = dat(index1,ipmass) rheader_tags(3+i) = 'massoftype' if (npartoftype(i) > 0) then if (any(dat(index1:index1+npartoftype(i)-1,ipmass) /= dat(index1,ipmass))) then print "(a)",' WARNING: unequal mass particles detected but PHANTOM only accepts equal mass...' endif index1 = index1 + npartoftype(i) - 1 endif enddo else do i=1,ntypesi rheader(3+i) = masstype(i) rheader_tags(3+i) = 'massoftype' enddo endif maxrhead = 3+ntypesi write(*,"(/,/,'--------> TIME = ',f10.4,"// & "': full dump written to file ',a,' on unit ',i2,' <--------',/)") & time,trim(outfile),idump open(unit=idump,file=outfile,status='replace',form='unformatted',iostat=ierr) if (ierr /= 0) then write(*,*) 'error: can''t create new dumpfile '//trim(outfile) return endif ! !--write full dump Phantom/sphNG file ! i1 = intval1 r1 = real(intval2) iversion = 1 ! file version to write write (idump, err=100) intval1,r1,intval2,iversion,int1o write (idump, err=100) fileident('F','Phantom',mhd=mhd) ! !--single values ! !--default int number = 4+ntypesi write (idump, err=100) number write (idump, err=100) tag('nparttot'),tag('ntypes'),(tag('npartoftype'),i=1,ntypesi),tag('nblocks'),tag('nptmass') write (idump, err=100) int(nparttot),ntypesi,(int(npartoftypetot(i)),i=1,ntypesi),nblocks,nptmass !--int*1, int*2, int*4 number = 0 do i = 1, 3 write (idump, err=100) number enddo !--int*8 number = 2 + ntypesi write (idump, err=100) number write (idump, err=100) tag('nparttot'),tag('ntypes'),(tag('npartoftype'),i=1,ntypesi) write (idump, err=100) nparttot,int(ntypesi,kind=int8),npartoftypetot(1:ntypesi) !--default real write (idump, err=100) maxrhead write (idump, err=100) rheader_tags(1:maxrhead) write (idump, err=100) rheader(1:maxrhead) !--real*4 number = 0 write (idump, err=100) number !--real*8 if (umagfd > 0.) then number = 4 write (idump, err=100) number write (idump, err=100) tag('udist'),tag('umass'),tag('utime'),tag('umagfd') write (idump, err=100) udist, umass, utime, umagfd else number = 3 write (idump, err=100) number write (idump, err=100) tag('udist'),tag('umass'),tag('utime') write (idump, err=100) udist, umass, utime endif nblockarrays = narraylengths*nblocks write (idump, err=100) nblockarrays ! !--array length 1 header ! number8 = np nums(:) = 0 if (iutherm > 0) then nums(i_real) = 7 else nums(i_real) = 6 endif ! write any array not already counted nums(i_real) = nums(i_real) + count(.not.mask) nums(i_real4) = 1 write (idump, err=100) number8, (nums(i), i=1,8) ! !--array length 2 header ! number8 = nptmass nums(:) = 0 if (nptmass > 0) nums(i_real) = 13 write (idump, err=100) number8, (nums(i), i=1,8) ! !--array length 3 header ! if (narraylengths >= 3) then number8 = 0 nums(1:8) = 0 write (idump, err=100) number8, (nums(i), i=1,8) endif ! !--array length 4 header ! if (narraylengths >= 4) then if (mhd) then number8 = np else number8 = 0 endif nums(:) = 0 if (mhd) nums(i_real4) = 3 write (idump, err=100) number8, (nums(i), i=1,8) endif ! !--array length 1 arrays ! !--default int !--int*1 !--int*2 !--int*4 !--int*8 !--default real do j = 1, 3 write (idump, err=100) tag(label_dat(ix(j))) write (idump, err=100) (dat(i,ix(j)), i=1, np) enddo do j = 1, 3 write (idump, err=100) tag(vlabel(j)) write (idump, err=100) (dat(i,ivx+j-1), i=1, np) enddo if (iutherm > 0) then write (idump, err=100) tag(label_dat(iutherm)) write (idump, err=100) (dat(i,iutherm), i=1, np) endif do j=1,ncolumns if (.not.mask(j)) then print*,tag(label_dat(j)),'->',convert_tag_to_phantom(label_dat(j)) write (idump, err=100) convert_tag_to_phantom(label_dat(j)) write (idump, err=100) (dat(i,j), i=1, np) endif enddo !--real*4 ! dump smoothing length as a real*4 to save space write (idump, err=100) tag('h') write (idump, err=100) (real(dat(i,ih),kind=sing_prec), i=1, np) ! !--sink particle arrays ! if (nptmass > 0 .and. allocated(ilocsink)) then do j = 1, 3 write (idump, err=100) tag(label_dat(ix(j))) write (idump, err=100) (dat(ilocsink(i),ix(j)),i=1,nptmass) enddo write (idump, err=100) tag(label_dat(ipmass)) write (idump, err=100) (dat(ilocsink(i),ipmass),i=1,nptmass) write (idump, err=100) tag('h') write (idump, err=100) (dat(ilocsink(i),ih),i=1,nptmass) ! extra sink information macc = 0. spinx = 0. spiny = 0. spinz = 0. write (idump, err=100) tag('hsoft') write (idump, err=100) (hsoft_sink,i=1,nptmass) write (idump, err=100) tag('maccreted') write (idump, err=100) (macc,i=1,nptmass) write (idump, err=100) tag('spinx') write (idump, err=100) (spinx,i=1,nptmass) write (idump, err=100) tag('spiny') write (idump, err=100) (spiny,i=1,nptmass) write (idump, err=100) tag('spinz') write (idump, err=100) (spinz,i=1,nptmass) do j = 1, 3 write (idump, err=100) tag(label_dat(ivx+j-1)) write (idump, err=100) (dat(ilocsink(i),ivx+j-1),i=1,nptmass) enddo endif if (allocated(ilocsink)) deallocate(ilocsink) if (mhd) then do j=1,3 write (idump,err=100) tag(Blabel(j)) write (idump,err=100) (real(dat(i,iBfirst+j-1),kind=sing_prec),i=1, np) enddo endif close(unit=idump) return 100 continue write(*,*) 'error whilst writing dumpfile '//trim(outfile) close(unit=idump) end subroutine write_sphdata_phantom !-------------------------------------------------------------------- !+ ! contruct header string based on compile-time options ! these are for information only (ie. not important for restarting) !+ !-------------------------------------------------------------------- character(len=100) function fileident(firstchar,codestring,mhd) character(len=1), intent(in) :: firstchar character(len=*), intent(in), optional :: codestring logical, intent(in), optional :: mhd character(len=10) :: datestring, timestring, string logical :: gotmhd ! !--print date and time stamp in file header ! call date_and_time(datestring,timestring) datestring = datestring(7:8)//'/'//datestring(5:6)//'/'//datestring(1:4) timestring = timestring(1:2)//':'//timestring(3:4)//':'//timestring(5:) string = ' ' if (present(codestring)) then fileident = firstchar//'T:'//trim(codestring) else fileident = firstchar//'T:Phantom' endif gotmhd = .false. if (present(mhd)) gotmhd = mhd if (gotmhd) then fileident = trim(fileident)//' (mhd'//trim(string)//') : '//trim(datestring)//' '//trim(timestring) else fileident = trim(fileident)//' (hydro'//trim(string)//'): ' & //trim(datestring)//' '//trim(timestring) endif end function fileident !-------------------------------------------------------------------- !+ ! extract sink particle information from dat array, as these arrays ! are written separately in phantom data files !+ !-------------------------------------------------------------------- subroutine extract_sink_particles_from_data(ntypes,npartoftype,labeltype,np,noftype,nptmass,ntypesi,ilocsink) integer, intent(in) :: ntypes,npartoftype(ntypes) character(len=*), intent(in) :: labeltype(ntypes) integer, intent(out) :: np,nptmass,ntypesi integer(kind=int8), intent(out) :: noftype(ntypes) integer, allocatable, intent(out) :: ilocsink(:) integer :: i,j np = 0 ntypesi = ntypes noftype(:) = int(npartoftype(:),kind=8) over_types: do i=1,ntypes if (trim(labeltype(i))=='sink' .or. (trim(labeltype(i))=='dark matter' .and. npartoftype(i) <= 1000)) then nptmass = npartoftype(i) noftype(i) = 0 allocate(ilocsink(nptmass)) do j=1,nptmass ilocsink(j) = np+j enddo ntypesi = ntypes - 1 ! do not write types after this exit over_types else np = np + npartoftype(i) endif enddo over_types if (nptmass > 0) print "(/,a,i2,a)",' WRITING ',nptmass,' SINK PARTICLES' end subroutine extract_sink_particles_from_data end module write_data_phantom danieljprice-splash-4d1f09c/src/write_fits.f90000066400000000000000000000532451477365367100213710ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2020- Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !---------------------------------------------------------------------- ! ! Module handling read and write of FITS files ! With thanks to Christophe Pinte ! !---------------------------------------------------------------------- module readwrite_fits use iso_fortran_env, only:real32,real64 implicit none public :: read_fits_image,write_fits_image,fits_error public :: read_fits_cube,write_fits_cube public :: read_fits_header public :: get_floats_from_fits_header,get_from_header,get_from_header_s public :: append_to_fits_cube public :: get_velocity_from_fits_header public :: flatten_header interface write_fits_image module procedure write_fits_image,write_fits_image64 end interface write_fits_image interface write_fits_cube module procedure write_fits_cube,write_fits_cube64 end interface write_fits_cube interface read_fits_image module procedure read_fits_image,read_fits_image64 end interface read_fits_image interface read_fits_cube module procedure read_fits_cube,read_fits_cube64 end interface read_fits_cube interface append_to_fits_cube module procedure append_to_fits_cube end interface append_to_fits_cube private contains !--------------------------------------------------- ! subroutine to read image from FITS file ! using cfitsio library !--------------------------------------------------- subroutine read_fits_image(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename real(kind=real32), intent(out), allocatable :: image(:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) integer, intent(out) :: naxes(2),ierr integer :: iunit,ireadwrite,npixels,blocksize integer :: firstpix,nullval,group,nfound!,bitpix logical :: anynull ! !--open file and read header information ! ierr = 0 call ftgiou(iunit,ierr) ireadwrite = 0 call ftopen(iunit,filename,ireadwrite,blocksize,ierr) if (ierr /= 0) then ierr = -1 return endif ! !--read fits header (this is optional) ! if (present(hdr)) call read_fits_head(iunit,hdr,ierr) ! !--get the essential things from the header ! call ftgknj(iunit,'NAXIS',1,2,naxes,nfound,ierr) npixels = naxes(1)*naxes(2) !if (present(hdr)) bitpix = abs(get_from_header('BITPIX',hdr,ierr)) ! !--sanity check the header read ! if (npixels <= 0) then !print*,' ERROR: No pixels found' ierr = 1 return endif ! ! read image ! firstpix = 1 nullval = -999 group = 1 allocate(image(naxes(1),naxes(2)),stat=ierr) if (ierr /= 0) then ierr = 2 return endif ierr = 0 call ftgpve(iunit,group,firstpix,npixels,nullval,image,anynull,ierr) call ftclos(iunit,ierr) call ftfiou(iunit,ierr) end subroutine read_fits_image !--------------------------------------------------- ! read FITS header from file !--------------------------------------------------- subroutine read_fits_header(filename,hdr,ierr) character, intent(in) :: filename character(len=80), allocatable, intent(out) :: hdr(:) integer, intent(out) :: ierr integer :: ireadwrite,iunit,blocksize ierr = 0 call ftgiou(iunit,ierr) ireadwrite = 0 call ftopen(iunit,filename,ireadwrite,blocksize,ierr) if (ierr /= 0) return ! !--read fits header (this is optional) ! call read_fits_head(iunit,hdr,ierr) call ftclos(iunit,ierr) call ftfiou(iunit,ierr) end subroutine read_fits_header !--------------------------------------------------- ! internal subroutine to read FITS header information !--------------------------------------------------- subroutine read_fits_head(iunit,hdr,ierr) integer, intent(in) :: iunit integer, intent(out) :: ierr character(len=80), allocatable, intent(inout) :: hdr(:) character(len=80) :: record integer :: i,nkeys,nspace ! The FTGHSP subroutine returns the number of existing keywords in the ! current header data unit (CHDU), not counting the required END keyword, call ftghsp(iunit,nkeys,nspace,ierr) ! ! allocate memory ! if (allocated(hdr)) deallocate(hdr) allocate(hdr(nkeys)) ! Read each 80-character keyword record, and print it out. do i = 1, nkeys call ftgrec(iunit,i,record,ierr) hdr(i) = record !print *,hdr(i) end do end subroutine read_fits_head !--------------------------------------------------- ! internal subroutine to write FITS header information ! excluding things we have changed !--------------------------------------------------- subroutine write_fits_head(iunit,hdr,ierr) integer, intent(in) :: iunit character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr integer :: i,morekeys ierr = 0 morekeys = 0 ! count non-blank header lines do i=1,size(hdr) if (len_trim(hdr(i)) > 0) then morekeys = morekeys + 1 endif enddo ! write header size to fits file call fthdef(iunit,morekeys,ierr) if (ierr /= 0) return ! write header do i=1,size(hdr) if (len_trim(hdr(i)) > 0) then select case(hdr(i)(1:6)) case('SIMPLE','BITPIX','NAXIS ','NAXIS1','NAXIS2','NAXIS3','NAXIS4','EXTEND') ! skip the above keywords case default call ftprec(iunit,hdr(i),ierr) end select endif enddo end subroutine write_fits_head !--------------------------------------------------- ! subroutine to read spectral cube from FITS file ! using cfitsio library !--------------------------------------------------- subroutine read_fits_cube(filename,image,naxes,ierr,hdr,hdu,velocity) character(len=*), intent(in) :: filename real(kind=real32), intent(out), allocatable :: image(:,:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) real(kind=real32), intent(out), allocatable, optional :: velocity(:) integer, intent(out) :: naxes(4),ierr integer, intent(in), optional :: hdu ! specify which hdu to read integer :: iunit,ireadwrite,npixels,blocksize integer :: firstpix,nullval,group,hdutype logical :: anynull integer :: ndim ! !--open file and read header information ! ierr = 0 call ftgiou(iunit,ierr) ireadwrite = 0 call ftopen(iunit,filename,ireadwrite,blocksize,ierr) if (ierr /= 0) then ierr = -1 return endif ! ! switch to specified hdu, if argument is given ! if (present(hdu)) then print*,' reading hdu ',hdu call ftmahd(iunit,hdu,hdutype,ierr) ! hdutype==0 if (ierr /= 0 .or. hdutype /= 0) then ierr = -2 return endif endif if (present(hdr)) call read_fits_head(iunit,hdr,ierr) call ftgidm(iunit,ndim,ierr) ! get_img_dim if (ndim>=3) ndim = 3 call ftgisz(iunit,3,naxes(1:ndim),ierr) if (ndim==2) naxes(3) = 1 if (present(hdr) .and. present(velocity) .and. ndim >= 3) then if (.not.allocated(velocity)) allocate(velocity(naxes(3))) call get_velocity_from_fits_header(naxes(3),velocity,hdr,ierr) endif !if (present(hdr)) bitpix = abs(get_from_header('BITPIX',hdr,ierr)) ! call ftgknj(iunit,'NAXIS',1,2,naxes,nfound,ierr) npixels = product(naxes(1:ndim)) ! ! sanity check the header read ! if (npixels <= 0) then ierr = 1 return endif ! ! read images ! firstpix = 1 nullval = -999 group = 1 allocate(image(naxes(1),naxes(2),naxes(3)),stat=ierr) if (ierr /= 0) then ierr = 2 return endif ierr = 0 call ftgpve(iunit,group,firstpix,npixels,nullval,image,anynull,ierr) call ftclos(iunit,ierr) call ftfiou(iunit,ierr) end subroutine read_fits_cube !--------------------------------------------------- ! error code handling !--------------------------------------------------- character(len=50) function fits_error(ierr) integer, intent(in) :: ierr select case(ierr) case(3) fits_error = 'could not match floating point type for fits image' case(2) fits_error = 'could not allocate memory' case(1) fits_error = 'no pixels found' case(-2) fits_error = 'could not open specified hdu in fits file' case(-1) fits_error = 'could not open fits file' case default fits_error = 'unknown error' end select end function fits_error !------------------------------------------------ ! Writing new fits file !------------------------------------------------ subroutine write_fits_image(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(2) real(kind=real32), intent(in) :: image(naxes(1),naxes(2)) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) integer :: iunit,blocksize,group,firstpixel,bitpix,npixels logical :: simple,extend ! Get an unused Logical Unit Number to use to open the FITS file. ierr = 0 call ftgiou(iunit,ierr) ! Create the new empty FITS file. blocksize=1 print "(a)",' writing '//trim(filename) call ftinit(iunit,filename,blocksize,ierr) ! Initialize parameters about the FITS image simple=.true. ! data size bitpix=-32 extend=.true. ! Write the required header keywords. call ftphpr(iunit,simple,bitpix,2,naxes,0,1,extend,ierr) ! Write additional header keywords, if present if (present(hdr)) call write_fits_head(iunit,hdr,ierr) group=1 firstpixel=1 npixels = naxes(1)*naxes(2) ! write as real*4 call ftppre(iunit,group,firstpixel,npixels,image,ierr) ! Close the file and free the unit number call ftclos(iunit, ierr) call ftfiou(iunit, ierr) end subroutine write_fits_image !------------------------------------------------------------- ! Writing new fits file (convert from double precision input) !------------------------------------------------------------- subroutine write_fits_image64(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(2) real(kind=real64),intent(in) :: image(naxes(1),naxes(2)) real(kind=real32), allocatable :: img32(:,:) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) img32 = real(image,kind=real32) ! copy and allocate if (present(hdr)) then call write_fits_image(filename,img32,naxes,ierr,hdr) else call write_fits_image(filename,img32,naxes,ierr) endif deallocate(img32,stat=ierr) end subroutine write_fits_image64 !------------------------------------------------ ! Writing new fits file !------------------------------------------------ subroutine write_fits_cube(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(3) real(kind=real32), intent(in) :: image(naxes(1),naxes(2),naxes(3)) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) integer :: iunit,blocksize,group,firstpixel,bitpix,npixels logical :: simple,extend ! Get an unused Logical Unit Number to use to open the FITS file. ierr = 0 call ftgiou(iunit,ierr) ! Create the new empty FITS file. blocksize=1 call ftinit(iunit,filename,blocksize,ierr) if (ierr /= 0) then print "(a)",' ERROR: '//trim(filename)//' already exists or is not writeable' return else print "(a)",' writing '//trim(filename) endif ! Initialize parameters about the FITS image simple=.true. ! data size bitpix=-32 extend=.true. ! Write the required header keywords. call ftphpr(iunit,simple,bitpix,3,naxes,0,1,extend,ierr) ! Write additional header keywords, if present if (present(hdr)) call write_fits_head(iunit,hdr,ierr) group=1 firstpixel=1 npixels = product(naxes) ! write as real*4 call ftppre(iunit,group,firstpixel,npixels,image,ierr) ! Close the file and free the unit number call ftclos(iunit, ierr) call ftfiou(iunit, ierr) end subroutine write_fits_cube !------------------------------------------------ ! Writing new fits file !------------------------------------------------ subroutine append_to_fits_cube(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(3) real(kind=real32), intent(in) :: image(naxes(1),naxes(2),naxes(3)) integer, intent(out) :: ierr character(len=80), intent(in), optional :: hdr(:) integer :: iunit,blocksize,group,firstpixel,bitpix,npixels,ireadwrite logical :: simple,extend ! Get an unused Logical Unit Number to use to open the FITS file. ierr = 0 call ftgiou(iunit,ierr) ! Open the FITS file for read/write blocksize=1 ireadwrite=1 call ftopen(iunit,filename,ireadwrite,blocksize,ierr) if (ierr /= 0) then print "(a)",' ERROR: '//trim(filename)//' does not exist or is not read/writeable' return else print "(a)",' appending to '//trim(filename) endif !--create new hdu in the fits file call ftcrhd(iunit,ierr) if (ierr /= 0) then print "(a)",'ERROR creating new hdu in '//trim(filename) return endif ! Initialize parameters about the FITS image simple=.true. ! data size bitpix=-32 extend=.true. ! Write the required header keywords. call ftphpr(iunit,simple,bitpix,3,naxes,0,1,extend,ierr) ! Write additional header keywords, if present if (present(hdr)) call write_fits_head(iunit,hdr,ierr) group=1 firstpixel=1 npixels = product(naxes) ! write as real*4 call ftppre(iunit,group,firstpixel,npixels,image,ierr) ! Close the file and free the unit number call ftclos(iunit, ierr) call ftfiou(iunit, ierr) end subroutine append_to_fits_cube !------------------------------------------------------------- ! Writing new fits file (convert from double precision input) !------------------------------------------------------------- subroutine write_fits_cube64(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename integer, intent(in) :: naxes(3) real(kind=real64),intent(in) :: image(naxes(1),naxes(2),naxes(3)) character(len=80), intent(in), optional :: hdr(:) integer, intent(out) :: ierr real(kind=real32), allocatable :: img32(:,:,:) img32 = real(image,kind=real32) ! copy and allocate if (present(hdr)) then call write_fits_cube(filename,img32,naxes,ierr,hdr) else call write_fits_cube(filename,img32,naxes,ierr) endif deallocate(img32,stat=ierr) end subroutine write_fits_cube64 !------------------------------------------------------------- ! read fits file and convert to double precision !------------------------------------------------------------- subroutine read_fits_image64(filename,image,naxes,ierr,hdr) character(len=*), intent(in) :: filename real(kind=real64), intent(out), allocatable :: image(:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) integer, intent(out) :: naxes(2),ierr real(kind=real32), allocatable :: img32(:,:) if (present(hdr)) then call read_fits_image(filename,img32,naxes,ierr,hdr) else call read_fits_image(filename,img32,naxes,ierr) endif image = img32 ! allocate and copy, converting real type deallocate(img32,stat=ierr) end subroutine read_fits_image64 !------------------------------------------------------------- ! read fits cube and convert to double precision !------------------------------------------------------------- subroutine read_fits_cube64(filename,image,naxes,ierr,hdr,velocity) character(len=*), intent(in) :: filename real(kind=real64), intent(out), allocatable :: image(:,:,:) character(len=80), intent(inout), allocatable, optional :: hdr(:) real(kind=real64), intent(inout), allocatable, optional :: velocity(:) integer, intent(out) :: naxes(4),ierr real(kind=real32), allocatable :: img32(:,:,:),velocity32(:) if (present(hdr)) then if (present(velocity)) then call read_fits_cube(filename,img32,naxes,ierr,hdr=hdr,velocity=velocity32) velocity = velocity32 ! allocate and copy, converting real type else call read_fits_cube(filename,img32,naxes,ierr,hdr) endif else call read_fits_cube(filename,img32,naxes,ierr) endif image = img32 ! allocate and copy, converting real type deallocate(img32,stat=ierr) if (allocated(velocity32)) deallocate(velocity32,stat=ierr) end subroutine read_fits_cube64 !-------------------------------------------------- ! read all floating point variables from fits header !-------------------------------------------------- subroutine get_floats_from_fits_header(hdr,tags,vals) character(len=80), intent(in) :: hdr(:) character(len=*), intent(out) :: tags(:) real, intent(out) :: vals(:) integer :: i, n, ierr n = 0 do i=1,size(hdr) n = n + 1 if (n <= size(tags) .and. n <= size(vals)) then call get_fits_header_entry(hdr(i),tags(n),vals(n),ierr) endif if (ierr /= 0) n = n - 1 enddo end subroutine get_floats_from_fits_header !------------------------------------------------ ! get tag:val pairs from fits header record ! will extract anything readable as a floating ! point number !------------------------------------------------ subroutine get_fits_header_entry(record,key,rval,ierr) character(len=80), intent(in) :: record character(len=*), intent(out) :: key real, intent(out) :: rval integer, intent(out) :: ierr character(len=80) :: val call get_fits_header_key_val(record,key,val,ierr) if (ierr == 0) then read(val,*,iostat=ierr) rval endif end subroutine get_fits_header_entry !------------------------------------------------ ! get tag:val pairs from fits header record ! returns the string value !------------------------------------------------ subroutine get_fits_header_key_val(record,key,val,ierr) character(len=80), intent(in) :: record character(len=*), intent(out) :: key character(len=*), intent(out) :: val integer, intent(out) :: ierr integer :: ieq key = '' val = '' ierr = -1 ! split on equals sign ieq = index(record,'=') if (ieq > 0) then key = record(1:ieq-1) val = record(ieq+1:) ierr = 0 endif end subroutine get_fits_header_key_val !------------------------------------------------ ! search fits header to find a particular variable ! e.g. bmaj = get_from_header('BMAJ',hdr,ierr) !------------------------------------------------ function get_from_header(key,hdr,ierr) result(val) character(len=*), intent(in) :: key character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr character(len=len(key)) :: mykey real :: val,myval integer :: i val = 0. ierr = -1 do i=1,size(hdr) call get_fits_header_entry(hdr(i),mykey,myval,ierr) if (trim(adjustl(mykey))==trim(key) .and. ierr==0) then val = myval ierr = 0 return endif enddo end function get_from_header !------------------------------------------------ ! search fits header to find a particular string ! e.g. bmaj = get_from_header('BMAJ',hdr,ierr) !------------------------------------------------ function get_from_header_s(key,hdr,ierr) result(val) character(len=*), intent(in) :: key character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr character(len=len(key)) :: mykey character(len=80) :: val,myval integer :: i,i1,i2,islash val = '' ierr = -1 do i=1,size(hdr) call get_fits_header_key_val(hdr(i),mykey,myval,ierr) if (trim(adjustl(mykey))==trim(key) .and. ierr==0) then i1 = index(myval,"'") islash = index(myval,"/") if (islash == 0) islash = len_trim(myval) i2 = index(myval(1:islash),"'",back=.true.) if (i1 > 0) then val = myval(i1+1:i2-1) ! trim quotation marks else val = myval ! not a string variable, return whole string endif ierr = 0 return endif enddo end function get_from_header_s !------------------------------------------------ ! delete third dimension in the fits header !------------------------------------------------ subroutine flatten_header(hdr) character(len=80), intent(inout) :: hdr(:) character(len=80) :: mykey,myval integer :: i,ierr do i=1,size(hdr) call get_fits_header_key_val(hdr(i),mykey,myval,ierr) ! delete anything in the header that ends in '3' if (len_trim(mykey) > 0) then if (mykey(len_trim(mykey):len_trim(mykey))=='3') then !print*,' deleting ',hdr(i) hdr(i) = '' endif endif enddo end subroutine flatten_header !------------------------------------------------ ! get velocity grid from the fits file !------------------------------------------------ subroutine get_velocity_from_fits_header(nv,vel,hdr,ierr) integer, intent(in) :: nv real(kind=real32), intent(out) :: vel(nv) character(len=80), intent(in) :: hdr(:) integer, intent(out) :: ierr integer :: k real :: dv,restfreq,crpix,crval,nu character(len=80) :: velocity_type real, parameter :: c = 2.997924e5 dv = get_from_header('CDELT3',hdr,ierr) restfreq = get_from_header('RESTFRQ',hdr,ierr) velocity_type = get_from_header_s('CTYPE3',hdr,ierr) select case (trim(velocity_type)) case("VELO-LSR","VRAD") if (dv > 10.) then dv = dv*1e-3 ! assume m/s endif crpix = get_from_header('CRPIX3',hdr,ierr) crval = get_from_header('CRVAL3',hdr,ierr) do k=1,nv vel(k) = real(crval + dv * (k - crpix),kind=real32) enddo case("FREQ") crpix = get_from_header('CRPIX3',hdr,ierr) crval = get_from_header('CRVAL3',hdr,ierr) do k=1,nv nu = crval + dv*(k - crpix) vel(k) = real(-(nu - restfreq)/restfreq * c,kind=real32) ! c is in km/s enddo case default write(*,"(1x,a)") 'warning: velocity type '//trim(velocity_type)//' not recognised in fits header' dv = 1. do k=1,nv vel(k) = real(dv * (k - 0.5),kind=real32) enddo end select end subroutine get_velocity_from_fits_header end module readwrite_fits danieljprice-splash-4d1f09c/src/write_griddata.F90000066400000000000000000000471261477365367100221440ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2019 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! Module implementing "splash to grid" operation, writing ! 3D gridded data in various output formats !----------------------------------------------------------------- module readwrite_griddata implicit none integer, parameter :: doub_prec = kind(0.d0) public :: isgridformat,print_gridformats public :: open_gridfile_w,open_gridfile_r public :: write_grid,read_gridcolumn,write_gridlimits ! !--generic interface for reading grid column data ! into 1D and 3D arrays ! interface read_gridcolumn module procedure read_gridcolumn3D,read_gridcolumn1D end interface read_gridcolumn private contains !----------------------------------------------------------------- ! utility to check if a format selection is valid !----------------------------------------------------------------- logical function isgridformat(string) use asciiutils, only:lcase character(len=*), intent(in) :: string isgridformat = .false. select case(trim(lcase(string))) case('grid') isgridformat = .true. case('gridascii') isgridformat = .true. case('gridbinary','gridbin') isgridformat = .true. case('gridbytestream','gridstream','gridbinary2','gridbenoit') isgridformat = .true. case('gridascii2') isgridformat = .true. end select end function isgridformat !----------------------------------------------------------------- ! print grid limits !----------------------------------------------------------------- subroutine write_gridlimits(ndim,xmin,xmax,labelx) integer, intent(in) :: ndim real, intent(in) :: xmin(ndim),xmax(ndim) character(len=*), intent(in) :: labelx(ndim) integer :: i print "(a)",' grid dimensions (edit .limits file to change):' do i=1,ndim if (maxval(abs(xmax)) < 1.e7) then print "(1x,a,': ',f14.6,' -> ',f14.6)",trim(labelx(i)),xmin(i),xmax(i) else print "(1x,a,': ',es14.6,' -> ',es14.6)",trim(labelx(i)),xmin(i),xmax(i) endif enddo end subroutine write_gridlimits !----------------------------------------------------------------- ! print usage if format selection not valid !----------------------------------------------------------------- subroutine print_gridformats(string) character(len=*), intent(in) :: string if (trim(string)=='short') then print "(/,a)",'Grid conversion mode: ' print "(a)",' splash to grid : interpolate to grid; type "splash to" for details' else print "(/,a)",' Grid conversion mode ("splash to X dumpfiles"): ' print "(a)",' splash to grid : interpolate basic SPH data (density, plus velocity if present in data)' print "(a)",' to 2D or 3D grid, write grid data to file (using default output=ascii)' print "(a)",' to gridascii : as above, grid data written in ascii format' print "(a)",' to gridascii2 : grid data written in ascii format, all in one file' print "(a)",' to gridbinary : as above, grid data in simple unformatted binary format:' print "(a)",' write(unit) nx,ny,nz,ncolumns,time,xmin,xmax,ymin,ymax,zmin,zmax [ 4x4,7x8 bytes ]' print "(a)",' write(unit) (((rho(i,j,k),i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ]' print "(a)",' write(unit) (((vx(i,j,k), i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ]' print "(a)",' write(unit) (((vy(i,j,k), i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ]' print "(a)",' write(unit) (((...(i,j,k),i=1,nx),j=1,ny),k=1,nz) [ 8 bytes each ]' print "(a)",' to gridstream : grid data in byte-stream binary format (e.g. for python):' print "(a)",' nx,ny,nz,ncolumns,time,xmin,xmax,ymin,ymax,zmin,zmax,rho [ 4,4,4,4,8*7,8*nx*ny*nz ]' print "(a)",' allto grid : as above, interpolating *all* columns to the grid (and output file)' print "(a)",' allto gridascii : as above, with ascii output' print "(a)",' allto gridbinary : as above, with binary output' endif return end subroutine print_gridformats !------------------------------------------------------ ! open grid file for (write) output, write header !------------------------------------------------------ subroutine open_gridfile_w(iunit,filenamein,outformat,ndim,ncolumns,npixels,xmin,xmax,time,ierr) use asciiutils, only:lcase integer, intent(in) :: iunit character(len=*), intent(in) :: filenamein,outformat character(len=len(filenamein)+10) :: filename integer, intent(in) :: ndim,ncolumns integer, dimension(ndim), intent(in) :: npixels real(doub_prec), intent(in) :: xmin(ndim),xmax(ndim) real(doub_prec), intent(in) :: time integer, intent(out) :: ierr integer :: idim ! !--Only have to do something here for formats ! that have all columns in the same file ! ierr = 0 select case(trim(lcase(outformat))) case('gridascii','grid') ! !--ascii output uses individual files ! print "(/,a,i2)",'-----> WRITING TO ASCII OUTPUT FILES' case('gridbinary','gridbin') ! !--simple unformatted binary format ! filename = trim(filenamein)//'.grid' print "(/,a,i2,a)",'----> WRITING TO '//trim(filename)//' on unit ',iunit,' (unformatted binary)' open(unit=iunit,file=trim(filename),form='unformatted',status='replace',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename)//' for output' return endif write(iunit,iostat=ierr) npixels(1:ndim),ncolumns,time,(xmin(idim),xmax(idim),idim=1,ndim) if (ierr /= 0) then print "(a)",' ERROR writing header to file' return endif case('gridbytestream','gridstream','gridbinary2','gridbenoit') ! !--byte stream binary format ! filename = trim(filenamein)//'.gridstream' print "(/,a,i2,a)",'----> WRITING TO '//trim(filename)//' on unit ',iunit,' (unformatted binary stream)' open(unit=iunit,file=trim(filename),form='unformatted',status='replace',access='stream',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename)//' for output' return endif write(iunit,iostat=ierr) npixels(1:ndim),ncolumns,time,(xmin(idim),xmax(idim),idim=1,ndim) if (ierr /= 0) then print "(a)",' ERROR writing header to file' return endif case('gridascii2') print "(/,a,i2)",'-----> WRITING TO ASCII OUTPUT FILES (WITH X, Y, Z, COL)' case('hdf5') case default ! return error if bad format print "(a)",' ERROR: unknown output format '''//trim(outformat)//''' in open_gridfile' ierr = 1 return end select end subroutine open_gridfile_w !------------------------------------------------------ ! open grid file for reading, read header !------------------------------------------------------ subroutine open_gridfile_r(iunit,filename,informat,ndim,ncolumns,npixels,time,ierr) use asciiutils, only:lcase integer, intent(in) :: iunit,ndim character(len=*), intent(in) :: filename character(len=*), intent(in) :: informat integer, intent(out) :: ncolumns integer, dimension(ndim), intent(out) :: npixels real(doub_prec), intent(out) :: time integer, intent(out) :: ierr ! !--read only implemented for binary grid format at present ! ierr = 0 select case(trim(lcase(informat))) case('gridbinary','gridbin') ! !--simple unformatted binary format ! print "(/,a,i2,a)",'----> READING '//trim(filename)//' on unit ',iunit,' (unformatted binary)' open(unit=iunit,file=trim(filename),form='unformatted',status='old',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename)//' for read' return endif read(iunit,iostat=ierr) npixels(1:ndim),ncolumns,time if (ierr /= 0) then print "(a)",' ERROR reading header' return endif case('gridbytestream','gridstream','gridbinary2','gridbenoit') print "(/,a,i2,a)",'----> READING '//trim(filename)//' on unit ',iunit,' (unformatted bytestream)' open(unit=iunit,file=trim(filename),form='unformatted',status='old',access='stream',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR opening '//trim(filename)//' for reading' return endif read(iunit,iostat=ierr) npixels(1:ndim),ncolumns,time if (ierr /= 0) then print "(a)",' ERROR reading header' return endif case default ! return error if bad format print "(a)",' ERROR: cannot read grid format '''//trim(informat)//''' in open_gridfile_r' ierr = 1 return end select end subroutine open_gridfile_r !------------------------------------------------------ ! write a particular column to the grid output file !------------------------------------------------------ subroutine write_grid(iunit,filenamein,outformat,ndim,ncolgrid,npixels,label,& labelcoordsys,xlab,time,pixwidth,xmin,xmax,ierr,dat,dat3D,dat2D,label3D,tagline,origin) use asciiutils, only:ucase,lcase,safename integer, intent(in) :: iunit character(len=*), intent(in) :: filenamein,outformat integer, intent(in) :: ndim,ncolgrid integer, dimension(ndim), intent(in) :: npixels character(len=*), intent(in) :: label,labelcoordsys character(len=*), dimension(3), intent(in) :: xlab real(doub_prec), intent(in) :: time real, dimension(3), intent(in) :: xmin,xmax,pixwidth integer, intent(out) :: ierr character(len=len(filenamein)+20) :: filename real(doub_prec), dimension(:,:,:), intent(in), optional :: dat real(doub_prec), dimension(:,:,:,:), intent(in), optional :: dat3D real, dimension(:,:), intent(in), optional :: dat2D character(len=*), intent(in), optional :: label3D(ncolgrid),tagline,origin integer :: i,j,k,n,idim real :: xi,yi,zi ierr = 0 if (ndim==3 .and. .not.(present(dat3D) .or. present(dat))) then print "(a)",' ERROR in call to write_grid: ndim=3 but 3D grid not passed' ierr = 1 elseif (ndim==2 .and. .not.present(dat2D)) then print "(a)",' ERROR in call to write_grid: ndim=2 but 2D grid not passed' ierr = 1 elseif (.not.(ndim==2 .or. ndim==3)) then print "(a,i2,a)",' ERROR in call to write_grid: cannot write grid for ',ndim,' dimensions' ierr = 2 endif if (ierr /= 0) return select case(trim(lcase(outformat))) case('gridascii','grid') if (ncolgrid > 1) then filename = trim(filenamein)//'_grid.dat' else filename = trim(filenamein)//'_'//trim(safename(label))//'_grid.dat' endif print "(/,a)",'-----> WRITING to '//trim(filename) ! !--open ascii file ! open(unit=iunit,file=trim(filename),form='formatted',status='replace',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR OPENING FILE FOR WRITING' return endif if (present(tagline)) then write(iunit,"(a)",err=100) '# '//trim(tagline) else write(iunit,"(a)",err=100) '# gridded data file' endif if (present(origin)) then write(iunit,"(a)",err=100) & '# '//trim(filename)//' produced using '//trim(origin) else write(iunit,"(a)",err=100) '# '//trim(filename) endif write(iunit,"(a)",err=100) '#' write(iunit,"(a)",err=100) '# time:' write(iunit,"(a,es15.7)",iostat=ierr) '# ',time write(iunit,"(a)",err=100) '#' write(iunit,"(a,5(a,','),a,':')",err=100) & '# ',(trim(xlab(idim))//'min',trim(xlab(idim))//'max',idim=1,ndim) write(iunit,"(a,6(es15.7,1x))",iostat=ierr) '# ',(xmin(idim),xmax(idim),idim=1,ndim) write(iunit,"(a)",err=100) '#' write(iunit,"(a)",err=100) '# file contains:' write(iunit,"(a,i1,a)",err=100) '# '//trim(label)//' interpolated to ',ndim,'D '//trim(labelcoordsys)//' grid ' write(iunit,"(a)",err=100) '#' write(iunit,"(a)",err=100) '# written in the form: ' if (ndim==3) then write(iunit,"(a)",err=100) '# do k=1,n'//trim(xlab(3)) write(iunit,"(a)",err=100) '# do j=1,n'//trim(xlab(2)) write(iunit,"(a)",err=100) '# write(*,*) (dat(i,j,k),i=1,n'//trim(xlab(1))//')' write(iunit,"(a)",err=100) '# enddo' write(iunit,"(a)",err=100) '# enddo' else write(iunit,"(a)",err=100) '# do j=1,ny' write(iunit,"(a)",err=100) '# write(*,*) (dat(i,j),i=1,nx)' write(iunit,"(a)",err=100) '# enddo' endif write(iunit,"(a)",err=100) '#' write(iunit,"(a)",err=100) '# grid dimensions:' if (present(dat)) then write(iunit,"(a,3(a,3x))",err=100) '# ',('n'//trim(xlab(i)),i=1,3) write(iunit,*,err=100) npixels(1:ndim) do k=1,npixels(3) do j=1,npixels(2) write(iunit,"(2048(es14.6,1x))",err=100) (dat(i,j,k),i=1,npixels(1)) enddo enddo elseif (present(dat3D)) then write(iunit,"(a,3(a,3x))",err=100) '# ',('n'//trim(xlab(i)),i=1,3) write(iunit,*,err=100) npixels(1:ndim) do k=1,npixels(3) do j=1,npixels(2) write(iunit,"(2048(es14.6,1x))",err=100) (dat3D(1,i,j,k),i=1,npixels(1)) enddo enddo elseif (present(dat2D)) then write(iunit,"(a)",err=100) '# nx ny' write(iunit,*,err=100) npixels(1:ndim) do j=1,npixels(2) write(iunit,"(2048(es14.6,1x))",err=100) (dat2D(i,j),i=1,npixels(1)) enddo endif close(unit=iunit) return case('gridbinary','gridbin','gridbytestream','gridstream','gridbinary2','gridbenoit') print "(a)",'-----> WRITING '//trim(ucase(label)) if (present(dat)) then write(iunit,iostat=ierr) ((dat(1:npixels(1),j,k),j=1,npixels(2)),k=1,npixels(3)) elseif (present(dat3D)) then write(iunit,iostat=ierr) ((((dat3D(n,i,j,k),i=1,npixels(1)),j=1,npixels(2)),k=1,npixels(3)),n=1,ncolgrid) elseif (present(dat2D)) then write(iunit,iostat=ierr) ((dat2D(i,j),i=1,npixels(1)),j=1,npixels(2)) endif case('gridascii2') if (ncolgrid > 1) then filename = trim(filenamein)//'_grid.dat' print "(a)",'-----> WRITING to '//trim(filename) else filename = trim(filenamein)//'_'//trim(safename(label))//'_grid.dat' print "(a)",'-----> WRITING '//trim(ucase(label))//' to '//trim(filename) endif ! !--open ascii file ! open(unit=iunit,file=trim(filename),form='formatted',status='replace',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR OPENING FILE FOR WRITING' return endif write(iunit,"(a)",err=100) '# '//trim(tagline) write(iunit,"(a)",err=100) & '# '//trim(filename)//' produced using "splash to '//trim(outformat)// & '" on file '//trim(filenamein) write(iunit,"(a)",err=100) '#' write(iunit,"(a)",err=100) '# time:' write(iunit,"(a,es15.7)",iostat=ierr) '# ',time write(iunit,"(a)",err=100) '#' write(iunit,"(a)",err=100) '# grid dimensions:' if (present(dat3D) .and. present(dat)) then write(iunit,"(a,3(a,3x))",err=100) '# ',('n'//trim(xlab(i)),i=1,3) write(iunit,"(a,3(i5,1x))",err=100) '# ',npixels(1:3) write(iunit,"('#',64('[',a13,']'))",err=100) xlab,trim(label),(trim(label3D(n)),n=1,ncolgrid) do k=1,npixels(3) write(*,"('.')",ADVANCE='NO') zi = xmin(3) + (k-0.5)*pixwidth(3) do j=1,npixels(2) yi = xmin(2) + (j-0.5)*pixwidth(2) do i=1,npixels(1) xi = xmin(1) + (i-0.5)*pixwidth(1) write(iunit,"(64(es14.6,1x))") xi,yi,zi,dat(i,j,k),(dat3D(n,i,j,k),n=1,ncolgrid) enddo enddo enddo elseif (present(dat3D)) then write(iunit,"(a,3(a,3x))",err=100) '# ',('n'//trim(xlab(i)),i=1,3) write(iunit,"(a,3(i5,1x))",err=100) '# ',npixels(1:3) write(iunit,"('#',64('[',a13,']'))",err=100) xlab,(trim(label3D(n)),n=1,ncolgrid) do k=1,npixels(3) write(*,"('.')",ADVANCE='NO') zi = xmin(3) + (k-0.5)*pixwidth(3) do j=1,npixels(2) yi = xmin(2) + (j-0.5)*pixwidth(2) do i=1,npixels(1) xi = xmin(1) + (i-0.5)*pixwidth(1) write(iunit,"(64(es14.6,1x))") xi,yi,zi,(dat3D(n,i,j,k),n=1,ncolgrid) enddo enddo enddo elseif (present(dat)) then write(iunit,"(a,3(a,3x))",err=100) '# ',('n'//trim(xlab(i)),i=1,3) write(iunit,"(a,3(i5,1x))",err=100) '# ',npixels(1:3) write(iunit,"('#',4('[',a13,']'))",err=100) xlab,trim(label) do k=1,npixels(3) write(*,"('.')",ADVANCE='NO') zi = xmin(3) + (k-0.5)*pixwidth(3) do j=1,npixels(2) yi = xmin(2) + (j-0.5)*pixwidth(2) do i=1,npixels(1) xi = xmin(1) + (i-0.5)*pixwidth(1) write(iunit,"(64(es14.6,1x))") xi,yi,zi,dat(i,j,k) enddo enddo enddo elseif (present(dat2D)) then write(iunit,"(a)",err=100) '# nx ny ' write(iunit,"(a,2(i5,1x))",err=100) '# ',npixels(1:2) write(iunit,"('#',3('[',a13,']'))",err=100) 'x','y',trim(label) do j=1,npixels(2) write(*,"('.')",ADVANCE='NO') yi = xmin(2) + (j-0.5)*pixwidth(2) do i=1,npixels(1) xi = xmin(1) + (i-0.5)*pixwidth(1) write(iunit,"(3(es14.6,1x))") xi,yi,dat2D(i,j) enddo enddo endif write(*,*) case('hdf5') case default print "(a)",' ERROR: unknown output format '''//trim(outformat)//''' in write_grid' return end select return ! !--error handling during write ! 100 continue print "(a)",' ERROR writing grid file' close(unit=iunit) return end subroutine write_grid !------------------------------------------------------------------ ! read a particular column from the grid output file into 3D array !------------------------------------------------------------------ subroutine read_gridcolumn3D(iunit,dat,npixels,ierr) integer, intent(in) :: iunit real(doub_prec), intent(out) :: dat(:,:,:) integer, dimension(3), intent(in) :: npixels integer, intent(out) :: ierr integer :: i,j,k print "(a,i4,'x',i4,'x',i4,a)",'-----> READING ',npixels(:),' data points' read(iunit,iostat=ierr) (((dat(i,j,k),i=1,npixels(1)),j=1,npixels(2)),k=1,npixels(3)) end subroutine read_gridcolumn3D !------------------------------------------------------------------ ! read a particular column from the grid output file into 1D array !------------------------------------------------------------------ subroutine read_gridcolumn1D(iunit,dat,ngrid,ierr) integer, intent(in) :: iunit real(doub_prec), intent(out) :: dat(:) integer, intent(in) :: ngrid integer, intent(out) :: ierr integer :: i print "(a,i10,a)",'-----> READING ',ngrid,' data points' read(iunit,iostat=ierr) (dat(i),i=1,ngrid) end subroutine read_gridcolumn1D end module readwrite_griddata danieljprice-splash-4d1f09c/src/write_pfm.f90000066400000000000000000000063201477365367100211760ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2020 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- ! ! module containing routines to read/write images in .pfm format ! Info below taken from: http://www.pauldebevec.com/Research/HDR/PFM/ ! ! The Portable FloatMap format was designed as a floating-point image format. ! The format begins with three lines of text specifying the image size and type, ! and then continues with raw binary image data for the rest of the file. ! The text header of a .pfm file takes the following form: ! [type] ! [xres] [yres] ! [byte_order] ! ! Each of the three lines of text ends with a 1-byte Unix-style carriage return. ! "[type]" is one of "PF" for a 3-channel RGB color image, or "Pf" for a monochrome single-channel image. ! "[xres] [yres]" indicates the x and y resolutions of the image. ! "[byte_order]" is a number used to indicate the byte order within the file. ! A positive number (e.g. "1.0") indicates big-endian, with the most significant byte of each 4-byte float first. ! If the number is negative (e.g. "-1.0") this indicates little-endian, with the least significant byte first. There are no comments in these files. For example: ! ! PF ! 768 512 ! -1.0 ! Indicates an RGB color image, 768 by 512 pixels, with little-endian byte order. ! After the final carriage return the file proceeds with a series of three 4-byte IEEE 754 single ! precision floating point numbers for each pixel, specified in left to right, bottom to top order. ! !----------------------------------------------------------------- module write_pfm implicit none contains subroutine write_pixmap_pfm(filename,nx,ny,datpix,ierr) use iso_c_binding, only:c_float character(len=*), intent(in) :: filename integer, intent(in) :: nx,ny real(c_float), intent(in) :: datpix(nx,ny) integer, intent(out) :: ierr integer :: iunit logical :: bigendian bigendian = IACHAR(TRANSFER(1,"a")) == 0 ! write formatted header open(newunit=iunit,file=filename,action='write',status='replace',iostat=ierr) if (ierr /= 0) return write(iunit,"(a)",iostat=ierr) 'Pf' write(iunit,*,iostat=ierr) nx,ny if (bigendian) then write(iunit,*,iostat=ierr) 1.0 else write(iunit,*,iostat=ierr) -1.0 endif close(iunit) ! write unformatted data open(newunit=iunit,file=filename,action='write',status='old',position='append',form='unformatted',iostat=ierr) write(iunit) datpix(1:nx,1:ny) close(iunit) end subroutine write_pixmap_pfm end module write_pfmdanieljprice-splash-4d1f09c/src/write_pixmap.f90000066400000000000000000000402011477365367100217060ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2013 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! module containing output routines for writing pixel map ! to output file in various formats ! ! (c) D. Price 21/09/07 ! Added read routines June 2009 !----------------------------------------------------------------- module write_pixmap use filenames, only:fileprefix,tagline implicit none logical, public :: iwritepixmap = .false. logical, public :: ireadpixmap = .false. character(len=5), public :: pixmapformat = ' ' character(len=5), public :: readpixformat = ' ' public :: writepixmap,write_pixmap_ppm,write_pixmap_ascii public :: isinputformat,isoutputformat public :: readpixmap private contains !----------------------------------------------------------------- ! utility to check if an output format selection is valid !----------------------------------------------------------------- logical function isoutputformat(string) character(len=*), intent(in) :: string isoutputformat = .false. select case(trim(string)) case('ascii','ppm','pfm') isoutputformat = .true. end select if (.not.isoutputformat) then print "(a)",' possible formats for -o option: ' print "(a)",' -o ppm : dump pixel map to portable pixel map file' print "(a)",' -o pfm : dump pixel map to portable float map file' print "(a)",' -o ascii : dump pixel map to ascii file' print "(a)",' use -p to change the prefix for the filenames' endif return end function isoutputformat !----------------------------------------------------------------- ! utility to check if an input format selection is valid !----------------------------------------------------------------- logical function isinputformat(string) character(len=*), intent(in) :: string isinputformat = .false. select case(trim(string)) case('ascii','ftn','ftn512','chf') isinputformat = .true. end select if (.not.isinputformat) then print "(a)",' possible formats for -readpix option: ' print "(a)",' -readpix ascii : read pixel maps from ascii file' print "(a)",' -readpix ftn : read pixel maps from unformatted fortran file "read(1) dat(:,:)"' print "(a)",' -readpix ftn512 : read pixel maps from unformatted fortran file "read(1) dat(1:512,1:512)"' endif return end function isinputformat !----------------------------------------------------------------- ! wrapper routine for all output formats !----------------------------------------------------------------- subroutine writepixmap(datpix,npixx,npixy,xmin,ymin,dx,datmin,datmax,label,labu,istep,xsec,dumpfile,time) use write_pfm, only:write_pixmap_pfm use iso_c_binding, only:c_float use labels, only:shortlabel integer, intent(in) :: npixx,npixy real, intent(in), dimension(npixx,npixy) :: datpix real, intent(in) :: xmin,ymin,dx,datmin,datmax,time logical, intent(in) :: xsec character(len=*), intent(in) :: label,labu,dumpfile integer, intent(in) :: istep character(len=len(dumpfile)+10) :: filename real(c_float), allocatable :: dattmp(:,:) integer :: ierr select case(trim(pixmapformat)) case('ascii') call get_pixmap_filename(filename,dumpfile,shortlabel(label,labu),'.pix',xsec) call write_pixmap_ascii(datpix,npixx,npixy,xmin,ymin,dx,datmin,datmax,label,filename,time) case('ppm') call write_pixmap_ppm(datpix,npixx,npixy,xmin,ymin,dx,datmin,datmax,label,istep) case('pfm') call get_pixmap_filename(filename,dumpfile,shortlabel(label,labu),'.pfm',xsec) write(*,"(a)") '> writing pixel map to file '//trim(filename)//' ...' ! convert to single precision allocate(dattmp(npixx,npixy)) dattmp = real(datpix,kind=c_float) call write_pixmap_pfm(filename,npixx,npixy,dattmp,ierr) deallocate(dattmp) if (ierr /= 0) print "(a)",' ERROR writing '//trim(filename) ! case('fits') ! call write_pixmap_fits(datpix,npixx,npixy,xmin,ymin,dx,datmin,datmax,label) case default print "(a)",' ERROR: invalid output format for pixel map ' end select end subroutine writepixmap !----------------------------------------------------------------- ! output pixmap as an ascii file !----------------------------------------------------------------- subroutine write_pixmap_ascii(datpix,npixx,npixy,xmin,ymin,dx,datmin,datmax,label,filename,time) integer, intent(in) :: npixx,npixy real, intent(in), dimension(npixx,npixy) :: datpix real, intent(in) :: xmin,ymin,dx,datmin,datmax,time character(len=*), intent(in) :: label,filename character(len=10) :: stringx,stringy character(len=30) :: fmtstring integer :: ierr,j integer, parameter :: iunit = 166 ! !--write ascii file ! open(unit=iunit,file=filename,status='replace',form='formatted',iostat=ierr) if (ierr /=0) then print*,'error opening '//trim(filename) return endif write(*,"(a)",ADVANCE='NO') '> writing pixel map to file '//trim(filename)//' ...' write(stringx,"(i10)") npixx write(stringy,"(i10)") npixy write(iunit,"(a)",err=66) '# '//trim(adjustl(filename))//' created by '//trim(tagline) write(iunit,"(a)",err=66) '# Contains 2D pixel array '//trim(adjustl(stringx))//' x '//trim(adjustl(stringy))//' written as ' write(iunit,"(a)",err=66) '# do j=1,'//trim(adjustl(stringy)) write(iunit,"(a)",err=66) '# write(*,*) dat(1:'//trim(adjustl(stringx))//',j)' write(iunit,"(a)",err=66) '# enddo' write(iunit,"(a,1pe14.6,a,1pe14.6)",err=66) '# '//trim(label)//': min = ',datmin,' max = ',datmax write(iunit,"(a,1pe14.6,a,1pe14.6)",err=66) '# x axis: min = ',xmin,' max = ',xmin+(npixx-1)*dx write(iunit,"(a,1pe14.6,a,1pe14.6)",err=66) '# y axis: min = ',ymin,' max = ',ymin+(npixy-1)*dx write(iunit,"(a,1pe14.6)", err=66) '# time = ',time write(iunit,"(a)",err=66) '# '//trim(adjustl(stringx))//' '//trim(adjustl(stringy)) write(fmtstring,"(a,i6,a)",iostat=ierr) '(',npixx,'(1pe14.6))' if (ierr /= 0) then do j=1,npixy write(iunit,*,err=66) datpix(1:npixx,j) enddo else do j=1,npixy write(iunit,fmtstring,err=66) datpix(1:npixx,j) enddo endif close(iunit) print "(a)",'OK' return 66 continue print "(a)",' ERROR during write ' close(iunit) return end subroutine write_pixmap_ascii !----------------------------------------------------------------- ! output pixmap as a raw .ppm file !----------------------------------------------------------------- subroutine write_pixmap_ppm(datpix,npixx,npixy,xmin,ymin,dx,datmin,datmax,label,istep,brightness) use colours, only:rgbtable,ncolours integer, intent(in) :: npixx,npixy real, intent(in), dimension(npixx,npixy) :: datpix real, intent(in), dimension(npixx,npixy), optional :: brightness real, intent(in) :: xmin,ymin,dx,datmin,datmax character(len=*), intent(in) :: label integer, intent(in) :: istep character(len=120) :: filename real, dimension(3) :: rgbi,drgb real :: dati,ddatrange,datfraci,ftable integer :: ipix,jpix,ir,ib,ig,ierr,maxcolour,indexi integer, parameter :: iunit = 167 ! !--check for errors ! if (abs(datmax-datmin) > tiny(datmin)) then ddatrange = 1./abs(datmax-datmin) else print "(a)",'error: datmin=datmax : pointless writing ppm file' return endif ! !--write PPM-- ! write(filename,"(a,i5.5,a)") trim(fileprefix)//'_',istep,'.ppm' open(unit=iunit,file=filename,status='replace',form='formatted',iostat=ierr) if (ierr /=0) then print*,'error opening ppm file' return endif write(*,"(a)",ADVANCE='NO') '> writing pixel map to file '//trim(filename)//' ...' ! !--PPM header ! maxcolour = 255 write(iunit,"(a)",err=66) 'P3' write(iunit,"(a)",err=66) '# '//trim(adjustl(filename))//' created by '//trim(tagline) write(iunit,"(a,1pe14.6,a,1pe14.6)",err=66) '# '//trim(label)//': min = ',datmin,' max = ',datmax write(iunit,"(a,1pe14.6,a,1pe14.6)",err=66) '# x axis: min = ',xmin,' max = ',xmin+(npixx-1)*dx write(iunit,"(a,1pe14.6,a,1pe14.6)",err=66) '# y axis: min = ',ymin,' max = ',ymin+(npixy-1)*dx write(iunit,"(i4,1x,i4)",err=66) npixx, npixy write(iunit,"(i3)",err=66) maxcolour !--pixel information do jpix = npixy,1,-1 do ipix = 1,npixx dati = datpix(ipix,jpix) datfraci = (dati - datmin)*ddatrange datfraci = max(datfraci,0.) datfraci = min(datfraci,1.) !--define colour for current particle ftable = datfraci*ncolours indexi = int(ftable) + 1 indexi = min(indexi,ncolours) if (indexi < ncolours) then !--do linear interpolation from colour table drgb(:) = rgbtable(:,indexi+1) - rgbtable(:,indexi) rgbi(:) = rgbtable(:,indexi) + (ftable - int(ftable))*drgb(:) else rgbi(:) = rgbtable(:,indexi) endif if (present(brightness)) then rgbi(:) = rgbi(:)*min(brightness(ipix,jpix),1.0) endif ir = max(min(int(rgbi(1)*maxcolour),maxcolour),0) ig = max(min(int(rgbi(2)*maxcolour),maxcolour),0) ib = max(min(int(rgbi(3)*maxcolour),maxcolour),0) write(iunit,"(i3,1x,i3,1x,i3,2x)",err=66) ir,ig,ib enddo enddo close(unit=iunit) print "(a)",'OK' return 66 continue print "(a)",' ERROR during write ' close(iunit) return end subroutine write_pixmap_ppm !----------------------------------------------------------------- ! read in pixels from file !----------------------------------------------------------------- subroutine readpixmap(datpix,npixx,npixy,dumpfile,label,istep,xsec,ierr) use asciiutils, only:get_nheaderlines real, intent(out), dimension(:,:), allocatable :: datpix integer, intent(out) :: npixx,npixy,ierr character(len=*), intent(in) :: dumpfile character(len=*), intent(in) :: label integer, intent(in) :: istep logical, intent(in) :: xsec integer :: i,j,nheader,nerr integer, parameter :: iunit = 168 character(len=128) :: filename character(len=2) :: char logical :: iexist ierr = 0 select case(trim(adjustl(readpixformat))) case('ascii') ! splash pixmap output files call check_for_pixmap_files(filename,dumpfile,label,'.pix',istep,xsec,iexist) if (.not.iexist) then print "('*',a,'*',/,72('*'))",' Create a file with one of these names (or a soft link) and try again ' ierr = 1 return endif open(unit=iunit,file=filename,status='old',form='formatted',iostat=ierr) if (ierr /=0) then print*,'error opening '//trim(filename) return else npixx = 0 npixy = 0 nheader = get_nheaderlines(iunit) rewind(iunit) do i=1,nheader-1 read(iunit,*,iostat=ierr) enddo read(iunit,*,iostat=ierr) char,npixx,npixy if (ierr /= 0 .or. npixx <= 0 .or. npixy <= 0) then print*,'ERROR reading size of pixel map, got nx = ',npixx,' ny = ',npixy,& ', skipped ',nheader,' header lines' else print "(a,i5,a,i5,a)",' reading',npixx,' x',npixy,' pixel map from '//trim(filename) endif allocate(datpix(npixx,npixy),stat=ierr) if (ierr /= 0) then print "(a)",' ERROR allocating memory for pixel map' close(iunit) return endif nerr = 0 do j=1,npixy read(iunit,*,iostat=ierr) datpix(1:npixx,j) if (ierr /= 0) nerr = nerr + 1 enddo if (nerr /= 0) print "(a,i3,a,i3)",' WARNING: ',nerr,' errors reading pixel map from '//trim(filename)//' on unit ',iunit close(iunit) endif case('ftn','ftn512','chf') ! Christoph Federrath files npixx = 512 npixy = 512 ! !--cycle through possible filenames ! call check_for_pixmap_files(filename,dumpfile,label,'.pix',istep,xsec,iexist) if (.not.iexist) then print "('*',a,'*',/,72('*'))",' Create a file with one of these names (or a soft link) and try again ' ierr = 1 return endif open(unit=iunit,file=filename,status='old',form='unformatted',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR: cannot open '//trim(filename) ierr = 2 return else print "(a)",' reading pixel map from '//trim(filename) allocate(datpix(npixx,npixy),stat=ierr) read(iunit,iostat=ierr) datpix if (ierr /= 0) print "(a,i3)",' WARNING: ERRORS reading pixel map from '//trim(filename)//' on unit ',iunit close(iunit) endif case default if (len_trim(readpixformat) <= 0) then print "(a)",' ERROR: pixel format not set prior to read_pixmap call' else print "(a)",' ERROR: unknown pixmap format '//trim(adjustl(readpixformat)) endif ierr = 1 end select end subroutine readpixmap !----------------------------------------------------------------- ! look for pixel map files matching a variety of naming schemes !----------------------------------------------------------------- subroutine get_pixmap_filename(filename,dumpfile,label,ext,xsec) use asciiutils, only:basename,safename character(len=*), intent(out) :: filename character(len=*), intent(in) :: dumpfile,label,ext logical, intent(in) :: xsec if (xsec) then filename = trim(basename(dumpfile))//'_'//trim(safename(label))//'_slice'//trim(ext) else filename = trim(basename(dumpfile))//'_'//trim(safename(label))//'_proj'//trim(ext) endif end subroutine get_pixmap_filename !----------------------------------------------------------------- ! look for pixel map files matching a variety of naming schemes !----------------------------------------------------------------- subroutine check_for_pixmap_files(filename,dumpfile,label,ext,istep,xsec,iexist) use asciiutils, only:safename,basename character(len=*), intent(out) :: filename character(len=*), intent(in) :: dumpfile,label,ext integer, intent(in) :: istep logical, intent(in) :: xsec logical, intent(out) :: iexist character(len=len(dumpfile)) :: dumpfilei integer :: i,maxnames logical :: printinfo dumpfilei = dumpfile iexist = .false. i = 0 maxnames = 5 printinfo = .false. do while (.not.iexist .and. i < maxnames) i = i + 1 select case(i) case(1) if (xsec) then filename = trim(dumpfilei)//'_'//trim(safename(label))//'_slice'//trim(ext) else filename = trim(dumpfilei)//'_'//trim(safename(label))//'_proj'//trim(ext) endif case(2) filename = trim(dumpfilei)//'_'//trim(safename(label))//trim(ext) case(3) if (xsec) then filename = trim(dumpfilei)//'_slice'//trim(ext) else filename = trim(dumpfilei)//'_proj'//trim(ext) endif case(4) filename = trim(dumpfilei)//trim(ext) case(5) write(filename,"(a,i5.5,a)") trim(fileprefix)//'_',istep,trim(ext) end select ! !--query to see if file exists ! if (printinfo) then print "('*',a,'*')",' no file '//filename(1:60)//'' else inquire(file=filename,exist=iexist) endif if (.not.iexist) then ! !--try the same files again but in the current directory ! instead of the directory in which the dump files are located ! if (i==maxnames) then if (len_trim(dumpfilei) /= len_trim(basename(dumpfile))) then i = 0 dumpfilei = basename(dumpfile) elseif (.not.printinfo) then print "(72('*'),/,'*',a,12x,'*')", & ' ERROR: could not find any '//trim(ext)//' files with matching names:' dumpfilei = dumpfile printinfo = .true. i = 0 endif endif endif enddo end subroutine check_for_pixmap_files end module write_pixmap danieljprice-splash-4d1f09c/src/write_sphdata.f90000066400000000000000000000327661477365367100220550ustar00rootroot00000000000000!----------------------------------------------------------------- ! ! This file is (or was) part of SPLASH, a visualisation tool ! for Smoothed Particle Hydrodynamics written by Daniel Price: ! ! http://users.monash.edu.au/~dprice/splash ! ! SPLASH comes with ABSOLUTELY NO WARRANTY. ! This is free software; and you are welcome to redistribute ! it under the terms of the GNU General Public License ! (see LICENSE file for details) and the provision that ! this notice remains intact. If you modify this file, please ! note section 2a) of the GPLv2 states that: ! ! a) You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! Copyright (C) 2005-2023 Daniel Price. All rights reserved. ! Contact: daniel.price@monash.edu ! !----------------------------------------------------------------- !----------------------------------------------------------------- ! module containing output routines for writing SPH data ! as read by SPLASH to output file in various formats !----------------------------------------------------------------- module write_sphdata implicit none public :: issphformat,write_sphdump private contains !----------------------------------------------------------------- ! utility to check if a format selection is valid !----------------------------------------------------------------- logical function issphformat(string) use asciiutils, only:lcase character(len=*), intent(in) :: string logical :: verbose issphformat = .false. verbose = .true. select case(trim(lcase(string))) case('ascii','csv') issphformat = .true. case('binary','binarystream','stream') issphformat = .true. case('rsph') issphformat = .true. case('phantom') issphformat = .true. case('gadget') issphformat = .true. case('none') verbose = .false. end select if (.not.issphformat .and. verbose) then print "(a)",' convert mode ("splash to X dumpfiles"): ' print "(a,/)",' splash to ascii : convert SPH data to ascii file dumpfile.ascii' print "(a)", ' to csv : convert SPH data to csv file dumpfile.csv' print "(a)", ' to binary : convert SPH data to simple unformatted binary dumpfile.binary: ' print "(a)", ' write(1) time,np,ncols' print "(a)", ' do i=1,np' print "(a)", ' write(1) dat(1:ncols),itype' print "(a)", ' enddo' print "(a)", ' to stream : convert SPH data to streamed binary format dumpfile.binarystream: ' if (kind(1.)==8) then print "(a)", ' t,np,ncols,np*(dat(1:ncols),itype) [8,4,4,np*(ncols*8,4)] bytes' else print "(a)", ' t,np,ncols,np*(dat(1:ncols),itype) [4,4,4,np*(ncols*4,4)] bytes' endif print "(a)", ' to phantom : convert SPH data to binary dump file for PHANTOM' print "(a)", ' to gadget : convert SPH data to default GADGET snapshot file format' elseif (.not.issphformat) then print "(a)",'Convert mode: ' print "(a)",' splash to ascii : convert to ascii; type "splash to" for other formats' endif return end function issphformat subroutine write_sphdump(time,gamma,dat,npart,ntypes,npartoftype,masstype,itype,ncolumns,filename,outformat,listofcolumns) use labels, only:labeltype,label,unitslabel,irho,ipmass,ix,iBfirst,ih,iutherm,ivx use settings_units, only:units use settings_data, only:ndim,icoords,icoordsnew,xorigin use params, only:int1,maxplot,doub_prec use write_data_phantom, only:write_sphdata_phantom use write_data_gadget, only:write_sphdata_gadget use filenames, only:tagline use geomutils, only:change_coords use asciiutils, only:lcase integer, intent(in) :: npart,ntypes,ncolumns integer, intent(in), dimension(:) :: npartoftype integer(kind=int1), intent(in), dimension(:) :: itype real, intent(in) :: time,gamma real, intent(in), dimension(npart,ncolumns) :: dat real, intent(in), dimension(:) :: masstype character(len=*), intent(in) :: filename,outformat integer, intent(in), dimension(:), optional :: listofcolumns integer, parameter :: iunit = 83 integer, parameter :: maxline = 1000 integer :: ierr,i,idim,i1,i2,ncols integer, dimension(ncolumns) :: iorder character(len=40) :: fmtstring,fmtstring2,fmtstringlab,outfile character(len=6) :: ext real(kind=doub_prec), dimension(maxplot) :: vals real(kind=doub_prec) :: udist,umass,utime,umagfd real, dimension(3) :: x0,v0 logical :: change_coordsys,use_csv ! !--allow for the possibility of writing columns in a different order ! if (present(listofcolumns)) then call get_order_from_list(listofcolumns,iorder,ncols) else ncols = ncolumns do i=1,ncols iorder(i) = i enddo endif select case(trim(lcase(outformat))) case ('ascii','csv') ext = '.ascii' use_csv = (trim(lcase(outformat))=='csv') if (use_csv) ext = '.csv' print "(/,5('-'),'>',a,i2,a,1x,'<',5('-'),/)",' WRITING TO FILE '//trim(filename)//trim(ext)//' WITH ',ncols,' COLUMNS' !--format the header lines to go in the ascii file if (kind(1.)==8) then if (use_csv) then write(fmtstring,"(i10,a)") ncols,"(es23.15,',')" write(fmtstringlab,"(i10,a)") ncols,"(a23,','),a" else write(fmtstring,"(i10,a)") ncols,'(es23.15,1x)' write(fmtstringlab,"(i10,a)") ncols,'(a23,1x),a' endif else if (use_csv) then write(fmtstring,"(i10,a)") ncols,"(es15.7,',')" write(fmtstringlab,"(i10,a)") ncols,"(a15,','),a" else write(fmtstring,"(i10,a)") ncols,'(es15.7,1x)' write(fmtstringlab,"(i10,a)") ncols,'(a15,1x),a' endif endif fmtstring2 = '('//trim(adjustl(fmtstring))//',i0)' fmtstring = '('//trim(adjustl(fmtstring))//')' if (use_csv) then fmtstringlab = '('//trim(adjustl(fmtstringlab))//')' else fmtstringlab = '(''#'',1x,'//trim(adjustl(fmtstringlab))//')' endif open(unit=iunit,file=trim(filename)//trim(ext),status='replace',form='formatted',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR OPENING FILE FOR WRITING' return endif if (.not.use_csv) then write(iunit,"(a)",iostat=ierr) '# '//trim(filename)//trim(ext)//', created by '//trim(tagline) write(iunit,"('#')",iostat=ierr) write(iunit,"('#',1x,'time:',13x,'time unit (',a,')')",iostat=ierr) trim(unitslabel(0)) write(iunit,"('#',2(1x,1pe15.7))",iostat=ierr) time,units(0) write(iunit,"('#')",iostat=ierr) write(iunit,"('#',1x,'npart:',30(1x,a12))",iostat=ierr) (trim(labeltype(i)),i=1,ntypes) write(iunit,"('#',7x,30(1x,i12))",iostat=ierr) npartoftype(1:ntypes) write(iunit,"('# units:')",iostat=ierr) write(iunit,"('#'"//fmtstring(2:),iostat=ierr) units(iorder(1:ncols)) write(iunit,fmtstringlab,iostat=ierr) unitslabel(iorder(1:ncols)) write(iunit,"('#')",iostat=ierr) endif if (ierr /= 0) print "(a)",' ERROR WRITING ASCII HEADER' ! !--write body ! change_coordsys = (icoordsnew /= icoords .and. ndim > 0 .and. all(ix(1:ndim) > 0)) x0 = xorigin(:) ! note that it is not currently possible to do splash to ascii v0 = 0. ! with coords set relative to a tracked particle, so just use xorigin if (size(itype) > 1) then write(iunit,fmtstringlab,iostat=ierr) label(iorder(1:ncols)),'itype' do i=1,npart vals(1:ncolumns) = dat(i,1:ncolumns) if (change_coordsys) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) write(iunit,fmtstring2,iostat=ierr) vals(iorder(1:ncols)),itype(i) enddo else write(iunit,fmtstringlab,iostat=ierr) label(iorder(1:ncols)) if (change_coordsys) then do i=1,npart vals(1:ncolumns) = dat(i,1:ncolumns) call change_coords(vals,ncolumns,ndim,icoords,icoordsnew,x0,v0) write(iunit,fmtstring,iostat=ierr) vals(iorder(1:ncols)) enddo else do i=1,npart write(iunit,fmtstring,iostat=ierr) dat(i,iorder(1:ncols)) enddo endif endif close(iunit) if (ierr /= 0) then print "(a)",' ERROR WRITING ASCII FILE' endif return case ('binary','binarystream','stream') ! !--This is the most basic binary (ie. unformatted) file format I could think of, ! as an alternative to ascii for large files. ! select case(trim(outformat)) case('binarystream','BINARYSTREAM','stream') print "(/,5('-'),'>',a,i2,a,1x,'<',5('-'),/)",' WRITING TO FILE '//trim(filename)//'.binarystream WITH ',ncolumns,' COLUMNS' open(unit=iunit,file=trim(filename)//'.binarystream',status='replace',form='unformatted',access='stream',iostat=ierr) case default print "(/,5('-'),'>',a,i2,a,1x,'<',5('-'),/)",' WRITING TO FILE '//trim(filename)//'.binary WITH ',ncolumns,' COLUMNS' open(unit=iunit,file=trim(filename)//'.binary',status='replace',form='unformatted',iostat=ierr) end select if (ierr /= 0) then print "(a)",' ERROR OPENING FILE FOR WRITING' return endif write(iunit,iostat=ierr) time,npart,ncols if (ierr /= 0) print "(a)",' ERROR WRITING HEADER LINE TO BINARY FILE ' ! !--write body ! if (size(itype) > 1) then do i=1,npart write(iunit,iostat=ierr) dat(i,iorder(1:ncols)),int(itype(i)) enddo else do i=1,npart write(iunit,iostat=ierr) dat(i,iorder(1:ncols)) enddo endif close(iunit) if (ierr /= 0) print "(a)",' ERROR WRITING BINARY FILE' return case ('rsph') ! !--Files for Steinar Borve's RSPH format ! if (ndim < 2) then print "(a)",' ERROR: cannot write RSPH format for < 2D' return endif outfile = 'rsph2D_pos.dat' print "(a)",' writing to '//trim(outfile) open(unit=iunit,file=outfile,status='replace',form='formatted',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR OPENING '//trim(outfile)//' FOR WRITING' return endif write(iunit,"(i1)") ndim write(iunit,"(a)") 'position' write(iunit,"(i4)") maxline write(iunit,*) (minval(dat(1:npart,ix(i))),i=1,ndim) write(iunit,*) (maxval(dat(1:npart,ix(i))),i=1,ndim) write(iunit,*) time write(iunit,*) npart do idim=1,2 i1 = 1 i2 = 0 do while (i2 < npart) i2 = min(i2 + maxline,npart) write(iunit,*) dat(i1:i2,ix(idim)) i1 = i2 + 1 enddo enddo close(unit=iunit) outfile = 'rsph2D_rho.dat' print "(a)",' writing to '//trim(outfile) open(unit=iunit,file=outfile,status='replace',form='formatted',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR OPENING FILE FOR WRITING' return endif write(iunit,"(i1)") ndim write(iunit,"(a)") 'density' write(iunit,"(i4)") maxline write(iunit,*) (minval(dat(1:npart,ix(i))),i=1,ndim) write(iunit,*) (maxval(dat(1:npart,ix(i))),i=1,ndim) i1 = 1 i2 = 0 do while (i2 < npart) i2 = min(i2 + maxline,npart) write(iunit,*) dat(i1:i2,irho) i1 = i2 + 1 enddo close(unit=iunit) outfile = 'rsph2D_siz.dat' print "(a)",' writing to '//trim(outfile) open(unit=iunit,file=outfile,status='replace',form='formatted',iostat=ierr) if (ierr /= 0) then print "(a)",' ERROR OPENING FILE FOR WRITING' return endif write(iunit,"(i1)") ndim write(iunit,"(a)") 'size' write(iunit,"(i4)") maxline write(iunit,*) (minval(dat(1:npart,ix(i))),i=1,ndim) write(iunit,*) (maxval(dat(1:npart,ix(i))),i=1,ndim) i1 = 1 i2 = 0 do while (i2 < npart) i2 = min(i2 + maxline,npart) write(iunit,*) ((dat(i,ipmass)/dat(i,irho))**(1./ndim),i=i1,i2) i1 = i2 + 1 enddo close(unit=iunit) case('phantom') udist = 0.d0 umagfd = 0.d0 if (ix(1) > 0) udist = units(ix(1)) utime = units(0) if (ipmass > 0) then umass = units(ipmass) else print "(a)",' WARNING: units for mass unknown, written as 1.0' umass = 1.0d0 endif if (iBfirst > 0) umagfd = units(iBfirst) call write_sphdata_phantom(time,gamma,dat,ndim,npart,ntypes,npartoftype,& masstype,ncolumns,udist,utime,umass,umagfd,& labeltype,label,ix,ih,ivx,iBfirst,& ipmass,irho,iutherm,filename,0.) case('gadget') call write_sphdata_gadget(time,dat,itype,npart,ntypes,npartoftype,& masstype,ncolumns,filename) case default print "(a)",' ERROR: unknown output format '''//trim(outformat)//''' in write_sphdump' return end select end subroutine write_sphdump subroutine get_order_from_list(list_in,list_out,n) integer, intent(in) :: list_in(:) integer, intent(out) :: list_out(:) integer, intent(out) :: n integer :: i logical :: done ! ! set list_out = list_in, but only while list_in ! is non-zero and numbers are in range ! i = 1 done = .false. list_out = 0 do while(.not.done .and. i <= size(list_in) .and. i <= size(list_out)) if (list_in(i) > 0 .and. list_in(i) <= size(list_out)) then list_out(i) = list_in(i) else done = .true. endif i = i + 1 enddo n = count(list_out > 0) ! if no valid entries, set list_out to 1..n if (n==0) then n = min(size(list_out),size(list_in)) do i=1,n list_out(i) = i enddo endif end subroutine get_order_from_list end module write_sphdata danieljprice-splash-4d1f09c/tests/000077500000000000000000000000001477365367100172345ustar00rootroot00000000000000danieljprice-splash-4d1f09c/tests/test_fieldlines.f90000066400000000000000000000165751477365367100227470ustar00rootroot00000000000000! !--unit test for field line plotting routine ! program test_fieldlines use fieldlines, only:streamlines use render, only:render_pix implicit none integer, parameter :: ipixx = 1000, ipixy = 1000, nc = 100 integer :: npixx, npixy,i,j real, parameter :: errtol = 1.e-7 real, dimension(ipixx,ipixy) :: datpix,vecpixx,vecpixy,datpix1,datpix2,vecpixx1,vecpixy1 real :: xmin,xmax,ymin,ymax,zmin,zmax,dxpix real :: xi,yi,datmin,datmax,err,dcont real, parameter :: pi=3.1415926536 real, dimension(6) :: trans real, dimension(nc) :: levels xmin = -0.5 xmax = 0.5 ymin = -0.5 ymax = 0.5 call pgopen('/xw') print "(70('-'))" print*,'ORSZAG-TANG TEST' npixx = 400 npixy = 400 dxpix = (xmax-xmin)/real(npixx) do j = 1,npixy yi = ymin + (j-0.5)*dxpix if (j.le.10) print*,'y = ',yi do i = 1,npixx xi = xmin + (i-0.5)*dxpix vecpixx(i,j) = func_vecx(xi,yi) vecpixy(i,j) = func_vecy(xi,yi) datpix1(i,j) = func_stream(xi,yi) enddo enddo call streamlines(vecpixx(1:npixx,1:npixy),vecpixy(1:npixx,1:npixy), & datpix(1:npixx,1:npixy),npixx,npixy,dxpix) do j = 1,npixy,2 yi = ymin + (j-0.5)*2.*dxpix do i = 1,npixx,2 xi = xmin + (i-0.5)*2.*dxpix vecpixx1((i+1)/2,(j+1)/2) = func_vecx(xi,yi) !vecpixx(i,j) vecpixy1((i+1)/2,(j+1)/2) = func_vecy(xi,yi) !vecpixy(i,j) enddo enddo npixx = npixx/2 npixy = npixy/2 dxpix = (xmax-xmin)/real(npixx) call streamlines(vecpixx1(1:npixx,1:npixy),vecpixy1(1:npixx,1:npixy), & datpix2(1:npixx,1:npixy),npixx,npixy,dxpix) npixx = npixx*2 npixy = npixy*2 dxpix = (xmax-xmin)/real(npixx) !do j=1,npixy,2 ! do i=1,npixx,2 ! datpix(i,j) = (4.*datpix(i,j) - datpix2((i+1)/2,(j+1)/2))/3. ! enddo !enddo call pgenv(xmin,xmax,ymin,ymax,1,0) trans = 0. trans(1) = xmin - 0.5*dxpix trans(2) = dxpix trans(4) = ymin - 0.5*dxpix trans(6) = dxpix datmax = maxval(datpix(1:npixx,1:npixy)) datmin = minval(datpix(1:npixx,1:npixy)) print*,'min,max datpix = ',datmin,datmax datpix(1:npixx,1:npixy) = datpix(1:npixx,1:npixy) - 0.5*(datmax + datmin) datmax = maxval(datpix(1:npixx,1:npixy)) datmin = minval(datpix(1:npixx,1:npixy)) print*,'min,max datpix = ',datmin,datmax print*,'plotting integrated array...' ! call render_pix(datpix(1:npixx,1:npixy),datmin,datmax,'crap',npixx,npixy, & ! xmin,ymin,dxpix,0,.true.,.false.,30,.false.) call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,datmin,datmax,trans) ! !--set contour levels ! dcont = (datmax-datmin)/real(nc+1) ! even contour levels do i=1,nc levels(i) = datmin + real(i)*dcont enddo ! !--plot contours (use pgcont if pgcons causes trouble) ! call pgcons(datpix(1:npixx,1:npixy),npixx,npixy,1,npixx,1,npixy,levels(1:nc),nc,trans) ! call pgenv(xmin,xmax,ymin,ymax,1,0) datmax = maxval(datpix1(1:npixx,1:npixy)) datmin = minval(datpix1(1:npixx,1:npixy)) print*,'min,max datpix1 = ',datmin,datmax !print*,' plotting exact solution ...' ! call pgimag(datpix1,ipixx,ipixy,1,npixx,1,npixy,datmin,datmax,trans) !call pgcons(datpix1(1:npixx,1:npixy),npixx,npixy,1,npixx,1,npixy,levels(1:nc),nc,trans) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,datpix1(1:npixx,1:npixy),err) print*,'average error in stream line calculation = ',err if (npixx.eq.400 .and. npixy.eq.400) then if (err < 0.00019) then print*,'PASSED: error within limits' else print*,'FAILED: error too large!' endif else print*,'setup different to usual one' endif !--------------------- ! dipole field test !---------------------- print "(70('-'))" print*,'DIPOLE TEST' npixx = 400 npixy = 400 dxpix = (xmax-xmin)/real(npixx) do j = 1,npixy yi = ymin + (j-0.5)*dxpix do i = 1,npixx xi = xmin + (i-0.5)*dxpix vecpixx(i,j) = func_vecx_dipole(xi,yi) vecpixy(i,j) = func_vecy_dipole(xi,yi) datpix1(i,j) = func_stream_dipole(xi,yi) enddo enddo call streamlines(vecpixx(1:npixx,1:npixy),vecpixy(1:npixx,1:npixy), & datpix(1:npixx,1:npixy),npixx,npixy,dxpix) call pgenv(xmin,xmax,ymin,ymax,1,0) trans = 0. trans(1) = xmin - 0.5*dxpix trans(2) = dxpix trans(4) = ymin - 0.5*dxpix trans(6) = dxpix datmax = maxval(datpix(1:npixx,1:npixy)) datmin = minval(datpix(1:npixx,1:npixy)) print*,'min,max datpix = ',datmin,datmax datpix(1:npixx,1:npixy) = datpix(1:npixx,1:npixy) - 0.5*(datmax + datmin) datmax = maxval(datpix(1:npixx,1:npixy)) datmin = minval(datpix(1:npixx,1:npixy)) print*,'min,max datpix = ',datmin,datmax ! call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,datmin,datmax,trans) ! !--set contour levels ! dcont = (datmax-datmin)/real(nc+1) ! even contour levels do i=1,nc levels(i) = datmin + real(i)*dcont enddo ! !--plot contours (use pgcont if pgcons causes trouble) ! call pgcons(datpix(1:npixx,1:npixy),npixx,npixy,1,npixx,1,npixy,levels(1:nc),nc,trans) ! call pgenv(xmin,xmax,ymin,ymax,1,0) datmax = maxval(datpix1(1:npixx,1:npixy)) datmin = minval(datpix1(1:npixx,1:npixy)) print*,'min,max datpix1 = ',datmin,datmax ! call pgimag(datpix1,ipixx,ipixy,1,npixx,1,npixy,datmin,datmax,trans) ! call pgcons(datpix1(1:npixx,1:npixy),npixx,npixy,1,npixx,1,npixy,levels(1:nc),nc,trans) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,datpix1(1:npixx,1:npixy),err) print*,'average error in stream line calculation = ',err if (npixx.eq.400 .and. npixy.eq.400) then if (err < 0.00019) then print*,'PASSED: error within limits' else print*,'FAILED: error too large!' endif else print*,'setup different to usual one' endif call pgend print "(70('-'))" contains real function func_vecx(xi,yi) implicit none real :: xi,yi func_vecx = -sin(2.*pi*yi) end function func_vecx real function func_vecy(xi,yi) implicit none real :: xi,yi func_vecy = sin(4.*pi*xi) end function func_vecy real function func_stream(xi,yi) implicit none real :: xi,yi func_stream = 0.5/pi*(cos(2.*pi*yi) + 0.5*cos(4.*pi*xi)) end function func_stream !---------------- ! dipole !---------------- real function func_vecx_dipole(xi,yi) implicit none real :: xi,yi real, parameter :: Bdipole = 1.0, Rdipole = 0.3, eps=0.3 func_vecx_dipole = 3.*Bdipole*Rdipole**3*(Rdipole + xi)*yi/ & sqrt((Rdipole + xi)**2 + yi**2 + (eps*Rdipole)**2)**5 end function func_vecx_dipole real function func_vecy_dipole(xi,yi) implicit none real :: xi,yi real, parameter :: Bdipole = 1.0, Rdipole = 0.3, eps=0.3 func_vecy_dipole = Bdipole*Rdipole**3/ & sqrt((Rdipole + xi)**2 + yi**2 + (eps*Rdipole)**2)**3 end function func_vecy_dipole real function func_stream_dipole(xi,yi) implicit none real :: xi,yi real, parameter :: Bdipole = 1.0, Rdipole = 0.3, eps=0.3 func_stream_dipole = -Bdipole*Rdipole**3*(Rdipole + xi)/ & sqrt((Rdipole + xi)**2 + yi**2 + (eps*Rdipole)**2)**3 end function func_stream_dipole subroutine geterr(datpix,npixx,npixy,datexact,err) implicit none integer, intent(in) :: npixx,npixy real, dimension(:,:), intent(in) :: datpix real, dimension(:,:), intent(in) :: datexact real, intent(out) :: err integer :: icalc,j,i real :: errij err = 0. icalc = 0 do j=1,npixy do i=1,npixx icalc = icalc + 1 errij = abs(datpix(i,j)-datexact(i,j)) err = err + errij enddo enddo if (icalc.le.0) then print*,'cannot calculate error => npix too small' err = -1.0 else err = err/(icalc*maxval(datexact)) endif end subroutine geterr end program test_fieldlines danieljprice-splash-4d1f09c/tests/test_interpolate3D.f90000077500000000000000000000266341477365367100233460ustar00rootroot00000000000000! !--unit test for interpolation routines ! program test_interpolation use projections3D use xsections3D implicit none integer, parameter :: idimx = 100 integer, parameter :: idim = idimx**3 integer, parameter :: ipixx = 1000, ipixy = 1000 integer :: npart,npartx,nparty,npartz integer :: npixx, npixy,i real, parameter :: errtol = 1.e-7 real, dimension(idim) :: x,y,z,pmass,h,rho real, dimension(idim) :: dat,weight integer, dimension(idim) :: itype real, dimension(ipixx,ipixy) :: datpix real, dimension(0:maxcoltable) :: q,w real :: xmin,xmax,ymin,ymax,zmin,zmax real :: columndens,dxpix,err,dens,datmax real :: trans(6) logical :: ifastrender,normalise xmin = -0.5 xmax = 0.5 ymin = -0.5 ymax = 0.5 zmin = -0.5 zmax = 0.5 itype = 0 ifastrender = .true. print*,'accelerated rendering = ',ifastrender call pgopen('?') ! call pgenv(xmin,xmax,ymin,ymax,0,0) ! call pglabel('x','y',' ') ! call pgpt(npart,x,y,1) ! call pgenv(xmin,xmax,ymin,ymax,0,0) ! call pglabel('y','z',' ') ! call pgpt(npart,y,z,1) ! call pgenv(xmin,xmax,ymin,ymax,0,0) ! call pglabel('x','z',' ') ! call pgpt(npart,x,z,1) ! !--setup integrated kernel table ! call setup_integratedkernel ! !--check value of the integration at q=zero (can do this analytically) ! if (abs(coltable(0)-1.5/3.1415926536).lt.errtol) then print*,'CENTRAL KERNEL TABLE OK' else print*,'coltable(0) = ',coltable(0),' should be ',2.*0.75/3.1415926536 print*,'error = ',abs(coltable(0)-1.5/3.1415926536) print*,'ERROR: CENTRAL INTEGRATED KERNEL VALUE WRONG' endif ! !--plot integrated kernel ! call pgenv(0.,2.,0.,coltable(0)*1.1,0,0) call pglabel('r','int W',' ') print*,'radkernel = ',radkernel do i=0,50 q(i) = i*radkernel/50. !print*,q(i) w(i) = wfromtable(q(i)*q(i)) enddo call pgsci(3) call pgline(50,q,w) ! do i=1,maxcoltable ! q(i) = sqrt((i-1)*radkernel*radkernel*dmaxcoltable) ! enddo ! call pgsci(2) ! call pgline(maxcoltable,q,coltable) call pgsci(1) !call pgpage ! !--setup one particle ! print*,'SINGLE PARTICLE TEST' npart = 1 npixx = 10 npixy = 10 x(1) = 0.5*(xmin + xmax) y(1) = 0.5*(ymin + ymax) z(1) = 0.5*(zmin + zmax) rho(1) = 1.0 pmass(1) = 2.0 h(1) = 0.35*xmax weight(1) = 1./1.5**3 dat(1) = rho(1) dxpix = (xmax-xmin)/real(npixx) normalise = .false. datpix = 0. call interpolate3D_projection(x(1:npart),y(1:npart),z(1:npart),h(1:npart), & weight(1:npart),dat(1:npart),itype(1:npart),npart,xmin,ymin, & datpix(1:npixx,1:npixy),npixx,npixy,dxpix,dxpix,normalise,0.,0.,.false.) call pgenv(xmin,xmax,ymin,ymax,1,0) trans = 0. trans(1) = xmin - 0.5*dxpix trans(2) = dxpix trans(4) = ymin - 0.5*dxpix trans(6) = dxpix datmax = maxval(datpix(1:npixx,1:npixy)) print*,'max datpix = ',datmax,maxloc(datpix(1:npixx,1:npixy)) if (abs(datmax-0.035367373).gt.errtol) then print*,'FAILED: central maximum wrong, error = ',abs(datmax-0.035367373) else print*,'OK: central maximum seems fine' endif call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,0.0,datmax,trans) print*,'TEST WITH ACCELERATION' call interpolate3D_projection(x(1:npart),y(1:npart),z(1:npart),h(1:npart), & weight(1:npart),dat(1:npart),itype(1:npart),npart,xmin,ymin, & datpix(1:npixx,1:npixy),npixx,npixy,dxpix,dxpix,normalise,0.,0.,.true.) call pgenv(xmin,xmax,ymin,ymax,1,0) trans = 0. trans(1) = xmin - 0.5*dxpix trans(2) = dxpix trans(4) = ymin - 0.5*dxpix trans(6) = dxpix datmax = maxval(datpix(1:npixx,1:npixy)) print*,'max datpix = ',datmax,maxloc(datpix(1:npixx,1:npixy)) if (abs(datmax-0.035367373).gt.errtol) then print*,'FAILED: central maximum wrong, error = ',abs(datmax-0.035367373) else print*,'OK: central maximum seems fine' endif call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,0.0,datmax,trans) ! !--setup two overlapping particles ! print*,'TWO PARTICLE TEST' npart = 2 npixx = 1000 npixy = 1000 x(1) = -0.25 x(2) = 0.25 y(2) = 0.5*(ymin + ymax) z(2) = 0.5*(zmin + zmax) rho(2) = 1.0 pmass(2) = 2.0 h(1:2) = 0.5*xmax weight(2) = 1./1.5**3 dat(2) = rho(2) dxpix = (xmax-xmin)/real(npixx) call interpolate3D_projection(x(1:npart),y(1:npart),z(1:npart),h(1:npart), & weight(1:npart),dat(1:npart),itype(1:npart),npart,xmin,ymin, & datpix(1:npixx,1:npixy),npixx,npixy,dxpix,dxpix,normalise,0.,0.,ifastrender) call pgenv(xmin,xmax,ymin,ymax,1,0) trans = 0. trans(1) = xmin - 0.5*dxpix trans(2) = dxpix trans(4) = ymin - 0.5*dxpix trans(6) = dxpix datmax = maxval(datpix(1:npixx,1:npixy)) print*,'max datpix = ',datmax,maxloc(datpix(1:npixx,1:npixy)) !!print*,'datpix = ',datpix(1:npixx,1:npixy) call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,0.0,datmax,trans) ! !--set up a cubic lattice of particles ! print*,'NORMAL LATTICE TEST' npartx = 50 nparty = 50 npartz = 50 npart = npartx*nparty*npartz npixx = 500 npixy = 500 dxpix = (xmax-xmin)/real(npixx) call setgrid(npartx,nparty,npartz,x,y,z,pmass,rho,h,weight,xmin,xmax,ymin,ymax,zmin,zmax) ! !--now call interpolation routine to pixels ! call interpolate3D_projection(x(1:npart),y(1:npart),z(1:npart),h(1:npart), & weight(1:npart),dat(1:npart),itype(1:npart),npart,xmin,ymin, & datpix(1:npixx,1:npixy),npixx,npixy,dxpix,dxpix,normalise,0.,0.,ifastrender) ! !--check output ! dens = rho(1) columndens = dens*(zmax-zmin) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,columndens,err) print "(70('-'))" print*,'average error in column density interpolation = ',err if (err.gt.0.05) then print*,'FAILED: average error > usual' else print*,'OK: average error same as usual' endif call pgenv(xmin,xmax,ymin,ymax,0,0) ! call pgpixl(datpix,ipixx,ipixy,1,npixx,1,npixy,xmin,xmax,ymin,ymax) trans = 0. trans(1) = xmin - 0.5*dxpix trans(2) = dxpix trans(4) = ymin - 0.5*dxpix trans(6) = dxpix call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,0.0,1.0,trans) ! !--NORMALISED VERSION OF ABOVE ! normalise = .true. call interpolate3D_projection(x(1:npart),y(1:npart),z(1:npart),h(1:npart), & weight(1:npart),dat(1:npart),itype(1:npart),npart,xmin,ymin, & datpix(1:npixx,1:npixy),npixx,npixy,dxpix,dxpix,normalise,0.,0.,ifastrender) ! !--check output ! dens = rho(1) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,dens,err) print "(70('-'))" print*,'average error in interpolation = ',err print*,' dens = ',dens,' datpix = ',datpix(1:10,1:10) if (err.gt.0.05) then print*,'FAILED: average error > usual' else print*,'OK: average error same as usual' endif call pgenv(xmin,xmax,ymin,ymax,0,0) ! call pgpixl(datpix,ipixx,ipixy,1,npixx,1,npixy,xmin,xmax,ymin,ymax) trans = 0. trans(1) = xmin - 0.5*dxpix trans(2) = dxpix trans(4) = ymin - 0.5*dxpix trans(6) = dxpix call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,0.0,1.0,trans) ! !--take cross section at midplane and check density ! print "(70('-'))" call interpolate3D_fastxsec(x(1:npart),y(1:npart),z(1:npart), & h(1:npart),weight(1:npart),dat(1:npart),itype(1:npart),npart,& xmin,ymin,0.0,datpix(1:npixx,1:npixy),npixx,npixy,dxpix,.false.) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,dens,err) print*,'average error in non-normalised xsec interpolation = ',err print "(70('-'))" call pgenv(xmin,xmax,ymin,ymax,0,0) ! call pgpixl(datpix,ipixx,ipixy,1,npixx,1,npixy,xmin,xmax,ymin,ymax) ! trans = 0. ! trans(1) = xmin - 0.5*dxpix ! trans(2) = dxpix ! trans(4) = ymin - 0.5*dxpix ! trans(6) = dxpix call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,0.0,1.0,trans) ! call pgend ! !--take normalised cross section at midplane and check density ! call interpolate3D_fastxsec(x(1:npart),y(1:npart),z(1:npart), & h(1:npart),weight(1:npart),dat(1:npart),itype(1:npart),npart,& xmin,ymin,0.0,datpix(1:npixx,1:npixy),npixx,npixy,dxpix,.true.) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,dens,err) print*,'average error in normalised xsec interpolation = ',err call pgenv(xmin,xmax,ymin,ymax,0,0) call pgimag(datpix,ipixx,ipixy,1,npixx,1,npixy,0.0,1.0,trans) print*,'closing PGPLOT' call pgend print "(70('-'))" print*,'SPEED CHECKS...' normalise = .true. npixx = 1 npixy = 1 npartx = idimx nparty = idimx npartz = idimx npart = npartx*nparty*npartz call setgrid(npartx,nparty,npartz,x,y,z,pmass,rho,h,weight,xmin,xmax,ymin,ymax,zmin,zmax) dxpix = (xmax-xmin)/real(npixx) call interpolate3D_projection(x(1:npart),y(1:npart),z(1:npart),h(1:npart), & weight(1:npart),dat(1:npart),itype(1:npart),npart,xmin,ymin, & datpix(1:npixx,1:npixy),npixx,npixy,dxpix,dxpix,normalise,0.,0.,ifastrender) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,columndens,err) print*,'average error in projection = ',err npixx = 1000 npixy = 1000 npartx = 2 nparty = 2 npartz = 2 npart = npartx*nparty*npartz call setgrid(npartx,nparty,npartz,x,y,z,pmass,rho,h,weight,xmin,xmax,ymin,ymax,zmin,zmax) dxpix = (xmax-xmin)/real(npixx) call interpolate3D_projection(x(1:npart),y(1:npart),z(1:npart),h(1:npart), & weight(1:npart),dat(1:npart),itype(1:npart),npart,xmin,ymin, & datpix(1:npixx,1:npixy),npixx,npixy,dxpix,dxpix,normalise,0.,0.,ifastrender) call geterr(datpix(1:npixx,1:npixy),npixx,npixy,columndens,err) print*,'average error in projection = ',err contains subroutine setgrid(npartx,nparty,npartz,x,y,z,pmass,rho,h,weight,xmin,xmax,ymin,ymax,zmin,zmax) implicit none integer , intent(in) :: npartx,nparty,npartz real, dimension(:), intent(out) :: x,y,z,pmass,rho,h,weight real, intent(in) :: xmin,xmax,ymin,ymax,zmin,zmax integer :: ipart,k,j,i real :: dx,dy,dz,ypos,zpos real :: totmass,massp,vol,dens,h0 dz = (zmax-zmin)/real(npartz - 1) dy = (ymax-ymin)/real(nparty - 1) dx = (xmax-xmin)/real(npartx - 1) ipart = 0 do k=1,npartz zpos = zmin + (k-1)*dz do j=1,nparty ypos = ymin + (j-1)*dy do i=1,npartx ipart = ipart + 1 x(ipart) = xmin + (i-1)*dx y(ipart) = ypos z(ipart) = zpos ! print*,ipart,'x,y,z=',x(ipart),y(ipart),z(ipart) enddo enddo enddo npart = npartx*nparty*npartz ! !--set other properties ! totmass = 3.1415926536 massp = totmass/real(npart) vol = (xmax-xmin)*(ymax-ymin)*(zmax-zmin) dens = totmass/vol h0 = 1.5*(massp/dens)**(1./3) print*,' testing ',npart,' particles in a cube configuration' print*,' dx = ',dx,' dy = ',dy,' dz = ',dz print*,' mass = ',massp,' dens = ',dens,' h = ',h0 print*,' approx density = ',massp/(dx*dy*dz) do i = 1,npart pmass(i) = massp rho(i) = dens h(i) = h0 dat(i) = rho(i) weight(i) = pmass(i)/(rho(i)*h(i)**3) enddo end subroutine setgrid subroutine geterr(datpix,npixx,npixy,datexact,err) implicit none integer, intent(in) :: npixx,npixy real, dimension(:,:), intent(in) :: datpix real, intent(in) :: datexact real, intent(out) :: err integer :: icalc,j,i real :: erri err = 0. icalc = 0 do j=2,npixy-1 do i=2,npixx-1 icalc = icalc + 1 erri = abs(datpix(i,j)-datexact)/datexact err = err + erri !if (erri.gt.0.05) print*,i,j,' xsec dens = ',datpix(i,j),' should be ',dens enddo enddo if (icalc.le.0) then print*,'cannot calculate error => npix too small' err = -1.0 else err = err/real(icalc) endif end subroutine geterr end program test_interpolation danieljprice-splash-4d1f09c/utils/000077500000000000000000000000001477365367100172325ustar00rootroot00000000000000danieljprice-splash-4d1f09c/utils/grid2pdf.f90000066400000000000000000000055111477365367100212550ustar00rootroot00000000000000program grid2pdf use system_commands, only:get_number_arguments,get_argument use readwrite_griddata, only:open_gridfile_r,read_gridcolumn use pdfs, only:pdf_calc,pdf_write,mean_variance implicit none logical, parameter :: usefixedbins = .true. integer, parameter :: nbins = 270 integer, parameter :: iunit = 13 integer, dimension(3) :: nxgrid integer :: ierr,ncolumns,itransx,ifile,nargs integer :: ntot,i,ndim real :: time,rhologmin,rhologmax,pdfmin,pdfmax,smean,svar,rhomean,rhovar real, dimension(nbins) :: xbin,pdf character(len=120) :: filename,tagline character(len=20) :: informat real, dimension(:), allocatable :: rhogrid tagline = 'grid2pdf: a SPLASH utility (c) 2010-2021 Daniel Price' call get_number_arguments(nargs) if (nargs.le.0) then print "(a)",trim(tagline) print "(/,a,/)",'Usage: grid2pdf gridfile(s)' stop endif do ifile=1,nargs ! !--get the filename off the command line ! call get_argument(ifile,filename) ! !--open the grid data file and read the header information ! informat = 'gridbinary' ndim = 3 call open_gridfile_r(iunit,filename,informat,ndim,ncolumns,nxgrid,time,ierr) ! !--allocate memory for the grid data ! ntot = product(nxgrid) if (.not.allocated(rhogrid) .or. ntot.ne.size(rhogrid)) then if (allocated(rhogrid)) deallocate(rhogrid) allocate(rhogrid(ntot)) endif ! !--read one particular column (in this case, the density) ! call read_gridcolumn(iunit,rhogrid,ntot,ierr) ! !--close the file ! close(iunit) ! !--calculate the mean and variance in rho ! call mean_variance(rhogrid,ntot,rhomean,rhovar) ! !--set the parameters for calculating the PDF ! [in this case, we want the PDF of ln (rho)] ! rhologmin = -15. rhologmax = 12. where (rhogrid.gt.0.) rhogrid = log(rhogrid) end where !itransx = 6 ! !--calculate the PDF ! call pdf_calc(ntot,rhogrid,rhologmin,rhologmax,nbins,xbin,& pdf,pdfmin,pdfmax,usefixedbins,ierr) ! !--calculate the mean and variance in ln(rho) ! call mean_variance(rhogrid,ntot,smean,svar) print*,' rho mean,var = ',rhomean,rhovar print*,'ln(rho) mean,var = ',smean,svar print*,' svar,rhovar = ',-2.*smean,exp(svar) - 1. ! !--check the routine ! svar = 0. do i=1,ntot svar = svar + (rhogrid(i) - smean)**2 enddo svar = svar/real(ntot-1) print*,'svar = ',svar ! !--write the PDF to file ! if (ierr.eq.0) then call pdf_write(nbins,xbin,pdf,'ln density',trim(filename),trim(tagline)) endif enddo ! !--clean up/deallocate memory ! if (allocated(rhogrid)) deallocate(rhogrid) end program grid2pdf